forked from aylac.top/nixcfg
this repo has no description

Compare changes

Choose any two refs to compare.

Changed files
+2393 -1001
.github
workflows
homes
hosts
modules
flake
hardware
profiles
home
desktop
profiles
programs
chromium
firefox
git
helium
helix
jujutsu
micro
ssh
zed-editor
zen-browser
snippets
editor
firefox-based
git
locale
en-ca
nixos
desktop
profiles
arr
backups
base
hibernation
swap
workstation
programs
security
services
atproto-basic-notifications
caddy
fail2ban
forgejo
glance
miniflux
monitoring
pds
postgresql
privatebin
redlib
sddm
tangled-knot
snippets
aylac-top
nix
syncthing
tailnet
users
+15
.github/workflows/tangled.yaml
···
···
+
name: Tangle
+
+
on:
+
push:
+
branches: [main]
+
workflow_dispatch:
+
+
jobs:
+
tangle:
+
runs-on: ubuntu-latest
+
steps:
+
- uses: gwennlbh/to-tangled@v0.3
+
with:
+
repo: aylac.top/nixcfg
+
ssh-key: ${{ secrets.TANGLED_KEY }}
+251 -105
flake.lock
···
"inputs": {
"flake-parts": "flake-parts_3",
"git-hooks": "git-hooks",
-
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1753483837,
···
"systems": "systems"
},
"locked": {
-
"lastModified": 1754433428,
-
"narHash": "sha256-NA/FT2hVhKDftbHSwVnoRTFhes62+7dxZbxj5Gxvghs=",
"owner": "ryantm",
"repo": "agenix",
-
"rev": "9edb1787864c4f59ae5074ad498b6272b3ec308d",
"type": "github"
},
"original": {
···
"type": "github"
}
},
"copyparty": {
"inputs": {
"flake-utils": "flake-utils",
-
"nixpkgs": "nixpkgs"
},
"locked": {
-
"lastModified": 1756412699,
-
"narHash": "sha256-0zntPGPK18f5Jcw88f+ibF7BdrHqrGn2vxb6ClpMYZs=",
"owner": "9001",
"repo": "copyparty",
-
"rev": "3e90abbf6f24b3bcc4459bda32f0471f51722b65",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1756115622,
-
"narHash": "sha256-iv8xVtmLMNLWFcDM/HcAPLRGONyTRpzL9NS09RnryRM=",
"owner": "nix-community",
"repo": "disko",
-
"rev": "bafad29f89e83b2d861b493aa23034ea16595560",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"firefox-onebar": {
-
"flake": false,
-
"locked": {
-
"narHash": "sha256-kkg+wplvJvOmO2FseZuF/P2HBh+r/uSEEb9TD6RSA54=",
-
"type": "file",
-
"url": "https://git.gay/freeplay/Firefox-Onebar/raw/branch/waf/onebar.css"
-
},
-
"original": {
-
"type": "file",
-
"url": "https://git.gay/freeplay/Firefox-Onebar/raw/branch/waf/onebar.css"
-
}
-
},
"flake-compat": {
"flake": false,
"locked": {
···
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
···
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
-
"lastModified": 1754487366,
-
"narHash": "sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8=",
"owner": "hercules-ci",
"repo": "flake-parts",
-
"rev": "af66ad14b28a127c5c0f3bbb298218fc63528a18",
"type": "github"
},
"original": {
···
"type": "github"
}
},
"flake-utils": {
"locked": {
"lastModified": 1678901627,
···
"files": "files_2",
"flake-parts": "flake-parts_4",
"git-hooks-nix": "git-hooks-nix",
-
"home-manager": "home-manager_2",
"nix-darwin": "nix-darwin",
"nixpkgs": [
"nixpkgs"
···
]
},
"locked": {
-
"lastModified": 1755960406,
-
"narHash": "sha256-RF7j6C1TmSTK9tYWO6CdEMtg6XZaUKcvZwOCD2SICZs=",
"owner": "cachix",
"repo": "git-hooks.nix",
-
"rev": "e891a93b193fcaf2fc8012d890dc7f0befe86ec2",
"type": "github"
},
"original": {
···
"home-manager_2": {
"inputs": {
"nixpkgs": [
-
"fontix",
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1754174776,
-
"narHash": "sha256-Sp3FRM6xNwNtGzYH/HByjzJYHSQvwsW+lDMMZNF43PQ=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "e6e2f43a62b7dbc8aa8b1adb7101b0d8b9395445",
"type": "github"
},
"original": {
"owner": "nix-community",
-
"ref": "master",
"repo": "home-manager",
"type": "github"
}
···
"home-manager_3": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1756261190,
-
"narHash": "sha256-eiy0klFK5EVJLNilutR7grsZN/7Itj9DyD75eyOf83k=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "77f348da3176dc68b20a73dab94852a417daf361",
"type": "github"
},
"original": {
···
"home-manager_4": {
"inputs": {
"nixpkgs": [
-
"zen-browser",
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1752603129,
-
"narHash": "sha256-S+wmHhwNQ5Ru689L2Gu8n1OD6s9eU9n9mD827JNR+kw=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "e8c19a3cec2814c754f031ab3ae7316b64da085b",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
···
"lastModified": 1731402384,
"narHash": "sha256-OwUmrPfEehLDz0fl2ChYLK8FQM2p0G1+EMrGsYEq+6g=",
"type": "tarball",
-
"url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip"
},
"original": {
"type": "tarball",
-
"url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip"
}
},
"indigo": {
···
"url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip"
}
},
"lanzaboote": {
"inputs": {
"crane": "crane",
···
"nixpkgs"
],
"pre-commit-hooks-nix": "pre-commit-hooks-nix",
-
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1737639419,
···
"type": "github"
}
},
"nixpkgs": {
"locked": {
-
"lastModified": 1748162331,
-
"narHash": "sha256-rqc2RKYTxP3tbjA+PB3VMRQNnjesrT0pEofXQTrMsS8=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "7c43f080a7f28b2774f3b3f43234ca11661bf334",
"type": "github"
},
"original": {
-
"id": "nixpkgs",
-
"ref": "nixos-25.05",
-
"type": "indirect"
}
},
"nixpkgs-lib": {
"locked": {
-
"lastModified": 1753579242,
-
"narHash": "sha256-zvaMGVn14/Zz8hnp4VWT9xVnhc8vuL3TStRqwk22biA=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
-
"rev": "0f36c44e01a6129be94e3ade315a5883f0228a6e",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"nixpkgs-unstable": {
"locked": {
-
"lastModified": 1756381814,
-
"narHash": "sha256-tzo7YvAsGlzo4WiIHT0ooR59VHu+aKRQdHk7sIyoia4=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "aca2499b79170038df0dbaec8bf2f689b506ad32",
"type": "github"
},
"original": {
-
"owner": "NixOS",
-
"ref": "nixpkgs-unstable",
-
"repo": "nixpkgs",
-
"type": "github"
}
},
-
"nixpkgs_2": {
"locked": {
"lastModified": 1740126099,
"narHash": "sha256-ozoOtE2hGsqh4XkTJFsrTkNxkRgShxpQxDynaPZUGxk=",
···
"type": "github"
}
},
-
"nixpkgs_3": {
"locked": {
-
"lastModified": 1756266583,
-
"narHash": "sha256-cr748nSmpfvnhqSXPiCfUPxRz2FJnvf/RjJGvFfaCsM=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "8a6d5427d99ec71c64f0b93d45778c889005d9c2",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"nixpkgs_4": {
"locked": {
-
"lastModified": 1756266583,
-
"narHash": "sha256-cr748nSmpfvnhqSXPiCfUPxRz2FJnvf/RjJGvFfaCsM=",
"owner": "nixos",
"repo": "nixpkgs",
-
"rev": "8a6d5427d99ec71c64f0b93d45778c889005d9c2",
"type": "github"
},
"original": {
···
"nur": {
"inputs": {
"flake-parts": "flake-parts_6",
-
"nixpkgs": "nixpkgs_4"
},
"locked": {
-
"lastModified": 1756438231,
-
"narHash": "sha256-ygHQWiCuNWjHky4+0+CNOmcyvOZHgX9a/UgaXp8JEpU=",
"owner": "nix-community",
"repo": "NUR",
-
"rev": "8df9a54900dfd3573d77845ede54bc1414226511",
"type": "github"
},
"original": {
···
"inputs": {
"actions-nix": "actions-nix",
"agenix": "agenix",
"copyparty": "copyparty",
"disko": "disko",
"files": "files",
-
"firefox-onebar": "firefox-onebar",
"flake-parts": "flake-parts_2",
"fontix": "fontix",
"git-hooks-nix": "git-hooks-nix_2",
-
"home-manager": "home-manager_3",
"lanzaboote": "lanzaboote",
"nix-flatpak": "nix-flatpak",
-
"nixpkgs": "nixpkgs_3",
-
"nixpkgs-unstable": "nixpkgs-unstable",
"nur": "nur",
"secrets": "secrets",
"tangled-core": "tangled-core",
-
"zen-browser": "zen-browser"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"lanzaboote",
"nixpkgs"
]
···
"secrets": {
"flake": false,
"locked": {
-
"lastModified": 1756518813,
-
"narHash": "sha256-tuhglLbJSQzfWeOYYMnbx4XhwFQp8cF1GdtmznPiKTQ=",
"owner": "ayla6",
"repo": "secrets",
-
"rev": "646cbc68c306569c502e78a31be22e6c2919b5ae",
"type": "github"
},
"original": {
···
},
"tangled-core": {
"inputs": {
"gomod2nix": "gomod2nix",
"htmx-src": "htmx-src",
"htmx-ws-src": "htmx-ws-src",
···
"sqlite-lib-src": "sqlite-lib-src"
},
"locked": {
-
"lastModified": 1756414897,
-
"narHash": "sha256-rHqfIHS64zWS9F0e4QGO9WEQVrx93JeicS1wzHu+izY=",
"ref": "refs/heads/master",
-
"rev": "07b009bd6b986875352905b395e672b53cdf945e",
-
"revCount": 1272,
"type": "git",
"url": "https://tangled.sh/@tangled.sh/core"
},
···
"url": "https://tangled.sh/@tangled.sh/core"
}
},
-
"treefmt-nix": {
"inputs": {
"nixpkgs": [
-
"fontix",
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1754061284,
-
"narHash": "sha256-ONcNxdSiPyJ9qavMPJYAXDNBzYobHRxw0WbT38lKbwU=",
-
"owner": "numtide",
-
"repo": "treefmt-nix",
-
"rev": "58bd4da459f0a39e506847109a2a5cfceb837796",
"type": "github"
},
"original": {
-
"owner": "numtide",
-
"repo": "treefmt-nix",
"type": "github"
}
},
-
"zen-browser": {
"inputs": {
-
"home-manager": "home-manager_4",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1756417617,
-
"narHash": "sha256-3xiEX9TvXfkEePL6rY1n6WpEEY0tBCxCTy3Evv6Oe+8=",
-
"owner": "0xc000022070",
-
"repo": "zen-browser-flake",
-
"rev": "fa97a393b3b7444d5d84f4cdd788d7c49d5dc60d",
"type": "github"
},
"original": {
-
"owner": "0xc000022070",
-
"repo": "zen-browser-flake",
"type": "github"
}
}
···
"inputs": {
"flake-parts": "flake-parts_3",
"git-hooks": "git-hooks",
+
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1753483837,
···
"systems": "systems"
},
"locked": {
+
"lastModified": 1760836749,
+
"narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=",
"owner": "ryantm",
"repo": "agenix",
+
"rev": "2f0f812f69f3eb4140157fe15e12739adf82e32a",
"type": "github"
},
"original": {
···
"type": "github"
}
},
+
"atproto-basic-notifications": {
+
"inputs": {
+
"nixpkgs": [
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1757484495,
+
"narHash": "sha256-G29d81P8wOCyXZuCyvPp8ed99ZUFFLVUVvuAdccIyFE=",
+
"owner": "ayla6",
+
"repo": "atproto-basic-notifications",
+
"rev": "10657d1a1ddb9dc8ade8fa4eb9f2641b3b4d55f2",
+
"type": "github"
+
},
+
"original": {
+
"owner": "ayla6",
+
"repo": "atproto-basic-notifications",
+
"type": "github"
+
}
+
},
+
"aylapkgs": {
+
"inputs": {
+
"nixpkgs": [
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1761266351,
+
"narHash": "sha256-oiwTRHvdcXEB7ywt4pSUfxEeteCM24bx1InVdvygz1Q=",
+
"owner": "ayla6",
+
"repo": "pkgs",
+
"rev": "49dc2b7b9c37be118c9675e9c80df8bc48558b52",
+
"type": "github"
+
},
+
"original": {
+
"owner": "ayla6",
+
"repo": "pkgs",
+
"type": "github"
+
}
+
},
+
"chaotic": {
+
"inputs": {
+
"flake-schemas": "flake-schemas",
+
"home-manager": "home-manager_2",
+
"jovian": "jovian",
+
"nixpkgs": "nixpkgs",
+
"rust-overlay": "rust-overlay"
+
},
+
"locked": {
+
"lastModified": 1761548673,
+
"narHash": "sha256-/513FfwpfbeppPdGDbmLhgcctLqEHdx8Rs92jImKA3M=",
+
"owner": "chaotic-cx",
+
"repo": "nyx",
+
"rev": "25ef687b6a0a13e9d39c3949e7de05873f5571a9",
+
"type": "github"
+
},
+
"original": {
+
"owner": "chaotic-cx",
+
"ref": "nyxpkgs-unstable",
+
"repo": "nyx",
+
"type": "github"
+
}
+
},
"copyparty": {
"inputs": {
"flake-utils": "flake-utils",
+
"nixpkgs": "nixpkgs_2"
},
"locked": {
+
"lastModified": 1761517857,
+
"narHash": "sha256-1xYv73nGA+Lm/hKRqjiUyuBzabaRwmeDxBCIMve5CWU=",
"owner": "9001",
"repo": "copyparty",
+
"rev": "e9ab040ce8e72e299a3d8fbd109865b1e218eb57",
"type": "github"
},
"original": {
···
]
},
"locked": {
+
"lastModified": 1760701190,
+
"narHash": "sha256-y7UhnWlER8r776JsySqsbTUh2Txf7K30smfHlqdaIQw=",
"owner": "nix-community",
"repo": "disko",
+
"rev": "3a9450b26e69dcb6f8de6e2b07b3fc1c288d85f5",
"type": "github"
},
"original": {
···
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
···
"type": "github"
}
},
+
"flake-compat_5": {
+
"flake": false,
+
"locked": {
+
"lastModified": 1751685974,
+
"narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=",
+
"rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1",
+
"type": "tarball",
+
"url": "https://git.lix.systems/api/v1/repos/lix-project/flake-compat/archive/549f2762aebeff29a2e5ece7a7dc0f955281a1d1.tar.gz?rev=549f2762aebeff29a2e5ece7a7dc0f955281a1d1"
+
},
+
"original": {
+
"type": "tarball",
+
"url": "https://git.lix.systems/lix-project/flake-compat/archive/main.tar.gz"
+
}
+
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
···
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
+
"lastModified": 1760948891,
+
"narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=",
"owner": "hercules-ci",
"repo": "flake-parts",
+
"rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04",
"type": "github"
},
"original": {
···
"type": "github"
}
},
+
"flake-schemas": {
+
"locked": {
+
"lastModified": 1721999734,
+
"narHash": "sha256-G5CxYeJVm4lcEtaO87LKzOsVnWeTcHGKbKxNamNWgOw=",
+
"rev": "0a5c42297d870156d9c57d8f99e476b738dcd982",
+
"revCount": 75,
+
"type": "tarball",
+
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz"
+
},
+
"original": {
+
"type": "tarball",
+
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%3D0.1.5.tar.gz"
+
}
+
},
"flake-utils": {
"locked": {
"lastModified": 1678901627,
···
"files": "files_2",
"flake-parts": "flake-parts_4",
"git-hooks-nix": "git-hooks-nix",
+
"home-manager": "home-manager_3",
"nix-darwin": "nix-darwin",
"nixpkgs": [
"nixpkgs"
···
]
},
"locked": {
+
"lastModified": 1760663237,
+
"narHash": "sha256-BflA6U4AM1bzuRMR8QqzPXqh8sWVCNDzOdsxXEguJIc=",
"owner": "cachix",
"repo": "git-hooks.nix",
+
"rev": "ca5b894d3e3e151ffc1db040b6ce4dcc75d31c37",
"type": "github"
},
"original": {
···
"home-manager_2": {
"inputs": {
"nixpkgs": [
+
"chaotic",
"nixpkgs"
]
},
"locked": {
+
"lastModified": 1761513701,
+
"narHash": "sha256-w7qOcQb1FSMZASvWe01r99QqZ5LnHO0k3rgs5ryyig0=",
"owner": "nix-community",
"repo": "home-manager",
+
"rev": "255b6a0ef2f488a2fad051361699cc67db57338c",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
···
"home-manager_3": {
"inputs": {
"nixpkgs": [
+
"fontix",
"nixpkgs"
]
},
"locked": {
+
"lastModified": 1754174776,
+
"narHash": "sha256-Sp3FRM6xNwNtGzYH/HByjzJYHSQvwsW+lDMMZNF43PQ=",
"owner": "nix-community",
"repo": "home-manager",
+
"rev": "e6e2f43a62b7dbc8aa8b1adb7101b0d8b9395445",
"type": "github"
},
"original": {
···
"home-manager_4": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
+
"lastModified": 1761584077,
+
"narHash": "sha256-dISPEZahlfs5K6d58zR4akRRyogfE9P4WSyPPNT7HiE=",
"owner": "nix-community",
"repo": "home-manager",
+
"rev": "e82585308aef3d4cc2c36c7b6946051c8cdf24ef",
"type": "github"
},
"original": {
"owner": "nix-community",
+
"ref": "master",
"repo": "home-manager",
"type": "github"
}
···
"lastModified": 1731402384,
"narHash": "sha256-OwUmrPfEehLDz0fl2ChYLK8FQM2p0G1+EMrGsYEq+6g=",
"type": "tarball",
+
"url": "https://github.com/IBM/plex/releases/download/@ibm%2Fplex-mono@1.1.0/ibm-plex-mono.zip"
},
"original": {
"type": "tarball",
+
"url": "https://github.com/IBM/plex/releases/download/@ibm%2Fplex-mono@1.1.0/ibm-plex-mono.zip"
}
},
"indigo": {
···
"url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip"
}
},
+
"jovian": {
+
"inputs": {
+
"nix-github-actions": "nix-github-actions",
+
"nixpkgs": [
+
"chaotic",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1761376732,
+
"narHash": "sha256-wavx9gROyuRZKSvPCCBh78gOur7o88ndRi545njNRrM=",
+
"owner": "Jovian-Experiments",
+
"repo": "Jovian-NixOS",
+
"rev": "8bef482d65425d0cff6b20c11a5f054f85569a38",
+
"type": "github"
+
},
+
"original": {
+
"owner": "Jovian-Experiments",
+
"repo": "Jovian-NixOS",
+
"type": "github"
+
}
+
},
"lanzaboote": {
"inputs": {
"crane": "crane",
···
"nixpkgs"
],
"pre-commit-hooks-nix": "pre-commit-hooks-nix",
+
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1737639419,
···
"type": "github"
}
},
+
"nix-github-actions": {
+
"inputs": {
+
"nixpkgs": [
+
"chaotic",
+
"jovian",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1729697500,
+
"narHash": "sha256-VFTWrbzDlZyFHHb1AlKRiD/qqCJIripXKiCSFS8fAOY=",
+
"owner": "zhaofengli",
+
"repo": "nix-github-actions",
+
"rev": "e418aeb728b6aa5ca8c5c71974e7159c2df1d8cf",
+
"type": "github"
+
},
+
"original": {
+
"owner": "zhaofengli",
+
"ref": "matrix-name",
+
"repo": "nix-github-actions",
+
"type": "github"
+
}
+
},
"nixpkgs": {
"locked": {
+
"lastModified": 1761373498,
+
"narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=",
"owner": "NixOS",
"repo": "nixpkgs",
+
"rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce",
"type": "github"
},
"original": {
+
"owner": "NixOS",
+
"ref": "nixos-unstable",
+
"repo": "nixpkgs",
+
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
+
"lastModified": 1754788789,
+
"narHash": "sha256-x2rJ+Ovzq0sCMpgfgGaaqgBSwY+LST+WbZ6TytnT9Rk=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
+
"rev": "a73b9c743612e4244d865a2fdee11865283c04e6",
"type": "github"
},
"original": {
···
"type": "github"
}
},
+
"nixpkgs_2": {
"locked": {
+
"lastModified": 1748162331,
+
"narHash": "sha256-rqc2RKYTxP3tbjA+PB3VMRQNnjesrT0pEofXQTrMsS8=",
"owner": "NixOS",
"repo": "nixpkgs",
+
"rev": "7c43f080a7f28b2774f3b3f43234ca11661bf334",
"type": "github"
},
"original": {
+
"id": "nixpkgs",
+
"ref": "nixos-25.05",
+
"type": "indirect"
}
},
+
"nixpkgs_3": {
"locked": {
"lastModified": 1740126099,
"narHash": "sha256-ozoOtE2hGsqh4XkTJFsrTkNxkRgShxpQxDynaPZUGxk=",
···
"type": "github"
}
},
+
"nixpkgs_4": {
"locked": {
+
"lastModified": 1761373498,
+
"narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=",
"owner": "NixOS",
"repo": "nixpkgs",
+
"rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce",
"type": "github"
},
"original": {
···
"type": "github"
}
},
+
"nixpkgs_5": {
"locked": {
+
"lastModified": 1761373498,
+
"narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=",
"owner": "nixos",
"repo": "nixpkgs",
+
"rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce",
"type": "github"
},
"original": {
···
"nur": {
"inputs": {
"flake-parts": "flake-parts_6",
+
"nixpkgs": "nixpkgs_5"
},
"locked": {
+
"lastModified": 1761614117,
+
"narHash": "sha256-E2o2Ztrp9oK+ftcfyBCqDAB/DivvPwngzob37oIUkew=",
"owner": "nix-community",
"repo": "NUR",
+
"rev": "1a19c6942bc8f113090d21b6d017a728cb265e5a",
"type": "github"
},
"original": {
···
"inputs": {
"actions-nix": "actions-nix",
"agenix": "agenix",
+
"atproto-basic-notifications": "atproto-basic-notifications",
+
"aylapkgs": "aylapkgs",
+
"chaotic": "chaotic",
"copyparty": "copyparty",
"disko": "disko",
"files": "files",
"flake-parts": "flake-parts_2",
"fontix": "fontix",
"git-hooks-nix": "git-hooks-nix_2",
+
"home-manager": "home-manager_4",
"lanzaboote": "lanzaboote",
"nix-flatpak": "nix-flatpak",
+
"nixpkgs": "nixpkgs_4",
"nur": "nur",
"secrets": "secrets",
"tangled-core": "tangled-core",
+
"tgirlpkgs": "tgirlpkgs"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
+
"chaotic",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1761446259,
+
"narHash": "sha256-JNNOtIIVIX+yBIsh1rq1Nxhc1LZq168vuQB5sqrZbCY=",
+
"owner": "oxalica",
+
"repo": "rust-overlay",
+
"rev": "95098bb4d55ebe167c082fc40705a73ef76b58e4",
+
"type": "github"
+
},
+
"original": {
+
"owner": "oxalica",
+
"repo": "rust-overlay",
+
"type": "github"
+
}
+
},
+
"rust-overlay_2": {
+
"inputs": {
+
"nixpkgs": [
"lanzaboote",
"nixpkgs"
]
···
"secrets": {
"flake": false,
"locked": {
+
"lastModified": 1760740637,
+
"narHash": "sha256-ZMBSooid+ECg63h+tYYbAXaS/rTZlcVuUNxCEmtoL1Y=",
"owner": "ayla6",
"repo": "secrets",
+
"rev": "909f53bbd69b1a44f1c99b2d759e7b47191f5a5d",
"type": "github"
},
"original": {
···
},
"tangled-core": {
"inputs": {
+
"flake-compat": "flake-compat_5",
"gomod2nix": "gomod2nix",
"htmx-src": "htmx-src",
"htmx-ws-src": "htmx-ws-src",
···
"sqlite-lib-src": "sqlite-lib-src"
},
"locked": {
+
"lastModified": 1761563708,
+
"narHash": "sha256-Q74UiisPJpqr3808Jp2Qbl/uEDxSoj2tIJQ5MLFoWx0=",
"ref": "refs/heads/master",
+
"rev": "bfdcfc5f77733c782f289091de53bb1b315f84be",
+
"revCount": 1555,
"type": "git",
"url": "https://tangled.sh/@tangled.sh/core"
},
···
"url": "https://tangled.sh/@tangled.sh/core"
}
},
+
"tgirlpkgs": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
+
"lastModified": 1761612240,
+
"narHash": "sha256-EFwi77fxHVgh2HzbV4IfxrM4ZfGp0tnDjsNOFHK/fls=",
+
"owner": "tgirlcloud",
+
"repo": "pkgs",
+
"rev": "c8ba164e52c05487d4a1d1003b21b179f858e0fd",
"type": "github"
},
"original": {
+
"owner": "tgirlcloud",
+
"repo": "pkgs",
"type": "github"
}
},
+
"treefmt-nix": {
"inputs": {
"nixpkgs": [
+
"fontix",
"nixpkgs"
]
},
"locked": {
+
"lastModified": 1754061284,
+
"narHash": "sha256-ONcNxdSiPyJ9qavMPJYAXDNBzYobHRxw0WbT38lKbwU=",
+
"owner": "numtide",
+
"repo": "treefmt-nix",
+
"rev": "58bd4da459f0a39e506847109a2a5cfceb837796",
"type": "github"
},
"original": {
+
"owner": "numtide",
+
"repo": "treefmt-nix",
"type": "github"
}
}
+19 -8
flake.nix
···
{
-
description = "Aly's NixOS flake with flake-parts";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
-
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
actions-nix = {
url = "github:alyraffauf/actions.nix";
···
url = "github:ryantm/agenix";
inputs.nixpkgs.follows = "nixpkgs";
};
copyparty.url = "github:9001/copyparty";
···
inputs.nixpkgs.follows = "nixpkgs";
};
-
zen-browser = {
-
url = "github:0xc000022070/zen-browser-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
-
firefox-onebar = {
-
url = "https://git.gay/freeplay/Firefox-Onebar/raw/branch/waf/onebar.css";
-
flake = false;
-
};
secrets = {
url = "github:ayla6/secrets";
···
{
+
description = "ayla's nix config";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
actions-nix = {
url = "github:alyraffauf/actions.nix";
···
url = "github:ryantm/agenix";
inputs.nixpkgs.follows = "nixpkgs";
};
+
+
atproto-basic-notifications = {
+
url = "github:ayla6/atproto-basic-notifications";
+
inputs.nixpkgs.follows = "nixpkgs";
+
};
+
+
aylapkgs = {
+
url = "github:ayla6/pkgs";
+
inputs.nixpkgs.follows = "nixpkgs";
+
};
+
+
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
copyparty.url = "github:9001/copyparty";
···
inputs.nixpkgs.follows = "nixpkgs";
};
+
tgirlpkgs = {
+
url = "github:tgirlcloud/pkgs";
inputs.nixpkgs.follows = "nixpkgs";
};
+
#firefox-onebar = {
+
# url = "https://git.gay/freeplay/Firefox-Onebar/raw/branch/waf/onebar.css";
+
# flake = false;
+
#};
secrets = {
url = "github:ayla6/secrets";
+21 -29
homes/ayla/default.nix
···
ffmpeg-full
love
luajit
-
nodejs
-
pnpm
typescript
# applications
aseprite
rclone
-
rclone-browser
yt-dlp
];
username = "ayla";
···
myHome = {
programs = {
-
chromium.enable = true;
fastfetch.enable = true;
firefox = {
enable = true;
···
};
git.enable = true;
helix.enable = true;
micro.enable = true;
mpv.enable = true;
ssh.enable = true;
zed-editor.enable = true;
-
zen-browser.enable = false;
};
profiles = {
betterLocations.enable = true;
shell.enable = true;
defaultApps = {
enable = true;
forceMimeAssociations = true;
-
archiveViewer.package = pkgs.file-roller;
-
audioPlayer.package = config.programs.mpv.finalPackage;
-
videoPlayer.package = config.programs.mpv.finalPackage;
-
editor.package = pkgs.gnome-text-editor;
-
fileManager.package = pkgs.nautilus;
-
imageViewer.package = pkgs.loupe;
-
pdfViewer.package = pkgs.papers;
-
#terminal.package = pkgs.ptyxis;
terminalEditor.package = config.programs.helix.package;
-
webBrowser.package = config.programs.firefox.finalPackage;
-
#webBrowser = {
-
# exec = lib.getExe config.programs.zen-browser.finalPackage;
-
# package = config.programs.zen-browser.finalPackage;
-
#};
};
};
-
-
services = {
-
aria2.enable = true;
-
};
};
fontix = {
···
};
myHome = {
-
desktop = {
-
gnome.enable = true;
-
};
programs = {
lutris.enable = true;
···
"org.inkscape.Inkscape"
"org.kde.kdenlive"
"org.kde.krita"
# gaming
"com.github.Anuken.Mindustry"
···
"org.atheme.audacious"
"org.freac.freac"
"org.musicbrainz.Picard"
-
"org.tenacityaudio.Tenacity"
# productivity
"com.calibre_ebook.calibre"
-
"md.obsidian.Obsidian"
"net.ankiweb.Anki"
# social (basically useless but)
"im.dino.Dino"
-
"de.schmidhuberj.Flare"
"org.gnome.Fractal"
"org.squidowl.halloy"
# utilities
-
"com.bitwarden.desktop"
"com.github.tchx84.Flatseal"
"org.keepassxc.KeePassXC"
];
···
ffmpeg-full
love
luajit
+
#nodejs
+
bun
typescript
# applications
aseprite
rclone
+
#rclone-browser
+
signal-desktop-bin
+
bitwarden-desktop
yt-dlp
+
obsidian
];
username = "ayla";
···
myHome = {
programs = {
+
helium.enable = true;
fastfetch.enable = true;
firefox = {
enable = true;
···
};
git.enable = true;
helix.enable = true;
+
jujutsu.enable = true;
micro.enable = true;
mpv.enable = true;
ssh.enable = true;
zed-editor.enable = true;
};
profiles = {
betterLocations.enable = true;
shell.enable = true;
+
fixMimeTypes.enable = true;
defaultApps = {
enable = true;
forceMimeAssociations = true;
+
editor = {
+
package = config.programs.helix.package;
+
terminal = true;
+
icon = "helix";
+
};
terminalEditor.package = config.programs.helix.package;
+
webBrowser = {
+
package = config.programs.helium.package;
+
icon = "helium";
+
};
};
};
};
fontix = {
···
};
myHome = {
+
desktop.gnome.enable = true;
programs = {
lutris.enable = true;
···
"org.inkscape.Inkscape"
"org.kde.kdenlive"
"org.kde.krita"
+
"com.obsproject.Studio"
# gaming
"com.github.Anuken.Mindustry"
···
"org.atheme.audacious"
"org.freac.freac"
"org.musicbrainz.Picard"
+
"org.audacityteam.Audacity"
# productivity
"com.calibre_ebook.calibre"
"net.ankiweb.Anki"
# social (basically useless but)
"im.dino.Dino"
"org.gnome.Fractal"
"org.squidowl.halloy"
# utilities
"com.github.tchx84.Flatseal"
"org.keepassxc.KeePassXC"
];
+1 -5
hosts/jezebel/default.nix
···
server.enable = true;
backups.enable = true;
vps.enable = true;
-
autoUpgrade = {
-
enable = true;
-
operation = "switch";
-
};
swap = {
enable = true;
size = 2048;
};
};
services = {
caddy.enable = true;
dnsmasq.enable = true;
tailscale = {
enable = true;
enableCaddy = true;
};
-
tangled-knot.enable = true;
uptime-kuma.enable = true;
};
};
···
server.enable = true;
backups.enable = true;
vps.enable = true;
swap = {
enable = true;
size = 2048;
};
};
services = {
+
atproto-basic-notifications.enable = true;
caddy.enable = true;
dnsmasq.enable = true;
tailscale = {
enable = true;
enableCaddy = true;
};
uptime-kuma.enable = true;
};
};
+1
hosts/jezebel/secrets.nix
···
resticPassword.file = "${self.inputs.secrets}/restic-passwd.age";
rclone.file = "${self.inputs.secrets}/rclone.age";
ntfyAuto.file = "${self.inputs.secrets}/ntfyAuto.age";
};
}
···
resticPassword.file = "${self.inputs.secrets}/restic-passwd.age";
rclone.file = "${self.inputs.secrets}/rclone.age";
ntfyAuto.file = "${self.inputs.secrets}/ntfyAuto.age";
+
atp-notif.file = "${self.inputs.secrets}/atproto-notif.age";
};
}
+72 -11
hosts/morgana/default.nix
···
{
self,
config,
...
}: {
imports = [
./home.nix
./secrets.nix
-
self.nixosModules.locale-en-gb
];
networking.hostName = "morgana";
···
snapshots = true;
};
tmpOnTmpfs.enable = true;
-
swap = {
-
enable = true;
-
size = 8192;
-
location = "/data/.swap";
-
};
-
autoUpgrade = {
enable = true;
-
allowReboot = false;
-
operation = "switch";
};
};
desktop.gnome.enable = true;
services = {
dnsmasq = {
enable = true;
longCaches = false;
···
enableCaddy = false;
operator = "ayla";
};
-
aria2.enable = true;
syncthing = {
enable = true;
certFile = config.age.secrets.syncthingCert.path;
···
};
};
myUsers = {
ayla = {
enable = true;
-
password = "REDACTED";
};
};
···
device = "/dev/disk/by-uuid/e5cf35fa-55bc-499f-a39b-e844a442e0f0";
fsType = "btrfs";
options = ["subvol=@data" "compress=zstd" "noatime"];
};
};
}
···
{
self,
config,
+
lib,
...
}: {
imports = [
./home.nix
./secrets.nix
+
self.nixosModules.locale-en-ca
];
networking.hostName = "morgana";
···
snapshots = true;
};
tmpOnTmpfs.enable = true;
+
hibernation = {
enable = true;
+
swap = {
+
size = 24576;
+
location = "/data/.swapfile";
+
keyFile = "/.swapkey";
+
blkDev = "/dev/disk/by-uuid/e88969b5-98a0-4d46-a059-8e07ebf2689e";
+
};
};
};
desktop.gnome.enable = true;
services = {
+
gdm.enable = true;
dnsmasq = {
enable = true;
longCaches = false;
···
enableCaddy = false;
operator = "ayla";
};
syncthing = {
enable = true;
certFile = config.age.secrets.syncthingCert.path;
···
};
};
+
security.sudo-rs.wheelNeedsPassword = lib.mkForce true;
+
myUsers = {
ayla = {
enable = true;
+
passwordFile = config.age.secrets.aylaPassword.path;
};
};
···
device = "/dev/disk/by-uuid/e5cf35fa-55bc-499f-a39b-e844a442e0f0";
fsType = "btrfs";
options = ["subvol=@data" "compress=zstd" "noatime"];
+
};
+
};
+
+
# samba for ps2 opl
+
services.samba = {
+
enable = true;
+
openFirewall = true;
+
winbindd.enable = false;
+
nmbd.enable = false;
+
settings = {
+
global = {
+
"workgroup" = "WORKGROUP";
+
"server string" = "smbnix";
+
"netbios name" = "smbnix";
+
"security" = "user";
+
+
"bind interfaces only" = "yes";
+
"interfaces" = "lo enp2s0f1";
+
+
"client min protocol" = "CORE";
+
"client max protocol" = "NT1";
+
"server max protocol" = "SMB3";
+
"server min protocol" = "LANMAN1";
+
"strict sync" = "no";
+
"keepalive" = "0";
+
+
"getwd cache" = "yes";
+
"large readwrite" = "yes";
+
"aio read size" = "0";
+
"aio write size" = "0";
+
"strict locking" = "no";
+
"strict allocate" = "no";
+
"read raw" = "no";
+
"write raw" = "no";
+
+
"server signing" = "disabled";
+
"smb encrypt" = "disabled";
+
"socket options" = "TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE";
+
+
"load printers" = "no";
+
"disable spoolss" = "yes";
+
+
"map to guest" = "bad user";
+
+
"available" = "yes";
+
"create mask" = "0777";
+
"directory mask" = "0777";
+
"force user" = "ayla";
+
"force group" = "users";
+
};
+
"PS2SMB" = {
+
"comment" = "PS2 SMB";
+
"path" = "/data/PS2SMB";
+
"browseable" = "yes";
+
"read only" = "no";
+
"guest ok" = "yes";
+
"public" = "yes";
+
"strict sync" = "no";
+
};
};
};
}
+1
hosts/morgana/secrets.nix
···
{self, ...}: {
age.secrets = {
tailscaleAuthKey.file = "${self.inputs.secrets}/tailscale/auth.age";
syncthingCert.file = "${self.inputs.secrets}/ayla/syncthing/morgana/cert.age";
syncthingKey.file = "${self.inputs.secrets}/ayla/syncthing/morgana/key.age";
···
{self, ...}: {
age.secrets = {
+
aylaPassword.file = "${self.inputs.secrets}/ayla/passwordHash.age";
tailscaleAuthKey.file = "${self.inputs.secrets}/tailscale/auth.age";
syncthingCert.file = "${self.inputs.secrets}/ayla/syncthing/morgana/cert.age";
syncthingKey.file = "${self.inputs.secrets}/ayla/syncthing/morgana/key.age";
+7 -13
hosts/nanpi/default.nix
···
profiles = {
base.enable = true;
server.enable = true;
-
autoUpgrade = {
-
enable = true;
-
operation = "boot";
-
allowReboot = false;
-
};
backups.enable = true;
btrfs = {
enable = true;
···
arr.enable = true;
};
services = {
-
audiobookshelf.enable = true;
caddy.enable = true;
cloudflared.enable = true;
-
copyparty.enable = true;
dnsmasq.enable = true;
-
forgejo = {
-
enable = true;
-
db = "postgresql";
-
};
glance.enable = true;
jellyfin.enable = true;
jellyseerr.enable = true;
-
karakeep.enable = true;
miniflux.enable = true;
ntfy.enable = true;
pds.enable = true;
qbittorrent = {
enable = true;
webuiPort = config.mySnippets.tailnet.networkMap.qbittorrent.port;
···
};
vaultwarden.enable = true;
webdav.enable = true;
};
};
myUsers = {
ayla = {
enable = true;
-
password = "REDACTED";
};
};
···
profiles = {
base.enable = true;
server.enable = true;
backups.enable = true;
btrfs = {
enable = true;
···
arr.enable = true;
};
services = {
+
audiobookshelf.enable = false;
caddy.enable = true;
cloudflared.enable = true;
+
copyparty.enable = false;
dnsmasq.enable = true;
+
forgejo.enable = true;
glance.enable = true;
jellyfin.enable = true;
jellyseerr.enable = true;
+
karakeep.enable = false;
miniflux.enable = true;
ntfy.enable = true;
pds.enable = true;
+
privatebin.enable = true;
qbittorrent = {
enable = true;
webuiPort = config.mySnippets.tailnet.networkMap.qbittorrent.port;
···
};
vaultwarden.enable = true;
webdav.enable = true;
+
tangled-knot.enable = true;
};
};
myUsers = {
ayla = {
enable = true;
+
passwordFile = config.age.secrets.aylaPassword.path;
};
};
+1
hosts/nanpi/secrets.nix
···
{self, ...}: {
age.secrets = {
pds.file = "${self.inputs.secrets}/pds.age";
resticPassword.file = "${self.inputs.secrets}/restic-passwd.age";
rclone.file = "${self.inputs.secrets}/rclone.age";
···
{self, ...}: {
age.secrets = {
+
aylaPassword.file = "${self.inputs.secrets}/ayla/crazierPasswordHash.age";
pds.file = "${self.inputs.secrets}/pds.age";
resticPassword.file = "${self.inputs.secrets}/restic-passwd.age";
rclone.file = "${self.inputs.secrets}/rclone.age";
+5 -1
modules/flake/files/helix.nix
···
name = "nix";
auto-format = true;
formatter = {command = lib.getExe pkgs.alejandra;};
-
language-servers = ["nixd"];
}
{
name = "bash";
···
nixd = {
command = lib.getExe pkgs.nixd;
};
};
};
···
name = "nix";
auto-format = true;
formatter = {command = lib.getExe pkgs.alejandra;};
+
language-servers = ["nixd" "nil"];
}
{
name = "bash";
···
nixd = {
command = lib.getExe pkgs.nixd;
+
};
+
+
nil = {
+
command = lib.getExe pkgs.nil;
};
};
};
+56 -23
modules/flake/files/zed.nix
···
lib,
pkgs,
...
-
}: {
files.files = [
{
checkFile = false;
···
auto_install_extensions = {
basher = true;
nix = true;
};
languages = {
-
JSON = {
-
format_on_save = "on";
-
formatter = {
-
external = {
-
command = lib.getExe pkgs.prettier;
-
arguments = ["--stdin-filepath" "{buffer_path}"];
-
};
-
};
-
};
Markdown = {
format_on_save = "on";
-
-
formatter.external = {
-
command = lib.getExe pkgs.prettier;
-
arguments = ["--stdin-filepath" "{buffer_path}"];
-
};
};
Nix = {
format_on_save = "on";
formatter = "language_server";
-
language_servers = ["nixd"];
};
"Shell Script" = {
···
YAML = {
format_on_save = "on";
-
formatter.external = {
-
command = lib.getExe pkgs.prettier;
-
arguments = ["--stdin-filepath" "{buffer_path}"];
-
};
};
};
-
lsp.nixd = {
-
binary.path = lib.getExe pkgs.nixd;
-
settings.formatting.command = [(lib.getExe pkgs.alejandra) "--quiet" "--"];
};
};
}
···
lib,
pkgs,
...
+
}: let
+
prettier = {
+
external = {
+
command = pkgs.writeScript "prettier-bun" ''
+
#! ${pkgs.bash}/bin/bash -e
+
exec ${lib.getExe pkgs.bun} ${pkgs.prettier}/bin/prettier.cjs "$@"
+
'';
+
arguments = ["--stdin-filepath" "{buffer_path}"];
+
};
+
};
+
biome = {
+
format_on_save = "on";
+
+
formatter = {language_server = {name = "biome";};};
+
code_actions_on_format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
in {
files.files = [
{
checkFile = false;
···
auto_install_extensions = {
basher = true;
nix = true;
+
marksman = true;
};
languages = {
+
JSON = biome // {language_servers = ["json-language-server" "biome"];};
+
JSONC = biome // {language_servers = ["json-language-server" "biome"];};
Markdown = {
format_on_save = "on";
+
formatter = prettier;
+
language_servers = ["marksman"];
};
Nix = {
format_on_save = "on";
formatter = "language_server";
+
language_servers = [
+
"nixd"
+
"nil"
+
];
};
"Shell Script" = {
···
YAML = {
format_on_save = "on";
+
formatter = prettier;
};
};
+
lsp = {
+
nixd = {
+
binary.path = lib.getExe pkgs.nixd;
+
settings.formatting.command = [(lib.getExe pkgs.alejandra) "--quiet" "--"];
+
};
+
nil = {
+
binary = {
+
path = lib.getExe pkgs.nil;
+
arguments = ["--stdio"];
+
};
+
};
+
json-language-server = {
+
binary = {
+
path = pkgs.writeScript "vscode-json-languageserver-bun" ''
+
#! ${pkgs.bash}/bin/bash -e
+
exec ${lib.getExe pkgs.bun} ${pkgs.vscode-json-languageserver}/lib/node_modules/vscode-json-languageserver/./bin/vscode-json-languageserver "$@"
+
'';
+
arguments = ["--stdio"];
+
};
+
};
+
marksman = {
+
binary = {
+
path = lib.getExe pkgs.marksman;
+
arguments = ["server"];
+
};
+
};
};
};
}
+6 -1
modules/flake/nixos.nix
···
nixosModules = {
hardware = ../hardware;
locale-en-gb = ../locale/en-gb;
nixos = ../nixos;
snippets = ../snippets;
···
modules = [
../../hosts/${host}
inputs.agenix.nixosModules.default
inputs.copyparty.nixosModules.default
inputs.disko.nixosModules.disko
inputs.home-manager.nixosModules.home-manager
inputs.lanzaboote.nixosModules.lanzaboote
inputs.tangled-core.nixosModules.knot
modules.hardware
modules.nixos
modules.snippets
···
overlays = [
self.inputs.nur.overlays.default
self.inputs.copyparty.overlays.default
];
config.allowUnfree = true;
};
}
];
-
specialArgs = {inherit self;};
}
);
};
···
nixosModules = {
hardware = ../hardware;
+
locale-en-ca = ../locale/en-ca;
locale-en-gb = ../locale/en-gb;
nixos = ../nixos;
snippets = ../snippets;
···
modules = [
../../hosts/${host}
inputs.agenix.nixosModules.default
+
inputs.atproto-basic-notifications.nixosModules.default
inputs.copyparty.nixosModules.default
inputs.disko.nixosModules.disko
inputs.home-manager.nixosModules.home-manager
inputs.lanzaboote.nixosModules.lanzaboote
inputs.tangled-core.nixosModules.knot
+
inputs.tgirlpkgs.nixosModules.default
+
inputs.chaotic.nixosModules.default
modules.hardware
modules.nixos
modules.snippets
···
overlays = [
self.inputs.nur.overlays.default
self.inputs.copyparty.overlays.default
+
self.inputs.aylapkgs.overlays.default
];
config.allowUnfree = true;
};
}
];
+
specialArgs = {inherit self inputs;};
}
);
};
+2 -2
modules/hardware/profiles/base/default.nix
···
fstrim.enable = true;
logind.settings.Login = {
-
HandlePowerKey = "suspend";
-
HandlePowerKeyLongPress = "poweroff";
};
xserver.xkb = {
···
fstrim.enable = true;
logind.settings.Login = {
+
HandlePowerKey = lib.mkDefault "suspend";
+
HandlePowerKeyLongPress = lib.mkDefault "poweroff";
};
xserver.xkb = {
+1 -1
modules/home/default.nix
···
./profiles
./snippets
inputs.agenix.homeManagerModules.default
-
inputs.zen-browser.homeModules.beta
];
home = {
···
./profiles
./snippets
inputs.agenix.homeManagerModules.default
+
inputs.aylapkgs.homeModules.default
];
home = {
+51
modules/home/desktop/cosmic/default.nix
···
···
+
{
+
lib,
+
config,
+
pkgs,
+
...
+
}: {
+
options.myHome.desktop.cosmic = {
+
enable = lib.mkEnableOption "COSMIC desktop environment";
+
};
+
+
config = lib.mkIf config.myHome.desktop.cosmic.enable {
+
dconf = {
+
enable = true;
+
+
settings = {
+
"org/gnome/desktop/wm/preferences".button-layout = "appmenu:close";
+
};
+
};
+
+
myHome.profiles.defaultApps = {
+
audioPlayer = {
+
package = lib.mkDefault config.programs.mpv.finalPackage;
+
icon = lib.mkDefault "mpv";
+
};
+
editor = {
+
package = lib.mkDefault pkgs.cosmic-edit;
+
icon = lib.mkDefault "com.system76.CosmicEdit";
+
};
+
fileManager = {
+
package = lib.mkDefault pkgs.cosmic-files;
+
icon = lib.mkDefault "com.system76.CosmicFiles";
+
};
+
imageViewer = {
+
package = lib.mkDefault pkgs.loupe;
+
icon = lib.mkDefault "org.gnome.Loupe";
+
};
+
pdfViewer = {
+
package = lib.mkDefault pkgs.papers;
+
icon = lib.mkDefault "org.gnome.Papers";
+
};
+
terminal = {
+
package = lib.mkDefault pkgs.cosmic-term;
+
icon = lib.mkDefault "com.system76.CosmicTerm";
+
};
+
videoPlayer = {
+
package = lib.mkDefault config.programs.mpv.finalPackage;
+
icon = lib.mkDefault "mpv";
+
};
+
};
+
};
+
}
+3 -1
modules/home/desktop/default.nix
···
}: {
imports = [
./gnome
];
options.myHome.desktop.enable = lib.mkOption {
-
default = config.myHome.desktop.gnome.enable;
description = "Desktop environment configuration.";
type = lib.types.bool;
};
···
}: {
imports = [
./gnome
+
./plasma
+
./cosmic
];
options.myHome.desktop.enable = lib.mkOption {
+
default = config.myHome.desktop.gnome.enable or config.myHome.desktop.plasma.enable;
description = "Desktop environment configuration.";
type = lib.types.bool;
};
+40 -35
modules/home/desktop/gnome/default.nix
···
"org/gnome/system/location".enabled = false;
"org/gnome/desktop/wm/keybindings" = {
-
move-to-monitor-down = [
-
"<Ctrl><Shift><Super>e"
-
"<Ctrl><Shift><Super>Down"
-
];
-
move-to-monitor-left = [
-
"<Ctrl><Shift><Super>n"
-
"<Ctrl><Shift><Super>Left"
-
];
-
move-to-monitor-right = [
-
"<Ctrl><Shift><Super>o"
-
"<Ctrl><Shift><Super>Right"
-
];
-
move-to-monitor-up = [
-
"<Ctrl><Shift><Super>i"
-
"<Ctrl><Shift><Super>Up"
-
];
move-to-workspace-1 = ["<Shift><Super>1"];
move-to-workspace-10 = ["<Shift><Super>0"];
move-to-workspace-2 = ["<Shift><Super>2"];
···
move-to-workspace-7 = ["<Shift><Super>7"];
move-to-workspace-8 = ["<Shift><Super>8"];
move-to-workspace-9 = ["<Shift><Super>9"];
-
move-to-workspace-down = ["<Shift><Super>j"];
-
move-to-workspace-left = [
-
"<Shift><Super>n"
-
"<Shift><Super>Comma"
-
];
-
move-to-workspace-right = [
-
"<Shift><Super>o"
-
"<Shift><Super>Period"
-
];
-
move-to-workspace-up = ["<Shift><Super>k"];
switch-to-workspace-1 = ["<Super>1"];
switch-to-workspace-10 = ["<Super>0"];
switch-to-workspace-2 = ["<Super>2"];
···
switch-to-workspace-8 = ["<Super>8"];
switch-to-workspace-9 = ["<Super>9"];
switch-to-workspace-down = [];
-
switch-to-workspace-left = ["<Super>Comma"];
-
switch-to-workspace-right = ["<Super>Period"];
switch-to-workspace-up = [];
toggle-fullscreen = ["<Super>w"];
};
};
};
···
];
myHome.profiles.defaultApps = {
-
audioPlayer.package = lib.mkDefault pkgs.mpv;
-
editor.package = lib.mkDefault pkgs.gnome-text-editor;
-
fileManager.package = lib.mkDefault pkgs.nautilus;
-
imageViewer.package = lib.mkDefault pkgs.loupe;
-
pdfViewer.package = lib.mkDefault pkgs.papers;
-
terminal.package = lib.mkDefault pkgs.gnome-console;
-
videoPlayer.package = lib.mkDefault pkgs.mpv;
};
};
}
···
"org/gnome/system/location".enabled = false;
"org/gnome/desktop/wm/keybindings" = {
+
move-to-monitor-down = ["<Ctrl><Shift><Super>Down"];
+
move-to-monitor-left = ["<Ctrl><Shift><Super>Left"];
+
move-to-monitor-right = ["<Ctrl><Shift><Super>Right"];
+
move-to-monitor-up = ["<Ctrl><Shift><Super>Up"];
move-to-workspace-1 = ["<Shift><Super>1"];
move-to-workspace-10 = ["<Shift><Super>0"];
move-to-workspace-2 = ["<Shift><Super>2"];
···
move-to-workspace-7 = ["<Shift><Super>7"];
move-to-workspace-8 = ["<Shift><Super>8"];
move-to-workspace-9 = ["<Shift><Super>9"];
switch-to-workspace-1 = ["<Super>1"];
switch-to-workspace-10 = ["<Super>0"];
switch-to-workspace-2 = ["<Super>2"];
···
switch-to-workspace-8 = ["<Super>8"];
switch-to-workspace-9 = ["<Super>9"];
switch-to-workspace-down = [];
+
switch-to-workspace-left = ["<Ctrl><Super>Left"];
+
switch-to-workspace-right = ["<Ctrl><Super>Right"];
switch-to-workspace-up = [];
toggle-fullscreen = ["<Super>w"];
};
+
+
"org/gnome/desktop/wm/preferences".button-layout = "appmenu:close";
};
};
···
];
myHome.profiles.defaultApps = {
+
archiveViewer = {
+
package = lib.mkDefault pkgs.file-roller;
+
icon = lib.mkDefault "org.gnome.FileRoller";
+
};
+
audioPlayer = {
+
package = lib.mkDefault config.programs.mpv.finalPackage;
+
icon = lib.mkDefault "mpv";
+
};
+
editor = {
+
package = lib.mkDefault pkgs.gnome-text-editor;
+
icon = lib.mkDefault "org.gnome.TextEditor";
+
};
+
fileManager = {
+
package = lib.mkDefault pkgs.nautilus;
+
icon = lib.mkDefault "org.gnome.Nautilus";
+
};
+
imageViewer = {
+
package = lib.mkDefault pkgs.loupe;
+
icon = lib.mkDefault "org.gnome.Loupe";
+
};
+
pdfViewer = {
+
package = lib.mkDefault pkgs.papers;
+
icon = lib.mkDefault "org.gnome.Papers";
+
};
+
terminal = {
+
package = lib.mkDefault pkgs.gnome-console;
+
icon = lib.mkDefault "org.gnome.Terminal";
+
};
+
videoPlayer = {
+
package = lib.mkDefault config.programs.mpv.finalPackage;
+
icon = lib.mkDefault "mpv";
+
};
};
};
}
+52
modules/home/desktop/plasma/default.nix
···
···
+
{
+
lib,
+
config,
+
pkgs,
+
...
+
}: {
+
options.myHome.desktop.plasma = {
+
enable = lib.mkEnableOption "KDE Plasma desktop environment";
+
};
+
+
config = lib.mkIf config.myHome.desktop.plasma.enable {
+
dconf = {
+
enable = true;
+
+
settings = {
+
"org/gnome/desktop/wm/preferences".button-layout = "appmenu:minimize,maximize,close";
+
};
+
};
+
+
myHome.profiles.defaultApps = {
+
audioPlayer = {
+
package = lib.mkDefault config.programs.mpv.finalPackage;
+
icon = lib.mkDefault "mpv";
+
};
+
editor = {
+
package = lib.mkDefault pkgs.kdePackages.kate;
+
icon = lib.mkDefault "org.kde.kate";
+
};
+
fileManager = {
+
package = lib.mkDefault pkgs.kdePackages.dolphin;
+
exec = lib.mkDefault (lib.getExe config.myHome.profiles.defaultApps.fileManager.package);
+
icon = lib.mkDefault "org.kde.dolphin";
+
};
+
imageViewer = {
+
package = lib.mkDefault pkgs.kdePackages.gwenview;
+
icon = lib.mkDefault "org.kde.gwenview";
+
};
+
pdfViewer = {
+
package = lib.mkDefault pkgs.kdePackages.okular;
+
icon = lib.mkDefault "org.kde.okular";
+
};
+
terminal = {
+
package = lib.mkDefault pkgs.kdePackages.konsole;
+
icon = lib.mkDefault "org.kde.konsole";
+
};
+
videoPlayer = {
+
package = lib.mkDefault config.programs.mpv.finalPackage;
+
icon = lib.mkDefault "mpv";
+
};
+
};
+
};
+
}
+1
modules/home/profiles/default.nix
···
./betterLocations
./defaultApps
./shell
];
}
···
./betterLocations
./defaultApps
./shell
+
./fixMimeTypes
];
}
+100 -11
modules/home/profiles/defaultApps/default.nix
···
default = lib.getExe cfg.archiveViewer.package;
description = "The executable path for the default archive viewer.";
};
};
audioPlayer = {
···
default = lib.getExe cfg.audioPlayer.package;
description = "The executable path for the default audio player.";
};
};
editor = {
···
default = lib.getExe cfg.editor.package;
description = "The executable path for the default text editor.";
};
};
fileManager = {
···
type = lib.types.str;
default = lib.getExe cfg.fileManager.package;
description = "The executable path for the default file manager.";
};
};
···
default = lib.getExe cfg.imageViewer.package;
description = "The executable path for the default image viewer.";
};
};
pdfViewer = {
···
default = lib.getExe cfg.pdfViewer.package;
description = "The executable path for the default PDF viewer.";
};
};
terminal = {
···
type = lib.types.str;
default = lib.getExe cfg.terminal.package;
description = "The executable path for the default terminal emulator.";
};
};
···
default = lib.getExe cfg.videoPlayer.package;
description = "The executable path for the default video player.";
};
};
webBrowser = {
···
type = lib.types.str;
default = lib.getExe cfg.webBrowser.package;
description = "The executable path for the default web browser.";
};
};
};
···
};
desktopEntries = let
-
mkDefaultEntry = name: exec: {
exec = "${exec} %U";
-
icon = "${builtins.baseNameOf exec}";
name = "Default ${name}";
-
terminal = false;
settings = {
NoDisplay = "true";
···
};
in
lib.mkIf cfg.forceMimeAssociations {
-
defaultAudioPlayer = mkDefaultEntry "Audio Player" cfg.audioPlayer.exec;
-
defaultEditor = mkDefaultEntry "Editor" cfg.editor.exec;
-
defaultFileManager = mkDefaultEntry "File Manager" cfg.fileManager.exec;
-
defaultImageViewer = mkDefaultEntry "Image Viewer" cfg.imageViewer.exec;
-
defaultPdfViewer = mkDefaultEntry "PDF Viewer" cfg.pdfViewer.exec;
-
defaultVideoPlayer = mkDefaultEntry "Video Player" cfg.videoPlayer.exec;
-
defaultWebBrowser = mkDefaultEntry "Web Browser" cfg.webBrowser.exec;
-
defaultArchiveViewer = mkDefaultEntry "Archive Viewer" cfg.archiveViewer.exec;
};
};
};
···
default = lib.getExe cfg.archiveViewer.package;
description = "The executable path for the default archive viewer.";
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = "";
+
description = "The icon name for the default archive viewer.";
+
};
};
audioPlayer = {
···
default = lib.getExe cfg.audioPlayer.package;
description = "The executable path for the default audio player.";
};
+
+
terminal = lib.mkOption {
+
type = lib.types.bool;
+
default = false;
+
description = "Whether the editor is a terminal-based application.";
+
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = "";
+
description = "The icon name for the default audio player.";
+
};
};
editor = {
···
default = lib.getExe cfg.editor.package;
description = "The executable path for the default text editor.";
};
+
+
terminal = lib.mkOption {
+
type = lib.types.bool;
+
default = false;
+
description = "Whether the editor is a terminal-based application.";
+
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = "";
+
description = "The icon name for the default text editor.";
+
};
};
fileManager = {
···
type = lib.types.str;
default = lib.getExe cfg.fileManager.package;
description = "The executable path for the default file manager.";
+
};
+
+
terminal = lib.mkOption {
+
type = lib.types.bool;
+
default = false;
+
description = "Whether the editor is a terminal-based application.";
+
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = "";
+
description = "The icon name for the default file manager.";
};
};
···
default = lib.getExe cfg.imageViewer.package;
description = "The executable path for the default image viewer.";
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = "";
+
description = "The icon name for the default image viewer.";
+
};
};
pdfViewer = {
···
default = lib.getExe cfg.pdfViewer.package;
description = "The executable path for the default PDF viewer.";
};
+
+
terminal = lib.mkOption {
+
type = lib.types.bool;
+
default = false;
+
description = "Whether the editor is a terminal-based application.";
+
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = "";
+
description = "The icon name for the default PDF viewer.";
+
};
};
terminal = {
···
type = lib.types.str;
default = lib.getExe cfg.terminal.package;
description = "The executable path for the default terminal emulator.";
+
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = "";
+
description = "The icon name for the default terminal emulator.";
};
};
···
default = lib.getExe cfg.videoPlayer.package;
description = "The executable path for the default video player.";
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = "";
+
description = "The icon name for the default video player.";
+
};
};
webBrowser = {
···
type = lib.types.str;
default = lib.getExe cfg.webBrowser.package;
description = "The executable path for the default web browser.";
+
};
+
+
icon = lib.mkOption {
+
type = lib.types.str;
+
default = lib.getIcon cfg.webBrowser.package;
+
description = "The icon name for the default web browser.";
};
};
};
···
};
desktopEntries = let
+
mkDefaultEntry = name: exec: terminal: icon: {
exec = "${exec} %U";
+
icon =
+
if icon != ""
+
then icon
+
else "${builtins.baseNameOf exec}";
name = "Default ${name}";
+
inherit terminal;
settings = {
NoDisplay = "true";
···
};
in
lib.mkIf cfg.forceMimeAssociations {
+
defaultAudioPlayer =
+
mkDefaultEntry "Audio Player" cfg.audioPlayer.exec cfg.audioPlayer.terminal cfg.audioPlayer.icon;
+
defaultEditor =
+
mkDefaultEntry "Editor" cfg.editor.exec cfg.editor.terminal cfg.editor.icon;
+
defaultFileManager =
+
mkDefaultEntry "File Manager" cfg.fileManager.exec cfg.fileManager.terminal cfg.fileManager.icon;
+
defaultImageViewer =
+
mkDefaultEntry "Image Viewer" cfg.imageViewer.exec false cfg.imageViewer.icon;
+
defaultPdfViewer =
+
mkDefaultEntry "PDF Viewer" cfg.pdfViewer.exec cfg.pdfViewer.terminal cfg.pdfViewer.icon;
+
defaultVideoPlayer =
+
mkDefaultEntry "Video Player" cfg.videoPlayer.exec false cfg.videoPlayer.icon;
+
defaultWebBrowser =
+
mkDefaultEntry "Web Browser" cfg.webBrowser.exec false cfg.webBrowser.icon;
+
defaultArchiveViewer =
+
mkDefaultEntry "Archive Viewer" cfg.archiveViewer.exec false cfg.archiveViewer.icon;
};
};
};
+30 -10
modules/home/profiles/defaultApps/mimeTypes.nix
···
];
browserFiles = [
-
"application/vnd.mozilla.xul+xml"
-
"application/x-extension-htm"
-
"application/x-extension-html"
-
"application/x-extension-shtml"
-
"application/x-extension-xht"
-
"application/x-extension-xhtml"
-
"application/xhtml+xml"
-
"text/html"
-
"text/xml"
"x-scheme-handler/chrome"
"x-scheme-handler/ftp"
"x-scheme-handler/http"
···
];
editorFiles = [
"application/json"
-
"application/x-shellscript"
"application/x-shellscript"
"text/markdown"
"text/plain"
"text/x-python"
];
imageFiles = [
···
];
browserFiles = [
"x-scheme-handler/chrome"
"x-scheme-handler/ftp"
"x-scheme-handler/http"
···
];
editorFiles = [
+
"application/vnd.mozilla.xul+xml"
+
"application/x-extension-htm"
+
"application/x-extension-html"
+
"application/x-extension-shtml"
+
"application/x-extension-xht"
+
"application/x-extension-xhtml"
+
"application/xhtml+xml"
+
"text/html"
+
"text/xml"
+
"application/json"
"application/x-shellscript"
"text/markdown"
"text/plain"
"text/x-python"
+
"text/x-typescript"
+
"text/x-javascript"
+
"text/x-svelte"
+
"text/css"
+
"text/x-lua"
+
"text/x-nix"
+
"text/x-scss"
+
"application/toml"
+
"text/x-zig"
+
"text/x-gleam"
+
"text/x-glsl"
+
"text/x-gdscript"
+
"text/x-vue"
+
"text/x-go"
+
"text/x-rust"
+
"text/x-makefile"
+
"text/x-fish"
+
"text/x-elixir"
+
"text/html"
+
"application/x-yaml"
];
imageFiles = [
+47
modules/home/profiles/fixMimeTypes/default.nix
···
···
+
{
+
lib,
+
pkgs,
+
config,
+
...
+
}: let
+
cfg = config.myHome.profiles.fixMimeTypes;
+
+
xml = pkgs.formats.xml {};
+
+
# thank you chatgpt ig
+
makeMimeFile = {
+
type, # e.g. "text/x-typescript"
+
comment, # e.g. "TypeScript source file"
+
globs, # list of patterns: [ "*.ts" "*.tsx" ]
+
}:
+
xml.generate (builtins.replaceStrings ["/"] ["_"] "${type}.xml") {
+
"mime-info" = {
+
"@xmlns" = "http://www.freedesktop.org/standards/shared-mime-info";
+
"mime-type" = {
+
"@type" = type;
+
comment = comment;
+
glob = map (pattern: {"@pattern" = pattern;}) globs;
+
};
+
};
+
};
+
in {
+
options.myHome.profiles.fixMimeTypes = {
+
enable = lib.mkEnableOption "mimetypes are dumb and they don't always register the right formats";
+
};
+
+
config = lib.mkIf cfg.enable {
+
xdg.dataFile = {
+
"mime/packages/typescript.xml".source = makeMimeFile {
+
type = "text/x-typescript";
+
comment = "TypeScript source file";
+
globs = ["*.ts" "*.tsx" "*.mts" "*.cts"];
+
};
+
+
"mime/packages/svelte.xml".source = makeMimeFile {
+
type = "text/x-svelte";
+
comment = "Svelte source file";
+
globs = ["*.svelte" "*.svelte.ts" "*.svelte.js"];
+
};
+
};
+
};
+
}
+6 -1
modules/home/profiles/shell/default.nix
···
l = "eza -lah";
tree = "eza --tree";
top = "btop";
-
npm = "pnpm";
ytmusic = "yt-dlp -f 251 --remux-video opus --embed-metadata --embed-thumbnail -o \"%(album)s/%(disc_number>0)s%(disc_number)02d-%(track_number)02d %(title)s.%(ext)s\"";
};
};
···
zellij = {
enable = true;
enableFishIntegration = false;
};
zoxide = {
···
l = "eza -lah";
tree = "eza --tree";
top = "btop";
+
cat = "bat -p -P";
ytmusic = "yt-dlp -f 251 --remux-video opus --embed-metadata --embed-thumbnail -o \"%(album)s/%(disc_number>0)s%(disc_number)02d-%(track_number)02d %(title)s.%(ext)s\"";
};
};
···
zellij = {
enable = true;
enableFishIntegration = false;
+
settings = {
+
theme = "onedark";
+
default_shell = "fish";
+
show_startup_tips = false;
+
};
};
zoxide = {
-181
modules/home/programs/chromium/default.nix
···
-
# https://github.com/isabelroses/dotfiles/blob/ed6d3765ffb7dcfe67540f111f23d51a0d9617d5/modules/home/programs/chromium.nix#L16
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}: let
-
inherit
-
(lib)
-
concatLists
-
concatMapStrings
-
enableFeature
-
;
-
in {
-
options.myHome.programs.chromium.enable = lib.mkEnableOption "chromium web browser";
-
-
config = lib.mkIf config.myHome.programs.chromium.enable {
-
programs.chromium = {
-
enable = true;
-
-
extensions = [
-
{id = "ddkjiahejlhfcafbddmgiahcphecmpfh";} # ublock origin lite
-
{id = "mdjildafknihdffpkfmmpnpoiajfjnjd";} # consent-o-matic
-
{id = "clngdbkpkpeebahjckkjfobafhncgmne";} # stylus
-
{id = "oboonakemofpalcgghocfoadofidjkkk";} # keepassxc
-
{id = "jinjaccalgkegednnccohejagnlnfdag";} # violentmonkey
-
{id = "nngceckbapebfimnlniiiahkandclblb";} # bitwarden
-
-
rec {
-
id = "oladmjdebphlnjjcnomfhhbfdldiimaf"; # libredirect
-
version = "3.2.0";
-
-
crxPath = pkgs.fetchurl {
-
url = "https://github.com/libredirect/browser_extension/releases/download/v${version}/libredirect-${version}.crx";
-
sha256 = "sha256-Neja0pJ7rMV+riINeMcWxU2SzZ+ZETp6bV1MaYLHz1Y=";
-
};
-
}
-
-
rec {
-
id = "lkbebcjgcmobigpeffafkodonchffocl"; # bypass-paywalls-clean
-
version = "4.1.8.0";
-
-
crxPath = pkgs.fetchurl {
-
url = "https://gitflic.ru/project/magnolia1234/bpc_uploads/blob/raw?file=bypass-paywalls-chrome-clean-${version}.crx";
-
sha256 = "sha256-BRpwrV8AN1eOG2IXfk24gyEd8OzwK1BJqDdoxlgX8o4=";
-
};
-
}
-
];
-
-
package = pkgs.chromium.override {
-
enableWideVine = true;
-
-
# https://github.com/secureblue/hardened-chromium
-
# https://github.com/secureblue/secureblue/blob/e500f078efc5748d5033a881bbbcdcd2de95a813/files/system/usr/etc/chromium/chromium.conf.md
-
commandLineArgs = concatLists [
-
# Aesthetics
-
[
-
"--gtk-version=4"
-
]
-
-
# Performance
-
[
-
(enableFeature true "gpu-rasterization")
-
(enableFeature true "oop-rasterization")
-
(enableFeature true "zero-copy")
-
"--ignore-gpu-blocklist"
-
]
-
-
# Wayland
-
[
-
"--ozone-platform=wayland"
-
"--enable-features=UseOzonePlatform"
-
]
-
-
# Etc
-
[
-
"--disk-cache=$XDG_RUNTIME_DIR/chromium-cache"
-
(enableFeature false "reading-from-canvas")
-
"--no-first-run"
-
"--disable-wake-on-wifi"
-
"--disable-breakpad"
-
-
# please stop asking me to be the default browser
-
"--no-default-browser-check"
-
-
# I don't need these, thus I disable them
-
(enableFeature false "speech-api")
-
(enableFeature false "speech-synthesis-api")
-
]
-
-
# Security
-
[
-
# Use strict extension verification
-
"--extension-content-verification=enforce_strict"
-
"--extensions-install-verification=enforce_strict"
-
# Disable pings
-
"--no-pings"
-
# Require HTTPS for component updater
-
"--component-updater=require_encryption"
-
# Disable crash upload
-
"--no-crash-upload"
-
# don't run things without asking
-
"--no-service-autorun"
-
# Disable sync
-
"--disable-sync"
-
-
(
-
"--enable-features="
-
+ concatMapStrings (x: x + ",") [
-
# Enable visited link database partitioning
-
"PartitionVisitedLinkDatabase"
-
# Enable prefetch privacy changes
-
"PrefetchPrivacyChanges"
-
# Enable split cache
-
"SplitCacheByNetworkIsolationKey"
-
"SplitCodeCacheByNetworkIsolationKey"
-
# Enable partitioning connections
-
"EnableCrossSiteFlagNetworkIsolationKey"
-
"HttpCacheKeyingExperimentControlGroup"
-
"PartitionConnectionsByNetworkIsolationKey"
-
# Enable strict origin isolation
-
"StrictOriginIsolation"
-
# Enable reduce accept language header
-
"ReduceAcceptLanguage"
-
# Enable content settings partitioning
-
"ContentSettingsPartitioning"
-
# i like moving pages with my touchpad...
-
"TouchpadOverscrollHistoryNavigation"
-
]
-
)
-
-
(
-
"--disable-features="
-
+ concatMapStrings (x: x + ",") [
-
# Disable autofill
-
"AutofillPaymentCardBenefits"
-
"AutofillPaymentCvcStorage"
-
"AutofillPaymentCardBenefits"
-
# Disable third-party cookie deprecation bypasses
-
"TpcdHeuristicsGrants"
-
"TpcdMetadataGrants"
-
# Disable hyperlink auditing
-
"EnableHyperlinkAuditing"
-
# Disable showing popular sites
-
"NTPPopularSitesBakedInContent"
-
"UsePopularSitesSuggestions"
-
# Disable article suggestions
-
"EnableSnippets"
-
"ArticlesListVisible"
-
"EnableSnippetsByDse"
-
# Disable content feed suggestions
-
"InterestFeedV2"
-
# Disable media DRM preprovisioning
-
"MediaDrmPreprovisioning"
-
# Disable autofill server communication
-
"AutofillServerCommunication"
-
# Disable new privacy sandbox features
-
"PrivacySandboxSettings4"
-
"BrowsingTopics"
-
"BrowsingTopicsDocumentAPI"
-
"BrowsingTopicsParameters"
-
# Disable translate button
-
"AdaptiveButtonInTopToolbarTranslate"
-
# Disable detailed language settings
-
"DetailedLanguageSettings"
-
# Disable fetching optimization guides
-
"OptimizationHintsFetching"
-
# Partition third-party storage
-
"DisableThirdPartyStoragePartitioningDeprecationTrial2"
-
-
# Disable media engagement
-
"PreloadMediaEngagementData"
-
"MediaEngagementBypassAutoplayPolicies"
-
]
-
)
-
]
-
];
-
};
-
};
-
};
-
}
···
+2 -2
modules/home/programs/default.nix
···
imports = [
./anki
./aria2
-
./chromium
./fastfetch
./firefox
./helix
./lutris
./git
./micro
./mpv
./ssh
./zed-editor
-
./zen-browser
];
}
···
imports = [
./anki
./aria2
./fastfetch
./firefox
+
./helium
./helix
+
./jujutsu
./lutris
./git
./micro
./mpv
./ssh
./zed-editor
];
}
+21 -21
modules/home/programs/firefox/default.nix
···
{
lib,
config,
-
pkgs,
-
self,
...
}: {
options.myHome.programs.firefox = {
enable = lib.mkEnableOption "firefox web browser";
mode = lib.mkOption {
-
type = lib.types.enum ["onebar" "sidebar" "default"];
-
default = "onebar";
description = "Firefox UI mode";
};
};
···
config.mySnippets.firefox-based.userConfig
)
-
(lib.mkIf
-
(config.myHome.programs.firefox.mode == "onebar")
-
{
-
profiles.default = {
-
settings = {
-
"onebar.collapse-URLbar" = true;
-
"onebar.conditional-navigation-buttons" = false;
-
"onebar.hide-all-URLbar-icons" = true;
-
};
-
-
userChrome = builtins.readFile self.inputs.firefox-onebar;
-
-
extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
-
adaptive-tab-bar-colour
-
];
-
};
-
})
(
if (config.myHome.programs.firefox.mode == "sidebar")
···
{
lib,
config,
+
#pkgs,
+
#self,
...
}: {
options.myHome.programs.firefox = {
enable = lib.mkEnableOption "firefox web browser";
mode = lib.mkOption {
+
type = lib.types.enum ["sidebar" "default"];
+
default = "sidebar";
description = "Firefox UI mode";
};
};
···
config.mySnippets.firefox-based.userConfig
)
+
#(lib.mkIf
+
# (config.myHome.programs.firefox.mode == "onebar")
+
# {
+
# profiles.default = {
+
# settings = {
+
# "onebar.collapse-URLbar" = true;
+
# "onebar.conditional-navigation-buttons" = false;
+
# "onebar.hide-all-URLbar-icons" = true;
+
# };
+
#
+
# userChrome = builtins.readFile self.inputs.firefox-onebar;
+
#
+
# extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
+
# adaptive-tab-bar-colour
+
# ];
+
# };
+
# })
(
if (config.myHome.programs.firefox.mode == "sidebar")
+2 -3
modules/home/programs/git/default.nix
···
config = lib.mkIf config.myHome.programs.git.enable {
programs.git = {
enable = true;
-
userName = "ayla";
-
userEmail = "ayla-git.barcode041@silomails.com";
signing = {
format = "ssh";
key = "~/.ssh/id_ed25519";
signByDefault = true;
};
-
extraConfig = {
color.ui = true;
github.user = "ayla6";
init = {
···
config = lib.mkIf config.myHome.programs.git.enable {
programs.git = {
enable = true;
signing = {
format = "ssh";
key = "~/.ssh/id_ed25519";
signByDefault = true;
};
+
settings = {
+
inherit (config.mySnippets.git) user;
color.ui = true;
github.user = "ayla6";
init = {
+85
modules/home/programs/helium/default.nix
···
···
+
# https://github.com/isabelroses/dotfiles/blob/ed6d3765ffb7dcfe67540f111f23d51a0d9617d5/modules/home/programs/chromium.nix#L16
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: let
+
inherit
+
(lib)
+
concatLists
+
enableFeature
+
;
+
in {
+
options.myHome.programs.helium.enable = lib.mkEnableOption "helium web browser";
+
+
config = lib.mkIf config.myHome.programs.helium.enable {
+
programs.helium = {
+
enable = true;
+
+
extensions = [
+
{id = "mdjildafknihdffpkfmmpnpoiajfjnjd";} # consent-o-matic
+
{id = "clngdbkpkpeebahjckkjfobafhncgmne";} # stylus
+
{id = "jinjaccalgkegednnccohejagnlnfdag";} # violentmonkey
+
{id = "nngceckbapebfimnlniiiahkandclblb";} # bitwarden
+
{id = "mnjggcdmjocbbbhaepdhchncahnbgone";} # sponsorblock
+
{id = "pncfbmialoiaghdehhbnbhkkgmjanfhe";} # ublacklist
+
+
rec {
+
id = "oladmjdebphlnjjcnomfhhbfdldiimaf"; # libredirect
+
version = "3.2.0";
+
+
crxPath = pkgs.fetchurl {
+
url = "https://github.com/libredirect/browser_extension/releases/download/v${version}/libredirect-${version}.crx";
+
sha256 = "sha256-Neja0pJ7rMV+riINeMcWxU2SzZ+ZETp6bV1MaYLHz1Y=";
+
};
+
}
+
+
rec {
+
id = "lkbebcjgcmobigpeffafkodonchffocl"; # bypass-paywalls-clean
+
version = "4.2.0.0";
+
+
crxPath = pkgs.fetchurl {
+
url = "https://gitflic.ru/project/magnolia1234/bpc_uploads/blob/raw?file=bypass-paywalls-chrome-clean-${version}.crx";
+
sha256 = "sha256-B++3RussuUv3AtDi2MnZH+SojCPOMnOXWW8GI3pI8lk=";
+
};
+
}
+
];
+
+
package = pkgs.helium.override {
+
# https://github.com/secureblue/hardened-chromium
+
# https://github.com/secureblue/secureblue/blob/e500f078efc5748d5033a881bbbcdcd2de95a813/files/system/usr/etc/chromium/chromium.conf.md
+
commandLineArgs = concatLists [
+
# Aesthetics
+
[
+
"--gtk-version=4"
+
]
+
+
# Wayland
+
[
+
"--ozone-platform=wayland"
+
"--enable-features=UseOzonePlatform"
+
]
+
+
# Performance
+
[
+
(enableFeature true "gpu-rasterization")
+
(enableFeature true "oop-rasterization")
+
(enableFeature true "zero-copy")
+
"--ignore-gpu-blocklist"
+
]
+
+
# Etc
+
[
+
"--disk-cache=$XDG_RUNTIME_DIR/helium-cache"
+
"--no-first-run"
+
"--disable-wake-on-wifi"
+
"--disable-breakpad"
+
"--no-default-browser-check"
+
"--enable-features=TouchpadOverscrollHistoryNavigation"
+
]
+
];
+
};
+
};
+
};
+
}
+60 -115
modules/home/programs/helix/default.nix
···
{
config,
lib,
-
pkgs,
...
-
}: {
options.myHome.programs.helix.enable = lib.mkEnableOption "helix";
config = lib.mkIf config.myHome.programs.helix.enable {
···
};
};
};
languages = {
-
language-server = {
-
bash-language-server = {
-
command = "bash-language-server";
-
args = ["start"];
-
};
-
-
vscode-css-languageserver = {
-
command = lib.getExe pkgs.vscode-css-languageserver;
-
args = ["--stdio"];
-
};
-
-
fish-lsp = {
-
command = lib.getExe pkgs.fish-lsp;
-
args = ["--stdio"];
-
};
-
-
lua-language-server = {
-
command = lib.getExe pkgs.lua-language-server;
-
args = ["--stdio"];
-
};
-
-
marksman = {
-
command = lib.getExe pkgs.marksman;
-
args = ["--stdio"];
-
};
-
-
nixd = {
-
command = lib.getExe pkgs.nixd;
-
};
-
-
vscode-json-languageserver = {
-
command = lib.getExe pkgs.vscode-json-languageserver;
-
args = ["--stdio"];
-
};
-
-
typescript-language-server = with pkgs.nodePackages; {
-
command = "${typescript-language-server}/bin/typescript-language-server";
-
args = ["--stdio" "--tsserver-path=${typescript}/lib/node_modules/typescript/lib"];
-
};
-
-
superhtml = {
-
command = lib.getExe pkgs.superhtml;
-
args = ["--stdio"];
-
};
-
};
-
-
language = [
-
{
-
name = "bash";
-
auto-format = true;
-
file-types = ["sh" "bash" "dash" "ksh" "mksh"];
-
-
formatter = {
-
command = lib.getExe pkgs.shfmt;
-
args = ["-i" "2"];
-
};
-
-
language-servers = ["bash-language-server"];
-
}
-
{
-
name = "css";
-
auto-format = true;
-
formatter = {command = lib.getExe pkgs.prettier;};
-
language-servers = ["vscode-css-languageserver"];
-
}
-
{
-
name = "fish";
-
auto-format = true;
-
language-servers = ["fish-lsp"];
-
}
-
{
-
name = "html";
-
auto-format = true;
-
formatter = {command = lib.getExe pkgs.prettier;};
-
language-servers = ["superhtml"];
-
}
-
{
-
name = "javascript";
-
auto-format = true;
-
formatter = {command = lib.getExe pkgs.prettier;};
-
language-servers = ["typescript-language-server"];
-
}
-
{
-
name = "json";
-
auto-format = true;
-
formatter = {command = lib.getExe pkgs.prettier;};
-
language-servers = ["vscode-json-languageserver"];
-
}
-
{
-
name = "lua";
-
auto-format = true;
-
formatter = {command = lib.getExe pkgs.stylua;};
-
language-servers = ["lua-language-server"];
-
}
-
{
-
name = "markdown";
-
auto-format = true;
-
formatter = {command = lib.getExe pkgs.mdformat;};
-
language-servers = ["marksman"];
-
}
-
{
-
name = "nix";
-
auto-format = true;
-
formatter = {command = lib.getExe pkgs.alejandra;};
-
language-servers = ["nixd"];
-
}
-
{
-
name = "typescript";
-
auto-format = true;
-
formatter = {command = lib.getExe pkgs.prettier;};
-
language-servers = ["typescript-language-server"];
-
}
-
];
};
};
};
···
{
config,
lib,
...
+
}: let
+
editorCfg = config.mySnippets.editor;
+
+
mkHelixServer = name: srv:
+
lib.filterAttrs (_: v: v != null) {
+
inherit name;
+
command =
+
if srv.helix-command != null
+
then srv.helix-command
+
else srv.command;
+
args = srv.args or null;
+
config = srv.config or null;
+
};
+
+
mkHelixLanguage = name: lang: let
+
# this shit is so ugly
+
fmtName = lib.findFirst (x: x != null) null [
+
(lang.helix-formatter or null)
+
(lang.formatter or null)
+
];
+
+
fmt =
+
if fmtName != null
+
then editorCfg.formatters.${fmtName}
+
else null;
+
+
usesLspFormatter = fmt == null || fmt.type == "lsp";
+
+
formatter =
+
if fmt != null && fmt.type == "external"
+
then
+
lib.filterAttrs (_: v: v != null) {
+
command = fmt.command;
+
args = fmt.args;
+
}
+
else null;
+
+
fullLspList = lang.language-servers ++ lang.helix-only-language-servers;
+
+
languageServers = map (srvName:
+
lib.filterAttrs (_: v: v != null) {
+
name = srvName;
+
except-features =
+
if (usesLspFormatter && fmtName != null && srvName != fmtName)
+
then ["format"]
+
else null;
+
})
+
fullLspList;
+
in
+
lib.filterAttrs (_: v: v != null) {
+
name = lang.name;
+
auto-format = lang.auto-format;
+
language-servers = languageServers;
+
file-types = lang.file-types;
+
inherit formatter;
+
};
+
in {
options.myHome.programs.helix.enable = lib.mkEnableOption "helix";
config = lib.mkIf config.myHome.programs.helix.enable {
···
};
};
};
+
languages = {
+
language-server = lib.mapAttrs mkHelixServer editorCfg.languageServers;
+
language = lib.attrValues (lib.mapAttrs mkHelixLanguage editorCfg.languages);
};
};
};
+24
modules/home/programs/jujutsu/default.nix
···
···
+
{
+
lib,
+
config,
+
...
+
}: {
+
options.myHome.programs.jujutsu.enable = lib.mkEnableOption "jujutsu version control";
+
+
config = lib.mkIf config.myHome.programs.jujutsu.enable {
+
programs.jjui = {
+
enable = true;
+
};
+
programs.jujutsu = {
+
enable = true;
+
settings = {
+
inherit (config.mySnippets.git) user;
+
signing = {
+
behavior = "own";
+
backend = "ssh";
+
key = "~/.ssh/id_ed25519.pub";
+
};
+
};
+
};
+
};
+
}
+1
modules/home/programs/micro/default.nix
···
scrollspeed = 1;
tabsize = 2;
tabstospaces = true;
};
};
};
···
scrollspeed = 1;
tabsize = 2;
tabstospaces = true;
+
wordwrap = true;
};
};
};
+9
modules/home/programs/ssh/default.nix
···
# in
# rootMe "dewford";
package = pkgs.openssh;
};
};
···
# in
# rootMe "dewford";
+
matchBlocks = {
+
"knot.aylac.top" = {
+
user = "git";
+
# dont know if i can just link snippets knot here
+
hostname = "nanpi";
+
port = 2222;
+
};
+
};
+
package = pkgs.openssh;
};
};
+114 -64
modules/home/programs/zed-editor/default.nix
···
{
lib,
config,
-
pkgs,
...
-
}: {
options.myHome.programs.zed-editor.enable = lib.mkEnableOption "zed editor";
config = lib.mkIf config.myHome.programs.zed-editor.enable {
···
"nix"
"scss"
"toml"
];
userSettings = {
auto_indent_on_paste = true;
···
preferred_line_length = 100;
soft_wrap = "preferred_line_length";
agent = {
default_model = {
provider = "google";
···
default_profile = "ask";
};
-
languages = {
-
JavaScript = {
-
format_on_save = "on";
-
formatter = {
-
external = {
-
command = lib.getExe pkgs.prettier;
-
arguments = ["--stdin-filepath" "{buffer_path}"];
-
};
-
};
};
-
TypeScript = {
-
format_on_save = "on";
-
-
formatter = {
-
external = {
-
command = lib.getExe pkgs.prettier;
-
arguments = ["--stdin-filepath" "{buffer_path}"];
-
};
-
};
};
-
TSX = {
-
format_on_save = "on";
-
-
formatter = {
-
external = {
-
command = lib.getExe pkgs.prettier;
-
arguments = ["--stdin-filepath" "{buffer_path}"];
-
};
-
};
};
-
Nix = {
-
format_on_save = "on";
-
formatter = "language_server";
-
language_servers = [
-
"nixd"
];
};
-
JSON = {
-
format_on_save = "on";
-
-
formatter = {
-
external = {
-
command = lib.getExe pkgs.prettier;
-
arguments = ["--stdin-filepath" "{buffer_path}"];
-
};
-
};
-
};
-
CSS = {
-
format_on_save = "on";
-
-
formatter = {
-
external = {
-
command = lib.getExe pkgs.prettier;
-
arguments = ["--stdin-filepath" "{buffer_path}"];
-
};
-
};
-
};
-
};
-
lsp.nixd = {
-
binary.path = lib.getExe pkgs.nixd;
-
settings.formatting.command = [(lib.getExe pkgs.alejandra) "--quiet" "--"];
-
};
-
telemetry = {
-
diagnostics = false;
-
metrics = false;
-
};
-
};
};
};
}
···
{
lib,
config,
...
+
}: let
+
editorCfg = config.mySnippets.editor;
+
+
mkZedFormatter = fmtName:
+
if fmtName == null
+
then "language_server"
+
else let
+
f = editorCfg.formatters.${fmtName};
+
in
+
if f.type == "external"
+
then {
+
external = {
+
command = f.command;
+
arguments = f.args or [];
+
};
+
}
+
else if f.type == "lsp"
+
then {language_server = {name = fmtName;};}
+
else null;
+
+
mkZedLanguage = name: lang:
+
lib.filterAttrs (_: v: v != null) {
+
formatter = mkZedFormatter lang.formatter;
+
language_servers = lang.language-servers ++ lang.zed-only-language-servers;
+
code_actions_on_format = lang.code-actions-on-format;
+
};
+
+
mkZedLsp = name: srv:
+
lib.filterAttrs (_: v: v != null) {
+
binary = lib.filterAttrs (_: v: v != null) {
+
path = srv.command;
+
arguments = srv.args or null;
+
};
+
settings = srv.config or null;
+
};
+
in {
options.myHome.programs.zed-editor.enable = lib.mkEnableOption "zed editor";
config = lib.mkIf config.myHome.programs.zed-editor.enable {
···
"nix"
"scss"
"toml"
+
"biome"
+
#"superhtml"
+
"marksman"
+
"makefile"
+
"zig"
+
"gleam"
+
"glsl"
+
"gdscript"
+
"svelte"
+
"vue"
+
"basher"
+
"sql"
+
#"ruby"
+
#"elixir"
];
userSettings = {
auto_indent_on_paste = true;
···
preferred_line_length = 100;
soft_wrap = "preferred_line_length";
+
tab_size = 2;
+
format_on_save = "on";
+
prettier = {
+
allowed = false;
+
};
+
agent = {
default_model = {
provider = "google";
···
default_profile = "ask";
};
+
telemetry = {
+
diagnostics = false;
+
metrics = false;
+
};
+
languages = lib.listToAttrs (
+
lib.attrValues (
+
lib.mapAttrs (name: lang: {
+
name = lang.full-name;
+
value = mkZedLanguage name lang;
+
})
+
editorCfg.languages
+
)
+
);
+
lsp = lib.mapAttrs mkZedLsp editorCfg.languageServers;
+
};
+
userTasks = [
+
{
+
label = "jjui";
+
command = "jjui";
+
hide = "on_success";
+
use_new_terminal = true;
+
allow_concurrent_runs = false;
+
shell = {
+
program = "fish";
};
+
}
+
];
+
userKeymaps = [
+
{
+
context = "(vim_mode == helix_normal || vim_mode == helix_select) && !menu";
+
bindings = {
+
n = "vim::WrappingLeft";
+
e = "vim::Down";
+
i = "vim::Up";
+
o = "vim::WrappingRight";
};
+
}
+
{
+
context = "vim_mode == helix_normal && !menu";
+
bindings = {
+
j = "vim::NextWordEnd";
+
J = ["vim::NextWordEnd" {ignore_punctuation = true;}];
+
k = "vim::MoveToNextMatch";
+
K = "vim::MoveToPreviousMatch";
+
l = "vim::HelixInsert";
+
L = "vim::InsertFirstNonWhitespace";
+
h = "vim::InsertLineBelow";
+
H = "vim::InsertLineAbove";
};
+
}
+
{
+
context = "Workspace";
+
bindings = {
+
ctrl-g = [
+
"task::Spawn"
+
{
+
task_name = "jjui";
+
reveal_target = "center";
+
}
];
};
+
}
+
];
};
};
}
-13
modules/home/programs/zen-browser/default.nix
···
-
{
-
lib,
-
config,
-
...
-
}: {
-
options.myHome.programs.zen-browser = {
-
enable = lib.mkEnableOption "zen web browser";
-
};
-
-
config.programs.zen-browser =
-
lib.mkIf config.myHome.programs.zen-browser.enable
-
config.mySnippets.firefox-based.userConfig;
-
}
···
+2
modules/home/snippets/default.nix
···
{...}: {
imports = [
./firefox-based
];
}
···
{...}: {
imports = [
+
./editor
./firefox-based
+
./git
];
}
+415
modules/home/snippets/editor/default.nix
···
···
+
{
+
lib,
+
pkgs,
+
...
+
}: let
+
# Helper function to create language server definitions
+
mkLspServer = name: {
+
command,
+
helix-command ? null,
+
args ? null,
+
config ? null,
+
}: {
+
inherit name command helix-command args config;
+
};
+
+
# Helper function to create formatter definitions
+
mkFormatter = name: {
+
type,
+
command ? null,
+
args ? null,
+
lspName ? null,
+
config ? null,
+
}: {
+
inherit name type command args lspName config;
+
};
+
+
# Helper function to create language definitions
+
mkLanguage = name: {
+
full-name ? name,
+
auto-format ? true,
+
file-types ? null,
+
language-servers ? [],
+
zed-only-language-servers ? [],
+
helix-only-language-servers ? [],
+
formatter ? null,
+
helix-formatter ? null,
+
code-actions-on-format ? null,
+
}: {
+
inherit name full-name auto-format file-types language-servers zed-only-language-servers helix-only-language-servers formatter helix-formatter code-actions-on-format;
+
};
+
in {
+
options.mySnippets.editor = lib.mkOption {
+
type = lib.types.attrs;
+
default = {};
+
description = "Editor configuration data";
+
};
+
+
config.mySnippets.editor = {
+
# Language Servers
+
languageServers = {
+
biome = mkLspServer "biome" {
+
command = lib.getExe pkgs.biome;
+
args = ["lsp-proxy"];
+
};
+
+
tailwindcss-language-server = mkLspServer "tailwindcss-language-server" {
+
command = pkgs.writeScript "tailwindcss-language-server-bun" ''
+
#!${lib.getExe pkgs.bash} -e
+
exec ${lib.getExe pkgs.bun} ${lib.getExe pkgs.tailwindcss-language-server}
+
'';
+
helix-command = let
+
fd = lib.getExe pkgs.fd;
+
xargs = "${pkgs.uutils-findutils}/bin/xargs";
+
grep = lib.getExe pkgs.gnugrep;
+
bun = lib.getExe pkgs.bun;
+
twls = lib.getExe pkgs.tailwindcss-language-server;
+
in
+
pkgs.writeScript "tailwindcss-language-server-bun-helix" ''
+
#!${lib.getExe pkgs.bash} -euo
+
+
if ! ${fd} -H -I -E "node_modules" "package\\.json$" . | \
+
${xargs} ${grep} -q '"tailwindcss"'; then
+
+
exit 0
+
fi
+
+
exec ${bun} ${twls}
+
'';
+
args = [];
+
config = {provideFormatter = false;};
+
};
+
+
vscode-html-language-server = mkLspServer "vscode-html-language-server" {
+
command = lib.getExe pkgs.bun;
+
args = ["${pkgs.vscode-langservers-extracted}/lib/node_modules/vscode-langservers-extracted/bin/vscode-html-language-server" "--stdio"];
+
};
+
+
superhtml = mkLspServer "superhtml" {
+
command = lib.getExe pkgs.superhtml;
+
args = ["lsp"];
+
};
+
+
css-language-server = mkLspServer "css-language-server" {
+
command = lib.getExe pkgs.bun;
+
args = ["${pkgs.vscode-css-languageserver}/lib/node_modules/vscode-css-languageserver/out/node/cssServerMain.js" "--stdio"];
+
};
+
+
json-language-server = mkLspServer "json-language-server" {
+
command = lib.getExe pkgs.bun;
+
args = ["${pkgs.vscode-json-languageserver}/lib/node_modules/vscode-json-languageserver/bin/vscode-json-languageserver" "--stdio"];
+
};
+
+
vtsls = mkLspServer "vtsls" {
+
command = lib.getExe pkgs.bun;
+
args = ["${pkgs.vtsls}/bin/vtsls" "--stdio"];
+
};
+
+
svelte-language-server = mkLspServer "svelte-language-server" {
+
command = lib.getExe pkgs.bun;
+
args = ["${pkgs.svelte-language-server}/lib/node_modules/svelte-language-server/bin/server.js" "--stdio"];
+
};
+
+
vue-language-server = mkLspServer "vue-language-server" {
+
command = lib.getExe pkgs.bun;
+
args = ["${pkgs.vue-language-server}/lib/language-tools/packages/language-server/bin/vue-language-server.js" "--stdio"];
+
};
+
+
bash-language-server = mkLspServer "bash-language-server" {
+
command = lib.getExe pkgs.bash-language-server;
+
args = ["start"];
+
};
+
+
fish-lsp = mkLspServer "fish-lsp" {
+
command = lib.getExe pkgs.fish-lsp;
+
args = ["start"];
+
};
+
+
nixd = mkLspServer "nixd" {
+
command = lib.getExe pkgs.nixd;
+
config.formatting.command = [(lib.getExe pkgs.alejandra) "--quiet" "--"];
+
};
+
+
nil = mkLspServer "nil" {
+
command = lib.getExe pkgs.nil;
+
args = ["--stdio"];
+
};
+
+
marksman = mkLspServer "marksman" {
+
command = lib.getExe pkgs.marksman;
+
args = ["server"];
+
};
+
+
gopls = mkLspServer "gopls" {
+
command = lib.getExe pkgs.gopls;
+
args = ["serve"];
+
};
+
+
rust-analyzer = mkLspServer "rust-analyzer" {
+
command = lib.getExe pkgs.rust-analyzer;
+
};
+
+
zls = mkLspServer "zls" {
+
command = lib.getExe pkgs.zls;
+
};
+
+
glsl_analyzer = mkLspServer "glsl_analyzer" {
+
command = lib.getExe pkgs.glsl_analyzer;
+
};
+
+
lua-language-server = mkLspServer "lua-language-server" {
+
command = lib.getExe pkgs.lua-language-server;
+
};
+
+
gleam = mkLspServer "gleam" {
+
command = lib.getExe pkgs.gleam;
+
args = ["lsp"];
+
};
+
+
gdscript-language-server = mkLspServer "gdscript-language-server" {
+
command = lib.getExe pkgs.netcat;
+
args = ["127.0.0.1" "6005"];
+
config = {language-id = "gdscript";};
+
};
+
+
solargraph = mkLspServer "solargraph" {
+
command = lib.getExe pkgs.rubyPackages.solargraph;
+
args = ["stdio"];
+
};
+
+
#rubocop = mkLspServer "rubocop" {
+
# command = lib.getExe pkgs.rubocop;
+
#};
+
};
+
+
# Formatters
+
formatters = {
+
biome = mkFormatter "biome" {
+
type = "lsp";
+
};
+
+
biomeHtml = mkFormatter "biomeHtml" {
+
type = "external";
+
command = lib.getExe pkgs.biome;
+
args = ["format" "--use-server" "--html-formatter-enabled=true" "--stdin-file-path" "{buffer_path}"];
+
};
+
+
shfmt = mkFormatter "shfmt" {
+
type = "external";
+
command = lib.getExe pkgs.shfmt;
+
args = ["-i" "2"];
+
};
+
+
alejandra = mkFormatter "alejandra" {
+
type = "external";
+
command = lib.getExe pkgs.alejandra;
+
};
+
+
mdformat = mkFormatter "mdformat" {
+
type = "external";
+
command = lib.getExe pkgs.mdformat;
+
};
+
+
stylua = mkFormatter "stylua" {
+
type = "external";
+
command = lib.getExe pkgs.stylua;
+
};
+
+
gdscript-formatter = mkFormatter "gdscript-formatter" {
+
type = "external";
+
command = lib.getExe pkgs.gdscript-formatter;
+
};
+
+
prettier = mkFormatter "prettier" {
+
type = "external";
+
command = lib.getExe pkgs.bun;
+
args = ["${pkgs.prettier}/bin/prettier.cjs" "--stdin-filepath" "{buffer_path}"];
+
};
+
};
+
+
# Languages
+
languages = {
+
html = mkLanguage "html" {
+
full-name = "HTML";
+
language-servers = ["vscode-html-language-server" "biome"];
+
zed-only-language-servers = ["!eslint" "..."];
+
helix-only-language-servers = ["tailwindcss-language-server"];
+
formatter = "biome";
+
helix-formatter = "biomeHtml";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"html.formatter.enabled.biome" = true;
+
};
+
};
+
+
css = mkLanguage "css" {
+
full-name = "CSS";
+
language-servers = ["css-language-server" "biome"];
+
zed-only-language-servers = ["..."];
+
helix-only-language-servers = ["tailwindcss-language-server"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
+
javascript = mkLanguage "javascript" {
+
full-name = "JavaScript";
+
language-servers = ["vtsls" "biome"];
+
zed-only-language-servers = ["!eslint" "!typescript-language-server" "..."];
+
helix-only-language-servers = ["tailwindcss-language-server"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
+
typescript = mkLanguage "typescript" {
+
full-name = "TypeScript";
+
language-servers = ["vtsls" "biome"];
+
zed-only-language-servers = ["!eslint" "!typescript-language-server" "..."];
+
helix-only-language-servers = ["tailwindcss-language-server"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
+
jsx = mkLanguage "jsx" {
+
full-name = "JSX";
+
language-servers = ["vtsls" "biome"];
+
zed-only-language-servers = ["!eslint" "!typescript-language-server" "..."];
+
helix-only-language-servers = ["tailwindcss-language-server"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
+
tsx = mkLanguage "tsx" {
+
full-name = "TSX";
+
language-servers = ["vtsls" "biome"];
+
zed-only-language-servers = ["!eslint" "!typescript-language-server" "..."];
+
helix-only-language-servers = ["tailwindcss-language-server"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
+
svelte = mkLanguage "svelte" {
+
full-name = "Svelte";
+
language-servers = ["svelte-language-server" "vtsls" "biome"];
+
zed-only-language-servers = ["!eslint" "!typescript-language-server" "..."];
+
helix-only-language-servers = ["tailwindcss-language-server"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
+
vue = mkLanguage "vue" {
+
full-name = "Vue.js";
+
language-servers = ["vue-language-server" "biome"];
+
zed-only-language-servers = ["!eslint" "!typescript-language-server" "..."];
+
helix-only-language-servers = ["tailwindcss-language-server"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
+
json = mkLanguage "json" {
+
full-name = "JSON";
+
language-servers = ["json-language-server" "biome"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
};
+
};
+
+
jsonc = mkLanguage "jsonc" {
+
full-name = "JSONC";
+
language-servers = ["json-language-server" "biome"];
+
formatter = "biome";
+
code-actions-on-format = {
+
"source.fixAll.biome" = true;
+
"source.organizeImports.biome" = true;
+
};
+
};
+
+
bash = mkLanguage "bash" {
+
full-name = "Shell Script";
+
file-types = ["sh" "bash" "dash" "ksh" "mksh"];
+
language-servers = ["bash-language-server"];
+
formatter = "shfmt";
+
};
+
+
fish = mkLanguage "fish" {
+
full-name = "Fish";
+
language-servers = ["fish-lsp"];
+
};
+
+
nix = mkLanguage "nix" {
+
full-name = "Nix";
+
language-servers = ["nixd" "nil"];
+
formatter = "alejandra";
+
};
+
+
markdown = mkLanguage "markdown" {
+
full-name = "Markdown";
+
language-servers = ["marksman"];
+
formatter = "prettier";
+
};
+
+
go = mkLanguage "go" {
+
full-name = "Go";
+
language-servers = ["gopls"];
+
};
+
+
rust = mkLanguage "rust" {
+
full-name = "Rust";
+
language-servers = ["rust-analyzer"];
+
};
+
+
zig = mkLanguage "zig" {
+
full-name = "Zig";
+
language-servers = ["zls"];
+
};
+
+
glsl = mkLanguage "glsl" {
+
full-name = "GLSL";
+
language-servers = ["glsl_analyzer"];
+
};
+
+
lua = mkLanguage "lua" {
+
full-name = "Lua";
+
language-servers = ["lua-language-server"];
+
formatter = "stylua";
+
};
+
+
gleam = mkLanguage "gleam" {
+
full-name = "Gleam";
+
language-servers = ["gleam"];
+
};
+
+
gdscript = mkLanguage "gdscript" {
+
full-name = "GDScript";
+
language-servers = ["gdscript-language-server"];
+
formatter = "gdscript-formatter";
+
};
+
+
#ruby = mkLanguage "ruby" {
+
# full-name = "Ruby";
+
# language-servers = ["solargraph" "rubocop"];
+
#};
+
};
+
};
+
}
+2 -2
modules/home/snippets/firefox-based/default.nix
···
#nativeMessagingHosts = lib.optionals pkgs.stdenv.isLinux [pkgs.bitwarden-desktop];
languagePacks = [
-
"en-GB"
"en"
"en-US"
];
···
steam-database
snowflake
sponsorblock
-
karakeep
bitwarden
];
···
#nativeMessagingHosts = lib.optionals pkgs.stdenv.isLinux [pkgs.bitwarden-desktop];
languagePacks = [
+
"en-CA"
"en"
"en-US"
];
···
steam-database
snowflake
sponsorblock
+
#karakeep
bitwarden
];
+11
modules/home/snippets/git/default.nix
···
···
+
{lib, ...}: {
+
options.mySnippets.git = {
+
user = lib.mkOption {
+
type = lib.types.attrs;
+
default = {
+
name = "ayla";
+
email = "ayla-git.barcode041@silomails.com";
+
};
+
};
+
};
+
}
+23
modules/locale/en-ca/default.nix
···
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
config = {
+
i18n = {
+
defaultLocale = lib.mkDefault "en_CA.UTF-8";
+
+
extraLocaleSettings = {
+
LC_ADDRESS = config.i18n.defaultLocale;
+
LC_IDENTIFICATION = config.i18n.defaultLocale;
+
LC_MEASUREMENT = config.i18n.defaultLocale;
+
LC_MONETARY = config.i18n.defaultLocale;
+
LC_NAME = config.i18n.defaultLocale;
+
LC_NUMERIC = config.i18n.defaultLocale;
+
LC_PAPER = config.i18n.defaultLocale;
+
LC_TELEPHONE = config.i18n.defaultLocale;
+
LC_TIME = config.i18n.defaultLocale;
+
};
+
};
+
};
+
}
+1
modules/nixos/default.nix
···
./desktop
./profiles
./programs
./services
];
}
···
./desktop
./profiles
./programs
+
./security
./services
];
}
+24
modules/nixos/desktop/cosmic/default.nix
···
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: {
+
options.myNixOS.desktop.cosmic.enable = lib.mkEnableOption "COSMIC desktop environment";
+
+
config = lib.mkIf config.myNixOS.desktop.cosmic.enable {
+
home-manager.sharedModules = [
+
{
+
config.myHome.desktop.cosmic.enable = true;
+
}
+
];
+
+
environment.cosmic.excludePackages = with pkgs; [
+
cosmic-store
+
];
+
+
services.desktopManager.cosmic.enable = true;
+
system.nixos.tags = ["cosmic"];
+
myNixOS.desktop.enable = true;
+
};
+
}
+24 -3
modules/nixos/desktop/default.nix
···
lib,
...
}: {
-
imports = [./gnome];
options.myNixOS.desktop.enable = lib.mkOption {
default =
···
fonts = {
fontconfig = {
enable = true;
-
includeUserConf = false;
-
useEmbeddedBitmaps = true;
subpixel = {
lcdfilter = "none";
rgba = "none";
···
style = "slight";
autohint = false;
};
};
packages = with pkgs; [
···
lib,
...
}: {
+
imports = [
+
./gnome
+
./plasma
+
./cosmic
+
];
options.myNixOS.desktop.enable = lib.mkOption {
default =
···
fonts = {
fontconfig = {
enable = true;
+
includeUserConf = true;
subpixel = {
lcdfilter = "none";
rgba = "none";
···
style = "slight";
autohint = false;
};
+
+
# have i told you how much i despise fontconfig. literally zero reason to pick bitmap fonts over noto fonts but it always does.
+
localConf = ''
+
<?xml version="1.0"?>
+
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
+
<fontconfig>
+
<description>Reject bitmap fonts except bitmap emoji fonts</description>
+
<!-- Reject bitmap fonts -->
+
<selectfont>
+
<rejectfont>
+
<pattern>
+
<patelt name="outline"><bool>false</bool></patelt>
+
<patelt name="scalable"><bool>false</bool></patelt>
+
</pattern>
+
</rejectfont>
+
</selectfont>
+
</fontconfig>
+
'';
};
packages = with pkgs; [
+9 -11
modules/nixos/desktop/gnome/default.nix
···
}
];
-
services = {
-
desktopManager.gnome.enable = true;
-
};
environment.gnome.excludePackages = with pkgs; [
decibels
epiphany
geary # email reader
gedit # text editor
-
gnome-characters
gnome-console # in case im using something else
gnome-music
gnome-software # i like the idea but i really hate how much resources it uses
···
i18n.inputMethod.type = "ibus";
security.pam.services.greetd.enableGnomeKeyring = true;
-
services.gnome.gcr-ssh-agent.enable = true;
programs = {
kdeconnect = {
-
enable = true;
-
package = pkgs.gnomeExtensions.gsconnect;
};
};
···
];
};
-
myNixOS = {
-
desktop.enable = true;
-
services.gdm.enable = true;
-
};
#qt = {
# enable = true;
···
}
];
+
services.desktopManager.gnome.enable = true;
environment.gnome.excludePackages = with pkgs; [
decibels
epiphany
geary # email reader
gedit # text editor
gnome-console # in case im using something else
gnome-music
gnome-software # i like the idea but i really hate how much resources it uses
···
i18n.inputMethod.type = "ibus";
security.pam.services.greetd.enableGnomeKeyring = true;
+
services.gnome = {
+
gcr-ssh-agent.enable = true;
+
gnome-remote-desktop.enable = lib.mkForce false;
+
};
programs = {
kdeconnect = {
+
enable = lib.mkDefault true;
+
package = lib.mkDefault pkgs.gnomeExtensions.gsconnect;
};
};
···
];
};
+
myNixOS.desktop.enable = true;
+
system.nixos.tags = ["gnome"];
#qt = {
# enable = true;
+27
modules/nixos/desktop/plasma/default.nix
···
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}: {
+
options.myNixOS.desktop.plasma.enable = lib.mkEnableOption "use kde plasma desktop environment";
+
+
config = lib.mkIf config.myNixOS.desktop.plasma.enable {
+
home-manager.sharedModules = [
+
{
+
config.myHome.desktop.plasma.enable = true;
+
}
+
];
+
+
environment.plasma6.excludePackages = with pkgs; [
+
kdePackages.kwallet
+
kdePackages.kwallet-pam
+
kdePackages.kwalletmanager
+
kdePackages.wacomtablet
+
];
+
+
services.desktopManager.plasma6.enable = true;
+
system.nixos.tags = ["plasma"];
+
myNixOS.desktop.enable = true;
+
};
+
}
+14 -14
modules/nixos/profiles/arr/default.nix
···
reverse_proxy ${netMap.autobrr.hostName}:${toString netMap.autobrr.port}
'';
-
"${netMap.bazarr.vHost}".extraConfig = ''
-
bind tailscale/bazarr
-
encode zstd gzip
-
reverse_proxy ${netMap.bazarr.hostName}:${toString netMap.bazarr.port}
-
'';
"${netMap.prowlarr.vHost}".extraConfig = ''
bind tailscale/prowlarr
···
autobrr = {
enable = true;
-
openFirewall = true; # Port: 7474
secretFile = config.age.secrets.autobrr.path;
settings = {
host = "0.0.0.0";
···
};
};
-
bazarr = {
-
enable = false;
-
dataDir = "${cfg.dataDir}/bazarr";
-
openFirewall = true; # Port: 6767
-
};
#lidarr = {
# enable = true;
···
prowlarr = {
enable = true;
# dataDir = "${cfg.dataDir}/prowlarr";
-
openFirewall = true; # Port: 9696
};
radarr = {
enable = true;
dataDir = "${cfg.dataDir}/radarr/.config/Radarr/";
-
openFirewall = true; # Port: 7878
};
sonarr = {
enable = true;
dataDir = "${cfg.dataDir}/sonarr/.config/NzbDrone/";
-
openFirewall = true; # Port: 8989
};
#flaresolverr = {
···
reverse_proxy ${netMap.autobrr.hostName}:${toString netMap.autobrr.port}
'';
+
#"${netMap.bazarr.vHost}".extraConfig = ''
+
# bind tailscale/bazarr
+
# encode zstd gzip
+
# reverse_proxy ${netMap.bazarr.hostName}:${toString netMap.bazarr.port}
+
#'';
"${netMap.prowlarr.vHost}".extraConfig = ''
bind tailscale/prowlarr
···
autobrr = {
enable = true;
+
openFirewall = false; # Port: 7474
secretFile = config.age.secrets.autobrr.path;
settings = {
host = "0.0.0.0";
···
};
};
+
#bazarr = {
+
# enable = true;
+
# dataDir = "${cfg.dataDir}/bazarr";
+
# openFirewall = true; # Port: 6767
+
#};
#lidarr = {
# enable = true;
···
prowlarr = {
enable = true;
# dataDir = "${cfg.dataDir}/prowlarr";
+
openFirewall = false; # Port: 9696
};
radarr = {
enable = true;
dataDir = "${cfg.dataDir}/radarr/.config/Radarr/";
+
openFirewall = false; # Port: 7878
};
sonarr = {
enable = true;
dataDir = "${cfg.dataDir}/sonarr/.config/NzbDrone/";
+
openFirewall = false; # Port: 8989
};
#flaresolverr = {
+7 -10
modules/nixos/profiles/backups/default.nix
···
paths = [config.services.couchdb.databaseDir];
}
{
-
# damn this is ugly
name = "forgejo";
-
containerised = true;
-
inherit (config.myNixOS.services.forgejo) enable;
-
paths = ["/var/lib/nixos-containers/forgejo${config.containers.forgejo.config.services.forgejo.stateDir}"];
-
backupMode = "none";
}
# {
# name = "immich";
···
};
}
{
-
# damn this is ugly
name = "postgresql";
containerised = true;
-
inherit (config.myNixOS.services.postgresql) enable;
-
paths = ["/var/lib/nixos-containers/postgresql${config.containers.postgresql.config.services.postgresql.dataDir}"];
backupMode = "quiet";
}
{
···
}
{
name = "tangled-knot";
-
inherit (config.services.tangled-knot) enable;
-
paths = [config.services.tangled-knot.stateDir];
}
];
};
···
paths = [config.services.couchdb.databaseDir];
}
{
name = "forgejo";
+
inherit (config.services.forgejo) enable;
+
paths = [config.services.forgejo.stateDir];
}
# {
# name = "immich";
···
};
}
{
name = "postgresql";
containerised = true;
+
inherit (config.services.postgresql) enable;
+
paths = [config.services.postgresql.dataDir];
backupMode = "quiet";
}
{
···
}
{
name = "tangled-knot";
+
containerised = true;
+
inherit (config.myNixOS.services.tangled-knot) enable;
+
paths = ["/var/lib/nixos-containers/tangled-knot${config.containers.tangled-knot.config.services.tangled-knot.stateDir}"];
}
];
};
-6
modules/nixos/profiles/base/default.nix
···
networking.networkmanager.enable = true;
security = {
-
polkit.enable = true;
rtkit.enable = true;
-
-
sudo-rs = {
-
enable = true;
-
wheelNeedsPassword = false;
-
};
};
services = {
···
networking.networkmanager.enable = true;
security = {
rtkit.enable = true;
};
services = {
+2 -1
modules/nixos/profiles/default.nix
···
{...}: {
imports = [
./arr
./base
./btrfs
-
./backups
./workstation
./server
./autoUpgrade
···
{...}: {
imports = [
./arr
+
./backups
./base
./btrfs
+
./hibernation
./workstation
./server
./autoUpgrade
+53
modules/nixos/profiles/hibernation/default.nix
···
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myNixOS.profiles.hibernation = {
+
enable = lib.mkEnableOption "enable hibernation";
+
swap = {
+
size = lib.mkOption {
+
default = 0;
+
description = "Swap size in megabytes.";
+
type = lib.types.int;
+
};
+
+
location = lib.mkOption {
+
default = "/.swap";
+
description = "Swap file location.";
+
type = lib.types.path;
+
};
+
+
keyFile = lib.mkOption {
+
default = "/.swapkey";
+
description = "Location of the encryption key.";
+
type = lib.types.path;
+
};
+
+
blkDev = lib.mkOption {
+
default = "/dev/sda1";
+
description = "Block device for swap file.";
+
type = lib.types.path;
+
};
+
};
+
};
+
+
config = lib.mkIf (config.myNixOS.profiles.hibernation.enable && config.myNixOS.profiles.hibernation.swap.size > 0) {
+
myNixOS.profiles.swap = {
+
enable = true;
+
random = false;
+
inherit (config.myNixOS.profiles.hibernation.swap) size location keyFile blkDev;
+
};
+
+
services.logind.settings.Login = {
+
HandleLidSwitch = "suspend-then-hibernate";
+
HandlePowerKey = "suspend-then-hibernate";
+
};
+
+
systemd.sleep.extraConfig = ''
+
HibernateDelaySec=15m
+
AllowSuspendThenHibernate=yes
+
HibernateOnACPower=no
+
'';
+
};
+
}
+24 -1
modules/nixos/profiles/swap/default.nix
···
description = "Swap file location.";
type = lib.types.path;
};
};
config = lib.mkIf config.myNixOS.profiles.swap.enable {
···
{
device = config.myNixOS.profiles.swap.location;
priority = 0;
-
randomEncryption.enable = true;
inherit (config.myNixOS.profiles.swap) size;
}
];
···
description = "Swap file location.";
type = lib.types.path;
};
+
+
random = lib.mkOption {
+
default = true;
+
description = "Enable random encryption for swap file.";
+
type = lib.types.bool;
+
};
+
+
keyFile = lib.mkOption {
+
default = "/.swapkey";
+
description = "Location of the encryption key.";
+
type = lib.types.path;
+
};
+
+
blkDev = lib.mkOption {
+
default = "/dev/sda1";
+
description = "Block device for swap file.";
+
type = lib.types.path;
+
};
};
config = lib.mkIf config.myNixOS.profiles.swap.enable {
···
{
device = config.myNixOS.profiles.swap.location;
priority = 0;
+
randomEncryption.enable = config.myNixOS.profiles.swap.random;
+
encrypted = lib.mkIf (!config.myNixOS.profiles.swap.random) {
+
label = "swapfile";
+
enable = true;
+
inherit (config.myNixOS.profiles.swap) keyFile blkDev;
+
};
inherit (config.myNixOS.profiles.swap) size;
}
];
+1 -3
modules/nixos/profiles/workstation/default.nix
···
};
# kernelModules = ["ntsync"];
-
kernelPackages = pkgs.linuxPackages_latest;
};
services = {
···
enableSystemSlice = true;
enableUserSlices = true;
};
-
# i hate these guys
-
coredump.enable = false;
};
zramSwap = {
···
};
# kernelModules = ["ntsync"];
+
kernelPackages = pkgs.linuxPackages_cachyos;
};
services = {
···
enableSystemSlice = true;
enableUserSlices = true;
};
};
zramSwap = {
+13 -1
modules/nixos/programs/nix/default.nix
···
config,
lib,
pkgs,
...
-
}: {
options.myNixOS.programs.nix.enable = lib.mkEnableOption "sane nix configuration";
config = lib.mkIf config.myNixOS.programs.nix.enable {
···
persistent = true;
randomizedDelaySec = "60min";
};
inherit (config.mySnippets.nix) settings;
};
···
config,
lib,
pkgs,
+
inputs,
...
+
}: let
+
flakeInputs = lib.filterAttrs (name: value: (lib.isType "flake" value) && (name != "self")) inputs;
+
in {
options.myNixOS.programs.nix.enable = lib.mkEnableOption "sane nix configuration";
config = lib.mkIf config.myNixOS.programs.nix.enable {
···
persistent = true;
randomizedDelaySec = "60min";
};
+
+
# https://github.com/isabelroses/dotfiles/blob/main/modules/base/nix/nix.nix#L34-L38
+
# pin the registry to avoid downloading and evaluating a new nixpkgs version everytime
+
registry =
+
(lib.mapAttrs (_: flake: {inherit flake;}) flakeInputs)
+
// {
+
# https://github.com/NixOS/nixpkgs/pull/388090
+
nixpkgs = lib.mkForce {flake = inputs.nixpkgs;};
+
};
inherit (config.mySnippets.nix) settings;
};
+55
modules/nixos/security/apparmor.nix
···
···
+
# https://github.com/isabelroses/dotfiles/blob/14a191bd583b34e242ad13a0164a3c32c506c655/modules/nixos/security/apparmor.nix
+
{
+
lib,
+
pkgs,
+
config,
+
...
+
}: let
+
inherit (lib) getExe;
+
in {
+
services.dbus.apparmor = "disabled";
+
+
# apparmor configuration
+
security.apparmor = {
+
enable = true;
+
+
# whether to enable the AppArmor cache
+
# in /var/cache/apparmore
+
enableCache = true;
+
+
# whether to kill processes which have an AppArmor profile enabled
+
# but are not confined
+
killUnconfinedConfinables = true;
+
+
# packages to be added to AppArmorโ€™s include path
+
packages = [pkgs.apparmor-profiles];
+
+
# apparmor policies
+
policies = {
+
"default_deny" = {
+
state = "disable";
+
profile = ''
+
profile default_deny /** { }
+
'';
+
};
+
+
"sudo" = {
+
state = "disable";
+
profile = ''
+
${getExe pkgs.sudo} {
+
file /** rwlkUx,
+
}
+
'';
+
};
+
+
"nix" = {
+
state = "disable";
+
profile = ''
+
${getExe config.nix.package} {
+
unconfined,
+
}
+
'';
+
};
+
};
+
};
+
}
+67
modules/nixos/security/default.nix
···
···
+
{...}: {
+
imports = [
+
./apparmor.nix
+
./pam.nix
+
./polkit.nix
+
./sudo.nix
+
];
+
+
boot.blacklistedKernelModules = [
+
# Obscure network protocols
+
"ax25"
+
"netrom"
+
"rose"
+
"dccp"
+
"sctp"
+
"rds"
+
"tipc"
+
"n-hdlc"
+
"x25"
+
"decnet"
+
"econet"
+
"af_802154"
+
"ipx"
+
"appletalk"
+
"psnap"
+
"p8023"
+
"p8022"
+
"can"
+
"atm"
+
+
# Old or rare or insufficiently audited filesystems
+
"adfs"
+
"affs"
+
"bfs"
+
"befs"
+
"cramfs"
+
"efs"
+
"erofs"
+
"exofs"
+
"freevxfs"
+
"f2fs"
+
"hfs"
+
"hpfs"
+
"jfs"
+
"minix"
+
"nilfs2"
+
#"ntfs"
+
"omfs"
+
"qnx4"
+
"qnx6"
+
"sysv"
+
"ufs"
+
# Various rare filesystems
+
"jffs2"
+
"hfsplus"
+
#"squashfs"
+
"udf"
+
"cifs"
+
"nfs"
+
"nfsv3"
+
"nfsv4"
+
"gfs2"
+
# vivid driver is only useful for testing purposes and has been the cause
+
# of privilege escalation vulnerabilities
+
"vivid"
+
];
+
}
+7
modules/nixos/security/pam.nix
···
···
+
{
+
security.pam = {
+
services.login = {
+
failDelay.enable = true;
+
};
+
};
+
}
+3
modules/nixos/security/polkit.nix
···
···
+
{
+
security.polkit.enable = true;
+
}
+13
modules/nixos/security/sudo.nix
···
···
+
{
+
security.sudo-rs = {
+
enable = true;
+
wheelNeedsPassword = false;
+
execWheelOnly = true;
+
+
extraConfig = ''
+
Defaults !lecture
+
Defaults env_keep += "EDITOR PATH DISPLAY"
+
Defaults timestamp_timeout = 30
+
'';
+
};
+
}
+22
modules/nixos/services/atproto-basic-notifications/default.nix
···
···
+
{
+
config,
+
lib,
+
...
+
}: let
+
name = "atproto-basic-notifications";
+
cfg = config.myNixOS.services.${name};
+
in {
+
options.myNixOS.services.${name} = {
+
enable = lib.mkEnableOption "${name}";
+
};
+
+
config = lib.mkIf cfg.enable {
+
services.atproto-basic-notifications = {
+
enable = true;
+
environmentFiles = [config.age.secrets.atp-notif.path];
+
settings = {
+
TARGET_DID = "did:plc:3c6vkaq7xf5kz3va3muptjh5";
+
};
+
};
+
};
+
}
+6 -1
modules/nixos/services/caddy/default.nix
···
age.secrets.caddy.file = "${self.inputs.secrets}/caddy.age";
networking.firewall.allowedTCPPorts = [80 443];
services = {
caddy = {
enable = true;
···
package = pkgs.caddy.withPlugins {
plugins = ["github.com/tailscale/caddy-tailscale@v0.0.0-20250508175905-642f61fea3cc"];
-
hash = "sha256-r68btTv8N7X/pKwGkP8FWg371rt+bZETXdEN0/ZlFJI=";
};
};
tailscale.permitCertUid = "caddy";
···
age.secrets.caddy.file = "${self.inputs.secrets}/caddy.age";
networking.firewall.allowedTCPPorts = [80 443];
+
boot.kernel.sysctl = {
+
"net.core.rmem_max" = 7500000;
+
"net.core.wmem_max" = 7500000;
+
};
+
services = {
caddy = {
enable = true;
···
package = pkgs.caddy.withPlugins {
plugins = ["github.com/tailscale/caddy-tailscale@v0.0.0-20250508175905-642f61fea3cc"];
+
hash = "sha256-r9EDkhcgwK11dB46AV+Em8ZE6Aa7IDMwibDGkg3e/rc=";
};
};
tailscale.permitCertUid = "caddy";
+3 -1
modules/nixos/services/default.nix
···
{...}: {
imports = [
./audiobookshelf
./aria2
./couchdb
···
./jellyseerr
./karakeep
./miniflux
-
./monitoring
./nitter
./ntfy
./pds
./postgresql
./qbittorrent
./radicale
./redlib
./syncthing
./tailscale
./tangled-knot
···
{...}: {
imports = [
+
./atproto-basic-notifications
./audiobookshelf
./aria2
./couchdb
···
./jellyseerr
./karakeep
./miniflux
./nitter
./ntfy
./pds
./postgresql
+
./privatebin
./qbittorrent
./radicale
./redlib
+
./sddm
./syncthing
./tailscale
./tangled-knot
+17
modules/nixos/services/fail2ban/default.nix
···
source = config.age.secrets.cloudflareFail2ban.path;
};
"fail2ban/action.d/ntfy.conf".text = ''
[Definition]
actionban = ${mkNotify {
···
bantime-increment.enable = true;
extraPackages = [pkgs.curl pkgs.jq pkgs.uutils-coreutils-noprefix];
jails = {
# HTTP basic-auth failures, 5 tries โ†’ 1-day ban
nginx-http-auth = {
settings = {
···
source = config.age.secrets.cloudflareFail2ban.path;
};
+
"fail2ban/filter.d/forgejo.conf".text = ''
+
[Definition]
+
failregex = .*(Failed authentication attempt|invalid credentials|Attempted access of unknown user).* from <HOST>
+
journalmatch = _SYSTEMD_UNIT=forgejo.service
+
'';
+
"fail2ban/action.d/ntfy.conf".text = ''
[Definition]
actionban = ${mkNotify {
···
bantime-increment.enable = true;
extraPackages = [pkgs.curl pkgs.jq pkgs.uutils-coreutils-noprefix];
jails = {
+
forgejo.settings = {
+
action = ''
+
mycloudflare
+
iptables-allports
+
ntfy'';
+
bantime = 900;
+
filter = "forgejo";
+
findtime = 3600;
+
maxretry = 4;
+
};
+
# HTTP basic-auth failures, 5 tries โ†’ 1-day ban
nginx-http-auth = {
settings = {
+63 -162
modules/nixos/services/forgejo/default.nix
···
-
# damn this is really messy
{
config,
lib,
···
network = config.mySnippets.aylac-top;
service = network.networkMap.${name};
-
-
mkNotify = {
-
message,
-
channel,
-
priority ? 1,
-
}: ''
-
curl -u $(cat "${config.age.secrets.ntfyAuto.path}") \
-
-H "X-Priority: ${toString priority}" \
-
-d '${message}' \
-
https://${config.mySnippets.aylac-top.networkMap.ntfy.vHost}/${channel}
-
'';
in {
options.myNixOS.services.${name} = {
enable = lib.mkEnableOption "forgejo git forge";
-
db = lib.mkOption {
-
description = "Database to use (sqlite or postgresql).";
-
default = "sqlite";
-
type = lib.types.str;
-
};
-
autoProxy = lib.mkOption {
default = true;
example = false;
···
config = lib.mkIf cfg.enable {
age.secrets.cloudflareFail2ban.file = "${self.inputs.secrets}/cloudflare/fail2ban.age";
-
services.cloudflared.tunnels."${network.cloudflareTunnel}".ingress = lib.mkIf cfg.autoProxy {
-
"${service.vHost}" = "http://${service.hostName}:${toString service.port}";
-
};
-
-
myNixOS.services.postgresql = lib.mkIf (cfg.db == "postgresql") {
-
enable = true;
-
databases = ["forgejo"];
-
};
-
-
containers.forgejo = {
-
autoStart = true;
-
bindMounts = {
-
"${config.age.secrets.cloudflareFail2ban.path}".isReadOnly = true;
-
"${config.age.secrets.ntfyAuto.path}".isReadOnly = true;
};
-
config = {
-
services = {
-
postgresql.enable = lib.mkForce false;
-
forgejo = {
-
enable = true;
-
database = lib.mkIf (cfg.db
-
== "postgresql") {
-
host = "127.0.0.1";
-
name = "forgejo";
-
type = "postgres";
-
user = "forgejo";
-
socket = null;
-
};
-
lfs.enable = true;
-
package = pkgs.forgejo;
-
settings = {
-
actions = {
-
ARTIFACT_RETENTION_DAYS = 15;
-
DEFAULT_ACTIONS_URL = "https://github.com";
-
ENABLED = false;
-
};
-
cron = {
-
ENABLED = true;
-
RUN_AT_START = false;
-
};
-
DEFAULT.APP_NAME = "git.aylac.top";
-
federation.ENABLED = true;
-
indexer.REPO_INDEXER_ENABLED = true;
-
log = {
-
ENABLE_SSH_LOG = true;
-
LEVEL = "Debug";
-
};
-
mailer = {
-
ENABLED = false;
-
};
-
migrations = {
-
ALLOW_LOCALNETWORKS = true;
-
};
-
picture = {
-
AVATAR_MAX_FILE_SIZE = 5242880;
-
ENABLE_FEDERATED_AVATAR = true;
-
};
-
-
repository = {
-
DEFAULT_BRANCH = "main";
-
ENABLE_PUSH_CREATE_ORG = true;
-
ENABLE_PUSH_CREATE_USER = true;
-
PREFERRED_LICENSES = "GPL-3.0";
-
};
-
-
security.PASSWORD_CHECK_PWN = true;
-
-
server = {
-
DOMAIN = service.vHost;
-
HTTP_PORT = service.port;
-
LANDING_PAGE = "explore";
-
LFS_START_SERVER = true;
-
ROOT_URL = "https://${service.vHost}/";
-
DISABLE_SSH = true;
-
};
-
-
service = {
-
ALLOW_ONLY_INTERNAL_REGISTRATION = true;
-
DISABLE_REGISTRATION = true;
-
ENABLE_NOTIFY_MAIL = true;
-
};
-
-
session.COOKIE_SECURE = true;
-
storage = {
-
STORAGE_TYPE = "local";
-
PATH = "/var/lib/forgejo/data";
-
};
-
-
ui.DEFAULT_THEME = "forgejo-auto";
-
-
"ui.meta" = {
-
AUTHOR = "Ayla";
-
DESCRIPTION = "i can't set up ssh via cloudflare tunnels!";
-
KEYWORDS = "git,source code,forge,forgejo,aylac";
-
};
-
};
};
-
fail2ban = {
-
enable = true;
-
ignoreIP = ["100.64.0.0/10"];
-
bantime = "24h";
-
bantime-increment.enable = true;
-
extraPackages = [pkgs.curl pkgs.jq pkgs.uutils-coreutils-noprefix];
-
jails.forgejo.settings = {
-
action = ''
-
mycloudflare
-
iptables-allports
-
ntfy'';
-
bantime = 900;
-
filter = "forgejo";
-
findtime = 3600;
-
maxretry = 4;
-
};
};
-
};
-
environment.etc = {
-
"fail2ban/action.d/mycloudflare.conf" = {
-
user = "root";
-
group = "root";
-
mode = "0640";
-
source = config.age.secrets.cloudflareFail2ban.path;
-
};
-
"fail2ban/action.d/ntfy.conf".text = ''
-
[Definition]
-
actionban = ${mkNotify {
-
message = "Arrested <ip> for trying to rob <name> at ${config.networking.hostName}";
-
channel = "fail2ban";
-
priority = 3;
-
}}
-
actionunban = ${mkNotify {
-
message = "Released <ip> from the jail at ${config.networking.hostName}";
-
channel = "fail2ban";
-
priority = 2;
-
}}
-
'';
-
"fail2ban/filter.d/forgejo.conf".text = ''
-
[Definition]
-
failregex = .*(Failed authentication attempt|invalid credentials|Attempted access of unknown user).* from <HOST>
-
journalmatch = _SYSTEMD_UNIT=forgejo.service
-
'';
-
};
-
systemd.services.forgejo = lib.mkIf (cfg.db
-
== "postgresql") {
-
after = lib.mkForce ["network.target" "forgejo-secrets.service"];
-
requires = lib.mkForce ["forgejo-secrets.service"];
};
-
-
system.stateVersion = "25.11";
};
};
};
···
{
config,
lib,
···
network = config.mySnippets.aylac-top;
service = network.networkMap.${name};
in {
options.myNixOS.services.${name} = {
enable = lib.mkEnableOption "forgejo git forge";
autoProxy = lib.mkOption {
default = true;
example = false;
···
config = lib.mkIf cfg.enable {
age.secrets.cloudflareFail2ban.file = "${self.inputs.secrets}/cloudflare/fail2ban.age";
+
services = {
+
cloudflared.tunnels."${network.cloudflareTunnel}".ingress = lib.mkIf cfg.autoProxy {
+
"${service.vHost}" = "http://${service.hostName}:${toString service.port}";
};
+
forgejo = {
+
enable = true;
+
lfs.enable = true;
+
package = pkgs.forgejo;
+
settings = {
+
actions = {
+
ARTIFACT_RETENTION_DAYS = 15;
+
DEFAULT_ACTIONS_URL = "https://github.com";
+
ENABLED = false;
+
};
+
cron = {
+
ENABLED = true;
+
RUN_AT_START = false;
+
};
+
DEFAULT.APP_NAME = "git.aylac.top";
+
federation.ENABLED = true;
+
indexer.REPO_INDEXER_ENABLED = true;
+
log = {
+
ENABLE_SSH_LOG = true;
+
LEVEL = "Debug";
+
};
+
mailer = {
+
ENABLED = false;
+
};
+
migrations = {
+
ALLOW_LOCALNETWORKS = true;
+
};
+
picture = {
+
AVATAR_MAX_FILE_SIZE = 5242880;
+
ENABLE_FEDERATED_AVATAR = true;
+
};
+
repository = {
+
DEFAULT_BRANCH = "main";
+
ENABLE_PUSH_CREATE_ORG = true;
+
ENABLE_PUSH_CREATE_USER = true;
+
PREFERRED_LICENSES = "GPL-3.0";
+
};
+
security.PASSWORD_CHECK_PWN = true;
+
server = {
+
DOMAIN = service.vHost;
+
HTTP_PORT = service.port;
+
LANDING_PAGE = "explore";
+
LFS_START_SERVER = true;
+
ROOT_URL = "https://${service.vHost}/";
+
DISABLE_SSH = true;
};
+
service = {
+
ALLOW_ONLY_INTERNAL_REGISTRATION = true;
+
DISABLE_REGISTRATION = true;
+
ENABLE_NOTIFY_MAIL = true;
};
+
session.COOKIE_SECURE = true;
+
storage = {
+
STORAGE_TYPE = "local";
+
PATH = "/var/lib/forgejo/data";
+
};
+
ui.DEFAULT_THEME = "forgejo-auto";
+
"ui.meta" = {
+
AUTHOR = "Ayla";
+
DESCRIPTION = "i can't set up ssh via cloudflare tunnels!";
+
KEYWORDS = "git,source code,forge,forgejo,aylac";
+
};
};
};
};
};
+42 -19
modules/nixos/services/glance/default.nix
···
glance = {
enable = true;
-
openFirewall = true;
settings = {
pages = [
···
check-url = "http://${tailnet.networkMap.vaultwarden.hostName}:${toString tailnet.networkMap.vaultwarden.port}/";
icon = "di:vaultwarden";
}
-
{
-
title = "Karakeep";
-
url = "https://${tailnet.networkMap.karakeep.vHost}/";
-
check-url = "http://${tailnet.networkMap.karakeep.hostName}:${toString tailnet.networkMap.karakeep.port}/";
-
icon = "di:karakeep";
-
}
{
title = "Jellyfin";
url = "https://${tailnet.networkMap.jellyfin.vHost}/";
···
check-url = "http://${tailnet.networkMap.radarr.hostName}:${toString tailnet.networkMap.radarr.port}/";
icon = "di:radarr";
}
-
#{
-
# title = "Lidarr";
-
# url = "https://${tailnet.networkMap.lidarr.vHost}/";
-
# check-url = "http://${tailnet.networkMap.lidarr.hostName}:${toString tailnet.networkMap.lidarr.port}/";
-
# icon = "di:lidarr";
-
#}
{
title = "Prowlarr";
url = "https://${tailnet.networkMap.prowlarr.vHost}/";
check-url = "http://${tailnet.networkMap.prowlarr.hostName}:${toString tailnet.networkMap.prowlarr.port}/";
icon = "di:prowlarr";
}
-
{
-
title = "Bazarr";
-
url = "https://${tailnet.networkMap.bazarr.vHost}/";
-
check-url = "http://${tailnet.networkMap.bazarr.hostName}:${toString tailnet.networkMap.bazarr.port}/";
-
icon = "di:bazarr";
-
}
{
title = "Autobrr";
url = "https://${tailnet.networkMap.autobrr.vHost}/";
···
url = "https://${tailnet.networkMap.audiobookshelf.vHost}/";
check-url = "http://${tailnet.networkMap.audiobookshelf.hostName}:${toString tailnet.networkMap.audiobookshelf.port}/";
icon = "di:audiobookshelf";
}
];
}
···
glance = {
enable = true;
+
openFirewall = false;
settings = {
pages = [
···
check-url = "http://${tailnet.networkMap.vaultwarden.hostName}:${toString tailnet.networkMap.vaultwarden.port}/";
icon = "di:vaultwarden";
}
+
#{
+
# title = "Karakeep";
+
# url = "https://${tailnet.networkMap.karakeep.vHost}/";
+
# check-url = "http://${tailnet.networkMap.karakeep.hostName}:${toString tailnet.networkMap.karakeep.port}/";
+
# icon = "di:karakeep";
+
#}
{
title = "Jellyfin";
url = "https://${tailnet.networkMap.jellyfin.vHost}/";
···
check-url = "http://${tailnet.networkMap.radarr.hostName}:${toString tailnet.networkMap.radarr.port}/";
icon = "di:radarr";
}
{
title = "Prowlarr";
url = "https://${tailnet.networkMap.prowlarr.vHost}/";
check-url = "http://${tailnet.networkMap.prowlarr.hostName}:${toString tailnet.networkMap.prowlarr.port}/";
icon = "di:prowlarr";
}
+
#{
+
# title = "Bazarr";
+
# url = "https://${tailnet.networkMap.bazarr.vHost}/";
+
# check-url = "http://${tailnet.networkMap.bazarr.hostName}:${toString tailnet.networkMap.bazarr.port}/";
+
# icon = "di:bazarr";
+
#}
{
title = "Autobrr";
url = "https://${tailnet.networkMap.autobrr.vHost}/";
···
url = "https://${tailnet.networkMap.audiobookshelf.vHost}/";
check-url = "http://${tailnet.networkMap.audiobookshelf.hostName}:${toString tailnet.networkMap.audiobookshelf.port}/";
icon = "di:audiobookshelf";
+
}
+
];
+
}
+
{
+
type = "split-column";
+
max-columns = 3;
+
widgets = [
+
{
+
type = "hacker-news";
+
limit = 30;
+
collapse-after = 10;
+
}
+
{
+
type = "lobsters";
+
limit = 30;
+
collapse-after = 10;
+
}
+
{
+
type = "rss";
+
title = "Tildes";
+
limit = 30;
+
collapse-after = 10;
+
cache = "1h";
+
feeds = [
+
{
+
url = "https://tildes.net/topics.rss";
+
title = "tildes.net";
+
}
+
];
}
];
}
+2 -6
modules/nixos/services/miniflux/default.nix
···
config = lib.mkIf cfg.enable {
age.secrets.miniflux.file = "${self.inputs.secrets}/miniflux.age";
-
myNixOS.services.postgresql = {
-
enable = true;
-
databases = ["miniflux"];
-
};
services = {
caddy.virtualHosts."${service.vHost}".extraConfig = lib.mkIf cfg.autoProxy ''
···
miniflux = {
enable = true;
adminCredentialsFile = config.age.secrets.miniflux.path;
-
createDatabaseLocally = false;
config = {
BATCH_SIZE = 100;
CLEANUP_FREQUENCY_HOURS = 48;
LISTEN_ADDR = "${service.hostName}:${toString service.port}";
BASE_URL = "https://${service.vHost}";
-
DATABASE_URL = ''user=miniflux dbname=miniflux sslmode=disable'';
};
};
};
···
config = lib.mkIf cfg.enable {
age.secrets.miniflux.file = "${self.inputs.secrets}/miniflux.age";
+
myNixOS.services.postgresql.enable = true;
services = {
caddy.virtualHosts."${service.vHost}".extraConfig = lib.mkIf cfg.autoProxy ''
···
miniflux = {
enable = true;
adminCredentialsFile = config.age.secrets.miniflux.path;
+
createDatabaseLocally = true;
config = {
BATCH_SIZE = 100;
CLEANUP_FREQUENCY_HOURS = 48;
LISTEN_ADDR = "${service.hostName}:${toString service.port}";
BASE_URL = "https://${service.vHost}";
};
};
};
-43
modules/nixos/services/monitoring/default.nix
···
-
{
-
config,
-
pkgs,
-
...
-
}: let
-
# idk how to share this across files :(
-
mkNotify = {
-
message,
-
channel,
-
priority ? 1,
-
}: ''
-
LOGIN=$(cat "${config.age.secrets.ntfyAuto.path}")
-
${pkgs.curl}/bin/curl -u $LOGIN \
-
-H "X-Priority: ${toString priority}" \
-
-d '${message}' \
-
https://${config.mySnippets.aylac-top.networkMap.ntfy.vHost}/${channel}
-
'';
-
in {
-
systemd.services.disk-space-check = {
-
description = "Check for low disk space";
-
script = ''
-
#!${pkgs.bash}/bin/bash
-
THRESHOLD=80
-
USAGE=$(df --output=pcent / | tail -n 1 | tr -d ' %')
-
if [ "$USAGE" -gt "$THRESHOLD" ]; then
-
${mkNotify {
-
message = "CRITICAL: Disk space on / is at $USAGE% on ${config.networking.hostName}";
-
channel = "network-status";
-
priority = 5;
-
}}
-
fi
-
'';
-
};
-
-
systemd.timers.disk-space-check = {
-
description = "Run disk space check every hour";
-
wantedBy = ["timers.target"];
-
timerConfig = {
-
OnCalendar = "hourly";
-
Persistent = true;
-
};
-
};
-
}
···
+59 -8
modules/nixos/services/pds/default.nix
···
{
config,
lib,
...
}: let
name = "pds";
cfg = config.myNixOS.services.${name};
network = config.mySnippets.aylac-top;
service = network.networkMap.${name};
···
respond "${pdsHomePage}"
}
handle /xrpc/app.bsky.unspecced.getAgeAssuranceState {
header content-type "application/json"
header access-control-allow-headers "authorization,dpop,atproto-accept-labelers,atproto-proxy"
···
respond `{"lastInitiatedAt":"2025-07-14T14:22:43.912Z","status":"assured"}` 200
}
handle {
reverse_proxy ${service.hostName}:${toString service.port}
}
···
autoStart = true;
bindMounts."${config.age.secrets.pds.path}".isReadOnly = true;
config = {
-
services.bluesky-pds = {
-
enable = true;
-
environmentFiles = [config.age.secrets.pds.path];
-
pdsadmin.enable = true;
-
settings = {
-
PDS_HOSTNAME = service.vHost;
-
# PDS_BSKY_APP_VIEW_URL = "https://bsky.zeppelin.social";
-
# PDS_BSKY_APP_VIEW_DID = "did:web:bsky.zeppelin.social";
};
};
···
+
# for the pds-gatekeeper https://tangled.sh/@isabelroses.com/dotfiles/blob/61ad925dc8b4537b568784971589b137df5cb948/modules/nixos/services/pds.nix
{
config,
lib,
+
pkgs,
+
self,
...
}: let
name = "pds";
cfg = config.myNixOS.services.${name};
+
+
gk = config.containers.pds.config.services.pds-gatekeeper.settings;
+
gkurl = "http://${gk.GATEKEEPER_HOST}:${toString gk.GATEKEEPER_PORT}";
network = config.mySnippets.aylac-top;
service = network.networkMap.${name};
···
respond "${pdsHomePage}"
}
+
# https://gist.github.com/mary-ext/6e27b24a83838202908808ad528b3318
handle /xrpc/app.bsky.unspecced.getAgeAssuranceState {
header content-type "application/json"
header access-control-allow-headers "authorization,dpop,atproto-accept-labelers,atproto-proxy"
···
respond `{"lastInitiatedAt":"2025-07-14T14:22:43.912Z","status":"assured"}` 200
}
+
# hijack the links for pds-gatekeeper
+
#@gatekeeper {
+
# path /xrpc/com.atproto.server.getSession
+
# path /xrpc/com.atproto.server.updateEmail
+
# path /xrpc/com.atproto.server.createSession
+
# path /@atproto/oauth-provider/~api/sign-in
+
#}
+
+
#handle @gatekeeper {
+
# reverse_proxy ${gkurl}
+
#}
+
handle {
reverse_proxy ${service.hostName}:${toString service.port}
}
···
autoStart = true;
bindMounts."${config.age.secrets.pds.path}".isReadOnly = true;
config = {
+
imports = [self.inputs.tgirlpkgs.nixosModules.default];
+
+
services = {
+
bluesky-pds = {
+
enable = true;
+
environmentFiles = [config.age.secrets.pds.path];
+
pdsadmin.enable = true;
+
settings = {
+
PDS_HOSTNAME = service.vHost;
+
PDS_PORT = service.port;
+
# PDS_BSKY_APP_VIEW_URL = "https://bsky.zeppelin.social";
+
# PDS_BSKY_APP_VIEW_DID = "did:web:bsky.zeppelin.social";
+
+
# crawlers taken from the following post
+
# <https://bsky.app/profile/billy.wales/post/3lxpd67hnks2e>
+
PDS_CRAWLERS = lib.concatStringsSep "," [
+
"https://bsky.network"
+
"https://relay.cerulea.blue"
+
"https://relay.fire.hose.cam"
+
"https://relay2.fire.hose.cam"
+
"https://relay3.fr.hose.cam"
+
"https://relay.hayescmd.net"
+
];
+
};
+
};
+
+
pds-gatekeeper = {
+
enable = false;
+
# we need to share a lot of secrets between pds and gatekeeper
+
environmentFiles = [config.age.secrets.pds.path];
+
+
settings = {
+
GATEKEEPER_PORT = 3602;
+
PDS_BASE_URL = "http://${service.hostName}:${toString service.port}";
+
GATEKEEPER_TRUST_PROXY = "true";
+
+
# make an empty file to prevent early errors due to no pds env
+
# it really wants to load this file but with nix we don't really do it that way
+
PDS_ENV_LOCATION = toString (pkgs.writeText "gatekeeper-pds-env" "");
+
};
};
};
+13 -28
modules/nixos/services/postgresql/default.nix
···
lib,
config,
pkgs,
-
self,
...
}: let
name = "postgresql";
···
enable = lib.mkEnableOption "${name} server";
databases = lib.mkOption {
type = lib.types.listOf lib.types.str;
-
default = {};
description = "PostgreSQL databases.";
};
};
-
config.containers.postgresql = lib.mkIf cfg.enable {
-
autoStart = true;
-
config = {
-
imports = [self.nixosModules.locale-en-gb];
-
services.postgresql = {
-
enable = true;
-
enableTCPIP = true;
-
package = pkgs.postgresql_16;
-
-
ensureDatabases = cfg.databases;
-
ensureUsers =
-
lib.map (dbName: {
-
name = dbName;
-
ensureDBOwnership = true;
-
})
-
cfg.databases;
-
-
authentication = lib.concatStringsSep "\n" (
-
lib.map (dbName: ''
-
host ${dbName} ${dbName} samehost trust
-
'')
-
cfg.databases
-
);
-
};
-
-
system.stateVersion = "25.11";
};
};
}
···
lib,
config,
pkgs,
...
}: let
name = "postgresql";
···
enable = lib.mkEnableOption "${name} server";
databases = lib.mkOption {
type = lib.types.listOf lib.types.str;
+
default = [];
description = "PostgreSQL databases.";
};
};
+
config = lib.mkIf cfg.enable {
+
services.postgresql = {
+
enable = true;
+
enableTCPIP = true;
+
package = pkgs.postgresql_16;
+
ensureDatabases = cfg.databases;
+
ensureUsers =
+
lib.map (dbName: {
+
name = dbName;
+
ensureDBOwnership = true;
+
})
+
cfg.databases;
};
};
}
+94
modules/nixos/services/privatebin/default.nix
···
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}: let
+
name = "privatebin";
+
cfg = config.myNixOS.services.${name};
+
+
network = config.mySnippets.aylac-top;
+
service = network.networkMap.${name};
+
+
package = pkgs.privatebin-ayla;
+
in {
+
options.myNixOS.services.${name} = {
+
enable = lib.mkEnableOption "${name} server";
+
autoProxy = lib.mkOption {
+
default = true;
+
example = false;
+
description = "${name} auto proxy";
+
type = lib.types.bool;
+
};
+
};
+
+
config = lib.mkIf cfg.enable {
+
services = {
+
cloudflared.tunnels."${network.cloudflareTunnel}".ingress = lib.mkIf cfg.autoProxy {
+
"${service.vHost}" = "http://localhost:${toString service.port}";
+
};
+
+
nginx = {
+
enable = true;
+
recommendedTlsSettings = lib.mkDefault true;
+
recommendedOptimisation = lib.mkDefault true;
+
recommendedGzipSettings = lib.mkDefault true;
+
virtualHosts."${config.services.privatebin.virtualHost}" = {
+
root = "${package}";
+
locations = {
+
"/" = {
+
tryFiles = "$uri $uri/ /index.php?$query_string";
+
index = "index.php";
+
extraConfig = ''
+
sendfile off;
+
'';
+
};
+
"~ \\.php$" = {
+
extraConfig = ''
+
include ${config.services.nginx.package}/conf/fastcgi_params ;
+
fastcgi_param SCRIPT_FILENAME $request_filename;
+
fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
+
fastcgi_pass unix:${config.services.phpfpm.pools.privatebin.socket};
+
'';
+
};
+
};
+
listen = [
+
{
+
addr = "localhost";
+
inherit (service) port;
+
}
+
];
+
};
+
};
+
+
privatebin = {
+
inherit package;
+
enable = true;
+
group = "nginx";
+
settings = {
+
main = {
+
name = "ayla's trashbin";
+
basepath = "https://${service.vHost}/";
+
discussion = true;
+
opendiscussion = false;
+
discussiondatedisplay = true;
+
password = true;
+
fileupload = true;
+
burnafterreadingselected = false;
+
defaultformatter = "plaintext";
+
syntaxhighlightingtheme = "sons-of-obsidian";
+
qrcode = true;
+
template = "bootstrap-dark";
+
};
+
model.class = "Database";
+
model_options = {
+
dsn = "sqlite:/var/lib/privatebin/data/db.sq3";
+
usr = null;
+
pwd = null;
+
"opt[12]" = true;
+
};
+
};
+
};
+
};
+
};
+
}
+1 -1
modules/nixos/services/redlib/default.nix
···
redlib = {
enable = true;
-
openFirewall = true;
inherit (service) port;
settings = {
ENABLE_RSS = "on";
···
redlib = {
enable = true;
+
openFirewall = false;
inherit (service) port;
settings = {
ENABLE_RSS = "on";
+40
modules/nixos/services/sddm/default.nix
···
···
+
{
+
config,
+
lib,
+
...
+
}: {
+
options.myNixOS.services.sddm = {
+
enable = lib.mkEnableOption "use sddm";
+
+
autoLogin = lib.mkOption {
+
description = "User to autologin.";
+
default = null;
+
type = lib.types.nullOr lib.types.str;
+
};
+
};
+
+
config = lib.mkIf config.myNixOS.services.sddm.enable {
+
security.pam.services.sddm = {
+
enableGnomeKeyring = true;
+
gnupg.enable = true;
+
kwallet.enable = false;
+
};
+
+
services = {
+
displayManager = {
+
autoLogin = lib.mkIf (config.myNixOS.services.sddm.autoLogin != null) {
+
enable = true;
+
user = config.myNixOS.services.sddm.autoLogin;
+
};
+
+
sddm = {
+
enable = true;
+
wayland = {
+
enable = true;
+
compositor = "kwin";
+
};
+
};
+
};
+
};
+
};
+
}
+38 -21
modules/nixos/services/tangled-knot/default.nix
···
{
config,
lib,
...
}: let
name = "tangled-knot";
···
config = lib.mkIf cfg.enable {
services = {
-
caddy.virtualHosts = lib.mkIf cfg.autoProxy {
-
"${service.vHost}" = {
-
extraConfig = ''
-
encode gzip zstd
-
reverse_proxy ${service.hostName}:${toString service.port}
-
'';
};
-
"ssh.${service.vHost}" = {
-
extraConfig = ''
-
encode gzip zstd
-
reverse_proxy ${service.hostName}:22
-
'';
};
-
};
-
tangled-knot = {
-
enable = false;
-
openFirewall = true;
-
stateDir = "/home/git";
-
server = {
-
owner = "did:plc:3c6vkaq7xf5kz3va3muptjh5";
-
hostname = service.vHost;
-
listenAddr = "0.0.0.0:${toString service.port}";
-
};
};
};
};
···
{
config,
lib,
+
self,
...
}: let
name = "tangled-knot";
···
config = lib.mkIf cfg.enable {
services = {
+
cloudflared.tunnels."${network.cloudflareTunnel}".ingress = lib.mkIf cfg.autoProxy {
+
"${service.vHost}" = "http://localhost:${toString service.port}";
+
};
+
};
+
+
containers.tangled-knot = {
+
autoStart = true;
+
config = {
+
imports = [self.inputs.tangled-core.nixosModules.knot];
+
+
programs.ssh.knownHosts = config.mySnippets.ssh.knownHosts;
+
+
services.openssh = {
+
ports = [service.sshPort];
+
settings = {
+
PasswordAuthentication = false;
+
PubkeyAuthentication = true;
+
};
};
+
users.users.git.openssh.authorizedKeys.keyFiles =
+
lib.map (file: "${self.inputs.secrets}/publicKeys/${file}")
+
# right now this config is fine but if i ever get another machine i daily drive or a build server i need to do something else here
+
(lib.filter (file:
+
if config.networking.hostName == "morgana"
+
then "ayla_m23.pub" == file
+
else (lib.elem file ["ayla_morgana.pub" "ayla_23.pub"]))
+
(builtins.attrNames (builtins.readDir "${self.inputs.secrets}/publicKeys")));
+
+
services.tangled-knot = {
+
enable = true;
+
openFirewall = cfg.autoProxy;
+
stateDir = "/var/lib/knot";
+
server = {
+
owner = "did:plc:3c6vkaq7xf5kz3va3muptjh5";
+
hostname = service.vHost;
+
listenAddr = "localhost:${toString service.port}";
+
};
};
+
system.stateVersion = "25.11";
};
};
};
+8 -1
modules/snippets/aylac-top/default.nix
···
};
tangled-knot = {
-
hostName = "jezebel";
port = 5555;
vHost = "knot.aylac.top";
};
};
};
···
};
tangled-knot = {
+
hostName = "nanpi";
port = 5555;
+
sshPort = 2222;
vHost = "knot.aylac.top";
+
};
+
+
privatebin = {
+
hostName = "nanpi";
+
port = 7748;
+
vHost = "bin.aylac.top";
};
};
};
+53
modules/snippets/nix/settings.nix
···
{lib, ...}: {
options = {
mySnippets.nix.settings = lib.mkOption {
···
"flakes"
"nix-command"
"recursive-nix"
];
substituters = [
···
];
trusted-users = ["@admin" "@wheel" "nixbuild"];
};
};
};
···
+
# https://github.com/isabelroses/dotfiles/blob/main/modules/base/nix/nix.nix
{lib, ...}: {
options = {
mySnippets.nix.settings = lib.mkOption {
···
"flakes"
"nix-command"
"recursive-nix"
+
+
# Allows Nix to automatically pick UIDs for builds, rather than creating nixbld* user accounts
+
# which is BEYOND annoying, which makes this a really nice feature to have
+
"auto-allocate-uids"
+
+
# allows Nix to execute builds inside cgroups
+
# remember you must also enable use-cgroups in the nix.conf or settings
+
"cgroups"
+
+
# enable the use of the fetchClosure built-in function in the Nix language.
+
"fetch-closure"
];
substituters = [
···
];
trusted-users = ["@admin" "@wheel" "nixbuild"];
+
+
# Free up to 20GiB whenever there is less than 5GB left.
+
# this setting is in bytes, so we multiply with 1024 by 3
+
min-free = 5 * 1024 * 1024 * 1024;
+
max-free = 20 * 1024 * 1024 * 1024;
+
+
# automatically optimise symlinks
+
# Disable auto-optimise-store because of this issue:
+
# https://github.com/NixOS/nix/issues/7273
+
# but we use lix which has a fix for this issue:
+
# https://gerrit.lix.systems/c/lix/+/2100
+
auto-optimise-store = true;
+
+
# we don't want to track the registry, but we do want to allow the usage
+
# of the `flake:` references, so we need to enable use-registries
+
use-registries = true;
+
flake-registry = "";
+
+
# let the system decide the number of max jobs
+
max-jobs = "auto";
+
+
# this defaults to true, however it slows down evaluation so maybe we should disable it
+
# some day, but we do need it for catppuccin/nix so maybe not too soon
+
allow-import-from-derivation = true;
+
+
# for direnv GC roots
+
keep-derivations = true;
+
keep-outputs = true;
+
+
# use xdg base directories for all the nix things
+
use-xdg-base-directories = true;
+
# don't warn me if the current working tree is dirty
+
# i don't need the warning because i'm working on it right now
+
warn-dirty = false;
+
+
# maximum number of parallel TCP connections used to fetch imports and binary caches, 0 means no limit
+
http-connections = 50;
+
+
# whether to accept nix configuration from a flake without prompting
+
# littrally a CVE waiting to happen <https://x.com/puckipedia/status/1693927716326703441>
+
accept-flake-config = false;
};
};
};
+20
modules/snippets/syncthing/folders.nix
···
id = "obsidian";
path = "/home/ayla/Documents/Obsidian";
};
};
};
};
···
id = "obsidian";
path = "/home/ayla/Documents/Obsidian";
};
+
+
"Phone ROMs" = {
+
devices = [
+
"morgana"
+
"m23"
+
];
+
+
id = "2jcyv-esxcu";
+
path = "/data/Phone ROMs";
+
};
+
+
"RetroArch Saves" = {
+
devices = [
+
"morgana"
+
"m23"
+
];
+
+
id = "guhfs-4e5qf";
+
path = "/home/ayla/.var/app/org.libretro.RetroArch/config/retroarch/saves";
+
};
};
};
};
+1 -1
modules/snippets/tailnet/default.nix
···
}: {
options.mySnippets.tailnet = {
name = lib.mkOption {
-
default = "cinnamon-in.ts.net";
description = "Tailnet name.";
type = lib.types.str;
};
···
}: {
options.mySnippets.tailnet = {
name = lib.mkOption {
+
default = "miku-chimaera.ts.net";
description = "Tailnet name.";
type = lib.types.str;
};
+1 -1
modules/users/ayla/default.nix
···
description = "Ayla";
isNormalUser = true;
extraGroups = config.myUsers.defaultGroups;
-
hashedPassword = config.myUsers.ayla.password;
openssh.authorizedKeys.keyFiles =
lib.map (file: "${self.inputs.secrets}/publicKeys/${file}")
···
description = "Ayla";
isNormalUser = true;
extraGroups = config.myUsers.defaultGroups;
+
hashedPasswordFile = config.myUsers.ayla.passwordFile;
openssh.authorizedKeys.keyFiles =
lib.map (file: "${self.inputs.secrets}/publicKeys/${file}")
+6
modules/users/options.nix
···
description = "Hashed password for ${user}.";
type = lib.types.nullOr lib.types.str;
};
};
in {
defaultGroups = lib.mkOption {
···
description = "Hashed password for ${user}.";
type = lib.types.nullOr lib.types.str;
};
+
+
passwordFile = lib.mkOption {
+
default = null;
+
description = "Hashed password file for ${user}.";
+
type = lib.types.nullOr lib.types.path;
+
};
};
in {
defaultGroups = lib.mkOption {