nix machine / user configurations

Compare changes

Choose any two refs to compare.

Changed files
+410 -102
_sources
dns
hosts
dzwonek
modules
headscale.nix
trimounts
pkgs-set
overlays
pkgs
pds-upload.nix
secrets
users
+40 -40
_sources/generated.json
··· 22 22 }, 23 23 "blog": { 24 24 "cargoLocks": null, 25 - "date": "2025-12-15", 25 + "date": "2025-12-26", 26 26 "extract": null, 27 27 "name": "blog", 28 28 "passthru": null, ··· 32 32 "fetchSubmodules": false, 33 33 "leaveDotGit": false, 34 34 "name": null, 35 - "rev": "79ec1f7c30198c7406271c92a3a522849a23c6ff", 36 - "sha256": "sha256-uF2W+YaZmJOIXTclraoc69MmqRxNXcmBFBB41o8DTGE=", 35 + "rev": "95c18d69c811a6483df1a2c6b727f696db39858e", 36 + "sha256": "sha256-VeX7C0PQdhQu14xxeCftFUFWO7MhssvulC319s82Jt4=", 37 37 "sparseCheckout": [], 38 38 "type": "git", 39 39 "url": "https://tangled.org/@ptr.pet/endpoint" 40 40 }, 41 - "version": "79ec1f7c30198c7406271c92a3a522849a23c6ff" 41 + "version": "95c18d69c811a6483df1a2c6b727f696db39858e" 42 42 }, 43 43 "clickee": { 44 44 "cargoLocks": null, ··· 103 103 }, 104 104 "dysnomia": { 105 105 "cargoLocks": null, 106 - "date": "2025-12-20", 106 + "date": "2025-12-22", 107 107 "extract": null, 108 108 "name": "dysnomia", 109 109 "passthru": null, ··· 113 113 "fetchSubmodules": false, 114 114 "leaveDotGit": false, 115 115 "name": null, 116 - "rev": "d1855bfba2ef14c1d612cbe9611c1811e870384c", 117 - "sha256": "sha256-0aPQH8tfSYdYlc8EKiHifWXW7iJlBg+tjdfFBxjjsSY=", 116 + "rev": "1f371223d2ffe80385c63119b325d8da7a4c7e7e", 117 + "sha256": "sha256-hUFMvmKEO65yw8Igkf4323t6uvKukaojQMNm+8tN4rc=", 118 118 "sparseCheckout": [], 119 119 "type": "git", 120 120 "url": "https://tangled.org/@ptr.pet/dysnomia" 121 121 }, 122 - "version": "d1855bfba2ef14c1d612cbe9611c1811e870384c" 122 + "version": "1f371223d2ffe80385c63119b325d8da7a4c7e7e" 123 123 }, 124 124 "facter": { 125 125 "cargoLocks": null, 126 - "date": "2025-12-11", 126 + "date": "2025-12-24", 127 127 "extract": null, 128 128 "name": "facter", 129 129 "passthru": null, ··· 135 135 "name": null, 136 136 "owner": "nix-community", 137 137 "repo": "nixos-facter-modules", 138 - "rev": "9dd775ee92de63f14edd021d59416e18ac2c00f1", 139 - "sha256": "sha256-k3lYQ+A1F7aTz8HnlU++bd9t/x/NP2A4v9+x6opcVg0=", 138 + "rev": "e796d536e3d83de74267069e179dc620a608ed7d", 139 + "sha256": "sha256-Ud9v49ZPsoDBFuyJSQ2Mpw1ZgAH/aMwUwwzrVoetNus=", 140 140 "sparseCheckout": [], 141 141 "type": "github" 142 142 }, 143 - "version": "9dd775ee92de63f14edd021d59416e18ac2c00f1" 143 + "version": "e796d536e3d83de74267069e179dc620a608ed7d" 144 144 }, 145 145 "gomod2nix": { 146 146 "cargoLocks": null, ··· 165 165 }, 166 166 "home": { 167 167 "cargoLocks": null, 168 - "date": "2025-12-19", 168 + "date": "2025-12-27", 169 169 "extract": null, 170 170 "name": "home", 171 171 "passthru": null, ··· 177 177 "name": null, 178 178 "owner": "nix-community", 179 179 "repo": "home-manager", 180 - "rev": "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5", 181 - "sha256": "sha256-47Ee0bTidhF/3/sHuYnWRuxcCrrm0mBNDxBkOTd3wWQ=", 180 + "rev": "4067ca1ffb6425b8597eafb63a84b171e0192d2b", 181 + "sha256": "sha256-Ok0jocJ82JriaMDtYEytR8oWcxADlX5WcWXULrN4czA=", 182 182 "sparseCheckout": [], 183 183 "type": "github" 184 184 }, 185 - "version": "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5" 185 + "version": "4067ca1ffb6425b8597eafb63a84b171e0192d2b" 186 186 }, 187 187 "limbusart": { 188 188 "cargoLocks": null, ··· 247 247 }, 248 248 "nixos-hardware": { 249 249 "cargoLocks": null, 250 - "date": "2025-11-29", 250 + "date": "2025-12-24", 251 251 "extract": null, 252 252 "name": "nixos-hardware", 253 253 "passthru": null, ··· 259 259 "name": null, 260 260 "owner": "NixOS", 261 261 "repo": "nixos-hardware", 262 - "rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3", 263 - "sha256": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=", 262 + "rev": "c5db9569ac9cc70929c268ac461f4003e3e5ca80", 263 + "sha256": "sha256-UXVtN77D7pzKmzOotFTStgZBqpOcf8cO95FcupWp4Zo=", 264 264 "sparseCheckout": [], 265 265 "type": "github" 266 266 }, 267 - "version": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3" 267 + "version": "c5db9569ac9cc70929c268ac461f4003e3e5ca80" 268 268 }, 269 269 "nixpkgs-xr": { 270 270 "cargoLocks": null, 271 - "date": "2025-12-20", 271 + "date": "2025-12-24", 272 272 "extract": null, 273 273 "name": "nixpkgs-xr", 274 274 "passthru": null, ··· 280 280 "name": null, 281 281 "owner": "nix-community", 282 282 "repo": "nixpkgs-xr", 283 - "rev": "22697a0c10b5c368ce55a84f99daa6aef57d4d15", 284 - "sha256": "sha256-jiP171U1n5pfU4lhWz5TgyDsAqc2ksE5coHP3Hmk32w=", 283 + "rev": "9e8efcd2c4ea906772dea99204a9819284a29b81", 284 + "sha256": "sha256-biwvZsCGC4vCXS6rzs3tUkELqqEXPko0E3R9IhYKavE=", 285 285 "sparseCheckout": [], 286 286 "type": "github" 287 287 }, 288 - "version": "22697a0c10b5c368ce55a84f99daa6aef57d4d15" 288 + "version": "9e8efcd2c4ea906772dea99204a9819284a29b81" 289 289 }, 290 290 "nsid-tracker": { 291 291 "cargoLocks": null, ··· 309 309 }, 310 310 "nucleus": { 311 311 "cargoLocks": null, 312 - "date": "2025-11-11", 312 + "date": "2025-12-27", 313 313 "extract": null, 314 314 "name": "nucleus", 315 315 "passthru": null, ··· 319 319 "fetchSubmodules": false, 320 320 "leaveDotGit": false, 321 321 "name": null, 322 - "rev": "a4f73517c1a76ed20b55f21618148b8afe0fa838", 323 - "sha256": "sha256-8WrGAr+aCIFCFuixtH1BSB5lMn+d/FqXsEFAmXY3HkU=", 322 + "rev": "2ad7bd0b2710896cdf31638c32ceacc02a226726", 323 + "sha256": "sha256-AXZhPcOvCCwFhntqLoZZtyaNTV6RQeS7I74RFzmFeiM=", 324 324 "sparseCheckout": [], 325 325 "type": "git", 326 326 "url": "https://tangled.org/@ptr.pet/nucleus" 327 327 }, 328 - "version": "a4f73517c1a76ed20b55f21618148b8afe0fa838" 328 + "version": "2ad7bd0b2710896cdf31638c32ceacc02a226726" 329 329 }, 330 330 "stylix": { 331 331 "cargoLocks": null, 332 - "date": "2025-12-16", 332 + "date": "2025-12-24", 333 333 "extract": null, 334 334 "name": "stylix", 335 335 "passthru": null, ··· 341 341 "name": null, 342 342 "owner": "nix-community", 343 343 "repo": "stylix", 344 - "rev": "e6829552d4bb659ebab00f08c61d8c62754763f3", 345 - "sha256": "sha256-NgTRxiEC5y96zrhdBygnY+mSzk5FWMML39PcRGVJmxg=", 344 + "rev": "551df12ee3ebac52c5712058bd97fd9faa4c3430", 345 + "sha256": "sha256-J2DDdRqSU4w9NNgkMfmMeaLIof5PXtS9RG7y6ckDvQE=", 346 346 "sparseCheckout": [], 347 347 "type": "github" 348 348 }, 349 - "version": "e6829552d4bb659ebab00f08c61d8c62754763f3" 349 + "version": "551df12ee3ebac52c5712058bd97fd9faa4c3430" 350 350 }, 351 351 "tangled": { 352 352 "cargoLocks": null, ··· 384 384 }, 385 385 "trill": { 386 386 "cargoLocks": null, 387 - "date": "2025-11-25", 387 + "date": "2025-12-25", 388 388 "extract": null, 389 389 "name": "trill", 390 390 "passthru": null, ··· 394 394 "fetchSubmodules": false, 395 395 "leaveDotGit": false, 396 396 "name": null, 397 - "rev": "c9604685156e009cebd0ddc3b31672455f635387", 398 - "sha256": "sha256-so9EHN0GQ7rFSmnLnpRap2RqRcklhe3C1HdyAKeR6No=", 397 + "rev": "d395ba493b4735f82db9ce99c7e7e8b671b38225", 398 + "sha256": "sha256-mxV02sfP7H2lv/xD9MkVHfp6F8dnYQly7rhTRpMEeiw=", 399 399 "sparseCheckout": [], 400 400 "type": "git", 401 401 "url": "https://tangled.org/@ptr.pet/trill" 402 402 }, 403 - "version": "c9604685156e009cebd0ddc3b31672455f635387" 403 + "version": "d395ba493b4735f82db9ce99c7e7e8b671b38225" 404 404 }, 405 405 "zen-browser": { 406 406 "cargoLocks": null, 407 - "date": "2025-12-20", 407 + "date": "2025-12-25", 408 408 "extract": null, 409 409 "name": "zen-browser", 410 410 "passthru": null, ··· 416 416 "name": null, 417 417 "owner": "0xc000022070", 418 418 "repo": "zen-browser-flake", 419 - "rev": "4563d0ffdf586368f1bec1a39cc20c9b12b73884", 420 - "sha256": "sha256-NccmxYNOUHLLehsBLaeZ3QtVlDfIW1FDBe3W/kIDwa0=", 419 + "rev": "98d8f48ba80a4b6e3b56addad850d57132301075", 420 + "sha256": "sha256-mGZBEN67mxeOsBhplBRLm6L+y++8jU46EEUYgemG1aQ=", 421 421 "sparseCheckout": [], 422 422 "type": "github" 423 423 }, 424 - "version": "4563d0ffdf586368f1bec1a39cc20c9b12b73884" 424 + "version": "98d8f48ba80a4b6e3b56addad850d57132301075" 425 425 } 426 426 }
+40 -40
_sources/generated.nix
··· 15 15 }; 16 16 blog = { 17 17 pname = "blog"; 18 - version = "79ec1f7c30198c7406271c92a3a522849a23c6ff"; 18 + version = "95c18d69c811a6483df1a2c6b727f696db39858e"; 19 19 src = fetchgit { 20 20 url = "https://tangled.org/@ptr.pet/endpoint"; 21 - rev = "79ec1f7c30198c7406271c92a3a522849a23c6ff"; 21 + rev = "95c18d69c811a6483df1a2c6b727f696db39858e"; 22 22 fetchSubmodules = false; 23 23 deepClone = false; 24 24 leaveDotGit = false; 25 25 sparseCheckout = [ ]; 26 - sha256 = "sha256-uF2W+YaZmJOIXTclraoc69MmqRxNXcmBFBB41o8DTGE="; 26 + sha256 = "sha256-VeX7C0PQdhQu14xxeCftFUFWO7MhssvulC319s82Jt4="; 27 27 }; 28 - date = "2025-12-15"; 28 + date = "2025-12-26"; 29 29 }; 30 30 clickee = { 31 31 pname = "clickee"; ··· 69 69 }; 70 70 dysnomia = { 71 71 pname = "dysnomia"; 72 - version = "d1855bfba2ef14c1d612cbe9611c1811e870384c"; 72 + version = "1f371223d2ffe80385c63119b325d8da7a4c7e7e"; 73 73 src = fetchgit { 74 74 url = "https://tangled.org/@ptr.pet/dysnomia"; 75 - rev = "d1855bfba2ef14c1d612cbe9611c1811e870384c"; 75 + rev = "1f371223d2ffe80385c63119b325d8da7a4c7e7e"; 76 76 fetchSubmodules = false; 77 77 deepClone = false; 78 78 leaveDotGit = false; 79 79 sparseCheckout = [ ]; 80 - sha256 = "sha256-0aPQH8tfSYdYlc8EKiHifWXW7iJlBg+tjdfFBxjjsSY="; 80 + sha256 = "sha256-hUFMvmKEO65yw8Igkf4323t6uvKukaojQMNm+8tN4rc="; 81 81 }; 82 - date = "2025-12-20"; 82 + date = "2025-12-22"; 83 83 }; 84 84 facter = { 85 85 pname = "facter"; 86 - version = "9dd775ee92de63f14edd021d59416e18ac2c00f1"; 86 + version = "e796d536e3d83de74267069e179dc620a608ed7d"; 87 87 src = fetchFromGitHub { 88 88 owner = "nix-community"; 89 89 repo = "nixos-facter-modules"; 90 - rev = "9dd775ee92de63f14edd021d59416e18ac2c00f1"; 90 + rev = "e796d536e3d83de74267069e179dc620a608ed7d"; 91 91 fetchSubmodules = false; 92 - sha256 = "sha256-k3lYQ+A1F7aTz8HnlU++bd9t/x/NP2A4v9+x6opcVg0="; 92 + sha256 = "sha256-Ud9v49ZPsoDBFuyJSQ2Mpw1ZgAH/aMwUwwzrVoetNus="; 93 93 }; 94 - date = "2025-12-11"; 94 + date = "2025-12-24"; 95 95 }; 96 96 gomod2nix = { 97 97 pname = "gomod2nix"; ··· 107 107 }; 108 108 home = { 109 109 pname = "home"; 110 - version = "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5"; 110 + version = "4067ca1ffb6425b8597eafb63a84b171e0192d2b"; 111 111 src = fetchFromGitHub { 112 112 owner = "nix-community"; 113 113 repo = "home-manager"; 114 - rev = "bb35f07cc95a73aacbaf1f7f46bb8a3f40f265b5"; 114 + rev = "4067ca1ffb6425b8597eafb63a84b171e0192d2b"; 115 115 fetchSubmodules = false; 116 - sha256 = "sha256-47Ee0bTidhF/3/sHuYnWRuxcCrrm0mBNDxBkOTd3wWQ="; 116 + sha256 = "sha256-Ok0jocJ82JriaMDtYEytR8oWcxADlX5WcWXULrN4czA="; 117 117 }; 118 - date = "2025-12-19"; 118 + date = "2025-12-27"; 119 119 }; 120 120 limbusart = { 121 121 pname = "limbusart"; ··· 159 159 }; 160 160 nixos-hardware = { 161 161 pname = "nixos-hardware"; 162 - version = "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3"; 162 + version = "c5db9569ac9cc70929c268ac461f4003e3e5ca80"; 163 163 src = fetchFromGitHub { 164 164 owner = "NixOS"; 165 165 repo = "nixos-hardware"; 166 - rev = "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3"; 166 + rev = "c5db9569ac9cc70929c268ac461f4003e3e5ca80"; 167 167 fetchSubmodules = false; 168 - sha256 = "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4="; 168 + sha256 = "sha256-UXVtN77D7pzKmzOotFTStgZBqpOcf8cO95FcupWp4Zo="; 169 169 }; 170 - date = "2025-11-29"; 170 + date = "2025-12-24"; 171 171 }; 172 172 nixpkgs-xr = { 173 173 pname = "nixpkgs-xr"; 174 - version = "22697a0c10b5c368ce55a84f99daa6aef57d4d15"; 174 + version = "9e8efcd2c4ea906772dea99204a9819284a29b81"; 175 175 src = fetchFromGitHub { 176 176 owner = "nix-community"; 177 177 repo = "nixpkgs-xr"; 178 - rev = "22697a0c10b5c368ce55a84f99daa6aef57d4d15"; 178 + rev = "9e8efcd2c4ea906772dea99204a9819284a29b81"; 179 179 fetchSubmodules = false; 180 - sha256 = "sha256-jiP171U1n5pfU4lhWz5TgyDsAqc2ksE5coHP3Hmk32w="; 180 + sha256 = "sha256-biwvZsCGC4vCXS6rzs3tUkELqqEXPko0E3R9IhYKavE="; 181 181 }; 182 - date = "2025-12-20"; 182 + date = "2025-12-24"; 183 183 }; 184 184 nsid-tracker = { 185 185 pname = "nsid-tracker"; ··· 197 197 }; 198 198 nucleus = { 199 199 pname = "nucleus"; 200 - version = "a4f73517c1a76ed20b55f21618148b8afe0fa838"; 200 + version = "2ad7bd0b2710896cdf31638c32ceacc02a226726"; 201 201 src = fetchgit { 202 202 url = "https://tangled.org/@ptr.pet/nucleus"; 203 - rev = "a4f73517c1a76ed20b55f21618148b8afe0fa838"; 203 + rev = "2ad7bd0b2710896cdf31638c32ceacc02a226726"; 204 204 fetchSubmodules = false; 205 205 deepClone = false; 206 206 leaveDotGit = false; 207 207 sparseCheckout = [ ]; 208 - sha256 = "sha256-8WrGAr+aCIFCFuixtH1BSB5lMn+d/FqXsEFAmXY3HkU="; 208 + sha256 = "sha256-AXZhPcOvCCwFhntqLoZZtyaNTV6RQeS7I74RFzmFeiM="; 209 209 }; 210 - date = "2025-11-11"; 210 + date = "2025-12-27"; 211 211 }; 212 212 stylix = { 213 213 pname = "stylix"; 214 - version = "e6829552d4bb659ebab00f08c61d8c62754763f3"; 214 + version = "551df12ee3ebac52c5712058bd97fd9faa4c3430"; 215 215 src = fetchFromGitHub { 216 216 owner = "nix-community"; 217 217 repo = "stylix"; 218 - rev = "e6829552d4bb659ebab00f08c61d8c62754763f3"; 218 + rev = "551df12ee3ebac52c5712058bd97fd9faa4c3430"; 219 219 fetchSubmodules = false; 220 - sha256 = "sha256-NgTRxiEC5y96zrhdBygnY+mSzk5FWMML39PcRGVJmxg="; 220 + sha256 = "sha256-J2DDdRqSU4w9NNgkMfmMeaLIof5PXtS9RG7y6ckDvQE="; 221 221 }; 222 - date = "2025-12-16"; 222 + date = "2025-12-24"; 223 223 }; 224 224 tangled = { 225 225 pname = "tangled"; ··· 245 245 }; 246 246 trill = { 247 247 pname = "trill"; 248 - version = "c9604685156e009cebd0ddc3b31672455f635387"; 248 + version = "d395ba493b4735f82db9ce99c7e7e8b671b38225"; 249 249 src = fetchgit { 250 250 url = "https://tangled.org/@ptr.pet/trill"; 251 - rev = "c9604685156e009cebd0ddc3b31672455f635387"; 251 + rev = "d395ba493b4735f82db9ce99c7e7e8b671b38225"; 252 252 fetchSubmodules = false; 253 253 deepClone = false; 254 254 leaveDotGit = false; 255 255 sparseCheckout = [ ]; 256 - sha256 = "sha256-so9EHN0GQ7rFSmnLnpRap2RqRcklhe3C1HdyAKeR6No="; 256 + sha256 = "sha256-mxV02sfP7H2lv/xD9MkVHfp6F8dnYQly7rhTRpMEeiw="; 257 257 }; 258 - date = "2025-11-25"; 258 + date = "2025-12-25"; 259 259 }; 260 260 zen-browser = { 261 261 pname = "zen-browser"; 262 - version = "4563d0ffdf586368f1bec1a39cc20c9b12b73884"; 262 + version = "98d8f48ba80a4b6e3b56addad850d57132301075"; 263 263 src = fetchFromGitHub { 264 264 owner = "0xc000022070"; 265 265 repo = "zen-browser-flake"; 266 - rev = "4563d0ffdf586368f1bec1a39cc20c9b12b73884"; 266 + rev = "98d8f48ba80a4b6e3b56addad850d57132301075"; 267 267 fetchSubmodules = false; 268 - sha256 = "sha256-NccmxYNOUHLLehsBLaeZ3QtVlDfIW1FDBe3W/kIDwa0="; 268 + sha256 = "sha256-mGZBEN67mxeOsBhplBRLm6L+y++8jU46EEUYgemG1aQ="; 269 269 }; 270 - date = "2025-12-20"; 270 + date = "2025-12-25"; 271 271 }; 272 272 }
+1 -1
dns/dnsconfig.js
··· 123 123 "ptr.pet", 124 124 REG_NONE, 125 125 DnsProvider(DSP_PRIMARY), 126 - TRIMOUNTS("@", CF_PROXY_OFF), 126 + TRIMOUNTS(["@", "tunes"], CF_PROXY_OFF), 127 127 DZWONEK(["nucleus", "trill", "dysnomia"], CF_PROXY_OFF), 128 128 // atproto 129 129 TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae"),
+4 -4
flake.lock
··· 121 121 }, 122 122 "nixpkgs_2": { 123 123 "locked": { 124 - "lastModified": 1766070988, 125 - "narHash": "sha256-fViPX/G/0T7zwCj2C19fuMmEiGvwhj7EYnRJZSjIIyk=", 126 - "rev": "c6245e83d836d0433170a16eb185cefe0572f8b8", 124 + "lastModified": 1766651565, 125 + "narHash": "sha256-gtanTxYMENOVHWdS4QgxxKGPaSqvcNJVw0KBfaF5/Bo=", 126 + "rev": "3e2499d5539c16d0d173ba53552a4ff8547f4539", 127 127 "type": "tarball", 128 - "url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre913595.c6245e83d836/nixexprs.tar.xz?lastModified=1766070988&rev=c6245e83d836d0433170a16eb185cefe0572f8b8" 128 + "url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre916364.3e2499d5539c/nixexprs.tar.xz?lastModified=1766651565&rev=3e2499d5539c16d0d173ba53552a4ff8547f4539" 129 129 }, 130 130 "original": { 131 131 "type": "tarball",
+2 -2
hosts/dzwonek/modules/headscale.nix/default.nix
··· 25 25 }; 26 26 hosts = { 27 27 chernobog = "100.64.0.8"; 28 - wolumonde = "100.64.0.2"; 29 28 higashi = "100.64.0.5"; 29 + trimounts = "100.64.0.7"; 30 30 }; 31 31 rules = lib.mkBefore [ 32 32 { ··· 45 45 dst = [ "tag:private-infra:*" ]; 46 46 } 47 47 { 48 - src = [ "wolumonde" ]; 48 + src = [ "trimounts" ]; 49 49 dst = [ "chernobog:*" ]; 50 50 } 51 51 {
+18 -1
hosts/trimounts/modules/navidrome.nix
··· 1 - {config, pkgs, ...}: { 1 + {config, ...}: 2 + let 3 + domain = "tunes.ptr.pet"; 4 + in { 2 5 services.navidrome = { 3 6 enable = true; 7 + openFirewall = false; 4 8 settings = { 5 9 MusicFolder = "/music"; 6 10 Port = 9999; ··· 9 13 Enabled = true; 10 14 BaseURL = "https://piper.kittysay.xyz/1"; 11 15 }; 16 + EnableSharing = true; 17 + }; 18 + }; 19 + 20 + security.acme.certs."ptr.pet".extraDomainNames = [domain]; 21 + services.nginx.virtualHosts.${domain} = { 22 + quic = true; 23 + kTLS = true; 24 + useACMEHost = "ptr.pet"; 25 + forceSSL = true; 26 + locations."/" = { 27 + proxyPass = with config.services.navidrome.settings; "http://${Address}:${toString Port}"; 28 + proxyWebsockets = true; 12 29 }; 13 30 }; 14 31 }
+10
hosts/trimounts/modules/transmission.nix
··· 1 + { 2 + services.transmission = { 3 + enable = true; 4 + openPeerPorts = true; 5 + openRPCPort = false; # we use tailscale 6 + settings = { 7 + watch-dir-enabled = true; 8 + }; 9 + }; 10 + }
+10
pkgs-set/overlays/feishin.nix
··· 1 + final: prev: let 2 + nixpkgs = final.fetchFromGitHub { 3 + owner = "nixos"; 4 + repo = "nixpkgs"; 5 + rev = "70adf772dca7804ba7b5701f5b20c01108b83401"; 6 + hash = "sha256-AJjEVxNQnmPucS/t9roICpfPsBDjuNoSeQ1YGP40/gM="; 7 + }; 8 + in { 9 + feishin = prev.callPackage "${nixpkgs}/pkgs/by-name/fe/feishin/package.nix" {}; 10 + }
+1 -1
pkgs-set/overlays/nixpkgs-xr.nix
··· 1 1 {inputs, ...}: final: prev: 2 2 ((import inputs.nixpkgs-xr).overlays.default final prev) 3 - // { wivrn = prev.wivrn; } 3 + # // { wivrn = prev.wivrn; }
+49
pkgs-set/pkgs/pds-upload.nix/default.nix
··· 1 + { lib 2 + , stdenvNoCC 3 + , makeWrapper 4 + , nushell 5 + , file 6 + , secretsFile ? null 7 + , ... 8 + }: 9 + 10 + stdenvNoCC.mkDerivation { 11 + pname = "pds-upload"; 12 + version = "0.1.0"; 13 + 14 + src = ./pds-upload.nu; 15 + 16 + nativeBuildInputs = [ makeWrapper ]; 17 + 18 + buildInputs = [ nushell ]; 19 + 20 + dontUnpack = true; 21 + dontBuild = true; 22 + 23 + installPhase = '' 24 + runHook preInstall 25 + 26 + mkdir -p $out/bin $out/libexec 27 + 28 + install -Dm755 $src $out/libexec/pds-upload.nu 29 + 30 + makeWrapper ${nushell}/bin/nu $out/bin/pds-upload \ 31 + --add-flags "$out/libexec/pds-upload.nu" \ 32 + --prefix PATH : ${lib.makeBinPath [ file ]} \ 33 + --run ${lib.escapeShellArg '' 34 + # Optional: Set secrets file from argument override 35 + ${lib.optionalString (secretsFile != null) '' 36 + export ATPROTO_SECRETS_FILE="${secretsFile}" 37 + ''} 38 + 39 + # Load secrets if the file exists (to populate ATPROTO_DID/PASSWORD) 40 + if [ -n "$ATPROTO_SECRETS_FILE" ] && [ -f "$ATPROTO_SECRETS_FILE" ]; then 41 + set -a 42 + source "$ATPROTO_SECRETS_FILE" 43 + set +a 44 + fi 45 + ''} 46 + 47 + runHook postInstall 48 + ''; 49 + }
+96
pkgs-set/pkgs/pds-upload.nix/pds-upload.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + # A script to upload a blob and create a record in the AT Protocol (Bluesky). 4 + # Usage: nu pds-upload.nu <path-to-image> 5 + 6 + def main [ 7 + file_path: path # The path to the file you want to upload 8 + ] { 9 + # --- 1. Setup & Configuration --- 10 + let identifier = ($env.ATPROTO_DID? | default "") 11 + let password = ($env.ATPROTO_PASSWORD? | default "") 12 + 13 + # Default to the main network if not specified in env 14 + let pds_host = ($env.ATPROTO_PDS_URL? | default "https://bsky.social") 15 + 16 + # Validation 17 + if ($identifier | is-empty) or ($password | is-empty) { 18 + error make { 19 + msg: "Missing Credentials", 20 + label: { 21 + text: "Please set ATPROTO_DID and ATPROTO_PASSWORD environment variables.", 22 + span: (metadata $identifier).span 23 + } 24 + } 25 + } 26 + 27 + if not ($file_path | path exists) { 28 + error make { msg: $"File not found: ($file_path)" } 29 + } 30 + 31 + # Detect mime-type 32 + let mime_type = (try { 33 + ^file --mime-type -b $file_path | str trim 34 + } catch { 35 + "application/octet-stream" 36 + }) 37 + 38 + # --- 2. Create Session (Authentication) --- 39 + let session_res = (http post 40 + --content-type "application/json" 41 + $"($pds_host)/xrpc/com.atproto.server.createSession" 42 + { identifier: $identifier, password: $password } 43 + ) 44 + 45 + let access_token = $session_res.accessJwt 46 + let repo_did = $session_res.did 47 + 48 + # --- 3. Upload Blob --- 49 + let file_data = (open $file_path) 50 + 51 + let blob_res = (http post 52 + --content-type $mime_type 53 + --headers { Authorization: $"Bearer ($access_token)" } 54 + $"($pds_host)/xrpc/com.atproto.repo.uploadBlob" 55 + $file_data 56 + ) 57 + 58 + let blob_ref = $blob_res.blob 59 + 60 + # --- 4. Create Record --- 61 + let file_name = ($file_path | path basename) 62 + let now = (date now | format date "%Y-%m-%dT%H:%M:%SZ") 63 + 64 + let record_payload = { 65 + repo: $repo_did 66 + collection: "systems.gaze.file" 67 + record: { 68 + "$type": "systems.gaze.file" 69 + createdAt: $now 70 + file: $blob_ref 71 + filename: $file_name 72 + } 73 + } 74 + 75 + let record_res = (http post 76 + --content-type "application/json" 77 + --headers { Authorization: $"Bearer ($access_token)" } 78 + $"($pds_host)/xrpc/com.atproto.repo.createRecord" 79 + $record_payload 80 + ) 81 + 82 + # --- 5. Construct Return Value --- 83 + # We construct the public URL for the blob 84 + # The '$link' key requires special handling to extract 85 + let cid = ($blob_ref.ref | get '$link') 86 + let blob_url = $"($pds_host)/xrpc/com.atproto.sync.getBlob?did=($repo_did)&cid=($cid)" 87 + 88 + # Return a structured record with both the URI and the direct URL 89 + let result = { 90 + uri: $record_res.uri 91 + cid: $record_res.cid 92 + blob_url: $blob_url 93 + } | to json 94 + 95 + return $result 96 + }
+17
secrets/atfileCfg.age
··· 1 + age-encryption.org/v1 2 + -> ssh-rsa Abmvag 3 + cslEDLMgbmTeCxKXG4isYQdts8ET2tb4NSRgoHpk9g3jB3bEOlYdY7LZtZ8YLxJ0 4 + 78YD6v81ssVQzCOoD0MQKveEkDIAie9JlYYDQS0pv/ACP+E1fqbIRo5pE7t9s26x 5 + rBMZntIDx1vzGRM/+87Wz2NOPpNseP7P2CEIltMn3S5xbsl4N9WVx1mnH4NfsPCu 6 + VRh3APe/Ee/Ph0/wBK2wQWRG97dd+p1bY7nzkRYE26DpODez1f9kTlTppIyivJDc 7 + dIPMkykJOos/dwu6nR1XKS6l8f7Y+pQcYF24cqMe3PDQbhb19qwcpMiy0I11R2ik 8 + /yb8pRziazd01gJsSKUWz/WVhKx7A4dj9TQloWO1FXoIB/mPaxZBghQfP55oV6b9 9 + MGIxRcn/fekbCYNSxVo9WFyBsfg4vNzUcBlUInANrxU2mUS5YFpY7jf2iHGeGfRU 10 + ZQsgB/ftScvtoSdKJ3dW4fW/2MZ2qyzjcrvFvikL50fucXhhOGa4ToDy2e04TLpm 11 + fXlKHBgS+xYIgnjw/6P54SwMbgC1fGUq7mC7TVKZiA/AyDyZMxQvNIfx6MKlffDM 12 + ItU2mHjV2i23g3Nk9V6EmSxy/RCivVNZMWktLJrR+XYKGjhqjqObF83kE9vlzl1g 13 + 6hU80Ys0H8q0iCBnceLL1UlODByXczzRhiqrFetkmlc 14 + --- goQ5BSnSK0NTZ13BPhqmduMllp9tF8n4mNHEVvm1dA8 15 + ๏ฟฝ๏ฟฝ?eO๏ฟฝ๏ฟฝX ๏ฟฝ=/@๏ฟฝ๏ฟฝc๏ฟฝfg๏ฟฝ7  ๏ฟฝciG๏ฟฝ๏ฟฝื“`๏ฟฝ,q(HT๏ฟฝrPs'Z๏ฟฝ๏ฟฝl๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝL๏ฟฝw@2"๏ฟฝ?[๏ฟฝ:๏ฟฝ๏ฟฝ9๏ฟฝ๏ฟฝB๏ฟฝ] ๏ฟฝ{+๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ8%๏ฟฝ๏ฟฝ๏ฟฝ%๏ฟฝw_vR๏ฟฝ๏ฟฝ๏ฟฝ9๏ฟฝN 16 + Q๏ฟฝG๏ฟฝ0 ๏ฟฝZ๏ฟฝl๏ฟฝC๏ฟฝ๏ฟฝu 17 + ๏ฟฝy๏ฟฝ๏ฟฝ๏ฟฝ>J
+1 -5
secrets/secrets.nix
··· 2 2 yusdacra = builtins.readFile ./yusdacra.key.pub; 3 3 dzwonek = builtins.readFile ./dzwonek.key.pub; 4 4 trimounts = builtins.readFile ./trimounts.key.pub; 5 - develMobi = builtins.readFile ./develMobi.key.pub; 6 5 in 7 6 { 8 7 "nixGithubAccessToken.age".publicKeys = [ yusdacra ]; ··· 26 25 yusdacra 27 26 dzwonek 28 27 ]; 29 - "develMobiTailscaleAuthKey.age".publicKeys = [ 30 - yusdacra 31 - develMobi 32 - ]; 33 28 "cloudflareDnsEdit.age".publicKeys = [ 34 29 yusdacra 35 30 dzwonek ··· 40 35 dzwonek 41 36 trimounts 42 37 ]; 38 + "atfileCfg.age".publicKeys = [yusdacra]; 43 39 }
+16 -3
users/mayer/default.nix
··· 2 2 pkgs, 3 3 lib, 4 4 tlib, 5 - config, 6 5 terra, 7 6 ... 8 7 }@globalAttrs: ··· 98 97 99 98 home-manager.users.mayer = 100 99 { 100 + config, 101 101 pkgs, 102 102 inputs, 103 103 ... ··· 128 128 "zen" 129 129 # "discord" 130 130 "clickee" 131 + "arrpc" 131 132 ] 132 133 ]; 133 134 in 134 135 l.flatten [ 135 136 (tlib.prefixStrings "${inputs.self}/users/modules/" modulesToEnable) 136 137 ../modules/discord/service.nix 138 + "${inputs.agenix}/modules/age-home.nix" 137 139 ]; 138 140 139 141 home = { ··· 157 159 bs-manager 158 160 cemu 159 161 tor-browser 160 - supersonic-wayland 161 - ]) ++ [terra.helium]; 162 + # supersonic-wayland 163 + feishin 164 + ]) ++ [ 165 + terra.helium 166 + (terra.pds-upload.override { 167 + secretsFile = config.age.secrets.atfileCfg.path; 168 + }) 169 + ]; 170 + }; 171 + 172 + age.secrets.atfileCfg = { 173 + file = ../../secrets/atfileCfg.age; 174 + mode = "600"; 162 175 }; 163 176 164 177 fonts.fontconfig.enable = l.mkForce true;
+6
users/modules/clipman/default.nix
··· 1 + { 2 + services.clipman = { 3 + enable = true; 4 + systemdTarget = "graphical-session.target"; 5 + }; 6 + }
+1 -1
users/modules/discord/service.nix
··· 8 8 9 9 Service = { 10 10 Type = "simple"; 11 - ExecStart = "${pkgs.openssh}/bin/ssh -N -D 127.0.0.1:1337 root@dzwonek"; 11 + ExecStart = "${pkgs.openssh}/bin/ssh -N -D 127.0.0.1:1338 root@trimounts"; 12 12 Restart = "on-failure"; 13 13 RestartSec = "3s"; 14 14 };
+21
users/modules/niri/clipboard.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + def main [] { 4 + # Get clipboard history from clipman 5 + let history = clipman show-history 6 + 7 + if ($history | is-empty) { 8 + notify-send "Clipman" "No clipboard history" 9 + exit 1 10 + } 11 + 12 + # Show in tofi and get selection 13 + let selection = ($history | lines | tofi --prompt-text "select clipboard item: " | str trim) 14 + 15 + if ($selection | is-empty) { 16 + exit 0 17 + } 18 + 19 + # Copy selection to clipboard 20 + $selection | wl-copy 21 + }
+3
users/modules/niri/config.kdl
··· 179 179 XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; } 180 180 XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; } 181 181 182 + Ctrl+Shift+U { spawn-sh "nu %%clipboard-upload%%"; } 183 + Ctrl+Shift+S { spawn-sh "nu %%clipboard-select%%"; } 184 + 182 185 Mod+O repeat=false { toggle-overview; } 183 186 Mod+Q cooldown-ms=50 { close-window; } 184 187
+4 -4
users/modules/niri/default.nix
··· 1 1 { 2 - config, 3 - nixosConfig, 4 2 pkgs, 5 3 lib, 6 - tlib, 7 4 ... 8 5 }: 9 6 let ··· 15 12 ../wlsunset 16 13 ../mako 17 14 ../tofi 15 + ../clipman 18 16 ]; 19 17 20 - home.packages = with pkgs; [niri xwayland-satellite brightnessctl swaybg]; 18 + home.packages = with pkgs; [file libnotify clipman niri xwayland-satellite brightnessctl swaybg]; 21 19 xdg.configFile."niri/config.kdl".text = 22 20 let 23 21 replace = { 24 22 wallpaper = toString ../../mayer/wallpaper.png; 23 + clipboard-upload = toString ./uploader.nu; 24 + clipboard-select = toString ./clipboard.nu; 25 25 }; 26 26 in 27 27 l.replaceStrings
+70
users/modules/niri/uploader.nu
··· 1 + #!/usr/bin/env nu 2 + 3 + def main [] { 4 + # --- 1. Get Clipboard Content --- 5 + let timestamp = (date now | format date '%Y%m%d_%H%M%S') 6 + let temp_file = $"/tmp/clip_($timestamp)" 7 + 8 + # Save clipboard to temp file 9 + # We remove --no-newline to safely handle binary data if necessary, 10 + # though wl-paste usually handles it. 11 + try { 12 + wl-paste | save -f $temp_file 13 + } catch { 14 + notify-send "Upload Failed" "Could not get content from clipboard" 15 + exit 1 16 + } 17 + 18 + # Detect MIME type just for logging/notification 19 + let mime_type = (try { 20 + ^file --mime-type -b $temp_file | str trim 21 + } catch { 22 + "application/octet-stream" 23 + }) 24 + 25 + print $"๐Ÿ“ค Uploading ($mime_type)..." 26 + notify-send "ATProto Upload" $"Uploading ($mime_type)..." -t 2000 27 + 28 + try { 29 + # --- 2. Call pds-upload --- 30 + # pds-upload now returns: { uri, cid, blob_url } 31 + let res = pds-upload $temp_file | from json 32 + 33 + let record_uri = $res.uri 34 + let blob_url = $res.blob_url 35 + 36 + print $"๐Ÿ”— Blob URL: ($blob_url)" 37 + print "โœ‚๏ธ Shortening with is.gd..." 38 + 39 + # --- 3. Shorten URL --- 40 + # is.gd expects the URL to be passed as a query parameter 'url' 41 + # We must URL-encode the blob_url 42 + let encoded_target = ($blob_url | url encode) 43 + let shorten_api = $"https://is.gd/create.php?format=simple&url=($encoded_target)" 44 + 45 + # is.gd returns the short URL as the body text 46 + let short_url = (http get $shorten_api) 47 + 48 + # --- 4. Success & Clipboard --- 49 + # Check if is.gd returned a URL (starts with http) or an error 50 + if ($short_url | str starts-with "http") { 51 + $short_url | wl-copy 52 + notify-send "ATProto Upload" $"Shortened: ($short_url)" 53 + print $"โœ… Shortened: ($short_url)" 54 + } else { 55 + # Fallback to the long blob URL if shortening failed 56 + $blob_url | wl-copy 57 + notify-send "ATProto Upload" $"Uploaded (Shorten failed)" 58 + print $"โš ๏ธ Shorten failed: ($short_url)" 59 + } 60 + 61 + } catch {|e| 62 + # Parse error for notification 63 + let err_msg = ($e | to text) 64 + notify-send "ATProto Upload" $"Upload failed: ($err_msg)" -u critical 65 + print $"โŒ Upload failed: ($err_msg)" 66 + } 67 + 68 + # Cleanup 69 + rm -f $temp_file 70 + }