mirror of
				https://github.com/nmasur/dotfiles
				synced 2025-11-03 22:53:16 +00:00 
			
		
		
		
	Compare commits
	
		
			141 Commits
		
	
	
		
			a47bcf8949
			...
			pre-platfo
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					6ee5ade2bc | ||
| 
						 | 
					043cd8ce5c | ||
| 
						 | 
					07a0d5185b | ||
| 
						 | 
					a4b5e05f8f | ||
| 
						 | 
					83f548e95f | ||
| 
						 | 
					c66ca460c0 | ||
| 
						 | 
					2b36140fbf | ||
| 
						 | 
					66207830ba | ||
| 
						 | 
					0f7c15bf36 | ||
| 
						 | 
					d31a083ed6 | ||
| 
						 | 
					148839b0ab | ||
| 
						 | 
					7714635fa0 | ||
| 
						 | 
					ca6c275cd8 | ||
| 
						 | 
					54a897abb6 | ||
| 
						 | 
					45eb33485d | ||
| 
						 | 
					cbdf17f618 | ||
| 
						 | 
					fdf231b46e | ||
| 
						 | 
					e9d611fc03 | ||
| 
						 | 
					f899a76f7f | ||
| 
						 | 
					aa93604a6a | ||
| 
						 | 
					6d8fb63d54 | ||
| 
						 | 
					1cb5827438 | ||
| 
						 | 
					fccee387b8 | ||
| 
						 | 
					6f22a3031b | ||
| 
						 | 
					185258ad8a | ||
| 
						 | 
					b69a9a2de7 | ||
| 
						 | 
					f16859893d | ||
| 
						 | 
					b668c991c8 | ||
| 
						 | 
					405b1ce60f | ||
| 
						 | 
					e6f5649999 | ||
| 
						 | 
					ef03bb112d | ||
| 
						 | 
					da172aaa66 | ||
| 
						 | 
					11625adbe8 | ||
| 
						 | 
					b691895e05 | ||
| 
						 | 
					66ef1fa38d | ||
| 
						 | 
					30cc02c2a7 | ||
| 
						 | 
					0d3e42be3f | ||
| 
						 | 
					61ab3e1b3f | ||
| 
						 | 
					bc604bc2ce | ||
| 
						 | 
					39f80ea79a | ||
| 
						 | 
					6ca944fe42 | ||
| 
						 | 
					28ffa10a59 | ||
| 
						 | 
					006554f545 | ||
| 
						 | 
					1b04f9a883 | ||
| 
						 | 
					00f23f4b9c | ||
| 
						 | 
					9b948f45ee | ||
| 
						 | 
					1f0ee6b27f | ||
| 
						 | 
					3348bd0b39 | ||
| 
						 | 
					780ff152c8 | ||
| 
						 | 
					d61ac18707 | ||
| 
						 | 
					bee5631fab | ||
| 
						 | 
					78d34d9177 | ||
| 
						 | 
					100eedc8cd | ||
| 
						 | 
					ce298b9600 | ||
| 
						 | 
					7128cd8d0d | ||
| 
						 | 
					7007577176 | ||
| 
						 | 
					ca1c7cc23f | ||
| 
						 | 
					ae43d24f62 | ||
| 
						 | 
					c6de176b0b | ||
| 
						 | 
					a36df414c1 | ||
| 
						 | 
					1022a3998f | ||
| 
						 | 
					67727954ec | ||
| 
						 | 
					cf8fc2ac56 | ||
| 
						 | 
					4c38ae86a9 | ||
| 
						 | 
					4b3bc8a216 | ||
| 
						 | 
					e9a2ce6df3 | ||
| 
						 | 
					875054aa2c | ||
| 
						 | 
					4b9eea276b | ||
| 
						 | 
					fc5ed5e892 | ||
| 
						 | 
					1d01ddbbbc | ||
| 
						 | 
					8cba026f10 | ||
| 
						 | 
					a6e4b3130d | ||
| 
						 | 
					33868c1add | ||
| 
						 | 
					d806bd7f56 | ||
| 
						 | 
					120b97f970 | ||
| 
						 | 
					5f71437e57 | ||
| 
						 | 
					e8e65ba4d1 | ||
| 
						 | 
					c594a0b161 | ||
| 
						 | 
					57c3719600 | ||
| 
						 | 
					98c9c85e95 | ||
| 
						 | 
					3ef36c4873 | ||
| 
						 | 
					1d1d5014a0 | ||
| 
						 | 
					1f64ed0bb8 | ||
| 
						 | 
					2bfb8ea8b5 | ||
| 
						 | 
					e91d6665fb | ||
| 
						 | 
					7e3ab279af | ||
| 
						 | 
					cdb9da9c50 | ||
| 
						 | 
					46bbd2c967 | ||
| 
						 | 
					51bee71faf | ||
| 
						 | 
					a7adc18463 | ||
| 
						 | 
					25a959f404 | ||
| 
						 | 
					9f31d775c7 | ||
| 
						 | 
					5306070bc5 | ||
| 
						 | 
					b729eff679 | ||
| 
						 | 
					4883532c65 | ||
| 
						 | 
					982d3ce2d8 | ||
| 
						 | 
					64311e6e1c | ||
| 
						 | 
					83c9393837 | ||
| 
						 | 
					e72d4eb548 | ||
| 
						 | 
					b51df2f3a3 | ||
| 
						 | 
					f47f397e1f | ||
| 
						 | 
					48b1d41aff | ||
| 
						 | 
					25c4e79ccc | ||
| 
						 | 
					3b86a666fd | ||
| 
						 | 
					264ad53f67 | ||
| 
						 | 
					1cb5d3138c | ||
| 
						 | 
					9c4438bed2 | ||
| 
						 | 
					642d3c183f | ||
| 
						 | 
					5798406977 | ||
| 
						 | 
					81cb603bb7 | ||
| 
						 | 
					1e7c69b3ea | ||
| 
						 | 
					45deba10af | ||
| 
						 | 
					d1721efc6c | ||
| 
						 | 
					96caba63c4 | ||
| 
						 | 
					01cd6151c1 | ||
| 
						 | 
					e6644ab7b9 | ||
| 
						 | 
					e43f6cf000 | ||
| 
						 | 
					a9cdf6ac38 | ||
| 
						 | 
					9fb7f68b07 | ||
| 
						 | 
					845fc000b6 | ||
| 
						 | 
					0b0556f057 | ||
| 
						 | 
					771cac63a3 | ||
| 
						 | 
					f7c5d3510f | ||
| 
						 | 
					6866ca5fee | ||
| 
						 | 
					883dc15b3d | ||
| 
						 | 
					842f373101 | ||
| 
						 | 
					65aa25b213 | ||
| 
						 | 
					5b2fef7e01 | ||
| 
						 | 
					2a812c1bdb | ||
| 
						 | 
					16a372ce64 | ||
| 
						 | 
					fb45ccdd5c | ||
| 
						 | 
					74e6d740af | ||
| 
						 | 
					2ad5411b90 | ||
| 
						 | 
					3b494bed5b | ||
| 
						 | 
					de4c8c32ef | ||
| 
						 | 
					a7be0ed5cc | ||
| 
						 | 
					e7f8d706b2 | ||
| 
						 | 
					39fda67d6e | ||
| 
						 | 
					4eb0327a1b | ||
| 
						 | 
					029119ce93 | ||
| 
						 | 
					b15fd34e30 | 
							
								
								
									
										4
									
								
								.github/workflows/update.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/update.yml
									
									
									
									
										vendored
									
									
								
							@@ -3,7 +3,7 @@ name: Update Flake
 | 
				
			|||||||
on:
 | 
					on:
 | 
				
			||||||
  workflow_dispatch: # allows manual triggering
 | 
					  workflow_dispatch: # allows manual triggering
 | 
				
			||||||
  schedule:
 | 
					  schedule:
 | 
				
			||||||
    - cron: '33 3 * * 0' # runs weekly on Sunday at 03:33
 | 
					    - cron: '33 3 * * 6' # runs weekly on Saturday at 03:33
 | 
				
			||||||
 | 
					
 | 
				
			||||||
permissions:
 | 
					permissions:
 | 
				
			||||||
  contents: write
 | 
					  contents: write
 | 
				
			||||||
@@ -19,6 +19,8 @@ jobs:
 | 
				
			|||||||
        uses: actions/checkout@v3
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
      - name: Install Nix
 | 
					      - name: Install Nix
 | 
				
			||||||
        uses: DeterminateSystems/nix-installer-action@v11
 | 
					        uses: DeterminateSystems/nix-installer-action@v11
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          nix-package-url: https://releases.nixos.org/nix/nix-2.18.4/nix-2.18.4-x86_64-linux.tar.xz
 | 
				
			||||||
      - name: Check Nixpkgs Inputs
 | 
					      - name: Check Nixpkgs Inputs
 | 
				
			||||||
        uses: DeterminateSystems/flake-checker-action@v7
 | 
					        uses: DeterminateSystems/flake-checker-action@v7
 | 
				
			||||||
      - name: Add Nix Cache
 | 
					      - name: Add Nix Cache
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@
 | 
				
			|||||||
          exit 1
 | 
					          exit 1
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ${pkgs.disko-packaged}/bin/disko \
 | 
					      ${pkgs.disko}/bin/disko \
 | 
				
			||||||
          --mode create \
 | 
					          --mode create \
 | 
				
			||||||
          --dry-run \
 | 
					          --dry-run \
 | 
				
			||||||
          --flake "path:$(pwd)#root" \
 | 
					          --flake "path:$(pwd)#root" \
 | 
				
			||||||
