├── .gitattributes
├── .github
└── workflows
│ └── nix.yml
├── .sops.yaml
├── LICENSE
├── README.md
├── fetch.sh
├── flake.lock
├── flake.nix
├── home
├── aerc.nix
├── alacritty.nix
├── clipman.nix
├── common.nix
├── default.nix
├── direnv.nix
├── dunst.nix
├── fzf.nix
├── gammastep.nix
├── git.nix
├── gpg.nix
├── helix
│ ├── default.nix
│ └── full.nix
├── hyfetch.nix
├── jujutsu.nix
├── niri
│ ├── config.kdl
│ └── default.nix
├── nix-index.nix
├── ntfy.nix
├── packages.nix
├── pass.nix
├── persistence.nix
├── playerctld.nix
├── programming
│ ├── default.nix
│ ├── nix.nix
│ ├── python.nix
│ ├── rust.nix
│ └── uiua.nix
├── rofi
│ ├── default.nix
│ └── nord.rasi
├── scripts
│ ├── download_rss.sh
│ ├── mount.sh
│ ├── ntfy-sub.sh
│ ├── rofipass.sh
│ └── timetracker.sh
├── sops.nix
├── ssh.nix
├── syncthing.nix
├── theme.nix
├── tmux.nix
├── vscodium.nix
├── waybar.nix
├── xournalpp
│ ├── default.nix
│ └── settings
│ │ ├── colornames.ini
│ │ ├── settings.xml
│ │ └── toolbar.ini
├── yubikey.nix
├── zoxide.nix
└── zsh
│ ├── default.nix
│ ├── full.nix
│ └── p10k.zsh
├── hosts
└── neon
│ ├── default.nix
│ ├── hardware-configuration.nix
│ └── secrets
│ ├── default.yml
│ ├── networking
│ ├── .gitkeep
│ └── uni-wifi-keys
│ │ ├── client_cert.pem
│ │ ├── client_key.pem
│ │ └── root_ca.pem
│ └── nm-connections
│ ├── home-wifi
│ ├── home-wifi-5
│ ├── hotspot
│ ├── uni-vpn
│ ├── uni-wifi
│ ├── vpn
│ └── vpn-full
├── renovate.json
├── scripts
├── default.nix
└── easyroam-setup.sh
├── secrets
├── aerc
│ └── accounts.conf
├── gtk
│ └── bookmarks
├── nix.yml
├── ntfy
└── ssh
│ └── hosts
├── system
├── audio.nix
├── backlight.nix
├── backup.nix
├── base.nix
├── bluetooth.nix
├── boot.nix
├── btrbk.nix
├── btrfs.nix
├── common.nix
├── default.nix
├── emulation.nix
├── env.nix
├── fonts.nix
├── geoclue2.nix
├── kanata.nix
├── networking.nix
├── nix-ld.nix
├── persistence.nix
├── power.nix
├── services.nix
├── sops.nix
├── ssh.nix
├── steam.nix
├── users.nix
├── virt.nix
├── wayland.nix
└── zram.nix
├── treefmt.nix
└── wallpapers
├── cryptic.jpg
├── nix-simple-geometric.png
├── nix-snowflake-dark.png
└── python.png
/.gitattributes:
--------------------------------------------------------------------------------
1 | **/secrets/** diff=sopsdiffer
2 | /home/zsh/p10k.zsh linguist-vendored
3 |
--------------------------------------------------------------------------------
/.github/workflows/nix.yml:
--------------------------------------------------------------------------------
1 | name: nix
2 |
3 | on:
4 | push:
5 | branches: [main, staging, trying]
6 | pull_request:
7 |
8 | permissions:
9 | contents: read
10 |
11 | jobs:
12 | fmt:
13 | runs-on: ubuntu-latest
14 | steps:
15 | - uses: actions/checkout@v4
16 | - uses: DeterminateSystems/nix-installer-action@v17
17 | - run: nix fmt -- --ci
18 |
19 | checks:
20 | runs-on: ubuntu-latest
21 | steps:
22 | - uses: actions/checkout@v4
23 | - uses: wimpysworld/nothing-but-nix@v6
24 | - uses: DeterminateSystems/nix-installer-action@v17
25 | - uses: ryanccn/attic-action@v0
26 | with:
27 | endpoint: https://attic.defelo.de/
28 | cache: nixos
29 | # atticd-atticadm make-token --sub github --validity 1y --pull nixos --push nixos
30 | token: ${{ secrets.ATTIC_TOKEN }}
31 | - run: nix build -L --keep-going .#checks
32 |
--------------------------------------------------------------------------------
/.sops.yaml:
--------------------------------------------------------------------------------
1 | keys:
2 | - &defelo 61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64
3 | - &neon age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g
4 | creation_rules:
5 | - path_regex: hosts/neon/secrets/.+$
6 | key_groups:
7 | - pgp: [*defelo]
8 | age: [*neon]
9 | - path_regex: secrets/.+$
10 | key_groups:
11 | - pgp: [*defelo]
12 | age: [*neon]
13 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Defelo
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # nixos
2 | My NixOS configuration
3 |
4 | ## Installation instructions
5 | 1. Boot the [minimal NixOS ISO image](https://nixos.org/download.html#nixos-iso)
6 | 2. Create a GPT partition table with the following partitions:
7 | - `/dev/EFI_PARTITION`: EFI system partition (type: EFI System, size: 1G)
8 | - `/dev/LUKS_PARTITION`: Encrypted root partition (type: Linux filesystem)
9 | 3. Create and open the LUKS container:
10 | ```bash
11 | cryptsetup -yv luksFormat /dev/LUKS_PARTITION
12 | cryptsetup open /dev/LUKS_PARTITION root
13 | ```
14 | 4. Create and mount btrfs subvolumes:
15 | ```bash
16 | mkfs.btrfs -f /dev/mapper/root
17 |
18 | mount -m -o noatime,compress=zstd /dev/mapper/root /mnt
19 | btrfs subvolume create /mnt/@data
20 | btrfs subvolume create /mnt/@data/.snapshots
21 | btrfs subvolume create /mnt/@cache
22 | btrfs subvolume create /mnt/@cache/.snapshots
23 | btrfs subvolume create /mnt/@nix
24 | btrfs subvolume create /mnt/@swap
25 | umount /mnt
26 |
27 | mount -m -o size=100%,mode=755 -t tmpfs tmpfs /mnt
28 | mount -m -o noatime,compress=zstd,subvol=@data /dev/mapper/root /mnt/persistent/data
29 | mount -m -o noatime,compress=zstd,subvol=@cache /dev/mapper/root /mnt/persistent/cache
30 | mount -m -o noatime,compress=zstd,subvol=@nix /dev/mapper/root /mnt/nix
31 | mount -m -o noatime,compress=zstd,subvol=@swap /dev/mapper/root /mnt/swap
32 | ```
33 | 5. Create and activate swapfile:
34 | ```bash
35 | btrfs filesystem mkswapfile -s 16G /mnt/swap/swapfile
36 | btrfs inspect-internal map-swapfile -r /mnt/swap/swapfile # resume_offset
37 | swapon /mnt/swap/swapfile
38 | ```
39 | 6. Format and mount EFI system partition:
40 | ```bash
41 | mkfs.vfat /dev/EFI_PARTITION
42 | mount -m -o umask=0077 /dev/EFI_PARTITION /mnt/boot
43 | ```
44 | 7. Install git:
45 | ```bash
46 | nix-env -iA nixos.git
47 | ```
48 | 8. Clone this repository:
49 | ```bash
50 | mkdir -p /mnt/persistent/data/home/felix/
51 | cd /mnt/persistent/data/home/felix/
52 | git clone https://github.com/Defelo/nixos.git
53 | cd nixos
54 | ```
55 | 9. Create a new or modify an existing host (don't forget to add new files to git).
56 | 10. Install the system and reboot:
57 | ```bash
58 | nixos-install --flake .#HOSTNAME --no-channel-copy --no-root-password
59 | reboot
60 | ```
61 |
--------------------------------------------------------------------------------
/fetch.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -euo pipefail
4 |
5 | path=$(nix eval --raw .#nixosConfigurations."$(cat /proc/sys/kernel/hostname)".config.system.build.toplevel.outPath)
6 | nix-store -r "$path"
7 |
--------------------------------------------------------------------------------
/flake.lock:
--------------------------------------------------------------------------------
1 | {
2 | "nodes": {
3 | "crane": {
4 | "locked": {
5 | "lastModified": 1731098351,
6 | "narHash": "sha256-HQkYvKvaLQqNa10KEFGgWHfMAbWBfFp+4cAgkut+NNE=",
7 | "owner": "ipetkov",
8 | "repo": "crane",
9 | "rev": "ef80ead953c1b28316cc3f8613904edc2eb90c28",
10 | "type": "github"
11 | },
12 | "original": {
13 | "owner": "ipetkov",
14 | "repo": "crane",
15 | "type": "github"
16 | }
17 | },
18 | "fenix": {
19 | "inputs": {
20 | "nixpkgs": "nixpkgs",
21 | "rust-analyzer-src": "rust-analyzer-src"
22 | },
23 | "locked": {
24 | "lastModified": 1749192146,
25 | "narHash": "sha256-ZEpmRS5m692wzUhRSdBgSojaWR0EU0lqT9x0Bsb+2xY=",
26 | "owner": "nix-community",
27 | "repo": "fenix",
28 | "rev": "167c053888748278d52fba3c4bf3b8abaee72929",
29 | "type": "github"
30 | },
31 | "original": {
32 | "owner": "nix-community",
33 | "repo": "fenix",
34 | "type": "github"
35 | }
36 | },
37 | "flake-compat": {
38 | "flake": false,
39 | "locked": {
40 | "lastModified": 1696426674,
41 | "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
42 | "owner": "edolstra",
43 | "repo": "flake-compat",
44 | "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
45 | "type": "github"
46 | },
47 | "original": {
48 | "owner": "edolstra",
49 | "repo": "flake-compat",
50 | "type": "github"
51 | }
52 | },
53 | "flake-parts": {
54 | "inputs": {
55 | "nixpkgs-lib": [
56 | "lanzaboote",
57 | "nixpkgs"
58 | ]
59 | },
60 | "locked": {
61 | "lastModified": 1730504689,
62 | "narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=",
63 | "owner": "hercules-ci",
64 | "repo": "flake-parts",
65 | "rev": "506278e768c2a08bec68eb62932193e341f55c90",
66 | "type": "github"
67 | },
68 | "original": {
69 | "owner": "hercules-ci",
70 | "repo": "flake-parts",
71 | "type": "github"
72 | }
73 | },
74 | "flake-utils": {
75 | "inputs": {
76 | "systems": "systems"
77 | },
78 | "locked": {
79 | "lastModified": 1731533236,
80 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
81 | "owner": "numtide",
82 | "repo": "flake-utils",
83 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
84 | "type": "github"
85 | },
86 | "original": {
87 | "owner": "numtide",
88 | "repo": "flake-utils",
89 | "type": "github"
90 | }
91 | },
92 | "gitignore": {
93 | "inputs": {
94 | "nixpkgs": [
95 | "lanzaboote",
96 | "pre-commit-hooks-nix",
97 | "nixpkgs"
98 | ]
99 | },
100 | "locked": {
101 | "lastModified": 1709087332,
102 | "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
103 | "owner": "hercules-ci",
104 | "repo": "gitignore.nix",
105 | "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
106 | "type": "github"
107 | },
108 | "original": {
109 | "owner": "hercules-ci",
110 | "repo": "gitignore.nix",
111 | "type": "github"
112 | }
113 | },
114 | "helix": {
115 | "inputs": {
116 | "nixpkgs": "nixpkgs_2",
117 | "rust-overlay": "rust-overlay"
118 | },
119 | "locked": {
120 | "lastModified": 1749248684,
121 | "narHash": "sha256-5Upy6vLXAguCrd1alanuKc0XwAa+tQRWGeq+bDM0XXw=",
122 | "owner": "helix-editor",
123 | "repo": "helix",
124 | "rev": "f4b488e380e28aa36a06ad400d6656fa864ba5b7",
125 | "type": "github"
126 | },
127 | "original": {
128 | "owner": "helix-editor",
129 | "repo": "helix",
130 | "type": "github"
131 | }
132 | },
133 | "home-manager": {
134 | "inputs": {
135 | "nixpkgs": [
136 | "nixpkgs"
137 | ]
138 | },
139 | "locked": {
140 | "lastModified": 1749243446,
141 | "narHash": "sha256-P1gumhZN5N9q+39ndePHYrtwOwY1cGx+VoXGl+vTm7A=",
142 | "owner": "nix-community",
143 | "repo": "home-manager",
144 | "rev": "2d7d65f65b61fdfce23278e59ca266ddd0ef0a36",
145 | "type": "github"
146 | },
147 | "original": {
148 | "owner": "nix-community",
149 | "repo": "home-manager",
150 | "type": "github"
151 | }
152 | },
153 | "impermanence": {
154 | "locked": {
155 | "lastModified": 1737831083,
156 | "narHash": "sha256-LJggUHbpyeDvNagTUrdhe/pRVp4pnS6wVKALS782gRI=",
157 | "owner": "nix-community",
158 | "repo": "impermanence",
159 | "rev": "4b3e914cdf97a5b536a889e939fb2fd2b043a170",
160 | "type": "github"
161 | },
162 | "original": {
163 | "owner": "nix-community",
164 | "repo": "impermanence",
165 | "type": "github"
166 | }
167 | },
168 | "lanzaboote": {
169 | "inputs": {
170 | "crane": "crane",
171 | "flake-compat": "flake-compat",
172 | "flake-parts": "flake-parts",
173 | "nixpkgs": [
174 | "nixpkgs"
175 | ],
176 | "pre-commit-hooks-nix": "pre-commit-hooks-nix",
177 | "rust-overlay": "rust-overlay_2"
178 | },
179 | "locked": {
180 | "lastModified": 1737639419,
181 | "narHash": "sha256-AEEDktApTEZ5PZXNDkry2YV2k6t0dTgLPEmAZbnigXU=",
182 | "owner": "nix-community",
183 | "repo": "lanzaboote",
184 | "rev": "a65905a09e2c43ff63be8c0e86a93712361f871e",
185 | "type": "github"
186 | },
187 | "original": {
188 | "owner": "nix-community",
189 | "ref": "v0.4.2",
190 | "repo": "lanzaboote",
191 | "type": "github"
192 | }
193 | },
194 | "nix-index-database": {
195 | "inputs": {
196 | "nixpkgs": [
197 | "nixpkgs"
198 | ]
199 | },
200 | "locked": {
201 | "lastModified": 1748751003,
202 | "narHash": "sha256-i4GZdKAK97S0ZMU3w4fqgEJr0cVywzqjugt2qZPrScs=",
203 | "owner": "Mic92",
204 | "repo": "nix-index-database",
205 | "rev": "2860bee699248d828c2ed9097a1cd82c2f991b43",
206 | "type": "github"
207 | },
208 | "original": {
209 | "owner": "Mic92",
210 | "repo": "nix-index-database",
211 | "type": "github"
212 | }
213 | },
214 | "nix-vscode-extensions": {
215 | "inputs": {
216 | "flake-utils": "flake-utils",
217 | "nixpkgs": "nixpkgs_3"
218 | },
219 | "locked": {
220 | "lastModified": 1749261690,
221 | "narHash": "sha256-cx/BC96wW+29joUehjHeERqEPxohHlMmPwYXXVORPZk=",
222 | "owner": "nix-community",
223 | "repo": "nix-vscode-extensions",
224 | "rev": "5af3052a092b3b097f243d70a66b0484e000b423",
225 | "type": "github"
226 | },
227 | "original": {
228 | "owner": "nix-community",
229 | "repo": "nix-vscode-extensions",
230 | "type": "github"
231 | }
232 | },
233 | "nixpkgs": {
234 | "locked": {
235 | "lastModified": 1748929857,
236 | "narHash": "sha256-lcZQ8RhsmhsK8u7LIFsJhsLh/pzR9yZ8yqpTzyGdj+Q=",
237 | "owner": "nixos",
238 | "repo": "nixpkgs",
239 | "rev": "c2a03962b8e24e669fb37b7df10e7c79531ff1a4",
240 | "type": "github"
241 | },
242 | "original": {
243 | "owner": "nixos",
244 | "ref": "nixos-unstable",
245 | "repo": "nixpkgs",
246 | "type": "github"
247 | }
248 | },
249 | "nixpkgs-stable": {
250 | "locked": {
251 | "lastModified": 1730741070,
252 | "narHash": "sha256-edm8WG19kWozJ/GqyYx2VjW99EdhjKwbY3ZwdlPAAlo=",
253 | "owner": "NixOS",
254 | "repo": "nixpkgs",
255 | "rev": "d063c1dd113c91ab27959ba540c0d9753409edf3",
256 | "type": "github"
257 | },
258 | "original": {
259 | "owner": "NixOS",
260 | "ref": "nixos-24.05",
261 | "repo": "nixpkgs",
262 | "type": "github"
263 | }
264 | },
265 | "nixpkgs_2": {
266 | "locked": {
267 | "lastModified": 1740560979,
268 | "narHash": "sha256-Vr3Qi346M+8CjedtbyUevIGDZW8LcA1fTG0ugPY/Hic=",
269 | "owner": "nixos",
270 | "repo": "nixpkgs",
271 | "rev": "5135c59491985879812717f4c9fea69604e7f26f",
272 | "type": "github"
273 | },
274 | "original": {
275 | "owner": "nixos",
276 | "ref": "nixos-unstable",
277 | "repo": "nixpkgs",
278 | "type": "github"
279 | }
280 | },
281 | "nixpkgs_3": {
282 | "locked": {
283 | "lastModified": 1744868846,
284 | "narHash": "sha256-5RJTdUHDmj12Qsv7XOhuospjAjATNiTMElplWnJE9Hs=",
285 | "owner": "NixOS",
286 | "repo": "nixpkgs",
287 | "rev": "ebe4301cbd8f81c4f8d3244b3632338bbeb6d49c",
288 | "type": "github"
289 | },
290 | "original": {
291 | "owner": "NixOS",
292 | "repo": "nixpkgs",
293 | "rev": "ebe4301cbd8f81c4f8d3244b3632338bbeb6d49c",
294 | "type": "github"
295 | }
296 | },
297 | "nixpkgs_4": {
298 | "locked": {
299 | "lastModified": 1749143949,
300 | "narHash": "sha256-QuUtALJpVrPnPeozlUG/y+oIMSLdptHxb3GK6cpSVhA=",
301 | "owner": "NixOS",
302 | "repo": "nixpkgs",
303 | "rev": "d3d2d80a2191a73d1e86456a751b83aa13085d7d",
304 | "type": "github"
305 | },
306 | "original": {
307 | "owner": "NixOS",
308 | "ref": "nixos-unstable",
309 | "repo": "nixpkgs",
310 | "type": "github"
311 | }
312 | },
313 | "nixpkgs_5": {
314 | "locked": {
315 | "lastModified": 1744868846,
316 | "narHash": "sha256-5RJTdUHDmj12Qsv7XOhuospjAjATNiTMElplWnJE9Hs=",
317 | "owner": "NixOS",
318 | "repo": "nixpkgs",
319 | "rev": "ebe4301cbd8f81c4f8d3244b3632338bbeb6d49c",
320 | "type": "github"
321 | },
322 | "original": {
323 | "owner": "NixOS",
324 | "ref": "nixpkgs-unstable",
325 | "repo": "nixpkgs",
326 | "type": "github"
327 | }
328 | },
329 | "pre-commit-hooks-nix": {
330 | "inputs": {
331 | "flake-compat": [
332 | "lanzaboote",
333 | "flake-compat"
334 | ],
335 | "gitignore": "gitignore",
336 | "nixpkgs": [
337 | "lanzaboote",
338 | "nixpkgs"
339 | ],
340 | "nixpkgs-stable": "nixpkgs-stable"
341 | },
342 | "locked": {
343 | "lastModified": 1731363552,
344 | "narHash": "sha256-vFta1uHnD29VUY4HJOO/D6p6rxyObnf+InnSMT4jlMU=",
345 | "owner": "cachix",
346 | "repo": "pre-commit-hooks.nix",
347 | "rev": "cd1af27aa85026ac759d5d3fccf650abe7e1bbf0",
348 | "type": "github"
349 | },
350 | "original": {
351 | "owner": "cachix",
352 | "repo": "pre-commit-hooks.nix",
353 | "type": "github"
354 | }
355 | },
356 | "root": {
357 | "inputs": {
358 | "fenix": "fenix",
359 | "helix": "helix",
360 | "home-manager": "home-manager",
361 | "impermanence": "impermanence",
362 | "lanzaboote": "lanzaboote",
363 | "nix-index-database": "nix-index-database",
364 | "nix-vscode-extensions": "nix-vscode-extensions",
365 | "nixpkgs": "nixpkgs_4",
366 | "sops-nix": "sops-nix"
367 | }
368 | },
369 | "rust-analyzer-src": {
370 | "flake": false,
371 | "locked": {
372 | "lastModified": 1749133384,
373 | "narHash": "sha256-nKbHae8x2v2IMg1Rd3e5OrRPk5lxAqcvPkIM3fYtB90=",
374 | "owner": "rust-lang",
375 | "repo": "rust-analyzer",
376 | "rev": "d5665e5ca79135a753f853b5a0e2f33f8f263a0b",
377 | "type": "github"
378 | },
379 | "original": {
380 | "owner": "rust-lang",
381 | "ref": "nightly",
382 | "repo": "rust-analyzer",
383 | "type": "github"
384 | }
385 | },
386 | "rust-overlay": {
387 | "inputs": {
388 | "nixpkgs": [
389 | "helix",
390 | "nixpkgs"
391 | ]
392 | },
393 | "locked": {
394 | "lastModified": 1740623427,
395 | "narHash": "sha256-3SdPQrZoa4odlScFDUHd4CUPQ/R1gtH4Mq9u8CBiK8M=",
396 | "owner": "oxalica",
397 | "repo": "rust-overlay",
398 | "rev": "d342e8b5fd88421ff982f383c853f0fc78a847ab",
399 | "type": "github"
400 | },
401 | "original": {
402 | "owner": "oxalica",
403 | "repo": "rust-overlay",
404 | "type": "github"
405 | }
406 | },
407 | "rust-overlay_2": {
408 | "inputs": {
409 | "nixpkgs": [
410 | "lanzaboote",
411 | "nixpkgs"
412 | ]
413 | },
414 | "locked": {
415 | "lastModified": 1731897198,
416 | "narHash": "sha256-Ou7vLETSKwmE/HRQz4cImXXJBr/k9gp4J4z/PF8LzTE=",
417 | "owner": "oxalica",
418 | "repo": "rust-overlay",
419 | "rev": "0be641045af6d8666c11c2c40e45ffc9667839b5",
420 | "type": "github"
421 | },
422 | "original": {
423 | "owner": "oxalica",
424 | "repo": "rust-overlay",
425 | "type": "github"
426 | }
427 | },
428 | "sops-nix": {
429 | "inputs": {
430 | "nixpkgs": "nixpkgs_5"
431 | },
432 | "locked": {
433 | "lastModified": 1747603214,
434 | "narHash": "sha256-lAblXm0VwifYCJ/ILPXJwlz0qNY07DDYdLD+9H+Wc8o=",
435 | "owner": "Mic92",
436 | "repo": "sops-nix",
437 | "rev": "8d215e1c981be3aa37e47aeabd4e61bb069548fd",
438 | "type": "github"
439 | },
440 | "original": {
441 | "owner": "Mic92",
442 | "repo": "sops-nix",
443 | "type": "github"
444 | }
445 | },
446 | "systems": {
447 | "locked": {
448 | "lastModified": 1681028828,
449 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
450 | "owner": "nix-systems",
451 | "repo": "default",
452 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
453 | "type": "github"
454 | },
455 | "original": {
456 | "owner": "nix-systems",
457 | "repo": "default",
458 | "type": "github"
459 | }
460 | }
461 | },
462 | "root": "root",
463 | "version": 7
464 | }
465 |
--------------------------------------------------------------------------------
/flake.nix:
--------------------------------------------------------------------------------
1 | {
2 | inputs = {
3 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
4 | # nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-23.11";
5 | # nixpkgs-small.url = "github:NixOS/nixpkgs/nixos-unstable-small";
6 | home-manager = {
7 | url = "github:nix-community/home-manager";
8 | inputs.nixpkgs.follows = "nixpkgs";
9 | };
10 | sops-nix.url = "github:Mic92/sops-nix";
11 | impermanence.url = "github:nix-community/impermanence";
12 | nix-index-database = {
13 | url = "github:Mic92/nix-index-database";
14 | inputs.nixpkgs.follows = "nixpkgs";
15 | };
16 | helix.url = "github:helix-editor/helix";
17 | fenix.url = "github:nix-community/fenix";
18 | nix-vscode-extensions.url = "github:nix-community/nix-vscode-extensions";
19 | lanzaboote = {
20 | url = "github:nix-community/lanzaboote/v0.4.2";
21 | inputs.nixpkgs.follows = "nixpkgs";
22 | };
23 | };
24 |
25 | outputs =
26 | {
27 | self,
28 | nixpkgs,
29 | home-manager,
30 | ...
31 | }@inputs:
32 | let
33 | inherit (nixpkgs) lib;
34 |
35 | eachDefaultSystem = lib.genAttrs [
36 | "x86_64-linux"
37 | "aarch64-linux"
38 | ];
39 |
40 | importNixpkgs =
41 | system: nixpkgs:
42 | let
43 | config.allowUnfreePredicate =
44 | pkg:
45 | builtins.elem (lib.getName pkg) [
46 | "discord-canary"
47 | "obsidian"
48 | "steam"
49 | "steam-unwrapped"
50 | "steam-original"
51 | "steam-run"
52 | "spotify"
53 | ];
54 | in
55 | import nixpkgs { inherit system config; };
56 |
57 | extra-pkgs =
58 | system:
59 | lib.pipe inputs [
60 | (lib.filterAttrs (k: _: lib.hasPrefix "nixpkgs-" k))
61 | (lib.mapAttrs' (
62 | k: v: {
63 | name = lib.removePrefix "nix" k;
64 | value = importNixpkgs system v;
65 | }
66 | ))
67 | ];
68 |
69 | getSystemFromHardwareConfiguration =
70 | hostName:
71 | let
72 | f = import ./hosts/${hostName}/hardware-configuration.nix;
73 | args = builtins.functionArgs f // {
74 | lib.mkDefault = lib.id;
75 | };
76 | in
77 | (f args).nixpkgs.hostPlatform;
78 |
79 | mkHost =
80 | name: system:
81 | lib.nixosSystem {
82 | inherit system;
83 | pkgs = importNixpkgs system nixpkgs;
84 | specialArgs = inputs // (extra-pkgs system);
85 | modules = [
86 | ./hosts/${name}
87 | ./hosts/${name}/hardware-configuration.nix
88 | ./system
89 | { networking.hostName = name; }
90 | ];
91 | };
92 | in
93 | {
94 | nixosConfigurations = lib.pipe ./hosts [
95 | builtins.readDir
96 | (lib.filterAttrs (_: type: type == "directory"))
97 | (builtins.mapAttrs (name: _: mkHost name (getSystemFromHardwareConfiguration name)))
98 | ];
99 |
100 | packages = eachDefaultSystem (
101 | system:
102 | let
103 | pkgs = importNixpkgs system nixpkgs;
104 | in
105 | import ./scripts pkgs
106 | // {
107 | checks =
108 | let
109 | packages = pkgs.linkFarm "nixos-checks-packages" (
110 | lib.removeAttrs self.packages.${system} [ "checks" ]
111 | );
112 | hosts = pkgs.linkFarm "nixos-checks-hosts" (
113 | lib.mapAttrs (_: v: v.config.system.build.toplevel) self.nixosConfigurations
114 | );
115 | in
116 | pkgs.linkFarmFromDrvs "nixos-checks" [
117 | packages
118 | hosts
119 | ];
120 | }
121 | );
122 |
123 | formatter = eachDefaultSystem (
124 | system:
125 | let
126 | pkgs = nixpkgs.legacyPackages.${system};
127 | in
128 | pkgs.treefmt.withConfig {
129 | settings = lib.mkMerge [
130 | ./treefmt.nix
131 | { _module.args = { inherit pkgs; }; }
132 | ];
133 | }
134 | );
135 | };
136 | }
137 |
--------------------------------------------------------------------------------
/home/aerc.nix:
--------------------------------------------------------------------------------
1 | { conf, ... }:
2 | {
3 | programs.aerc = {
4 | enable = true;
5 | extraConfig = {
6 | ui = {
7 | fuzzy-complete = true;
8 | message-list-split = "h 20";
9 | threading-enabled = true;
10 | reverse-thread-order = true;
11 | dirlist-tree = true;
12 | };
13 |
14 | hooks.mail-received = ''dunstify "[$AERC_ACCOUNT] New mail from $AERC_FROM_NAME" "$AERC_SUBJECT"'';
15 |
16 | filters = {
17 | "text/plain" = "colorize";
18 | "text/calendar" = "calendar";
19 | "message/delivery-status" = "colorize";
20 | "message/rfc822" = "colorize";
21 | "text/html" = "! html";
22 | ".headers" = "colorize";
23 | };
24 | };
25 | extraBinds = { };
26 | };
27 |
28 | sops.secrets."aerc/accounts" = {
29 | format = "binary";
30 | sopsFile = ../secrets/aerc/accounts.conf;
31 | path = "/home/${conf.user}/.config/aerc/accounts.conf";
32 | };
33 | }
34 |
--------------------------------------------------------------------------------
/home/alacritty.nix:
--------------------------------------------------------------------------------
1 | {
2 | programs.alacritty = {
3 | enable = true;
4 | settings = {
5 | env.TERM = "xterm-256color";
6 | window = {
7 | # opacity = 0.8;
8 | title = "Alacritty";
9 | dynamic_title = false;
10 | };
11 | font = {
12 | normal.family = "MesloLGS NF";
13 | bold.family = "MesloLGS NF";
14 | italic.family = "MesloLGS NF";
15 | bold_italic.family = "MesloLGS NF";
16 | size = 10;
17 | };
18 | };
19 | };
20 | }
21 |
--------------------------------------------------------------------------------
/home/clipman.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | home.packages = [ pkgs.clipman ];
4 |
5 | # https://github.com/nix-community/home-manager/blob/master/modules/services/clipman.nix
6 | systemd.user.services.clipman = {
7 | Unit = {
8 | Description = "Clipboard management daemon";
9 | PartOf = [ "graphical-session.target" ];
10 | After = [ "graphical-session.target" ];
11 | };
12 |
13 | Service = {
14 | ExecStart = "${pkgs.wl-clipboard}/bin/wl-paste -t text --watch ${pkgs.clipman}/bin/clipman store --max-items=200";
15 | ExecReload = "${pkgs.coreutils}/bin/kill -SIGUSR2 $MAINPID";
16 | Restart = "on-failure";
17 | KillMode = "mixed";
18 | };
19 |
20 | Install.WantedBy = [ "graphical-session.target" ];
21 | };
22 | }
23 |
--------------------------------------------------------------------------------
/home/common.nix:
--------------------------------------------------------------------------------
1 | {
2 | home.sessionPath = [
3 | "$HOME/.local/bin"
4 | "$HOME/.cargo/bin"
5 | ];
6 |
7 | home.sessionVariables = {
8 | EDITOR = "hx";
9 | VISUAL = "hx";
10 | PAGER = "less -FRX";
11 | };
12 |
13 | systemd.user.startServices = "sd-switch";
14 |
15 | home.stateVersion = "22.11";
16 | }
17 |
--------------------------------------------------------------------------------
/home/default.nix:
--------------------------------------------------------------------------------
1 | let
2 | common = [
3 | ./common.nix
4 |
5 | ./direnv.nix
6 | ./fzf.nix
7 | ./helix
8 | ./nix-index.nix
9 | ./tmux.nix
10 | ./zoxide.nix
11 | ./zsh
12 | ];
13 | in
14 | {
15 | user = common ++ [
16 | ./aerc.nix
17 | ./alacritty.nix
18 | ./clipman.nix
19 | ./dunst.nix
20 | ./gammastep.nix
21 | ./git.nix
22 | ./gpg.nix
23 | ./helix/full.nix
24 | ./hyfetch.nix
25 | ./jujutsu.nix
26 | ./niri
27 | ./ntfy.nix
28 | ./packages.nix
29 | ./pass.nix
30 | ./playerctld.nix
31 | ./programming
32 | ./rofi
33 | ./sops.nix
34 | ./ssh.nix
35 | ./syncthing.nix
36 | ./theme.nix
37 | ./vscodium.nix
38 | ./waybar.nix
39 | ./xournalpp
40 | ./yubikey.nix
41 | ./zsh/full.nix
42 | ];
43 |
44 | root = common;
45 | }
46 |
--------------------------------------------------------------------------------
/home/direnv.nix:
--------------------------------------------------------------------------------
1 | {
2 | programs.direnv = {
3 | enable = true;
4 | nix-direnv.enable = true;
5 | };
6 | }
7 |
--------------------------------------------------------------------------------
/home/dunst.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | services.dunst = {
4 | enable = true;
5 | settings =
6 | let
7 | transparency = "DD";
8 | in
9 | {
10 | global = {
11 | follow = "mouse";
12 | width = 300;
13 | height = 300;
14 | origin = "top-right";
15 | offset = "10x50";
16 | scale = 0;
17 | notification_limit = 0;
18 |
19 | indicate_hidden = true;
20 | separator_height = 2;
21 | padding = 6;
22 | horizontal_padding = 6;
23 | text_icon_padding = 0;
24 | frame_width = 3;
25 | frame_color = "#8EC07C${transparency}";
26 | sort = true;
27 | idle_threshold = 0;
28 |
29 | font = "Meslo Nerd Font 11";
30 | line_height = 3;
31 | markup = "full";
32 | format = "%s\\n%b";
33 | alignment = "center";
34 | vertical_alignment = "top";
35 | show_age_threshold = 10;
36 | ellipsize = "middle";
37 | ignore_newline = false;
38 | stack_duplicates = true;
39 | hide_duplicate_count = false;
40 | show_indicators = true;
41 |
42 | icon_position = "left";
43 | min_icon_size = 0;
44 | max_icon_size = 32;
45 |
46 | sticky_history = true;
47 | history_length = 10000;
48 |
49 | dmenu = "${pkgs.rofi}/bin/rofi -dmenu";
50 | browser = "xdg-open";
51 | always_run_script = true;
52 | title = "Dunst";
53 | class = "Dunst";
54 | corner_radius = 0;
55 |
56 | mouse_left_click = "close_current";
57 | mouse_middle_click = "do_action, close_current";
58 | mouse_right_click = "close_all";
59 | };
60 |
61 | urgency_low = {
62 | background = "#191311${transparency}";
63 | foreground = "#3B7C87${transparency}";
64 | frame_color = "#3B7C87${transparency}";
65 | timeout = 10;
66 | };
67 | urgency_normal = {
68 | background = "#191311${transparency}";
69 | foreground = "#5B8234${transparency}";
70 | frame_color = "#5B8234${transparency}";
71 | timeout = 10;
72 | };
73 | urgency_critical = {
74 | background = "#191311${transparency}";
75 | foreground = "#B7472A${transparency}";
76 | frame_color = "#B7472A${transparency}";
77 | timeout = 0;
78 | };
79 | };
80 | };
81 | }
82 |
--------------------------------------------------------------------------------
/home/fzf.nix:
--------------------------------------------------------------------------------
1 | {
2 | programs.fzf = {
3 | enable = true;
4 | };
5 | }
6 |
--------------------------------------------------------------------------------
/home/gammastep.nix:
--------------------------------------------------------------------------------
1 | {
2 | services.gammastep = {
3 | enable = true;
4 | provider = "geoclue2";
5 | temperature = {
6 | day = 6500;
7 | night = 4000;
8 | };
9 | settings.general = {
10 | brightness-day = 1.0;
11 | brightness-night = 1.0;
12 | };
13 | };
14 | }
15 |
--------------------------------------------------------------------------------
/home/git.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 |
3 | {
4 | programs.git = {
5 | enable = true;
6 | package = pkgs.gitFull;
7 | userName = "Defelo";
8 | userEmail = "mail@defelo.de";
9 | difftastic.enable = true;
10 | ignores = [
11 | ".direnv"
12 | ".devenv"
13 | "result"
14 | "result-*"
15 | "repl-result-*"
16 | ];
17 | extraConfig = {
18 | init.defaultBranch = "main";
19 | push.default = "upstream";
20 | rerere.enabled = true;
21 | merge.conflictStyle = "zdiff3";
22 | diff.algorithm = "histogram";
23 | diff.submodule = "log";
24 | diff.sopsdiffer.textconv =
25 | let
26 | conf = builtins.toFile "sops.yaml" (
27 | builtins.toJSON {
28 | creation_rules = [
29 | { key_groups = [ { pgp = [ "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64" ]; } ]; }
30 | ];
31 | }
32 | );
33 | in
34 | "${pkgs.sops}/bin/sops --config ${conf} -d";
35 | sendemail = {
36 | smtpserver = "mail.defelo.de";
37 | smtpuser = "mail@defelo.de";
38 | smtpencryption = "ssl";
39 | smtpserverport = 465;
40 | annotate = true;
41 | };
42 | credential."smtp://mail.defelo.de:465".helper =
43 | let
44 | helper = pkgs.writeShellScript "git-credential-helper" ''
45 | [[ "$1" = get ]] || exit 1
46 | pw=$(pass email/mail@defelo.de)
47 | echo "password=$pw"
48 | '';
49 | in
50 | ''!${helper} "$@"'';
51 | };
52 | };
53 | }
54 |
--------------------------------------------------------------------------------
/home/gpg.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | programs.gpg = {
4 | enable = true;
5 | settings.trust-model = "tofu+pgp";
6 | scdaemonSettings = {
7 | disable-ccid = true;
8 | pcsc-driver = "${pkgs.pcsclite.lib}/lib/libpcsclite.so.1";
9 | card-timeout = "1";
10 | reader-port = "Yubico YubiKey";
11 | };
12 | };
13 |
14 | services.gpg-agent = {
15 | enable = true;
16 | pinentry.package = pkgs.pinentry-gnome3;
17 | enableSshSupport = true;
18 | sshKeys = [ "D2277B1C3C924964972148EF590B9F083697F9A8" ];
19 | enableExtraSocket = true;
20 | };
21 | }
22 |
--------------------------------------------------------------------------------
/home/helix/default.nix:
--------------------------------------------------------------------------------
1 | { pkgs, helix, ... }:
2 | {
3 | programs.helix = {
4 | enable = true;
5 | package = helix.packages.${pkgs.system}.default;
6 | settings = {
7 | theme = "dark_plus";
8 | editor = {
9 | line-number = "relative";
10 | mouse = false;
11 | cursorline = true;
12 | cursor-shape = {
13 | insert = "bar";
14 | normal = "block";
15 | select = "underline";
16 | };
17 | file-picker = {
18 | hidden = false;
19 | };
20 | statusline = {
21 | left = [
22 | "mode"
23 | "spinner"
24 | ];
25 | center = [
26 | "file-name"
27 | "read-only-indicator"
28 | "file-modification-indicator"
29 | ];
30 | right = [
31 | "version-control"
32 | "diagnostics"
33 | "selections"
34 | "register"
35 | "position"
36 | "position-percentage"
37 | "file-encoding"
38 | "file-line-ending"
39 | "file-type"
40 | ];
41 | separator = "|";
42 | };
43 | lsp = {
44 | display-messages = true;
45 | display-inlay-hints = true;
46 | };
47 | indent-guides = {
48 | render = true;
49 | };
50 | idle-timeout = 0;
51 | bufferline = "always";
52 | soft-wrap = {
53 | enable = true;
54 | };
55 | inline-diagnostics = {
56 | cursor-line = "hint";
57 | other-lines = "warning";
58 | };
59 | };
60 | keys = {
61 | normal = {
62 | "0" = "goto_line_start";
63 | "$" = "goto_line_end";
64 | "G" = "goto_last_line";
65 | "C-h" = "jump_view_left";
66 | "C-j" = "jump_view_down";
67 | "C-k" = "jump_view_up";
68 | "C-l" = "jump_view_right";
69 | "ö" = "goto_word";
70 | };
71 | select = {
72 | "0" = "goto_line_start";
73 | "$" = "goto_line_end";
74 | "G" = "goto_last_line";
75 | "ö" = "extend_to_word";
76 | };
77 | insert = {
78 | "C-space" = "completion";
79 | };
80 | };
81 | };
82 | };
83 | }
84 |
--------------------------------------------------------------------------------
/home/helix/full.nix:
--------------------------------------------------------------------------------
1 | { lib, pkgs, ... }:
2 | {
3 | imports = [ ./. ];
4 |
5 | programs.helix.languages = {
6 | language-server = {
7 | rust-analyzer = {
8 | config = {
9 | checkOnSave.command = "clippy";
10 | cargo.features = "all";
11 | cargo.unsetTest = [ ];
12 | };
13 | };
14 | pyright = {
15 | command = "${pkgs.pyright}/bin/pyright-langserver";
16 | args = [ "--stdio" ];
17 | config = { };
18 | };
19 | nil.command = "${pkgs.nil}/bin/nil";
20 | bash-language-server = {
21 | command = "${pkgs.bash-language-server}/bin/bash-language-server";
22 | args = [ "start" ];
23 | };
24 | uiua = {
25 | command = "${pkgs.uiua}/bin/uiua";
26 | args = [ "lsp" ];
27 | };
28 | haskell = {
29 | command = "${pkgs.haskell-language-server}/bin/haskell-language-server-wrapper";
30 | args = [ "lsp" ];
31 | };
32 | };
33 | language = [
34 | {
35 | name = "python";
36 | auto-format = true;
37 | language-servers = [ { name = "pyright"; } ];
38 | formatter = {
39 | command = "/bin/sh";
40 | args = [
41 | "-c"
42 | "${pkgs.isort}/bin/isort - | ${pkgs.black}/bin/black -q -l 120 -C -"
43 | ];
44 | };
45 | }
46 | {
47 | name = "nix";
48 | auto-format = true;
49 | language-servers = [ { name = "nil"; } ];
50 | formatter = {
51 | command = lib.getExe pkgs.nixfmt-rfc-style;
52 | args = [ "-s" ];
53 | };
54 | }
55 | # {
56 | # name = "latex";
57 | # auto-format = true;
58 | # language-server.command = "${pkgs.texlab}/bin/texlab";
59 | # }
60 | {
61 | name = "bash";
62 | auto-format = true;
63 | }
64 | {
65 | name = "uiua";
66 | scope = "source.uiua";
67 | injection-regex = "uiua";
68 | file-types = [ "ua" ];
69 | roots = [ ];
70 | auto-format = true;
71 | comment-token = "#";
72 | language-servers = [ { name = "uiua"; } ];
73 | indent = {
74 | tab-width = 2;
75 | unit = " ";
76 | };
77 | shebangs = [ "uiua" ];
78 | }
79 | {
80 | name = "haskell";
81 | auto-format = true;
82 | language-servers = [ { name = "haskell"; } ];
83 | formatter = {
84 | command = "${pkgs.ormolu}/bin/ormolu";
85 | args = [ "--no-cabal" ];
86 | };
87 | }
88 | ];
89 | };
90 | }
91 |
--------------------------------------------------------------------------------
/home/hyfetch.nix:
--------------------------------------------------------------------------------
1 | {
2 | programs.hyfetch = {
3 | enable = true;
4 | settings = {
5 | preset = "rainbow";
6 | mode = "rgb";
7 | light_dark = "dark";
8 | lightness = 0.65;
9 | color_align.mode = "horizontal";
10 | backend = "fastfetch";
11 | };
12 | };
13 |
14 | programs.fastfetch.enable = true;
15 | }
16 |
--------------------------------------------------------------------------------
/home/jujutsu.nix:
--------------------------------------------------------------------------------
1 | { lib, pkgs, ... }:
2 |
3 | {
4 | programs.jujutsu = {
5 | enable = true;
6 | settings = {
7 | user = {
8 | name = "Defelo";
9 | email = "mail@defelo.de";
10 | };
11 | signing = {
12 | behavior = "drop";
13 | backend = "gpg";
14 | };
15 | ui = {
16 | default-command = [ "log" ];
17 | show-cryptographic-signatures = true;
18 | diff-formatter = [
19 | (lib.getExe pkgs.difftastic)
20 | "--color=always"
21 | "--background=light"
22 | "--display=side-by-side"
23 | "$left"
24 | "$right"
25 | ];
26 | diff-editor = ":builtin";
27 | };
28 | git = {
29 | sign-on-push = true;
30 | private-commits = "private()";
31 | };
32 | templates = {
33 | log = "builtin_log_comfortable";
34 | };
35 | revset-aliases = {
36 | "private()" = ''subject(regex:"^(private|wip)(:|$)")'';
37 | };
38 | };
39 | };
40 | }
41 |
--------------------------------------------------------------------------------
/home/niri/config.kdl:
--------------------------------------------------------------------------------
1 | environment {
2 | SDL_VIDEODRIVER "wayland"
3 | QT_QPA_PLATFORM "wayland"
4 | QT_WAYLAND_DISABLE_WINDOWDECORATION "1"
5 | _JAVA_AWT_WM_NONREPARENTING "1"
6 | MOZ_ENABLE_WAYLAND "1"
7 | XDG_CURRENT_DESKTOP "niri"
8 | XDG_SESSION_DESKTOP "niri"
9 | NIXOS_OZONE_WL "1"
10 | DISPLAY ":0"
11 | }
12 |
13 | input {
14 | keyboard {
15 | xkb {
16 | layout "de,us,epo"
17 | options "grp:shifts_toggle"
18 | variant "nodeadkeys,,"
19 | }
20 | }
21 |
22 | touchpad {
23 | tap
24 | natural-scroll
25 | }
26 |
27 | tablet {
28 | map-to-output "eDP-1"
29 | }
30 |
31 | focus-follows-mouse max-scroll-amount="0%"
32 | disable-power-key-handling
33 | }
34 |
35 | output "eDP-1" {
36 | mode "2560x1600"
37 | position x=0 y=0
38 | scale 1.25
39 | }
40 |
41 | output "HDMI-A-1" {
42 | mode "1280x1024"
43 | position x=-1280 y=0
44 | scale 1
45 | }
46 |
47 | layout {
48 | gaps 0
49 |
50 | center-focused-column "never"
51 |
52 | preset-column-widths {
53 | proportion 0.33333
54 | proportion 0.5
55 | proportion 0.66667
56 | }
57 |
58 | default-column-width { proportion 0.5; }
59 |
60 | focus-ring { off; }
61 |
62 | border { off; }
63 | }
64 |
65 | prefer-no-csd
66 |
67 | screenshot-path null
68 |
69 | binds {
70 | Mod+Return { spawn "alacritty" "-e" "sh" "-c" "tmux new -d -- && tmux set-option detach-on-destroy on && exec tmux a"; }
71 | Mod+Shift+Return { spawn "alacritty"; }
72 |
73 | Mod+D { spawn "rofi" "-combi-modi" "drun,ssh,run" "-modi" "combi" "-show" "combi" "-show-icons"; }
74 | Mod+Shift+Y { spawn @lock-command@; }
75 |
76 | XF86AudioRaiseVolume { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.05+"; }
77 | XF86AudioLowerVolume { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.05-"; }
78 | XF86AudioMute { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
79 | XF86AudioMicMute { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
80 | Shift+XF86AudioRaiseVolume { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SOURCE@" "0.05+"; }
81 | Shift+XF86AudioLowerVolume { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SOURCE@" "0.05-"; }
82 |
83 | XF86AudioPlay { spawn "playerctl" "play-pause"; }
84 | XF86AudioStop { spawn "playerctl" "stop"; }
85 | XF86AudioNext { spawn "playerctl" "next"; }
86 | XF86AudioPrev { spawn "playerctl" "previous"; }
87 |
88 | XF86MonBrightnessUp { spawn "light" "-A" "5"; }
89 | XF86MonBrightnessDown { spawn "light" "-U" "5"; }
90 | Shift+XF86MonBrightnessUp { spawn "light" "-A" "1"; }
91 | Shift+XF86MonBrightnessDown { spawn "light" "-U" "1"; }
92 |
93 | Mod+Shift+Q { close-window; }
94 |
95 | Mod+H { focus-column-or-monitor-left; }
96 | Mod+J { focus-window-or-workspace-down; }
97 | Mod+K { focus-window-or-workspace-up; }
98 | Mod+L { focus-column-or-monitor-right; }
99 |
100 | Mod+Shift+H { move-column-left-or-to-monitor-left; }
101 | Mod+Shift+J { move-window-down-or-to-workspace-down; }
102 | Mod+Shift+K { move-window-up-or-to-workspace-up; }
103 | Mod+Shift+L { move-column-right-or-to-monitor-right; }
104 |
105 | Mod+Ctrl+H { focus-monitor-left; }
106 | Mod+Ctrl+J { focus-monitor-down; }
107 | Mod+Ctrl+K { focus-monitor-up; }
108 | Mod+Ctrl+L { focus-monitor-right; }
109 |
110 | Mod+Ctrl+Shift+H { move-column-to-monitor-left; }
111 | Mod+Ctrl+Shift+J { move-column-to-monitor-down; }
112 | Mod+Ctrl+Shift+K { move-column-to-monitor-up; }
113 | Mod+Ctrl+Shift+L { move-column-to-monitor-right; }
114 |
115 | Mod+N { focus-workspace-down; }
116 | Mod+P { focus-workspace-up; }
117 | Mod+Shift+N { move-column-to-workspace-down; }
118 | Mod+Shift+P { move-column-to-workspace-up; }
119 | Mod+Ctrl+N { move-workspace-down; }
120 | Mod+Ctrl+P { move-workspace-up; }
121 |
122 | Mod+1 { focus-workspace 1; }
123 | Mod+2 { focus-workspace 2; }
124 | Mod+3 { focus-workspace 3; }
125 | Mod+4 { focus-workspace 4; }
126 | Mod+5 { focus-workspace 5; }
127 | Mod+6 { focus-workspace 6; }
128 | Mod+7 { focus-workspace 7; }
129 | Mod+8 { focus-workspace 8; }
130 | Mod+9 { focus-workspace 9; }
131 | Mod+0 { focus-workspace 10; }
132 | Mod+Ctrl+1 { move-column-to-workspace 1; }
133 | Mod+Ctrl+2 { move-column-to-workspace 2; }
134 | Mod+Ctrl+3 { move-column-to-workspace 3; }
135 | Mod+Ctrl+4 { move-column-to-workspace 4; }
136 | Mod+Ctrl+5 { move-column-to-workspace 5; }
137 | Mod+Ctrl+6 { move-column-to-workspace 6; }
138 | Mod+Ctrl+7 { move-column-to-workspace 7; }
139 | Mod+Ctrl+8 { move-column-to-workspace 8; }
140 | Mod+Ctrl+9 { move-column-to-workspace 9; }
141 | Mod+Ctrl+0 { move-column-to-workspace 10; }
142 |
143 | Mod+Tab { focus-workspace-previous; }
144 |
145 | Mod+I { consume-or-expel-window-left; }
146 | Mod+O { consume-or-expel-window-right; }
147 |
148 | Mod+R { switch-preset-column-width; }
149 | Mod+Shift+R { switch-preset-window-height; }
150 | Mod+Ctrl+R { reset-window-height; }
151 | Mod+F { maximize-column; }
152 | Mod+Shift+F { fullscreen-window; }
153 | Mod+C { center-column; }
154 |
155 | Mod+Minus { set-column-width "-10%"; }
156 | Mod+Plus { set-column-width "+10%"; }
157 |
158 | Mod+Shift+Minus { set-window-height "-10%"; }
159 | Mod+Shift+Plus { set-window-height "+10%"; }
160 |
161 | Mod+Space { switch-focus-between-floating-and-tiling; }
162 | Mod+Shift+Space { toggle-window-floating; }
163 | Mod+Ctrl+Space { toggle-overview; }
164 |
165 | Mod+Numbersign { screenshot; }
166 | Mod+Shift+Numbersign { screenshot-window; }
167 | Mod+Ctrl+Numbersign { screenshot-screen; }
168 |
169 | Mod+KP_Add { spawn "dunstctl" "set-paused" "toggle"; }
170 | Mod+Comma { spawn "dunstctl" "close"; }
171 | Mod+Shift+Comma { spawn "dunstctl" "close-all"; }
172 | Mod+Shift+Period { spawn "dunstctl" "history-pop"; }
173 | Mod+Period { spawn "dunstctl" "context"; }
174 |
175 | Mod+M { spawn "clipman" "pick" "-t" "rofi"; }
176 | Mod+Shift+M { spawn "clipman" "clear" "-t" "rofi"; }
177 | Mod+Ctrl+M { spawn "@rofipass-command@"; }
178 |
179 | Mod+Shift+E { quit; }
180 | }
181 |
182 | cursor {
183 | hide-when-typing
184 | }
185 |
186 | hotkey-overlay {
187 | skip-at-startup
188 | }
189 |
--------------------------------------------------------------------------------
/home/niri/default.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | lib,
4 | pkgs,
5 | ...
6 | }:
7 | let
8 | lock-command = map (x: ''"${x}"'') [
9 | (lib.getExe pkgs.swaylock-effects)
10 | "--screenshots"
11 | "--clock"
12 | "--submit-on-touch"
13 | "--show-failed-attempts"
14 | "--effect-pixelate=8"
15 | "--fade-in=0.5"
16 | ];
17 |
18 | rofipass-command =
19 | let
20 | runtimeDependencies = lib.attrValues {
21 | inherit (pkgs)
22 | pass
23 | wl-clipboard
24 | rofi-wayland
25 | dunst
26 | clipman
27 | ;
28 | };
29 | in
30 | pkgs.writeShellScript "rofipass-wrapped.sh" ''
31 | export PASSWORD_STORE_DIR=${lib.escapeShellArg config.programs.password-store.settings.PASSWORD_STORE_DIR}
32 | export PATH=${lib.makeBinPath runtimeDependencies}:$PATH
33 | exec -a rofipass.sh ${../scripts/rofipass.sh} "$@"
34 | '';
35 | in
36 | {
37 | home.file.".config/niri/config.kdl".source = pkgs.replaceVars ./config.kdl {
38 | inherit lock-command rofipass-command;
39 | DEFAULT_AUDIO_SINK = null;
40 | DEFAULT_AUDIO_SOURCE = null;
41 | };
42 |
43 | systemd.user.services.swaybg = {
44 | Unit = {
45 | PartOf = [ "graphical-session.target" ];
46 | After = [ "graphical-session.target" ];
47 | };
48 |
49 | Service = {
50 | ExecStart = "${lib.getExe pkgs.swaybg} -m fill -i ${../../wallpapers/nix-snowflake-dark.png}";
51 | Restart = "on-failure";
52 | };
53 |
54 | Install.WantedBy = [ "graphical-session.target" ];
55 | };
56 |
57 | systemd.user.services.xwayland-satellite = {
58 | Unit = {
59 | PartOf = [ "graphical-session.target" ];
60 | After = [ "graphical-session.target" ];
61 | };
62 |
63 | Service = {
64 | ExecStart = "${lib.getExe pkgs.xwayland-satellite} :0";
65 | Restart = "on-failure";
66 | };
67 |
68 | Install.WantedBy = [ "graphical-session.target" ];
69 | };
70 |
71 | xdg.autostart.enable = false;
72 | }
73 |
--------------------------------------------------------------------------------
/home/nix-index.nix:
--------------------------------------------------------------------------------
1 | { nix-index-database, ... }:
2 | {
3 | imports = [ nix-index-database.hmModules.nix-index ];
4 | programs.nix-index = {
5 | enable = true;
6 | enableZshIntegration = false;
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/home/ntfy.nix:
--------------------------------------------------------------------------------
1 | {
2 | conf,
3 | config,
4 | pkgs,
5 | ...
6 | }:
7 | {
8 | systemd.user.services.ntfy-sub = {
9 | Install.WantedBy = [ "default.target" ];
10 | Unit.After = [
11 | "sops-nix.service"
12 | "dunst.service"
13 | ];
14 | Service = {
15 | ExecStart = "${pkgs.bash}/bin/bash ${./scripts/ntfy-sub.sh} ${config.sops.secrets.ntfy.path}";
16 | Environment =
17 | let
18 | runtimeDependencies = builtins.attrValues {
19 | inherit (pkgs)
20 | coreutils
21 | jq
22 | dunst
23 | xdg-utils
24 | ntfy-sh
25 | ;
26 | };
27 | in
28 | "PATH=${pkgs.lib.makeBinPath runtimeDependencies}";
29 | };
30 | };
31 |
32 | home.packages = [ pkgs.ntfy-sh ];
33 | programs.zsh.shellAliases.ny = "ntfy pub defelo";
34 |
35 | sops.secrets.ntfy = {
36 | sopsFile = ../secrets/ntfy;
37 | format = "binary";
38 | path = "/home/${conf.user}/.config/ntfy/client.yml";
39 | };
40 | }
41 |
--------------------------------------------------------------------------------
/home/packages.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 |
3 | {
4 | home.packages = builtins.attrValues {
5 | inherit (pkgs)
6 | # programming
7 | gcc
8 | gnumake
9 | git-crypt
10 | just
11 |
12 | # browsers
13 | brave
14 | tor-browser-bundle-bin
15 |
16 | # communication
17 | discord-canary
18 | element-desktop
19 |
20 | # games
21 | prismlauncher
22 | mindustry-wayland
23 |
24 | # system
25 | pulsemixer
26 | pavucontrol
27 | playerctl
28 | nix-output-monitor
29 | wl-clipboard
30 | xdg-utils
31 | virt-manager
32 | wdisplays
33 | slurp
34 | grim
35 | swappy
36 | wl-mirror
37 | wayvnc
38 |
39 | # utils
40 | feh
41 | eog
42 | speedtest-cli
43 | pwgen
44 | xkcdpass
45 | gh
46 | imagemagick
47 | termshot
48 | bc
49 | inotify-tools
50 |
51 | obsidian
52 | vlc
53 |
54 | spotify
55 | rnote
56 | zotero
57 | ;
58 |
59 | tex = pkgs.texlive.combined.scheme-full;
60 |
61 | networkmanagerapplet = pkgs.networkmanagerapplet.overrideAttrs (attrs: {
62 | postFixup = ''
63 | ${attrs.postFixup or ""}
64 | rm -r $out/etc/xdg/autostart
65 | '';
66 | });
67 | };
68 | }
69 |
--------------------------------------------------------------------------------
/home/pass.nix:
--------------------------------------------------------------------------------
1 | { conf, ... }:
2 | {
3 | programs.password-store = {
4 | enable = true;
5 | settings = {
6 | PASSWORD_STORE_DIR = "/home/${conf.user}/.password-store";
7 | PASSWORD_STORE_CLIP_TIME = "20";
8 | };
9 | };
10 | }
11 |
--------------------------------------------------------------------------------
/home/persistence.nix:
--------------------------------------------------------------------------------
1 | {
2 | data = {
3 | directories = [
4 | ".config/dconf"
5 | ".config/fcitx5"
6 | ".config/gh"
7 | ".config/syncthing"
8 | ".config/Signal"
9 | ".gnupg"
10 | ".local/share/Mindustry"
11 | ".local/share/Paradox Interactive"
12 | ".local/share/PrismLauncher/instances"
13 | ".local/share/zoxide"
14 | ".password-store"
15 | ".ssh"
16 | ".timetracker"
17 | ".zotero"
18 |
19 | "nixos"
20 | "Persistent"
21 | "Zotero"
22 | ];
23 | files = [ ];
24 | };
25 |
26 | cache = {
27 | directories = [
28 | ".cache/nix"
29 | ".cache/spotify"
30 | ".cache/zotero"
31 | ".cargo"
32 | ".config/BraveSoftware"
33 | ".config/Element"
34 | ".config/discordcanary"
35 | ".config/obsidian"
36 | ".config/spotify"
37 | ".local/share/PrismLauncher"
38 | ".local/share/Steam"
39 | ".local/share/containers"
40 | # ".local/share/waydroid"
41 | ".local/state/wireplumber"
42 | "Downloads"
43 | ];
44 | files = [ ".local/share/nix/trusted-settings.json" ];
45 | };
46 | }
47 |
--------------------------------------------------------------------------------
/home/playerctld.nix:
--------------------------------------------------------------------------------
1 | {
2 | services.playerctld = {
3 | enable = true;
4 | };
5 | }
6 |
--------------------------------------------------------------------------------
/home/programming/default.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | imports = [
4 | ./nix.nix
5 | ./python.nix
6 | ./rust.nix
7 | ./uiua.nix
8 | ];
9 |
10 | home.packages = builtins.attrValues {
11 | inherit (pkgs) nodejs lean4;
12 | inherit (pkgs.nodePackages) "@angular/cli" live-server;
13 | };
14 | }
15 |
--------------------------------------------------------------------------------
/home/programming/nix.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | home.packages = builtins.attrValues {
4 | inherit (pkgs)
5 | # rnix-lsp
6 | nixfmt-rfc-style
7 | ;
8 | };
9 | }
10 |
--------------------------------------------------------------------------------
/home/programming/python.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | home.packages = builtins.attrValues {
4 | python = pkgs.python313.withPackages (p: builtins.attrValues { inherit (p) numpy requests; });
5 |
6 | inherit (pkgs)
7 | poetry
8 | poethepoet
9 | pyright
10 | ruff
11 | ;
12 | };
13 | }
14 |
--------------------------------------------------------------------------------
/home/programming/rust.nix:
--------------------------------------------------------------------------------
1 | {
2 | conf,
3 | pkgs,
4 | fenix,
5 | ...
6 | }:
7 | {
8 | home.packages = builtins.attrValues {
9 | rust =
10 | let
11 | inherit (fenix.packages.${pkgs.system}) combine complete targets;
12 | in
13 | combine [
14 | complete.toolchain
15 | targets.x86_64-unknown-linux-musl.latest.rust-std
16 | targets.wasm32-unknown-unknown.latest.rust-std
17 | ];
18 |
19 | inherit (pkgs)
20 | bacon
21 | cargo-audit
22 | cargo-expand
23 | cargo-hack
24 | ;
25 | };
26 |
27 | home.file.cargo = {
28 | text = ''
29 | [target.x86_64-unknown-linux-gnu]
30 | linker = "${pkgs.clang}/bin/clang"
31 | rustflags = ["-C", "link-arg=--ld-path=${pkgs.mold}/bin/mold"]
32 |
33 | [registries.crates-io]
34 | protocol = "sparse"
35 |
36 | [build]
37 | target-dir = "/home/${conf.user}/.cargo/target"
38 |
39 | [profile.dev]
40 | opt-level = 1
41 | codegen-backend = "cranelift"
42 |
43 | [profile.dev.package."curve25519-dalek"]
44 | codegen-backend = "llvm"
45 | [profile.dev.package."httparse"]
46 | codegen-backend = "llvm"
47 |
48 | [unstable]
49 | codegen-backend = true
50 | '';
51 | target = ".cargo/config.toml";
52 | };
53 | home.file.rustfmt = {
54 | text = ''
55 | format_code_in_doc_comments = true
56 | format_macro_bodies = true
57 | # format_macro_matchers = true
58 | format_strings = true
59 | group_imports = "StdExternalCrate"
60 | imports_granularity = "Crate"
61 | unstable_features = true
62 | wrap_comments = true
63 | '';
64 | target = ".config/rustfmt/rustfmt.toml";
65 | };
66 |
67 | programs.zsh.shellAliases.rl = "CARGO_PROFILE_DEV_CODEGEN_BACKEND=llvm";
68 | }
69 |
--------------------------------------------------------------------------------
/home/programming/uiua.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | home.packages = [ pkgs.uiua ];
4 | }
5 |
--------------------------------------------------------------------------------
/home/rofi/default.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | programs.rofi = {
4 | enable = true;
5 | package = pkgs.rofi-wayland;
6 | theme = ./nord.rasi;
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/home/rofi/nord.rasi:
--------------------------------------------------------------------------------
1 | * {
2 | nord0: #2e3440;
3 | nord1: #3b4252;
4 | nord2: #434c5e;
5 | nord3: #4c566a;
6 | nord4: #d8dee9;
7 | nord5: #e5e9f0;
8 | nord6: #eceff4;
9 | nord7: #8fbcbb;
10 | nord8: #88c0d0;
11 | nord9: #81a1c1;
12 | nord10: #5e81ac;
13 | nord11: #bf616a;
14 | nord12: #d08770;
15 | nord13: #ebcb8b;
16 | nord14: #a3be8c;
17 | nord15: #b48ead;
18 |
19 | spacing: 2;
20 | background-color: var(nord1);
21 |
22 | background: var(nord1);
23 | foreground: var(nord4);
24 |
25 | normal-background: var(background);
26 | normal-foreground: var(foreground);
27 | alternate-normal-background: var(background);
28 | alternate-normal-foreground: var(foreground);
29 | selected-normal-background: var(nord8);
30 | selected-normal-foreground: var(background);
31 |
32 | active-background: var(background);
33 | active-foreground: var(nord10);
34 | alternate-active-background: var(background);
35 | alternate-active-foreground: var(nord10);
36 | selected-active-background: var(nord10);
37 | selected-active-foreground: var(background);
38 |
39 | urgent-background: var(background);
40 | urgent-foreground: var(nord11);
41 | alternate-urgent-background: var(background);
42 | alternate-urgent-foreground: var(nord11);
43 | selected-urgent-background: var(nord11);
44 | selected-urgent-foreground: var(background);
45 | }
46 | element {
47 | padding: 0px 0px 0px 7px;
48 | spacing: 5px;
49 | border: 0;
50 | cursor: pointer;
51 | }
52 | element normal.normal {
53 | background-color: var(normal-background);
54 | text-color: var(normal-foreground);
55 | }
56 | element normal.urgent {
57 | background-color: var(urgent-background);
58 | text-color: var(urgent-foreground);
59 | }
60 | element normal.active {
61 | background-color: var(active-background);
62 | text-color: var(active-foreground);
63 | }
64 | element selected.normal {
65 | background-color: var(selected-normal-background);
66 | text-color: var(selected-normal-foreground);
67 | }
68 | element selected.urgent {
69 | background-color: var(selected-urgent-background);
70 | text-color: var(selected-urgent-foreground);
71 | }
72 | element selected.active {
73 | background-color: var(selected-active-background);
74 | text-color: var(selected-active-foreground);
75 | }
76 | element alternate.normal {
77 | background-color: var(alternate-normal-background);
78 | text-color: var(alternate-normal-foreground);
79 | }
80 | element alternate.urgent {
81 | background-color: var(alternate-urgent-background);
82 | text-color: var(alternate-urgent-foreground);
83 | }
84 | element alternate.active {
85 | background-color: var(alternate-active-background);
86 | text-color: var(alternate-active-foreground);
87 | }
88 | element-text {
89 | background-color: rgba(0, 0, 0, 0%);
90 | text-color: inherit;
91 | highlight: inherit;
92 | cursor: inherit;
93 | }
94 | element-icon {
95 | background-color: rgba(0, 0, 0, 0%);
96 | size: 1.0000em;
97 | text-color: inherit;
98 | cursor: inherit;
99 | }
100 | window {
101 | width: 75%;
102 | height: 75%;
103 | padding: 0;
104 | border: 0;
105 | background-color: var(background);
106 | }
107 | mainbox {
108 | padding: 0;
109 | border: 0;
110 | }
111 | message {
112 | margin: 0px 7px;
113 | }
114 | textbox {
115 | text-color: var(foreground);
116 | }
117 | listview {
118 | margin: 0px 0px 5px;
119 | scrollbar: true;
120 | spacing: 2px;
121 | fixed-height: 0;
122 | }
123 | scrollbar {
124 | padding: 0;
125 | handle-width: 14px;
126 | border: 0;
127 | handle-color: var(nord3);
128 | }
129 | button {
130 | spacing: 0;
131 | text-color: var(normal-foreground);
132 | cursor: pointer;
133 | }
134 | button selected {
135 | background-color: var(selected-normal-background);
136 | text-color: var(selected-normal-foreground);
137 | }
138 | inputbar {
139 | padding: 7px;
140 | margin: 7px;
141 | spacing: 0;
142 | text-color: var(normal-foreground);
143 | background-color: var(nord3);
144 | children: [ entry ];
145 | }
146 | entry {
147 | spacing: 0;
148 | cursor: text;
149 | text-color: var(normal-foreground);
150 | background-color: var(nord3);
151 | }
152 |
--------------------------------------------------------------------------------
/home/scripts/download_rss.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | download_from_rss() {
6 | d=$(curl -s "$1" | xq -r ".rss.channel.item[${3:-0}]")
7 | jq -r .title <<<"$d"
8 | url=$(jq -r '.enclosure."@url"' <<<"$d")
9 | echo "$url"
10 | pub=$(jq -r '.pubDate' <<<"$d")
11 | name=$(date -d "$pub" +"$2_%Y_%m_%d.mp4")
12 | wget --continue -O "$name" "$url"
13 | }
14 |
15 | future=$3
16 | declare -A urls=(
17 | ["x3"]="https://mediathekviewweb.de/feed?query=extra%203%20vom&future=$future"
18 | ["hs"]="https://mediathekviewweb.de/feed?query=heute-show%20!ZDF&future=$future"
19 | ["zmr"]="https://mediathekviewweb.de/feed?query=zdf%20magazin%20royale%20!ZDF&future=$future"
20 | ["m"]="https://mediathekviewweb.de/feed?query=!zdf%20wir%20sind%20die%20meiers&future=$future"
21 | ["zcs"]="https://mediathekviewweb.de/feed?query=!zdf%20zdf%20comedy%20sommer&future=$future"
22 | ["anstalt"]="https://mediathekviewweb.de/feed?query=!zdf%20die%20anstalt&future=$future"
23 | )
24 |
25 | download_from_rss "${urls[$1]}" "$1" ${2:-0}
26 |
--------------------------------------------------------------------------------
/home/scripts/mount.sh:
--------------------------------------------------------------------------------
1 | #!/bin/zsh
2 |
3 | usage() {
4 | echo "usage: mnt "
5 | }
6 |
7 | if ! (return 0 2>/dev/null); then
8 | usage
9 | exit 1
10 | fi
11 |
12 | if [[ $# -ne 2 ]]; then
13 | usage
14 | return 1
15 | fi
16 |
17 | uid=$(id -u)
18 | gid=$(id -g)
19 |
20 | if ! lsblk $1 &>/dev/null; then
21 | echo "'$1' is not a block device"
22 | return 3
23 | fi
24 |
25 | fs=$(lsblk -f $1 | tail -1 | awk '{print $2}')
26 |
27 | case $fs in
28 | ext4)
29 | sudo mount -m $1 $2
30 | ;;
31 |
32 | vfat | exfat)
33 | sudo mount -m -o uid=$uid,gid=$gid $1 $2
34 | ;;
35 |
36 | *)
37 | echo "filesystem '$fs' is not supported"
38 | return 2
39 | ;;
40 | esac
41 |
42 | sudo chown $uid:$gid $2
43 | cd $2
44 |
--------------------------------------------------------------------------------
/home/scripts/ntfy-sub.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | handle() {
4 | line="$1"
5 | message=$(jq -r .message <<<"$line")
6 | if ! title=$(jq -e -r .title <<<"$line"); then
7 | title="$message"
8 | message=""
9 | fi
10 | prio=$(jq -e -r .priority <<<"$line") || prio=3
11 | if [[ $prio -lt 3 ]]; then
12 | prio=0
13 | elif [[ $prio -eq 3 ]]; then
14 | prio=1
15 | else
16 | prio=2
17 | fi
18 |
19 | actions=()
20 | while read act; do
21 | id=$(jq -r .id <<<"$act")
22 | action=$(jq -r .action <<<"$act")
23 | [[ $action == "view" ]] || continue
24 | label=$(jq -r .label <<<"$act")
25 | actions+=("-A" "$id,$label")
26 | done < <(jq -c '.actions//[]|.[]' <<<"$line")
27 |
28 | id=$(dunstify "${actions[@]}" -u $prio "$title" "$message")
29 | if url=$(jq -e --arg id "$id" -r '.actions//[]|.[]|select(.id==$id)|.url' <<<"$line"); then
30 | xdg-open "$url"
31 | fi
32 | }
33 |
34 | while read -r line; do
35 | handle "$line" &
36 | done < <(ntfy sub -C -c "$1")
37 |
--------------------------------------------------------------------------------
/home/scripts/rofipass.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | shopt -s globstar
4 |
5 | cd $PASSWORD_STORE_DIR
6 | if x=$( (for f in $(find * -type f -name '*.gpg'); do echo "${f%.gpg}"; done) | rofi -dmenu -i -no-custom -matching fuzzy); then
7 | password=$(pass show "$x" | head -1)
8 |
9 | # prevent clipman from storing the password
10 | [[ -f ~/.local/share/clipman.json ]] || echo -n '[]' >~/.local/share/clipman.json
11 | chmod u-w ~/.local/share/clipman.json
12 | wl-copy -n <<<"$password"
13 | (
14 | sleep 1
15 | chmod u+w ~/.local/share/clipman.json
16 | )
17 |
18 | dunstify -t 5000 'Password copied to clipboard'
19 | sleep 5
20 | wl-copy -c
21 | clipman pick -t CUSTOM -T "head -1" # restore last clipboard entry
22 | fi
23 |
--------------------------------------------------------------------------------
/home/scripts/timetracker.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | export GIT_DIR=$HOME/.timetracker/.git
4 | export GIT_WORK_TREE=$HOME/.timetracker
5 |
6 | _usage() {
7 | echo "Usage: tt [start|stop|list|show|edit|config|delete|save] []"
8 | echo " tt list"
9 | echo " tt git []"
10 | exit 1
11 | }
12 |
13 | if [[ $1 == git ]]; then
14 | shift
15 | exec git "$@"
16 | elif [[ $1 == list ]]; then
17 | [[ $# == 1 ]] || _usage
18 | for file in $(
19 | cd $GIT_WORK_TREE
20 | ls
21 | ); do
22 | echo $file
23 | done
24 | exit
25 | elif [[ $# -lt 1 ]] || ! [[ $2 =~ ^(|start|stop|list|show|edit|config|delete|save)$ ]]; then
26 | _usage
27 | fi
28 |
29 | if ! git status &>/dev/null; then
30 | git init
31 | fi
32 |
33 | NAME="$1"
34 | FILE="$HOME/.timetracker/$1"
35 | CONF="$HOME/.timetracker/.$1.yml"
36 | if [[ $2 != delete ]]; then
37 | mkdir -p $(dirname "$FILE")
38 | [[ -e $FILE ]] || touch "$FILE"
39 | [[ -e $CONF ]] || cat <"$CONF"
40 | regular: 0 # per week
41 | start: 0
42 | bonus: [] # hours
43 | salary: 0 # €/month
44 | EOF
45 |
46 | PER_WEEK=$(yq -r .regular "$CONF")
47 | START=$(yq -r .start "$CONF")
48 | BONUS=$(yq -r '.bonus+[0]|add*60*60|round' "$CONF")
49 | SALARY=$(yq -r .salary "$CONF")
50 | fi
51 |
52 | _fmt_ts() {
53 | date -d @$1 +"%a %d %b %Y %T"
54 | }
55 |
56 | _fmt_delta() {
57 | x=$1
58 | echo $((x / 3600))h $((x / 60 % 60))m $((x % 60))s
59 | }
60 |
61 | _week() {
62 | date -d @$1 +"%G-%V"
63 | }
64 |
65 | _now() {
66 | date +"%s"
67 | }
68 |
69 | _running() {
70 | grep -E '^([0-9]+)$' "$FILE"
71 | }
72 |
73 | _overtime() {
74 | [[ $PER_WEEK -gt 0 ]] || return
75 |
76 | t=$(($(_now) - START))
77 | regular=$(jq -n "$PER_WEEK*$t/(24*7)|round-($BONUS)")
78 | until=$(jq -n "$START+($1+($BONUS))/$PER_WEEK*24*7|round")
79 | money=$(jq -n "$SALARY*($1-$regular)/3600/$PER_WEEK/52*12*100|round/100")
80 | echo "Overtime: $(_fmt_delta $(($1 - regular))) (until $(_fmt_ts $until); ${money}€)"
81 | }
82 |
83 | start() {
84 | if x=$(_running); then
85 | echo "Already running (started at $(_fmt_ts $x))"
86 | return 1
87 | fi
88 | now=$(_now | tee -a "$FILE")
89 | echo "Started at $(_fmt_ts $now)"
90 | }
91 |
92 | stop() {
93 | if ! x=$(_running); then
94 | echo "Not running"
95 | return 1
96 | fi
97 | now=$(_now)
98 | sed -i -E "s/^([0-9]+)$/\1 $now/" "$FILE"
99 | echo "Stopped at $(_fmt_ts $now) ($(_fmt_delta $((now - x))))"
100 | save
101 | }
102 |
103 | list() {
104 | cnt=${1:-all}
105 | last=""
106 | w=0
107 | s=0
108 | r=""
109 | lines=$(wc -l <"$FILE")
110 | l=${#lines}
111 | i=1
112 | while read begin end; do
113 | [[ $cnt == all ]] || [[ $i -gt $((lines - cnt)) ]]
114 | out=$?
115 | ln=$(printf "%0${l}d" $i)
116 | i=$((i + 1))
117 | if [[ -z $end ]]; then
118 | end=$(_now)
119 | end_fmt="NOW"
120 | r="(running)"
121 | else
122 | end_fmt=$(_fmt_ts $end)
123 | fi
124 | week=$(_week $begin)
125 | if [[ $last != "$week" ]]; then
126 | [[ $out == 0 ]] && [[ -n $last ]] && echo "=> $(_fmt_delta $w)"
127 | [[ $out == 0 ]] && echo -e "\n$week"
128 | w=0
129 | fi
130 | last="$week"
131 | [[ $out == 0 ]] && echo "#$ln $(_fmt_ts $begin) - $end_fmt ($(_fmt_delta $((end - begin))))"
132 | w=$((w + end - begin))
133 | s=$((s + end - begin))
134 | done <"$FILE"
135 | [[ -n $last ]] && echo "=> $(_fmt_delta $w)"
136 | echo -e "\nTOTAL: $(_fmt_delta $s) $r"
137 | _overtime $s
138 | }
139 |
140 | show() {
141 | sum=0
142 | r=""
143 | while read begin end; do
144 | if [[ -z $end ]]; then
145 | end=$(_now)
146 | r="(running)"
147 | fi
148 | sum=$((sum + end - begin))
149 | done <"$FILE"
150 | echo "TOTAL: $(_fmt_delta $sum) $r"
151 | _overtime $sum
152 | }
153 |
154 | interactive() {
155 | _running >/dev/null || start
156 | x=$(_running)
157 | f=1
158 | trap f=0 SIGINT
159 | first=1
160 | while [[ $f == 1 ]]; do
161 | s=$(show)
162 | printf "${new}Current: $(_fmt_delta $(($(_now) - x)))\n$s (Ctrl+C to stop) "
163 | sleep 1
164 | if [[ $first == 1 ]]; then
165 | new=$(tput cuu $(echo -e "$s" | wc -l) hpa 0 ed)
166 | first=0
167 | fi
168 | done
169 | trap - SIGINT
170 | printf "$new"
171 | stop
172 | }
173 |
174 | edit() {
175 | ${EDITOR:-vi} "$FILE"
176 | save
177 | }
178 |
179 | config() {
180 | ${EDITOR:-vi} "$CONF"
181 | save
182 | }
183 |
184 | delete() {
185 | for file in "$FILE" "$CONF"; do
186 | [[ -e $file ]] && rm -i "$file" || echo "$file does not exist"
187 | done
188 | save
189 | }
190 |
191 | save() {
192 | git add "$FILE" "$CONF"
193 | if ! git diff --staged --exit-code --quiet; then
194 | git commit -m "Update $NAME"
195 | git push
196 | fi
197 | }
198 |
199 | cmd=${2:-interactive}
200 | shift 2
201 | "$cmd" "$@"
202 |
--------------------------------------------------------------------------------
/home/sops.nix:
--------------------------------------------------------------------------------
1 | {
2 | conf,
3 | sops-nix,
4 | system-config,
5 | ...
6 | }:
7 | let
8 | inherit (system-config.users.users.${conf.user}) uid;
9 | in
10 | {
11 | imports = [ sops-nix.homeManagerModules.sops ];
12 | sops = {
13 | age.keyFile = "/persistent/data/home/${conf.user}/.config/sops/age/keys.txt";
14 | defaultSymlinkPath = "/run/user/${toString uid}/secrets";
15 | defaultSecretsMountPoint = "/run/user/${toString uid}/secrets.d";
16 | environment.GNUPGHOME = "/dev/null";
17 | };
18 | }
19 |
--------------------------------------------------------------------------------
/home/ssh.nix:
--------------------------------------------------------------------------------
1 | { config, ... }:
2 | {
3 | programs.ssh = {
4 | enable = true;
5 | serverAliveInterval = 20;
6 | controlMaster = "auto";
7 | controlPersist = "2h";
8 | controlPath = "~/.ssh/master-%C";
9 | extraConfig = ''
10 | TCPKeepAlive no
11 | '';
12 | includes = [ config.sops.secrets."ssh/hosts".path ];
13 | };
14 |
15 | sops.secrets = {
16 | "ssh/hosts" = {
17 | format = "binary";
18 | sopsFile = ../secrets/ssh/hosts;
19 | };
20 | };
21 | }
22 |
--------------------------------------------------------------------------------
/home/syncthing.nix:
--------------------------------------------------------------------------------
1 | {
2 | services.syncthing = {
3 | enable = true;
4 | };
5 | }
6 |
--------------------------------------------------------------------------------
/home/theme.nix:
--------------------------------------------------------------------------------
1 | { pkgs, conf, ... }:
2 | {
3 | gtk = {
4 | enable = true;
5 | theme.name = "Adapta-Nokto";
6 | theme.package = pkgs.adapta-gtk-theme;
7 | iconTheme.name = "breeze-dark";
8 | iconTheme.package = pkgs.libsForQt5.breeze-icons;
9 | font.name = "Cantarell";
10 | font.size = 12;
11 | font.package = pkgs.cantarell-fonts;
12 | gtk3.extraConfig = {
13 | gtk-application-prefer-dark-theme = 1;
14 | };
15 | };
16 |
17 | sops.secrets."gtk/bookmarks" = {
18 | format = "binary";
19 | sopsFile = ../secrets/gtk/bookmarks;
20 | path = "/home/${conf.user}/.config/gtk-3.0/bookmarks";
21 | };
22 |
23 | home.pointerCursor = {
24 | package = pkgs.libsForQt5.breeze-gtk;
25 | gtk.enable = true;
26 | name = "breeze_cursors";
27 | size = 16;
28 | };
29 |
30 | fonts.fontconfig.enable = true;
31 | }
32 |
--------------------------------------------------------------------------------
/home/tmux.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | programs.tmux = {
4 | enable = true;
5 | aggressiveResize = true;
6 | baseIndex = 1;
7 | clock24 = true;
8 | customPaneNavigationAndResize = true;
9 | escapeTime = 0;
10 | keyMode = "vi";
11 | prefix = "M-Space";
12 | resizeAmount = 5;
13 | secureSocket = false;
14 | terminal = "tmux-256color";
15 | plugins = builtins.attrValues { inherit (pkgs.tmuxPlugins) tmux-fzf onedark-theme; };
16 | extraConfig = ''
17 | set -ag terminal-overrides ",xterm-256color:RGB"
18 |
19 | set-option -g detach-on-destroy off
20 |
21 | # open new panes in same directory
22 | bind '"' split-window -c "#{pane_current_path}"
23 | bind % split-window -h -c "#{pane_current_path}"
24 | bind c new-window -c "#{pane_current_path}"
25 |
26 | # switch panes using Alt+vimarrow without prefix
27 | bind -n M-h select-pane -L
28 | bind -n M-l select-pane -R
29 | bind -n M-k select-pane -U
30 | bind -n M-j select-pane -D
31 |
32 | # switch windows using Alt+Number without prefix
33 | bind -n M-1 select-window -t1
34 | bind -n M-2 select-window -t2
35 | bind -n M-3 select-window -t3
36 | bind -n M-4 select-window -t4
37 | bind -n M-5 select-window -t5
38 | bind -n M-6 select-window -t6
39 | bind -n M-7 select-window -t7
40 | bind -n M-8 select-window -t8
41 | bind -n M-9 select-window -t9
42 | bind -n M-0 select-window -t10
43 | '';
44 | };
45 | }
46 |
--------------------------------------------------------------------------------
/home/vscodium.nix:
--------------------------------------------------------------------------------
1 | { pkgs, nix-vscode-extensions, ... }:
2 | let
3 | extensions = nix-vscode-extensions.extensions.${pkgs.system};
4 | in
5 | {
6 | programs.vscode = {
7 | enable = true;
8 | package = pkgs.vscodium;
9 | profiles.default = {
10 | enableExtensionUpdateCheck = false;
11 | enableUpdateCheck = false;
12 | extensions = with extensions.vscode-marketplace; [
13 | angular.ng-template
14 | bbenoist.nix
15 | cyrilletuzi.angular-schematics
16 | dbaeumer.vscode-eslint
17 | eamodio.gitlens
18 | esbenp.prettier-vscode
19 | # github.copilot
20 | # github.copilot-chat
21 | hediet.vscode-drawio
22 | infinity1207.angular2-switcher
23 | james-yu.latex-workshop
24 | leanprover.lean4
25 | ms-python.python
26 | # ms-toolsai.jupyter
27 | # ms-toolsai.jupyter-keymap
28 | # ms-toolsai.jupyter-renderers
29 | ms-vsliveshare.vsliveshare
30 | orta.vscode-jest
31 | redhat.vscode-yaml
32 | rust-lang.rust-analyzer
33 | # streetsidesoftware.code-spell-checker
34 | uiua-lang.uiua-vscode
35 | usernamehw.errorlens
36 | vscodevim.vim
37 | vue.volar
38 | xabikos.javascriptsnippets
39 | ];
40 | userSettings = {
41 | "editor.wordWrap" = "on";
42 | "workbench.startupEditor" = "newUntitledFile";
43 | "files.autoSave" = "afterDelay";
44 | "python.autoComplete.extraPaths" = [ ];
45 | "editor.lineNumbers" = "on";
46 | "vim.commandLineModeKeyBindings" = [ ];
47 | "rust-analyzer.checkOnSave.command" = "clippy";
48 | "files.associations" = {
49 | "*.toml" = "toml";
50 | };
51 | "vim.useSystemClipboard" = true;
52 | "task.quickOpen.skip" = true;
53 | "explorer.confirmDragAndDrop" = false;
54 | "jupyter.askForKernelRestart" = false;
55 | "notebook.output.textLineLimit" = 50;
56 | "hediet.vscode-drawio.theme" = "Kennedy";
57 | "[uiua]"."editor.fontSize" = 18;
58 | "[html]"."editor.defaultFormatter" = "esbenp.prettier-vscode";
59 | "[javascript]"."editor.defaultFormatter" = "esbenp.prettier-vscode";
60 | "[json]"."editor.defaultFormatter" = "esbenp.prettier-vscode";
61 | "[jsonc]"."editor.defaultFormatter" = "vscode.json-language-features";
62 | "[scss]"."editor.defaultFormatter" = "esbenp.prettier-vscode";
63 | "[typescript]"."editor.defaultFormatter" = "esbenp.prettier-vscode";
64 | };
65 | keybindings = [
66 | {
67 | "key" = "F10";
68 | "command" = "workbench.action.tasks.runTask";
69 | "args" = "Run";
70 | }
71 | {
72 | "key" = "shift+f10";
73 | "command" = "-editor.action.showContextMenu";
74 | "when" = "textInputFocus";
75 | }
76 | {
77 | "key" = "shift+f10";
78 | "command" = "workbench.action.tasks.reRunTask";
79 | }
80 | {
81 | "key" = "ctrl+k";
82 | "command" = "-extension.vim_ctrl+k";
83 | "when" = "editorTextFocus && vim.active && vim.use && !inDebugRepl";
84 | }
85 | {
86 | "key" = "shift+escape";
87 | "command" = "workbench.action.closePanel";
88 | }
89 | {
90 | "key" = "ctrl+f10";
91 | "command" = "workbench.action.tasks.restartTask";
92 | }
93 | ];
94 | };
95 | };
96 | }
97 |
--------------------------------------------------------------------------------
/home/waybar.nix:
--------------------------------------------------------------------------------
1 | {
2 | conf,
3 | pkgs,
4 | lib,
5 | ...
6 | }:
7 | {
8 | programs.waybar = {
9 | enable = true;
10 | systemd.enable = true;
11 | settings =
12 | let
13 | icons = lib.splitString " ";
14 | mkDisk = name: path: {
15 | inherit path;
16 | interval = 5;
17 | format = "${name} {percentage_used}%";
18 | states = {
19 | critical = 90;
20 | warning = 80;
21 | };
22 | };
23 | base = {
24 | layer = "top";
25 | position = "top";
26 | height = 20;
27 | fixed-center = false;
28 |
29 | "custom/yk" =
30 | let
31 | script = builtins.toFile "yktd.py" ''
32 | import json, socket, os
33 | s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
34 | s.connect(f"/run/user/{os.getuid()}/yubikey-touch-detector.socket")
35 | def update(touch):
36 | print(json.dumps({
37 | "text": "",
38 | "tooltip": "YubiKey is waiting for a touch",
39 | } if touch else {}), flush=True)
40 | update(False)
41 | while True: update(s.recv(5).decode().endswith("1"))
42 | '';
43 | in
44 | {
45 | exec = "${pkgs.python311}/bin/python ${script}";
46 | return-type = "json";
47 | };
48 |
49 | "custom/screenshot" = {
50 | format = "";
51 | on-click = pkgs.writeShellScript "screenshot.sh" ''
52 | export PATH=${
53 | lib.makeBinPath (
54 | lib.attrValues {
55 | inherit (pkgs)
56 | coreutils
57 | grim
58 | slurp
59 | wl-clipboard
60 | ;
61 | }
62 | )
63 | }:$PATH
64 | grim -g "$(slurp)" - | wl-copy -t image/png
65 | '';
66 | };
67 |
68 | "custom/github" = {
69 | interval = 10;
70 | on-click = "${pkgs.xdg-utils}/bin/xdg-open https://github.com/notifications";
71 | exec = pkgs.writeShellScript "github-notifications" ''
72 | export PATH=${lib.makeBinPath (lib.attrValues { inherit (pkgs) coreutils gh; })}
73 |
74 | set -euo pipefail
75 |
76 | cnt=$(gh api /notifications -q length)
77 | if [[ $cnt -gt 0 ]]; then
78 | echo " $cnt"
79 | fi
80 | '';
81 | };
82 |
83 | "custom/dunst" = {
84 | exec = pkgs.writeShellScript "dunst-is-paused" ''
85 | export PATH=${lib.makeBinPath (lib.attrValues { inherit (pkgs) coreutils dunst dbus; })}
86 |
87 | set -euo pipefail
88 |
89 | readonly ENABLED=''
90 | readonly DISABLED=''
91 | dbus-monitor path='/org/freedesktop/Notifications',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged' --profile |
92 | while read -r _; do
93 | PAUSED="$(dunstctl is-paused)"
94 | if [ "$PAUSED" == 'false' ]; then
95 | CLASS="enabled"
96 | TEXT="$ENABLED"
97 | else
98 | CLASS="disabled"
99 | TEXT="$DISABLED"
100 | COUNT="$(dunstctl count waiting)"
101 | if [ "$COUNT" != '0' ]; then
102 | TEXT="$DISABLED ($COUNT)"
103 | fi
104 | fi
105 | printf '{"text": "%s", "class": "%s"}\n' "$TEXT" "$CLASS"
106 | done
107 | '';
108 | return-type = "json";
109 | on-click = pkgs.writeShellScript "dunst-toggle-paused.sh" ''
110 | dunstctl set-paused toggle
111 | '';
112 | };
113 |
114 | "tray" = {
115 | spacing = 8;
116 | };
117 |
118 | "backlight" = {
119 | format = " {percent}%";
120 | };
121 |
122 | "battery" = {
123 | format = "{icon} {capacity}%{time}";
124 | format-charging = " {capacity}%{time}";
125 | format-icons = icons " ";
126 | format-plugged = " {capacity}%";
127 | format-time = " ({H}:{m})";
128 | states = {
129 | critical = 15;
130 | warning = 30;
131 | };
132 | };
133 |
134 | "clock" = {
135 | interval = 1;
136 | format = " {:%a, %d.%m.%Y %H:%M:%S}";
137 | tooltip-format = "{:%Y %B}\n{calendar}";
138 | };
139 |
140 | "cpu" = {
141 | interval = 2;
142 | format = " {usage}%";
143 | tooltip = false;
144 | };
145 |
146 | "memory" = {
147 | interval = 2;
148 | format = " {avail} GB";
149 | };
150 | "memory#swap" = {
151 | interval = 2;
152 | format = " {swapUsed} GB";
153 | };
154 |
155 | "disk" = mkDisk "/" "/";
156 | "disk#persistent" = mkDisk "/persistent" "/persistent/data";
157 |
158 | "network" = {
159 | interval = 2;
160 | format-disconnected = " Disconnected";
161 | format-ethernet = " {bandwidthTotalBytes} ({ipaddr})";
162 | format-wifi = " {essid} {signalStrength}% {bandwidthTotalBytes} ({ipaddr})";
163 | };
164 |
165 | "pulseaudio" = {
166 | format = "{icon} {volume}%";
167 | format-muted = "";
168 | format-bluetooth = "{icon} {volume}%";
169 | format-bluetooth-muted = " ";
170 | format-icons = icons " ";
171 | };
172 |
173 | "pulseaudio#mic" = {
174 | format = "{format_source}";
175 | format-muted = "{format_source}";
176 | format-bluetooth = "{format_source}";
177 | format-bluetooth-muted = "{format_source}";
178 | format-source = " {volume}%";
179 | format-source-muted = "";
180 | };
181 |
182 | "niri/language" = {
183 | format = "{short}";
184 | tooltip-format = "{long}";
185 | };
186 |
187 | "niri/window" = {
188 | separate-outputs = true;
189 | };
190 | };
191 | in
192 | {
193 | default = base // {
194 | output = lib.mkIf (conf.wayland.outputs.default.name != null) conf.wayland.outputs.default.name;
195 |
196 | modules-left = [ "niri/workspaces" ];
197 | modules-center = [ "niri/window" ];
198 | modules-right = [
199 | "custom/yk"
200 | "custom/screenshot"
201 | "memory"
202 | "memory#swap"
203 | "disk"
204 | "disk#persistent"
205 | "cpu"
206 | "custom/dunst"
207 | "custom/github"
208 | "backlight"
209 | "pulseaudio"
210 | "pulseaudio#mic"
211 | "custom/webcam"
212 | "niri/language"
213 | "battery"
214 | "network"
215 | "clock"
216 | "tray"
217 | ];
218 | };
219 | }
220 | // (builtins.mapAttrs (
221 | k: v:
222 | base
223 | // {
224 | name = k;
225 | height = 25;
226 | output = v.name;
227 |
228 | modules-left = [ "niri/workspaces" ];
229 | modules-center = [ "niri/window" ];
230 | modules-right = [
231 | "custom/yk"
232 | "memory"
233 | "memory#swap"
234 | "disk"
235 | "disk#persistent"
236 | "cpu"
237 | "custom/dunst"
238 | "backlight"
239 | "pulseaudio"
240 | "pulseaudio#mic"
241 | "custom/webcam"
242 | "niri/language"
243 | "battery"
244 | "network"
245 | "clock"
246 | ];
247 | }
248 | ) (builtins.removeAttrs conf.wayland.outputs [ "default" ]));
249 |
250 | style = ''
251 | * {
252 | font-family: MesloLGS NF;
253 | font-size: 12px;
254 | }
255 |
256 | window#waybar {
257 | background-color: #1f1f1f;
258 | color: #ffffff;
259 | transition-property: box-shadow;
260 | transition-duration: 0.5s;
261 | }
262 |
263 | window#waybar.ext > * {
264 | margin-top: 5px;
265 | }
266 |
267 | button {
268 | box-shadow: inset 0 -3px transparent;
269 | border: none;
270 | border-radius: 0;
271 | }
272 |
273 | #workspaces button {
274 | padding: 0 12px;
275 | min-width: 0;
276 | color: #ffffff;
277 | }
278 |
279 | #workspaces button:hover {
280 | background: #282828;
281 | box-shadow: inset 0 -2px #00897b;
282 | }
283 |
284 | #workspaces button.focused {
285 | background-color: #333;
286 | box-shadow: inset 0 -2px #00b9ab;
287 | }
288 |
289 | #workspaces button.urgent {
290 | background-color: #eb4d4b;
291 | }
292 |
293 | #clock,
294 | #battery,
295 | #cpu,
296 | #memory,
297 | #disk,
298 | #temperature,
299 | #custom-dunst,
300 | #backlight,
301 | #network,
302 | #pulseaudio,
303 | #wireplumber,
304 | #custom-media,
305 | #tray,
306 | #mode,
307 | #idle_inhibitor,
308 | #scratchpad,
309 | #mpd,
310 | #custom-github,
311 | #language {
312 | padding: 0 2px;
313 | margin: 0 4px;
314 | color: #ffffff;
315 | }
316 |
317 | @keyframes yk-blink {
318 | to {
319 | border: 2px solid transparent;
320 | }
321 | }
322 |
323 | #custom-yk {
324 | border: 2px solid #0f0;
325 | padding: 0 6px;
326 | margin: 0 4px;
327 | color: #fff;
328 | animation-name: yk-blink;
329 | animation-duration: 0.375s;
330 | animation-iteration-count: infinite;
331 | animation-timing-function: linear;
332 | animation-direction: alternate;
333 | }
334 |
335 | #custom-screenshot {
336 | padding: 0 5px;
337 | box-shadow: inset 0 -2px #fc5;
338 | }
339 |
340 | #window,
341 | #workspaces {
342 | margin: 0 4px;
343 | }
344 |
345 | #workspaces {
346 | margin-left: 0;
347 | }
348 |
349 | #clock {
350 | box-shadow: inset 0 -2px #0a7;
351 | }
352 |
353 | #language {
354 | box-shadow: inset 0 -2px #07a;
355 | }
356 |
357 | @keyframes github-blink {
358 | to {
359 | box-shadow: inset 0 -2px #1f1f1f;
360 | }
361 | }
362 |
363 | #custom-github {
364 | box-shadow: inset 0 -2px #ff507a;
365 | animation-name: github-blink;
366 | animation-duration: 0.5s;
367 | animation-iteration-count: infinite;
368 | animation-timing-function: ease-in-out;
369 | animation-direction: alternate;
370 | }
371 |
372 | #battery {
373 | box-shadow: inset 0 -2px #c00;
374 | background: none;
375 | }
376 |
377 | #battery.charging, #battery.plugged {
378 | box-shadow: inset 0 -2px #26A65B;
379 | }
380 |
381 | #battery.warning:not(.charging) {
382 | background: #850;
383 | }
384 | #battery.critical:not(.charging) {
385 | background: #810;
386 | }
387 |
388 | #cpu {
389 | box-shadow: inset 0 -2px #2ecc71;
390 | }
391 |
392 | #memory {
393 | box-shadow: inset 0 -2px #9b59b6;
394 | }
395 |
396 | #disk {
397 | box-shadow: inset 0 -2px #6961ff;
398 | }
399 | #disk.warning {
400 | background: #850;
401 | }
402 | #disk.critical {
403 | background: #810;
404 | }
405 |
406 | #custom-dunst.enabled {
407 | box-shadow: inset 0 -2px #0a7;
408 | }
409 | #custom-dunst.disabled {
410 | box-shadow: inset 0 -2px #e00;
411 | }
412 |
413 | #backlight {
414 | box-shadow: inset 0 -2px #a0c1c1;
415 | }
416 |
417 | #network {
418 | box-shadow: inset 0 -2px #2980b9;
419 | }
420 |
421 | #network.disconnected {
422 | box-shadow: inset 0 -2px #e00;
423 | }
424 |
425 | #pulseaudio {
426 | box-shadow: inset 0 -2px #f1c40f;
427 | }
428 |
429 | #pulseaudio.muted:not(.mic), #pulseaudio.mic.source-muted {
430 | box-shadow: inset 0 -2px #880;
431 | }
432 |
433 | #tray > .passive {
434 | -gtk-icon-effect: dim;
435 | }
436 |
437 | #tray > .needs-attention {
438 | -gtk-icon-effect: highlight;
439 | background-color: #eb4d4b;
440 | }
441 |
442 | #scratchpad.empty {
443 | background-color: transparent;
444 | }
445 | '';
446 | };
447 | }
448 |
--------------------------------------------------------------------------------
/home/xournalpp/default.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | home.packages = [ pkgs.xournalpp ];
4 | home.file.xournalpp = {
5 | source = ./settings;
6 | target = ".config/xournalpp";
7 | recursive = true;
8 | };
9 | }
10 |
--------------------------------------------------------------------------------
/home/xournalpp/settings/colornames.ini:
--------------------------------------------------------------------------------
1 | [info]
2 | about=Xournalpp custom color names
3 |
--------------------------------------------------------------------------------
/home/xournalpp/settings/settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
--------------------------------------------------------------------------------
/home/xournalpp/settings/toolbar.ini:
--------------------------------------------------------------------------------
1 | ## Xournal++ Toolbar configuration
2 | ## Here you can customize the Toolbars
3 | # Delete this file to generate a new config file with default values
4 | #
5 | # Available buttons:
6 | # File: NEW,SAVE,OPEN
7 | #
8 | # Edit: CUT,COPY,PASTE,SEARCH,UNDO,REDO,INSERT_NEW_PAGE
9 | #
10 | # Navigation: GOTO_FIRST,GOTO_BACK,GOTO_NEXT,GOTO_LAST,GOTO_NEXT_ANNOTATED_PAGE
11 | #
12 | # Zoom: ZOOM_OUT,ZOOM_IN,ZOOM_FIT,ZOOM_100,FULLSCREEN,PAIRED_PAGES
13 | #
14 | # Color: COLOR(0xffffff),COLOR(0xffff00),COLOR(0xff8000),COLOR(0xff00ff),COLOR(0x00ff00),COLOR(0x00c0ff),COLOR(0x808080),COLOR(0x008000),COLOR(0xff0000),COLOR(0x3333cc),COLOR(0x000000),COLOR_SELECT
15 | # Notice: This are the default Xournal colors, each other color in HEX can also be used, eg COLOR(0x12ABCF);
16 | #
17 | # Tools: ERASER,PEN,HILIGHTER,IMAGE,TEXT,IMAGE,SELECT,SELECT_REGION,SELECT_RECTANGLE,VERTICAL_SPACE,HAND
18 | # Notice: ERASER also has a drop down menu to select the eraser type, SELECT are all selection tools, with drop down menu
19 | #
20 | # Tool settings: SHAPE_RECOGNIZER,RULER,FINE,MEDIUM,THICK,SELECT_FONT
21 | #
22 | # Components: PAGE_SPIN,ZOOM_SLIDER,LAYER
23 | # PAGE_SPIN: The page spiner, incl. current page label
24 | # ZOOM_SLIDER: The zoom slider
25 | # LAYER: The layer dropdown menu
26 | #
27 | #
28 |
29 | [Right hand Note Taking Copy]
30 | toolbarTop1=SAVE,NEW,OPEN,SEPARATOR,CUT,COPY,PASTE,SEPARATOR,UNDO,REDO,SEPARATOR,PEN,ERASER,HILIGHTER,IMAGE,TEXT,MATH_TEX,SEPARATOR,DEFAULT_TOOL,SEPARATOR,INSERT_NEW_PAGE,DELETE_CURRENT_PAGE,SEPARATOR,GOTO_BACK,GOTO_NEXT,SEPARATOR,FULLSCREEN,SEPARATOR,AUDIO_RECORDING,AUDIO_PAUSE_PLAYBACK,AUDIO_STOP_PLAYBACK
31 | toolbarLeft1=COLOR(0xffffff),COLOR(0xffff00),COLOR(0xff8000),COLOR(0xff00ff),COLOR(0x00ff00),COLOR(0x00c0ff),COLOR(0x808080),COLOR(0x008000),COLOR(0xff0000),COLOR(0x3333cc),COLOR(0x000000),COLOR_SELECT,SEPARATOR,PRESENTATION_MODE,ZOOM_100,ZOOM_FIT,ZOOM_IN,ZOOM_OUT
32 | toolbarLeft2=FINE,MEDIUM,THICK,SEPARATOR,TOOL_FILL,SEPARATOR,DRAW_CIRCLE,DRAW_RECTANGLE,DRAW_ARROW,RULER,SEPARATOR,ROTATION_SNAPPING,GRID_SNAPPING,SEPARATOR,VERTICAL_SPACE,SELECT_REGION,SELECT_RECTANGLE,SELECT_OBJECT,PLAY_OBJECT
33 | name=Right hand Note Taking Copy
34 |
35 | [Right hand Note Taking Copy 1]
36 | toolbarTop1=SAVE,NEW,OPEN,SEPARATOR,SEPARATOR,UNDO,REDO,SEPARATOR,IMAGE,TEXT,MATH_TEX,SEPARATOR,DEFAULT_TOOL,SEPARATOR,INSERT_NEW_PAGE,DELETE_CURRENT_PAGE,SEPARATOR,GOTO_BACK,GOTO_NEXT,SEPARATOR,FULLSCREEN,SEPARATOR,AUDIO_RECORDING,AUDIO_PAUSE_PLAYBACK,AUDIO_STOP_PLAYBACK
37 | toolbarLeft1=COLOR(0xffffff),COLOR(0xffff00),COLOR(0x808080),COLOR(0xff8000),COLOR(0xff00ff),COLOR(0x00ff00),COLOR(0x00c0ff),COLOR(0x008000),COLOR(0xff0000),COLOR(0x3333cc),COLOR(0x000000),COLOR_SELECT,SEPARATOR,PRESENTATION_MODE,PEN,HILIGHTER,ERASER,ZOOM_100,ZOOM_FIT,ZOOM_IN,ZOOM_OUT
38 | toolbarLeft2=FINE,MEDIUM,THICK,SEPARATOR,TOOL_FILL,SEPARATOR,DRAW_CIRCLE,DRAW_RECTANGLE,DRAW_ARROW,RULER,SEPARATOR,ROTATION_SNAPPING,GRID_SNAPPING,SEPARATOR,VERTICAL_SPACE,SELECT_REGION,SELECT_RECTANGLE,SELECT_OBJECT,PLAY_OBJECT,COPY,CUT,PASTE,DELETE
39 | name=Right hand Note Taking Copy 1
40 |
--------------------------------------------------------------------------------
/home/yubikey.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | home.packages = builtins.attrValues { inherit (pkgs) yubikey-manager yubioath-flutter; };
4 |
5 | systemd.user =
6 | let
7 | yktd = pkgs.yubikey-touch-detector;
8 | in
9 | {
10 | services = {
11 | yubikey-touch-detector = {
12 | Unit = {
13 | Description = "Detects when your YubiKey is waiting for a touch";
14 | Requires = "yubikey-touch-detector.socket";
15 | };
16 | Service = {
17 | ExecStart = "${yktd}/bin/yubikey-touch-detector --libnotify";
18 | Environment = "PATH=${pkgs.lib.makeBinPath [ pkgs.gnupg ]}";
19 | EnvironmentFile = "-%E/yubikey-touch-detector/service.conf";
20 | };
21 | Install = {
22 | Also = "yubikey-touch-detector.socket";
23 | WantedBy = [ "default.target" ];
24 | };
25 | };
26 | };
27 | sockets = {
28 | yubikey-touch-detector = {
29 | Unit = {
30 | Description = "Unix socket activation for YubiKey touch detector service";
31 | };
32 | Socket = {
33 | ListenStream = "%t/yubikey-touch-detector.socket";
34 | RemoveOnStop = "yes";
35 | };
36 | Install = {
37 | WantedBy = [ "sockets.target" ];
38 | };
39 | };
40 | };
41 | };
42 | }
43 |
--------------------------------------------------------------------------------
/home/zoxide.nix:
--------------------------------------------------------------------------------
1 | {
2 | programs.zoxide = {
3 | enable = true;
4 | options = [ "--cmd=cd" ];
5 | };
6 | }
7 |
--------------------------------------------------------------------------------
/home/zsh/default.nix:
--------------------------------------------------------------------------------
1 | { pkgs, lib, ... }:
2 | let
3 | aliases = {
4 | "." = "source";
5 | ls = "EXA_COLORS='xx=2;37' ${pkgs.eza}/bin/eza -g --git --group-directories-first";
6 | l = "ls -aal";
7 | tre = "ls -alT";
8 | c = "clear";
9 | h = "cd;c";
10 | grep = "grep --color=auto";
11 | f = "cd $(pwd -P)";
12 | curl = "curl -L";
13 | cif = "curl ifconfig.co";
14 | ciff = "curl httpbin.org/ip";
15 | cf = "ping 1.1.1.1";
16 | cal = "cal -m";
17 | py = "python";
18 | diff = "git diff --no-index";
19 | sshx = "ssh -o UserKnownHostsFile=/dev/null";
20 | sftpx = "sftp -o UserKnownHostsFile=/dev/null";
21 | lsblk = "lsblk -M";
22 | type = "which";
23 | j = "just";
24 | qmv = "qmv -f destination-only";
25 | repl = "nix repl -f ''";
26 | da = "direnv allow";
27 | de = "direnv edit .";
28 | dr = "direnv reload";
29 | db = "direnv block";
30 | duff = "duf /persistent/* /nix /";
31 | mksv = "btrfs subvolume create";
32 |
33 | g = "git";
34 | gs = "git status";
35 | gsh = "git show";
36 | gl = "git log --graph";
37 | glp = "git log --graph -p";
38 | gb = "git branch";
39 | gg = "git switch";
40 | gd = "git diff";
41 | gds = "git diff --staged";
42 | gt = "git stash";
43 | ga = "git add";
44 | gap = "git add -p";
45 | gai = "git add --intent-to-add";
46 | gx = "git restore";
47 | gxp = "git restore -p";
48 | gc = "git commit -v";
49 | gca = "git commit -v --amend";
50 | gcf = "git commit --fixup";
51 | gr = "git rebase -i --autosquash";
52 | grc = "git rebase --continue";
53 | gra = "git rebase --abort";
54 | gm = "git merge";
55 | gcp = "git cherry-pick";
56 | gp = "git pull --all --prune --rebase --autostash";
57 | gu = "git push";
58 | guf = "git push --force-with-lease";
59 | gch = "git checkout";
60 | gcl = "git clone";
61 | grr = "git reset";
62 | grs = "git reset --soft";
63 | grh = "git reset --hard";
64 | };
65 | functions = {
66 | d = "dirs -v | tac";
67 | mkcd = ''mkdir -p "$1"; cd "$1"'';
68 | temp = ''(d=$(mktemp -d); cd "$d"; zsh && rm -rf "$d")'';
69 |
70 | skg = ''
71 | f=$(mktemp -u)
72 | ssh-keygen -t ed25519 -C "" -P "" -f $f
73 | cat $f
74 | cat $f.pub
75 | rm $f $f.pub
76 | '';
77 | wgpeer = ''
78 | key=$(wg genkey)
79 | echo "# Private Key: $key\n[Peer]\nPublicKey = $(wg pubkey <<< $key)\nPresharedKey = $(wg genpsk)\nAllowedIPs = "
80 | '';
81 |
82 | s = ''
83 | tmux new -d -c ~ -s "$1"
84 | if [[ -n "$TMUX" ]]; then
85 | tmux switch-client -t "$1"
86 | else
87 | tmux a -t "$1"
88 | fi
89 | '';
90 |
91 | is_btrfs_subvolume = ''
92 | local dir=''${1:-.}
93 | [[ "$(stat -f --format=%T $dir)" = "btrfs" ]] && [[ "$(stat --format=%i $dir)" =~ ^(2|256)$ ]]
94 | '';
95 |
96 | command_not_found_handler = ''
97 | local d="$HOME/.cache/zsh_command_not_found_handler"
98 | if ! [[ -f "$d/$1" ]]; then
99 | echo -n "command '$1' not found, try comma? " >&2
100 | read -q || return
101 | mkdir -p "$d" && touch "$d/$1"
102 | fi
103 | ${lib.getExe pkgs.comma} "$@"
104 | '';
105 | };
106 | in
107 | {
108 | programs.zsh = {
109 | enable = true;
110 | autosuggestion.enable = true;
111 | syntaxHighlighting.enable = true;
112 | defaultKeymap = "viins";
113 | autocd = true;
114 | history.share = false;
115 | plugins = [
116 | {
117 | name = "powerlevel10k";
118 | src = pkgs.zsh-powerlevel10k;
119 | file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme";
120 | }
121 | ];
122 | initContent = ''
123 | # p10k instant prompt
124 | P10K_INSTANT_PROMPT="$XDG_CACHE_HOME/p10k-instant-prompt-''${(%):-%n}.zsh"
125 | [[ ! -r "$P10K_INSTANT_PROMPT" ]] || source "$P10K_INSTANT_PROMPT"
126 |
127 | source ${./p10k.zsh}
128 |
129 | ZSH_AUTOSUGGEST_STRATEGY=(history completion)
130 | bindkey '^ ' autosuggest-accept
131 |
132 | zstyle ':completion:*' menu select
133 |
134 | setopt autopushd
135 |
136 | # custom functions
137 | ${(builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "${k}() {\n${v}\n}") functions))}
138 |
139 | if [[ -n "$SSH_TTY" ]]; then
140 | export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus
141 | fi
142 | '';
143 | shellAliases = aliases;
144 | };
145 | }
146 |
--------------------------------------------------------------------------------
/home/zsh/full.nix:
--------------------------------------------------------------------------------
1 | {
2 | system-config,
3 | pkgs,
4 | lib,
5 | ...
6 | }:
7 | let
8 | aliases = {
9 | bt = "bluetoothctl";
10 | vlc = "vlc -I ncurses";
11 | mnt = "source ${../scripts/mount.sh}";
12 | tt = "${../scripts/timetracker.sh}";
13 | drss = "${../scripts/download_rss.sh}";
14 | sys-rebuild = "_rebuild && source /etc/zshrc && source ~/.zshrc";
15 | sys-update = "_update && source /etc/zshrc && source ~/.zshrc";
16 | c = lib.mkForce "clear; is_split || hyfetch";
17 | };
18 |
19 | impure = system-config.system.replaceDependencies.replacements != [ ];
20 |
21 | functions = {
22 | _rebuild = ''
23 | sudo nixos-rebuild "''${1:-switch}" --flake ~/nixos ${lib.optionalString impure "--impure"} --log-format internal-json -v |& nom --json
24 | '';
25 | _update = ''
26 | nix flake update --commit-lock-file --flake ~/nixos && _rebuild
27 | '';
28 |
29 | shot = ''
30 | file=$(mktemp --suffix .png)
31 | ${pkgs.termshot}/bin/termshot -f $file $TERMSHOT_FLAGS -- "$@" \
32 | && ${pkgs.imagemagick}/bin/convert $file -crop 0x0+81+191 -crop -113-140 $file \
33 | && ${pkgs.xclip}/bin/xclip -selection clipboard -t image/png -i $file \
34 | && ${pkgs.eog}/bin/eog $file
35 | '';
36 | cshot = ''TERMSHOT_FLAGS="-c" shot "$@";'';
37 |
38 | is_split = ''
39 | [[ "$TERM" =~ ^tmux ]] && [[ $(tmux list-panes | wc -l) -gt 1 ]]
40 | '';
41 |
42 | fwatch = ''
43 | if [[ $# -eq 0 ]] || [[ "$1" = "--help" ]]; then
44 | ${lib.getExe' pkgs.inotify-tools "inotifywait"} --help
45 | return
46 | fi
47 |
48 | args=()
49 | while [[ $# -gt 0 ]]; do
50 | if [[ "$1" = "--" ]]; then shift; break; fi
51 | args+=("$1")
52 | shift
53 | done
54 |
55 | while true; do
56 | ${lib.getExe' pkgs.inotify-tools "inotifywait"} "''${args[@]}"
57 | code=$?
58 | if [[ $code -eq 0 ]]; then
59 | "$@"
60 | else
61 | return $code
62 | fi
63 | done
64 | '';
65 | };
66 | in
67 | {
68 | imports = [ ./. ];
69 | programs.zsh = {
70 | initContent =
71 | let
72 | ng-completion = pkgs.runCommand "ng-completion" { } ''
73 | SHELL=zsh ${pkgs.nodePackages."@angular/cli"}/bin/ng completion script > $out
74 | '';
75 | in
76 | ''
77 | ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "${k}() {\n${v}\n}") functions)}
78 |
79 | # Load Angular CLI autocompletion.
80 | source ${ng-completion}
81 |
82 | is_split || hyfetch
83 | '';
84 | shellAliases = aliases;
85 | };
86 | }
87 |
--------------------------------------------------------------------------------
/hosts/neon/default.nix:
--------------------------------------------------------------------------------
1 | {
2 | _module.args.conf = {
3 | user = "felix";
4 |
5 | networking = {
6 | vpn.default = "72ab4eb3-3c9a-42c9-adeb-9f4730d540e6";
7 | vpn.full = "bb1d4d42-dedb-4598-8b81-d2147b3197ab";
8 | wifi.trusted = [
9 | "fad97450-a66a-44f9-894b-19d578ba6265"
10 | "9a3a989a-c30b-4b2c-be19-28094e503bf2"
11 | "ffb7f072-ae29-3ade-9b4f-29eec0ff1324"
12 | ];
13 | secrets = ./secrets;
14 | };
15 |
16 | wayland.outputs = {
17 | default = {
18 | name = "eDP-1";
19 | pos = "0,0"; # primary output should start at 0,0
20 | mode = "2560x1600";
21 | scale = "1.25";
22 | touch = true;
23 | workspaces = null;
24 | };
25 | ext = {
26 | name = "HDMI-A-1";
27 | pos = "-1280,0";
28 | mode = "1280x1024";
29 | scale = "1";
30 | touch = false;
31 | workspaces = [ "0" ];
32 | };
33 | };
34 | };
35 |
36 | boot.initrd.luks.devices.root.device = "/dev/disk/by-uuid/4500f286-2548-47a5-9432-d24cb032063b";
37 |
38 | fileSystems = {
39 | "/" = {
40 | device = "tmpfs";
41 | fsType = "tmpfs";
42 | options = [
43 | "defaults"
44 | "size=100%"
45 | "mode=755"
46 | ];
47 | };
48 |
49 | "/nix" = {
50 | device = "/dev/disk/by-uuid/5ad67c07-d42c-4871-b2ea-f4ea30121666";
51 | fsType = "btrfs";
52 | neededForBoot = true;
53 | options = [
54 | "compress=zstd"
55 | "noatime"
56 | "subvol=@nix"
57 | ];
58 | };
59 |
60 | "/persistent/data" = {
61 | device = "/dev/disk/by-uuid/5ad67c07-d42c-4871-b2ea-f4ea30121666";
62 | fsType = "btrfs";
63 | neededForBoot = true;
64 | options = [
65 | "compress=zstd"
66 | "noatime"
67 | "subvol=@data"
68 | ];
69 | };
70 |
71 | "/persistent/cache" = {
72 | device = "/dev/disk/by-uuid/5ad67c07-d42c-4871-b2ea-f4ea30121666";
73 | fsType = "btrfs";
74 | neededForBoot = true;
75 | options = [
76 | "compress=zstd"
77 | "noatime"
78 | "subvol=@cache"
79 | ];
80 | };
81 |
82 | "/swap" = {
83 | device = "/dev/disk/by-uuid/5ad67c07-d42c-4871-b2ea-f4ea30121666";
84 | fsType = "btrfs";
85 | neededForBoot = true;
86 | options = [
87 | "noatime"
88 | "subvol=@swap"
89 | ];
90 | };
91 |
92 | "/boot" = {
93 | device = "/dev/disk/by-uuid/6B80-B69E";
94 | fsType = "vfat";
95 | options = [ "umask=0077" ];
96 | };
97 | };
98 |
99 | swapDevices = [
100 | {
101 | device = "/swap/swapfile";
102 | priority = 0;
103 | }
104 | ];
105 | boot.resumeDevice = "/dev/disk/by-uuid/5ad67c07-d42c-4871-b2ea-f4ea30121666";
106 | boot.kernelParams = [ "resume_offset=14754000" ];
107 |
108 | # https://wiki.archlinux.org/title/Lenovo_Yoga_7i#Speaker_audio
109 | boot.extraModprobeConfig = ''
110 | options snd-sof-intel-hda-generic hda_model=alc287-yoga9-bass-spk-pin
111 | '';
112 | }
113 |
--------------------------------------------------------------------------------
/hosts/neon/hardware-configuration.nix:
--------------------------------------------------------------------------------
1 | # Do not modify this file! It was generated by ‘nixos-generate-config’
2 | # and may be overwritten by future invocations. Please make changes
3 | # to /etc/nixos/configuration.nix instead.
4 | { config, lib, pkgs, modulesPath, ... }:
5 |
6 | {
7 | imports =
8 | [ (modulesPath + "/installer/scan/not-detected.nix")
9 | ];
10 |
11 | boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "nvme" "usbhid" "sdhci_pci" ];
12 | boot.initrd.kernelModules = [ ];
13 | boot.kernelModules = [ "kvm-intel" ];
14 | boot.extraModulePackages = [ ];
15 |
16 | # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
17 | # (the default) this is the recommended approach. When using systemd-networkd it's
18 | # still possible to use this option, but it's recommended to use it in conjunction
19 | # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
20 | networking.useDHCP = lib.mkDefault true;
21 | # networking.interfaces.enp0s20f0u2u4.useDHCP = lib.mkDefault true;
22 | # networking.interfaces.virbr0.useDHCP = lib.mkDefault true;
23 | # networking.interfaces.vpn.useDHCP = lib.mkDefault true;
24 | # networking.interfaces.wlp0s20f3.useDHCP = lib.mkDefault true;
25 |
26 | nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
27 | hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
28 | }
29 |
--------------------------------------------------------------------------------
/hosts/neon/secrets/default.yml:
--------------------------------------------------------------------------------
1 | user:
2 | hashedPassword: ENC[AES256_GCM,data:UqNKMQZGo7VlveDUqjPR8mN0zjmr+pT1OSjMj3Ei83hWR2CXCmue4y/bHLvH+kSeme4dQoz8lGC+7phE0VZnsvSzdmrFOrqxVA==,iv:lVercc3ECuC/dbgU9pm3Pa7a1usZcjD2EbeFJJ3hPw4=,tag:MaBOLrIJE2T1SPCmsfNdOw==,type:str]
3 | backup:
4 | srv:
5 | repository-password: ENC[AES256_GCM,data:BwCZh8xIBseTL25RFFy4r9eluMfEb3Z7L0POU+7UZvXPC6x2d1GgrKwqQ6532rOzawp8d0KiRHQynVL781Onuw==,iv:7CtdDCRJdZcLkwEbLKBdpO9Lwv2W8fhXI7MPRyMWOqQ=,tag:TSSqVmdapZkpuCcf1iOJvA==,type:str]
6 | rest-password: ENC[AES256_GCM,data:yHJr8hFagoOAIgWP2LMULk5sD3Unf6vWlSCdOb2TIWNrmCgZFdKij4nGpjdvKfyasi8Nz1zwh0hJUP3ZmCn8Pw==,iv:SIKUAOK6PCUCBl8mlUGP85iDNK8GapZGlF7jgGX6P7A=,tag:Spgs1MztlSx3JtdcPyvceQ==,type:str]
7 | home:
8 | repository-password: ENC[AES256_GCM,data:pCZaYwgXATWOysmwF4/UU6OwJgumWxnJeh3aIExSpreIzthDEgwinMyVOhpUo9NfxdIdQOpCW0JcaUdmIF+Ogg==,iv:Op++W7T0VvYzH38Iip8cFffZxL/6C3yrUA204jx7cEc=,tag:ZIvDjVCId7/gOCpVPA3gdg==,type:str]
9 | rest-password: ENC[AES256_GCM,data:AkmcWqWDkbpsX4i4FOIi2N/UhPNNVr56/qsgXjRxp9ut6D2zyznbokyJO3uwsbM5wk0y4VeqjIJwV9++A60lXw==,iv:tNwuslThgxWZgpF7OwLx0v6pnsGtKLCZYKu4ZFsI1vU=,tag:Sg31L4eTMeXPorx3G8bhrQ==,type:str]
10 | box:
11 | repository-password: ENC[AES256_GCM,data:pwJzMk+AINzeJ020d+QGcKzTh0Ri39Oi3T5UhKZ1gntOZkEImBaHjut/UeYp1/o1xEhtrOEgoZf3xHKW1VXNbg==,iv:xP1L/KzRXzSIZApGSyOMb3Wzk7gre13WQz90qJYN53I=,tag:EqHfOSnzLNAqY+hSyf6sNg==,type:str]
12 | ssh-key: ENC[AES256_GCM,data:qeu8kRkjAbp2pjcvReZO3lQ+yzN9oM7Mjw/Ijd9hA3kfCo29rgJNtAbUoMnm1GUpMhGEH83zqCteCPvBL4vjz8ZGw893wuKxxIy1TFjq2QhRpx9cZ+ws4TpE1Aqx7RDElOR6uGvc212Be++5aDwQ0J4ThrJSl1xKefRRfna7FZFlZiLcnfWvv6aO1U39tIpcmoMCjlWcY0afQTsCFVfxrtt7Bw4A71IZYVs9eHkGcurCeX7w810IKAIRP7bgicVLwUFDKaF6awxs4oFGesQi2WcTZspsUxxPeagH5sfEDR2gobAfGLcI0h40eHl7zW5b0WPpGt4Dy8AzxbNJw+ppN1Az0HgDZ/xA0CuU8GPiyWKAHcneQ4qIIgqjGz910ShX5xcTvP/vL6RozxCAjdzlTC3hmFBfLEIm2kWsu8CsIW9Rtw8gPd/8Wkr2SlmUiPivjCtqIJN+/8VbiUTVByhhGJQ22t8F6at2ZKdA9Scms6VYFPELlpllD9l0+qf3duxBbR2G,iv:jCKJiatdmkr3tExp1yazyoFqftPEMQzG7n4OTbv60cY=,tag:HAEvcYJBty9pd82mIGyYsQ==,type:str]
13 | sops:
14 | kms: []
15 | gcp_kms: []
16 | azure_kv: []
17 | hc_vault: []
18 | age:
19 | - recipient: age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g
20 | enc: |
21 | -----BEGIN AGE ENCRYPTED FILE-----
22 | YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkLzZxaVNZZWR5UEZpLzA3
23 | b01qVW1UNkdxbHVZQjBDRGhlRHRiWXk5WUFvCm9nSVhhMExENklYNmwwN2w2RUZy
24 | ejRzYU5BODhUUWtpOTBsQ0I3S3FwYzQKLS0tIGk5MmdFblh3RjBMbGJrNnJkSDRK
25 | anNjS1E0M3lZekFveFdoblFkcnBMKzAKZeXoj7jHWeWllwPGV7UvoFk0Wc/oCo8o
26 | Sa4anpi03Gu0kONwP6bQWWlr+2+zHjS6vizZgAWmk4dbpgVgeRA01Q==
27 | -----END AGE ENCRYPTED FILE-----
28 | lastmodified: "2024-08-15T13:12:24Z"
29 | mac: ENC[AES256_GCM,data:7TiKuTBrjaxUzwx0tJPnN0MB/kyNNWDBtHdeGtgfGHlFVqxc37xRABC2brkujxAZzxMNU05GyJ5dBD9WKhLVDN3nAuadIUPjLrJoOhsWLt6nX7mtO1oangrMTeNwqVDS7Xcbo9n4BvLICvdxK8vw+JcuoHqew2WjvwCDjW8Eu4Y=,iv:I2T1s9rfanD/lGP5gHP6yqGFzvyrF1HJ4vaj/jetjNE=,tag:uOp+4bq2QzLE5SGfuxMWRA==,type:str]
30 | pgp:
31 | - created_at: "2023-08-05T14:48:19Z"
32 | enc: |-
33 | -----BEGIN PGP MESSAGE-----
34 |
35 | wV4D8w/Zb+cfdxsSAQdAq7+v7y5g8lhGR0MuQXmEjVeJbUtew9v5zYuWzkOy8RMw
36 | rPZrMDFuHwnBjsCtwAflgZ6TljXEctb/+PvWwbg+mncCwn6w0Eof++n/G4VzfZyx
37 | 0lEB2/9x0qyQjOptKTHXm64ScVufU3kdkNfSyIDN/vPuEcpSCmDuaZ8+J9XdjR/N
38 | tIuBvDQsT03fMzF5Y+GKwUN26j/ZYu2kVPpF22xxN4pkVrc=
39 | =zBDW
40 | -----END PGP MESSAGE-----
41 | fp: 61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64
42 | unencrypted_suffix: _unencrypted
43 | version: 3.9.0
44 |
--------------------------------------------------------------------------------
/hosts/neon/secrets/networking/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Defelo/nixos/5ecb867d90490637bbc466c3222fefa2752fca7e/hosts/neon/secrets/networking/.gitkeep
--------------------------------------------------------------------------------
/hosts/neon/secrets/networking/uni-wifi-keys/client_cert.pem:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data:Q+1Y74AOuX+Bg6g3xGlPVVSIYal3+giXFoSHuMUCyedhBmElaHz5UyzumGmU5vGAOJHyK5gdYOoPfunAZKzzjelpaibXXb/TiPEO9beGtSoOrNc+dLJk8/rzZShm7aR2VxHqcnoPigneg+TMv9aNfx+OTRPLAgcgTcly8NOHtGmUImf/qklol9GUCi9bHV7DVNnh7Km/HtA9HjzB967pDJDr8QLt7s8B/3AeKW6jlmEYTaAyBw0kU06rB5/sJn5oIJ7oPzPdB9PfJCRjoo/jfLAj5iUSyW1f5JWB3tgaTOhonpRy9AiLBvMvUzLt9nXfkOTXG+3byk6vNrSvlqRLGGiPry0s1spcASi/g32Js/NFcirKEHuBuy2Y885QlG9KD09yalMxoumkixEmHxO0FZEmU/KWBbKb29p06yTvZoPJtPpCgkFb7RVKWG+8ZyKOTliGN9uIHJAB/bK1COQoAQrHjhqvtWaoKv4i9HHrGGG9l51/uTyX2J6GDb1Sjbup04uyY7AgY77qpz2TTAZWeAUcRGQkLsHP0PFL5GXo1p+iQb4rZHcvPXzZdCH2enAaogojOAbQZ727YYvvhMN5rlAk7e073WdhNcaRLAj3bIXS7LzIeR2JdmIx99BRjAI9Udzw6HxCGLn8M/kfZBiwWjiXaUcKUNzYCji05GaX30dVGEwK0X50D38ymPR9c06fY1BKmdj0znY8DGu4+g1eP/eH27qr/V7cZB8S4xRljYDT9/f3S7pBUSrOe9OEjNoxv4alyF/T/iDPcLXt/9I8zO7M9RKtmPZqqxI6KKfY04O+VNkkRD0Xp4Asr255D6JItUausAzj2HK2qMsTXqKcgBxzCS1iA0eLyVj8i1bv2wUWvWfkQx6vwh9r6B4PnUBiPol4TlXIpNs5iOHnd0x4RX/UIHvFNFUntPzKlcwRXrPSZgqDfmMtTRv1Md95N/ACJiHv1+6i4Q3tYM3buPQG/ISQSplBGEIT0R6jOEwM43JtEDyqfRGYzgRe5p7VHtvyzvS0imj1w84iCq5/5l0d5+rGJpTxeg3+fsw+tfaItn4ahp2UP5KMB01zLEHXeg0PsErKZubvQ7k+8pbI1qrgH+WKObmkKdVR1tTprgFF3jorBUEm/uBlAISePtWINsRE+hXWrDyXz7tZL/A4XQICRI5HAmFg1DvCsktXn9RhK+fC34NcKZq19Iyjt77Se5Wir/oMxg8+rk9nFBe7+wogTKHcocQRNTnGdEGBpv/AjE8nRPLAzFcUWlu/9UjEsR7ed/zxRLL47fbyVLlBxHuxOpJ+vI3EjOs6L+31Jk4qJO/oWB6w+rV8+rRgdLVgiFsBXNkwcE2Rb68KJM03jKIr6z0x5OBy9zpugfJGttOMT/F72tXhTzIFEdU+fyc4tp+EOF6KraIj9iAixTiV20Fd0/E/HR9Dyy+unFTAusxcXgvxDIA3WE4N16tZKeoBabKyhp40SGBtAqmjOLt/WDU1JQTREScPIvGjXL+BOAwGX+OlzjE3W9/A+AP2uPcydkQNjVTpTQ52Sm6bydy+HuV1NpL3PhVSCZn0o5hlL2OS9cLFS6eXNm4/XU22qRV3Ju9YBE1pHEFyvXs1AIlqQ/T6KyTAWZsRHLX5zzKELwCkfYJp9HeDPBzr2o+tywEdT8T7xKlXeJE4jPcu6E8tARfbL412hYIt9o/NXTjD7W86iUwtqicNJmn2+a2z2agMgJqPGQAA7JYuvUFPTwkp218FdI0raVxkfBGSNvEFpfV2/aosJTRb6WsGV/w/x42j4TgfAaOg/g1my94lxwad8FCXsYiMOZVwU9CmU2MyXD/QyfdK0Br1CN0JEtDlbEg4tWi9cVCje+NVObmQO0c4pXy/iURm4FvBnm+BS3rYm2qyqPTQrl6YY9McuPKFRQsKIO+6KlcZ7DiMs5lFayrKjr3XdRySmuiVJb1plFShBAIoR6VIenKBcSOWtIDq5vHmlPjfORC33/g7xRhh3IuXTWQzRYdwx79IQg6+a+b7znoXKFPvDO6aUtFCtsQqdN9yGhKe8x3I47Mi52En66vQsoD//3R0+KJ7I64nRPQPJimdtf3De4czWpYX/9IBDHx8Vg87vJ3vrcvtcHa0lJwuq7H95XF1qBtJCmZNkZ8dyBarNBKIpV/FmkbK9gajwEUNLBPlje2qvSbO8nlemfUv9+tYhm1Wv9uGhbuy2Rp2SUNESf/LH3lvS5t+M0/n02A/PMOflH30+PzaCk4yhWcQtxnod7aai2OB3atxQBLB0J03AnXqOYCvL5qjAnP6ob9+jAZvJRPjPzydUaAkrloLNkxJ1kdYLKNTPS/J+Dm41DXoGqEagdVA7K1Z/2Hjxdu5bsldBTdXLJnj2NOBvPh0Y4FyjBu9wuzpyIMnNYAHnvADjCF1P5SQ86r6SaN2kdUPHyyWWrigSLOzyR7tXFeiM3xU72YYMIJRRQ1J2nEijZG+2fJhtr2T4BxNQDHds9aNm/w8/C/h+ZSwnA==,iv:Am52WOhQR4L7glcnlJk3v0ZiyE1o+NgdsGH62XA8e98=,tag:x/75L27oahQ2oIUZ/1kS1w==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYMUlLZTMraW9HRmw3bjBG\ndkh1UlQ3cjlsMFZ2bFViYm1yVkNNU3h0QVRFCjVxRUdialJFbS9jdHR1Yk5IQXMz\nOHVGNFZmVzNjaUpYTHpjQ3JKd0VhVUUKLS0tIHdMV0YrMUtIa3A2WDJ1T1VGWi9C\nNDZTbnBZajBBVWUxNHBEaUlQSW1rT1kKVxqdQfUzq9FmECB5fhY1Du+PVOYA+k4N\n3rNA4M9+kNgd4MdjNn34Ra5g6zSarRrT0iiZi2sgF0n4L2hHydjyYg==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2024-05-14T21:28:54Z",
15 | "mac": "ENC[AES256_GCM,data:K1XCx7RiLpGEVlr/u5U8I50+hAObrLWLH9cQCJnTkIG0L39Z5uRgZM6l7j9PDqf+NpoLnnBc2iINkFqD3kQ5jGrbLZmL97kDkuItOTqO9plW3UyElKk4jUT1Q+UYO6zrGXHojQ7/v6HgfN40AZBHWtObRR/OGnZ3cLfaAUbMEHQ=,iv:Mf/9A+/Ubp2uch0bWYz60jyyUY1ic4vLlVG0HH9zNtA=,tag:+ynibC4cc0DsWRwoIApZXA==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2024-05-14T21:28:54Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nhF4D8w/Zb+cfdxsSAQdAq+u5IrJAmY87viEUZHQdWSERg4iTwCCsTvE64mN2qmIw\nlZAx63ZoAUn3kswNDWsZewD2Rd4h1hyE0cY61WsPVzFzMjeesh5jYJdflb1VwlLE\n0l4BPEN8E9CuxOe1n1m268c6rIpcFsotOZndOhksDthaU3WR8mCgRsejPwwPJH/Z\nTuKT8KKZ0J2bnbQ6us1NKIY+UtfURjdc09ZokEmvGvPibl0IXyCrnvDF42pkqjip\n=bXyH\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.8.1"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/networking/uni-wifi-keys/client_key.pem:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data: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,iv:W3wF5CZ3AUsKl4/d1e4h+B8u7nkpHAUGCnsy0p1Ud1Y=,tag:Uva4jCDVMOrPGnehzR9Few==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzMy8rQ3luM1JQNEJRWGsr\nMEJLSTFRZnArTHdMZG5mcHlqdmQ1bmFrOWc4Cnhhek5DTER3RDZrQ0U4RzZsK1ZG\nNEY1cGpxRCtGZWRhZ0llQ002enJ2VUEKLS0tIHlTclllK2YraEx4SUJGL1pNMXFv\nRi8wTXA1d3NYLzNXQUhBK1hqcm43L0UKfSauxKjU3Wk2UYG76JbkCScZEpft3o3O\n3Ex1aJbV6eI9BA0GP4oTY1t0CTn2cOurvnXA6GRo80pROe1EzxLhMQ==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2024-05-14T21:29:10Z",
15 | "mac": "ENC[AES256_GCM,data:qOXeAYHnB4TPr1q5HPlP0uwJ2UDOtFRBPML6YqJq2PoFE85Q6rjEQK9cVGTwTZzZ5kjlW1T+VJ6ePCPfSFMJpN8U33wrs8BSN9fnlKulY/pSheyV5ZfBJzQBpDHsmNJOsAsburok7KbC0vApH+Nj9l8ODE4SCUwL/9hwe9ZF0SI=,iv:IAkEQEymei3vlFdtUReFYSHtW8SNQI/wDF+E9PisaR0=,tag:m1k3GxWZAxvn7KYGvJsdsQ==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2024-05-14T21:29:10Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nhF4D8w/Zb+cfdxsSAQdA2DRrUhZFoJqWREhfQkXxyUrzvoZQNutr5QynGBqxQlEw\n/YQEOdgsjogo4/AEI00m/c79nrF+T2VIvJG8MJHKdvaxdt/pvyGQFLEh5U3xEKLo\n0l4BTlmMM6pMmPPGGFxRsDRPSi0g9vZR6eDIdqwFaWPP175GCikR+52i+k2Qynie\nl9BNp8lMP0ycSZhjEG3TkSgDpmejJ9n+lQ9ybxBLCjSm/GsYR+XocYGexP2gUSV1\n=50Hp\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.8.1"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/networking/uni-wifi-keys/root_ca.pem:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data: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,iv:NhiOz1Tv2rv7TljgSYsmnH9JiRNW1IposPIeCuC5nXo=,tag:WAQLhPmn2G4uV+mOEOimIQ==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTSjNjczNwTUFhbzJMeGtZ\nbHVaSWFaSzFUMmlXYmdPaGRJQU1qTmxUc2dnCkxCZFVwUmlEQllyS25RK3IwZVNO\nRTlaWUZ1NXBBeGp2TWtwcEpsSlRzRzQKLS0tIFNxMzV4S1VPTCtZWjZ1bml6enRM\nN3NqSk9rNDgxS2NuM0RxRTVRN21XT0UKSfIyCqEVPTarGmOVaRj8kxGqUKs3PNS6\nxNeDN/hDQvQYlYf26RAQ9YVY2gFjIBkeaDa1aKAK0fTJuzVQm0uW/Q==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2024-05-14T21:29:13Z",
15 | "mac": "ENC[AES256_GCM,data:PQzH+L6hTns3k3+meQZb/OQ8EZh7l5cmzlKFIbsuLRvzbUZ/sIY7RdZIBXdzXO2CpXa/N4BcH//aLN16roA0g6GrwPNn9ZRRcV81C3FIChS4bQGEZOy8JykimJh4ceDZYoq6XfkW/YHjcc9UNk6oco/vJg/LLcemX1Qr9rEDB3g=,iv:B1mWylrrEQNxGsFEB/w+ZY2JmDz+GjfSLuyFy76J18o=,tag:cPldMiiWSdQ/3aG6eMGTAA==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2024-05-14T21:29:13Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nhF4D8w/Zb+cfdxsSAQdAJWhC0skZERAURuSTsm7v/tlqFP16VqAXo5usNYYfQz8w\nXNDw1F2t2oHE/r9BWbYpAuAcSCIXQHMZ+SFNXkBdxEGe19vLOihPVX5660fXJiT2\n0lwBNuNBEWwy4MQCFhV8gBiM92RwsnT0Y5hzDbJngv2FPnELxF7a3/yeXOlTL7Bz\nhYDb2c8ZSstkBib7+lNRUjZXi64iU2nSdTxJKJ+wJW1SpA/8JIFcyjVxAbZ7YQ==\n=5Mr5\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.8.1"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/nm-connections/home-wifi:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data:cIGnlN/2wXw2aO1o9G65sgGLI5pk1o+U2mD2FI28QpgGGpjRkcKiEoDTXoIpG0tX5CMBqvh6qNGMEUL0+QrJ027CNCW9h66OSMdPColy7OlGZEklQky2lOHedtnabXKEjJFpareSPnBctGa6Kxlxz8hMNqLMK/yDsy9EsipxX8fM+FgXIArgsy+K2lCvA1iKN9anEBKWWTU+CQrHUJljCqL0Y+r6ukDUIr+y6sJcxMwBE+UNgZzR5Nq3a3qHPi7xKU91v+AJu0EgA2yjJJlBQbQR95/NoUm70jmnfzc4t841Btq0wirEYr1Cc6SRFaUPGtz6mFT51PxQXSIP1zFRy/Y9SoMNn+oUcJc15LEAMckrDhomkBOJSSe/dysaPOrmVVXot3zk1UFcofLR3Z+iBMjglPlHqI2amapO5DDmenvPGY3CAlKqrlg1gOIaukML4OR+gaH5/NuTq75FMh/j5d8I7Bv6BavveEfBeerhZYPvaJwJrQQ+0tZPIg==,iv:LlZygQQW7VU000SdBa8780aivq8EieEhRs1yA1FuH2E=,tag:oqCgvhZISrOBmz6o/56WEw==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDVVY3Z0dqaDBPU0F1MFVz\nVGkybW8rR0xCZlYrNTQycWJ0RlpnNmRJL1hNClYwQ0lCRVp0N1BkU09ReUt2SmVs\nNFdBaG1YMzNGM2RNRzF3RkVROXNrdm8KLS0tIEFveXpOdzF2V2xFdzBaSUYrTlBQ\nZGtSditZSXMwYVFmdjZIYXR6akNBV0EKCQ/I0wGxCABEld2TMRCFEWOwhoNh674g\n77sP+1Q9UMUcHYVJL0kHZRGOWEDfFxzecLInYAH0Yo0DW3R12afNFQ==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2023-06-14T21:33:09Z",
15 | "mac": "ENC[AES256_GCM,data:rd++zGaLOlmH45mcPGtb5EpFS9FPkaswEL3FEsRCgBuopCJYE+OxtHppoec9GTKT6q+7qy6+KKbuklf3g/6iWmE33U9VqwMdAwq1ouTEsNjwPBe1kbUVXceoTwWdJFxr/v9kG0Q8r21TJWCy7JGN6eOYNBatSDo44r8hezFKbBs=,iv:jhRo7CLaD0AcFGgrOVSm0k2M5qieMJWn2svhNkE0jEw=,tag:2jj5ymhhEK52kgYiDrEbWg==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2023-06-14T21:32:59Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nwV4D8w/Zb+cfdxsSAQdA0em76ZVsXUhL2hSmi/tKupbkVP18f2tx+gwh3otF5zAw\na8iKP4wb5gFAxTWmPm59e5t1IRBIj2DhG+NFbH1KOyAy/VMG9Qe8EDSIKdnftwQs\n0lEBaEABpYE/eqVThdP7JBXGpkxCsmkEeEO6EDIrwMyHTO+CEEfuoRnY0W1P//v3\nKvXkGOPEHyim1KqR/oMmIKQSrC9rgLQKQlaMk/8iYKRogew=\n=4tzY\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.7.3"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/nm-connections/home-wifi-5:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data:3DpY6eNe+ThjZkYKo40zK3ByGtHxfbC802RH7NZ1Pvmfm4oqsRAvgXRXp/Cb5c4Q1e+uTiNCRgrlUqHGcrEVaOJ/1U2U8bIcskzusSVtubb6L2Ki3brMcPV8P6BAg960v8HoiMNYuw4ypD9kVgWhEeqGPeiO9YMdngfKrJvQkDnRNVWBJrprivG1iZEGc4rCLEPDEgWhSVnpZa/YetdqvA2n/f5cf+pvB3zeWVgtddCsmbizXI0r2CzvPAA1PB9canxf2m9H++9fA/spf/ZzvjESsW2E2pkpdUIe01D6yuKiGOoadOeL7tli+N5DG5sKtbRbHrRbbZGx9hAnxgYS8OagdD2Cjxl2Ww3OiL7ykv+4525W4hempmqhCSAlEO84MMrFC7S+gFu7fL4pb7sDJk5QU/+99RGJ5WpocJu0f1BSRg8y6qGD+wRowDHQD2iA6F9MRyUjUtUaeQiTvBNdYEOcO3A3GAKBON2OBb70eB0Ya0kLul9YLAnzfC/UUIfz0d+1csO9c5F7AtE+5cN/9G44uw==,iv:zbfXSxjMreEK11VyR0BvKcie4EnojAySKfnvKLcEaa8=,tag:Rpy50jzV/5brGOWD1P5b4w==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwWVZKWWFMNnBmdnVnd09K\ncjd4N0FIY1AyYlZhRHB0cURlejNLKzFOQnpRCkl3TTdzeGdTblplclFBRmZnUkQy\nWnFSbzJqZXNaNit6c3FVWkZ2Si8rQWcKLS0tIHh4UmpiRmdMTDRrZzRqZ3pESEdq\nSG5kU21tSTBPK1BJb0I0NUhFZS84RzgKViCuNtc7dh+zwpjBJL4gAaltukVM8W+e\nqlR6otDy1Yvj1COTcR1tK8TY0uFWjBLzw1vD3yOJcfMT6zrvWnGTvA==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2023-06-14T21:33:09Z",
15 | "mac": "ENC[AES256_GCM,data:QqCyT7PxwzYoN/BAv4jvfKJPsLG0VyolQYprwlT0bC5Zu1txwmRwM52Zl0XibX/NwWMTyp1SutC955TvaK+JEbHB56+dWyWw5U7lWh7hNKjKT6no0pEFkpkG0vZj5KCQehWMaZWxE0WrrzTZD5qwIrIn3g7ukR98LkpeTGvSnIA=,iv:k63J6ivZL6a37A9edQf9w2euHBbhvz7FLkDMx6WZxB4=,tag:FDIMCRtSiIbMfSbSt9R9rA==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2023-06-14T21:32:58Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nwV4D8w/Zb+cfdxsSAQdADpwuAIRXlKLf/Mv8UwYm2jQtIXzuYmehe5RGxZEO9Tcw\nukgti9nc2qlCMUoRAeyJo3YIxeMyWvate0B6ReFRMNyYZ33wfVVAe7dwzSiFV78Y\n0lEB6IPE1o39LqsdcbtR8TYQHrzZq1HSKLGaMSvKEA8kr8DfSYFIn6xxegFn6HpH\nRHq2pPVQI9boAvUVpB1rGypbChkLdzcdVtvwuHkO4c0sifQ=\n=cztg\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.7.3"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/nm-connections/hotspot:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data:+02y5D8kOpE8MQsKAup64OnGh3HBx8nCrGvcK43wxvk74UehpSx9en1rA6KKhR0mUeBXiLaAOJEHkVwoWAlvGi33gQ+YaCEs6X8uSvlvi1b9LsI/iTMc1DIe3fYnDAPpDjQgXvvWHFcgn7YhzGhC14mzzBhb6RUwjfz89AbfTaQ7THQyUcseZ1t5kg4LwCZolnP4a595wxRWfcbokf4cxC0+vxh6uZ6yTv7vjyWMzb9b9VNlzzWlPLt9LxNT4V9G4TzbVTM/FENro2kO5luPADBlfr4AYr0fjd2kQEIxGCH+yvqfhva1yCiX+YF0CK430q6bxS/y9/nClb5lytjcF8aFzcwXUWmhNwPiw6mPuWHO0X1braAz1WwtUnXSUT10FL/YHdI/C9FIr32n4/aGv3GPXFtaea3kqYwCfof16xDQzfqsmGEq,iv:GqDu2eJh5FRlWe2GE1MOi7JP9BCiyU5VygQ5b39GF2g=,tag:C4MgOeS1DKnqmtFNfNTraw==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOTXBqZkRROTg2RFIrOWtR\nY0lyYVVLajlHWmRNbGdJeVh3VkpuK2dBVjJRCittaldTakhCcXF4a0UrTElIOWdS\nWGFSbzAraUM4dnUrNyt4VEJrY3JmK0kKLS0tIGNXeStaSng3amg4aW1BWnJtTkVu\nWU0wVHZOSXBUZEpzbEJOeEpPbVFaSEEKhwTfQDDRKTPfv1U+8FV4MMhWE0Clao+N\nMCacH6qEQx5O22yPz2HhV65Rb3OqQsz06Q0oNED+LUgGb7iNdaBBtQ==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2023-07-30T09:56:07Z",
15 | "mac": "ENC[AES256_GCM,data:XzpQdcA8FFQnCD7Q76HhOb2cV4yb/QODFY7ojCvdx0xNfh9C4mGRXNudj+YTPqQN6XfU9W6vEz+3cYr3TLk1qOWxme5clGdNTtVO/2YsUDACaIbAietYMy+9FJnN0p+JMDwQTJE3L4oNVBbyj3l1bc0fEWEoGlTtseGec0e6YtA=,iv:UU0cB3b+bae4dqj29qs25Clmq1C28dWoqqVWAIcpVcA=,tag:9K15e6yi741vQNCGqMBs9g==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2023-06-14T21:32:59Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nwV4D8w/Zb+cfdxsSAQdAjkM3tyNIeKa+GSwx2xI6y61hqb1XxKf9nKlh9jeHFlow\nO/E3hokktS17lgHh6pGuaxS8i/Ylc9CaHonUkqZSx/ucLTp4Hy4b20vNnW7ziIw2\n0lEBGHj9o237/LtTAbZRc5Oo4xdqR2+vr6iI2RlWgAy3B3eOS1D7xg+dsPn+jHE7\nf2wTlk9E49xq9gFw1x753Ul2RdYDyNbqBw96RMkFH0AAgts=\n=dW3G\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.7.3"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/nm-connections/uni-vpn:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data:m8C5kaVg5NFn7OiyJ/H2bopVKB673G8OE1w2F7qQmzmsqV1T6nQUnDyNIsvbZTT2KL5u4pRtSecJPFyY7pix6eIuu15yJmzpBlgCMq5/VitYXvcVcMLk1H3/7O8Yy4mjOeaZaeGfN4WDV8NeNkoeZM1bpdGNLvd5FMf7De6cINyli67N6amZNWjLTQ75z17FomQgRZhGZev/6lpdJyvXSY9RJtyUI+qMfRsihzTGlbgY0VIj9NnG3kXsBSaHKGpBgFV0tY0z2AjeGVH/UnsfWgpyNoW8DZXwbj/M4nuR9rAHHcnVLGECnT1yb4VIyfCF4XITqnBcvw3+HOHacTDoUQNHTVEJjEVRwl22817eW/TbXEByfaJoX5iO78wrosFZ/CeeFbCDQ4ZFvgNJm4PkGrRc23kkfotBOjPkzukQsdYSHSMRWfHSI1liInYnZ6225WySADI9IGC4cgchLYsAF9zpAbOWGLYISFi459smJIX5gzjzC7N+f2Db/RSGJ+WFuXeEAIPhl1+fVuhA7t6WwQH8xS+coXEiQKqTkeDmDX2f/TPV6XpTl+oHQp02WlaOkIzItwHhUHK3oZLhm/ZMa0t4k0GrM1oCLb4iM2easnFpPFjCeDbRlh/MthVg+F9kgThqdtjCdvw0owR6O+OFgS2947LGMNzI7XrRMoelRpBamNYbiHsY7a8Jpwe9AkSlPTaoO5VgKkHZh5bEkK/1V5NGSuU=,iv:YPHktvUSxz0kj9Smk14gJ4NvCjPiXPppY10EhTo1cyQ=,tag:hIslWrxeoZrzcTI2DOIKxw==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvekxKZ09idjdCZEg1VWx2\nM2RISkQ0T2N6Y2NWVkV1U0ppRThBYlRhNjNjCkdlVnBnNU5EQlF1Y3RpRjB4WmxQ\nNXh0TnQwbTY5U0Nqdy9mbkkydDhVUzgKLS0tIG1wTGluWTRQTndEWGpKWjhoN2VU\nUm5nbkRCKytZZVh3QWRRQW9xblpwMUEKeYWmUVgpImfhelTCNBQhN6dieRg1DLpq\nDKe9vcUvvxlGH1uEloeg5uGLKVMzz30TD7eMm4K12a/b68OwwZpGSw==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2024-09-26T13:08:50Z",
15 | "mac": "ENC[AES256_GCM,data:qzykPBiFR50KeUx0Qbn+U2HopjJnsnKsEdbhWFP2sicuLUdSGX9Ktu9wV0EVUvFjg9Z+i/svvDiwIuhKNaY+7GUEfaHl7lhOUaIYeuElhSZyfhPeQsDwy3HmL2wsmTj3YQMbYBEWWZ2gafirahCcgwPtLY8bfxOy87kOpzWVdhU=,iv:NxQTtmn+SFRKDRZrThttD+yMnKUPpKgkCkRhQaSsSGM=,tag:taKTWyezNmwaY0NaNxTtaA==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2023-06-14T21:24:40Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nwV4D8w/Zb+cfdxsSAQdA2CAHg23OkPNxwugZ6JmnVToZcwJIrEJ3+ep5G7+17QIw\nCIIFxCrIrGRPSDWi6/l0Am7G4KyvYgJKtS5YzBK6xEaGeE57ffGWyoLaNXI/88ek\n0lEBEbybGaDc8d+t7RPP0TR0TJI485huCBnkkZpasXKWYgg23a/3pz/BCGj/Kg/w\n84e4Z/Ss/du50xOpd0KBRBOWijkfSwFkQeGDE3NjxB00COk=\n=nKtW\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.9.0"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/nm-connections/uni-wifi:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data:9Gv/PIoOGvb8Gu2FcgQuoKLnb+1pp9ulSE0iy0Tel5T3uNmxtI45Fm59cQEfI/NjivxrSmUAI4+ATED3gc2hwOCatGC4+JKnLQiXPHu9suJCSj8w6kSUzeUSr2HI2rlogEzJkgpoFKbTzYVO94Hd3HCIU8/eNuS3bfFwilZJIGBpB3+0neOU4BTYysOSc858wHSUunLK0O/zmzirCfMMZWUdzk2gX2EULS4hnp5TuswYniqjuyCL6EtLPZz+5Mryqb7d/t2AUtxc+IaDwRdKC3USllq5PSple9wTs6OKxzyIhWb50fhP7KvQ1I1/2MBb1sa+u81zkJN3Uo9bYevyyWFGOJfueZW4U2W/dZKdX9Gdw1ue058nyLiPXfd5d4y3e+ea1ACpkdvnJKuvHkQp4PCKaWbsF1iTy30X0/qLhUO5dxjVFqU5WCdY9CgdI4SBQi1BFIy5M7QsI8uJx2f4MiAuBw5Jy17HxTNgIw9RyOd/MDUGzU26/54EBwHMRmnsMtxTrzmQ4hLmfB7fVlg1Icw8KKaqzbEybFtwK0v32DbrQWyCDLlknj7wC+g3wqwJyyfzOZ4NSqJ8ULA+pWYZ889esci7+PT9UH1znywPmySuQZB4J+nuR4EIh0R0vfFm9aZVQchBrRjeNU6OLkioMkivi2AIlWL0bDWIR8Lcs3oDJZx2smIK2tDOX+scvTnm3KgSSSqWWtg+oIzdelQl0XvQOS4NBCs=,iv:n4fL/DOfyhYcUP+HRH15x+8NuBxEIUN2oS923tBDdS8=,tag:lxGcBXICLAljknz9Oj/7eg==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaV3ZESFJBWEh5WXJmMThv\nMVdCU3ZIZ2Q5eDZBem1qTlVLMHZIRUZ6cWdjCk82eTJpSnRIeG1uWFBHZjFtT0xC\nVW5EcytyNVQybVFSaWsxbE43TmVzQk0KLS0tIHJXREFMYlRiR21DOXVBTEJYdjJs\nQlZUdk5md1hBNFV1V21sb0k3U3VtUVkKzbt1JbGCRjvtw/QeKdkRCx6HVokcZyeb\n/hGNScAL2g3RK0Sylq7eyM0V0gOyo2/GmXu/xvxlNtlcMQK0kRIfVg==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2024-05-14T21:32:05Z",
15 | "mac": "ENC[AES256_GCM,data:SZry0MKZ+97KcegzCUkQkVUgfAWz8izmYjziMD0/UEX2Pr+SUek/58uLQZgw8GW/6RD31g990xgh1HFa6UqgR2ifwPRGEZCh+xP2R7luwf2iMhl5rOzDjfhLHmV42MgMgDu0j8LqciLyjakuYvZWbiLQ9ofSK5CyzTyiOnkxCIE=,iv:okqN36LoWsz5P68bUlk6SIZNzqzCVn1PYw6+pY3SBEg=,tag:Pqa4C+0oBsQ0ytJtsnnUJg==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2023-10-31T17:17:00Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nhF4D8w/Zb+cfdxsSAQdAvuTgknONSh+jZSIPTmd39KLZK1KjOtxYj2NVVpzqpwkw\n0Cypib1VwIJNLzieycs81l475nX/xkVQCK1s8GWKs+WVJmSCwZE2WDJrc24xNHjQ\n0lwBZDZkgrj0rBKq1PeUjmkFB4Q/AiiahknXjT18y0cRqCm4KtGFGvBojqodHhjO\nbCFCEQqHWGeibOflZUBjzknwoWd0TPYKsFL7SHre4xNJcF2f+udqRnnjWdA+tA==\n=OAAt\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.8.1"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/nm-connections/vpn:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data:w2gUzQ576mmtOwulv5Xc/RxipsatsApbAqM5Aw+hvVJP5/iWr57TpUz/X4MZBeJzePA+fIxJrOdBL6lPZ0hKR68b+xHC2wRV6Mlwf2sDFfvqgOsK+fA5OGjubvDjq3DN2yzeETgzRateFYVxxTZK3YKREUDq7SAsJ3H1DclwGchW8bCDSzSu27F1UR7/xEDOc1K4ZG4GxnijplaWM0U5O0w65qsFJwWYmtimMBtz/AKKtxqLzWcp4lH6SJPinTrFwvRu1QV7/wYZyxOy/07m3DT2WHzebB6XLEtLZRG/VfcoXixi49CxWtwjo8bmBdPUhWSoiFT6nQheU44e/9JNgisn+1CuL0WXlzWM8wxZArQQQ5jl4UUOJsyBxGuUB8rbHKN0lhRYqZ0coreVD1edtOCWK2oMUzj1MfDPmVXru/wO/VANnRW451i3cgH2Xh+gJ/8VyHJJuyWp52bQu0xI7ua+5JdBDcsM+IK429hKnAT3+SbVzDzijLSJB8glcq++6z4sq19wE5GModx8s3RZRxPqOAWcOupRYKak6wnRXNLTXsyFGLBXSIwAGVVCWnHu6Rn6NPgichzW2SDdIgAT2Qwj+cOA/sHT3tVPnypSDq5V0kbXoPJe4sfOYwxyxGO7f26plkSFufeIVVgNgqMUJrVX0oerXTSR6xbm7iqtpcr/RwWmNSAw61XJ5PzxVvza25Kc/f7K4DAtRSVlVB/SHkDJr6u9gIGPgDWjy0jiIhb9lVJjMHDovlSmlOpmZq0drmZ83AYQq1z9,iv:xvps9pPJ/jbr9mzvXEJi+wcuew78Ewvu5ieD9NnQcqs=,tag:fMm9ZJWsmbdwolRwJ64huA==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkdUVsS3NCWUowa3l6TmZ0\nM3dIOGpBZUtUS3hFUXoxSlo1V3NxMnFWMG1zCmpnZnJJSkVWVHUxaXFhTkIzbDhW\nSjJ1ajloOXRFSWJvL2JWbzJsZHVyUWMKLS0tIFZrSk1IbUY4bmNrQ1cxc2dhQS9q\nYUFwcHVoYjV5eUJFU3dIcEg1dWMzN2MKmpr4HAqNg2NjDl1sXHeY6SYvnTTwKwTO\nsR5Imq/9RMt0HkhTvpFSOGKOTXm61sYlV19G3C4ols+LLlqcDFJc1g==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2024-08-17T15:27:53Z",
15 | "mac": "ENC[AES256_GCM,data:eBKM6Ag2yHjWbUxfL6iQYl1SdtcBNBw1bXpHlp90ieGViCpOr0b1JWQQ6u69Tx32Rd5suhPCF+p4x9+3Mrag76+Xl+bV05UK7DhygB+mfm0ym3bFQoZPDDb+N6U1NfNPpNCXSd05X++HT22SPD0iv3LeSzT+ggenYdcjEHNicCM=,iv:IjJ9cAINrw8mabgwpfQfOm3kuo8Ef+3ViGDdPJJ7b9k=,tag:FuCWp8WY153wFLoJKCbkgQ==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2023-06-14T21:24:41Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nwV4D8w/Zb+cfdxsSAQdAyz+YU5DyDruWc9ukIYfbpAK16p4VxhypAnYdkcrXjUUw\nH8aT36U90tmHpiIX+kARVi2uYvZUOspmMFMCkwXAsNRYEpdqDkN55N/Fqx8/SG6h\n0lEBAHVY7bPL01xogPozw4JNe8jVSU7AfgeFIyIN/EXc9ulcagLzlDSDHjWhHNuk\ntmAE15ypsTehbIJmvr8RUa+XYWxELAw0kqax6VWFw+HDtNE=\n=ZyAs\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.9.0"
25 | }
26 | }
--------------------------------------------------------------------------------
/hosts/neon/secrets/nm-connections/vpn-full:
--------------------------------------------------------------------------------
1 | {
2 | "data": "ENC[AES256_GCM,data:3VRVEjAp0lTA6Qqdt82ds+xOo1oNMWmWFqCdBpHW6HEuAJqep6En2M1Ctpfbgg11feY/ecqrM0UrHy8EPQRuKkyRYiBGCHHgpAwbpyfiQhcu+a3oPB+MK35ifmiRgZUnkQqfzPx1UGz+1cgZAntG0tgFWHYq3seBLxh2fIojNTu53qXGzYarAi6XWU8JadCNXiSXC6i57dmECm1GMR9Kb+kLdbBPLPLRI5bJ662r10zysw5aZKZboE3psSHhrcp9mcv3ATal8z/ewt1ArWu5nuiIXa0BHwXAcG167BRx2h5RYENtwXFZCJgvLXN+mKsf3tyfpsbZjoJknFprVrYqCocRiFtpIBx8uXHuY9gu8GOzQ4YbUgqIrLXuPTcgjHaK57EIGK/TnOxN0fWwc6amUJz7sV1qXNV5jHIQVcicTasIjUFACMeBhLYSkCl9loAss1UZZUM3C6ZrQOIF4UUHybPTNZsIRmLo3Nul7JdtsjOp8tSzi7Y4tTZ8ViVHLMYk8Jn0TpU0Yus73Xt8lCJVFweAiIIFO3eJ0cMcApwFY9Zm5wT1gEWGRzV3B9lULbGyQRddXsro5xrjjWKEEsHBaGa+qYVhVM8SDtvbMpNTHNTqAHZ/3Il2Je8TcHRE+Ncl1aIy9dGSGK4uy1onpbf4vDIB/Ni+hrgtqiHT8BG9yZkDhCq0u/7IbBeWfh6RMXmpJBPYyljrB2hFijU04HGrE+FgQIHB/AyG,iv:ltLQXl2asFT+wHD8LFKXKyeo0EFBQGvM3Gc7+ENJgXg=,tag:TgaajggiLc8fSZQCoWWoJg==,type:str]",
3 | "sops": {
4 | "kms": null,
5 | "gcp_kms": null,
6 | "azure_kv": null,
7 | "hc_vault": null,
8 | "age": [
9 | {
10 | "recipient": "age12qr4rxqrrr59fa9fqtvk0jtf9hsynv3jf5xgjj3fdczujrz65paqh6qc8g",
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFeTUzcDNZSVpyOG1JTDNI\ncWFzdGlrRkJldW1tamg5UUZMbjhIUTE5c21vCjhVWXV0ckxSNkxlV1Fqc21hQ2hY\nQXEyN2xUQ2lJTFV6dWovQ2R4ak1Jd0kKLS0tIFd1d2ZlL0pIalNqREVTQkNSUWtO\nSnpGYUR3dXZQZnZGWHgyUTFYMk9yRUUKJrVL5bv7tpgGR+RkD3JVn1YV49suVl5o\nEcZAIoCJ0kqaxpYF+in4L6HOr5/oHpt2qNyA4i8oEVxF40rAr4wgbQ==\n-----END AGE ENCRYPTED FILE-----\n"
12 | }
13 | ],
14 | "lastmodified": "2024-08-17T14:47:31Z",
15 | "mac": "ENC[AES256_GCM,data:hKNh+hRqmw0ol0VYPKjaD+eVvZAgbjPES5HbPkBpICLtdLiqtrHEIgdcOx66L5AtdfwruWGvzw7LuhhltnmWvnXNWgCmquyQG1DBVBSgmexjn/qxwCuRGuW+VjhlxEdbS1WJ6XJP932rbG/0iCKHrI561EQuPq+aJYf/Zi1LdVo=,iv:PtyKrC/90zR+AVSiOJh9rnZhY8NXFPe3zoFAS1NUY3o=,tag:aE4bfJWhYDNyAJJg32r/rA==,type:str]",
16 | "pgp": [
17 | {
18 | "created_at": "2024-08-13T11:21:34Z",
19 | "enc": "-----BEGIN PGP MESSAGE-----\n\nhF4D8w/Zb+cfdxsSAQdAjuSsbhdwNuOvsf6F1QyTxLCzGZtWlhQWVSO8j9H4xXkw\nJrc8rszFtIUcncyHLMsanl5D/br+5QWOF9qh/aphavqCrkimDY44Soiv5dFZmfAj\n0l4BTghJht/yjI24DneUUOoBJm0LjEu4sC5CodHADZLGSEKqw2GmGObNcIRLN8bi\nC/7PilV1kteE7QF0gUFGm02KVbAO1otj44mhjnIqQCZYvnoRFkAQpqROrTljeL9Z\n=tcoA\n-----END PGP MESSAGE-----",
20 | "fp": "61303BBAD7D1BF74EFA44E3BE7FE2087E4380E64"
21 | }
22 | ],
23 | "unencrypted_suffix": "_unencrypted",
24 | "version": "3.9.0"
25 | }
26 | }
--------------------------------------------------------------------------------
/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3 |
4 | "extends": ["config:recommended"],
5 |
6 | "lockFileMaintenance": {
7 | "enabled": true,
8 | "automerge": true,
9 | "schedule": ["* 4 * * *"]
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/scripts/default.nix:
--------------------------------------------------------------------------------
1 | pkgs:
2 | let
3 | mkScripts = builtins.mapAttrs (
4 | name: deps:
5 | pkgs.writeShellApplication {
6 | inherit name;
7 | runtimeInputs = deps;
8 | text = builtins.readFile ./${name}.sh;
9 | }
10 | );
11 |
12 | scripts = mkScripts {
13 | easyroam-setup = builtins.attrValues {
14 | inherit (pkgs)
15 | coreutils
16 | openssl
17 | gnused
18 | util-linux # uuidgen
19 | pwgen
20 | ;
21 | };
22 | };
23 | in
24 | scripts
25 |
--------------------------------------------------------------------------------
/scripts/easyroam-setup.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | if [[ $# -lt 1 ]]; then
6 | cat < 'PKCS12', enter your device name and generate the profile
10 | 3. After downloading the profile, run this script again:
11 | easyroam-setup []
12 | EOF
13 | exit
14 | fi
15 |
16 | profile=$(realpath "$1")
17 |
18 | if [[ -n $2 ]]; then
19 | mkdir -p "$2"
20 | cd "$2"
21 | fi
22 |
23 | pkpass=$(pwgen -s 32 1)
24 | openssl pkcs12 -in "$profile" -legacy -nokeys -password pass: | openssl x509 >easyroam_client_cert.pem
25 | openssl pkcs12 -legacy -in "$profile" -nodes -nocerts -password pass: | openssl rsa -aes256 -out easyroam_client_key.pem -passout "pass:$pkpass"
26 | openssl pkcs12 -in "$profile" -legacy -cacerts -nokeys -password pass: >easyroam_root_ca.pem
27 | cn=$(openssl x509 -noout -subject -in easyroam_client_cert.pem -legacy | sed 's/.*CN = \(.*\), C.*/\1/')
28 |
29 | cat < /persistent/data/backup/timestamp
48 |
49 | if [[ -e /persistent/data/.snapshots/backup ]]; then
50 | btrfs subvolume delete /persistent/data/.snapshots/backup
51 | fi
52 | btrfs subvolume snapshot -r /persistent/data /persistent/data/.snapshots/backup
53 | '';
54 | };
55 | };
56 |
57 | groupConfig = {
58 | users.groups.restic = { };
59 | };
60 |
61 | backupConfigs = lib.mapAttrsToList (
62 | target: repo:
63 | let
64 | isRest = lib.hasPrefix "rest:" repo;
65 | isSftp = lib.hasPrefix "sftp:" repo;
66 | in
67 | {
68 | services.restic.backups.${target} = {
69 | timerConfig = null;
70 | repository = "${repo}/${hostname}";
71 | environmentFile = lib.mkIf isRest config.sops.templates."backup/${target}".path;
72 | passwordFile = config.sops.secrets."backup/${target}/repository-password".path;
73 | extraOptions = lib.optional isSftp "sftp.args='-i ${
74 | config.sops.secrets."backup/${target}/ssh-key".path
75 | }'";
76 |
77 | initialize = true;
78 | paths = [ "/persistent/data/.snapshots/backup" ];
79 | exclude = [
80 | "node_modules"
81 | ".venv"
82 | "target"
83 | ];
84 | };
85 |
86 | sops = {
87 | secrets =
88 | let
89 | s = {
90 | sopsFile = ../hosts/${hostname}/secrets/default.yml;
91 | owner = "root";
92 | group = "restic";
93 | mode = "0440";
94 | };
95 | in
96 | {
97 | "backup/${target}/repository-password" = s;
98 | }
99 | // (lib.optionalAttrs isRest { "backup/${target}/rest-password" = s; })
100 | // (lib.optionalAttrs isSftp { "backup/${target}/ssh-key" = { inherit (s) sopsFile; }; });
101 | templates = lib.optionalAttrs isRest {
102 | "backup/${target}" = {
103 | content = ''
104 | RESTIC_REST_USERNAME=${hostname}
105 | RESTIC_REST_PASSWORD=${config.sops.placeholder."backup/${target}/rest-password"}
106 | '';
107 | owner = "root";
108 | group = "restic";
109 | mode = "0440";
110 | };
111 | };
112 | };
113 | }
114 | ) targets;
115 | in
116 | lib.mkMerge (
117 | [
118 | scriptConfig
119 | prepareConfig
120 | groupConfig
121 | ]
122 | ++ backupConfigs
123 | )
124 |
--------------------------------------------------------------------------------
/system/base.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | users.mutableUsers = false;
4 | users.users.root.password = "nixos";
5 | services.getty.autologinUser = "root";
6 |
7 | environment.systemPackages = builtins.attrValues { inherit (pkgs) vim git; };
8 | }
9 |
--------------------------------------------------------------------------------
/system/bluetooth.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | hardware.bluetooth = {
4 | enable = true;
5 | settings.General.Experimental = true;
6 | };
7 |
8 | systemd.services.bluetooth.preStart = ''
9 | ${pkgs.util-linux}/bin/rfkill unblock bluetooth
10 | '';
11 | }
12 |
--------------------------------------------------------------------------------
/system/boot.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | pkgs,
4 | lanzaboote,
5 | lib,
6 | ...
7 | }:
8 | {
9 | imports = [ lanzaboote.nixosModules.lanzaboote ];
10 |
11 | boot.loader.systemd-boot.enable = lib.mkForce false;
12 | boot.loader.timeout = 2;
13 | boot.loader.efi.canTouchEfiVariables = true;
14 |
15 | # https://github.com/nix-community/lanzaboote/blob/master/docs/QUICK_START.md
16 | boot.lanzaboote = {
17 | enable = true;
18 | pkiBundle = "/var/lib/sbctl";
19 | };
20 |
21 | environment.systemPackages = lib.attrValues { inherit (pkgs) efibootmgr sbctl; };
22 |
23 | boot.kernel.sysctl = {
24 | "kernel.sysrq" = 1;
25 | "vm.swappiness" = 1;
26 | };
27 |
28 | boot.supportedFilesystems = [ "ntfs" ];
29 |
30 | boot.kernelPackages = pkgs.linuxPackages_latest;
31 | boot.extraModulePackages = [ config.boot.kernelPackages.rtl8821ce ];
32 |
33 | boot.initrd.kernelModules = [
34 | "vfat"
35 | "nls_cp437"
36 | "nls_iso8859-1"
37 | "usbhid"
38 | ];
39 |
40 | boot.blacklistedKernelModules = [
41 | "uvcvideo"
42 | "rtw88_8821ce"
43 | ];
44 | }
45 |
--------------------------------------------------------------------------------
/system/btrbk.nix:
--------------------------------------------------------------------------------
1 | {
2 | services.btrbk = {
3 | instances.data = {
4 | onCalendar = "*:0/5";
5 | settings = {
6 | volume."/persistent/data" = {
7 | snapshot_preserve_min = "2h";
8 | snapshot_preserve = "24h 7d";
9 | subvolume = ".";
10 | snapshot_dir = ".snapshots";
11 | };
12 | };
13 | };
14 |
15 | instances.cache = {
16 | onCalendar = "*:0/5";
17 | settings = {
18 | volume."/persistent/cache" = {
19 | snapshot_preserve_min = "1h";
20 | snapshot_preserve = "24h 7d";
21 | subvolume = ".";
22 | snapshot_dir = ".snapshots";
23 | };
24 | };
25 | };
26 | };
27 | }
28 |
--------------------------------------------------------------------------------
/system/btrfs.nix:
--------------------------------------------------------------------------------
1 | {
2 | services.btrfs.autoScrub = {
3 | enable = true;
4 | interval = "Fri 07:00";
5 | fileSystems = [ "/dev/mapper/root" ];
6 | };
7 | }
8 |
--------------------------------------------------------------------------------
/system/common.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | nixpkgs,
4 | pkgs,
5 | lib,
6 | ...
7 | }:
8 | {
9 | boot.tmp.useTmpfs = true;
10 |
11 | time.timeZone = "Europe/Berlin";
12 |
13 | i18n.defaultLocale = "en_US.UTF-8";
14 | i18n.extraLocaleSettings.LC_TIME = "en_GB.UTF-8";
15 | console.keyMap = "de-latin1";
16 |
17 | networking.networkmanager = {
18 | enable = true;
19 | wifi.macAddress = "random";
20 | ethernet.macAddress = "random";
21 | };
22 |
23 | programs.zsh.enable = true;
24 | users.defaultUserShell = pkgs.zsh;
25 |
26 | environment.systemPackages = lib.attrValues {
27 | inherit (pkgs)
28 | attic-client
29 | age
30 | btdu
31 | comma
32 | # compsize
33 | dig
34 | duf
35 | eza
36 | file
37 | htop
38 | iw
39 | jq
40 | ncdu
41 | nix-tree
42 | nvd
43 | ranger
44 | renameutils
45 | ripgrep
46 | sd
47 | sops
48 | unp
49 | wget
50 | wireguard-tools
51 | wirelesstools
52 | xxd
53 | yq
54 | zip
55 | ;
56 | };
57 |
58 | environment.pathsToLink = [ "/share/zsh" ];
59 |
60 | nix = {
61 | package = pkgs.nixVersions.latest;
62 | nixPath = [ "nixpkgs=${nixpkgs}" ];
63 | gc = {
64 | automatic = true;
65 | dates = "05:30";
66 | options = "--delete-older-than 3d";
67 | };
68 | settings = {
69 | keep-outputs = true;
70 | auto-optimise-store = true;
71 | experimental-features = [
72 | "nix-command"
73 | "flakes"
74 | ];
75 | trusted-users = [
76 | "root"
77 | "@wheel"
78 | ];
79 | substituters = lib.mkAfter [
80 | "https://nix-community.cachix.org"
81 | "https://attic.defelo.de/nixos"
82 | ];
83 | trusted-public-keys = [
84 | "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
85 | "nixos:5Pnh7nNQP4a0E3R850micmqOUXhn6uvP+DsT2FU7vfI="
86 | ];
87 | netrc-file = config.sops.templates."nix-netrc".path;
88 | builders-use-substitutes = true;
89 | };
90 | distributedBuilds = true;
91 | buildMachines = [
92 | {
93 | systems = [
94 | "x86_64-linux"
95 | "aarch64-linux"
96 | ];
97 | supportedFeatures = [
98 | "kvm"
99 | "nixos-test"
100 | "big-parallel"
101 | ];
102 | protocol = "ssh-ng";
103 | sshUser = "root";
104 | hostName = "10.42.0.1";
105 | maxJobs = 8;
106 | }
107 | ];
108 | registry = {
109 | nixpkgs = {
110 | from = {
111 | id = "nixpkgs";
112 | type = "indirect";
113 | };
114 | exact = true;
115 | flake = nixpkgs;
116 | };
117 | };
118 | extraOptions = ''
119 | !include ${config.sops.templates."nix".path}
120 | '';
121 | };
122 |
123 | systemd.extraConfig = ''
124 | DefaultTimeoutStopSec=10s
125 | '';
126 |
127 | system.activationScripts.nvd-diff = ''
128 | if old_system=$(readlink /run/current-system); then
129 | ${pkgs.nvd}/bin/nvd --color=always --nix-bin-dir=/run/current-system/sw/bin/ diff $old_system $systemConfig
130 | fi
131 | if [[ -e /run/booted-system ]] && ! ${pkgs.diffutils}/bin/diff <(readlink /run/booted-system/{initrd,kernel,kernel-modules}) <(readlink $systemConfig/{initrd,kernel,kernel-modules}); then
132 | echo -e "\033[1m==> REBOOT REQUIRED! \033[0m"
133 | fi
134 | '';
135 | environment.shellAliases.needrestart = "sh -c 'diff <(readlink /run/booted-system/{initrd,kernel,kernel-modules}) <(readlink /run/current-system/{initrd,kernel,kernel-modules})'";
136 |
137 | systemd.suppressedSystemUnits = [ "systemd-machine-id-commit.service" ];
138 |
139 | system.stateVersion = "23.11";
140 |
141 | sops = {
142 | secrets = {
143 | "nix/tokens/github".sopsFile = ../secrets/nix.yml;
144 | # atticd-atticadm make-token --sub nixos --validity 1y --pull nixos
145 | "nix/tokens/attic".sopsFile = ../secrets/nix.yml;
146 | };
147 | templates = {
148 | "nix" = {
149 | content = ''
150 | access-tokens = github.com=${config.sops.placeholder."nix/tokens/github"}
151 | '';
152 | mode = "444";
153 | };
154 | "nix-netrc" = {
155 | content = ''
156 | machine attic.defelo.de
157 | password ${config.sops.placeholder."nix/tokens/attic"}
158 | '';
159 | mode = "444";
160 | };
161 | };
162 | };
163 | }
164 |
--------------------------------------------------------------------------------
/system/default.nix:
--------------------------------------------------------------------------------
1 | {
2 | config,
3 | home-manager,
4 | specialArgs,
5 | ...
6 | }:
7 | {
8 | imports = [
9 | ./common.nix
10 |
11 | ./audio.nix
12 | ./backlight.nix
13 | ./backup.nix
14 | ./bluetooth.nix
15 | ./boot.nix
16 | ./btrbk.nix
17 | ./btrfs.nix
18 | ./emulation.nix
19 | ./env.nix
20 | ./fonts.nix
21 | ./geoclue2.nix
22 | ./kanata.nix
23 | ./networking.nix
24 | ./nix-ld.nix
25 | ./persistence.nix
26 | ./power.nix
27 | ./services.nix
28 | ./sops.nix
29 | ./ssh.nix
30 | ./steam.nix
31 | ./users.nix
32 | ./virt.nix
33 | ./wayland.nix
34 |
35 | home-manager.nixosModules.home-manager
36 | ];
37 |
38 | home-manager = {
39 | useGlobalPkgs = true;
40 | useUserPackages = true;
41 | extraSpecialArgs = config._module.args // specialArgs // { system-config = config; };
42 | };
43 | }
44 |
--------------------------------------------------------------------------------
/system/emulation.nix:
--------------------------------------------------------------------------------
1 | {
2 | boot.binfmt.emulatedSystems = [
3 | "aarch64-linux"
4 | "x86_64-windows"
5 | ];
6 | }
7 |
--------------------------------------------------------------------------------
/system/env.nix:
--------------------------------------------------------------------------------
1 | {
2 | environment.variables = {
3 | EDITOR = "hx";
4 | VISUAL = "hx";
5 | };
6 | }
7 |
--------------------------------------------------------------------------------
/system/fonts.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | fonts.packages = builtins.attrValues {
4 | inherit (pkgs)
5 | dejavu_fonts
6 | # ipafont
7 | meslo-lgs-nf
8 | fantasque-sans-mono
9 | material-icons
10 | font-awesome_5
11 | noto-fonts
12 | noto-fonts-cjk-sans
13 | noto-fonts-emoji
14 | ;
15 | };
16 | # fonts.fontconfig.defaultFonts = {
17 | # monospace = [
18 | # "DejaVu Sans Mono"
19 | # "IPAGothic"
20 | # ];
21 | # sansSerif = [
22 | # "DejaVu Sans"
23 | # "IPAPGothic"
24 | # ];
25 | # serif = [
26 | # "DejaVu Serif"
27 | # "IPAPMincho"
28 | # ];
29 | # };
30 | }
31 |
--------------------------------------------------------------------------------
/system/geoclue2.nix:
--------------------------------------------------------------------------------
1 | { services.geoclue2.enable = true; }
2 |
--------------------------------------------------------------------------------
/system/kanata.nix:
--------------------------------------------------------------------------------
1 | {
2 | services.kanata = {
3 | enable = true;
4 | keyboards.default = {
5 | extraDefCfg = ''
6 | process-unmapped-keys yes
7 | delegate-to-first-layer yes
8 | '';
9 | config = ''
10 | (defsrc
11 | caps
12 | lctl)
13 |
14 | (deflayermap (default)
15 | caps (tap-hold-press 200 200 esc lctl)
16 | lctl caps
17 | )
18 | '';
19 | };
20 | };
21 | }
22 |
--------------------------------------------------------------------------------
/system/networking.nix:
--------------------------------------------------------------------------------
1 | {
2 | conf,
3 | pkgs,
4 | lib,
5 | ...
6 | }:
7 | {
8 | networking.networkmanager.dispatcherScripts = [
9 | {
10 | type = "basic";
11 | source =
12 | let
13 | inherit (conf.networking) vpn;
14 | wifi.trusted = builtins.toFile "wifi-trusted" (
15 | builtins.foldl' (acc: x: "${acc}${x}\n") "" conf.networking.wifi.trusted
16 | );
17 | in
18 | pkgs.writeText "trusted-networks" ''
19 | export PATH=${
20 | pkgs.lib.makeBinPath (lib.attrValues { inherit (pkgs) coreutils gnugrep networkmanager; })
21 | }
22 |
23 | if [[ -z "$1" ]] || [[ "$1" = "vpn" ]]; then
24 | exit
25 | fi
26 |
27 | if nmcli --fields=UUID c s --active | tail +2 | cut -d' ' -f1 | sort | comm -12 - <(sort ${wifi.trusted}) | grep -q .; then
28 | nmcli c up "${vpn.default}" &
29 | else
30 | nmcli c up "${vpn.full}" &
31 | fi
32 | '';
33 | }
34 | ];
35 |
36 | networking.firewall = {
37 | enable = true;
38 | allowPing = false;
39 | allowedTCPPorts = [
40 | 22000 # syncthing
41 | ];
42 | allowedUDPPorts = [ ];
43 | trustedInterfaces = [ "vpn" ];
44 |
45 | # disable rpfilter for wireguard
46 | # if packets are still dropped, they will show up in dmesg
47 | logReversePathDrops = true;
48 | # wireguard trips rpfilter up
49 | extraCommands = ''
50 | ip46tables -t mangle -I nixos-fw-rpfilter -p udp -m udp --sport 51820 -j RETURN
51 | ip46tables -t mangle -I nixos-fw-rpfilter -p udp -m udp --dport 51820 -j RETURN
52 | '';
53 | extraStopCommands = ''
54 | ip46tables -t mangle -D nixos-fw-rpfilter -p udp -m udp --sport 51820 -j RETURN || true
55 | ip46tables -t mangle -D nixos-fw-rpfilter -p udp -m udp --dport 51820 -j RETURN || true
56 | '';
57 | };
58 |
59 | sops.secrets =
60 | let
61 | connections = /${conf.networking.secrets}/nm-connections;
62 | secrets = /${conf.networking.secrets}/networking;
63 | in
64 | builtins.listToAttrs (
65 | map (name: {
66 | name = "networking/nm-connection-${name}.nmconnection";
67 | value = {
68 | format = "binary";
69 | sopsFile = /${connections}/${name};
70 | path = "/etc/NetworkManager/system-connections/${name}.nmconnection";
71 | };
72 | }) (builtins.attrNames (builtins.removeAttrs (builtins.readDir connections) [ ".gitkeep" ]))
73 | ++ (map (file: {
74 | name = "networking${lib.removePrefix (toString secrets) (toString file)}";
75 | value = {
76 | format = "binary";
77 | sopsFile = file;
78 | };
79 | }) (lib.remove /${secrets}/.gitkeep (lib.filesystem.listFilesRecursive secrets)))
80 | );
81 | }
82 |
--------------------------------------------------------------------------------
/system/nix-ld.nix:
--------------------------------------------------------------------------------
1 | { programs.nix-ld.enable = true; }
2 |
--------------------------------------------------------------------------------
/system/persistence.nix:
--------------------------------------------------------------------------------
1 | { conf, impermanence, ... }:
2 | {
3 | imports = [ impermanence.nixosModule ];
4 |
5 | environment.persistence."/persistent/data" = {
6 | hideMounts = true;
7 | directories = [
8 | "/etc/NetworkManager/system-connections"
9 | "/root/.ssh"
10 | "/var/lib/bluetooth"
11 | ];
12 | files = [ ];
13 |
14 | users.${conf.user} = (import ../home/persistence.nix).data;
15 | };
16 |
17 | environment.persistence."/persistent/cache" = {
18 | hideMounts = true;
19 | directories = [
20 | "/root/.cache/nix"
21 | "/var/lib/btrfs"
22 | "/var/lib/libvirt"
23 | "/var/lib/nixos"
24 | "/var/lib/sbctl"
25 | "/var/lib/systemd/backlight"
26 | "/var/lib/systemd/timers"
27 | # "/var/lib/waydroid"
28 | "/var/log"
29 | ];
30 | files = [ "/etc/machine-id" ];
31 |
32 | users.${conf.user} = (import ../home/persistence.nix).cache;
33 | };
34 | }
35 |
--------------------------------------------------------------------------------
/system/power.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | services.upower = {
4 | enable = true;
5 | };
6 | powerManagement.powertop.enable = true;
7 | services.tlp.enable = true;
8 | services.logind = {
9 | lidSwitch = "suspend-then-hibernate";
10 | lidSwitchDocked = "suspend-then-hibernate";
11 | extraConfig = ''
12 | HandlePowerKey=hibernate
13 | '';
14 | };
15 | systemd.sleep.extraConfig = ''
16 | HibernateDelaySec=120m
17 | '';
18 | systemd.services.powertop.postStart = ''
19 | cd /sys/bus/usb/devices
20 | for f in *; do
21 | if [[ -e "$f/product" ]] && [[ "$(cat $f/product)" = "USB OPTICAL MOUSE " ]]; then
22 | echo on > "$f/power/control"
23 | fi
24 | done
25 | '';
26 |
27 | environment.systemPackages = [ pkgs.powertop ];
28 | }
29 |
--------------------------------------------------------------------------------
/system/services.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | virtualisation.podman = {
4 | enable = true;
5 | };
6 |
7 | services.pcscd.enable = true;
8 |
9 | programs.ssh.startAgent = false;
10 |
11 | programs.dconf.enable = true;
12 |
13 | services.udev.packages = [ pkgs.yubikey-personalization ];
14 |
15 | programs.mtr.enable = true;
16 | }
17 |
--------------------------------------------------------------------------------
/system/sops.nix:
--------------------------------------------------------------------------------
1 | { sops-nix, ... }:
2 | {
3 | imports = [ sops-nix.nixosModules.sops ];
4 | sops = {
5 | age.keyFile = "/persistent/data/root/.config/sops/age/keys.txt";
6 | };
7 | }
8 |
--------------------------------------------------------------------------------
/system/ssh.nix:
--------------------------------------------------------------------------------
1 | {
2 | services.openssh = {
3 | enable = true;
4 | settings = {
5 | PermitRootLogin = "no";
6 | PasswordAuthentication = false;
7 | UsePAM = false;
8 | };
9 | hostKeys = [
10 | {
11 | type = "ed25519";
12 | path = "/persistent/cache/ssh/ssh_host_ed25519_key";
13 | }
14 | ];
15 | };
16 |
17 | programs.ssh.knownHosts = {
18 | "*.your-storagebox.de" = {
19 | extraHostNames = [ "[*.your-storagebox.de]:23" ];
20 | publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIICf9svRenC/PLKIL9nk6K/pxQgoiFC41wTNvoIncOxs";
21 | };
22 | };
23 | }
24 |
--------------------------------------------------------------------------------
/system/steam.nix:
--------------------------------------------------------------------------------
1 | {
2 | programs.steam = {
3 | enable = true;
4 | remotePlay.openFirewall = true;
5 | dedicatedServer.openFirewall = true;
6 | };
7 | }
8 |
--------------------------------------------------------------------------------
/system/users.nix:
--------------------------------------------------------------------------------
1 | { conf, config, ... }:
2 |
3 | {
4 | users.mutableUsers = false;
5 | users.users.${conf.user} = {
6 | isNormalUser = true;
7 | uid = 1000;
8 | extraGroups = [
9 | "wheel"
10 | "networkmanager"
11 | "video"
12 | "libvirtd"
13 | "restic"
14 | ];
15 | hashedPasswordFile = config.sops.secrets."user/hashedPassword".path;
16 | openssh.authorizedKeys.keys = [
17 | "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID0+Dd5FL6zKIxkjJaOb+/7fp5YtePkDdGasYESAl0br"
18 | "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCqDljgWk+qK1pHdTZdgFgXcMdizAz7OmGR9fx0yROQ6+Ja7zUxnAxOi0ijOk8HLWrZ9xu/TqKPvF29hndCEJtg="
19 | ];
20 | };
21 |
22 | home-manager.users =
23 | let
24 | hm = import ../home;
25 | in
26 | {
27 | ${conf.user} = {
28 | imports = hm.user;
29 | home.username = conf.user;
30 | home.homeDirectory = "/home/${conf.user}";
31 | };
32 | root = {
33 | imports = hm.root;
34 | home.username = "root";
35 | home.homeDirectory = "/root";
36 | };
37 | };
38 |
39 | # security.sudo.wheelNeedsPassword = false;
40 | security.pam.u2f = {
41 | enable = true;
42 |
43 | # $ nix shell nixpkgs#pam_u2f --command pamu2fcfg
44 | # user=root, group=users, mode=640
45 | settings.authfile = "/persistent/cache/u2f_keys";
46 | };
47 |
48 | sops.secrets."user/hashedPassword" = {
49 | sopsFile = ../hosts/${config.networking.hostName}/secrets/default.yml;
50 | neededForUsers = true;
51 | };
52 | }
53 |
--------------------------------------------------------------------------------
/system/virt.nix:
--------------------------------------------------------------------------------
1 | { pkgs, ... }:
2 | {
3 | virtualisation.libvirtd = {
4 | enable = true;
5 | qemu = {
6 | package = pkgs.qemu_kvm;
7 | swtpm.enable = true;
8 | ovmf = {
9 | enable = true;
10 | packages = [
11 | (pkgs.OVMF.override {
12 | secureBoot = true;
13 | tpmSupport = true;
14 | }).fd
15 | ];
16 | };
17 | };
18 | };
19 |
20 | boot.extraModprobeConfig = ''
21 | options kvm_intel nested=1
22 | options kvm_intel emulate_invalid_guest_state=0
23 | options kvm ignore_msrs=1
24 | '';
25 |
26 | programs.dconf.enable = true;
27 |
28 | # virtualisation.waydroid.enable = true;
29 | # virtualisation.lxd.enable = true;
30 | }
31 |
--------------------------------------------------------------------------------
/system/wayland.nix:
--------------------------------------------------------------------------------
1 | {
2 | conf,
3 | config,
4 | lib,
5 | pkgs,
6 | ...
7 | }:
8 | {
9 | security.polkit.enable = true;
10 | security.pam.services.swaylock = { };
11 |
12 | services.dbus.enable = true;
13 | services.dbus.packages = [ pkgs.gcr ];
14 | xdg.portal = {
15 | enable = true;
16 | config.common = {
17 | default = "gtk";
18 | "org.freedesktop.impl.portal.ScreenCast" = "gnome";
19 | };
20 | };
21 |
22 | hardware.graphics.enable = true;
23 |
24 | environment.systemPackages = [ pkgs.qt5.qtwayland ];
25 |
26 | programs.niri.enable = true;
27 |
28 | services.gnome.gnome-keyring.enable = false;
29 |
30 | xdg.autostart.enable = lib.mkForce false;
31 | services.xserver.desktopManager.runXdgAutostartIfNone = false;
32 |
33 | services.greetd = {
34 | enable = true;
35 | settings = {
36 | default_session.command =
37 | let
38 | shell = config.users.defaultUserShell;
39 | in
40 | "${pkgs.greetd.greetd}/bin/agreety --cmd ${shell}${shell.shellPath}";
41 | initial_session = {
42 | user = conf.user;
43 | command = "niri-session";
44 | };
45 | };
46 | };
47 | }
48 |
--------------------------------------------------------------------------------
/system/zram.nix:
--------------------------------------------------------------------------------
1 | {
2 | zramSwap = {
3 | enable = true;
4 | priority = 5;
5 | algorithm = "zstd";
6 | memoryPercent = 25;
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/treefmt.nix:
--------------------------------------------------------------------------------
1 | { lib, pkgs, ... }:
2 |
3 | {
4 | tree-root-file = ".git/config";
5 | on-unmatched = "error";
6 |
7 | excludes = [
8 | # no formatter available
9 | ".gitattributes"
10 | "LICENSE"
11 | "*.kdl"
12 | "*.md"
13 | "*.rasi"
14 |
15 | # generated/managed by other programs
16 | "home/xournalpp/settings/*"
17 | "home/zsh/p10k.zsh"
18 | "hosts/*/hardware-configuration.nix"
19 | "secrets/*"
20 | "*/secrets/*"
21 | "*.lock"
22 |
23 | # not text
24 | "*.jpg"
25 | "*.png"
26 | ];
27 |
28 | formatter.black = {
29 | command = lib.getExe pkgs.black;
30 | includes = [ "*.py" ];
31 | options = [ ];
32 | };
33 |
34 | formatter.nixfmt = {
35 | command = lib.getExe pkgs.nixfmt-rfc-style;
36 | includes = [ "*.nix" ];
37 | options = [ "--strict" ];
38 | };
39 |
40 | formatter.prettier = {
41 | command = lib.getExe pkgs.nodePackages.prettier;
42 | includes = [
43 | "*.json"
44 | "*.yml"
45 | "*.yaml"
46 | ];
47 | options = [ "--write" ];
48 | };
49 |
50 | formatter.shfmt = {
51 | command = lib.getExe pkgs.shfmt;
52 | includes = [ "*.sh" ];
53 | options = [
54 | "--simplify"
55 | "--write"
56 | "--indent=2"
57 | ];
58 | };
59 | }
60 |
--------------------------------------------------------------------------------
/wallpapers/cryptic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Defelo/nixos/5ecb867d90490637bbc466c3222fefa2752fca7e/wallpapers/cryptic.jpg
--------------------------------------------------------------------------------
/wallpapers/nix-simple-geometric.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Defelo/nixos/5ecb867d90490637bbc466c3222fefa2752fca7e/wallpapers/nix-simple-geometric.png
--------------------------------------------------------------------------------
/wallpapers/nix-snowflake-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Defelo/nixos/5ecb867d90490637bbc466c3222fefa2752fca7e/wallpapers/nix-snowflake-dark.png
--------------------------------------------------------------------------------
/wallpapers/python.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Defelo/nixos/5ecb867d90490637bbc466c3222fefa2752fca7e/wallpapers/python.png
--------------------------------------------------------------------------------