@@ -31,7 +31,7 @@
 | 
				
			|||||||
          "This will ERASE ALL DATA on the disk /dev/''${DISK}. Are you sure you want to continue?" \
 | 
					          "This will ERASE ALL DATA on the disk /dev/''${DISK}. Are you sure you want to continue?" \
 | 
				
			||||||
          --default=false
 | 
					          --default=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ${pkgs.disko-packaged}/bin/disko \
 | 
					      ${pkgs.disko}/bin/disko \
 | 
				
			||||||
          --mode create \
 | 
					          --mode create \
 | 
				
			||||||
          --flake "path:$(pwd)#root" \
 | 
					          --flake "path:$(pwd)#root" \
 | 
				
			||||||
          --arg disk "/dev/''${DISK}"
 | 
					          --arg disk "/dev/''${DISK}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										472
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										472
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							@@ -3,11 +3,11 @@
 | 
				
			|||||||
    "baleia-nvim-src": {
 | 
					    "baleia-nvim-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1717182435,
 | 
					        "lastModified": 1721805312,
 | 
				
			||||||
        "narHash": "sha256-duI3myrJSvmtjF9n7NVrVOsuSo1O3JEypA5ghBHsULc=",
 | 
					        "narHash": "sha256-qA1x5kplP2I8bURO0I4R0gt/zeznu9hQQ+XHptLGuwc=",
 | 
				
			||||||
        "owner": "m00qek",
 | 
					        "owner": "m00qek",
 | 
				
			||||||
        "repo": "baleia.nvim",
 | 
					        "repo": "baleia.nvim",
 | 
				
			||||||
        "rev": "4d3b27dbec65a44ceecd9306f605a980bcf4e9b1",
 | 
					        "rev": "1b25eac3ac03659c3d3af75c7455e179e5f197f7",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -51,11 +51,11 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    "cl-nix-lite": {
 | 
					    "cl-nix-lite": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1717972076,
 | 
					        "lastModified": 1728174978,
 | 
				
			||||||
        "narHash": "sha256-hnZEsDInTcsVSL5LBGDAZegAxVLBus/wiJh+sNM15zU=",
 | 
					        "narHash": "sha256-Grqqg+xuicANB85j0gNEXxi9SBKY7bzGeTuyi95eGcY=",
 | 
				
			||||||
        "owner": "hraban",
 | 
					        "owner": "hraban",
 | 
				
			||||||
        "repo": "cl-nix-lite",
 | 
					        "repo": "cl-nix-lite",
 | 
				
			||||||
        "rev": "cc920bfb0a6402d3871f470c98d65266126973e4",
 | 
					        "rev": "31cfe6275c341eb3120a99f4b1c8516c49a29d87",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -67,11 +67,11 @@
 | 
				
			|||||||
    "cmp-nvim-lsp-src": {
 | 
					    "cmp-nvim-lsp-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1715931395,
 | 
					        "lastModified": 1733823748,
 | 
				
			||||||
        "narHash": "sha256-CT1+Z4XJBVsl/RqvJeGmyitD6x7So0ylXvvef5jh7I8=",
 | 
					        "narHash": "sha256-iaihXNCF5bB5MdeoosD/kc3QtpA/QaIDZVLiLIurBSM=",
 | 
				
			||||||
        "owner": "hrsh7th",
 | 
					        "owner": "hrsh7th",
 | 
				
			||||||
        "repo": "cmp-nvim-lsp",
 | 
					        "repo": "cmp-nvim-lsp",
 | 
				
			||||||
        "rev": "39e2eda76828d88b773cc27a3f61d2ad782c922d",
 | 
					        "rev": "99290b3ec1322070bcfb9e846450a46f6efa50f0",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -87,11 +87,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719845423,
 | 
					        "lastModified": 1737504076,
 | 
				
			||||||
        "narHash": "sha256-ZLHDmWAsHQQKnmfyhYSHJDlt8Wfjv6SQhl2qek42O7A=",
 | 
					        "narHash": "sha256-/B4XJnzYU/6K1ZZOBIgsa3K4pqDJrnC2579c44c+4rI=",
 | 
				
			||||||
        "owner": "lnl7",
 | 
					        "owner": "lnl7",
 | 
				
			||||||
        "repo": "nix-darwin",
 | 
					        "repo": "nix-darwin",
 | 
				
			||||||
        "rev": "ec12b88104d6c117871fad55e931addac4626756",
 | 
					        "rev": "65cc1fa8e36ceff067daf6cfb142331f02f524d3",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -108,11 +108,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719864345,
 | 
					        "lastModified": 1737038063,
 | 
				
			||||||
        "narHash": "sha256-e4Pw+30vFAxuvkSTaTypd9zYemB/QlWcH186dsGT+Ms=",
 | 
					        "narHash": "sha256-rMEuiK69MDhjz1JgbaeQ9mBDXMJ2/P8vmOYRbFndXsk=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "disko",
 | 
					        "repo": "disko",
 | 
				
			||||||
        "rev": "544a80a69d6e2da04e4df7ec8210a858de8c7533",
 | 
					        "rev": "bf0abfde48f469c256f2b0f481c6281ff04a5db2",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -145,11 +145,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719881223,
 | 
					        "lastModified": 1737766332,
 | 
				
			||||||
        "narHash": "sha256-9eaxGGPw7hIuZ4OaqOyKec262t+TCie0p83tlzkMEpc=",
 | 
					        "narHash": "sha256-EcKXfadl+51Y5DQU4R7cy3FQx6XklLwmSwIAtOl1hNU=",
 | 
				
			||||||
        "owner": "bandithedoge",
 | 
					        "owner": "bandithedoge",
 | 
				
			||||||
        "repo": "nixpkgs-firefox-darwin",
 | 
					        "repo": "nixpkgs-firefox-darwin",
 | 
				
			||||||
        "rev": "407f201936424ec061d33aa687e7978ae7873b5c",
 | 
					        "rev": "ef9a452ffc26aed9265e2a5ff04952e960f8f21b",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -161,11 +161,11 @@
 | 
				
			|||||||
    "flake-compat": {
 | 
					    "flake-compat": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1697816753,
 | 
					        "lastModified": 1730663653,
 | 
				
			||||||
        "narHash": "sha256-40to80AEIyKCQI0xMKCeF5ePoIKTYgjVVCZeu4CnTxM=",
 | 
					        "narHash": "sha256-kFCUWettiFHDIqxCWWQ9qY8pVh+Lj+XL0Giyy/kdomg=",
 | 
				
			||||||
        "owner": "hraban",
 | 
					        "owner": "hraban",
 | 
				
			||||||
        "repo": "flake-compat",
 | 
					        "repo": "flake-compat",
 | 
				
			||||||
        "rev": "6025bade1336a36014639bc3f67eacc853dab78f",
 | 
					        "rev": "e5b16676185cb7548581c852f51ce7f3a49bba5e",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -178,11 +178,11 @@
 | 
				
			|||||||
    "flake-compat_2": {
 | 
					    "flake-compat_2": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1696426674,
 | 
					        "lastModified": 1733328505,
 | 
				
			||||||
        "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
 | 
					        "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
 | 
				
			||||||
        "owner": "edolstra",
 | 
					        "owner": "edolstra",
 | 
				
			||||||
        "repo": "flake-compat",
 | 
					        "repo": "flake-compat",
 | 
				
			||||||
        "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
 | 
					        "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -191,16 +191,58 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "flake-parts": {
 | 
				
			||||||
 | 
					      "inputs": {
 | 
				
			||||||
 | 
					        "nixpkgs-lib": [
 | 
				
			||||||
 | 
					          "nur",
 | 
				
			||||||
 | 
					          "nixpkgs"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1733312601,
 | 
				
			||||||
 | 
					        "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
 | 
				
			||||||
 | 
					        "owner": "hercules-ci",
 | 
				
			||||||
 | 
					        "repo": "flake-parts",
 | 
				
			||||||
 | 
					        "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "hercules-ci",
 | 
				
			||||||
 | 
					        "repo": "flake-parts",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "flake-utils": {
 | 
					    "flake-utils": {
 | 
				
			||||||
      "inputs": {
 | 
					      "inputs": {
 | 
				
			||||||
        "systems": "systems"
 | 
					        "systems": "systems"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1710146030,
 | 
					        "lastModified": 1731533236,
 | 
				
			||||||
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
 | 
					        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
 | 
				
			||||||
        "owner": "numtide",
 | 
					        "owner": "numtide",
 | 
				
			||||||
        "repo": "flake-utils",
 | 
					        "repo": "flake-utils",
 | 
				
			||||||
        "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
 | 
					        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "numtide",
 | 
				
			||||||
 | 
					        "repo": "flake-utils",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "flake-utils_2": {
 | 
				
			||||||
 | 
					      "inputs": {
 | 
				
			||||||
 | 
					        "systems": [
 | 
				
			||||||
 | 
					          "mac-app-util",
 | 
				
			||||||
 | 
					          "systems"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1731533236,
 | 
				
			||||||
 | 
					        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
 | 
				
			||||||
 | 
					        "owner": "numtide",
 | 
				
			||||||
 | 
					        "repo": "flake-utils",
 | 
				
			||||||
 | 
					        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -208,9 +250,9 @@
 | 
				
			|||||||
        "type": "indirect"
 | 
					        "type": "indirect"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "flake-utils_2": {
 | 
					    "flake-utils_3": {
 | 
				
			||||||
      "inputs": {
 | 
					      "inputs": {
 | 
				
			||||||
        "systems": "systems_2"
 | 
					        "systems": "systems_3"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1705309234,
 | 
					        "lastModified": 1705309234,
 | 
				
			||||||
@@ -226,32 +268,30 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "flake-utils_3": {
 | 
					    "gh-collaborators": {
 | 
				
			||||||
      "inputs": {
 | 
					      "flake": false,
 | 
				
			||||||
        "systems": "systems_3"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1710146030,
 | 
					        "lastModified": 1736185279,
 | 
				
			||||||
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
 | 
					        "narHash": "sha256-SGmP/8Fvf2rcYkwscMOFG01Y0VJGb/TXrNZtLacurxA=",
 | 
				
			||||||
        "owner": "numtide",
 | 
					        "owner": "katiem0",
 | 
				
			||||||
        "repo": "flake-utils",
 | 
					        "repo": "gh-collaborators",
 | 
				
			||||||
        "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
 | 
					        "rev": "bf412dde50605e48af86f291c2ac8714f2c1b228",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "owner": "numtide",
 | 
					        "owner": "katiem0",
 | 
				
			||||||
        "repo": "flake-utils",
 | 
					        "repo": "gh-collaborators",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "hmts-nvim-src": {
 | 
					    "hmts-nvim-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1715076655,
 | 
					        "lastModified": 1729786258,
 | 
				
			||||||
        "narHash": "sha256-vDTqJQzLyg0nmlC+CrLnPkYti1rPxmvRW8eQq/9Zg+M=",
 | 
					        "narHash": "sha256-V5dwIJdxBulFVKk1iSlf4H5NRz1UH7uYQeMvwtgkpIs=",
 | 
				
			||||||
        "owner": "calops",
 | 
					        "owner": "calops",
 | 
				
			||||||
        "repo": "hmts.nvim",
 | 
					        "repo": "hmts.nvim",
 | 
				
			||||||
        "rev": "19a91816c123173a4551a6a04f2882338f20db1d",
 | 
					        "rev": "c7ff4c3ad96cd05664b18fb5bbbe2abbd7682dd2",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -267,11 +307,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719827439,
 | 
					        "lastModified": 1737762889,
 | 
				
			||||||
        "narHash": "sha256-tneHOIv1lEavZ0vQ+rgz67LPNCgOZVByYki3OkSshFU=",
 | 
					        "narHash": "sha256-5HGG09bh/Yx0JA8wtBMAzt0HMCL1bYZ93x4IqzVExio=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "home-manager",
 | 
					        "repo": "home-manager",
 | 
				
			||||||
        "rev": "59ce796b2563e19821361abbe2067c3bb4143a7d",
 | 
					        "rev": "daf04c5950b676f47a794300657f1d3d14c1a120",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -281,21 +321,44 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "jujutsu": {
 | 
				
			||||||
 | 
					      "inputs": {
 | 
				
			||||||
 | 
					        "flake-utils": "flake-utils",
 | 
				
			||||||
 | 
					        "nixpkgs": [
 | 
				
			||||||
 | 
					          "nixpkgs"
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        "rust-overlay": "rust-overlay"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1737770753,
 | 
				
			||||||
 | 
					        "narHash": "sha256-3CxkhWleCeSF18dO4lo0teBfHm5evdEaL959gOcD+0A=",
 | 
				
			||||||
 | 
					        "owner": "martinvonz",
 | 
				
			||||||
 | 
					        "repo": "jj",
 | 
				
			||||||
 | 
					        "rev": "e58713c1355d0536e197a3f99ce5a5c713fe69c3",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "martinvonz",
 | 
				
			||||||
 | 
					        "repo": "jj",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "mac-app-util": {
 | 
					    "mac-app-util": {
 | 
				
			||||||
      "inputs": {
 | 
					      "inputs": {
 | 
				
			||||||
        "cl-nix-lite": "cl-nix-lite",
 | 
					        "cl-nix-lite": "cl-nix-lite",
 | 
				
			||||||
        "flake-compat": "flake-compat",
 | 
					        "flake-compat": "flake-compat",
 | 
				
			||||||
        "flake-utils": "flake-utils",
 | 
					        "flake-utils": "flake-utils_2",
 | 
				
			||||||
        "nixpkgs": [
 | 
					        "nixpkgs": [
 | 
				
			||||||
          "nixpkgs"
 | 
					          "nixpkgs"
 | 
				
			||||||
        ]
 | 
					        ],
 | 
				
			||||||
 | 
					        "systems": "systems_2"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718893255,
 | 
					        "lastModified": 1732920695,
 | 
				
			||||||
        "narHash": "sha256-NdSDGdz5eU/EcnGn8ECP1V+mn5hyGOZQ4ybv2bWTpuk=",
 | 
					        "narHash": "sha256-1fxvJZUznwrmEtYqpPuWi2tPcL9kj6v7p1J7ZZncAPE=",
 | 
				
			||||||
        "owner": "hraban",
 | 
					        "owner": "hraban",
 | 
				
			||||||
        "repo": "mac-app-util",
 | 
					        "repo": "mac-app-util",
 | 
				
			||||||
        "rev": "1857b26aceaf64c2b6a357eb83cf34139b6365cc",
 | 
					        "rev": "548672d0cb661ce11d08ee8bde92b87d2a75c872",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -304,87 +367,71 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "markview-nvim-src": {
 | 
					 | 
				
			||||||
      "flake": false,
 | 
					 | 
				
			||||||
      "locked": {
 | 
					 | 
				
			||||||
        "lastModified": 1719592662,
 | 
					 | 
				
			||||||
        "narHash": "sha256-E1lHSjbnOOIeieaFJ+INvxJHCbfVS3mwbQ6wrlKeGSQ=",
 | 
					 | 
				
			||||||
        "owner": "OXY2DEV",
 | 
					 | 
				
			||||||
        "repo": "markview.nvim",
 | 
					 | 
				
			||||||
        "rev": "f60219dce7283192d549f21847fcf8537bf6d260",
 | 
					 | 
				
			||||||
        "type": "github"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "original": {
 | 
					 | 
				
			||||||
        "owner": "OXY2DEV",
 | 
					 | 
				
			||||||
        "repo": "markview.nvim",
 | 
					 | 
				
			||||||
        "type": "github"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "nextcloud-cookbook": {
 | 
					    "nextcloud-cookbook": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719431638,
 | 
					        "lastModified": 1726214817,
 | 
				
			||||||
        "narHash": "sha256-a8ekMnEzudHGiqHF53jPtgsVTOTc2QLuPg6YtTw5h68=",
 | 
					        "narHash": "sha256-Pfa+Xbopg20os+pnGgg+wpEX1MI5fz5JMb0K4a8rBhs=",
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.1/cookbook-0.11.1.tar.gz"
 | 
					        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.1/cookbook-0.11.1.tar.gz"
 | 
					        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nextcloud-external": {
 | 
					    "nextcloud-external": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1710338675,
 | 
					        "lastModified": 1729501349,
 | 
				
			||||||
        "narHash": "sha256-bJJ/dVmE1o04QCyrxD0sko0okRsnxJmT6sOTOmBiifs=",
 | 
					        "narHash": "sha256-OV6HhFBzmnQBO5btGEnqmKlaUMY7/t2Qm3XebclpBlM=",
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.4.0/external-v5.4.0.tar.gz"
 | 
					        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.4.0/external-v5.4.0.tar.gz"
 | 
					        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nextcloud-news": {
 | 
					    "nextcloud-news": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718102703,
 | 
					        "lastModified": 1729667621,
 | 
				
			||||||
        "narHash": "sha256-XNGjf7SWgJYFdVNOh3ED0jxSG0GJwWImVQq4cJT1Lo4=",
 | 
					        "narHash": "sha256-pnvyMZQ+NYMgH0Unfh5S19HdZSjnghgoUDAoi2KIXNI=",
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha7/news.tar.gz"
 | 
					        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha7/news.tar.gz"
 | 
					        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nextcloud-snappymail": {
 | 
					    "nextcloud-snappymail": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1720361351,
 | 
					        "lastModified": 1737776393,
 | 
				
			||||||
        "narHash": "sha256-HlqO7xlMSRGgBtwi0t5oz5v7iw0zTSHysc9wGVRwGZI=",
 | 
					        "narHash": "sha256-oCw6Brs85rINBHvz3UJXheyLVqvA3RgPXG03b30Fx7E=",
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.36.4-nextcloud.tar.gz"
 | 
					        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.38.2-nextcloud.tar.gz"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.36.4-nextcloud.tar.gz"
 | 
					        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.38.2-nextcloud.tar.gz"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nix2vim": {
 | 
					    "nix2vim": {
 | 
				
			||||||
      "inputs": {
 | 
					      "inputs": {
 | 
				
			||||||
        "flake-utils": "flake-utils_2",
 | 
					        "flake-utils": "flake-utils_3",
 | 
				
			||||||
        "nixpkgs": [
 | 
					        "nixpkgs": [
 | 
				
			||||||
          "nixpkgs"
 | 
					          "nixpkgs"
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718621825,
 | 
					        "lastModified": 1732820845,
 | 
				
			||||||
        "narHash": "sha256-bSfjwRgKKpLyjEDPRAF1hlJKc7QDoqopalHwNCB/eAA=",
 | 
					        "narHash": "sha256-YPXk41l4PzKb5rtcxkYhymwjHJG95fxl4iXIzXnftr8=",
 | 
				
			||||||
        "owner": "gytis-ivaskevicius",
 | 
					        "owner": "gytis-ivaskevicius",
 | 
				
			||||||
        "repo": "nix2vim",
 | 
					        "repo": "nix2vim",
 | 
				
			||||||
        "rev": "1db11dbf8a4d124e02244fa5c4ff219b672a8e5b",
 | 
					        "rev": "e2c511ea553418dd432005875c649b09d56b7e58",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -395,11 +442,11 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    "nixlib": {
 | 
					    "nixlib": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719708727,
 | 
					        "lastModified": 1736643958,
 | 
				
			||||||
        "narHash": "sha256-XFNKtyirrGNdehpg7lMNm1skEcBApjqGhaHc/OI95HY=",
 | 
					        "narHash": "sha256-tmpqTSWVRJVhpvfSN9KXBvKEXplrwKnSZNAoNPf/S/s=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "nixpkgs.lib",
 | 
					        "repo": "nixpkgs.lib",
 | 
				
			||||||
        "rev": "1bba8a624b3b9d4f68db94fb63aaeb46039ce9e6",
 | 
					        "rev": "1418bc28a52126761c02dd3d89b2d8ca0f521181",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -416,11 +463,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719841141,
 | 
					        "lastModified": 1737057290,
 | 
				
			||||||
        "narHash": "sha256-WOyohxFJJdfDvEB7N3eTcX44lNU2rZes1inHsyHL7mM=",
 | 
					        "narHash": "sha256-3Pe0yKlCc7EOeq1X/aJVDH0CtNL+tIBm49vpepwL1MQ=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "nixos-generators",
 | 
					        "repo": "nixos-generators",
 | 
				
			||||||
        "rev": "140dcc2b9a0eb87ba5e9011076a1a7af19179ab1",
 | 
					        "rev": "d002ce9b6e7eb467cd1c6bb9aef9c35d191b5453",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -431,11 +478,11 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    "nixpkgs": {
 | 
					    "nixpkgs": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719848872,
 | 
					        "lastModified": 1737632463,
 | 
				
			||||||
        "narHash": "sha256-H3+EC5cYuq+gQW8y0lSrrDZfH71LB4DAf+TDFyvwCNA=",
 | 
					        "narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=",
 | 
				
			||||||
        "owner": "nixos",
 | 
					        "owner": "nixos",
 | 
				
			||||||
        "repo": "nixpkgs",
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
        "rev": "00d80d13810dbfea8ab4ed1009b09100cca86ba8",
 | 
					        "rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -461,13 +508,50 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nur": {
 | 
					    "nixpkgs-stable": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719925604,
 | 
					        "lastModified": 1735563628,
 | 
				
			||||||
        "narHash": "sha256-cLmqi+P1sn+7497GS4fNWayoTDa0ZiJecjmEM4iQN9U=",
 | 
					        "narHash": "sha256-OnSAY7XDSx7CtDoqNh8jwVwh4xNL/2HaJxGjryLWzX8=",
 | 
				
			||||||
 | 
					        "owner": "nixos",
 | 
				
			||||||
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
 | 
					        "rev": "b134951a4c9f3c995fd7be05f3243f8ecd65d798",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "nixos",
 | 
				
			||||||
 | 
					        "ref": "nixos-24.05",
 | 
				
			||||||
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nixpkgs_2": {
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1737632463,
 | 
				
			||||||
 | 
					        "narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=",
 | 
				
			||||||
 | 
					        "owner": "nixos",
 | 
				
			||||||
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
 | 
					        "rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "nixos",
 | 
				
			||||||
 | 
					        "ref": "nixos-unstable",
 | 
				
			||||||
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nur": {
 | 
				
			||||||
 | 
					      "inputs": {
 | 
				
			||||||
 | 
					        "flake-parts": "flake-parts",
 | 
				
			||||||
 | 
					        "nixpkgs": "nixpkgs_2",
 | 
				
			||||||
 | 
					        "treefmt-nix": "treefmt-nix"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1737776325,
 | 
				
			||||||
 | 
					        "narHash": "sha256-uSt1yFqmuyehOr0u6k8MXSBrwEGToWcIrTzJexHBufM=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "nur",
 | 
					        "repo": "nur",
 | 
				
			||||||
        "rev": "574405811547dcec59e912c5e82bfd224648bd5e",
 | 
					        "rev": "e3bdfbe8b01b6469fd2351ab0cf867d9cfa73da8",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -479,11 +563,11 @@
 | 
				
			|||||||
    "nvim-lint-src": {
 | 
					    "nvim-lint-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719415114,
 | 
					        "lastModified": 1737487916,
 | 
				
			||||||
        "narHash": "sha256-a9Mfoi1NzQ3b1w1VUqqJZddyCZYyacRnc128t5X3Wb0=",
 | 
					        "narHash": "sha256-DKfivSjBFra/iXIuYQa7Mv5f2LglNbQTr8bQ+sCm8to=",
 | 
				
			||||||
        "owner": "mfussenegger",
 | 
					        "owner": "mfussenegger",
 | 
				
			||||||
        "repo": "nvim-lint",
 | 
					        "repo": "nvim-lint",
 | 
				
			||||||
        "rev": "efc6fc83f0772283e064c53a8f9fb5645bde0bc0",
 | 
					        "rev": "789b7ada1b4f00e08d026dffde410dcfa6a0ba87",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -512,11 +596,11 @@
 | 
				
			|||||||
    "nvim-tree-lua-src": {
 | 
					    "nvim-tree-lua-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719107085,
 | 
					        "lastModified": 1737769654,
 | 
				
			||||||
        "narHash": "sha256-RfrbxYD7RYBEy/grSYnKKkWd4BHxGYEFeLiDB5OYGpg=",
 | 
					        "narHash": "sha256-3wHzEixIhg+aFO9fOOSuTPdNkMK96eG7cdSbK7i5pXA=",
 | 
				
			||||||
        "owner": "kyazdani42",
 | 
					        "owner": "kyazdani42",
 | 
				
			||||||
        "repo": "nvim-tree.lua",
 | 
					        "repo": "nvim-tree.lua",
 | 
				
			||||||
        "rev": "8b2c5c678be4b49dff6a2df794877000113fd77b",
 | 
					        "rev": "fee1da88972f5972a8296813f6c00d7598325ebd",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -528,20 +612,37 @@
 | 
				
			|||||||
    "nvim-treesitter-src": {
 | 
					    "nvim-treesitter-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719904131,
 | 
					        "lastModified": 1705679158,
 | 
				
			||||||
        "narHash": "sha256-RbTBilXbgMFfwkbIyLMZuZw1DyzDol7g0V6uu4MaEh0=",
 | 
					        "narHash": "sha256-zAyiitJIgOCZTB0CmgNt0MHENM70SOHLIoWrVwOJKFg=",
 | 
				
			||||||
        "owner": "nvim-treesitter",
 | 
					        "owner": "nvim-treesitter",
 | 
				
			||||||
        "repo": "nvim-treesitter",
 | 
					        "repo": "nvim-treesitter",
 | 
				
			||||||
        "rev": "e0d6c7643dc953acc2e817d0cebfc2f1f8c008e1",
 | 
					        "rev": "f197a15b0d1e8d555263af20add51450e5aaa1f0",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "owner": "nvim-treesitter",
 | 
					        "owner": "nvim-treesitter",
 | 
				
			||||||
        "ref": "master",
 | 
					        "ref": "v0.9.2",
 | 
				
			||||||
        "repo": "nvim-treesitter",
 | 
					        "repo": "nvim-treesitter",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "osc": {
 | 
				
			||||||
 | 
					      "flake": false,
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1732197203,
 | 
				
			||||||
 | 
					        "narHash": "sha256-xL9mqwb+C6WbuJ/qk0lNbi9xd24PbKi5G0FlwaH5XPk=",
 | 
				
			||||||
 | 
					        "owner": "theimpostor",
 | 
				
			||||||
 | 
					        "repo": "osc",
 | 
				
			||||||
 | 
					        "rev": "87b316b3f96a22fd85654cd7bd091f2cac1c6691",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "theimpostor",
 | 
				
			||||||
 | 
					        "ref": "v0.4.6",
 | 
				
			||||||
 | 
					        "repo": "osc",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "ren": {
 | 
					    "ren": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
@@ -584,10 +685,11 @@
 | 
				
			|||||||
        "disko": "disko",
 | 
					        "disko": "disko",
 | 
				
			||||||
        "fidget-nvim-src": "fidget-nvim-src",
 | 
					        "fidget-nvim-src": "fidget-nvim-src",
 | 
				
			||||||
        "firefox-darwin": "firefox-darwin",
 | 
					        "firefox-darwin": "firefox-darwin",
 | 
				
			||||||
 | 
					        "gh-collaborators": "gh-collaborators",
 | 
				
			||||||
        "hmts-nvim-src": "hmts-nvim-src",
 | 
					        "hmts-nvim-src": "hmts-nvim-src",
 | 
				
			||||||
        "home-manager": "home-manager",
 | 
					        "home-manager": "home-manager",
 | 
				
			||||||
 | 
					        "jujutsu": "jujutsu",
 | 
				
			||||||
        "mac-app-util": "mac-app-util",
 | 
					        "mac-app-util": "mac-app-util",
 | 
				
			||||||
        "markview-nvim-src": "markview-nvim-src",
 | 
					 | 
				
			||||||
        "nextcloud-cookbook": "nextcloud-cookbook",
 | 
					        "nextcloud-cookbook": "nextcloud-cookbook",
 | 
				
			||||||
        "nextcloud-external": "nextcloud-external",
 | 
					        "nextcloud-external": "nextcloud-external",
 | 
				
			||||||
        "nextcloud-news": "nextcloud-news",
 | 
					        "nextcloud-news": "nextcloud-news",
 | 
				
			||||||
@@ -596,16 +698,19 @@
 | 
				
			|||||||
        "nixos-generators": "nixos-generators",
 | 
					        "nixos-generators": "nixos-generators",
 | 
				
			||||||
        "nixpkgs": "nixpkgs",
 | 
					        "nixpkgs": "nixpkgs",
 | 
				
			||||||
        "nixpkgs-caddy": "nixpkgs-caddy",
 | 
					        "nixpkgs-caddy": "nixpkgs-caddy",
 | 
				
			||||||
 | 
					        "nixpkgs-stable": "nixpkgs-stable",
 | 
				
			||||||
        "nur": "nur",
 | 
					        "nur": "nur",
 | 
				
			||||||
        "nvim-lint-src": "nvim-lint-src",
 | 
					        "nvim-lint-src": "nvim-lint-src",
 | 
				
			||||||
        "nvim-lspconfig-src": "nvim-lspconfig-src",
 | 
					        "nvim-lspconfig-src": "nvim-lspconfig-src",
 | 
				
			||||||
        "nvim-tree-lua-src": "nvim-tree-lua-src",
 | 
					        "nvim-tree-lua-src": "nvim-tree-lua-src",
 | 
				
			||||||
        "nvim-treesitter-src": "nvim-treesitter-src",
 | 
					        "nvim-treesitter-src": "nvim-treesitter-src",
 | 
				
			||||||
 | 
					        "osc": "osc",
 | 
				
			||||||
        "ren": "ren",
 | 
					        "ren": "ren",
 | 
				
			||||||
        "rep": "rep",
 | 
					        "rep": "rep",
 | 
				
			||||||
        "stu": "stu",
 | 
					        "snipe-nvim-src": "snipe-nvim-src",
 | 
				
			||||||
        "telescope-nvim-src": "telescope-nvim-src",
 | 
					        "telescope-nvim-src": "telescope-nvim-src",
 | 
				
			||||||
        "telescope-project-nvim-src": "telescope-project-nvim-src",
 | 
					        "telescope-project-nvim-src": "telescope-project-nvim-src",
 | 
				
			||||||
 | 
					        "tiny-inline-diagnostic-nvim-src": "tiny-inline-diagnostic-nvim-src",
 | 
				
			||||||
        "toggleterm-nvim-src": "toggleterm-nvim-src",
 | 
					        "toggleterm-nvim-src": "toggleterm-nvim-src",
 | 
				
			||||||
        "tree-sitter-bash": "tree-sitter-bash",
 | 
					        "tree-sitter-bash": "tree-sitter-bash",
 | 
				
			||||||
        "tree-sitter-ini": "tree-sitter-ini",
 | 
					        "tree-sitter-ini": "tree-sitter-ini",
 | 
				
			||||||
@@ -619,19 +724,40 @@
 | 
				
			|||||||
        "zenyd-mpv-scripts": "zenyd-mpv-scripts"
 | 
					        "zenyd-mpv-scripts": "zenyd-mpv-scripts"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "stu": {
 | 
					    "rust-overlay": {
 | 
				
			||||||
      "flake": false,
 | 
					      "inputs": {
 | 
				
			||||||
 | 
					        "nixpkgs": [
 | 
				
			||||||
 | 
					          "jujutsu",
 | 
				
			||||||
 | 
					          "nixpkgs"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1720424134,
 | 
					        "lastModified": 1737685583,
 | 
				
			||||||
        "narHash": "sha256-c6nLQOhwztwnUfKLx69Le9pCHE0GtruqKMnvYpGyr+0=",
 | 
					        "narHash": "sha256-p+NVABRpGi+pT+xxf9HcLcFVxG6L+vEEy+NwzB9T0f8=",
 | 
				
			||||||
        "owner": "lusingander",
 | 
					        "owner": "oxalica",
 | 
				
			||||||
        "repo": "stu",
 | 
					        "repo": "rust-overlay",
 | 
				
			||||||
        "rev": "279edc8d63c04b42773434bf8c6f2744a66d71a8",
 | 
					        "rev": "eb64cbcc8eee0fa87ebded92805280d2ec97415a",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "owner": "lusingander",
 | 
					        "owner": "oxalica",
 | 
				
			||||||
        "repo": "stu",
 | 
					        "repo": "rust-overlay",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "snipe-nvim-src": {
 | 
				
			||||||
 | 
					      "flake": false,
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1736108869,
 | 
				
			||||||
 | 
					        "narHash": "sha256-sJ71eiE0XmMJkhNCkbY82R4eHzBOOKFrPa+nxLc1f8s=",
 | 
				
			||||||
 | 
					        "owner": "leath-dub",
 | 
				
			||||||
 | 
					        "repo": "snipe.nvim",
 | 
				
			||||||
 | 
					        "rev": "0d0a482ac713370196e4fc0025d5aaac5030104d",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "leath-dub",
 | 
				
			||||||
 | 
					        "repo": "snipe.nvim",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -652,16 +778,16 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    "systems_2": {
 | 
					    "systems_2": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1681028828,
 | 
					        "lastModified": 1689347925,
 | 
				
			||||||
        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
 | 
					        "narHash": "sha256-ozenz5bFe1UUqOn7f60HRmgc01BgTGIKZ4Xl+HbocGQ=",
 | 
				
			||||||
        "owner": "nix-systems",
 | 
					        "owner": "nix-systems",
 | 
				
			||||||
        "repo": "default",
 | 
					        "repo": "default-darwin",
 | 
				
			||||||
        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
 | 
					        "rev": "2235d7e6cc29ae99878133c95e9fe5e157661ffb",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "owner": "nix-systems",
 | 
					        "owner": "nix-systems",
 | 
				
			||||||
        "repo": "default",
 | 
					        "repo": "default-darwin",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -700,11 +826,11 @@
 | 
				
			|||||||
    "telescope-project-nvim-src": {
 | 
					    "telescope-project-nvim-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1701464478,
 | 
					        "lastModified": 1733083023,
 | 
				
			||||||
        "narHash": "sha256-touMCltcnqkrQYV1NtNeWLQeFVGt+WM3aIWIdKilA7w=",
 | 
					        "narHash": "sha256-qEORRWYKBpK7fn7se8g+5uuVBJNu0T4JHSc0C2QzNDY=",
 | 
				
			||||||
        "owner": "nvim-telescope",
 | 
					        "owner": "nvim-telescope",
 | 
				
			||||||
        "repo": "telescope-project.nvim",
 | 
					        "repo": "telescope-project.nvim",
 | 
				
			||||||
        "rev": "1aaf16580a614601a7f7077d9639aeb457dc5559",
 | 
					        "rev": "1d7920e799fc5001dffc7bd10909a86e0358eaf4",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -713,19 +839,35 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "tiny-inline-diagnostic-nvim-src": {
 | 
				
			||||||
 | 
					      "flake": false,
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1737657256,
 | 
				
			||||||
 | 
					        "narHash": "sha256-4RNZjzVrc6lSXCAEHwtdbWJvNCRjglq97ZL9DRM3IiI=",
 | 
				
			||||||
 | 
					        "owner": "rachartier",
 | 
				
			||||||
 | 
					        "repo": "tiny-inline-diagnostic.nvim",
 | 
				
			||||||
 | 
					        "rev": "5c00aec99f558b8f0a2c4445038f74e5f5435c00",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "rachartier",
 | 
				
			||||||
 | 
					        "repo": "tiny-inline-diagnostic.nvim",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "toggleterm-nvim-src": {
 | 
					    "toggleterm-nvim-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1713792255,
 | 
					        "lastModified": 1721232722,
 | 
				
			||||||
        "narHash": "sha256-mM5bGgAemsRJD9U6U5K6ia5qb8NaTusM99x6xrtEBfw=",
 | 
					        "narHash": "sha256-hJ6nBCgSyYF1pY4lX+b8WZd49i5F6BwOmrl7xVSIwRw=",
 | 
				
			||||||
        "owner": "akinsho",
 | 
					        "owner": "akinsho",
 | 
				
			||||||
        "repo": "toggleterm.nvim",
 | 
					        "repo": "toggleterm.nvim",
 | 
				
			||||||
        "rev": "066cccf48a43553a80a210eb3be89a15d789d6e6",
 | 
					        "rev": "48be57eaba817f038d61bbf64d2c597f578c0827",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "owner": "akinsho",
 | 
					        "owner": "akinsho",
 | 
				
			||||||
        "ref": "v2.11.0",
 | 
					        "ref": "v2.12.0",
 | 
				
			||||||
        "repo": "toggleterm.nvim",
 | 
					        "repo": "toggleterm.nvim",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -733,11 +875,11 @@
 | 
				
			|||||||
    "tree-sitter-bash": {
 | 
					    "tree-sitter-bash": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1715005250,
 | 
					        "lastModified": 1737678721,
 | 
				
			||||||
        "narHash": "sha256-rCuQbnQAOnQWKYreNH80nlL+0A1qbWbjMvtczcoWPrY=",
 | 
					        "narHash": "sha256-aTM0DjmCX2HaeDfZPCoqWULLVoa+nBppiR97jMWWItM=",
 | 
				
			||||||
        "owner": "tree-sitter",
 | 
					        "owner": "tree-sitter",
 | 
				
			||||||
        "repo": "tree-sitter-bash",
 | 
					        "repo": "tree-sitter-bash",
 | 
				
			||||||
        "rev": "2fbd860f802802ca76a6661ce025b3a3bca2d3ed",
 | 
					        "rev": "03f4927065b3c0d71a962be87130aa7e79b35448",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -750,11 +892,11 @@
 | 
				
			|||||||
    "tree-sitter-ini": {
 | 
					    "tree-sitter-ini": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1716889525,
 | 
					        "lastModified": 1725233451,
 | 
				
			||||||
        "narHash": "sha256-IyHrIxcmuzs60zUiJv4E3nSkhSkgbcaLDUdeDx5mlHk=",
 | 
					        "narHash": "sha256-G11Aynq2rnkRwdkhspjYqtBD/h5k4aD+NvuE0QfploU=",
 | 
				
			||||||
        "owner": "justinmk",
 | 
					        "owner": "justinmk",
 | 
				
			||||||
        "repo": "tree-sitter-ini",
 | 
					        "repo": "tree-sitter-ini",
 | 
				
			||||||
        "rev": "87176e524f0a98f5be75fa44f4f0ff5c6eac069c",
 | 
					        "rev": "962568c9efa71d25720ab42c5d36e222626ef3a6",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -766,11 +908,11 @@
 | 
				
			|||||||
    "tree-sitter-lua": {
 | 
					    "tree-sitter-lua": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1710150044,
 | 
					        "lastModified": 1729494737,
 | 
				
			||||||
        "narHash": "sha256-uFaEptW4wPrqgHfB1mYmVltf+4no61L2cPgpsr5qBIU=",
 | 
					        "narHash": "sha256-v+fFcIOv+bu+2IGI/Lh/Xbqd5BzbBjaa51ECd0hG7Ow=",
 | 
				
			||||||
        "owner": "MunifTanjim",
 | 
					        "owner": "MunifTanjim",
 | 
				
			||||||
        "repo": "tree-sitter-lua",
 | 
					        "repo": "tree-sitter-lua",
 | 
				
			||||||
        "rev": "a24dab177e58c9c6832f96b9a73102a0cfbced4a",
 | 
					        "rev": "34e60e7f45fc313463c68090d88d742a55d1bd7a",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -783,11 +925,11 @@
 | 
				
			|||||||
    "tree-sitter-puppet": {
 | 
					    "tree-sitter-puppet": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1713617121,
 | 
					        "lastModified": 1734835631,
 | 
				
			||||||
        "narHash": "sha256-+zMgzyuGerJ8l+i5ZtWnmGr3i4fFiSLD5FssyKESsmI=",
 | 
					        "narHash": "sha256-bO5g5AdhzpB13yHklpAndUHIX7Rvd7OMjH0Ds2ATA6Q=",
 | 
				
			||||||
        "owner": "amaanq",
 | 
					        "owner": "amaanq",
 | 
				
			||||||
        "repo": "tree-sitter-puppet",
 | 
					        "repo": "tree-sitter-puppet",
 | 
				
			||||||
        "rev": "584522f32495d648b18a53ccb52d988e60de127d",
 | 
					        "rev": "15f192929b7d317f5914de2b4accd37b349182a6",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -799,11 +941,11 @@
 | 
				
			|||||||
    "tree-sitter-python": {
 | 
					    "tree-sitter-python": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1714528221,
 | 
					        "lastModified": 1737668819,
 | 
				
			||||||
        "narHash": "sha256-hHQ5gK4dTRSdp0fLKarytU9vFhsBeQp7Ka61vFoIr7Y=",
 | 
					        "narHash": "sha256-g06oE9w2AMCM6BwTQmB+acY1wcQXjIgj62N+z+nrpaY=",
 | 
				
			||||||
        "owner": "tree-sitter",
 | 
					        "owner": "tree-sitter",
 | 
				
			||||||
        "repo": "tree-sitter-python",
 | 
					        "repo": "tree-sitter-python",
 | 
				
			||||||
        "rev": "71778c2a472ed00a64abf4219544edbf8e4b86d7",
 | 
					        "rev": "ab2ba8be034368fa009f62f371c068b8728f9db7",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -832,11 +974,11 @@
 | 
				
			|||||||
    "tree-sitter-vimdoc": {
 | 
					    "tree-sitter-vimdoc": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1717834376,
 | 
					        "lastModified": 1729686839,
 | 
				
			||||||
        "narHash": "sha256-v+XSWGm2Wdn9/rxNFMqXYACkGn6AvxZdxkClLuKnWGU=",
 | 
					        "narHash": "sha256-Vrl4/cZL+TWlUMEeWZoHCAWhvlefcl3ajGcwyTNKOhI=",
 | 
				
			||||||
        "owner": "neovim",
 | 
					        "owner": "neovim",
 | 
				
			||||||
        "repo": "tree-sitter-vimdoc",
 | 
					        "repo": "tree-sitter-vimdoc",
 | 
				
			||||||
        "rev": "2249c44ecd3f5cf22da3dcccfb74f816ddb29245",
 | 
					        "rev": "d2e4b5c172a109966c2ce0378f73df6cede39400",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -845,6 +987,27 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "treefmt-nix": {
 | 
				
			||||||
 | 
					      "inputs": {
 | 
				
			||||||
 | 
					        "nixpkgs": [
 | 
				
			||||||
 | 
					          "nur",
 | 
				
			||||||
 | 
					          "nixpkgs"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1733222881,
 | 
				
			||||||
 | 
					        "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=",
 | 
				
			||||||
 | 
					        "owner": "numtide",
 | 
				
			||||||
 | 
					        "repo": "treefmt-nix",
 | 
				
			||||||
 | 
					        "rev": "49717b5af6f80172275d47a418c9719a31a78b53",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "numtide",
 | 
				
			||||||
 | 
					        "repo": "treefmt-nix",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "wallpapers": {
 | 
					    "wallpapers": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
@@ -864,17 +1027,16 @@
 | 
				
			|||||||
    "wsl": {
 | 
					    "wsl": {
 | 
				
			||||||
      "inputs": {
 | 
					      "inputs": {
 | 
				
			||||||
        "flake-compat": "flake-compat_2",
 | 
					        "flake-compat": "flake-compat_2",
 | 
				
			||||||
        "flake-utils": "flake-utils_3",
 | 
					 | 
				
			||||||
        "nixpkgs": [
 | 
					        "nixpkgs": [
 | 
				
			||||||
          "nixpkgs"
 | 
					          "nixpkgs"
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719220171,
 | 
					        "lastModified": 1736095716,
 | 
				
			||||||
        "narHash": "sha256-xywM6JoGT8AwfoOFJBTv8GRlvNu8LYqqqMS/OQ6uCgE=",
 | 
					        "narHash": "sha256-csysw/Szu98QDiA2lhWk9seYOyCebeVEWL89zh1cduM=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "NixOS-WSL",
 | 
					        "repo": "NixOS-WSL",
 | 
				
			||||||
        "rev": "269411cfed6aab694e46f719277c972de96177bb",
 | 
					        "rev": "63c3b4ed1712a3a0621002cd59bfdc80875ecbb0",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										61
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								flake.nix
									
									
									
									
									
								
							@@ -7,6 +7,9 @@
 | 
				
			|||||||
    # Used for system packages
 | 
					    # Used for system packages
 | 
				
			||||||
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
 | 
					    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Used for specific stable packages
 | 
				
			||||||
 | 
					    nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.05";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Used for caddy plugins
 | 
					    # Used for caddy plugins
 | 
				
			||||||
    nixpkgs-caddy.url = "github:jpds/nixpkgs/caddy-external-plugins";
 | 
					    nixpkgs-caddy.url = "github:jpds/nixpkgs/caddy-external-plugins";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -88,7 +91,7 @@
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    nvim-treesitter-src = {
 | 
					    nvim-treesitter-src = {
 | 
				
			||||||
      # https://github.com/nvim-treesitter/nvim-treesitter/tags
 | 
					      # https://github.com/nvim-treesitter/nvim-treesitter/tags
 | 
				
			||||||
      url = "github:nvim-treesitter/nvim-treesitter/master";
 | 
					      url = "github:nvim-treesitter/nvim-treesitter/v0.9.2";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    telescope-nvim-src = {
 | 
					    telescope-nvim-src = {
 | 
				
			||||||
@@ -102,7 +105,7 @@
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    toggleterm-nvim-src = {
 | 
					    toggleterm-nvim-src = {
 | 
				
			||||||
      # https://github.com/akinsho/toggleterm.nvim/tags
 | 
					      # https://github.com/akinsho/toggleterm.nvim/tags
 | 
				
			||||||
      url = "github:akinsho/toggleterm.nvim/v2.11.0";
 | 
					      url = "github:akinsho/toggleterm.nvim/v2.12.0";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    bufferline-nvim-src = {
 | 
					    bufferline-nvim-src = {
 | 
				
			||||||
@@ -127,8 +130,12 @@
 | 
				
			|||||||
      url = "github:mfussenegger/nvim-lint";
 | 
					      url = "github:mfussenegger/nvim-lint";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    markview-nvim-src = {
 | 
					    tiny-inline-diagnostic-nvim-src = {
 | 
				
			||||||
      url = "github:OXY2DEV/markview.nvim";
 | 
					      url = "github:rachartier/tiny-inline-diagnostic.nvim";
 | 
				
			||||||
 | 
					      flake = false;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    snipe-nvim-src = {
 | 
				
			||||||
 | 
					      url = "github:leath-dub/snipe.nvim";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -168,6 +175,13 @@
 | 
				
			|||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Git alternative
 | 
				
			||||||
 | 
					    # Fixes: https://github.com/martinvonz/jj/issues/4784
 | 
				
			||||||
 | 
					    jujutsu = {
 | 
				
			||||||
 | 
					      url = "github:martinvonz/jj";
 | 
				
			||||||
 | 
					      inputs.nixpkgs.follows = "nixpkgs";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Ren and rep - CLI find and replace
 | 
					    # Ren and rep - CLI find and replace
 | 
				
			||||||
    rep = {
 | 
					    rep = {
 | 
				
			||||||
      url = "github:robenkleene/rep-grep";
 | 
					      url = "github:robenkleene/rep-grep";
 | 
				
			||||||
@@ -178,32 +192,37 @@
 | 
				
			|||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Stu - TUI for S3
 | 
					    gh-collaborators = {
 | 
				
			||||||
    stu = {
 | 
					      url = "github:katiem0/gh-collaborators";
 | 
				
			||||||
      url = "github:lusingander/stu";
 | 
					      flake = false;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Clipboard over SSH
 | 
				
			||||||
 | 
					    osc = {
 | 
				
			||||||
 | 
					      url = "github:theimpostor/osc/v0.4.6";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Nextcloud Apps
 | 
					    # Nextcloud Apps
 | 
				
			||||||
    nextcloud-news = {
 | 
					    nextcloud-news = {
 | 
				
			||||||
      # https://github.com/nextcloud/news/releases
 | 
					      # https://github.com/nextcloud/news/releases
 | 
				
			||||||
      url = "https://github.com/nextcloud/news/releases/download/25.0.0-alpha7/news.tar.gz";
 | 
					      url = "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    nextcloud-external = {
 | 
					    nextcloud-external = {
 | 
				
			||||||
      # https://github.com/nextcloud-releases/external/releases
 | 
					      # https://github.com/nextcloud-releases/external/releases
 | 
				
			||||||
      url = "https://github.com/nextcloud-releases/external/releases/download/v5.4.0/external-v5.4.0.tar.gz";
 | 
					      url = "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    nextcloud-cookbook = {
 | 
					    nextcloud-cookbook = {
 | 
				
			||||||
      # https://github.com/christianlupus-nextcloud/cookbook-releases/releases/
 | 
					      # https://github.com/christianlupus-nextcloud/cookbook-releases/releases/
 | 
				
			||||||
      url = "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.1/cookbook-0.11.1.tar.gz";
 | 
					      url = "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    nextcloud-snappymail = {
 | 
					    nextcloud-snappymail = {
 | 
				
			||||||
      # https://github.com/the-djmaze/snappymail/releases
 | 
					      # https://github.com/the-djmaze/snappymail/releases
 | 
				
			||||||
      # https://snappymail.eu/repository/nextcloud
 | 
					      # https://snappymail.eu/repository/nextcloud
 | 
				
			||||||
      url = "https://snappymail.eu/repository/nextcloud/snappymail-2.36.4-nextcloud.tar.gz";
 | 
					      url = "https://snappymail.eu/repository/nextcloud/snappymail-2.38.2-nextcloud.tar.gz";
 | 
				
			||||||
      # url = "https://github.com/nmasur/snappymail-nextcloud/releases/download/v2.36.3/snappymail-2.36.3-nextcloud.tar.gz";
 | 
					      # url = "https://github.com/nmasur/snappymail-nextcloud/releases/download/v2.36.3/snappymail-2.36.3-nextcloud.tar.gz";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -229,37 +248,43 @@
 | 
				
			|||||||
          mail.smtpHost = "smtp.purelymail.com";
 | 
					          mail.smtpHost = "smtp.purelymail.com";
 | 
				
			||||||
          dotfilesRepo = "https://github.com/nmasur/dotfiles";
 | 
					          dotfilesRepo = "https://github.com/nmasur/dotfiles";
 | 
				
			||||||
          hostnames = {
 | 
					          hostnames = {
 | 
				
			||||||
 | 
					            audiobooks = "read.${baseName}";
 | 
				
			||||||
 | 
					            budget = "money.${baseName}";
 | 
				
			||||||
 | 
					            files = "files.${baseName}";
 | 
				
			||||||
            git = "git.${baseName}";
 | 
					            git = "git.${baseName}";
 | 
				
			||||||
            influxdb = "influxdb.${baseName}";
 | 
					            influxdb = "influxdb.${baseName}";
 | 
				
			||||||
            irc = "irc.${baseName}";
 | 
					            irc = "irc.${baseName}";
 | 
				
			||||||
            metrics = "metrics.${baseName}";
 | 
					            metrics = "metrics.${baseName}";
 | 
				
			||||||
            minecraft = "minecraft.${baseName}";
 | 
					            minecraft = "minecraft.${baseName}";
 | 
				
			||||||
            n8n = "n8n2.${baseName}";
 | 
					            n8n = "n8n.${baseName}";
 | 
				
			||||||
 | 
					            notifications = "ntfy.${baseName}";
 | 
				
			||||||
            prometheus = "prom.${baseName}";
 | 
					            prometheus = "prom.${baseName}";
 | 
				
			||||||
            paperless = "paper.${baseName}";
 | 
					            paperless = "paper.${baseName}";
 | 
				
			||||||
 | 
					            photos = "photos.${baseName}";
 | 
				
			||||||
            secrets = "vault.${baseName}";
 | 
					            secrets = "vault.${baseName}";
 | 
				
			||||||
            stream = "stream.${baseName}";
 | 
					            stream = "stream.${baseName}";
 | 
				
			||||||
            content = "cloud.${baseName}";
 | 
					            content = "cloud.${baseName}";
 | 
				
			||||||
            books = "books.${baseName}";
 | 
					            books = "books.${baseName}";
 | 
				
			||||||
            download = "download.${baseName}";
 | 
					            download = "download.${baseName}";
 | 
				
			||||||
 | 
					            status = "status.${baseName}";
 | 
				
			||||||
            transmission = "transmission.${baseName}";
 | 
					            transmission = "transmission.${baseName}";
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Common overlays to always use
 | 
					      # Common overlays to always use
 | 
				
			||||||
      overlays = [
 | 
					      overlays = [
 | 
				
			||||||
        inputs.nur.overlay
 | 
					        inputs.nur.overlays.default
 | 
				
			||||||
        inputs.nix2vim.overlay
 | 
					        inputs.nix2vim.overlay
 | 
				
			||||||
 | 
					        inputs.jujutsu.overlays.default # Fix: https://github.com/martinvonz/jj/issues/4784
 | 
				
			||||||
        (import ./overlays/neovim-plugins.nix inputs)
 | 
					        (import ./overlays/neovim-plugins.nix inputs)
 | 
				
			||||||
        (import ./overlays/calibre-web.nix)
 | 
					 | 
				
			||||||
        (import ./overlays/disko.nix inputs)
 | 
					 | 
				
			||||||
        (import ./overlays/tree-sitter.nix inputs)
 | 
					        (import ./overlays/tree-sitter.nix inputs)
 | 
				
			||||||
        (import ./overlays/mpv-scripts.nix inputs)
 | 
					        (import ./overlays/mpv-scripts.nix inputs)
 | 
				
			||||||
        (import ./overlays/nextcloud-apps.nix inputs)
 | 
					        (import ./overlays/nextcloud-apps.nix inputs)
 | 
				
			||||||
        (import ./overlays/betterlockscreen.nix)
 | 
					        (import ./overlays/betterlockscreen.nix)
 | 
				
			||||||
        (import ./overlays/gh-collaborators.nix)
 | 
					        (import ./overlays/gh-collaborators.nix inputs)
 | 
				
			||||||
 | 
					        (import ./overlays/osc.nix inputs)
 | 
				
			||||||
        (import ./overlays/ren-rep.nix inputs)
 | 
					        (import ./overlays/ren-rep.nix inputs)
 | 
				
			||||||
        (import ./overlays/stu.nix inputs)
 | 
					        (import ./overlays/volnoti.nix)
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # System types to support.
 | 
					      # System types to support.
 | 
				
			||||||
@@ -331,6 +356,7 @@
 | 
				
			|||||||
            system = "x86_64-linux";
 | 
					            system = "x86_64-linux";
 | 
				
			||||||
            format = "iso";
 | 
					            format = "iso";
 | 
				
			||||||
            specialArgs = {
 | 
					            specialArgs = {
 | 
				
			||||||
 | 
					              pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
					              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; };
 | 
					            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; };
 | 
				
			||||||
@@ -339,6 +365,7 @@
 | 
				
			|||||||
            system = "x86_64-linux";
 | 
					            system = "x86_64-linux";
 | 
				
			||||||
            format = "amazon";
 | 
					            format = "amazon";
 | 
				
			||||||
            specialArgs = {
 | 
					            specialArgs = {
 | 
				
			||||||
 | 
					              pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
					              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; } ++ [
 | 
					            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; } ++ [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@
 | 
				
			|||||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
					inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			||||||
  system = "aarch64-linux";
 | 
					  system = "aarch64-linux";
 | 
				
			||||||
  specialArgs = {
 | 
					  specialArgs = {
 | 
				
			||||||
 | 
					    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
					    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  modules = [
 | 
					  modules = [
 | 
				
			||||||
@@ -61,7 +62,7 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      # Still require colors for programs like Neovim, K9S
 | 
					      # Still require colors for programs like Neovim, K9S
 | 
				
			||||||
      theme = {
 | 
					      theme = {
 | 
				
			||||||
        colors = (import ../../colorscheme/gruvbox).dark;
 | 
					        colors = (import ../../colorscheme/gruvbox-dark).dark;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Programs and services
 | 
					      # Programs and services
 | 
				
			||||||
@@ -70,6 +71,7 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
      dotfiles.enable = true; # Clone dotfiles
 | 
					      dotfiles.enable = true; # Clone dotfiles
 | 
				
			||||||
      neovim.enable = true;
 | 
					      neovim.enable = true;
 | 
				
			||||||
      giteaRunner.enable = true;
 | 
					      giteaRunner.enable = true;
 | 
				
			||||||
 | 
					      services.actualbudget.enable = true;
 | 
				
			||||||
      services.caddy.enable = true;
 | 
					      services.caddy.enable = true;
 | 
				
			||||||
      services.grafana.enable = true;
 | 
					      services.grafana.enable = true;
 | 
				
			||||||
      services.thelounge.enable = true;
 | 
					      services.thelounge.enable = true;
 | 
				
			||||||
@@ -79,6 +81,10 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
      services.gitea.enable = true;
 | 
					      services.gitea.enable = true;
 | 
				
			||||||
      services.vaultwarden.enable = true;
 | 
					      services.vaultwarden.enable = true;
 | 
				
			||||||
      services.minecraft-server.enable = true; # Setup Minecraft server
 | 
					      services.minecraft-server.enable = true; # Setup Minecraft server
 | 
				
			||||||
 | 
					      services.n8n.enable = true;
 | 
				
			||||||
 | 
					      services.ntfy-sh.enable = true;
 | 
				
			||||||
 | 
					      services.postgresql.enable = true;
 | 
				
			||||||
 | 
					      services.uptime-kuma.enable = true;
 | 
				
			||||||
      system.autoUpgrade.enable = true;
 | 
					      system.autoUpgrade.enable = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Allows private remote access over the internet
 | 
					      # Allows private remote access over the internet
 | 
				
			||||||
@@ -94,6 +100,7 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
        endpoint = "s3.us-west-002.backblazeb2.com";
 | 
					        endpoint = "s3.us-west-002.backblazeb2.com";
 | 
				
			||||||
        bucket = "noahmasur-backup";
 | 
					        bucket = "noahmasur-backup";
 | 
				
			||||||
        accessKeyId = "0026b0e73b2e2c80000000005";
 | 
					        accessKeyId = "0026b0e73b2e2c80000000005";
 | 
				
			||||||
 | 
					        resticBucket = "noahmasur-restic";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Disable passwords, only use SSH key
 | 
					      # Disable passwords, only use SSH key
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,8 @@ inputs.darwin.lib.darwinSystem {
 | 
				
			|||||||
    inputs.mac-app-util.darwinModules.default
 | 
					    inputs.mac-app-util.darwinModules.default
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      nixpkgs.overlays = [ inputs.firefox-darwin.overlay ] ++ overlays;
 | 
					      nixpkgs.overlays = [ inputs.firefox-darwin.overlay ] ++ overlays;
 | 
				
			||||||
      networking.hostName = "lookingglass";
 | 
					      networking.hostName = "NYCM-NMASUR2";
 | 
				
			||||||
 | 
					      networking.computerName = "NYCM-NMASUR2";
 | 
				
			||||||
      identityFile = "/Users/Noah.Masur/.ssh/id_ed25519";
 | 
					      identityFile = "/Users/Noah.Masur/.ssh/id_ed25519";
 | 
				
			||||||
      gui.enable = true;
 | 
					      gui.enable = true;
 | 
				
			||||||
      theme = {
 | 
					      theme = {
 | 
				
			||||||
@@ -53,6 +54,7 @@ inputs.darwin.lib.darwinSystem {
 | 
				
			|||||||
      _1password.enable = true;
 | 
					      _1password.enable = true;
 | 
				
			||||||
      slack.enable = true;
 | 
					      slack.enable = true;
 | 
				
			||||||
      wezterm.enable = true;
 | 
					      wezterm.enable = true;
 | 
				
			||||||
 | 
					      yt-dlp.enable = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@
 | 
				
			|||||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
					inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			||||||
  system = "x86_64-linux";
 | 
					  system = "x86_64-linux";
 | 
				
			||||||
  specialArgs = {
 | 
					  specialArgs = {
 | 
				
			||||||
 | 
					    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
					    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  modules = [
 | 
					  modules = [
 | 
				
			||||||
@@ -66,6 +67,14 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
        devices = (import ../../disks/root.nix { disk = "/dev/nvme0n1"; });
 | 
					        devices = (import ../../disks/root.nix { disk = "/dev/nvme0n1"; });
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      zramSwap.enable = true;
 | 
				
			||||||
 | 
					      swapDevices = [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          device = "/swapfile";
 | 
				
			||||||
 | 
					          size = 4 * 1024; # 4 GB
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      boot.zfs = {
 | 
					      boot.zfs = {
 | 
				
			||||||
        # Automatically load the ZFS pool on boot
 | 
					        # Automatically load the ZFS pool on boot
 | 
				
			||||||
        extraPools = [ "tank" ];
 | 
					        extraPools = [ "tank" ];
 | 
				
			||||||
@@ -96,8 +105,11 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
      cloudflare.enable = true;
 | 
					      cloudflare.enable = true;
 | 
				
			||||||
      dotfiles.enable = true;
 | 
					      dotfiles.enable = true;
 | 
				
			||||||
      arrs.enable = true;
 | 
					      arrs.enable = true;
 | 
				
			||||||
 | 
					      filebrowser.enable = true;
 | 
				
			||||||
 | 
					      services.audiobookshelf.enable = true;
 | 
				
			||||||
      services.bind.enable = true;
 | 
					      services.bind.enable = true;
 | 
				
			||||||
      services.caddy.enable = true;
 | 
					      services.caddy.enable = true;
 | 
				
			||||||
 | 
					      services.immich.enable = true;
 | 
				
			||||||
      services.jellyfin.enable = true;
 | 
					      services.jellyfin.enable = true;
 | 
				
			||||||
      services.nextcloud.enable = true;
 | 
					      services.nextcloud.enable = true;
 | 
				
			||||||
      services.calibre-web.enable = true;
 | 
					      services.calibre-web.enable = true;
 | 
				
			||||||
@@ -122,6 +134,7 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
        endpoint = "s3.us-west-002.backblazeb2.com";
 | 
					        endpoint = "s3.us-west-002.backblazeb2.com";
 | 
				
			||||||
        bucket = "noahmasur-backup";
 | 
					        bucket = "noahmasur-backup";
 | 
				
			||||||
        accessKeyId = "0026b0e73b2e2c80000000005";
 | 
					        accessKeyId = "0026b0e73b2e2c80000000005";
 | 
				
			||||||
 | 
					        resticBucket = "noahmasur-restic";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Disable passwords, only use SSH key
 | 
					      # Disable passwords, only use SSH key
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,8 +8,12 @@
 | 
				
			|||||||
  ...
 | 
					  ...
 | 
				
			||||||
}:
 | 
					}:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inputs.nixpkgs.lib.nixosSystem {
 | 
					inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			||||||
  system = "x86_64-linux";
 | 
					  system = "x86_64-linux";
 | 
				
			||||||
 | 
					  specialArgs = {
 | 
				
			||||||
 | 
					    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
 | 
					    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
  modules = [
 | 
					  modules = [
 | 
				
			||||||
    globals
 | 
					    globals
 | 
				
			||||||
    inputs.home-manager.nixosModules.home-manager
 | 
					    inputs.home-manager.nixosModules.home-manager
 | 
				
			||||||
@@ -37,6 +41,12 @@ inputs.nixpkgs.lib.nixosSystem {
 | 
				
			|||||||
      boot.kernelModules = [ "kvm-amd" ];
 | 
					      boot.kernelModules = [ "kvm-amd" ];
 | 
				
			||||||
      services.xserver.videoDrivers = [ "amdgpu" ];
 | 
					      services.xserver.videoDrivers = [ "amdgpu" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # I don't think I need this?
 | 
				
			||||||
 | 
					      # boot.kernelParams = [
 | 
				
			||||||
 | 
					      #   "video=DP-0:2560x1440@165"
 | 
				
			||||||
 | 
					      #   "video=DP-1:1920x1080@60"
 | 
				
			||||||
 | 
					      # ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Required binary blobs to boot on this machine
 | 
					      # Required binary blobs to boot on this machine
 | 
				
			||||||
      hardware.enableRedistributableFirmware = true;
 | 
					      hardware.enableRedistributableFirmware = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -118,6 +128,7 @@ inputs.nixpkgs.lib.nixosSystem {
 | 
				
			|||||||
        dwarf-fortress.enable = true;
 | 
					        dwarf-fortress.enable = true;
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
        steam.enable = true;
 | 
					        steam.enable = true;
 | 
				
			||||||
 | 
					        moonlight.enable = true;
 | 
				
			||||||
        legendary.enable = true;
 | 
					        legendary.enable = true;
 | 
				
			||||||
        lutris.enable = true;
 | 
					        lutris.enable = true;
 | 
				
			||||||
        ryujinx.enable = true;
 | 
					        ryujinx.enable = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,10 +22,9 @@
 | 
				
			|||||||
      "1password-cli"
 | 
					      "1password-cli"
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    home-manager.users.${config.user} = {
 | 
					    home-manager.users.${config.user} = {
 | 
				
			||||||
      home.packages = with pkgs; [
 | 
					      home.packages = [
 | 
				
			||||||
        _1password-gui
 | 
					        pkgs._1password-cli
 | 
				
			||||||
        _1password
 | 
					      ] ++ (if pkgs.stdenv.isLinux then [ pkgs._1password-gui ] else [ ]);
 | 
				
			||||||
      ];
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # https://1password.community/discussion/135462/firefox-extension-does-not-connect-to-linux-app
 | 
					    # https://1password.community/discussion/135462/firefox-extension-does-not-connect-to-linux-app
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,6 +71,8 @@
 | 
				
			|||||||
            "cookiebanners.ui.desktop.enabled" = true; # Reject cookie popups
 | 
					            "cookiebanners.ui.desktop.enabled" = true; # Reject cookie popups
 | 
				
			||||||
            "devtools.command-button-screenshot.enabled" = true; # Scrolling screenshot of entire page
 | 
					            "devtools.command-button-screenshot.enabled" = true; # Scrolling screenshot of entire page
 | 
				
			||||||
            "svg.context-properties.content.enabled" = true; # Sidebery styling
 | 
					            "svg.context-properties.content.enabled" = true; # Sidebery styling
 | 
				
			||||||
 | 
					            "browser.tabs.hoverPreview.enabled" = false; # Disable tab previews
 | 
				
			||||||
 | 
					            "browser.tabs.hoverPreview.showThumbnails" = false; # Disable tab previews
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
          userChrome = ''
 | 
					          userChrome = ''
 | 
				
			||||||
            :root {
 | 
					            :root {
 | 
				
			||||||
@@ -157,6 +159,15 @@
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Mimic nixpkgs package environment for read-only profiles.ini management
 | 
				
			||||||
 | 
					      # From: https://github.com/booxter/home-manager/commit/dd1602e306fec366280f5953c5e1b553e3d9672a
 | 
				
			||||||
 | 
					      home.sessionVariables = {
 | 
				
			||||||
 | 
					        MOZ_LEGACY_PROFILES = 1;
 | 
				
			||||||
 | 
					        MOZ_ALLOW_DOWNGRADE = 1;
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # launchd.user.envVariables = config.home-manager.users.${config.user}.home.sessionVariables;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      xdg.mimeApps = {
 | 
					      xdg.mimeApps = {
 | 
				
			||||||
        associations.added = {
 | 
					        associations.added = {
 | 
				
			||||||
          "text/html" = [ "firefox.desktop" ];
 | 
					          "text/html" = [ "firefox.desktop" ];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Broken on 2023-12-11
 | 
					    # Broken on 2023-12-11
 | 
				
			||||||
    # https://forum.obsidian.md/t/electron-25-is-now-eol-please-upgrade-to-a-newer-version/72878/8
 | 
					    # https://forum.obsidian.md/t/electron-25-is-now-eol-please-upgrade-to-a-newer-version/72878/8
 | 
				
			||||||
    nixpkgs.config.permittedInsecurePackages = [ "electron-25.9.0" ];
 | 
					    insecurePackages = [ "electron-25.9.0" ];
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,4 +21,6 @@
 | 
				
			|||||||
      home.packages = with pkgs; [ slack ];
 | 
					      home.packages = with pkgs; [ slack ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Theme string: #1D2122,#665C54,#8EC07C,#BDAE93
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,14 +29,14 @@
 | 
				
			|||||||
          sessionVariables.ROFI_SYSTEMD_TERM = "${pkgs.wezterm}/bin/wezterm";
 | 
					          sessionVariables.ROFI_SYSTEMD_TERM = "${pkgs.wezterm}/bin/wezterm";
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      terminal = "${pkgs.wezterm}/bin/wezterm";
 | 
				
			||||||
 | 
					      terminalLaunchCommand = "${config.terminal} start --";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      home-manager.users.${config.user} = {
 | 
					      home-manager.users.${config.user} = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Set the i3 terminal
 | 
					        # Set the i3 terminal
 | 
				
			||||||
        xsession.windowManager.i3.config.terminal = lib.mkIf pkgs.stdenv.isLinux "wezterm";
 | 
					        xsession.windowManager.i3.config.terminal = lib.mkIf pkgs.stdenv.isLinux "wezterm";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Set the Rofi terminal for running programs
 | 
					 | 
				
			||||||
        programs.rofi.terminal = lib.mkIf pkgs.stdenv.isLinux "${pkgs.wezterm}/bin/wezterm";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Display images in the terminal
 | 
					        # Display images in the terminal
 | 
				
			||||||
        programs.fish.shellAliases = {
 | 
					        programs.fish.shellAliases = {
 | 
				
			||||||
          icat = lib.mkForce "wezterm imgcat";
 | 
					          icat = lib.mkForce "wezterm imgcat";
 | 
				
			||||||
@@ -102,132 +102,183 @@
 | 
				
			|||||||
            };
 | 
					            };
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
          extraConfig = ''
 | 
					          extraConfig = ''
 | 
				
			||||||
            return {
 | 
					            local wezterm = require("wezterm")
 | 
				
			||||||
                color_scheme = "myTheme",
 | 
					            local config = wezterm.config_builder()
 | 
				
			||||||
 | 
					            config.check_for_updates = false
 | 
				
			||||||
 | 
					            config.color_scheme = "myTheme"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                -- Scrollback
 | 
					            -- Scrollback
 | 
				
			||||||
                scrollback_lines = 10000,
 | 
					            config.scrollback_lines = 10000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                -- Window
 | 
					            -- Window
 | 
				
			||||||
                window_padding = {
 | 
					            config.window_padding = {
 | 
				
			||||||
                  left = 10,
 | 
					              left = 10,
 | 
				
			||||||
                  right = 10,
 | 
					              right = 10,
 | 
				
			||||||
                  top = 10,
 | 
					              top = 10,
 | 
				
			||||||
                  bottom = 10,
 | 
					              bottom = 12,
 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                font = wezterm.font('${font}', { weight = 'Bold'}),
 | 
					 | 
				
			||||||
                font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                -- Tab Bar
 | 
					 | 
				
			||||||
                hide_tab_bar_if_only_one_tab = true,
 | 
					 | 
				
			||||||
                window_frame = {
 | 
					 | 
				
			||||||
                  font = wezterm.font('${font}', { weight = 'Bold'}),
 | 
					 | 
				
			||||||
                  font_size = ${if pkgs.stdenv.isLinux then "12.0" else "16.0"},
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                colors = {
 | 
					 | 
				
			||||||
                  tab_bar = {
 | 
					 | 
				
			||||||
                    active_tab = {
 | 
					 | 
				
			||||||
                      bg_color = '${config.theme.colors.base00}',
 | 
					 | 
				
			||||||
                      fg_color = '${config.theme.colors.base04}',
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                  },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                -- Disable audio
 | 
					 | 
				
			||||||
                audible_bell = "Disabled",
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                initial_rows = 80,
 | 
					 | 
				
			||||||
                initial_cols = 200,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                keys = {
 | 
					 | 
				
			||||||
                  -- sends completion string for fish autosuggestions
 | 
					 | 
				
			||||||
                  {
 | 
					 | 
				
			||||||
                    key = 'Enter',
 | 
					 | 
				
			||||||
                    mods = 'SHIFT',
 | 
					 | 
				
			||||||
                    action = wezterm.action.SendString '\x1F'
 | 
					 | 
				
			||||||
                  },
 | 
					 | 
				
			||||||
                  -- ctrl-shift-h was "hide"
 | 
					 | 
				
			||||||
                  {
 | 
					 | 
				
			||||||
                    key = 'H',
 | 
					 | 
				
			||||||
                    mods = 'SHIFT|CTRL',
 | 
					 | 
				
			||||||
                    action = wezterm.action.DisableDefaultAssignment
 | 
					 | 
				
			||||||
                  },
 | 
					 | 
				
			||||||
                  -- alt-enter was "fullscreen"
 | 
					 | 
				
			||||||
                  {
 | 
					 | 
				
			||||||
                    key = 'Enter',
 | 
					 | 
				
			||||||
                    mods = 'ALT',
 | 
					 | 
				
			||||||
                    action = wezterm.action.DisableDefaultAssignment
 | 
					 | 
				
			||||||
                  },
 | 
					 | 
				
			||||||
                  -- make super-f "fullscreen"
 | 
					 | 
				
			||||||
                  {
 | 
					 | 
				
			||||||
                    key = 'f',
 | 
					 | 
				
			||||||
                    mods = 'SUPER',
 | 
					 | 
				
			||||||
                    action = wezterm.action.ToggleFullScreen
 | 
					 | 
				
			||||||
                  },
 | 
					 | 
				
			||||||
                  -- super-t open new tab in new dir
 | 
					 | 
				
			||||||
                  {
 | 
					 | 
				
			||||||
                    key = 't',
 | 
					 | 
				
			||||||
                    mods = 'SUPER',
 | 
					 | 
				
			||||||
                    action = wezterm.action.SpawnCommandInNewTab {
 | 
					 | 
				
			||||||
                      cwd = wezterm.home_dir,
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                  },
 | 
					 | 
				
			||||||
                  -- shift-super-t open new tab in same dir
 | 
					 | 
				
			||||||
                  {
 | 
					 | 
				
			||||||
                    key = 't',
 | 
					 | 
				
			||||||
                    mods = 'SUPER|SHIFT',
 | 
					 | 
				
			||||||
                    action = wezterm.action.SpawnTab 'CurrentPaneDomain'
 | 
					 | 
				
			||||||
                  },
 | 
					 | 
				
			||||||
                  -- project switcher
 | 
					 | 
				
			||||||
                  {
 | 
					 | 
				
			||||||
                     key = 'P',
 | 
					 | 
				
			||||||
                     mods = 'SUPER',
 | 
					 | 
				
			||||||
                     action = wezterm.action_callback(function(window, pane)
 | 
					 | 
				
			||||||
                       local choices = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                       wezterm.log_info "working?"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                       function scandir(directory)
 | 
					 | 
				
			||||||
                           local i, t, popen = 0, {}, io.popen
 | 
					 | 
				
			||||||
                           local pfile = popen('${pkgs.fd}/bin/fd --search-path "'..directory..'" --type directory --exact-depth 2 | ${pkgs.proximity-sort}/bin/proximity-sort "'..os.getenv("HOME").."/dev/work"..'"')
 | 
					 | 
				
			||||||
                           for filename in pfile:lines() do
 | 
					 | 
				
			||||||
                               i = i + 1
 | 
					 | 
				
			||||||
                               t[i] = filename
 | 
					 | 
				
			||||||
                           end
 | 
					 | 
				
			||||||
                           pfile:close()
 | 
					 | 
				
			||||||
                           return t
 | 
					 | 
				
			||||||
                       end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                       for _, v in pairs(scandir(os.getenv("HOME").."/dev")) do
 | 
					 | 
				
			||||||
                         table.insert(choices, { label = v })
 | 
					 | 
				
			||||||
                       end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                       window:perform_action(
 | 
					 | 
				
			||||||
                         wezterm.action.InputSelector {
 | 
					 | 
				
			||||||
                           action = wezterm.action_callback(function(window, pane, id, label)
 | 
					 | 
				
			||||||
                             if not id and not label then
 | 
					 | 
				
			||||||
                               wezterm.log_info "cancelled"
 | 
					 | 
				
			||||||
                             else
 | 
					 | 
				
			||||||
                               window:perform_action(
 | 
					 | 
				
			||||||
                                 wezterm.action.SpawnCommandInNewTab {
 | 
					 | 
				
			||||||
                                   cwd = label,
 | 
					 | 
				
			||||||
                                 },
 | 
					 | 
				
			||||||
                                 pane
 | 
					 | 
				
			||||||
                               )
 | 
					 | 
				
			||||||
                             end
 | 
					 | 
				
			||||||
                           end),
 | 
					 | 
				
			||||||
                           fuzzy = true,
 | 
					 | 
				
			||||||
                           title = "Select Project",
 | 
					 | 
				
			||||||
                           choices = choices,
 | 
					 | 
				
			||||||
                         },
 | 
					 | 
				
			||||||
                         pane
 | 
					 | 
				
			||||||
                       )
 | 
					 | 
				
			||||||
                     end),
 | 
					 | 
				
			||||||
                  },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            config.font = wezterm.font('${font}', { weight = 'Bold'})
 | 
				
			||||||
 | 
					            config.font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            -- Fix color blocks instead of text
 | 
				
			||||||
 | 
					            config.front_end = "WebGpu"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            -- Tab Bar
 | 
				
			||||||
 | 
					            config.hide_tab_bar_if_only_one_tab = true
 | 
				
			||||||
 | 
					            config.window_frame = {
 | 
				
			||||||
 | 
					              font = wezterm.font('${font}', { weight = 'Bold'}),
 | 
				
			||||||
 | 
					              font_size = ${if pkgs.stdenv.isLinux then "12.0" else "16.0"},
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            config.colors = {
 | 
				
			||||||
 | 
					              tab_bar = {
 | 
				
			||||||
 | 
					                active_tab = {
 | 
				
			||||||
 | 
					                  bg_color = '${config.theme.colors.base00}',
 | 
				
			||||||
 | 
					                  fg_color = '${config.theme.colors.base04}',
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            -- Disable audio
 | 
				
			||||||
 | 
					            config.audible_bell = "Disabled"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            config.initial_rows = 80
 | 
				
			||||||
 | 
					            config.initial_cols = 200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            config.unix_domains = {
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                name = 'unix',
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            -- This causes `wezterm` to act as though it was started as
 | 
				
			||||||
 | 
					            -- `wezterm connect unix` by default, connecting to the unix
 | 
				
			||||||
 | 
					            -- domain on startup.
 | 
				
			||||||
 | 
					            -- If you prefer to connect manually, leave out this line.
 | 
				
			||||||
 | 
					            config.default_gui_startup_args = { 'connect', 'unix' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            config.leader = {
 | 
				
			||||||
 | 
					              key = 'a',
 | 
				
			||||||
 | 
					              mods = 'CTRL',
 | 
				
			||||||
 | 
					              timeout_milliseconds = 2000,
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            config.keys = {
 | 
				
			||||||
 | 
					              -- Attach to muxer
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                key = 'a',
 | 
				
			||||||
 | 
					                mods = 'LEADER',
 | 
				
			||||||
 | 
					                action = wezterm.action.AttachDomain 'unix',
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              -- Detach from muxer
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                key = 'd',
 | 
				
			||||||
 | 
					                mods = 'LEADER',
 | 
				
			||||||
 | 
					                action = wezterm.action.DetachDomain { DomainName = 'unix' },
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              -- sends completion string for fish autosuggestions
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                key = 'Enter',
 | 
				
			||||||
 | 
					                mods = 'SHIFT',
 | 
				
			||||||
 | 
					                action = wezterm.action.SendString '\x1F'
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              -- ctrl-shift-h was "hide"
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                key = 'H',
 | 
				
			||||||
 | 
					                mods = 'SHIFT|CTRL',
 | 
				
			||||||
 | 
					                action = wezterm.action.DisableDefaultAssignment
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              -- alt-enter was "fullscreen"
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                key = 'Enter',
 | 
				
			||||||
 | 
					                mods = 'ALT',
 | 
				
			||||||
 | 
					                action = wezterm.action.DisableDefaultAssignment
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              -- make super-f "fullscreen"
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                key = 'f',
 | 
				
			||||||
 | 
					                mods = 'SUPER',
 | 
				
			||||||
 | 
					                action = wezterm.action.ToggleFullScreen
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              -- super-t open new tab in new dir
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                key = 't',
 | 
				
			||||||
 | 
					                mods = ${if pkgs.stdenv.isDarwin then "'SUPER'" else "'ALT'"},
 | 
				
			||||||
 | 
					                action = wezterm.action.SpawnCommandInNewTab {
 | 
				
			||||||
 | 
					                  cwd = wezterm.home_dir,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              -- shift-super-t open new tab in same dir
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                key = 't',
 | 
				
			||||||
 | 
					                mods = 'SUPER|SHIFT',
 | 
				
			||||||
 | 
					                action = wezterm.action.SpawnTab 'CurrentPaneDomain'
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              -- project switcher
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                 key = 'P',
 | 
				
			||||||
 | 
					                 mods = 'SUPER',
 | 
				
			||||||
 | 
					                 action = wezterm.action_callback(function(window, pane)
 | 
				
			||||||
 | 
					                   local choices = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                   wezterm.log_info "working?"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                   function scandir(directory)
 | 
				
			||||||
 | 
					                       local i, t, popen = 0, {}, io.popen
 | 
				
			||||||
 | 
					                       local pfile = popen('${pkgs.fd}/bin/fd --search-path "'..directory..'" --type directory --exact-depth 2 | ${pkgs.proximity-sort}/bin/proximity-sort "'..os.getenv("HOME").."/dev/work"..'"')
 | 
				
			||||||
 | 
					                       for filename in pfile:lines() do
 | 
				
			||||||
 | 
					                           i = i + 1
 | 
				
			||||||
 | 
					                           t[i] = filename
 | 
				
			||||||
 | 
					                       end
 | 
				
			||||||
 | 
					                       pfile:close()
 | 
				
			||||||
 | 
					                       return t
 | 
				
			||||||
 | 
					                   end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                   for _, v in pairs(scandir(os.getenv("HOME").."/dev")) do
 | 
				
			||||||
 | 
					                     table.insert(choices, { label = v })
 | 
				
			||||||
 | 
					                   end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                   window:perform_action(
 | 
				
			||||||
 | 
					                     wezterm.action.InputSelector {
 | 
				
			||||||
 | 
					                       action = wezterm.action_callback(function(window, pane, id, label)
 | 
				
			||||||
 | 
					                         if not id and not label then
 | 
				
			||||||
 | 
					                           wezterm.log_info "cancelled"
 | 
				
			||||||
 | 
					                         else
 | 
				
			||||||
 | 
					                           window:perform_action(
 | 
				
			||||||
 | 
					                             wezterm.action.SpawnCommandInNewTab {
 | 
				
			||||||
 | 
					                               cwd = label,
 | 
				
			||||||
 | 
					                             },
 | 
				
			||||||
 | 
					                             pane
 | 
				
			||||||
 | 
					                           )
 | 
				
			||||||
 | 
					                         end
 | 
				
			||||||
 | 
					                       end),
 | 
				
			||||||
 | 
					                       fuzzy = true,
 | 
				
			||||||
 | 
					                       title = "Select Project",
 | 
				
			||||||
 | 
					                       choices = choices,
 | 
				
			||||||
 | 
					                     },
 | 
				
			||||||
 | 
					                     pane
 | 
				
			||||||
 | 
					                   )
 | 
				
			||||||
 | 
					                 end),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            -- print the workspace name at the upper right
 | 
				
			||||||
 | 
					            wezterm.on("update-right-status", function(window, pane)
 | 
				
			||||||
 | 
					              window:set_right_status(window:active_workspace())
 | 
				
			||||||
 | 
					            end)
 | 
				
			||||||
 | 
					            -- load plugin
 | 
				
			||||||
 | 
					            local workspace_switcher = wezterm.plugin.require("https://github.com/MLFlexer/smart_workspace_switcher.wezterm")
 | 
				
			||||||
 | 
					            -- set path to zoxide
 | 
				
			||||||
 | 
					            workspace_switcher.zoxide_path = "${pkgs.zoxide}/bin/zoxide"
 | 
				
			||||||
 | 
					            -- keymaps
 | 
				
			||||||
 | 
					            table.insert(config.keys, { key = "s", mods = "CTRL|SHIFT", action = workspace_switcher.switch_workspace() })
 | 
				
			||||||
 | 
					            -- table.insert(config.keys, { key = "t", mods = "CTRL|SHIFT", action = wezterm.action.ShowLauncherArgs({ flags = "FUZZY|WORKSPACES" }) })
 | 
				
			||||||
 | 
					            table.insert(config.keys, { key = "[", mods = "CTRL|SHIFT", action = wezterm.action.SwitchWorkspaceRelative(1) })
 | 
				
			||||||
 | 
					            table.insert(config.keys, { key = "]", mods = "CTRL|SHIFT", action = wezterm.action.SwitchWorkspaceRelative(-1) })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return config
 | 
				
			||||||
          '';
 | 
					          '';
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -76,7 +76,24 @@
 | 
				
			|||||||
      description = "List of unfree packages to allow.";
 | 
					      description = "List of unfree packages to allow.";
 | 
				
			||||||
      default = [ ];
 | 
					      default = [ ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    insecurePackages = lib.mkOption {
 | 
				
			||||||
 | 
					      type = lib.types.listOf lib.types.str;
 | 
				
			||||||
 | 
					      description = "List of insecure packages to allow.";
 | 
				
			||||||
 | 
					      default = [ ];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    hostnames = {
 | 
					    hostnames = {
 | 
				
			||||||
 | 
					      audiobooks = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for audiobook server (Audiobookshelf).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      budget = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for budgeting server (ActualBudget).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      files = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for files server (Filebrowser).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
      git = lib.mkOption {
 | 
					      git = lib.mkOption {
 | 
				
			||||||
        type = lib.types.str;
 | 
					        type = lib.types.str;
 | 
				
			||||||
        description = "Hostname for git server (Gitea).";
 | 
					        description = "Hostname for git server (Gitea).";
 | 
				
			||||||
@@ -93,6 +110,10 @@
 | 
				
			|||||||
        type = lib.types.str;
 | 
					        type = lib.types.str;
 | 
				
			||||||
        description = "Hostname for document server (paperless-ngx).";
 | 
					        description = "Hostname for document server (paperless-ngx).";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					      photos = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for photo management (Immich).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
      prometheus = lib.mkOption {
 | 
					      prometheus = lib.mkOption {
 | 
				
			||||||
        type = lib.types.str;
 | 
					        type = lib.types.str;
 | 
				
			||||||
        description = "Hostname for Prometheus server.";
 | 
					        description = "Hostname for Prometheus server.";
 | 
				
			||||||
@@ -129,6 +150,14 @@
 | 
				
			|||||||
        type = lib.types.str;
 | 
					        type = lib.types.str;
 | 
				
			||||||
        description = "Hostname for n8n automation.";
 | 
					        description = "Hostname for n8n automation.";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					      notifications = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for push notification services (ntfy).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      status = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for status page (Uptime-Kuma).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
      transmission = lib.mkOption {
 | 
					      transmission = lib.mkOption {
 | 
				
			||||||
        type = lib.types.str;
 | 
					        type = lib.types.str;
 | 
				
			||||||
        description = "Hostname for peer2peer downloads (Transmission).";
 | 
					        description = "Hostname for peer2peer downloads (Transmission).";
 | 
				
			||||||
@@ -161,6 +190,9 @@
 | 
				
			|||||||
      # Retrieves package object based on string name
 | 
					      # Retrieves package object based on string name
 | 
				
			||||||
      nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) config.unfreePackages;
 | 
					      nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) config.unfreePackages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Allow specified insecure packages (identified elsewhere)
 | 
				
			||||||
 | 
					      nixpkgs.config.permittedInsecurePackages = config.insecurePackages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Pin a state version to prevent warnings
 | 
					      # Pin a state version to prevent warnings
 | 
				
			||||||
      home-manager.users.${config.user}.home.stateVersion = stateVersion;
 | 
					      home-manager.users.${config.user}.home.stateVersion = stateVersion;
 | 
				
			||||||
      home-manager.users.root.home.stateVersion = stateVersion;
 | 
					      home-manager.users.root.home.stateVersion = stateVersion;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -169,7 +169,8 @@
 | 
				
			|||||||
          filters = {
 | 
					          filters = {
 | 
				
			||||||
            "text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
 | 
					            "text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
 | 
				
			||||||
            "text/calendar" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/libexec/aerc/filters/calendar";
 | 
					            "text/calendar" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/libexec/aerc/filters/calendar";
 | 
				
			||||||
            "text/html" = "${pkgs.aerc}/libexec/aerc/filters/html | ${pkgs.aerc}/libexec/aerc/filters/colorize"; # Requires w3m, dante
 | 
					            "text/html" =
 | 
				
			||||||
 | 
					              "${pkgs.aerc}/libexec/aerc/filters/html | ${pkgs.aerc}/libexec/aerc/filters/colorize"; # Requires w3m, dante
 | 
				
			||||||
            # "text/*" =
 | 
					            # "text/*" =
 | 
				
			||||||
            #   ''${pkgs.bat}/bin/bat -fP --file-name="$AERC_FILENAME "'';
 | 
					            #   ''${pkgs.bat}/bin/bat -fP --file-name="$AERC_FILENAME "'';
 | 
				
			||||||
            "message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
 | 
					            "message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
 | 
				
			||||||
@@ -190,26 +191,25 @@
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      xdg.desktopEntries.aerc = lib.mkIf pkgs.stdenv.isLinux {
 | 
					      xdg.desktopEntries.aerc = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
				
			||||||
        name = "aerc";
 | 
					        name = "aerc";
 | 
				
			||||||
        exec = "kitty aerc %u";
 | 
					        exec = "${config.terminalLaunchCommand} aerc %u";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
 | 
					      xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
 | 
				
			||||||
        "${
 | 
					        "${config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier}+Shift+e" =
 | 
				
			||||||
          config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
 | 
					          "exec ${
 | 
				
			||||||
        }+Shift+e" = "exec ${
 | 
					            # Don't name the script `aerc` or it will affect grep
 | 
				
			||||||
          # Don't name the script `aerc` or it will affect grep
 | 
					            builtins.toString (
 | 
				
			||||||
          builtins.toString (
 | 
					              pkgs.writeShellScript "focus-mail.sh" ''
 | 
				
			||||||
            pkgs.writeShellScript "focus-mail.sh" ''
 | 
					                count=$(ps aux | grep -c aerc)
 | 
				
			||||||
              count=$(ps aux | grep -c aerc)
 | 
					                if [ "$count" -eq 1 ]; then
 | 
				
			||||||
              if [ "$count" -eq 1 ]; then
 | 
					                    i3-msg "exec --no-startup-id ${config.terminal} start --class aerc -- aerc"
 | 
				
			||||||
                  i3-msg "exec --no-startup-id kitty --class aerc aerc"
 | 
					                    sleep 0.25
 | 
				
			||||||
                  sleep 0.25
 | 
					                fi
 | 
				
			||||||
              fi
 | 
					                i3-msg "[class=aerc] focus"
 | 
				
			||||||
              i3-msg "[class=aerc] focus"
 | 
					              ''
 | 
				
			||||||
            ''
 | 
					            )
 | 
				
			||||||
          )
 | 
					          }";
 | 
				
			||||||
        }";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      programs.fish.shellAbbrs = {
 | 
					      programs.fish.shellAbbrs = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@
 | 
				
			|||||||
  plugins = [
 | 
					  plugins = [
 | 
				
			||||||
    pkgs.vimPlugins.bufferline-nvim
 | 
					    pkgs.vimPlugins.bufferline-nvim
 | 
				
			||||||
    pkgs.vimPlugins.vim-bbye # Better closing of buffers
 | 
					    pkgs.vimPlugins.vim-bbye # Better closing of buffers
 | 
				
			||||||
 | 
					    pkgs.vimPlugins.snipe-nvim # Jump between open buffers
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
  setup.bufferline = {
 | 
					  setup.bufferline = {
 | 
				
			||||||
    options = {
 | 
					    options = {
 | 
				
			||||||
@@ -15,6 +16,7 @@
 | 
				
			|||||||
      offsets = [ { filetype = "NvimTree"; } ];
 | 
					      offsets = [ { filetype = "NvimTree"; } ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					  setup.snipe = { };
 | 
				
			||||||
  lua = ''
 | 
					  lua = ''
 | 
				
			||||||
    -- Move buffers
 | 
					    -- Move buffers
 | 
				
			||||||
    vim.keymap.set("n", "L", ":BufferLineCycleNext<CR>", { silent = true })
 | 
					    vim.keymap.set("n", "L", ":BufferLineCycleNext<CR>", { silent = true })
 | 
				
			||||||
@@ -22,5 +24,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    -- Kill buffer
 | 
					    -- Kill buffer
 | 
				
			||||||
    vim.keymap.set("n", "<Leader>x", " :Bdelete<CR>", { silent = true })
 | 
					    vim.keymap.set("n", "<Leader>x", " :Bdelete<CR>", { silent = true })
 | 
				
			||||||
  '';
 | 
					
 | 
				
			||||||
 | 
					    -- Jump to buffer
 | 
				
			||||||
 | 
					    vim.keymap.set("n", "gb", require("snipe").open_buffer_menu, { silent = true }) '';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  plugins = [
 | 
					  plugins = [
 | 
				
			||||||
 | 
					    pkgs.vimPlugins.nvim-cmp
 | 
				
			||||||
    pkgs.vimPlugins.cmp-nvim-lsp
 | 
					    pkgs.vimPlugins.cmp-nvim-lsp
 | 
				
			||||||
    pkgs.vimPlugins.cmp-buffer
 | 
					    pkgs.vimPlugins.cmp-buffer
 | 
				
			||||||
    pkgs.vimPlugins.cmp-path
 | 
					    pkgs.vimPlugins.cmp-path
 | 
				
			||||||
@@ -26,15 +27,21 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Basic completion keybinds
 | 
					    # Basic completion keybinds
 | 
				
			||||||
    mapping = {
 | 
					    mapping = {
 | 
				
			||||||
      "['<C-n>']" = dsl.rawLua "require('cmp').mapping.select_next_item({ behavior = require('cmp').SelectBehavior.Insert }, { 'i', 'c' })";
 | 
					      "['<C-n>']" =
 | 
				
			||||||
      "['<C-p>']" = dsl.rawLua "require('cmp').mapping.select_prev_item({ behavior = require('cmp').SelectBehavior.Insert }, { 'i', 'c' })";
 | 
					        dsl.rawLua "require('cmp').mapping.select_next_item({ behavior = require('cmp').SelectBehavior.Insert }, { 'i', 'c' })";
 | 
				
			||||||
      "['<Down>']" = dsl.rawLua "require('cmp').mapping.select_next_item({ behavior = require('cmp').SelectBehavior.Select }, { 'i', 'c' })";
 | 
					      "['<C-p>']" =
 | 
				
			||||||
      "['<Up>']" = dsl.rawLua "require('cmp').mapping.select_prev_item({ behavior = require('cmp').SelectBehavior.Select }, { 'i', 'c' })";
 | 
					        dsl.rawLua "require('cmp').mapping.select_prev_item({ behavior = require('cmp').SelectBehavior.Insert }, { 'i', 'c' })";
 | 
				
			||||||
 | 
					      "['<Down>']" =
 | 
				
			||||||
 | 
					        dsl.rawLua "require('cmp').mapping.select_next_item({ behavior = require('cmp').SelectBehavior.Select }, { 'i', 'c' })";
 | 
				
			||||||
 | 
					      "['<Up>']" =
 | 
				
			||||||
 | 
					        dsl.rawLua "require('cmp').mapping.select_prev_item({ behavior = require('cmp').SelectBehavior.Select }, { 'i', 'c' })";
 | 
				
			||||||
      "['<C-d>']" = dsl.rawLua "require('cmp').mapping.scroll_docs(-4)";
 | 
					      "['<C-d>']" = dsl.rawLua "require('cmp').mapping.scroll_docs(-4)";
 | 
				
			||||||
      "['<C-f>']" = dsl.rawLua "require('cmp').mapping.scroll_docs(4)";
 | 
					      "['<C-f>']" = dsl.rawLua "require('cmp').mapping.scroll_docs(4)";
 | 
				
			||||||
      "['<C-e>']" = dsl.rawLua "require('cmp').mapping.abort()";
 | 
					      "['<C-e>']" = dsl.rawLua "require('cmp').mapping.abort()";
 | 
				
			||||||
      "['<C-y>']" = dsl.rawLua "require('cmp').mapping.confirm({ behavior = require('cmp').ConfirmBehavior.Insert, select = true, }, { 'i', 'c' })";
 | 
					      "['<C-y>']" =
 | 
				
			||||||
      "['<C-r>']" = dsl.rawLua "require('cmp').mapping.confirm({ behavior = require('cmp').ConfirmBehavior.Replace, select = true, }, { 'i', 'c' })";
 | 
					        dsl.rawLua "require('cmp').mapping.confirm({ behavior = require('cmp').ConfirmBehavior.Insert, select = true, }, { 'i', 'c' })";
 | 
				
			||||||
 | 
					      "['<C-r>']" =
 | 
				
			||||||
 | 
					        dsl.rawLua "require('cmp').mapping.confirm({ behavior = require('cmp').ConfirmBehavior.Replace, select = true, }, { 'i', 'c' })";
 | 
				
			||||||
      "['<Esc>']" = dsl.rawLua ''
 | 
					      "['<Esc>']" = dsl.rawLua ''
 | 
				
			||||||
        function(_)
 | 
					        function(_)
 | 
				
			||||||
            cmp.mapping({
 | 
					            cmp.mapping({
 | 
				
			||||||
@@ -128,7 +135,7 @@
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  lua = ''
 | 
					  lua' = ''
 | 
				
			||||||
    -- Use buffer source for `/`
 | 
					    -- Use buffer source for `/`
 | 
				
			||||||
    require('cmp').setup.cmdline("/", {
 | 
					    require('cmp').setup.cmdline("/", {
 | 
				
			||||||
        mapping = {
 | 
					        mapping = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,9 +19,11 @@
 | 
				
			|||||||
      pkgs.vimPlugins.fidget-nvim
 | 
					      pkgs.vimPlugins.fidget-nvim
 | 
				
			||||||
      pkgs.vimPlugins.nvim-lint
 | 
					      pkgs.vimPlugins.nvim-lint
 | 
				
			||||||
      pkgs.vimPlugins.vim-table-mode
 | 
					      pkgs.vimPlugins.vim-table-mode
 | 
				
			||||||
 | 
					      pkgs.vimPlugins.tiny-inline-diagnostic-nvim
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    setup.fidget = { };
 | 
					    setup.fidget = { };
 | 
				
			||||||
 | 
					    setup.tiny-inline-diagnostic = { };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    use.lspconfig.lua_ls.setup = dsl.callWith {
 | 
					    use.lspconfig.lua_ls.setup = dsl.callWith {
 | 
				
			||||||
      settings = {
 | 
					      settings = {
 | 
				
			||||||
@@ -71,6 +73,9 @@
 | 
				
			|||||||
          files = {
 | 
					          files = {
 | 
				
			||||||
            excludeDirs = [ ".direnv" ];
 | 
					            excludeDirs = [ ".direnv" ];
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
 | 
					          cargo = {
 | 
				
			||||||
 | 
					            features = "all";
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -133,6 +138,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      -- Prevent infinite log size (change this when debugging)
 | 
					      -- Prevent infinite log size (change this when debugging)
 | 
				
			||||||
      vim.lsp.set_log_level("off")
 | 
					      vim.lsp.set_log_level("off")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      -- Hide buffer diagnostics (use tiny-inline-diagnostic.nvim instead)
 | 
				
			||||||
 | 
					      vim.diagnostic.config({ virtual_text = false })
 | 
				
			||||||
    '';
 | 
					    '';
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@
 | 
				
			|||||||
    pkgs.vimPlugins.vim-eunuch # File manipulation commands
 | 
					    pkgs.vimPlugins.vim-eunuch # File manipulation commands
 | 
				
			||||||
    pkgs.vimPlugins.vim-fugitive # Git commands
 | 
					    pkgs.vimPlugins.vim-fugitive # Git commands
 | 
				
			||||||
    pkgs.vimPlugins.vim-repeat # Better repeat using .
 | 
					    pkgs.vimPlugins.vim-repeat # Better repeat using .
 | 
				
			||||||
 | 
					    pkgs.vimPlugins.vim-abolish # Keep capitalization in substitute (Subvert)
 | 
				
			||||||
    pkgs.vimPlugins.markview-nvim # Markdown preview
 | 
					    pkgs.vimPlugins.markview-nvim # Markdown preview
 | 
				
			||||||
    pkgs.vimPlugins.nvim-colorizer-lua # Hex color previews
 | 
					    pkgs.vimPlugins.nvim-colorizer-lua # Hex color previews
 | 
				
			||||||
    pkgs.vimPlugins.which-key-nvim # Keybind helper
 | 
					    pkgs.vimPlugins.which-key-nvim # Keybind helper
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ function TERM_TOGGLE()
 | 
				
			|||||||
    basicterminal:toggle()
 | 
					    basicterminal:toggle()
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local nixpkgs = terminal:new({ cmd = "nix repl '<nixpkgs>'" })
 | 
					local nixpkgs = terminal:new({ cmd = "nix repl --expr 'import <nixpkgs>{}'" })
 | 
				
			||||||
function NIXPKGS_TOGGLE()
 | 
					function NIXPKGS_TOGGLE()
 | 
				
			||||||
    nixpkgs:toggle()
 | 
					    nixpkgs:toggle()
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,9 +50,9 @@ in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # Create a desktop option for launching Neovim from a file manager
 | 
					        # Create a desktop option for launching Neovim from a file manager
 | 
				
			||||||
        # (Requires launching the terminal and then executing Neovim)
 | 
					        # (Requires launching the terminal and then executing Neovim)
 | 
				
			||||||
        xdg.desktopEntries.nvim = lib.mkIf pkgs.stdenv.isLinux {
 | 
					        xdg.desktopEntries.nvim = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
				
			||||||
          name = "Neovim wrapper";
 | 
					          name = "Neovim wrapper";
 | 
				
			||||||
          exec = "kitty nvim %F";
 | 
					          exec = "${config.home-manager.users.${config.user}.programs.rofi.terminal} nvim %F";
 | 
				
			||||||
          mimeType = [
 | 
					          mimeType = [
 | 
				
			||||||
            "text/plain"
 | 
					            "text/plain"
 | 
				
			||||||
            "text/markdown"
 | 
					            "text/markdown"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								modules/common/shell/bash/scripts/jqr.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										23
									
								
								modules/common/shell/bash/scripts/jqr.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Adapted from: https://gist.github.com/reegnz/b9e40993d410b75c2d866441add2cb55
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ -z $1 ]] || [[ $1 == "-" ]]; then
 | 
				
			||||||
 | 
					    input=$(mktemp)
 | 
				
			||||||
 | 
					    trap 'rm -f $input' EXIT
 | 
				
			||||||
 | 
					    cat /dev/stdin >"$input"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    input=$1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo '' |
 | 
				
			||||||
 | 
					    fzf --phony \
 | 
				
			||||||
 | 
					        --height 100% \
 | 
				
			||||||
 | 
					        --preview-window='up:80%' \
 | 
				
			||||||
 | 
					        --query '.' \
 | 
				
			||||||
 | 
					        --print-query \
 | 
				
			||||||
 | 
					        --header $'CTRL-O: jq output\nCTRL-Y: copy output\nALT-Y: copy query' \
 | 
				
			||||||
 | 
					        --preview "jq --color-output -r {q} $input" \
 | 
				
			||||||
 | 
					        --bind "ctrl-o:execute(jq -r {q} $input)+clear-query+accept" \
 | 
				
			||||||
 | 
					        --bind "alt-y:execute(echo {q} | pbcopy)" \
 | 
				
			||||||
 | 
					        --bind "ctrl-y:execute(jq -r {q} $input | pbcopy)"
 | 
				
			||||||
@@ -6,14 +6,15 @@ BUCKET_NAME_PART_1="t2"
 | 
				
			|||||||
BUCKET_NAME_PART_2="global"
 | 
					BUCKET_NAME_PART_2="global"
 | 
				
			||||||
BUCKET_NAME_PART_3="terraformstate"
 | 
					BUCKET_NAME_PART_3="terraformstate"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKFLOW_FILE=".github/workflows/terraform.yml"
 | 
					PROJECT_ROOT=$(git rev-parse --show-toplevel)
 | 
				
			||||||
 | 
					WORKFLOW_FILE="${PROJECT_ROOT}/.github/workflows/terraform.yml"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ ! -f $WORKFLOW_FILE ]; then
 | 
					if [ ! -f "$WORKFLOW_FILE" ]; then
 | 
				
			||||||
    WORKFLOW_FILE=".github/workflows/apply.yml"
 | 
					    WORKFLOW_FILE="${PROJECT_ROOT}/.github/workflows/apply.yml"
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AWS_ACCOUNT_NUMBER=$(
 | 
					AWS_ACCOUNT_NUMBER=$(
 | 
				
			||||||
    awk '/aws_account_number: .*/ {print $2}' $WORKFLOW_FILE | # Grab account number
 | 
					    awk '/aws_account_number: .*/ {print $2}' "$WORKFLOW_FILE" | # Grab account number
 | 
				
			||||||
        echo "$(
 | 
					        echo "$(
 | 
				
			||||||
            read -r s
 | 
					            read -r s
 | 
				
			||||||
            s=${s//\'/}
 | 
					            s=${s//\'/}
 | 
				
			||||||
@@ -23,7 +24,7 @@ AWS_ACCOUNT_NUMBER=$(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
if [ -z "${AWS_ACCOUNT_NUMBER}" ]; then
 | 
					if [ -z "${AWS_ACCOUNT_NUMBER}" ]; then
 | 
				
			||||||
    AWS_ACCOUNT_NUMBER=$(
 | 
					    AWS_ACCOUNT_NUMBER=$(
 | 
				
			||||||
        awk '/AWS_ACCOUNT_NUMBER: .*/ {print $2}' $WORKFLOW_FILE | # Grab account number
 | 
					        awk '/AWS_ACCOUNT_NUMBER: .*/ {print $2}' "$WORKFLOW_FILE" | # Grab account number
 | 
				
			||||||
            echo "$(
 | 
					            echo "$(
 | 
				
			||||||
                read -r s
 | 
					                read -r s
 | 
				
			||||||
                s=${s//\'/}
 | 
					                s=${s//\'/}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -76,6 +76,10 @@
 | 
				
			|||||||
          description = "Full git commit on notes";
 | 
					          description = "Full git commit on notes";
 | 
				
			||||||
          body = builtins.readFile ./functions/syncnotes.fish;
 | 
					          body = builtins.readFile ./functions/syncnotes.fish;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					        _which = {
 | 
				
			||||||
 | 
					          description = "Identify the path to a program in the shell";
 | 
				
			||||||
 | 
					          body = "command --search (string sub --start=2 $argv)";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      interactiveShellInit = ''
 | 
					      interactiveShellInit = ''
 | 
				
			||||||
        fish_vi_key_bindings
 | 
					        fish_vi_key_bindings
 | 
				
			||||||
@@ -101,10 +105,18 @@
 | 
				
			|||||||
        "-" = "cd -";
 | 
					        "-" = "cd -";
 | 
				
			||||||
        mkd = "mkdir -pv";
 | 
					        mkd = "mkdir -pv";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Convert a program into its full path
 | 
				
			||||||
 | 
					        "=" = {
 | 
				
			||||||
 | 
					          position = "anywhere";
 | 
				
			||||||
 | 
					          regex = "=\\w+";
 | 
				
			||||||
 | 
					          function = "_which";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # System
 | 
					        # System
 | 
				
			||||||
        s = "sudo";
 | 
					        s = "sudo";
 | 
				
			||||||
        sc = "systemctl";
 | 
					        sc = "systemctl";
 | 
				
			||||||
        scs = "systemctl status";
 | 
					        scs = "systemctl status";
 | 
				
			||||||
 | 
					        sca = "systemctl cat";
 | 
				
			||||||
        m = "make";
 | 
					        m = "make";
 | 
				
			||||||
        t = "trash";
 | 
					        t = "trash";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
set vimfile (fzf)
 | 
					set vimfile (fzf)
 | 
				
			||||||
and set vimfile (echo $vimfile | tr -d '\r')
 | 
					and set vimfile (echo $vimfile | tr -d '\r')
 | 
				
			||||||
and commandline -r "vim $vimfile"
 | 
					and commandline -r "vim \"$vimfile\""
 | 
				
			||||||
and commandline -f execute
 | 
					and commandline -f execute
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,5 +41,16 @@
 | 
				
			|||||||
        FZF_CTRL_T_COMMAND = fzfCommand;
 | 
					        FZF_CTRL_T_COMMAND = fzfCommand;
 | 
				
			||||||
        FZF_DEFAULT_OPTS = "-m --height 50% --border";
 | 
					        FZF_DEFAULT_OPTS = "-m --height 50% --border";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    home.packages = [
 | 
				
			||||||
 | 
					      (pkgs.writeShellApplication {
 | 
				
			||||||
 | 
					        name = "jqr";
 | 
				
			||||||
 | 
					        runtimeInputs = [
 | 
				
			||||||
 | 
					          pkgs.jq
 | 
				
			||||||
 | 
					          pkgs.fzf
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        text = builtins.readFile ./bash/scripts/jqr.sh;
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,11 @@ in
 | 
				
			|||||||
        gpd = "git push origin -d";
 | 
					        gpd = "git push origin -d";
 | 
				
			||||||
        gbd = "git branch -d";
 | 
					        gbd = "git branch -d";
 | 
				
			||||||
        gbD = "git branch -D";
 | 
					        gbD = "git branch -D";
 | 
				
			||||||
 | 
					        gdd = {
 | 
				
			||||||
 | 
					          position = "anywhere";
 | 
				
			||||||
 | 
					          setCursor = true;
 | 
				
			||||||
 | 
					          expansion = "BRANCH=% git push origin -d $BRANCH and git branch -d $BRANCH";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
        gr = "git reset";
 | 
					        gr = "git reset";
 | 
				
			||||||
        grh = "git reset --hard";
 | 
					        grh = "git reset --hard";
 | 
				
			||||||
        gm = "git merge";
 | 
					        gm = "git merge";
 | 
				
			||||||
@@ -158,6 +163,13 @@ in
 | 
				
			|||||||
                and git branch -D $branch
 | 
					                and git branch -D $branch
 | 
				
			||||||
              '';
 | 
					              '';
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					            git-delete-both = {
 | 
				
			||||||
 | 
					              argumentNames = "branch";
 | 
				
			||||||
 | 
					              body = ''
 | 
				
			||||||
 | 
					                git push origin -d $branch
 | 
				
			||||||
 | 
					                git branch -d $branch
 | 
				
			||||||
 | 
					              '';
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
            git-merge-fuzzy = {
 | 
					            git-merge-fuzzy = {
 | 
				
			||||||
              body = ''
 | 
					              body = ''
 | 
				
			||||||
                set branch (git-fuzzy-branch "merge from...")
 | 
					                set branch (git-fuzzy-branch "merge from...")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,8 @@
 | 
				
			|||||||
}:
 | 
					}:
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unfreePackages = [ "gh-copilot" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  home-manager.users.${config.user} = {
 | 
					  home-manager.users.${config.user} = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    programs.gh = lib.mkIf config.home-manager.users.${config.user}.programs.git.enable {
 | 
					    programs.gh = lib.mkIf config.home-manager.users.${config.user}.programs.git.enable {
 | 
				
			||||||
@@ -15,6 +17,7 @@
 | 
				
			|||||||
      extensions = [
 | 
					      extensions = [
 | 
				
			||||||
        pkgs.gh-collaborators
 | 
					        pkgs.gh-collaborators
 | 
				
			||||||
        pkgs.gh-dash
 | 
					        pkgs.gh-dash
 | 
				
			||||||
 | 
					        pkgs.gh-copilot
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -54,7 +57,7 @@
 | 
				
			|||||||
        esac
 | 
					        esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        selected=$(gh repo list "$organization" \
 | 
					        selected=$(gh repo list "$organization" \
 | 
				
			||||||
            --limit 100 \
 | 
					            --limit 1000 \
 | 
				
			||||||
            --no-archived \
 | 
					            --no-archived \
 | 
				
			||||||
            --json=name,description,isPrivate,updatedAt,primaryLanguage \
 | 
					            --json=name,description,isPrivate,updatedAt,primaryLanguage \
 | 
				
			||||||
            | jq -r '.[] | .name + "," + if .description == "" then "-" else .description |= gsub(","; " ") | .description end + "," + .updatedAt + "," + .primaryLanguage.name' \
 | 
					            | jq -r '.[] | .name + "," + if .description == "" then "-" else .description |= gsub(","; " ") | .description end + "," + .updatedAt + "," + .primaryLanguage.name' \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,12 +13,18 @@
 | 
				
			|||||||
        ns = "nix-shell -p";
 | 
					        ns = "nix-shell -p";
 | 
				
			||||||
        nsf = "nix-shell --run fish -p";
 | 
					        nsf = "nix-shell --run fish -p";
 | 
				
			||||||
        nsr = "nix-shell-run";
 | 
					        nsr = "nix-shell-run";
 | 
				
			||||||
        nps = "nix repl '<nixpkgs>'";
 | 
					        nps = "nix repl --expr 'import <nixpkgs>{}'";
 | 
				
			||||||
        nixo = "man configuration.nix";
 | 
					        nixo = "man configuration.nix";
 | 
				
			||||||
        nixh = "man home-configuration.nix";
 | 
					        nixh = "man home-configuration.nix";
 | 
				
			||||||
        nr = "rebuild-nixos";
 | 
					        nr = {
 | 
				
			||||||
        nro = "rebuild-nixos offline";
 | 
					          function = "rebuild-nixos";
 | 
				
			||||||
        hm = "rebuild-home";
 | 
					        };
 | 
				
			||||||
 | 
					        nro = {
 | 
				
			||||||
 | 
					          function = "rebuild-nixos-offline";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        hm = {
 | 
				
			||||||
 | 
					          function = "rebuild-home";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      functions = {
 | 
					      functions = {
 | 
				
			||||||
        nix-shell-run = {
 | 
					        nix-shell-run = {
 | 
				
			||||||
@@ -42,19 +48,20 @@
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
        rebuild-nixos = {
 | 
					        rebuild-nixos = {
 | 
				
			||||||
          body = ''
 | 
					          body = ''
 | 
				
			||||||
            if test "$argv[1]" = "offline"
 | 
					 | 
				
			||||||
                set option "--option substitute false"
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
					            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
				
			||||||
            commandline -r "doas nixos-rebuild switch $option --flake ${config.dotfilesPath}#${config.networking.hostName}"
 | 
					            echo "doas nixos-rebuild switch --flake ${config.dotfilesPath}#${config.networking.hostName}"
 | 
				
			||||||
            commandline --function execute
 | 
					          '';
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        rebuild-nixos-offline = {
 | 
				
			||||||
 | 
					          body = ''
 | 
				
			||||||
 | 
					            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
				
			||||||
 | 
					            echo "doas nixos-rebuild switch --option substitute false --flake ${config.dotfilesPath}#${config.networking.hostName}"
 | 
				
			||||||
          '';
 | 
					          '';
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        rebuild-home = {
 | 
					        rebuild-home = {
 | 
				
			||||||
          body = ''
 | 
					          body = ''
 | 
				
			||||||
            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
					            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
				
			||||||
            commandline -r "${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#${config.networking.hostName}";
 | 
					            echo "${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#${config.networking.hostName}";
 | 
				
			||||||
            commandline --function execute
 | 
					 | 
				
			||||||
          '';
 | 
					          '';
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
@@ -91,12 +98,6 @@
 | 
				
			|||||||
    # Set channel to flake packages, used for nix-shell commands
 | 
					    # Set channel to flake packages, used for nix-shell commands
 | 
				
			||||||
    nixPath = [ "nixpkgs=${pkgs.path}" ];
 | 
					    nixPath = [ "nixpkgs=${pkgs.path}" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Set registry to this flake's packages, used for nix X commands
 | 
					 | 
				
			||||||
    registry.nixpkgs.to = {
 | 
					 | 
				
			||||||
      type = "path";
 | 
					 | 
				
			||||||
      path = builtins.toString pkgs.path;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # For security, only allow specific users
 | 
					    # For security, only allow specific users
 | 
				
			||||||
    settings.allowed-users = [
 | 
					    settings.allowed-users = [
 | 
				
			||||||
      "@wheel"
 | 
					      "@wheel"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,12 +31,14 @@ in
 | 
				
			|||||||
        jo # JSON output
 | 
					        jo # JSON output
 | 
				
			||||||
        jq # JSON manipulation
 | 
					        jq # JSON manipulation
 | 
				
			||||||
        lf # File viewer
 | 
					        lf # File viewer
 | 
				
			||||||
 | 
					        osc # Clipboard over SSH
 | 
				
			||||||
        qrencode # Generate qr codes
 | 
					        qrencode # Generate qr codes
 | 
				
			||||||
        rsync # Copy folders
 | 
					        rsync # Copy folders
 | 
				
			||||||
        ren # Rename files
 | 
					        # ren # Rename files
 | 
				
			||||||
        # rep # Replace text in files
 | 
					        # rep # Replace text in files
 | 
				
			||||||
        ripgrep # grep
 | 
					        ripgrep # grep
 | 
				
			||||||
        sd # sed
 | 
					        sd # sed
 | 
				
			||||||
 | 
					        spacer # Output lines in terminal
 | 
				
			||||||
        tealdeer # Cheatsheets
 | 
					        tealdeer # Cheatsheets
 | 
				
			||||||
        tree # View directory hierarchy
 | 
					        tree # View directory hierarchy
 | 
				
			||||||
        vimv-rs # Batch rename files
 | 
					        vimv-rs # Batch rename files
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,41 +12,56 @@
 | 
				
			|||||||
    home.packages =
 | 
					    home.packages =
 | 
				
			||||||
      let
 | 
					      let
 | 
				
			||||||
        ldap_scheme = "ldaps";
 | 
					        ldap_scheme = "ldaps";
 | 
				
			||||||
        magic_number = "2";
 | 
					 | 
				
			||||||
        magic_end_seq = "corp";
 | 
					 | 
				
			||||||
        magic_prefix = "take";
 | 
					        magic_prefix = "take";
 | 
				
			||||||
        ldap_host = "${magic_prefix}${magic_number}.t${magic_number}.${magic_end_seq}";
 | 
					        ldap_port = 3269;
 | 
				
			||||||
        ldap_port = 636;
 | 
					        jq_parse = pkgs.writeShellScriptBin "ljq" ''
 | 
				
			||||||
        ldap_dc_1 = "${magic_prefix}${magic_number}";
 | 
					          jq --slurp \
 | 
				
			||||||
        ldap_dc_2 = "t${magic_number}";
 | 
					            --raw-input 'split("\n\n")|map(split("\n")|map(select(.[0:1]!="#" and length>0)) |select(length > 0)|map(capture("^(?<key>[^:]*:?): *(?<value>.*)") |if .key[-1:.key|length] == ":" then .key=.key[0:-1]|.value=(.value|@base64d) else . end)| group_by(.key) | map({key:.[0].key,value:(if .|length > 1 then [.[].value] else .[].value end)}) | from_entries)' | jq -r 'del(.[].thumbnailPhoto)'
 | 
				
			||||||
        ldap_dc_3 = magic_end_seq;
 | 
					        '';
 | 
				
			||||||
        ldap_script = pkgs.writeShellScriptBin "ldap" ''
 | 
					        ldap_script = pkgs.writeShellScriptBin "ldap" ''
 | 
				
			||||||
          # if ! [ "$LDAP_HOST" ]; then
 | 
					          if ! [ "$LDAP_HOST" ]; then
 | 
				
			||||||
          #     echo "No LDAP_HOST specified!"
 | 
					              echo "No LDAP_HOST specified!"
 | 
				
			||||||
          #     exit 1
 | 
					              exit 1
 | 
				
			||||||
          # fi
 | 
					          fi
 | 
				
			||||||
          SEARCH_FILTER="$@"
 | 
					          SEARCH_FILTER="$@"
 | 
				
			||||||
          ldapsearch -LLL \
 | 
					          ldapsearch -LLL \
 | 
				
			||||||
              -B -o ldif-wrap=no \
 | 
					              -B -o ldif-wrap=no \
 | 
				
			||||||
              -H "${ldap_scheme}://${ldap_host}:${builtins.toString ldap_port}" \
 | 
					              -E pr=5000/prompt \
 | 
				
			||||||
              -D "${pkgs.lib.toUpper magic_prefix}${magic_number}\\${pkgs.lib.toLower config.user}" \
 | 
					              -H "${ldap_scheme}://''${LDAP_HOST}:${builtins.toString ldap_port}" \
 | 
				
			||||||
              -w "$(${pkgs._1password}/bin/op item get T${magic_number} --fields label=password)" \
 | 
					              -D "${pkgs.lib.toUpper magic_prefix}2\\${pkgs.lib.toLower config.user}" \
 | 
				
			||||||
              -b "DC=${ldap_dc_1},DC=${ldap_dc_2},DC=${ldap_dc_3}" \
 | 
					              -w "$(${pkgs._1password-cli}/bin/op item get T2 --fields label=password --reveal)" \
 | 
				
			||||||
              -s "sub" -x "(cn=$SEARCH_FILTER)" \
 | 
					              -b "dc=''${LDAP_HOST//./,dc=}" \
 | 
				
			||||||
              | jq --slurp \
 | 
					              -s "sub" -x "(cn=''${SEARCH_FILTER})" \
 | 
				
			||||||
                  --raw-input 'split("\n\n")|map(split("\n")|map(select(.[0:1]!="#" and length>0)) |select(length > 0)|map(capture("^(?<key>[^:]*:?): *(?<value>.*)") |if .key[-1:.key|length] == ":" then .key=.key[0:-1]|.value=(.value|@base64d) else . end)| group_by(.key) | map({key:.[0].key,value:(if .|length > 1 then [.[].value] else .[].value end)}) | from_entries)' | jq -r 'del(.[].thumbnailPhoto)'
 | 
					              | ${jq_parse}/bin/ljq
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
        ldapm_script = pkgs.writeShellScriptBin "ldapm" ''
 | 
					        ldapm_script = pkgs.writeShellScriptBin "ldapm" ''
 | 
				
			||||||
 | 
					          if ! [ "$LDAP_HOST" ]; then
 | 
				
			||||||
 | 
					              echo "No LDAP_HOST specified!"
 | 
				
			||||||
 | 
					              exit 1
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
          ${ldap_script}/bin/ldap "$@" | jq '[ .[].memberOf] | add'
 | 
					          ${ldap_script}/bin/ldap "$@" | jq '[ .[].memberOf] | add'
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
        ldapg_script = pkgs.writeShellScriptBin "ldapg" ''
 | 
					        ldapg_script = pkgs.writeShellScriptBin "ldapg" ''
 | 
				
			||||||
 | 
					          if ! [ "$LDAP_HOST" ]; then
 | 
				
			||||||
 | 
					              echo "No LDAP_HOST specified!"
 | 
				
			||||||
 | 
					              exit 1
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
          ${ldap_script}/bin/ldap "$@" | jq '[ .[].member] | add'
 | 
					          ${ldap_script}/bin/ldap "$@" | jq '[ .[].member] | add'
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
 | 
					        ldapl_script = pkgs.writeShellScriptBin "ldapl" ''
 | 
				
			||||||
 | 
					          if ! [ "$LDAP_HOST" ]; then
 | 
				
			||||||
 | 
					              echo "No LDAP_HOST specified!"
 | 
				
			||||||
 | 
					              exit 1
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
 | 
					          ${ldap_script}/bin/ldap "*$@*" | jq -r '.[].name'
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
      in
 | 
					      in
 | 
				
			||||||
      [
 | 
					      [
 | 
				
			||||||
        ldap_script
 | 
					        ldap_script
 | 
				
			||||||
        ldapm_script
 | 
					        ldapm_script
 | 
				
			||||||
        ldapg_script
 | 
					        ldapg_script
 | 
				
			||||||
 | 
					        ldapl_script
 | 
				
			||||||
 | 
					        jq_parse
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,14 +8,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
 | 
					  home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    home.packages = with pkgs; [ (nerdfonts.override { fonts = [ "VictorMono" ]; }) ];
 | 
					    home.packages = with pkgs; [ nerd-fonts.victor-mono ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    programs.alacritty.settings = {
 | 
					    programs.alacritty.settings = {
 | 
				
			||||||
      font.normal.family = "VictorMono";
 | 
					      font.normal.family = "VictorMono";
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    programs.kitty.font = {
 | 
					    programs.kitty.font = {
 | 
				
			||||||
      package = (pkgs.nerdfonts.override { fonts = [ "VictorMono" ]; });
 | 
					      package = pkgs.nerd-fonts.victor-mono;
 | 
				
			||||||
      name = "VictorMono Nerd Font Mono";
 | 
					      name = "VictorMono Nerd Font Mono";
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@
 | 
				
			|||||||
    homebrew.casks = [ "hammerspoon" ];
 | 
					    homebrew.casks = [ "hammerspoon" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    system.activationScripts.postUserActivation.text = ''
 | 
					    system.activationScripts.postUserActivation.text = ''
 | 
				
			||||||
      defaults write org.hammerspoon.Hammerspoon MJConfigFile "~/.config/hammerspoon/init.lua"
 | 
					      defaults write org.hammerspoon.Hammerspoon MJConfigFile "${config.homePath}/.config/hammerspoon/init.lua"
 | 
				
			||||||
      sudo killall Dock
 | 
					      sudo killall Dock
 | 
				
			||||||
    '';
 | 
					    '';
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,10 @@
 | 
				
			|||||||
    '';
 | 
					    '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Add homebrew paths to CLI path
 | 
					    # Add homebrew paths to CLI path
 | 
				
			||||||
    home-manager.users.${config.user}.home.sessionPath = [ "/opt/homebrew/bin/" ];
 | 
					    home-manager.users.${config.user}.home.sessionPath = [
 | 
				
			||||||
 | 
					      "/opt/homebrew/bin/"
 | 
				
			||||||
 | 
					      "/opt/homebrew/opt/trash/bin/"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    homebrew = {
 | 
					    homebrew = {
 | 
				
			||||||
      enable = true;
 | 
					      enable = true;
 | 
				
			||||||
@@ -46,7 +49,7 @@
 | 
				
			|||||||
        "scroll-reverser" # Different scroll style for mouse vs. trackpad
 | 
					        "scroll-reverser" # Different scroll style for mouse vs. trackpad
 | 
				
			||||||
        "notunes" # Don't launch Apple Music with the play button
 | 
					        "notunes" # Don't launch Apple Music with the play button
 | 
				
			||||||
        "steam" # Not packaged for Nixon macOS
 | 
					        "steam" # Not packaged for Nixon macOS
 | 
				
			||||||
        # "epic-games" # Not packaged for Nix
 | 
					        "epic-games" # Not packaged for Nix
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,11 +6,12 @@
 | 
				
			|||||||
}:
 | 
					}:
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf pkgs.stdenv.isDarwin {
 | 
					  #   config = lib.mkIf pkgs.stdenv.isDarwin {
 | 
				
			||||||
    networking = {
 | 
					  #     networking = {
 | 
				
			||||||
      computerName = config.networking.hostName;
 | 
					  #       computerName = config.networking.hostName;
 | 
				
			||||||
      # Adjust if necessary
 | 
					  #       # Adjust if necessary
 | 
				
			||||||
      # hostName = "";
 | 
					  #       # hostName = "";
 | 
				
			||||||
    };
 | 
					  #     };
 | 
				
			||||||
  };
 | 
					  #   };
 | 
				
			||||||
 | 
					  # }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,25 +10,30 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    programs.fish = {
 | 
					    programs.fish = {
 | 
				
			||||||
      shellAbbrs = {
 | 
					      shellAbbrs = {
 | 
				
			||||||
        nr = lib.mkForce "rebuild-darwin";
 | 
					        nr = {
 | 
				
			||||||
        nro = lib.mkForce "rebuild-darwin offline";
 | 
					          function = lib.mkForce "rebuild-darwin";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        nro = {
 | 
				
			||||||
 | 
					          function = lib.mkForce "rebuild-darwin-offline";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      functions = {
 | 
					      functions = {
 | 
				
			||||||
        rebuild-darwin = {
 | 
					        rebuild-darwin = {
 | 
				
			||||||
          body = ''
 | 
					          body = ''
 | 
				
			||||||
            if test "$argv[1]" = "offline"
 | 
					 | 
				
			||||||
                set option "--option substitute false"
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
					            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
				
			||||||
            commandline -r "darwin-rebuild switch $option --flake ${config.dotfilesPath}#lookingglass"
 | 
					            echo "darwin-rebuild switch --flake ${config.dotfilesPath}#lookingglass"
 | 
				
			||||||
            commandline --function execute
 | 
					          '';
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        rebuild-darwin-offline = {
 | 
				
			||||||
 | 
					          body = ''
 | 
				
			||||||
 | 
					            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
				
			||||||
 | 
					            echo "darwin-rebuild switch --option substitute false --flake ${config.dotfilesPath}#lookingglass"
 | 
				
			||||||
          '';
 | 
					          '';
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        rebuild-home = lib.mkForce {
 | 
					        rebuild-home = lib.mkForce {
 | 
				
			||||||
          body = ''
 | 
					          body = ''
 | 
				
			||||||
            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
					            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
				
			||||||
            commandline -r "${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#lookingglass";
 | 
					            echo "${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#lookingglass";
 | 
				
			||||||
            commandline --function execute
 | 
					 | 
				
			||||||
          '';
 | 
					          '';
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,19 @@
 | 
				
			|||||||
}:
 | 
					}:
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  options = {
 | 
				
			||||||
 | 
					    terminal = lib.mkOption {
 | 
				
			||||||
 | 
					      type = lib.types.nullOr lib.types.str;
 | 
				
			||||||
 | 
					      description = "Path to executable for terminal emulator program.";
 | 
				
			||||||
 | 
					      default = null;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    terminalLaunchCommand = lib.mkOption {
 | 
				
			||||||
 | 
					      type = lib.types.nullOr lib.types.str;
 | 
				
			||||||
 | 
					      description = "Command for using the terminal to launch a new window with a program.";
 | 
				
			||||||
 | 
					      default = null;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf pkgs.stdenv.isDarwin {
 | 
					  config = lib.mkIf pkgs.stdenv.isDarwin {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.nix-daemon.enable = true;
 | 
					    services.nix-daemon.enable = true;
 | 
				
			||||||
@@ -23,6 +36,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    system = {
 | 
					    system = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      stateVersion = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      keyboard = {
 | 
					      keyboard = {
 | 
				
			||||||
        remapCapsLockToControl = true;
 | 
					        remapCapsLockToControl = true;
 | 
				
			||||||
        enableKeyMapping = true; # Allows for skhd
 | 
					        enableKeyMapping = true; # Allows for skhd
 | 
				
			||||||
@@ -106,7 +121,6 @@
 | 
				
			|||||||
            "${pkgs.discord}/Applications/Discord.app"
 | 
					            "${pkgs.discord}/Applications/Discord.app"
 | 
				
			||||||
            "${pkgs.obsidian}/Applications/Obsidian.app"
 | 
					            "${pkgs.obsidian}/Applications/Obsidian.app"
 | 
				
			||||||
            "${pkgs.wezterm}/Applications/WezTerm.app"
 | 
					            "${pkgs.wezterm}/Applications/WezTerm.app"
 | 
				
			||||||
            "/System/Applications/System Settings.app"
 | 
					 | 
				
			||||||
          ];
 | 
					          ];
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -134,6 +148,9 @@
 | 
				
			|||||||
        # Where to save screenshots
 | 
					        # Where to save screenshots
 | 
				
			||||||
        screencapture.location = "~/Downloads";
 | 
					        screencapture.location = "~/Downloads";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Show seconds on the clock
 | 
				
			||||||
 | 
					        menuExtraClock.ShowSeconds = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        CustomUserPreferences = {
 | 
					        CustomUserPreferences = {
 | 
				
			||||||
          # Disable disk image verification
 | 
					          # Disable disk image verification
 | 
				
			||||||
          "com.apple.frameworks.diskimages" = {
 | 
					          "com.apple.frameworks.diskimages" = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,9 +11,13 @@
 | 
				
			|||||||
    users.users."${config.user}" = {
 | 
					    users.users."${config.user}" = {
 | 
				
			||||||
      # macOS user
 | 
					      # macOS user
 | 
				
			||||||
      home = config.homePath;
 | 
					      home = config.homePath;
 | 
				
			||||||
 | 
					      uid = 502;
 | 
				
			||||||
      # shell = pkgs.fish; # Default shell
 | 
					      # shell = pkgs.fish; # Default shell
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # This might fix the shell issues
 | 
				
			||||||
 | 
					    users.knownUsers = [ config.user ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    home-manager.users.${config.user} = {
 | 
					    home-manager.users.${config.user} = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Default shell setting doesn't work
 | 
					      # Default shell setting doesn't work
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@
 | 
				
			|||||||
  unfreePackages = [
 | 
					  unfreePackages = [
 | 
				
			||||||
    "consul"
 | 
					    "consul"
 | 
				
			||||||
    "vault-bin"
 | 
					    "vault-bin"
 | 
				
			||||||
    "teams"
 | 
					    # "teams"
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
 | 
					  home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
 | 
				
			||||||
@@ -19,7 +19,6 @@
 | 
				
			|||||||
      pkgs.visidata # CSV inspector
 | 
					      pkgs.visidata # CSV inspector
 | 
				
			||||||
      pkgs.dos2unix # Convert Windows text files
 | 
					      pkgs.dos2unix # Convert Windows text files
 | 
				
			||||||
      pkgs.inetutils # Includes telnet
 | 
					      pkgs.inetutils # Includes telnet
 | 
				
			||||||
      pkgs.youtube-dl # Convert web videos
 | 
					 | 
				
			||||||
      pkgs.pandoc # Convert text documents
 | 
					      pkgs.pandoc # Convert text documents
 | 
				
			||||||
      pkgs.mpd # TUI slideshows
 | 
					      pkgs.mpd # TUI slideshows
 | 
				
			||||||
      pkgs.mpv # Video player
 | 
					      pkgs.mpv # Video player
 | 
				
			||||||
@@ -33,8 +32,9 @@
 | 
				
			|||||||
      pkgs.consul
 | 
					      pkgs.consul
 | 
				
			||||||
      pkgs.noti # Create notifications programmatically
 | 
					      pkgs.noti # Create notifications programmatically
 | 
				
			||||||
      pkgs.ipcalc # Make IP network calculations
 | 
					      pkgs.ipcalc # Make IP network calculations
 | 
				
			||||||
      pkgs.teams
 | 
					      # pkgs.teams
 | 
				
			||||||
      pkgs.cloudflared # Allow connecting to Cloudflare tunnels
 | 
					      pkgs.cloudflared # Allow connecting to Cloudflare tunnels
 | 
				
			||||||
 | 
					      pkgs.monitorcontrol # Allows adjusting external displays
 | 
				
			||||||
      (pkgs.writeShellApplication {
 | 
					      (pkgs.writeShellApplication {
 | 
				
			||||||
        name = "ocr";
 | 
					        name = "ocr";
 | 
				
			||||||
        runtimeInputs = [ pkgs.tesseract ];
 | 
					        runtimeInputs = [ pkgs.tesseract ];
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								modules/nixos/applications/calendar.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								modules/nixos/applications/calendar.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  pkgs,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  options = {
 | 
				
			||||||
 | 
					    calendar = {
 | 
				
			||||||
 | 
					      enable = lib.mkEnableOption {
 | 
				
			||||||
 | 
					        description = "Enable calendar.";
 | 
				
			||||||
 | 
					        default = false;
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf (config.gui.enable && config.calendar.enable) {
 | 
				
			||||||
 | 
					    home-manager.users.${config.user} = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      accounts.calendar.accounts.default = {
 | 
				
			||||||
 | 
					        basePath = "other/calendars"; # Where to save calendars in ~ directory
 | 
				
			||||||
 | 
					        name = "personal";
 | 
				
			||||||
 | 
					        local.type = "filesystem";
 | 
				
			||||||
 | 
					        primary = true;
 | 
				
			||||||
 | 
					        remote = {
 | 
				
			||||||
 | 
					          passwordCommand = [ "" ];
 | 
				
			||||||
 | 
					          type = "caldav";
 | 
				
			||||||
 | 
					          url = "https://${config.hostnames.content}/remote.php/dav/principals/users/${config.user}";
 | 
				
			||||||
 | 
					          userName = config.user;
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      home.packages = with pkgs; [ gnome-calendar ];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  imports = [
 | 
					  imports = [
 | 
				
			||||||
 | 
					    ./calendar.nix
 | 
				
			||||||
    ./calibre.nix
 | 
					    ./calibre.nix
 | 
				
			||||||
    ./nautilus.nix
 | 
					    ./nautilus.nix
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Quick preview with spacebar
 | 
					    # Quick preview with spacebar
 | 
				
			||||||
    services.gnome.sushi.enable = true;
 | 
					    services.gnome.sushi.enable = true;
 | 
				
			||||||
    environment.systemPackages = [ pkgs.gnome.nautilus ];
 | 
					    environment.systemPackages = [ pkgs.nautilus ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    home-manager.users.${config.user} = {
 | 
					    home-manager.users.${config.user} = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,13 +28,13 @@
 | 
				
			|||||||
      xsession.windowManager.i3.config.keybindings = {
 | 
					      xsession.windowManager.i3.config.keybindings = {
 | 
				
			||||||
        "${
 | 
					        "${
 | 
				
			||||||
          config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
 | 
					          config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
 | 
				
			||||||
        }+n" = "exec --no-startup-id ${pkgs.gnome.nautilus}/bin/nautilus";
 | 
					        }+n" = "exec --no-startup-id ${pkgs.nautilus}/bin/nautilus";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Generates a QR code and previews it with sushi
 | 
					      # Generates a QR code and previews it with sushi
 | 
				
			||||||
      programs.fish.functions = {
 | 
					      programs.fish.functions = {
 | 
				
			||||||
        qr = {
 | 
					        qr = {
 | 
				
			||||||
          body = "${pkgs.qrencode}/bin/qrencode $argv[1] -o /tmp/qr.png | ${pkgs.gnome.sushi}/bin/sushi /tmp/qr.png";
 | 
					          body = "${pkgs.qrencode}/bin/qrencode $argv[1] -o /tmp/qr.png | ${pkgs.sushi}/bin/sushi /tmp/qr.png";
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@
 | 
				
			|||||||
    ./legendary.nix
 | 
					    ./legendary.nix
 | 
				
			||||||
    ./lutris.nix
 | 
					    ./lutris.nix
 | 
				
			||||||
    ./minecraft-server.nix
 | 
					    ./minecraft-server.nix
 | 
				
			||||||
 | 
					    ./moonlight.nix
 | 
				
			||||||
    ./ryujinx.nix
 | 
					    ./ryujinx.nix
 | 
				
			||||||
    ./steam.nix
 | 
					    ./steam.nix
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,10 @@
 | 
				
			|||||||
  options.gaming.dwarf-fortress.enable = lib.mkEnableOption "Dwarf Fortress free edition.";
 | 
					  options.gaming.dwarf-fortress.enable = lib.mkEnableOption "Dwarf Fortress free edition.";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf config.gaming.dwarf-fortress.enable {
 | 
					  config = lib.mkIf config.gaming.dwarf-fortress.enable {
 | 
				
			||||||
    unfreePackages = [ "dwarf-fortress" ];
 | 
					    unfreePackages = [
 | 
				
			||||||
 | 
					      "dwarf-fortress"
 | 
				
			||||||
 | 
					      "phoebus-theme"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
    environment.systemPackages =
 | 
					    environment.systemPackages =
 | 
				
			||||||
      let
 | 
					      let
 | 
				
			||||||
        dfDesktopItem = pkgs.makeDesktopItem {
 | 
					        dfDesktopItem = pkgs.makeDesktopItem {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								modules/nixos/gaming/moonlight.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								modules/nixos/gaming/moonlight.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  pkgs,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  options.gaming.moonlight.enable = lib.mkEnableOption "Enable Moonlight game streaming client.";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.gaming.moonlight.enable {
 | 
				
			||||||
 | 
					    environment.systemPackages = with pkgs; [ moonlight-qt ];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -15,6 +15,7 @@
 | 
				
			|||||||
      "steam-original"
 | 
					      "steam-original"
 | 
				
			||||||
      "steamcmd"
 | 
					      "steamcmd"
 | 
				
			||||||
      "steam-run"
 | 
					      "steam-run"
 | 
				
			||||||
 | 
					      "steam-unwrapped"
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    programs.steam = {
 | 
					    programs.steam = {
 | 
				
			||||||
@@ -27,7 +28,7 @@
 | 
				
			|||||||
    environment.systemPackages = with pkgs; [
 | 
					    environment.systemPackages = with pkgs; [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Enable terminal interaction
 | 
					      # Enable terminal interaction
 | 
				
			||||||
      steamPackages.steamcmd
 | 
					      steamcmd
 | 
				
			||||||
      steam-tui
 | 
					      steam-tui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Overlay with performance monitoring
 | 
					      # Overlay with performance monitoring
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,6 +46,16 @@
 | 
				
			|||||||
      type = lib.types.str;
 | 
					      type = lib.types.str;
 | 
				
			||||||
      description = "Command to use for power options menu";
 | 
					      description = "Command to use for power options menu";
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    terminal = lib.mkOption {
 | 
				
			||||||
 | 
					      type = lib.types.nullOr lib.types.str;
 | 
				
			||||||
 | 
					      description = "Path to executable for terminal emulator program.";
 | 
				
			||||||
 | 
					      default = null;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    terminalLaunchCommand = lib.mkOption {
 | 
				
			||||||
 | 
					      type = lib.types.nullOr lib.types.str;
 | 
				
			||||||
 | 
					      description = "Command for using the terminal to launch a new window with a program.";
 | 
				
			||||||
 | 
					      default = null;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    wallpaper = lib.mkOption {
 | 
					    wallpaper = lib.mkOption {
 | 
				
			||||||
      type = lib.types.path;
 | 
					      type = lib.types.path;
 | 
				
			||||||
      description = "Wallpaper background image file";
 | 
					      description = "Wallpaper background image file";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@ in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    fonts.packages = with pkgs; [
 | 
					    fonts.packages = with pkgs; [
 | 
				
			||||||
      victor-mono # Used for Vim and Terminal
 | 
					      victor-mono # Used for Vim and Terminal
 | 
				
			||||||
      (nerdfonts.override { fonts = [ "Hack" ]; }) # For Polybar, Rofi
 | 
					      nerd-fonts.hack # For Polybar, Rofi
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    fonts.fontconfig.defaultFonts.monospace = [ fontName ];
 | 
					    fonts.fontconfig.defaultFonts.monospace = [ fontName ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,7 +42,7 @@
 | 
				
			|||||||
            module-margin = 1;
 | 
					            module-margin = 1;
 | 
				
			||||||
            modules-left = "i3";
 | 
					            modules-left = "i3";
 | 
				
			||||||
            modules-center = "xwindow";
 | 
					            modules-center = "xwindow";
 | 
				
			||||||
            modules-right = "mailcount network pulseaudio date keyboard power";
 | 
					            modules-right = "mailcount network pulseaudio date power";
 | 
				
			||||||
            cursor-click = "pointer";
 | 
					            cursor-click = "pointer";
 | 
				
			||||||
            cursor-scroll = "ns-resize";
 | 
					            cursor-scroll = "ns-resize";
 | 
				
			||||||
            enable-ipc = true;
 | 
					            enable-ipc = true;
 | 
				
			||||||
@@ -209,12 +209,6 @@
 | 
				
			|||||||
            label-foreground = config.theme.colors.base06;
 | 
					            label-foreground = config.theme.colors.base06;
 | 
				
			||||||
            # format-background = colors.background;
 | 
					            # format-background = colors.background;
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
          "module/keyboard" = {
 | 
					 | 
				
			||||||
            type = "custom/text";
 | 
					 | 
				
			||||||
            content = "";
 | 
					 | 
				
			||||||
            click-left = "doas systemctl restart keyd";
 | 
					 | 
				
			||||||
            content-foreground = config.theme.colors.base04;
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
          "module/power" = {
 | 
					          "module/power" = {
 | 
				
			||||||
            type = "custom/text";
 | 
					            type = "custom/text";
 | 
				
			||||||
            content = "  ";
 | 
					            content = "  ";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,7 @@ in
 | 
				
			|||||||
        cycle = true;
 | 
					        cycle = true;
 | 
				
			||||||
        location = "center";
 | 
					        location = "center";
 | 
				
			||||||
        pass = { };
 | 
					        pass = { };
 | 
				
			||||||
 | 
					        terminal = lib.mkIf pkgs.stdenv.isLinux config.terminal;
 | 
				
			||||||
        plugins = [
 | 
					        plugins = [
 | 
				
			||||||
          pkgs.rofi-calc
 | 
					          pkgs.rofi-calc
 | 
				
			||||||
          pkgs.rofi-emoji
 | 
					          pkgs.rofi-emoji
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,8 +36,6 @@ in
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
					  config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
				
			||||||
    sound.enable = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Enable PipeWire
 | 
					    # Enable PipeWire
 | 
				
			||||||
    services.pipewire = {
 | 
					    services.pipewire = {
 | 
				
			||||||
      enable = true;
 | 
					      enable = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,4 @@
 | 
				
			|||||||
{
 | 
					{ config, lib, ... }:
 | 
				
			||||||
  config,
 | 
					 | 
				
			||||||
  pkgs,
 | 
					 | 
				
			||||||
  lib,
 | 
					 | 
				
			||||||
  ...
 | 
					 | 
				
			||||||
}:
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf config.physical {
 | 
					  config = lib.mkIf config.physical {
 | 
				
			||||||
@@ -17,24 +12,30 @@
 | 
				
			|||||||
      autoRepeatInterval = 40;
 | 
					      autoRepeatInterval = 40;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Use capslock as escape and/or control
 | 
					    # Swap Caps-Lock with Escape when pressed or LCtrl when held/combined with others
 | 
				
			||||||
    services.keyd = {
 | 
					    # Inspired by: https://www.youtube.com/watch?v=XuQVbZ0wENE
 | 
				
			||||||
 | 
					    services.kanata = {
 | 
				
			||||||
      enable = true;
 | 
					      enable = true;
 | 
				
			||||||
      keyboards = {
 | 
					      keyboards.default = {
 | 
				
			||||||
        default = {
 | 
					        devices = [
 | 
				
			||||||
          ids = [ "*" ];
 | 
					          "/dev/input/by-id/usb-Logitech_Logitech_G710_Keyboard-event-kbd"
 | 
				
			||||||
          settings = {
 | 
					          "/dev/input/by-id/usb-Logitech_Logitech_G710_Keyboard-if01-event-kbd"
 | 
				
			||||||
            main = {
 | 
					        ];
 | 
				
			||||||
              capslock = "overload(control, esc)";
 | 
					        extraDefCfg = "process-unmapped-keys yes";
 | 
				
			||||||
            };
 | 
					        config = ''
 | 
				
			||||||
          };
 | 
					          (defsrc
 | 
				
			||||||
        };
 | 
					              caps
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					          (defalias
 | 
				
			||||||
 | 
					              escctrl (tap-hold-press 1000 1000 esc lctrl)
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					          (deflayer base
 | 
				
			||||||
 | 
					              @escctrl
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # For some reason, keyd doesn't restart properly when updating
 | 
					 | 
				
			||||||
    system.activationScripts.keyd.text = "${pkgs.systemd}/bin/systemctl restart keyd.service";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Enable num lock on login
 | 
					    # Enable num lock on login
 | 
				
			||||||
    home-manager.users.${config.user}.xsession.numlock.enable = true;
 | 
					    home-manager.users.${config.user}.xsession.numlock.enable = true;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,16 +37,16 @@
 | 
				
			|||||||
      # Set up screen position and rotation
 | 
					      # Set up screen position and rotation
 | 
				
			||||||
      setupCommands = ''
 | 
					      setupCommands = ''
 | 
				
			||||||
        ${pkgs.xorg.xrandr}/bin/xrandr --output DisplayPort-1 \
 | 
					        ${pkgs.xorg.xrandr}/bin/xrandr --output DisplayPort-1 \
 | 
				
			||||||
                                            --mode 1920x1200 \
 | 
					 | 
				
			||||||
                                            --pos 1920x0 \
 | 
					 | 
				
			||||||
                                            --rotate left \
 | 
					 | 
				
			||||||
                                        --output HDMI-A-0 \
 | 
					 | 
				
			||||||
                                            --primary \
 | 
					                                            --primary \
 | 
				
			||||||
                                            --mode 1920x1080 \
 | 
					 | 
				
			||||||
                                            --pos 0x560 \
 | 
					 | 
				
			||||||
                                            --rotate normal \
 | 
					                                            --rotate normal \
 | 
				
			||||||
 | 
					                                            --mode 2560x1440 \
 | 
				
			||||||
 | 
					                                            --rate 165 \
 | 
				
			||||||
 | 
					                                        --output DisplayPort-2 \
 | 
				
			||||||
 | 
					                                            --right-of DisplayPort-1 \
 | 
				
			||||||
 | 
					                                            --rotate left \
 | 
				
			||||||
                                        --output DVI-0 --off \
 | 
					                                        --output DVI-0 --off \
 | 
				
			||||||
                                        --output DVI-1 --off \
 | 
					                                        --output DVI-1 --off \
 | 
				
			||||||
 | 
					                                        || echo "xrandr failed"
 | 
				
			||||||
      '';
 | 
					      '';
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@
 | 
				
			|||||||
    # Cursor
 | 
					    # Cursor
 | 
				
			||||||
    home-manager.users.${config.user}.home.pointerCursor = {
 | 
					    home-manager.users.${config.user}.home.pointerCursor = {
 | 
				
			||||||
      name = "Adwaita";
 | 
					      name = "Adwaita";
 | 
				
			||||||
      package = pkgs.gnome3.adwaita-icon-theme;
 | 
					      package = pkgs.adwaita-icon-theme;
 | 
				
			||||||
      size = 24;
 | 
					      size = 24;
 | 
				
			||||||
      gtk.enable = true;
 | 
					      gtk.enable = true;
 | 
				
			||||||
      x11.enable = true;
 | 
					      x11.enable = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf (config.physical && !config.server) {
 | 
					  config = lib.mkIf (config.physical && !config.server) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Use power button to sleep instead of poweroff
 | 
				
			||||||
 | 
					    services.logind.powerKey = "suspend";
 | 
				
			||||||
 | 
					    services.logind.powerKeyLongPress = "poweroff";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Prevent wake from keyboard
 | 
					    # Prevent wake from keyboard
 | 
				
			||||||
    powerManagement.powerDownCommands = ''
 | 
					    powerManagement.powerDownCommands = ''
 | 
				
			||||||
      set +e
 | 
					      set +e
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,9 @@
 | 
				
			|||||||
{ config, lib, ... }:
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  pkgs,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  options = {
 | 
					  options = {
 | 
				
			||||||
@@ -8,7 +13,7 @@
 | 
				
			|||||||
  config = lib.mkIf (config.server && config.zfs.enable) {
 | 
					  config = lib.mkIf (config.server && config.zfs.enable) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Only use compatible Linux kernel, since ZFS can be behind
 | 
					    # Only use compatible Linux kernel, since ZFS can be behind
 | 
				
			||||||
    boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
 | 
					    boot.kernelPackages = pkgs.linuxPackages; # Defaults to latest LTS
 | 
				
			||||||
    boot.kernelParams = [ "nohibernate" ];
 | 
					    boot.kernelParams = [ "nohibernate" ];
 | 
				
			||||||
    boot.supportedFilesystems = [ "zfs" ];
 | 
					    boot.supportedFilesystems = [ "zfs" ];
 | 
				
			||||||
    services.prometheus.exporters.zfs.enable = config.prometheus.exporters.enable;
 | 
					    services.prometheus.exporters.zfs.enable = config.prometheus.exporters.enable;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										74
									
								
								modules/nixos/services/actualbudget.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								modules/nixos/services/actualbudget.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					{ config, lib, ... }:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  options = {
 | 
				
			||||||
 | 
					    services.actualbudget = {
 | 
				
			||||||
 | 
					      enable = lib.mkEnableOption "ActualBudget budgeting service";
 | 
				
			||||||
 | 
					      port = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.port;
 | 
				
			||||||
 | 
					        description = "Port to use for the localhost";
 | 
				
			||||||
 | 
					        default = 5006;
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.services.actualbudget.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    virtualisation.podman.enable = lib.mkDefault true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    users.users.actualbudget = {
 | 
				
			||||||
 | 
					      isSystemUser = true;
 | 
				
			||||||
 | 
					      group = "shared";
 | 
				
			||||||
 | 
					      uid = 980;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Create budget directory, allowing others to manage it
 | 
				
			||||||
 | 
					    systemd.tmpfiles.rules = [
 | 
				
			||||||
 | 
					      "d /var/lib/actualbudget 0770 actualbudget shared"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    virtualisation.oci-containers.containers.actualbudget = {
 | 
				
			||||||
 | 
					      workdir = null;
 | 
				
			||||||
 | 
					      volumes = [ "/var/lib/actualbudget:/data" ];
 | 
				
			||||||
 | 
					      user = "${toString (builtins.toString config.users.users.actualbudget.uid)}";
 | 
				
			||||||
 | 
					      pull = "missing";
 | 
				
			||||||
 | 
					      privileged = false;
 | 
				
			||||||
 | 
					      ports = [ "127.0.0.1:${builtins.toString config.services.actualbudget.port}:5006" ];
 | 
				
			||||||
 | 
					      networks = [ ];
 | 
				
			||||||
 | 
					      log-driver = "journald";
 | 
				
			||||||
 | 
					      labels = {
 | 
				
			||||||
 | 
					        app = "actualbudget";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      image = "ghcr.io/actualbudget/actual-server:25.1.0";
 | 
				
			||||||
 | 
					      hostname = null;
 | 
				
			||||||
 | 
					      environmentFiles = [ ];
 | 
				
			||||||
 | 
					      environment = {
 | 
				
			||||||
 | 
					        DEBUG = "actual:config"; # Enable debug logging
 | 
				
			||||||
 | 
					        ACTUAL_TRUSTED_PROXIES = builtins.concatStringsSep "," [ "127.0.0.1" ];
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      dependsOn = [ ];
 | 
				
			||||||
 | 
					      autoStart = true;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Allow web traffic to Caddy
 | 
				
			||||||
 | 
					    caddy.routes = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        match = [ { host = [ config.hostnames.budget ]; } ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [ { dial = "localhost:${builtins.toString config.services.actualbudget.port}"; } ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.budget ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Backups
 | 
				
			||||||
 | 
					    services.restic.backups.default.paths = [ "/var/lib/actualbudget" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -14,6 +14,11 @@ let
 | 
				
			|||||||
      url = "localhost:7878";
 | 
					      url = "localhost:7878";
 | 
				
			||||||
      apiKey = config.secrets.radarrApiKey.dest;
 | 
					      apiKey = config.secrets.radarrApiKey.dest;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    readarr = {
 | 
				
			||||||
 | 
					      exportarrPort = "9711";
 | 
				
			||||||
 | 
					      url = "localhost:8787";
 | 
				
			||||||
 | 
					      apiKey = config.secrets.readarrApiKey.dest;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    sonarr = {
 | 
					    sonarr = {
 | 
				
			||||||
      exportarrPort = "9708";
 | 
					      exportarrPort = "9708";
 | 
				
			||||||
      url = "localhost:8989";
 | 
					      url = "localhost:8989";
 | 
				
			||||||
@@ -39,37 +44,44 @@ in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf config.arrs.enable {
 | 
					  config = lib.mkIf config.arrs.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Broken on 2024-12-07
 | 
				
			||||||
 | 
					    # https://discourse.nixos.org/t/solved-sonarr-is-broken-in-24-11-unstable-aka-how-the-hell-do-i-use-nixpkgs-config-permittedinsecurepackages/
 | 
				
			||||||
 | 
					    insecurePackages = [
 | 
				
			||||||
 | 
					      "aspnetcore-runtime-wrapped-6.0.36"
 | 
				
			||||||
 | 
					      "aspnetcore-runtime-6.0.36"
 | 
				
			||||||
 | 
					      "dotnet-sdk-wrapped-6.0.428"
 | 
				
			||||||
 | 
					      "dotnet-sdk-6.0.428"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services = {
 | 
					    services = {
 | 
				
			||||||
      bazarr = {
 | 
					      bazarr = {
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
        group = "media";
 | 
					        group = "shared";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      jellyseerr.enable = true;
 | 
					      jellyseerr.enable = true;
 | 
				
			||||||
      prowlarr.enable = true;
 | 
					      prowlarr.enable = true;
 | 
				
			||||||
      sabnzbd = {
 | 
					      sabnzbd = {
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
        group = "media";
 | 
					        group = "shared";
 | 
				
			||||||
        # The config file must be editable within the application
 | 
					        # The config file must be editable within the application
 | 
				
			||||||
        # It contains server configs and credentials
 | 
					        # It contains server configs and credentials
 | 
				
			||||||
        configFile = "/data/downloads/sabnzbd/sabnzbd.ini";
 | 
					        configFile = "/data/downloads/sabnzbd/sabnzbd.ini";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      sonarr = {
 | 
					      sonarr = {
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
        group = "media";
 | 
					        group = "shared";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      radarr = {
 | 
					      radarr = {
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
        group = "media";
 | 
					        group = "shared";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      readarr = {
 | 
				
			||||||
 | 
					        enable = true;
 | 
				
			||||||
 | 
					        group = "shared";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Create a media group to be shared between services
 | 
					    # Allows shared group to read/write the sabnzbd directory
 | 
				
			||||||
    users.groups.media = { };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Give the human user access to the media group
 | 
					 | 
				
			||||||
    users.users.${config.user}.extraGroups = [ "media" ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Allows media group to read/write the sabnzbd directory
 | 
					 | 
				
			||||||
    users.users.sabnzbd.homeMode = "0770";
 | 
					    users.users.sabnzbd.homeMode = "0770";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    unfreePackages = [ "unrar" ]; # Required as a dependency for sabnzbd
 | 
					    unfreePackages = [ "unrar" ]; # Required as a dependency for sabnzbd
 | 
				
			||||||
@@ -110,6 +122,21 @@ in
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        group = "download";
 | 
				
			||||||
 | 
					        match = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            host = [ config.hostnames.download ];
 | 
				
			||||||
 | 
					            path = [ "/readarr*" ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [ { dial = arrConfig.readarr.url; } ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        group = "download";
 | 
					        group = "download";
 | 
				
			||||||
        match = [
 | 
					        match = [
 | 
				
			||||||
@@ -223,6 +250,11 @@ in
 | 
				
			|||||||
      dest = "/var/private/radarr-api";
 | 
					      dest = "/var/private/radarr-api";
 | 
				
			||||||
      prefix = "API_KEY=";
 | 
					      prefix = "API_KEY=";
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    secrets.readarrApiKey = {
 | 
				
			||||||
 | 
					      source = ../../../private/radarr-api-key.age;
 | 
				
			||||||
 | 
					      dest = "/var/private/readarr-api";
 | 
				
			||||||
 | 
					      prefix = "API_KEY=";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    secrets.sonarrApiKey = {
 | 
					    secrets.sonarrApiKey = {
 | 
				
			||||||
      source = ../../../private/sonarr-api-key.age;
 | 
					      source = ../../../private/sonarr-api-key.age;
 | 
				
			||||||
      dest = "/var/private/sonarr-api";
 | 
					      dest = "/var/private/sonarr-api";
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										29
									
								
								modules/nixos/services/audiobookshelf.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								modules/nixos/services/audiobookshelf.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					{ config, lib, ... }:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.services.audiobookshelf.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    services.audiobookshelf = {
 | 
				
			||||||
 | 
					      group = "shared";
 | 
				
			||||||
 | 
					      dataDir = "audiobookshelf";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Allow web traffic to Caddy
 | 
				
			||||||
 | 
					    caddy.routes = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        match = [ { host = [ config.hostnames.audiobooks ]; } ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [ { dial = "localhost:${builtins.toString config.services.audiobookshelf.port}"; } ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.audiobooks ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -22,6 +22,11 @@
 | 
				
			|||||||
        description = "S3 access key ID for backups";
 | 
					        description = "S3 access key ID for backups";
 | 
				
			||||||
        default = null;
 | 
					        default = null;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					      resticBucket = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.nullOr lib.types.str;
 | 
				
			||||||
 | 
					        description = "S3 bucket for restic backups";
 | 
				
			||||||
 | 
					        default = null;
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -44,6 +49,10 @@
 | 
				
			|||||||
      settings = { };
 | 
					      settings = { };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Broken on 2024-08-23
 | 
				
			||||||
 | 
					    # https://github.com/NixOS/nixpkgs/commit/0875d0ce1c778f344cd2377a5337a45385d6ffa0
 | 
				
			||||||
 | 
					    insecurePackages = [ "litestream-0.3.13" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Wait for secret to exist
 | 
					    # Wait for secret to exist
 | 
				
			||||||
    systemd.services.litestream = {
 | 
					    systemd.services.litestream = {
 | 
				
			||||||
      after = [ "backup-secret.service" ];
 | 
					      after = [ "backup-secret.service" ];
 | 
				
			||||||
@@ -65,5 +74,30 @@
 | 
				
			|||||||
    #   timerConfig = { OnCalendar = "00:05:00"; };
 | 
					    #   timerConfig = { OnCalendar = "00:05:00"; };
 | 
				
			||||||
    #   environmentFile = backup.s3File;
 | 
					    #   environmentFile = backup.s3File;
 | 
				
			||||||
    # };
 | 
					    # };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    secrets.s3-glacier = {
 | 
				
			||||||
 | 
					      source = ../../../private/s3-glacier.age;
 | 
				
			||||||
 | 
					      dest = "${config.secretsDirectory}/s3-glacier";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    secrets.restic = {
 | 
				
			||||||
 | 
					      source = ../../../private/restic.age;
 | 
				
			||||||
 | 
					      dest = "${config.secretsDirectory}/restic";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    services.restic.backups = lib.mkIf (config.backup.s3.resticBucket != null) {
 | 
				
			||||||
 | 
					      default = {
 | 
				
			||||||
 | 
					        repository = "s3:s3.us-east-1.amazonaws.com/${config.backup.s3.resticBucket}/restic";
 | 
				
			||||||
 | 
					        paths = [ ];
 | 
				
			||||||
 | 
					        environmentFile = config.secrets.s3-glacier.dest;
 | 
				
			||||||
 | 
					        passwordFile = config.secrets.restic.dest;
 | 
				
			||||||
 | 
					        pruneOpts = [
 | 
				
			||||||
 | 
					          "--keep-daily 14"
 | 
				
			||||||
 | 
					          "--keep-weekly 6"
 | 
				
			||||||
 | 
					          "--keep-monthly 12"
 | 
				
			||||||
 | 
					          "--keep-yearly 100"
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,7 @@ let
 | 
				
			|||||||
    config.hostnames.content
 | 
					    config.hostnames.content
 | 
				
			||||||
    config.hostnames.books
 | 
					    config.hostnames.books
 | 
				
			||||||
    config.hostnames.download
 | 
					    config.hostnames.download
 | 
				
			||||||
 | 
					    config.hostnames.photos
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
  mkRecord = service: "${service}       A       ${localIp}";
 | 
					  mkRecord = service: "${service}       A       ${localIp}";
 | 
				
			||||||
  localRecords = lib.concatLines (map mkRecord localServices);
 | 
					  localRecords = lib.concatLines (map mkRecord localServices);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,7 +46,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Force Caddy to 403 if not coming from allowlisted source
 | 
					    # Force Caddy to 403 if not coming from allowlisted source
 | 
				
			||||||
    caddy.cidrAllowlist = [ "127.0.0.1/32" ];
 | 
					    caddy.cidrAllowlist = [ "127.0.0.1/32" ];
 | 
				
			||||||
    caddy.routes = [
 | 
					    caddy.routes = lib.mkBefore [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        match = [ { not = [ { remote_ip.ranges = config.caddy.cidrAllowlist; } ]; } ];
 | 
					        match = [ { not = [ { remote_ip.ranges = config.caddy.cidrAllowlist; } ]; } ];
 | 
				
			||||||
        handle = [
 | 
					        handle = [
 | 
				
			||||||
@@ -58,38 +58,143 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.caddy = {
 | 
					    services.caddy =
 | 
				
			||||||
      adapter = "''"; # Required to enable JSON
 | 
					      let
 | 
				
			||||||
      configFile = pkgs.writeText "Caddyfile" (
 | 
					        default_logger_name = "other";
 | 
				
			||||||
        builtins.toJSON {
 | 
					        roll_size_mb = 25;
 | 
				
			||||||
          apps.http.servers.main = {
 | 
					        # Extract list of hostnames (fqdns) from current caddy routes
 | 
				
			||||||
            listen = [ ":443" ];
 | 
					        getHostnameFromMatch = match: if (lib.hasAttr "host" match) then match.host else [ ];
 | 
				
			||||||
 | 
					        getHostnameFromRoute =
 | 
				
			||||||
 | 
					          route:
 | 
				
			||||||
 | 
					          if (lib.hasAttr "match" route) then (lib.concatMap getHostnameFromMatch route.match) else [ ];
 | 
				
			||||||
 | 
					        hostnames_non_unique = lib.concatMap getHostnameFromRoute config.caddy.routes;
 | 
				
			||||||
 | 
					        hostnames = lib.unique hostnames_non_unique;
 | 
				
			||||||
 | 
					        # Create attrset of subdomains to their fqdns
 | 
				
			||||||
 | 
					        hostname_map = builtins.listToAttrs (
 | 
				
			||||||
 | 
					          map (hostname: {
 | 
				
			||||||
 | 
					            name = builtins.head (lib.splitString "." hostname);
 | 
				
			||||||
 | 
					            value = hostname;
 | 
				
			||||||
 | 
					          }) hostnames
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      in
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        adapter = "''"; # Required to enable JSON
 | 
				
			||||||
 | 
					        configFile = pkgs.writeText "Caddyfile" (
 | 
				
			||||||
 | 
					          builtins.toJSON {
 | 
				
			||||||
 | 
					            apps.http.servers.main = {
 | 
				
			||||||
 | 
					              listen = [ ":443" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # These routes are pulled from the rest of this repo
 | 
					              # These routes are pulled from the rest of this repo
 | 
				
			||||||
            routes = config.caddy.routes;
 | 
					              routes = config.caddy.routes;
 | 
				
			||||||
            errors.routes = config.caddy.blocks;
 | 
					              errors.routes = config.caddy.blocks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            logs = { }; # Uncommenting collects access logs
 | 
					              # Uncommenting collects access logs
 | 
				
			||||||
          };
 | 
					              logs = {
 | 
				
			||||||
          apps.http.servers.metrics = { }; # Enables Prometheus metrics
 | 
					                inherit default_logger_name;
 | 
				
			||||||
          apps.tls.automation.policies = config.caddy.tlsPolicies;
 | 
					                # Invert hostnames keys and values
 | 
				
			||||||
 | 
					                logger_names = lib.mapAttrs' (name: value: {
 | 
				
			||||||
          # Setup logging to file
 | 
					                  name = value;
 | 
				
			||||||
          logging.logs.main = {
 | 
					                  value = name;
 | 
				
			||||||
            encoder = {
 | 
					                }) hostname_map;
 | 
				
			||||||
              format = "console";
 | 
					              };
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            writer = {
 | 
					            apps.http.servers.metrics = { }; # Enables Prometheus metrics
 | 
				
			||||||
              output = "file";
 | 
					            apps.tls.automation.policies = config.caddy.tlsPolicies;
 | 
				
			||||||
              filename = "${config.services.caddy.logDir}/caddy.log";
 | 
					
 | 
				
			||||||
              roll = true;
 | 
					            # Setup logging to journal and files
 | 
				
			||||||
              roll_size_mb = 1;
 | 
					            logging.logs =
 | 
				
			||||||
            };
 | 
					              {
 | 
				
			||||||
            level = "INFO";
 | 
					                # System logs and catch-all
 | 
				
			||||||
          };
 | 
					                # Must be called `default` to override Caddy's built-in default logger
 | 
				
			||||||
        }
 | 
					                default = {
 | 
				
			||||||
      );
 | 
					                  level = "INFO";
 | 
				
			||||||
    };
 | 
					                  encoder.format = "console";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "stderr";
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  exclude = (map (hostname: "http.log.access.${hostname}") (builtins.attrNames hostname_map)) ++ [
 | 
				
			||||||
 | 
					                    "http.log.access.${default_logger_name}"
 | 
				
			||||||
 | 
					                  ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                # This is for the default access logs (anything not captured by hostname)
 | 
				
			||||||
 | 
					                other = {
 | 
				
			||||||
 | 
					                  level = "INFO";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/other.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  include = [ "http.log.access.${default_logger_name}" ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                # This is for using the Caddy API, which will probably never happen
 | 
				
			||||||
 | 
					                admin = {
 | 
				
			||||||
 | 
					                  level = "INFO";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/admin.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  include = [ "admin" ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                # This is for TLS cert management tracking
 | 
				
			||||||
 | 
					                tls = {
 | 
				
			||||||
 | 
					                  level = "INFO";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/tls.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  include = [ "tls" ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                # This is for debugging
 | 
				
			||||||
 | 
					                debug = {
 | 
				
			||||||
 | 
					                  level = "DEBUG";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/debug.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    roll_keep = 1;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              # These are the access logs for individual hostnames
 | 
				
			||||||
 | 
					              // (lib.mapAttrs (name: value: {
 | 
				
			||||||
 | 
					                level = "INFO";
 | 
				
			||||||
 | 
					                encoder.format = "json";
 | 
				
			||||||
 | 
					                writer = {
 | 
				
			||||||
 | 
					                  output = "file";
 | 
				
			||||||
 | 
					                  filename = "${config.services.caddy.logDir}/${name}-access.log";
 | 
				
			||||||
 | 
					                  roll = true;
 | 
				
			||||||
 | 
					                  inherit roll_size_mb;
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                include = [ "http.log.access.${name}" ];
 | 
				
			||||||
 | 
					              }) hostname_map)
 | 
				
			||||||
 | 
					              # We also capture just the errors separately for easy debugging
 | 
				
			||||||
 | 
					              // (lib.mapAttrs' (name: value: {
 | 
				
			||||||
 | 
					                name = "${name}-error";
 | 
				
			||||||
 | 
					                value = {
 | 
				
			||||||
 | 
					                  level = "ERROR";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/${name}-error.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  include = [ "http.log.access.${name}" ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					              }) hostname_map);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    systemd.services.caddy.serviceConfig = {
 | 
					    systemd.services.caddy.serviceConfig = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ in
 | 
				
			|||||||
  config = lib.mkIf config.services.calibre-web.enable {
 | 
					  config = lib.mkIf config.services.calibre-web.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.calibre-web = {
 | 
					    services.calibre-web = {
 | 
				
			||||||
 | 
					      group = "shared";
 | 
				
			||||||
      openFirewall = true;
 | 
					      openFirewall = true;
 | 
				
			||||||
      options = {
 | 
					      options = {
 | 
				
			||||||
        reverseProxyAuth.enable = false;
 | 
					        reverseProxyAuth.enable = false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,6 +78,8 @@ in
 | 
				
			|||||||
        issuers = [
 | 
					        issuers = [
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            module = "acme";
 | 
					            module = "acme";
 | 
				
			||||||
 | 
					            email = "acme@${config.mail.server}";
 | 
				
			||||||
 | 
					            account_key = "{env.ACME_ACCOUNT_KEY}";
 | 
				
			||||||
            challenges = {
 | 
					            challenges = {
 | 
				
			||||||
              dns = {
 | 
					              dns = {
 | 
				
			||||||
                provider = {
 | 
					                provider = {
 | 
				
			||||||
@@ -92,7 +94,18 @@ in
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    # Allow Caddy to read Cloudflare API key for DNS validation
 | 
					    # Allow Caddy to read Cloudflare API key for DNS validation
 | 
				
			||||||
    systemd.services.caddy.serviceConfig.EnvironmentFile = config.secrets.cloudflare-api.dest;
 | 
					    systemd.services.caddy.serviceConfig.EnvironmentFile = [
 | 
				
			||||||
 | 
					      config.secrets.cloudflare-api.dest
 | 
				
			||||||
 | 
					      config.secrets.letsencrypt-key.dest
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Private key is used for LetsEncrypt
 | 
				
			||||||
 | 
					    secrets.letsencrypt-key = {
 | 
				
			||||||
 | 
					      source = ../../../private/letsencrypt-key.age;
 | 
				
			||||||
 | 
					      dest = "${config.secretsDirectory}/letsencrypt-key";
 | 
				
			||||||
 | 
					      owner = "caddy";
 | 
				
			||||||
 | 
					      group = "caddy";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # API key must have access to modify Cloudflare DNS records
 | 
					    # API key must have access to modify Cloudflare DNS records
 | 
				
			||||||
    secrets.cloudflare-api = {
 | 
					    secrets.cloudflare-api = {
 | 
				
			||||||
@@ -104,8 +117,14 @@ in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Wait for secret to exist
 | 
					    # Wait for secret to exist
 | 
				
			||||||
    systemd.services.caddy = {
 | 
					    systemd.services.caddy = {
 | 
				
			||||||
      after = [ "cloudflare-api-secret.service" ];
 | 
					      after = [
 | 
				
			||||||
      requires = [ "cloudflare-api-secret.service" ];
 | 
					        "cloudflare-api-secret.service"
 | 
				
			||||||
 | 
					        "letsencrypt-key-secret.service"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					      requires = [
 | 
				
			||||||
 | 
					        "cloudflare-api-secret.service"
 | 
				
			||||||
 | 
					        "letsencrypt-key-secret.service"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Allows Nextcloud to trust Cloudflare IPs
 | 
					    # Allows Nextcloud to trust Cloudflare IPs
 | 
				
			||||||
@@ -116,6 +135,9 @@ in
 | 
				
			|||||||
      [ "127.0.0.1" ] ++ cloudflareIpRanges
 | 
					      [ "127.0.0.1" ] ++ cloudflareIpRanges
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Using dyn-dns instead of ddclient because I can't find a way to choose
 | 
				
			||||||
 | 
					    # between proxied and non-proxied records for Cloudflare using just
 | 
				
			||||||
 | 
					    # ddclient.
 | 
				
			||||||
    services.cloudflare-dyndns =
 | 
					    services.cloudflare-dyndns =
 | 
				
			||||||
      lib.mkIf ((builtins.length config.services.cloudflare-dyndns.domains) > 0)
 | 
					      lib.mkIf ((builtins.length config.services.cloudflare-dyndns.domains) > 0)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,8 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  imports = [
 | 
					  imports = [
 | 
				
			||||||
 | 
					    ./actualbudget.nix
 | 
				
			||||||
 | 
					    ./audiobookshelf.nix
 | 
				
			||||||
    ./arr.nix
 | 
					    ./arr.nix
 | 
				
			||||||
    ./backups.nix
 | 
					    ./backups.nix
 | 
				
			||||||
    ./bind.nix
 | 
					    ./bind.nix
 | 
				
			||||||
@@ -12,7 +14,9 @@
 | 
				
			|||||||
    ./calibre.nix
 | 
					    ./calibre.nix
 | 
				
			||||||
    ./cloudflare-tunnel.nix
 | 
					    ./cloudflare-tunnel.nix
 | 
				
			||||||
    ./cloudflare.nix
 | 
					    ./cloudflare.nix
 | 
				
			||||||
 | 
					    ./filebrowser.nix
 | 
				
			||||||
    ./identity.nix
 | 
					    ./identity.nix
 | 
				
			||||||
 | 
					    ./immich.nix
 | 
				
			||||||
    ./irc.nix
 | 
					    ./irc.nix
 | 
				
			||||||
    ./gitea-runner.nix
 | 
					    ./gitea-runner.nix
 | 
				
			||||||
    ./gitea.nix
 | 
					    ./gitea.nix
 | 
				
			||||||
@@ -26,6 +30,7 @@
 | 
				
			|||||||
    ./n8n.nix
 | 
					    ./n8n.nix
 | 
				
			||||||
    ./netdata.nix
 | 
					    ./netdata.nix
 | 
				
			||||||
    ./nextcloud.nix
 | 
					    ./nextcloud.nix
 | 
				
			||||||
 | 
					    ./ntfy.nix
 | 
				
			||||||
    ./paperless.nix
 | 
					    ./paperless.nix
 | 
				
			||||||
    ./postgresql.nix
 | 
					    ./postgresql.nix
 | 
				
			||||||
    ./prometheus.nix
 | 
					    ./prometheus.nix
 | 
				
			||||||
@@ -33,6 +38,7 @@
 | 
				
			|||||||
    ./secrets.nix
 | 
					    ./secrets.nix
 | 
				
			||||||
    ./sshd.nix
 | 
					    ./sshd.nix
 | 
				
			||||||
    ./transmission.nix
 | 
					    ./transmission.nix
 | 
				
			||||||
 | 
					    ./uptime-kuma.nix
 | 
				
			||||||
    ./vaultwarden.nix
 | 
					    ./vaultwarden.nix
 | 
				
			||||||
    ./victoriametrics.nix
 | 
					    ./victoriametrics.nix
 | 
				
			||||||
    ./wireguard.nix
 | 
					    ./wireguard.nix
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										68
									
								
								modules/nixos/services/filebrowser.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								modules/nixos/services/filebrowser.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  pkgs,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
 | 
					let
 | 
				
			||||||
 | 
					  dataDir = "/var/lib/filebrowser";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  settings = {
 | 
				
			||||||
 | 
					    port = 8020;
 | 
				
			||||||
 | 
					    baseURL = "";
 | 
				
			||||||
 | 
					    address = "";
 | 
				
			||||||
 | 
					    log = "stdout";
 | 
				
			||||||
 | 
					    database = "${dataDir}/filebrowser.db";
 | 
				
			||||||
 | 
					    root = "";
 | 
				
			||||||
 | 
					    "auth.method" = "json";
 | 
				
			||||||
 | 
					    username = config.user;
 | 
				
			||||||
 | 
					    # Generate password: htpasswd -nBC 10 "" | tr -d ':\n'
 | 
				
			||||||
 | 
					    password = "$2y$10$ze1cMob0k6pnXRjLowYfZOVZWg4G.dsPtH3TohbUeEbI0sdkG9.za";
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					in
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  options.filebrowser.enable = lib.mkEnableOption "Use Filebrowser.";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.filebrowser.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    environment.etc."filebrowser/.filebrowser.json".text = builtins.toJSON settings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    systemd.services.filebrowser = lib.mkIf config.filebrowser.enable {
 | 
				
			||||||
 | 
					      description = "Filebrowser cloud file services";
 | 
				
			||||||
 | 
					      after = [ "network.target" ];
 | 
				
			||||||
 | 
					      wantedBy = [ "multi-user.target" ];
 | 
				
			||||||
 | 
					      startLimitIntervalSec = 14400;
 | 
				
			||||||
 | 
					      startLimitBurst = 10;
 | 
				
			||||||
 | 
					      serviceConfig = {
 | 
				
			||||||
 | 
					        ExecStart = "${pkgs.filebrowser}/bin/filebrowser";
 | 
				
			||||||
 | 
					        DynamicUser = true;
 | 
				
			||||||
 | 
					        Group = "shared";
 | 
				
			||||||
 | 
					        ReadWritePaths = [ dataDir ];
 | 
				
			||||||
 | 
					        StateDirectory = [ "filebrowser" ];
 | 
				
			||||||
 | 
					        Restart = "on-failure";
 | 
				
			||||||
 | 
					        RestartPreventExitStatus = 1;
 | 
				
			||||||
 | 
					        RestartSec = "5s";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      path = [ pkgs.getent ]; # Fix: getent not found in $PATH
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    caddy.routes = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        match = [ { host = [ config.hostnames.files ]; } ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [ { dial = "localhost:${builtins.toString settings.port}"; } ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.files ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -53,6 +53,7 @@ in
 | 
				
			|||||||
            uid = promUid;
 | 
					            uid = promUid;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					        # TODO: Add option to pull services from a list like Caddy does
 | 
				
			||||||
        dashboards.settings.providers = [
 | 
					        dashboards.settings.providers = [
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            name = "test";
 | 
					            name = "test";
 | 
				
			||||||
@@ -368,6 +369,18 @@ in
 | 
				
			|||||||
                          range = true;
 | 
					                          range = true;
 | 
				
			||||||
                          refId = "C";
 | 
					                          refId = "C";
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                          datasource = {
 | 
				
			||||||
 | 
					                            type = "prometheus";
 | 
				
			||||||
 | 
					                            uid = promUid;
 | 
				
			||||||
 | 
					                          };
 | 
				
			||||||
 | 
					                          editorMode = "code";
 | 
				
			||||||
 | 
					                          expr = "readarr_system_status";
 | 
				
			||||||
 | 
					                          hide = false;
 | 
				
			||||||
 | 
					                          legendFormat = "Readarr";
 | 
				
			||||||
 | 
					                          range = true;
 | 
				
			||||||
 | 
					                          refId = "F";
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                          datasource = {
 | 
					                          datasource = {
 | 
				
			||||||
                            type = "prometheus";
 | 
					                            type = "prometheus";
 | 
				
			||||||
@@ -669,7 +682,7 @@ in
 | 
				
			|||||||
                          };
 | 
					                          };
 | 
				
			||||||
                          editorMode = "code";
 | 
					                          editorMode = "code";
 | 
				
			||||||
                          exemplar = false;
 | 
					                          exemplar = false;
 | 
				
			||||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[1d])'';
 | 
					                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[1d])'';
 | 
				
			||||||
                          hide = false;
 | 
					                          hide = false;
 | 
				
			||||||
                          instant = false;
 | 
					                          instant = false;
 | 
				
			||||||
                          interval = "";
 | 
					                          interval = "";
 | 
				
			||||||
@@ -683,7 +696,7 @@ in
 | 
				
			|||||||
                            uid = promUid;
 | 
					                            uid = promUid;
 | 
				
			||||||
                          };
 | 
					                          };
 | 
				
			||||||
                          editorMode = "code";
 | 
					                          editorMode = "code";
 | 
				
			||||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[7d])'';
 | 
					                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[7d])'';
 | 
				
			||||||
                          hide = false;
 | 
					                          hide = false;
 | 
				
			||||||
                          legendFormat = "Past Week";
 | 
					                          legendFormat = "Past Week";
 | 
				
			||||||
                          range = true;
 | 
					                          range = true;
 | 
				
			||||||
@@ -695,7 +708,7 @@ in
 | 
				
			|||||||
                            uid = promUid;
 | 
					                            uid = promUid;
 | 
				
			||||||
                          };
 | 
					                          };
 | 
				
			||||||
                          editorMode = "code";
 | 
					                          editorMode = "code";
 | 
				
			||||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[30d])'';
 | 
					                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[30d])'';
 | 
				
			||||||
                          hide = false;
 | 
					                          hide = false;
 | 
				
			||||||
                          legendFormat = "Past Month";
 | 
					                          legendFormat = "Past Month";
 | 
				
			||||||
                          range = true;
 | 
					                          range = true;
 | 
				
			||||||
@@ -819,6 +832,28 @@ in
 | 
				
			|||||||
                              }
 | 
					                              }
 | 
				
			||||||
                            ];
 | 
					                            ];
 | 
				
			||||||
                          }
 | 
					                          }
 | 
				
			||||||
 | 
					                          {
 | 
				
			||||||
 | 
					                            matcher = {
 | 
				
			||||||
 | 
					                              id = "byName";
 | 
				
			||||||
 | 
					                              options = "localhost:8787";
 | 
				
			||||||
 | 
					                            };
 | 
				
			||||||
 | 
					                            properties = [
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "displayName";
 | 
				
			||||||
 | 
					                                value = "Readarr";
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "links";
 | 
				
			||||||
 | 
					                                value = [
 | 
				
			||||||
 | 
					                                  {
 | 
				
			||||||
 | 
					                                    targetBlank = true;
 | 
				
			||||||
 | 
					                                    title = "";
 | 
				
			||||||
 | 
					                                    url = "https://${config.hostnames.download}/readarr";
 | 
				
			||||||
 | 
					                                  }
 | 
				
			||||||
 | 
					                                ];
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                            ];
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
                          {
 | 
					                          {
 | 
				
			||||||
                            matcher = {
 | 
					                            matcher = {
 | 
				
			||||||
                              id = "byName";
 | 
					                              id = "byName";
 | 
				
			||||||
@@ -1083,6 +1118,50 @@ in
 | 
				
			|||||||
                              }
 | 
					                              }
 | 
				
			||||||
                            ];
 | 
					                            ];
 | 
				
			||||||
                          }
 | 
					                          }
 | 
				
			||||||
 | 
					                          {
 | 
				
			||||||
 | 
					                            matcher = {
 | 
				
			||||||
 | 
					                              id = "byName";
 | 
				
			||||||
 | 
					                              options = "localhost:${builtins.toString config.services.paperless.port}";
 | 
				
			||||||
 | 
					                            };
 | 
				
			||||||
 | 
					                            properties = [
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "displayName";
 | 
				
			||||||
 | 
					                                value = "Paperless";
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "links";
 | 
				
			||||||
 | 
					                                value = [
 | 
				
			||||||
 | 
					                                  {
 | 
				
			||||||
 | 
					                                    targetBlank = true;
 | 
				
			||||||
 | 
					                                    title = "";
 | 
				
			||||||
 | 
					                                    url = "https://${config.hostnames.paperless}";
 | 
				
			||||||
 | 
					                                  }
 | 
				
			||||||
 | 
					                                ];
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                            ];
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
 | 
					                          {
 | 
				
			||||||
 | 
					                            matcher = {
 | 
				
			||||||
 | 
					                              id = "byName";
 | 
				
			||||||
 | 
					                              options = "localhost:${builtins.toString config.services.audiobookshelf.port}";
 | 
				
			||||||
 | 
					                            };
 | 
				
			||||||
 | 
					                            properties = [
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "displayName";
 | 
				
			||||||
 | 
					                                value = "Audiobookshelf";
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "links";
 | 
				
			||||||
 | 
					                                value = [
 | 
				
			||||||
 | 
					                                  {
 | 
				
			||||||
 | 
					                                    targetBlank = true;
 | 
				
			||||||
 | 
					                                    title = "";
 | 
				
			||||||
 | 
					                                    url = "https://${config.hostnames.audiobooks}";
 | 
				
			||||||
 | 
					                                  }
 | 
				
			||||||
 | 
					                                ];
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                            ];
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
                        ];
 | 
					                        ];
 | 
				
			||||||
                      };
 | 
					                      };
 | 
				
			||||||
                      gridPos = {
 | 
					                      gridPos = {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										48
									
								
								modules/nixos/services/immich.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								modules/nixos/services/immich.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					{ config, lib, ... }:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.services.immich.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    services.immich = {
 | 
				
			||||||
 | 
					      port = 2283;
 | 
				
			||||||
 | 
					      group = "shared";
 | 
				
			||||||
 | 
					      database.enable = true;
 | 
				
			||||||
 | 
					      redis.enable = true;
 | 
				
			||||||
 | 
					      machine-learning.enable = true;
 | 
				
			||||||
 | 
					      machine-learning.environment = { };
 | 
				
			||||||
 | 
					      mediaLocation = "/data/images";
 | 
				
			||||||
 | 
					      secretsFile = null;
 | 
				
			||||||
 | 
					      settings.server.externalDomain = "https://${config.hostnames.photos}";
 | 
				
			||||||
 | 
					      environment = {
 | 
				
			||||||
 | 
					        IMMICH_ENV = "production";
 | 
				
			||||||
 | 
					        IMMICH_LOG_LEVEL = "log";
 | 
				
			||||||
 | 
					        NO_COLOR = "false";
 | 
				
			||||||
 | 
					        IMMICH_TRUSTED_PROXIES = "127.0.0.1";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    caddy.routes = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        match = [ { host = [ config.hostnames.photos ]; } ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [ { dial = "localhost:${builtins.toString config.services.immich.port}"; } ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.photos ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Point localhost to the local domain
 | 
				
			||||||
 | 
					    networking.hosts."127.0.0.1" = [ config.hostnames.photos ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Backups
 | 
				
			||||||
 | 
					    services.restic.backups.default.paths = [ "/data/images" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -11,7 +11,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf config.services.jellyfin.enable {
 | 
					  config = lib.mkIf config.services.jellyfin.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.jellyfin.group = "media";
 | 
					    services.jellyfin.group = "shared";
 | 
				
			||||||
    users.users.jellyfin = {
 | 
					    users.users.jellyfin = {
 | 
				
			||||||
      isSystemUser = true;
 | 
					      isSystemUser = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -49,8 +49,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Create videos directory, allow anyone in Jellyfin group to manage it
 | 
					    # Create videos directory, allow anyone in Jellyfin group to manage it
 | 
				
			||||||
    systemd.tmpfiles.rules = [
 | 
					    systemd.tmpfiles.rules = [
 | 
				
			||||||
      "d /var/lib/jellyfin 0775 jellyfin media"
 | 
					      "d /var/lib/jellyfin 0775 jellyfin shared"
 | 
				
			||||||
      "d /var/lib/jellyfin/library 0775 jellyfin media"
 | 
					      "d /var/lib/jellyfin/library 0775 jellyfin shared"
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Enable VA-API for hardware transcoding
 | 
					    # Enable VA-API for hardware transcoding
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,12 +9,18 @@
 | 
				
			|||||||
    unfreePackages = [ "n8n" ];
 | 
					    unfreePackages = [ "n8n" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.n8n = {
 | 
					    services.n8n = {
 | 
				
			||||||
 | 
					      webhookUrl = "https://${config.hostnames.n8n}";
 | 
				
			||||||
      settings = {
 | 
					      settings = {
 | 
				
			||||||
        listen_address = "127.0.0.1";
 | 
					        listen_address = "127.0.0.1";
 | 
				
			||||||
        port = 5678;
 | 
					        port = 5678;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    systemd.services.n8n.environment = {
 | 
				
			||||||
 | 
					      N8N_EDITOR_BASE_URL = config.services.n8n.webhookUrl;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Configure Cloudflare DNS to point to this machine
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
    services.cloudflare-dyndns.domains = [ config.hostnames.n8n ];
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.n8n ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
  config = lib.mkIf config.services.nextcloud.enable {
 | 
					  config = lib.mkIf config.services.nextcloud.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.nextcloud = {
 | 
					    services.nextcloud = {
 | 
				
			||||||
      package = pkgs.nextcloud29; # Required to specify
 | 
					      package = pkgs.nextcloud30; # Required to specify
 | 
				
			||||||
      configureRedis = true;
 | 
					      configureRedis = true;
 | 
				
			||||||
      datadir = "/data/nextcloud";
 | 
					      datadir = "/data/nextcloud";
 | 
				
			||||||
      database.createLocally = true;
 | 
					      database.createLocally = true;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										33
									
								
								modules/nixos/services/ntfy.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								modules/nixos/services/ntfy.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					{ config, lib, ... }:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.services.ntfy-sh.enable {
 | 
				
			||||||
 | 
					    services.ntfy-sh = {
 | 
				
			||||||
 | 
					      settings = {
 | 
				
			||||||
 | 
					        base-url = "https://${config.hostnames.notifications}";
 | 
				
			||||||
 | 
					        upstream-base-url = "https://ntfy.sh";
 | 
				
			||||||
 | 
					        listen-http = ":8333";
 | 
				
			||||||
 | 
					        behind-proxy = true;
 | 
				
			||||||
 | 
					        auth-default-access = "deny-all";
 | 
				
			||||||
 | 
					        auth-file = "/var/lib/ntfy-sh/user.db";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    caddy.routes = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        match = [ { host = [ config.hostnames.notifications ]; } ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [ { dial = "localhost${config.services.ntfy-sh.settings.listen-http}"; } ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.notifications ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -57,5 +57,9 @@
 | 
				
			|||||||
    systemd.services.paperless-web.serviceConfig.UMask = lib.mkForce "0026";
 | 
					    systemd.services.paperless-web.serviceConfig.UMask = lib.mkForce "0026";
 | 
				
			||||||
    systemd.services.paperless-scheduler.serviceConfig.UMask = lib.mkForce "0026";
 | 
					    systemd.services.paperless-scheduler.serviceConfig.UMask = lib.mkForce "0026";
 | 
				
			||||||
    systemd.services.paperless-task-queue.serviceConfig.UMask = lib.mkForce "0026";
 | 
					    systemd.services.paperless-task-queue.serviceConfig.UMask = lib.mkForce "0026";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Backups
 | 
				
			||||||
 | 
					    services.restic.backups.default.paths = [ "/data/generic/paperless/documents" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    services.samba = lib.mkIf config.services.samba.enable {
 | 
					    services.samba = lib.mkIf config.services.samba.enable {
 | 
				
			||||||
      openFirewall = true;
 | 
					      openFirewall = true;
 | 
				
			||||||
      shares.data = {
 | 
					      settings.data = {
 | 
				
			||||||
        path = "/data";
 | 
					        path = "/data";
 | 
				
			||||||
        browseable = "yes";
 | 
					        browseable = "yes";
 | 
				
			||||||
        "read only" = "no";
 | 
					        "read only" = "no";
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								modules/nixos/services/uptime-kuma.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								modules/nixos/services/uptime-kuma.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					{ config, lib, ... }:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.services.uptime-kuma.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    services.uptime-kuma = {
 | 
				
			||||||
 | 
					      settings = {
 | 
				
			||||||
 | 
					        PORT = "3033";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Allow web traffic to Caddy
 | 
				
			||||||
 | 
					    caddy.routes = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        match = [ { host = [ config.hostnames.status ]; } ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [
 | 
				
			||||||
 | 
					              { dial = "localhost:${config.services.uptime-kuma.settings.PORT}"; }
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.status ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
  config,
 | 
					  config,
 | 
				
			||||||
  pkgs,
 | 
					  pkgs,
 | 
				
			||||||
  lib,
 | 
					  lib,
 | 
				
			||||||
 | 
					  pkgs-stable,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}:
 | 
					}:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -88,6 +89,7 @@ in
 | 
				
			|||||||
    # VMAgent
 | 
					    # VMAgent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.vmagent = {
 | 
					    services.vmagent = {
 | 
				
			||||||
 | 
					      package = pkgs-stable.vmagent;
 | 
				
			||||||
      prometheusConfig = prometheusConfig;
 | 
					      prometheusConfig = prometheusConfig;
 | 
				
			||||||
      remoteWrite = {
 | 
					      remoteWrite = {
 | 
				
			||||||
        url = "https://${config.hostnames.prometheus}/api/v1/write";
 | 
					        url = "https://${config.hostnames.prometheus}/api/v1/write";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@
 | 
				
			|||||||
    ./auto-upgrade.nix
 | 
					    ./auto-upgrade.nix
 | 
				
			||||||
    ./doas.nix
 | 
					    ./doas.nix
 | 
				
			||||||
    ./journald.nix
 | 
					    ./journald.nix
 | 
				
			||||||
 | 
					    ./shared.nix
 | 
				
			||||||
    ./user.nix
 | 
					    ./user.nix
 | 
				
			||||||
    ./timezone.nix
 | 
					    ./timezone.nix
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								modules/nixos/system/shared.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								modules/nixos/system/shared.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					{ config, lib, ... }:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.server {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Create a shared group for many services
 | 
				
			||||||
 | 
					    users.groups.shared = { };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Give the human user access to the shared group
 | 
				
			||||||
 | 
					    users.users.${config.user}.extraGroups = [ config.users.groups.shared.name ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -8,22 +8,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf pkgs.stdenv.isLinux {
 | 
					  config = lib.mkIf pkgs.stdenv.isLinux {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    services.tzupdate.enable = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Service to determine location for time zone
 | 
					    # Service to determine location for time zone
 | 
				
			||||||
 | 
					    # This is required for redshift which depends on the location provider
 | 
				
			||||||
    services.geoclue2.enable = true;
 | 
					    services.geoclue2.enable = true;
 | 
				
			||||||
    services.geoclue2.enableWifi = false; # Breaks when it can't connect
 | 
					    services.geoclue2.enableWifi = false; # Breaks when it can't connect
 | 
				
			||||||
    location = {
 | 
					    location = {
 | 
				
			||||||
      provider = "geoclue2";
 | 
					      provider = "geoclue2";
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Enable local time based on time zone
 | 
					 | 
				
			||||||
    services.localtimed.enable = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Required to get localtimed to talk to geoclue2
 | 
					 | 
				
			||||||
    services.geoclue2.appConfig.localtimed.isSystem = true;
 | 
					 | 
				
			||||||
    services.geoclue2.appConfig.localtimed.isAllowed = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Fix "Failed to set timezone"
 | 
					 | 
				
			||||||
    # https://github.com/NixOS/nixpkgs/issues/68489#issuecomment-1484030107
 | 
					 | 
				
			||||||
    services.geoclue2.enableDemoAgent = lib.mkForce true;
 | 
					 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,27 +0,0 @@
 | 
				
			|||||||
diff --git a/cps/__init__.py b/cps/__init__.py
 | 
					 | 
				
			||||||
index f4f8dbf2..7377acdf 100644
 | 
					 | 
				
			||||||
--- a/cps/__init__.py
 | 
					 | 
				
			||||||
+++ b/cps/__init__.py
 | 
					 | 
				
			||||||
@@ -151,7 +151,6 @@ def create_app():
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
     lm.login_view = 'web.login'
 | 
					 | 
				
			||||||
     lm.anonymous_user = ub.Anonymous
 | 
					 | 
				
			||||||
-    lm.session_protection = 'strong' if config.config_session == 1 else "basic"
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
     db.CalibreDB.update_config(config)
 | 
					 | 
				
			||||||
     db.CalibreDB.setup_db(config.config_calibre_dir, cli_param.settings_path)
 | 
					 | 
				
			||||||
diff --git a/cps/admin.py b/cps/admin.py
 | 
					 | 
				
			||||||
index 045a9523..825a28af 100644
 | 
					 | 
				
			||||||
--- a/cps/admin.py
 | 
					 | 
				
			||||||
+++ b/cps/admin.py
 | 
					 | 
				
			||||||
@@ -102,10 +102,6 @@ def admin_required(f):
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 @admi.before_app_request
 | 
					 | 
				
			||||||
 def before_request():
 | 
					 | 
				
			||||||
-    if not ub.check_user_session(current_user.id,
 | 
					 | 
				
			||||||
-                                 flask_session.get('_id')) and 'opds' not in request.path \
 | 
					 | 
				
			||||||
-      and config.config_session == 1:
 | 
					 | 
				
			||||||
-        logout_user()
 | 
					 | 
				
			||||||
     g.constants = constants
 | 
					 | 
				
			||||||
     g.google_site_verification = os.getenv('GOOGLE_SITE_VERIFICATION', '')
 | 
					 | 
				
			||||||
     g.allow_registration = config.config_public_reg
 | 
					 | 
				
			||||||
@@ -1,7 +0,0 @@
 | 
				
			|||||||
# Fix: https://github.com/janeczku/calibre-web/issues/2422
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
_final: prev: {
 | 
					 | 
				
			||||||
  calibre-web = prev.calibre-web.overrideAttrs (old: {
 | 
					 | 
				
			||||||
    patches = (old.patches or [ ]) ++ [ ./calibre-web-cloudflare.patch ];
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
# Add disko to nixpkgs from its input flake
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inputs: _final: prev: { disko = inputs.disko.packages.${prev.system}.disko; }
 | 
					 | 
				
			||||||
@@ -1,18 +1,11 @@
 | 
				
			|||||||
_final: prev: {
 | 
					inputs: _final: prev: {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gh-collaborators = prev.buildGoModule rec {
 | 
					  gh-collaborators = prev.buildGoModule rec {
 | 
				
			||||||
    pname = "gh-collaborators";
 | 
					    pname = "gh-collaborators";
 | 
				
			||||||
    version = "v2.0.3";
 | 
					    version = "v3.0.0";
 | 
				
			||||||
 | 
					    src = inputs.gh-collaborators;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    src = prev.fetchFromGitHub {
 | 
					    vendorHash = "sha256-9qmvG2q9t1Zj8yhKFyA99IaJ90R/gRVdQVjdliVKLRE";
 | 
				
			||||||
      owner = "nmasur";
 | 
					 | 
				
			||||||
      repo = "gh-collaborators";
 | 
					 | 
				
			||||||
      rev = version;
 | 
					 | 
				
			||||||
      sha256 = "sha256-XgAZ/+7QxIRKiAZ4Gp/rLgTABSXkVjFQ8TbXOFj9vpM=";
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # vendorHash = "sha256-rsRDOgJBa8T6+bC/APcmuRmg6ykbIp9pwRnJ9rrfHEs=";
 | 
					 | 
				
			||||||
    vendorHash = "sha256-fykxRb2U9DDsXorRTLiVWmhMY89N7RS07sal8ww6gz4=";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ldflags = [
 | 
					    ldflags = [
 | 
				
			||||||
      "-s"
 | 
					      "-s"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,6 +38,7 @@ in
 | 
				
			|||||||
    base16-nvim = plugin "base16-nvim" inputs.base16-nvim-src;
 | 
					    base16-nvim = plugin "base16-nvim" inputs.base16-nvim-src;
 | 
				
			||||||
    baleia-nvim = plugin "baleia-nvim" inputs.baleia-nvim-src;
 | 
					    baleia-nvim = plugin "baleia-nvim" inputs.baleia-nvim-src;
 | 
				
			||||||
    hmts-nvim = plugin "hmts-nvim" inputs.hmts-nvim-src;
 | 
					    hmts-nvim = plugin "hmts-nvim" inputs.hmts-nvim-src;
 | 
				
			||||||
    markview-nvim = plugin "markview-nvim" inputs.markview-nvim-src;
 | 
					    tiny-inline-diagnostic-nvim = plugin "tiny-inline-diagnostic-nvim" inputs.tiny-inline-diagnostic-nvim-src;
 | 
				
			||||||
 | 
					    snipe-nvim = plugin "snipe-nvim" inputs.snipe-nvim-src;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,21 +5,25 @@ inputs: _final: prev: {
 | 
				
			|||||||
      url = inputs.nextcloud-news.outPath;
 | 
					      url = inputs.nextcloud-news.outPath;
 | 
				
			||||||
      sha256 = inputs.nextcloud-news.narHash;
 | 
					      sha256 = inputs.nextcloud-news.narHash;
 | 
				
			||||||
      license = "agpl3Plus";
 | 
					      license = "agpl3Plus";
 | 
				
			||||||
 | 
					      unpack = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    external = prev.fetchNextcloudApp {
 | 
					    external = prev.fetchNextcloudApp {
 | 
				
			||||||
      url = inputs.nextcloud-external.outPath;
 | 
					      url = inputs.nextcloud-external.outPath;
 | 
				
			||||||
      sha256 = inputs.nextcloud-external.narHash;
 | 
					      sha256 = inputs.nextcloud-external.narHash;
 | 
				
			||||||
      license = "agpl3Plus";
 | 
					      license = "agpl3Plus";
 | 
				
			||||||
 | 
					      unpack = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    cookbook = prev.fetchNextcloudApp {
 | 
					    cookbook = prev.fetchNextcloudApp {
 | 
				
			||||||
      url = inputs.nextcloud-cookbook.outPath;
 | 
					      url = inputs.nextcloud-cookbook.outPath;
 | 
				
			||||||
      sha256 = inputs.nextcloud-cookbook.narHash;
 | 
					      sha256 = inputs.nextcloud-cookbook.narHash;
 | 
				
			||||||
      license = "agpl3Plus";
 | 
					      license = "agpl3Plus";
 | 
				
			||||||
 | 
					      unpack = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    snappymail = prev.fetchNextcloudApp {
 | 
					    snappymail = prev.fetchNextcloudApp {
 | 
				
			||||||
      url = inputs.nextcloud-snappymail.outPath;
 | 
					      url = inputs.nextcloud-snappymail.outPath;
 | 
				
			||||||
      sha256 = inputs.nextcloud-snappymail.narHash;
 | 
					      sha256 = inputs.nextcloud-snappymail.narHash;
 | 
				
			||||||
      license = "agpl3Plus";
 | 
					      license = "agpl3Plus";
 | 
				
			||||||
 | 
					      unpack = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										15
									
								
								overlays/osc.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								overlays/osc.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					inputs: _final: prev: {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  osc = prev.buildGoModule {
 | 
				
			||||||
 | 
					    pname = "osc";
 | 
				
			||||||
 | 
					    version = "v0.4.6";
 | 
				
			||||||
 | 
					    src = inputs.osc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vendorHash = "sha256-POtQWIjPObsfa3YZ1dLZgedZFUcc4HeTWjU20AucoKc=";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ldflags = [
 | 
				
			||||||
 | 
					      "-s"
 | 
				
			||||||
 | 
					      "-w"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,17 +0,0 @@
 | 
				
			|||||||
inputs: _final: prev: {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  stu = prev.rustPlatform.buildRustPackage {
 | 
					 | 
				
			||||||
    pname = "stu";
 | 
					 | 
				
			||||||
    version = "0.5.0";
 | 
					 | 
				
			||||||
    src = inputs.stu;
 | 
					 | 
				
			||||||
    cargoHash = "sha256-gUolS7HXkTddxDWDGir4YC+2tJjgB/CCQC49SSRaR6U=";
 | 
					 | 
				
			||||||
    buildInputs =
 | 
					 | 
				
			||||||
      if prev.stdenv.isDarwin then
 | 
					 | 
				
			||||||
        [
 | 
					 | 
				
			||||||
          prev.darwin.apple_sdk.frameworks.CoreGraphics
 | 
					 | 
				
			||||||
          prev.darwin.apple_sdk.frameworks.AppKit
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        [ ];
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										44
									
								
								overlays/volnoti.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								overlays/volnoti.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					# Fix: Volnoti error: 'volnoti' has been removed due to lack of maintenance upstream.
 | 
				
			||||||
 | 
					_final: prev: {
 | 
				
			||||||
 | 
					  volnoti = prev.stdenv.mkDerivation {
 | 
				
			||||||
 | 
					    pname = "volnoti-unstable";
 | 
				
			||||||
 | 
					    version = "2013-09-23";
 | 
				
			||||||
 | 
					    src = prev.fetchFromGitHub {
 | 
				
			||||||
 | 
					      owner = "davidbrazdil";
 | 
				
			||||||
 | 
					      repo = "volnoti";
 | 
				
			||||||
 | 
					      rev = "4af7c8e54ecc499097121909f02ecb42a8a60d24";
 | 
				
			||||||
 | 
					      sha256 = "155lb7w563dkdkdn4752hl0zjhgnq3j4cvs9z98nb25k1xpmpki7";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    patches = [
 | 
				
			||||||
 | 
					      # Fix dbus interface headers. See
 | 
				
			||||||
 | 
					      # https://github.com/davidbrazdil/volnoti/pull/10
 | 
				
			||||||
 | 
					      (prev.fetchpatch {
 | 
				
			||||||
 | 
					        url = "https://github.com/davidbrazdil/volnoti/commit/623ad8ea5c3ac8720d00a2ced4b6163aae38c119.patch";
 | 
				
			||||||
 | 
					        sha256 = "046zfdjmvhb7jrsgh04vfgi35sgy1zkrhd3bzdby3nvds1wslfam";
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					    nativeBuildInputs = with prev; [
 | 
				
			||||||
 | 
					      pkg-config
 | 
				
			||||||
 | 
					      autoreconfHook
 | 
				
			||||||
 | 
					      wrapGAppsHook3
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					    buildInputs = with prev; [
 | 
				
			||||||
 | 
					      dbus
 | 
				
			||||||
 | 
					      gdk-pixbuf
 | 
				
			||||||
 | 
					      glib
 | 
				
			||||||
 | 
					      xorg.libX11
 | 
				
			||||||
 | 
					      gtk2
 | 
				
			||||||
 | 
					      dbus-glib
 | 
				
			||||||
 | 
					      librsvg
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					    meta = with prev.lib; {
 | 
				
			||||||
 | 
					      description = "Lightweight volume notification for Linux";
 | 
				
			||||||
 | 
					      homepage = "https://github.com/davidbrazdil/volnoti";
 | 
				
			||||||
 | 
					      license = licenses.gpl3;
 | 
				
			||||||
 | 
					      platforms = platforms.linux;
 | 
				
			||||||
 | 
					      maintainers = [ ];
 | 
				
			||||||
 | 
					      # Broken by https://github.com/nix-community/home-manager/pull/5725/commits/98bf8de65dc1ed12c6443b18f6f24d36e9c438d6
 | 
				
			||||||
 | 
					      mainProgram = "volnoti";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								private/letsencrypt-key.age
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								private/letsencrypt-key.age
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					-----BEGIN AGE ENCRYPTED FILE-----
 | 
				
			||||||
 | 
					YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBCc2hS
 | 
				
			||||||
 | 
					RUw4Y200allVODI0QTYxdXlHSHRiS1pWWHg5SW9tZ0tGVmc2ajJZCitXeEd0dk9K
 | 
				
			||||||
 | 
					MmRkZlRYd253RWFzNXpUR0xuTXI2dWVhNFZpQnNlU0VFdEUKLT4gc3NoLWVkMjU1
 | 
				
			||||||
 | 
					MTkgWXlTVU1RIHNScVkwd1RmVGhNcFVSRTlxQzlvSUc2cGxNWUc0YVJ5RjRydk9J
 | 
				
			||||||
 | 
					RG1peDQKVU5iN1ZmWEJyOXBiNWdiRFlnNFFKR09vaFB4SWZWK0x3VWJwMDZtYlBj
 | 
				
			||||||
 | 
					MAotPiBzc2gtZWQyNTUxOSBuanZYNUEgSXR5OEk5cWZHUEZ3WmFCUTVFeTBnTG5h
 | 
				
			||||||
 | 
					cmNxVWFLV2JhUTRBaUJGWERncwpYMFBIN0kySXdjOE5YcS85bXRCRnRsK3NyMHY4
 | 
				
			||||||
 | 
					N0JKelFyeHB6T1dEZ2VnCi0+IHNzaC1lZDI1NTE5IENxSU9VQSAyQVJYRXJ1cFVl
 | 
				
			||||||
 | 
					dldaa0Qydlc3MzlFYnN5YUx0amdWZm5PcWovRm1MaVg0CkJsSFZRdGJIZzA1T0Ny
 | 
				
			||||||
 | 
					bUNnL0Zxa05ubHluSVBUenVCZTZpYlA5UUFEMDQKLT4gc3NoLWVkMjU1MTkgejFP
 | 
				
			||||||
 | 
					Y1p3IDFPQU5HZm5mRFl5NnNLVHUvdUlmTEtyS0djNWZaMWg5VDl1ZldNTkVWbXMK
 | 
				
			||||||
 | 
					RkVBTzNUa0d6c3NJUHQrazdKWXNZY3NIRzRndGdRNjFjMXZCSEhIQnIyYwotLS0g
 | 
				
			||||||
 | 
					VzNOa3dXS0hrMWxNUlJ4UzAxNlkzSXM4RWc1RGFzQjFyb1dGZXFnL3RCVQoq002V
 | 
				
			||||||
 | 
					S5MQqBjKKOacO4OWgn5KpmU2D7zJWJjNMxH80L6HFNoyOj4wNa+8TA0Q7MTn3bKN
 | 
				
			||||||
 | 
					YvAuwbDAGjjDt8vZFKOiZB0xAex+H7A1MVvuGIA8xQa6iNBMwj7nWTLif5pCbVk+
 | 
				
			||||||
 | 
					9aAAprcJVDJx4TeFXlNF6XtcQ3J8abwi6TDqNFpfwwBb/wruyzutgvlOiz1XSBX0
 | 
				
			||||||
 | 
					xlCGckq/BCnItLURIb7zhqRMqk/JODPjOKArmP86nCq25Wm+W5JQ8ViQ7LHJyoFj
 | 
				
			||||||
 | 
					zbiwabqeBJZgqoVdVMj8Glz+91RVodn6f9VwQcHINgHxmkd6j2z75AmWZecwD2ic
 | 
				
			||||||
 | 
					pUMnikqIMI0B3zW5H38t2cJv+aIMTl7lH5Hf1P5jEn3NPw==
 | 
				
			||||||
 | 
					-----END AGE ENCRYPTED FILE-----
 | 
				
			||||||
							
								
								
									
										17
									
								
								private/restic.age
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								private/restic.age
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					-----BEGIN AGE ENCRYPTED FILE-----
 | 
				
			||||||
 | 
					YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyAvWi9T
 | 
				
			||||||
 | 
					NnFzUnlKUGord21NUy9OT1NDRjhIbFB6MUc3TzgwVzY3OHpFSlN3CmhuNFY1L1FB
 | 
				
			||||||
 | 
					VFBHY1lNNjFYdFZyeHoxZUZyTFdpVHhqM1JqMUM3YWljVUUKLT4gc3NoLWVkMjU1
 | 
				
			||||||
 | 
					MTkgWXlTVU1RIFI4aGU5Z2NUeGNSNmEzNFk0anBBbUw0NUtHTE55WmgxOUN0T1p1
 | 
				
			||||||
 | 
					QUZyR2cKeTNack0vMVVsNTFMbmFSUXdUUkw2MTlnSzhRajVSWXJvZmV2QjlFcUZY
 | 
				
			||||||
 | 
					QQotPiBzc2gtZWQyNTUxOSBuanZYNUEgc01kWFdYS3BBay96Uzd5cG1MMlNMNXhQ
 | 
				
			||||||
 | 
					NTV4NVpvc2lLZkpLWkhZZlRrVQo0SXJhWUVMVUtYb1hEOEtJUnJoY2t0OUlpQVY2
 | 
				
			||||||
 | 
					UUZYdHpBcWRvUU0yRHlvCi0+IHNzaC1lZDI1NTE5IENxSU9VQSB2NTZHWUd2c3o1
 | 
				
			||||||
 | 
					c0NKTThaMkgyeG54Nmw1dHZBQkZoYmJkOTZNcnVyMUJVCldzQ1NHNk8vTGRMNHlM
 | 
				
			||||||
 | 
					eU0yYmltMkhlUjY2NWxhdHQ2N3BMUjdzTk9PMFkKLT4gc3NoLWVkMjU1MTkgejFP
 | 
				
			||||||
 | 
					Y1p3IHh3OEEzTmIrQXhtSTE2REFUV1loVE5vNTRUbEJmNEE4YmhBckRmZGpwVXMK
 | 
				
			||||||
 | 
					OEo5RXdwU1JuY3FPQnJNQ1hMdHJxcE4xVnVVWVVLREROYjNsZkN3ZzV2cwotLS0g
 | 
				
			||||||
 | 
					aXMrandHZTJzME95VFRuUDRzWDQ5Z3N5RGxVOUUxQ1FGNGpvN3Y4SllSNApAOIi/
 | 
				
			||||||
 | 
					0iP9cccbkUqLZJicpIlKAP+QsYM8Bfb/wYyaQPnh4vlKqil4LpQEfFW+/J82DIti
 | 
				
			||||||
 | 
					8o/ddK8YDlLg3lwyiZ2dUm3O87jA7KEgd/g=
 | 
				
			||||||
 | 
					-----END AGE ENCRYPTED FILE-----
 | 
				
			||||||
							
								
								
									
										18
									
								
								private/s3-glacier.age
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								private/s3-glacier.age
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					-----BEGIN AGE ENCRYPTED FILE-----
 | 
				
			||||||
 | 
					YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyBuQTZM
 | 
				
			||||||
 | 
					TTg0ai9yNi9Ia3pFNW0vb3JQczZtVEVyNkFNVzBlUVpVd3ZBbndrCklqdS8zeGky
 | 
				
			||||||
 | 
					WEN0YW5xck5sSXpXeFZCbHY0NHhDMU5SeGlaYmN4Szc0b1EKLT4gc3NoLWVkMjU1
 | 
				
			||||||
 | 
					MTkgWXlTVU1RIGJVZTZBdERTNUt6d0sxeGVOcnRtNmdCSlRKWUNjRHByMkZucUlz
 | 
				
			||||||
 | 
					Nm5FMTQKbHFtNnM4ZCtzdFNTa214ZVRkaFdmZnFYOCs1Z25YTDVVKzloYUVHVlg1
 | 
				
			||||||
 | 
					cwotPiBzc2gtZWQyNTUxOSBuanZYNUEgOXFwSzByaUdidFRWbE5seFNEVDYxRWtq
 | 
				
			||||||
 | 
					OXZURnEzVWphM0VoVnJvSURoUQpGbEt4YmcraDZOcXRTQUF1ekw4RTRCN2JRR1NK
 | 
				
			||||||
 | 
					QlRQaGRZd1RIMWNiRWpjCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBzTTVsbnVjWUxt
 | 
				
			||||||
 | 
					L0hyM21RS2w2a2NIY2xvSmZ0OUdDWGFVcG5IYlNhUFNzClY1bmdNUkRYR2QyYVFW
 | 
				
			||||||
 | 
					VHF3enZqUlZqUWlvZlI2aHZrREdwZGUwdzdXUHMKLT4gc3NoLWVkMjU1MTkgejFP
 | 
				
			||||||
 | 
					Y1p3IDN4cThQRjdvTWJ2S2FaMjZ0RHlDeElDc1BuU0JDSzlpcFdzT2ZhLzA1QmcK
 | 
				
			||||||
 | 
					TjlFMkgzOFhKbkdvUWt2SGhaUUJXdjBxK2hUeE1sSzBsNWJyNG8rUlZRbwotLS0g
 | 
				
			||||||
 | 
					SGw4VmpCMktjQ0ZpUExnWUtsOHhHS0tZckoxeTdtZXMyVXpWT09Ea1NUMAoRRzA+
 | 
				
			||||||
 | 
					0rbfJ+eVeccDaulmqh+Wv3T1/+SQQJYD5trume3vSzXgRxJYeXR/BespsDzWJ3yg
 | 
				
			||||||
 | 
					McHYNvEK76stD3vopKvpDU3Nk861xp++SavJtrIVKon6YJl6a6Ox+GxhrNk0+5f9
 | 
				
			||||||
 | 
					xgDWhIHwzHLPvyseYNjRFy8GsYaP2tT9TGMrQHFTAKeuvA==
 | 
				
			||||||
 | 
					-----END AGE ENCRYPTED FILE-----
 | 
				
			||||||
		Reference in New Issue
	
	Block a user