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:
 | 
			
		||||
  workflow_dispatch: # allows manual triggering
 | 
			
		||||
  schedule:
 | 
			
		||||
    - cron: '33 3 * * 0' # runs weekly on Sunday at 03:33
 | 
			
		||||
    - cron: '33 3 * * 6' # runs weekly on Saturday at 03:33
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: write
 | 
			
		||||
@@ -19,6 +19,8 @@ jobs:
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
      - name: Install Nix
 | 
			
		||||
        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
 | 
			
		||||
        uses: DeterminateSystems/flake-checker-action@v7
 | 
			
		||||
      - name: Add Nix Cache
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
          exit 1
 | 
			
		||||
      fi
 | 
			
		||||
 | 
			
		||||
      ${pkgs.disko-packaged}/bin/disko \
 | 
			
		||||
      ${pkgs.disko}/bin/disko \
 | 
			
		||||
          --mode create \
 | 
			
		||||
          --dry-run \
 | 
			
		||||
          --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?" \
 | 
			
		||||
          --default=false
 | 
			
		||||
 | 
			
		||||
      ${pkgs.disko-packaged}/bin/disko \
 | 
			
		||||
      ${pkgs.disko}/bin/disko \
 | 
			
		||||
          --mode create \
 | 
			
		||||
          --flake "path:$(pwd)#root" \
 | 
			
		||||
          --arg disk "/dev/''${DISK}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										472
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										472
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							@@ -3,11 +3,11 @@
 | 
			
		||||
    "baleia-nvim-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1717182435,
 | 
			
		||||
        "narHash": "sha256-duI3myrJSvmtjF9n7NVrVOsuSo1O3JEypA5ghBHsULc=",
 | 
			
		||||
        "lastModified": 1721805312,
 | 
			
		||||
        "narHash": "sha256-qA1x5kplP2I8bURO0I4R0gt/zeznu9hQQ+XHptLGuwc=",
 | 
			
		||||
        "owner": "m00qek",
 | 
			
		||||
        "repo": "baleia.nvim",
 | 
			
		||||
        "rev": "4d3b27dbec65a44ceecd9306f605a980bcf4e9b1",
 | 
			
		||||
        "rev": "1b25eac3ac03659c3d3af75c7455e179e5f197f7",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -51,11 +51,11 @@
 | 
			
		||||
    },
 | 
			
		||||
    "cl-nix-lite": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1717972076,
 | 
			
		||||
        "narHash": "sha256-hnZEsDInTcsVSL5LBGDAZegAxVLBus/wiJh+sNM15zU=",
 | 
			
		||||
        "lastModified": 1728174978,
 | 
			
		||||
        "narHash": "sha256-Grqqg+xuicANB85j0gNEXxi9SBKY7bzGeTuyi95eGcY=",
 | 
			
		||||
        "owner": "hraban",
 | 
			
		||||
        "repo": "cl-nix-lite",
 | 
			
		||||
        "rev": "cc920bfb0a6402d3871f470c98d65266126973e4",
 | 
			
		||||
        "rev": "31cfe6275c341eb3120a99f4b1c8516c49a29d87",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -67,11 +67,11 @@
 | 
			
		||||
    "cmp-nvim-lsp-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1715931395,
 | 
			
		||||
        "narHash": "sha256-CT1+Z4XJBVsl/RqvJeGmyitD6x7So0ylXvvef5jh7I8=",
 | 
			
		||||
        "lastModified": 1733823748,
 | 
			
		||||
        "narHash": "sha256-iaihXNCF5bB5MdeoosD/kc3QtpA/QaIDZVLiLIurBSM=",
 | 
			
		||||
        "owner": "hrsh7th",
 | 
			
		||||
        "repo": "cmp-nvim-lsp",
 | 
			
		||||
        "rev": "39e2eda76828d88b773cc27a3f61d2ad782c922d",
 | 
			
		||||
        "rev": "99290b3ec1322070bcfb9e846450a46f6efa50f0",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -87,11 +87,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719845423,
 | 
			
		||||
        "narHash": "sha256-ZLHDmWAsHQQKnmfyhYSHJDlt8Wfjv6SQhl2qek42O7A=",
 | 
			
		||||
        "lastModified": 1737504076,
 | 
			
		||||
        "narHash": "sha256-/B4XJnzYU/6K1ZZOBIgsa3K4pqDJrnC2579c44c+4rI=",
 | 
			
		||||
        "owner": "lnl7",
 | 
			
		||||
        "repo": "nix-darwin",
 | 
			
		||||
        "rev": "ec12b88104d6c117871fad55e931addac4626756",
 | 
			
		||||
        "rev": "65cc1fa8e36ceff067daf6cfb142331f02f524d3",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -108,11 +108,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719864345,
 | 
			
		||||
        "narHash": "sha256-e4Pw+30vFAxuvkSTaTypd9zYemB/QlWcH186dsGT+Ms=",
 | 
			
		||||
        "lastModified": 1737038063,
 | 
			
		||||
        "narHash": "sha256-rMEuiK69MDhjz1JgbaeQ9mBDXMJ2/P8vmOYRbFndXsk=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "disko",
 | 
			
		||||
        "rev": "544a80a69d6e2da04e4df7ec8210a858de8c7533",
 | 
			
		||||
        "rev": "bf0abfde48f469c256f2b0f481c6281ff04a5db2",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -145,11 +145,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719881223,
 | 
			
		||||
        "narHash": "sha256-9eaxGGPw7hIuZ4OaqOyKec262t+TCie0p83tlzkMEpc=",
 | 
			
		||||
        "lastModified": 1737766332,
 | 
			
		||||
        "narHash": "sha256-EcKXfadl+51Y5DQU4R7cy3FQx6XklLwmSwIAtOl1hNU=",
 | 
			
		||||
        "owner": "bandithedoge",
 | 
			
		||||
        "repo": "nixpkgs-firefox-darwin",
 | 
			
		||||
        "rev": "407f201936424ec061d33aa687e7978ae7873b5c",
 | 
			
		||||
        "rev": "ef9a452ffc26aed9265e2a5ff04952e960f8f21b",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -161,11 +161,11 @@
 | 
			
		||||
    "flake-compat": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1697816753,
 | 
			
		||||
        "narHash": "sha256-40to80AEIyKCQI0xMKCeF5ePoIKTYgjVVCZeu4CnTxM=",
 | 
			
		||||
        "lastModified": 1730663653,
 | 
			
		||||
        "narHash": "sha256-kFCUWettiFHDIqxCWWQ9qY8pVh+Lj+XL0Giyy/kdomg=",
 | 
			
		||||
        "owner": "hraban",
 | 
			
		||||
        "repo": "flake-compat",
 | 
			
		||||
        "rev": "6025bade1336a36014639bc3f67eacc853dab78f",
 | 
			
		||||
        "rev": "e5b16676185cb7548581c852f51ce7f3a49bba5e",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -178,11 +178,11 @@
 | 
			
		||||
    "flake-compat_2": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1696426674,
 | 
			
		||||
        "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
 | 
			
		||||
        "lastModified": 1733328505,
 | 
			
		||||
        "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
 | 
			
		||||
        "owner": "edolstra",
 | 
			
		||||
        "repo": "flake-compat",
 | 
			
		||||
        "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
 | 
			
		||||
        "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -191,16 +191,58 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710146030,
 | 
			
		||||
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
 | 
			
		||||
        "lastModified": 1731533236,
 | 
			
		||||
        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "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"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -208,9 +250,9 @@
 | 
			
		||||
        "type": "indirect"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_2": {
 | 
			
		||||
    "flake-utils_3": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_2"
 | 
			
		||||
        "systems": "systems_3"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1705309234,
 | 
			
		||||
@@ -226,32 +268,30 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_3": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_3"
 | 
			
		||||
      },
 | 
			
		||||
    "gh-collaborators": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710146030,
 | 
			
		||||
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
 | 
			
		||||
        "lastModified": 1736185279,
 | 
			
		||||
        "narHash": "sha256-SGmP/8Fvf2rcYkwscMOFG01Y0VJGb/TXrNZtLacurxA=",
 | 
			
		||||
        "owner": "katiem0",
 | 
			
		||||
        "repo": "gh-collaborators",
 | 
			
		||||
        "rev": "bf412dde50605e48af86f291c2ac8714f2c1b228",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "owner": "katiem0",
 | 
			
		||||
        "repo": "gh-collaborators",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "hmts-nvim-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1715076655,
 | 
			
		||||
        "narHash": "sha256-vDTqJQzLyg0nmlC+CrLnPkYti1rPxmvRW8eQq/9Zg+M=",
 | 
			
		||||
        "lastModified": 1729786258,
 | 
			
		||||
        "narHash": "sha256-V5dwIJdxBulFVKk1iSlf4H5NRz1UH7uYQeMvwtgkpIs=",
 | 
			
		||||
        "owner": "calops",
 | 
			
		||||
        "repo": "hmts.nvim",
 | 
			
		||||
        "rev": "19a91816c123173a4551a6a04f2882338f20db1d",
 | 
			
		||||
        "rev": "c7ff4c3ad96cd05664b18fb5bbbe2abbd7682dd2",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -267,11 +307,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719827439,
 | 
			
		||||
        "narHash": "sha256-tneHOIv1lEavZ0vQ+rgz67LPNCgOZVByYki3OkSshFU=",
 | 
			
		||||
        "lastModified": 1737762889,
 | 
			
		||||
        "narHash": "sha256-5HGG09bh/Yx0JA8wtBMAzt0HMCL1bYZ93x4IqzVExio=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "home-manager",
 | 
			
		||||
        "rev": "59ce796b2563e19821361abbe2067c3bb4143a7d",
 | 
			
		||||
        "rev": "daf04c5950b676f47a794300657f1d3d14c1a120",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -281,21 +321,44 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "cl-nix-lite": "cl-nix-lite",
 | 
			
		||||
        "flake-compat": "flake-compat",
 | 
			
		||||
        "flake-utils": "flake-utils",
 | 
			
		||||
        "flake-utils": "flake-utils_2",
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
        ],
 | 
			
		||||
        "systems": "systems_2"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1718893255,
 | 
			
		||||
        "narHash": "sha256-NdSDGdz5eU/EcnGn8ECP1V+mn5hyGOZQ4ybv2bWTpuk=",
 | 
			
		||||
        "lastModified": 1732920695,
 | 
			
		||||
        "narHash": "sha256-1fxvJZUznwrmEtYqpPuWi2tPcL9kj6v7p1J7ZZncAPE=",
 | 
			
		||||
        "owner": "hraban",
 | 
			
		||||
        "repo": "mac-app-util",
 | 
			
		||||
        "rev": "1857b26aceaf64c2b6a357eb83cf34139b6365cc",
 | 
			
		||||
        "rev": "548672d0cb661ce11d08ee8bde92b87d2a75c872",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -304,87 +367,71 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719431638,
 | 
			
		||||
        "narHash": "sha256-a8ekMnEzudHGiqHF53jPtgsVTOTc2QLuPg6YtTw5h68=",
 | 
			
		||||
        "lastModified": 1726214817,
 | 
			
		||||
        "narHash": "sha256-Pfa+Xbopg20os+pnGgg+wpEX1MI5fz5JMb0K4a8rBhs=",
 | 
			
		||||
        "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": {
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710338675,
 | 
			
		||||
        "narHash": "sha256-bJJ/dVmE1o04QCyrxD0sko0okRsnxJmT6sOTOmBiifs=",
 | 
			
		||||
        "lastModified": 1729501349,
 | 
			
		||||
        "narHash": "sha256-OV6HhFBzmnQBO5btGEnqmKlaUMY7/t2Qm3XebclpBlM=",
 | 
			
		||||
        "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": {
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1718102703,
 | 
			
		||||
        "narHash": "sha256-XNGjf7SWgJYFdVNOh3ED0jxSG0GJwWImVQq4cJT1Lo4=",
 | 
			
		||||
        "lastModified": 1729667621,
 | 
			
		||||
        "narHash": "sha256-pnvyMZQ+NYMgH0Unfh5S19HdZSjnghgoUDAoi2KIXNI=",
 | 
			
		||||
        "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": {
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1720361351,
 | 
			
		||||
        "narHash": "sha256-HlqO7xlMSRGgBtwi0t5oz5v7iw0zTSHysc9wGVRwGZI=",
 | 
			
		||||
        "lastModified": 1737776393,
 | 
			
		||||
        "narHash": "sha256-oCw6Brs85rINBHvz3UJXheyLVqvA3RgPXG03b30Fx7E=",
 | 
			
		||||
        "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": {
 | 
			
		||||
        "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": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "flake-utils": "flake-utils_2",
 | 
			
		||||
        "flake-utils": "flake-utils_3",
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1718621825,
 | 
			
		||||
        "narHash": "sha256-bSfjwRgKKpLyjEDPRAF1hlJKc7QDoqopalHwNCB/eAA=",
 | 
			
		||||
        "lastModified": 1732820845,
 | 
			
		||||
        "narHash": "sha256-YPXk41l4PzKb5rtcxkYhymwjHJG95fxl4iXIzXnftr8=",
 | 
			
		||||
        "owner": "gytis-ivaskevicius",
 | 
			
		||||
        "repo": "nix2vim",
 | 
			
		||||
        "rev": "1db11dbf8a4d124e02244fa5c4ff219b672a8e5b",
 | 
			
		||||
        "rev": "e2c511ea553418dd432005875c649b09d56b7e58",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -395,11 +442,11 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixlib": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719708727,
 | 
			
		||||
        "narHash": "sha256-XFNKtyirrGNdehpg7lMNm1skEcBApjqGhaHc/OI95HY=",
 | 
			
		||||
        "lastModified": 1736643958,
 | 
			
		||||
        "narHash": "sha256-tmpqTSWVRJVhpvfSN9KXBvKEXplrwKnSZNAoNPf/S/s=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "nixpkgs.lib",
 | 
			
		||||
        "rev": "1bba8a624b3b9d4f68db94fb63aaeb46039ce9e6",
 | 
			
		||||
        "rev": "1418bc28a52126761c02dd3d89b2d8ca0f521181",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -416,11 +463,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719841141,
 | 
			
		||||
        "narHash": "sha256-WOyohxFJJdfDvEB7N3eTcX44lNU2rZes1inHsyHL7mM=",
 | 
			
		||||
        "lastModified": 1737057290,
 | 
			
		||||
        "narHash": "sha256-3Pe0yKlCc7EOeq1X/aJVDH0CtNL+tIBm49vpepwL1MQ=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "nixos-generators",
 | 
			
		||||
        "rev": "140dcc2b9a0eb87ba5e9011076a1a7af19179ab1",
 | 
			
		||||
        "rev": "d002ce9b6e7eb467cd1c6bb9aef9c35d191b5453",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -431,11 +478,11 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719848872,
 | 
			
		||||
        "narHash": "sha256-H3+EC5cYuq+gQW8y0lSrrDZfH71LB4DAf+TDFyvwCNA=",
 | 
			
		||||
        "lastModified": 1737632463,
 | 
			
		||||
        "narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=",
 | 
			
		||||
        "owner": "nixos",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "00d80d13810dbfea8ab4ed1009b09100cca86ba8",
 | 
			
		||||
        "rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -461,13 +508,50 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nur": {
 | 
			
		||||
    "nixpkgs-stable": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719925604,
 | 
			
		||||
        "narHash": "sha256-cLmqi+P1sn+7497GS4fNWayoTDa0ZiJecjmEM4iQN9U=",
 | 
			
		||||
        "lastModified": 1735563628,
 | 
			
		||||
        "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",
 | 
			
		||||
        "repo": "nur",
 | 
			
		||||
        "rev": "574405811547dcec59e912c5e82bfd224648bd5e",
 | 
			
		||||
        "rev": "e3bdfbe8b01b6469fd2351ab0cf867d9cfa73da8",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -479,11 +563,11 @@
 | 
			
		||||
    "nvim-lint-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719415114,
 | 
			
		||||
        "narHash": "sha256-a9Mfoi1NzQ3b1w1VUqqJZddyCZYyacRnc128t5X3Wb0=",
 | 
			
		||||
        "lastModified": 1737487916,
 | 
			
		||||
        "narHash": "sha256-DKfivSjBFra/iXIuYQa7Mv5f2LglNbQTr8bQ+sCm8to=",
 | 
			
		||||
        "owner": "mfussenegger",
 | 
			
		||||
        "repo": "nvim-lint",
 | 
			
		||||
        "rev": "efc6fc83f0772283e064c53a8f9fb5645bde0bc0",
 | 
			
		||||
        "rev": "789b7ada1b4f00e08d026dffde410dcfa6a0ba87",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -512,11 +596,11 @@
 | 
			
		||||
    "nvim-tree-lua-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719107085,
 | 
			
		||||
        "narHash": "sha256-RfrbxYD7RYBEy/grSYnKKkWd4BHxGYEFeLiDB5OYGpg=",
 | 
			
		||||
        "lastModified": 1737769654,
 | 
			
		||||
        "narHash": "sha256-3wHzEixIhg+aFO9fOOSuTPdNkMK96eG7cdSbK7i5pXA=",
 | 
			
		||||
        "owner": "kyazdani42",
 | 
			
		||||
        "repo": "nvim-tree.lua",
 | 
			
		||||
        "rev": "8b2c5c678be4b49dff6a2df794877000113fd77b",
 | 
			
		||||
        "rev": "fee1da88972f5972a8296813f6c00d7598325ebd",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -528,20 +612,37 @@
 | 
			
		||||
    "nvim-treesitter-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719904131,
 | 
			
		||||
        "narHash": "sha256-RbTBilXbgMFfwkbIyLMZuZw1DyzDol7g0V6uu4MaEh0=",
 | 
			
		||||
        "lastModified": 1705679158,
 | 
			
		||||
        "narHash": "sha256-zAyiitJIgOCZTB0CmgNt0MHENM70SOHLIoWrVwOJKFg=",
 | 
			
		||||
        "owner": "nvim-treesitter",
 | 
			
		||||
        "repo": "nvim-treesitter",
 | 
			
		||||
        "rev": "e0d6c7643dc953acc2e817d0cebfc2f1f8c008e1",
 | 
			
		||||
        "rev": "f197a15b0d1e8d555263af20add51450e5aaa1f0",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "nvim-treesitter",
 | 
			
		||||
        "ref": "master",
 | 
			
		||||
        "ref": "v0.9.2",
 | 
			
		||||
        "repo": "nvim-treesitter",
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
@@ -584,10 +685,11 @@
 | 
			
		||||
        "disko": "disko",
 | 
			
		||||
        "fidget-nvim-src": "fidget-nvim-src",
 | 
			
		||||
        "firefox-darwin": "firefox-darwin",
 | 
			
		||||
        "gh-collaborators": "gh-collaborators",
 | 
			
		||||
        "hmts-nvim-src": "hmts-nvim-src",
 | 
			
		||||
        "home-manager": "home-manager",
 | 
			
		||||
        "jujutsu": "jujutsu",
 | 
			
		||||
        "mac-app-util": "mac-app-util",
 | 
			
		||||
        "markview-nvim-src": "markview-nvim-src",
 | 
			
		||||
        "nextcloud-cookbook": "nextcloud-cookbook",
 | 
			
		||||
        "nextcloud-external": "nextcloud-external",
 | 
			
		||||
        "nextcloud-news": "nextcloud-news",
 | 
			
		||||
@@ -596,16 +698,19 @@
 | 
			
		||||
        "nixos-generators": "nixos-generators",
 | 
			
		||||
        "nixpkgs": "nixpkgs",
 | 
			
		||||
        "nixpkgs-caddy": "nixpkgs-caddy",
 | 
			
		||||
        "nixpkgs-stable": "nixpkgs-stable",
 | 
			
		||||
        "nur": "nur",
 | 
			
		||||
        "nvim-lint-src": "nvim-lint-src",
 | 
			
		||||
        "nvim-lspconfig-src": "nvim-lspconfig-src",
 | 
			
		||||
        "nvim-tree-lua-src": "nvim-tree-lua-src",
 | 
			
		||||
        "nvim-treesitter-src": "nvim-treesitter-src",
 | 
			
		||||
        "osc": "osc",
 | 
			
		||||
        "ren": "ren",
 | 
			
		||||
        "rep": "rep",
 | 
			
		||||
        "stu": "stu",
 | 
			
		||||
        "snipe-nvim-src": "snipe-nvim-src",
 | 
			
		||||
        "telescope-nvim-src": "telescope-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",
 | 
			
		||||
        "tree-sitter-bash": "tree-sitter-bash",
 | 
			
		||||
        "tree-sitter-ini": "tree-sitter-ini",
 | 
			
		||||
@@ -619,19 +724,40 @@
 | 
			
		||||
        "zenyd-mpv-scripts": "zenyd-mpv-scripts"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "stu": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
    "rust-overlay": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "jujutsu",
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1720424134,
 | 
			
		||||
        "narHash": "sha256-c6nLQOhwztwnUfKLx69Le9pCHE0GtruqKMnvYpGyr+0=",
 | 
			
		||||
        "owner": "lusingander",
 | 
			
		||||
        "repo": "stu",
 | 
			
		||||
        "rev": "279edc8d63c04b42773434bf8c6f2744a66d71a8",
 | 
			
		||||
        "lastModified": 1737685583,
 | 
			
		||||
        "narHash": "sha256-p+NVABRpGi+pT+xxf9HcLcFVxG6L+vEEy+NwzB9T0f8=",
 | 
			
		||||
        "owner": "oxalica",
 | 
			
		||||
        "repo": "rust-overlay",
 | 
			
		||||
        "rev": "eb64cbcc8eee0fa87ebded92805280d2ec97415a",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "lusingander",
 | 
			
		||||
        "repo": "stu",
 | 
			
		||||
        "owner": "oxalica",
 | 
			
		||||
        "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"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -652,16 +778,16 @@
 | 
			
		||||
    },
 | 
			
		||||
    "systems_2": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1681028828,
 | 
			
		||||
        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
 | 
			
		||||
        "lastModified": 1689347925,
 | 
			
		||||
        "narHash": "sha256-ozenz5bFe1UUqOn7f60HRmgc01BgTGIKZ4Xl+HbocGQ=",
 | 
			
		||||
        "owner": "nix-systems",
 | 
			
		||||
        "repo": "default",
 | 
			
		||||
        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
 | 
			
		||||
        "repo": "default-darwin",
 | 
			
		||||
        "rev": "2235d7e6cc29ae99878133c95e9fe5e157661ffb",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "nix-systems",
 | 
			
		||||
        "repo": "default",
 | 
			
		||||
        "repo": "default-darwin",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -700,11 +826,11 @@
 | 
			
		||||
    "telescope-project-nvim-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1701464478,
 | 
			
		||||
        "narHash": "sha256-touMCltcnqkrQYV1NtNeWLQeFVGt+WM3aIWIdKilA7w=",
 | 
			
		||||
        "lastModified": 1733083023,
 | 
			
		||||
        "narHash": "sha256-qEORRWYKBpK7fn7se8g+5uuVBJNu0T4JHSc0C2QzNDY=",
 | 
			
		||||
        "owner": "nvim-telescope",
 | 
			
		||||
        "repo": "telescope-project.nvim",
 | 
			
		||||
        "rev": "1aaf16580a614601a7f7077d9639aeb457dc5559",
 | 
			
		||||
        "rev": "1d7920e799fc5001dffc7bd10909a86e0358eaf4",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -713,19 +839,35 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1713792255,
 | 
			
		||||
        "narHash": "sha256-mM5bGgAemsRJD9U6U5K6ia5qb8NaTusM99x6xrtEBfw=",
 | 
			
		||||
        "lastModified": 1721232722,
 | 
			
		||||
        "narHash": "sha256-hJ6nBCgSyYF1pY4lX+b8WZd49i5F6BwOmrl7xVSIwRw=",
 | 
			
		||||
        "owner": "akinsho",
 | 
			
		||||
        "repo": "toggleterm.nvim",
 | 
			
		||||
        "rev": "066cccf48a43553a80a210eb3be89a15d789d6e6",
 | 
			
		||||
        "rev": "48be57eaba817f038d61bbf64d2c597f578c0827",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "akinsho",
 | 
			
		||||
        "ref": "v2.11.0",
 | 
			
		||||
        "ref": "v2.12.0",
 | 
			
		||||
        "repo": "toggleterm.nvim",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
@@ -733,11 +875,11 @@
 | 
			
		||||
    "tree-sitter-bash": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1715005250,
 | 
			
		||||
        "narHash": "sha256-rCuQbnQAOnQWKYreNH80nlL+0A1qbWbjMvtczcoWPrY=",
 | 
			
		||||
        "lastModified": 1737678721,
 | 
			
		||||
        "narHash": "sha256-aTM0DjmCX2HaeDfZPCoqWULLVoa+nBppiR97jMWWItM=",
 | 
			
		||||
        "owner": "tree-sitter",
 | 
			
		||||
        "repo": "tree-sitter-bash",
 | 
			
		||||
        "rev": "2fbd860f802802ca76a6661ce025b3a3bca2d3ed",
 | 
			
		||||
        "rev": "03f4927065b3c0d71a962be87130aa7e79b35448",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -750,11 +892,11 @@
 | 
			
		||||
    "tree-sitter-ini": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1716889525,
 | 
			
		||||
        "narHash": "sha256-IyHrIxcmuzs60zUiJv4E3nSkhSkgbcaLDUdeDx5mlHk=",
 | 
			
		||||
        "lastModified": 1725233451,
 | 
			
		||||
        "narHash": "sha256-G11Aynq2rnkRwdkhspjYqtBD/h5k4aD+NvuE0QfploU=",
 | 
			
		||||
        "owner": "justinmk",
 | 
			
		||||
        "repo": "tree-sitter-ini",
 | 
			
		||||
        "rev": "87176e524f0a98f5be75fa44f4f0ff5c6eac069c",
 | 
			
		||||
        "rev": "962568c9efa71d25720ab42c5d36e222626ef3a6",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -766,11 +908,11 @@
 | 
			
		||||
    "tree-sitter-lua": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710150044,
 | 
			
		||||
        "narHash": "sha256-uFaEptW4wPrqgHfB1mYmVltf+4no61L2cPgpsr5qBIU=",
 | 
			
		||||
        "lastModified": 1729494737,
 | 
			
		||||
        "narHash": "sha256-v+fFcIOv+bu+2IGI/Lh/Xbqd5BzbBjaa51ECd0hG7Ow=",
 | 
			
		||||
        "owner": "MunifTanjim",
 | 
			
		||||
        "repo": "tree-sitter-lua",
 | 
			
		||||
        "rev": "a24dab177e58c9c6832f96b9a73102a0cfbced4a",
 | 
			
		||||
        "rev": "34e60e7f45fc313463c68090d88d742a55d1bd7a",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -783,11 +925,11 @@
 | 
			
		||||
    "tree-sitter-puppet": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1713617121,
 | 
			
		||||
        "narHash": "sha256-+zMgzyuGerJ8l+i5ZtWnmGr3i4fFiSLD5FssyKESsmI=",
 | 
			
		||||
        "lastModified": 1734835631,
 | 
			
		||||
        "narHash": "sha256-bO5g5AdhzpB13yHklpAndUHIX7Rvd7OMjH0Ds2ATA6Q=",
 | 
			
		||||
        "owner": "amaanq",
 | 
			
		||||
        "repo": "tree-sitter-puppet",
 | 
			
		||||
        "rev": "584522f32495d648b18a53ccb52d988e60de127d",
 | 
			
		||||
        "rev": "15f192929b7d317f5914de2b4accd37b349182a6",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -799,11 +941,11 @@
 | 
			
		||||
    "tree-sitter-python": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1714528221,
 | 
			
		||||
        "narHash": "sha256-hHQ5gK4dTRSdp0fLKarytU9vFhsBeQp7Ka61vFoIr7Y=",
 | 
			
		||||
        "lastModified": 1737668819,
 | 
			
		||||
        "narHash": "sha256-g06oE9w2AMCM6BwTQmB+acY1wcQXjIgj62N+z+nrpaY=",
 | 
			
		||||
        "owner": "tree-sitter",
 | 
			
		||||
        "repo": "tree-sitter-python",
 | 
			
		||||
        "rev": "71778c2a472ed00a64abf4219544edbf8e4b86d7",
 | 
			
		||||
        "rev": "ab2ba8be034368fa009f62f371c068b8728f9db7",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -832,11 +974,11 @@
 | 
			
		||||
    "tree-sitter-vimdoc": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1717834376,
 | 
			
		||||
        "narHash": "sha256-v+XSWGm2Wdn9/rxNFMqXYACkGn6AvxZdxkClLuKnWGU=",
 | 
			
		||||
        "lastModified": 1729686839,
 | 
			
		||||
        "narHash": "sha256-Vrl4/cZL+TWlUMEeWZoHCAWhvlefcl3ajGcwyTNKOhI=",
 | 
			
		||||
        "owner": "neovim",
 | 
			
		||||
        "repo": "tree-sitter-vimdoc",
 | 
			
		||||
        "rev": "2249c44ecd3f5cf22da3dcccfb74f816ddb29245",
 | 
			
		||||
        "rev": "d2e4b5c172a109966c2ce0378f73df6cede39400",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -845,6 +987,27 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
@@ -864,17 +1027,16 @@
 | 
			
		||||
    "wsl": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "flake-compat": "flake-compat_2",
 | 
			
		||||
        "flake-utils": "flake-utils_3",
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719220171,
 | 
			
		||||
        "narHash": "sha256-xywM6JoGT8AwfoOFJBTv8GRlvNu8LYqqqMS/OQ6uCgE=",
 | 
			
		||||
        "lastModified": 1736095716,
 | 
			
		||||
        "narHash": "sha256-csysw/Szu98QDiA2lhWk9seYOyCebeVEWL89zh1cduM=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "NixOS-WSL",
 | 
			
		||||
        "rev": "269411cfed6aab694e46f719277c972de96177bb",
 | 
			
		||||
        "rev": "63c3b4ed1712a3a0621002cd59bfdc80875ecbb0",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								flake.nix
									
									
									
									
									
								
							@@ -7,6 +7,9 @@
 | 
			
		||||
    # Used for system packages
 | 
			
		||||
    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
 | 
			
		||||
    nixpkgs-caddy.url = "github:jpds/nixpkgs/caddy-external-plugins";
 | 
			
		||||
 | 
			
		||||
@@ -88,7 +91,7 @@
 | 
			
		||||
    };
 | 
			
		||||
    nvim-treesitter-src = {
 | 
			
		||||
      # 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;
 | 
			
		||||
    };
 | 
			
		||||
    telescope-nvim-src = {
 | 
			
		||||
@@ -102,7 +105,7 @@
 | 
			
		||||
    };
 | 
			
		||||
    toggleterm-nvim-src = {
 | 
			
		||||
      # 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;
 | 
			
		||||
    };
 | 
			
		||||
    bufferline-nvim-src = {
 | 
			
		||||
@@ -127,8 +130,12 @@
 | 
			
		||||
      url = "github:mfussenegger/nvim-lint";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    markview-nvim-src = {
 | 
			
		||||
      url = "github:OXY2DEV/markview.nvim";
 | 
			
		||||
    tiny-inline-diagnostic-nvim-src = {
 | 
			
		||||
      url = "github:rachartier/tiny-inline-diagnostic.nvim";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    snipe-nvim-src = {
 | 
			
		||||
      url = "github:leath-dub/snipe.nvim";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@@ -168,6 +175,13 @@
 | 
			
		||||
      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
 | 
			
		||||
    rep = {
 | 
			
		||||
      url = "github:robenkleene/rep-grep";
 | 
			
		||||
@@ -178,32 +192,37 @@
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Stu - TUI for S3
 | 
			
		||||
    stu = {
 | 
			
		||||
      url = "github:lusingander/stu";
 | 
			
		||||
    gh-collaborators = {
 | 
			
		||||
      url = "github:katiem0/gh-collaborators";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Clipboard over SSH
 | 
			
		||||
    osc = {
 | 
			
		||||
      url = "github:theimpostor/osc/v0.4.6";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Nextcloud Apps
 | 
			
		||||
    nextcloud-news = {
 | 
			
		||||
      # 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;
 | 
			
		||||
    };
 | 
			
		||||
    nextcloud-external = {
 | 
			
		||||
      # 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;
 | 
			
		||||
    };
 | 
			
		||||
    nextcloud-cookbook = {
 | 
			
		||||
      # 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;
 | 
			
		||||
    };
 | 
			
		||||
    nextcloud-snappymail = {
 | 
			
		||||
      # https://github.com/the-djmaze/snappymail/releases
 | 
			
		||||
      # 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";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
@@ -229,37 +248,43 @@
 | 
			
		||||
          mail.smtpHost = "smtp.purelymail.com";
 | 
			
		||||
          dotfilesRepo = "https://github.com/nmasur/dotfiles";
 | 
			
		||||
          hostnames = {
 | 
			
		||||
            audiobooks = "read.${baseName}";
 | 
			
		||||
            budget = "money.${baseName}";
 | 
			
		||||
            files = "files.${baseName}";
 | 
			
		||||
            git = "git.${baseName}";
 | 
			
		||||
            influxdb = "influxdb.${baseName}";
 | 
			
		||||
            irc = "irc.${baseName}";
 | 
			
		||||
            metrics = "metrics.${baseName}";
 | 
			
		||||
            minecraft = "minecraft.${baseName}";
 | 
			
		||||
            n8n = "n8n2.${baseName}";
 | 
			
		||||
            n8n = "n8n.${baseName}";
 | 
			
		||||
            notifications = "ntfy.${baseName}";
 | 
			
		||||
            prometheus = "prom.${baseName}";
 | 
			
		||||
            paperless = "paper.${baseName}";
 | 
			
		||||
            photos = "photos.${baseName}";
 | 
			
		||||
            secrets = "vault.${baseName}";
 | 
			
		||||
            stream = "stream.${baseName}";
 | 
			
		||||
            content = "cloud.${baseName}";
 | 
			
		||||
            books = "books.${baseName}";
 | 
			
		||||
            download = "download.${baseName}";
 | 
			
		||||
            status = "status.${baseName}";
 | 
			
		||||
            transmission = "transmission.${baseName}";
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
      # Common overlays to always use
 | 
			
		||||
      overlays = [
 | 
			
		||||
        inputs.nur.overlay
 | 
			
		||||
        inputs.nur.overlays.default
 | 
			
		||||
        inputs.nix2vim.overlay
 | 
			
		||||
        inputs.jujutsu.overlays.default # Fix: https://github.com/martinvonz/jj/issues/4784
 | 
			
		||||
        (import ./overlays/neovim-plugins.nix inputs)
 | 
			
		||||
        (import ./overlays/calibre-web.nix)
 | 
			
		||||
        (import ./overlays/disko.nix inputs)
 | 
			
		||||
        (import ./overlays/tree-sitter.nix inputs)
 | 
			
		||||
        (import ./overlays/mpv-scripts.nix inputs)
 | 
			
		||||
        (import ./overlays/nextcloud-apps.nix inputs)
 | 
			
		||||
        (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/stu.nix inputs)
 | 
			
		||||
        (import ./overlays/volnoti.nix)
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      # System types to support.
 | 
			
		||||
@@ -331,6 +356,7 @@
 | 
			
		||||
            system = "x86_64-linux";
 | 
			
		||||
            format = "iso";
 | 
			
		||||
            specialArgs = {
 | 
			
		||||
              pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
            };
 | 
			
		||||
            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; };
 | 
			
		||||
@@ -339,6 +365,7 @@
 | 
			
		||||
            system = "x86_64-linux";
 | 
			
		||||
            format = "amazon";
 | 
			
		||||
            specialArgs = {
 | 
			
		||||
              pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
            };
 | 
			
		||||
            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; } ++ [
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@
 | 
			
		||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
  system = "aarch64-linux";
 | 
			
		||||
  specialArgs = {
 | 
			
		||||
    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
  };
 | 
			
		||||
  modules = [
 | 
			
		||||
@@ -61,7 +62,7 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
 | 
			
		||||
      # Still require colors for programs like Neovim, K9S
 | 
			
		||||
      theme = {
 | 
			
		||||
        colors = (import ../../colorscheme/gruvbox).dark;
 | 
			
		||||
        colors = (import ../../colorscheme/gruvbox-dark).dark;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      # Programs and services
 | 
			
		||||
@@ -70,6 +71,7 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
      dotfiles.enable = true; # Clone dotfiles
 | 
			
		||||
      neovim.enable = true;
 | 
			
		||||
      giteaRunner.enable = true;
 | 
			
		||||
      services.actualbudget.enable = true;
 | 
			
		||||
      services.caddy.enable = true;
 | 
			
		||||
      services.grafana.enable = true;
 | 
			
		||||
      services.thelounge.enable = true;
 | 
			
		||||
@@ -79,6 +81,10 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
      services.gitea.enable = true;
 | 
			
		||||
      services.vaultwarden.enable = true;
 | 
			
		||||
      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;
 | 
			
		||||
 | 
			
		||||
      # Allows private remote access over the internet
 | 
			
		||||
@@ -94,6 +100,7 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
        endpoint = "s3.us-west-002.backblazeb2.com";
 | 
			
		||||
        bucket = "noahmasur-backup";
 | 
			
		||||
        accessKeyId = "0026b0e73b2e2c80000000005";
 | 
			
		||||
        resticBucket = "noahmasur-restic";
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      # Disable passwords, only use SSH key
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,8 @@ inputs.darwin.lib.darwinSystem {
 | 
			
		||||
    inputs.mac-app-util.darwinModules.default
 | 
			
		||||
    {
 | 
			
		||||
      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";
 | 
			
		||||
      gui.enable = true;
 | 
			
		||||
      theme = {
 | 
			
		||||
@@ -53,6 +54,7 @@ inputs.darwin.lib.darwinSystem {
 | 
			
		||||
      _1password.enable = true;
 | 
			
		||||
      slack.enable = true;
 | 
			
		||||
      wezterm.enable = true;
 | 
			
		||||
      yt-dlp.enable = true;
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@
 | 
			
		||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
  system = "x86_64-linux";
 | 
			
		||||
  specialArgs = {
 | 
			
		||||
    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
  };
 | 
			
		||||
  modules = [
 | 
			
		||||
@@ -66,6 +67,14 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
        devices = (import ../../disks/root.nix { disk = "/dev/nvme0n1"; });
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      zramSwap.enable = true;
 | 
			
		||||
      swapDevices = [
 | 
			
		||||
        {
 | 
			
		||||
          device = "/swapfile";
 | 
			
		||||
          size = 4 * 1024; # 4 GB
 | 
			
		||||
        }
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      boot.zfs = {
 | 
			
		||||
        # Automatically load the ZFS pool on boot
 | 
			
		||||
        extraPools = [ "tank" ];
 | 
			
		||||
@@ -96,8 +105,11 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
      cloudflare.enable = true;
 | 
			
		||||
      dotfiles.enable = true;
 | 
			
		||||
      arrs.enable = true;
 | 
			
		||||
      filebrowser.enable = true;
 | 
			
		||||
      services.audiobookshelf.enable = true;
 | 
			
		||||
      services.bind.enable = true;
 | 
			
		||||
      services.caddy.enable = true;
 | 
			
		||||
      services.immich.enable = true;
 | 
			
		||||
      services.jellyfin.enable = true;
 | 
			
		||||
      services.nextcloud.enable = true;
 | 
			
		||||
      services.calibre-web.enable = true;
 | 
			
		||||
@@ -122,6 +134,7 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
        endpoint = "s3.us-west-002.backblazeb2.com";
 | 
			
		||||
        bucket = "noahmasur-backup";
 | 
			
		||||
        accessKeyId = "0026b0e73b2e2c80000000005";
 | 
			
		||||
        resticBucket = "noahmasur-restic";
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      # Disable passwords, only use SSH key
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,12 @@
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
inputs.nixpkgs.lib.nixosSystem {
 | 
			
		||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
  system = "x86_64-linux";
 | 
			
		||||
  specialArgs = {
 | 
			
		||||
    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
  };
 | 
			
		||||
  modules = [
 | 
			
		||||
    globals
 | 
			
		||||
    inputs.home-manager.nixosModules.home-manager
 | 
			
		||||
@@ -37,6 +41,12 @@ inputs.nixpkgs.lib.nixosSystem {
 | 
			
		||||
      boot.kernelModules = [ "kvm-amd" ];
 | 
			
		||||
      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
 | 
			
		||||
      hardware.enableRedistributableFirmware = true;
 | 
			
		||||
 | 
			
		||||
@@ -118,6 +128,7 @@ inputs.nixpkgs.lib.nixosSystem {
 | 
			
		||||
        dwarf-fortress.enable = true;
 | 
			
		||||
        enable = true;
 | 
			
		||||
        steam.enable = true;
 | 
			
		||||
        moonlight.enable = true;
 | 
			
		||||
        legendary.enable = true;
 | 
			
		||||
        lutris.enable = true;
 | 
			
		||||
        ryujinx.enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -22,10 +22,9 @@
 | 
			
		||||
      "1password-cli"
 | 
			
		||||
    ];
 | 
			
		||||
    home-manager.users.${config.user} = {
 | 
			
		||||
      home.packages = with pkgs; [
 | 
			
		||||
        _1password-gui
 | 
			
		||||
        _1password
 | 
			
		||||
      ];
 | 
			
		||||
      home.packages = [
 | 
			
		||||
        pkgs._1password-cli
 | 
			
		||||
      ] ++ (if pkgs.stdenv.isLinux then [ pkgs._1password-gui ] else [ ]);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # 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
 | 
			
		||||
            "devtools.command-button-screenshot.enabled" = true; # Scrolling screenshot of entire page
 | 
			
		||||
            "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 = ''
 | 
			
		||||
            :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 = {
 | 
			
		||||
        associations.added = {
 | 
			
		||||
          "text/html" = [ "firefox.desktop" ];
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,6 @@
 | 
			
		||||
 | 
			
		||||
    # Broken on 2023-12-11
 | 
			
		||||
    # 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 ];
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Theme string: #1D2122,#665C54,#8EC07C,#BDAE93
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,14 +29,14 @@
 | 
			
		||||
          sessionVariables.ROFI_SYSTEMD_TERM = "${pkgs.wezterm}/bin/wezterm";
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
      terminal = "${pkgs.wezterm}/bin/wezterm";
 | 
			
		||||
      terminalLaunchCommand = "${config.terminal} start --";
 | 
			
		||||
 | 
			
		||||
      home-manager.users.${config.user} = {
 | 
			
		||||
 | 
			
		||||
        # Set the i3 terminal
 | 
			
		||||
        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
 | 
			
		||||
        programs.fish.shellAliases = {
 | 
			
		||||
          icat = lib.mkForce "wezterm imgcat";
 | 
			
		||||
@@ -102,46 +102,82 @@
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
          extraConfig = ''
 | 
			
		||||
            return {
 | 
			
		||||
                color_scheme = "myTheme",
 | 
			
		||||
            local wezterm = require("wezterm")
 | 
			
		||||
            local config = wezterm.config_builder()
 | 
			
		||||
            config.check_for_updates = false
 | 
			
		||||
            config.color_scheme = "myTheme"
 | 
			
		||||
 | 
			
		||||
            -- Scrollback
 | 
			
		||||
                scrollback_lines = 10000,
 | 
			
		||||
            config.scrollback_lines = 10000
 | 
			
		||||
 | 
			
		||||
            -- Window
 | 
			
		||||
                window_padding = {
 | 
			
		||||
            config.window_padding = {
 | 
			
		||||
              left = 10,
 | 
			
		||||
              right = 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"},
 | 
			
		||||
            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
 | 
			
		||||
                hide_tab_bar_if_only_one_tab = true,
 | 
			
		||||
                window_frame = {
 | 
			
		||||
            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"},
 | 
			
		||||
                },
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
                colors = {
 | 
			
		||||
            config.colors = {
 | 
			
		||||
              tab_bar = {
 | 
			
		||||
                active_tab = {
 | 
			
		||||
                  bg_color = '${config.theme.colors.base00}',
 | 
			
		||||
                  fg_color = '${config.theme.colors.base04}',
 | 
			
		||||
                },
 | 
			
		||||
              },
 | 
			
		||||
                },
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            -- Disable audio
 | 
			
		||||
                audible_bell = "Disabled",
 | 
			
		||||
            config.audible_bell = "Disabled"
 | 
			
		||||
 | 
			
		||||
                initial_rows = 80,
 | 
			
		||||
                initial_cols = 200,
 | 
			
		||||
            config.initial_rows = 80
 | 
			
		||||
            config.initial_cols = 200
 | 
			
		||||
 | 
			
		||||
                keys = {
 | 
			
		||||
            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',
 | 
			
		||||
@@ -169,7 +205,7 @@
 | 
			
		||||
              -- super-t open new tab in new dir
 | 
			
		||||
              {
 | 
			
		||||
                key = 't',
 | 
			
		||||
                    mods = 'SUPER',
 | 
			
		||||
                mods = ${if pkgs.stdenv.isDarwin then "'SUPER'" else "'ALT'"},
 | 
			
		||||
                action = wezterm.action.SpawnCommandInNewTab {
 | 
			
		||||
                  cwd = wezterm.home_dir,
 | 
			
		||||
                },
 | 
			
		||||
@@ -226,8 +262,23 @@
 | 
			
		||||
                   )
 | 
			
		||||
                 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.";
 | 
			
		||||
      default = [ ];
 | 
			
		||||
    };
 | 
			
		||||
    insecurePackages = lib.mkOption {
 | 
			
		||||
      type = lib.types.listOf lib.types.str;
 | 
			
		||||
      description = "List of insecure packages to allow.";
 | 
			
		||||
      default = [ ];
 | 
			
		||||
    };
 | 
			
		||||
    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 {
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for git server (Gitea).";
 | 
			
		||||
@@ -93,6 +110,10 @@
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for document server (paperless-ngx).";
 | 
			
		||||
      };
 | 
			
		||||
      photos = lib.mkOption {
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for photo management (Immich).";
 | 
			
		||||
      };
 | 
			
		||||
      prometheus = lib.mkOption {
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for Prometheus server.";
 | 
			
		||||
@@ -129,6 +150,14 @@
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        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 {
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for peer2peer downloads (Transmission).";
 | 
			
		||||
@@ -161,6 +190,9 @@
 | 
			
		||||
      # Retrieves package object based on string name
 | 
			
		||||
      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
 | 
			
		||||
      home-manager.users.${config.user}.home.stateVersion = stateVersion;
 | 
			
		||||
      home-manager.users.root.home.stateVersion = stateVersion;
 | 
			
		||||
 
 | 
			
		||||
@@ -169,7 +169,8 @@
 | 
			
		||||
          filters = {
 | 
			
		||||
            "text/plain" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
 | 
			
		||||
            "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/*" =
 | 
			
		||||
            #   ''${pkgs.bat}/bin/bat -fP --file-name="$AERC_FILENAME "'';
 | 
			
		||||
            "message/delivery-status" = "${pkgs.aerc}/libexec/aerc/filters/colorize";
 | 
			
		||||
@@ -190,20 +191,19 @@
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      xdg.desktopEntries.aerc = lib.mkIf pkgs.stdenv.isLinux {
 | 
			
		||||
      xdg.desktopEntries.aerc = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
			
		||||
        name = "aerc";
 | 
			
		||||
        exec = "kitty aerc %u";
 | 
			
		||||
        exec = "${config.terminalLaunchCommand} aerc %u";
 | 
			
		||||
      };
 | 
			
		||||
      xsession.windowManager.i3.config.keybindings = lib.mkIf pkgs.stdenv.isLinux {
 | 
			
		||||
        "${
 | 
			
		||||
          config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
 | 
			
		||||
        }+Shift+e" = "exec ${
 | 
			
		||||
        "${config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier}+Shift+e" =
 | 
			
		||||
          "exec ${
 | 
			
		||||
            # Don't name the script `aerc` or it will affect grep
 | 
			
		||||
            builtins.toString (
 | 
			
		||||
              pkgs.writeShellScript "focus-mail.sh" ''
 | 
			
		||||
                count=$(ps aux | grep -c aerc)
 | 
			
		||||
                if [ "$count" -eq 1 ]; then
 | 
			
		||||
                  i3-msg "exec --no-startup-id kitty --class aerc aerc"
 | 
			
		||||
                    i3-msg "exec --no-startup-id ${config.terminal} start --class aerc -- aerc"
 | 
			
		||||
                    sleep 0.25
 | 
			
		||||
                fi
 | 
			
		||||
                i3-msg "[class=aerc] focus"
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@
 | 
			
		||||
  plugins = [
 | 
			
		||||
    pkgs.vimPlugins.bufferline-nvim
 | 
			
		||||
    pkgs.vimPlugins.vim-bbye # Better closing of buffers
 | 
			
		||||
    pkgs.vimPlugins.snipe-nvim # Jump between open buffers
 | 
			
		||||
  ];
 | 
			
		||||
  setup.bufferline = {
 | 
			
		||||
    options = {
 | 
			
		||||
@@ -15,6 +16,7 @@
 | 
			
		||||
      offsets = [ { filetype = "NvimTree"; } ];
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  setup.snipe = { };
 | 
			
		||||
  lua = ''
 | 
			
		||||
    -- Move buffers
 | 
			
		||||
    vim.keymap.set("n", "L", ":BufferLineCycleNext<CR>", { silent = true })
 | 
			
		||||
@@ -22,5 +24,7 @@
 | 
			
		||||
 | 
			
		||||
    -- Kill buffer
 | 
			
		||||
    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 = [
 | 
			
		||||
    pkgs.vimPlugins.nvim-cmp
 | 
			
		||||
    pkgs.vimPlugins.cmp-nvim-lsp
 | 
			
		||||
    pkgs.vimPlugins.cmp-buffer
 | 
			
		||||
    pkgs.vimPlugins.cmp-path
 | 
			
		||||
@@ -26,15 +27,21 @@
 | 
			
		||||
 | 
			
		||||
    # Basic completion keybinds
 | 
			
		||||
    mapping = {
 | 
			
		||||
      "['<C-n>']" = dsl.rawLua "require('cmp').mapping.select_next_item({ behavior = require('cmp').SelectBehavior.Insert }, { 'i', 'c' })";
 | 
			
		||||
      "['<C-p>']" = 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-n>']" =
 | 
			
		||||
        dsl.rawLua "require('cmp').mapping.select_next_item({ behavior = require('cmp').SelectBehavior.Insert }, { 'i', 'c' })";
 | 
			
		||||
      "['<C-p>']" =
 | 
			
		||||
        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-f>']" = dsl.rawLua "require('cmp').mapping.scroll_docs(4)";
 | 
			
		||||
      "['<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-r>']" = dsl.rawLua "require('cmp').mapping.confirm({ behavior = require('cmp').ConfirmBehavior.Replace, select = true, }, { 'i', 'c' })";
 | 
			
		||||
      "['<C-y>']" =
 | 
			
		||||
        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 ''
 | 
			
		||||
        function(_)
 | 
			
		||||
            cmp.mapping({
 | 
			
		||||
@@ -128,7 +135,7 @@
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  lua = ''
 | 
			
		||||
  lua' = ''
 | 
			
		||||
    -- Use buffer source for `/`
 | 
			
		||||
    require('cmp').setup.cmdline("/", {
 | 
			
		||||
        mapping = {
 | 
			
		||||
 
 | 
			
		||||
@@ -19,9 +19,11 @@
 | 
			
		||||
      pkgs.vimPlugins.fidget-nvim
 | 
			
		||||
      pkgs.vimPlugins.nvim-lint
 | 
			
		||||
      pkgs.vimPlugins.vim-table-mode
 | 
			
		||||
      pkgs.vimPlugins.tiny-inline-diagnostic-nvim
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    setup.fidget = { };
 | 
			
		||||
    setup.tiny-inline-diagnostic = { };
 | 
			
		||||
 | 
			
		||||
    use.lspconfig.lua_ls.setup = dsl.callWith {
 | 
			
		||||
      settings = {
 | 
			
		||||
@@ -71,6 +73,9 @@
 | 
			
		||||
          files = {
 | 
			
		||||
            excludeDirs = [ ".direnv" ];
 | 
			
		||||
          };
 | 
			
		||||
          cargo = {
 | 
			
		||||
            features = "all";
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
@@ -133,6 +138,9 @@
 | 
			
		||||
 | 
			
		||||
      -- Prevent infinite log size (change this when debugging)
 | 
			
		||||
      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-fugitive # Git commands
 | 
			
		||||
    pkgs.vimPlugins.vim-repeat # Better repeat using .
 | 
			
		||||
    pkgs.vimPlugins.vim-abolish # Keep capitalization in substitute (Subvert)
 | 
			
		||||
    pkgs.vimPlugins.markview-nvim # Markdown preview
 | 
			
		||||
    pkgs.vimPlugins.nvim-colorizer-lua # Hex color previews
 | 
			
		||||
    pkgs.vimPlugins.which-key-nvim # Keybind helper
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ function TERM_TOGGLE()
 | 
			
		||||
    basicterminal:toggle()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local nixpkgs = terminal:new({ cmd = "nix repl '<nixpkgs>'" })
 | 
			
		||||
local nixpkgs = terminal:new({ cmd = "nix repl --expr 'import <nixpkgs>{}'" })
 | 
			
		||||
function NIXPKGS_TOGGLE()
 | 
			
		||||
    nixpkgs:toggle()
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -50,9 +50,9 @@ in
 | 
			
		||||
 | 
			
		||||
        # Create a desktop option for launching Neovim from a file manager
 | 
			
		||||
        # (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";
 | 
			
		||||
          exec = "kitty nvim %F";
 | 
			
		||||
          exec = "${config.home-manager.users.${config.user}.programs.rofi.terminal} nvim %F";
 | 
			
		||||
          mimeType = [
 | 
			
		||||
            "text/plain"
 | 
			
		||||
            "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_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
 | 
			
		||||
    WORKFLOW_FILE=".github/workflows/apply.yml"
 | 
			
		||||
if [ ! -f "$WORKFLOW_FILE" ]; then
 | 
			
		||||
    WORKFLOW_FILE="${PROJECT_ROOT}/.github/workflows/apply.yml"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
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 "$(
 | 
			
		||||
            read -r s
 | 
			
		||||
            s=${s//\'/}
 | 
			
		||||
@@ -23,7 +24,7 @@ AWS_ACCOUNT_NUMBER=$(
 | 
			
		||||
 | 
			
		||||
if [ -z "${AWS_ACCOUNT_NUMBER}" ]; then
 | 
			
		||||
    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 "$(
 | 
			
		||||
                read -r s
 | 
			
		||||
                s=${s//\'/}
 | 
			
		||||
 
 | 
			
		||||
@@ -76,6 +76,10 @@
 | 
			
		||||
          description = "Full git commit on notes";
 | 
			
		||||
          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 = ''
 | 
			
		||||
        fish_vi_key_bindings
 | 
			
		||||
@@ -101,10 +105,18 @@
 | 
			
		||||
        "-" = "cd -";
 | 
			
		||||
        mkd = "mkdir -pv";
 | 
			
		||||
 | 
			
		||||
        # Convert a program into its full path
 | 
			
		||||
        "=" = {
 | 
			
		||||
          position = "anywhere";
 | 
			
		||||
          regex = "=\\w+";
 | 
			
		||||
          function = "_which";
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        # System
 | 
			
		||||
        s = "sudo";
 | 
			
		||||
        sc = "systemctl";
 | 
			
		||||
        scs = "systemctl status";
 | 
			
		||||
        sca = "systemctl cat";
 | 
			
		||||
        m = "make";
 | 
			
		||||
        t = "trash";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
set vimfile (fzf)
 | 
			
		||||
and set vimfile (echo $vimfile | tr -d '\r')
 | 
			
		||||
and commandline -r "vim $vimfile"
 | 
			
		||||
and commandline -r "vim \"$vimfile\""
 | 
			
		||||
and commandline -f execute
 | 
			
		||||
 
 | 
			
		||||
@@ -41,5 +41,16 @@
 | 
			
		||||
        FZF_CTRL_T_COMMAND = fzfCommand;
 | 
			
		||||
        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";
 | 
			
		||||
        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";
 | 
			
		||||
        grh = "git reset --hard";
 | 
			
		||||
        gm = "git merge";
 | 
			
		||||
@@ -158,6 +163,13 @@ in
 | 
			
		||||
                and git branch -D $branch
 | 
			
		||||
              '';
 | 
			
		||||
            };
 | 
			
		||||
            git-delete-both = {
 | 
			
		||||
              argumentNames = "branch";
 | 
			
		||||
              body = ''
 | 
			
		||||
                git push origin -d $branch
 | 
			
		||||
                git branch -d $branch
 | 
			
		||||
              '';
 | 
			
		||||
            };
 | 
			
		||||
            git-merge-fuzzy = {
 | 
			
		||||
              body = ''
 | 
			
		||||
                set branch (git-fuzzy-branch "merge from...")
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,8 @@
 | 
			
		||||
}:
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  unfreePackages = [ "gh-copilot" ];
 | 
			
		||||
 | 
			
		||||
  home-manager.users.${config.user} = {
 | 
			
		||||
 | 
			
		||||
    programs.gh = lib.mkIf config.home-manager.users.${config.user}.programs.git.enable {
 | 
			
		||||
@@ -15,6 +17,7 @@
 | 
			
		||||
      extensions = [
 | 
			
		||||
        pkgs.gh-collaborators
 | 
			
		||||
        pkgs.gh-dash
 | 
			
		||||
        pkgs.gh-copilot
 | 
			
		||||
      ];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@@ -54,7 +57,7 @@
 | 
			
		||||
        esac
 | 
			
		||||
 | 
			
		||||
        selected=$(gh repo list "$organization" \
 | 
			
		||||
            --limit 100 \
 | 
			
		||||
            --limit 1000 \
 | 
			
		||||
            --no-archived \
 | 
			
		||||
            --json=name,description,isPrivate,updatedAt,primaryLanguage \
 | 
			
		||||
            | jq -r '.[] | .name + "," + if .description == "" then "-" else .description |= gsub(","; " ") | .description end + "," + .updatedAt + "," + .primaryLanguage.name' \
 | 
			
		||||
 
 | 
			
		||||
@@ -13,12 +13,18 @@
 | 
			
		||||
        ns = "nix-shell -p";
 | 
			
		||||
        nsf = "nix-shell --run fish -p";
 | 
			
		||||
        nsr = "nix-shell-run";
 | 
			
		||||
        nps = "nix repl '<nixpkgs>'";
 | 
			
		||||
        nps = "nix repl --expr 'import <nixpkgs>{}'";
 | 
			
		||||
        nixo = "man configuration.nix";
 | 
			
		||||
        nixh = "man home-configuration.nix";
 | 
			
		||||
        nr = "rebuild-nixos";
 | 
			
		||||
        nro = "rebuild-nixos offline";
 | 
			
		||||
        hm = "rebuild-home";
 | 
			
		||||
        nr = {
 | 
			
		||||
          function = "rebuild-nixos";
 | 
			
		||||
        };
 | 
			
		||||
        nro = {
 | 
			
		||||
          function = "rebuild-nixos-offline";
 | 
			
		||||
        };
 | 
			
		||||
        hm = {
 | 
			
		||||
          function = "rebuild-home";
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
      functions = {
 | 
			
		||||
        nix-shell-run = {
 | 
			
		||||
@@ -42,19 +48,20 @@
 | 
			
		||||
        };
 | 
			
		||||
        rebuild-nixos = {
 | 
			
		||||
          body = ''
 | 
			
		||||
            if test "$argv[1]" = "offline"
 | 
			
		||||
                set option "--option substitute false"
 | 
			
		||||
            end
 | 
			
		||||
            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
			
		||||
            commandline -r "doas nixos-rebuild switch $option --flake ${config.dotfilesPath}#${config.networking.hostName}"
 | 
			
		||||
            commandline --function execute
 | 
			
		||||
            echo "doas nixos-rebuild switch --flake ${config.dotfilesPath}#${config.networking.hostName}"
 | 
			
		||||
          '';
 | 
			
		||||
        };
 | 
			
		||||
        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 = {
 | 
			
		||||
          body = ''
 | 
			
		||||
            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
			
		||||
            commandline -r "${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#${config.networking.hostName}";
 | 
			
		||||
            commandline --function execute
 | 
			
		||||
            echo "${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#${config.networking.hostName}";
 | 
			
		||||
          '';
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
@@ -91,12 +98,6 @@
 | 
			
		||||
    # Set channel to flake packages, used for nix-shell commands
 | 
			
		||||
    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
 | 
			
		||||
    settings.allowed-users = [
 | 
			
		||||
      "@wheel"
 | 
			
		||||
 
 | 
			
		||||
@@ -31,12 +31,14 @@ in
 | 
			
		||||
        jo # JSON output
 | 
			
		||||
        jq # JSON manipulation
 | 
			
		||||
        lf # File viewer
 | 
			
		||||
        osc # Clipboard over SSH
 | 
			
		||||
        qrencode # Generate qr codes
 | 
			
		||||
        rsync # Copy folders
 | 
			
		||||
        ren # Rename files
 | 
			
		||||
        # ren # Rename files
 | 
			
		||||
        # rep # Replace text in files
 | 
			
		||||
        ripgrep # grep
 | 
			
		||||
        sd # sed
 | 
			
		||||
        spacer # Output lines in terminal
 | 
			
		||||
        tealdeer # Cheatsheets
 | 
			
		||||
        tree # View directory hierarchy
 | 
			
		||||
        vimv-rs # Batch rename files
 | 
			
		||||
 
 | 
			
		||||
@@ -12,41 +12,56 @@
 | 
			
		||||
    home.packages =
 | 
			
		||||
      let
 | 
			
		||||
        ldap_scheme = "ldaps";
 | 
			
		||||
        magic_number = "2";
 | 
			
		||||
        magic_end_seq = "corp";
 | 
			
		||||
        magic_prefix = "take";
 | 
			
		||||
        ldap_host = "${magic_prefix}${magic_number}.t${magic_number}.${magic_end_seq}";
 | 
			
		||||
        ldap_port = 636;
 | 
			
		||||
        ldap_dc_1 = "${magic_prefix}${magic_number}";
 | 
			
		||||
        ldap_dc_2 = "t${magic_number}";
 | 
			
		||||
        ldap_dc_3 = magic_end_seq;
 | 
			
		||||
        ldap_port = 3269;
 | 
			
		||||
        jq_parse = pkgs.writeShellScriptBin "ljq" ''
 | 
			
		||||
          jq --slurp \
 | 
			
		||||
            --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_script = pkgs.writeShellScriptBin "ldap" ''
 | 
			
		||||
          # if ! [ "$LDAP_HOST" ]; then
 | 
			
		||||
          #     echo "No LDAP_HOST specified!"
 | 
			
		||||
          #     exit 1
 | 
			
		||||
          # fi
 | 
			
		||||
          if ! [ "$LDAP_HOST" ]; then
 | 
			
		||||
              echo "No LDAP_HOST specified!"
 | 
			
		||||
              exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          SEARCH_FILTER="$@"
 | 
			
		||||
          ldapsearch -LLL \
 | 
			
		||||
              -B -o ldif-wrap=no \
 | 
			
		||||
              -H "${ldap_scheme}://${ldap_host}:${builtins.toString ldap_port}" \
 | 
			
		||||
              -D "${pkgs.lib.toUpper magic_prefix}${magic_number}\\${pkgs.lib.toLower config.user}" \
 | 
			
		||||
              -w "$(${pkgs._1password}/bin/op item get T${magic_number} --fields label=password)" \
 | 
			
		||||
              -b "DC=${ldap_dc_1},DC=${ldap_dc_2},DC=${ldap_dc_3}" \
 | 
			
		||||
              -s "sub" -x "(cn=$SEARCH_FILTER)" \
 | 
			
		||||
              | jq --slurp \
 | 
			
		||||
                  --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)'
 | 
			
		||||
              -E pr=5000/prompt \
 | 
			
		||||
              -H "${ldap_scheme}://''${LDAP_HOST}:${builtins.toString ldap_port}" \
 | 
			
		||||
              -D "${pkgs.lib.toUpper magic_prefix}2\\${pkgs.lib.toLower config.user}" \
 | 
			
		||||
              -w "$(${pkgs._1password-cli}/bin/op item get T2 --fields label=password --reveal)" \
 | 
			
		||||
              -b "dc=''${LDAP_HOST//./,dc=}" \
 | 
			
		||||
              -s "sub" -x "(cn=''${SEARCH_FILTER})" \
 | 
			
		||||
              | ${jq_parse}/bin/ljq
 | 
			
		||||
        '';
 | 
			
		||||
        ldapm_script = pkgs.writeShellScriptBin "ldapm" ''
 | 
			
		||||
          if ! [ "$LDAP_HOST" ]; then
 | 
			
		||||
              echo "No LDAP_HOST specified!"
 | 
			
		||||
              exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          ${ldap_script}/bin/ldap "$@" | jq '[ .[].memberOf] | add'
 | 
			
		||||
        '';
 | 
			
		||||
        ldapg_script = pkgs.writeShellScriptBin "ldapg" ''
 | 
			
		||||
          if ! [ "$LDAP_HOST" ]; then
 | 
			
		||||
              echo "No LDAP_HOST specified!"
 | 
			
		||||
              exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          ${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
 | 
			
		||||
      [
 | 
			
		||||
        ldap_script
 | 
			
		||||
        ldapm_script
 | 
			
		||||
        ldapg_script
 | 
			
		||||
        ldapl_script
 | 
			
		||||
        jq_parse
 | 
			
		||||
      ];
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,14 +8,14 @@
 | 
			
		||||
 | 
			
		||||
  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 = {
 | 
			
		||||
      font.normal.family = "VictorMono";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    programs.kitty.font = {
 | 
			
		||||
      package = (pkgs.nerdfonts.override { fonts = [ "VictorMono" ]; });
 | 
			
		||||
      package = pkgs.nerd-fonts.victor-mono;
 | 
			
		||||
      name = "VictorMono Nerd Font Mono";
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@
 | 
			
		||||
    homebrew.casks = [ "hammerspoon" ];
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,10 @@
 | 
			
		||||
    '';
 | 
			
		||||
 | 
			
		||||
    # 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 = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
@@ -46,7 +49,7 @@
 | 
			
		||||
        "scroll-reverser" # Different scroll style for mouse vs. trackpad
 | 
			
		||||
        "notunes" # Don't launch Apple Music with the play button
 | 
			
		||||
        "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 {
 | 
			
		||||
    networking = {
 | 
			
		||||
      computerName = config.networking.hostName;
 | 
			
		||||
      # Adjust if necessary
 | 
			
		||||
      # hostName = "";
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  #   config = lib.mkIf pkgs.stdenv.isDarwin {
 | 
			
		||||
  #     networking = {
 | 
			
		||||
  #       computerName = config.networking.hostName;
 | 
			
		||||
  #       # Adjust if necessary
 | 
			
		||||
  #       # hostName = "";
 | 
			
		||||
  #     };
 | 
			
		||||
  #   };
 | 
			
		||||
  # }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,25 +10,30 @@
 | 
			
		||||
 | 
			
		||||
    programs.fish = {
 | 
			
		||||
      shellAbbrs = {
 | 
			
		||||
        nr = lib.mkForce "rebuild-darwin";
 | 
			
		||||
        nro = lib.mkForce "rebuild-darwin offline";
 | 
			
		||||
        nr = {
 | 
			
		||||
          function = lib.mkForce "rebuild-darwin";
 | 
			
		||||
        };
 | 
			
		||||
        nro = {
 | 
			
		||||
          function = lib.mkForce "rebuild-darwin-offline";
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
      functions = {
 | 
			
		||||
        rebuild-darwin = {
 | 
			
		||||
          body = ''
 | 
			
		||||
            if test "$argv[1]" = "offline"
 | 
			
		||||
                set option "--option substitute false"
 | 
			
		||||
            end
 | 
			
		||||
            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
			
		||||
            commandline -r "darwin-rebuild switch $option --flake ${config.dotfilesPath}#lookingglass"
 | 
			
		||||
            commandline --function execute
 | 
			
		||||
            echo "darwin-rebuild switch --flake ${config.dotfilesPath}#lookingglass"
 | 
			
		||||
          '';
 | 
			
		||||
        };
 | 
			
		||||
        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 {
 | 
			
		||||
          body = ''
 | 
			
		||||
            git -C ${config.dotfilesPath} add --intent-to-add --all
 | 
			
		||||
            commandline -r "${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#lookingglass";
 | 
			
		||||
            commandline --function execute
 | 
			
		||||
            echo "${pkgs.home-manager}/bin/home-manager switch --flake ${config.dotfilesPath}#lookingglass";
 | 
			
		||||
          '';
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 | 
			
		||||
    services.nix-daemon.enable = true;
 | 
			
		||||
@@ -23,6 +36,8 @@
 | 
			
		||||
 | 
			
		||||
    system = {
 | 
			
		||||
 | 
			
		||||
      stateVersion = 5;
 | 
			
		||||
 | 
			
		||||
      keyboard = {
 | 
			
		||||
        remapCapsLockToControl = true;
 | 
			
		||||
        enableKeyMapping = true; # Allows for skhd
 | 
			
		||||
@@ -106,7 +121,6 @@
 | 
			
		||||
            "${pkgs.discord}/Applications/Discord.app"
 | 
			
		||||
            "${pkgs.obsidian}/Applications/Obsidian.app"
 | 
			
		||||
            "${pkgs.wezterm}/Applications/WezTerm.app"
 | 
			
		||||
            "/System/Applications/System Settings.app"
 | 
			
		||||
          ];
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
@@ -134,6 +148,9 @@
 | 
			
		||||
        # Where to save screenshots
 | 
			
		||||
        screencapture.location = "~/Downloads";
 | 
			
		||||
 | 
			
		||||
        # Show seconds on the clock
 | 
			
		||||
        menuExtraClock.ShowSeconds = true;
 | 
			
		||||
 | 
			
		||||
        CustomUserPreferences = {
 | 
			
		||||
          # Disable disk image verification
 | 
			
		||||
          "com.apple.frameworks.diskimages" = {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,9 +11,13 @@
 | 
			
		||||
    users.users."${config.user}" = {
 | 
			
		||||
      # macOS user
 | 
			
		||||
      home = config.homePath;
 | 
			
		||||
      uid = 502;
 | 
			
		||||
      # shell = pkgs.fish; # Default shell
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # This might fix the shell issues
 | 
			
		||||
    users.knownUsers = [ config.user ];
 | 
			
		||||
 | 
			
		||||
    home-manager.users.${config.user} = {
 | 
			
		||||
 | 
			
		||||
      # Default shell setting doesn't work
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
  unfreePackages = [
 | 
			
		||||
    "consul"
 | 
			
		||||
    "vault-bin"
 | 
			
		||||
    "teams"
 | 
			
		||||
    # "teams"
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
 | 
			
		||||
@@ -19,7 +19,6 @@
 | 
			
		||||
      pkgs.visidata # CSV inspector
 | 
			
		||||
      pkgs.dos2unix # Convert Windows text files
 | 
			
		||||
      pkgs.inetutils # Includes telnet
 | 
			
		||||
      pkgs.youtube-dl # Convert web videos
 | 
			
		||||
      pkgs.pandoc # Convert text documents
 | 
			
		||||
      pkgs.mpd # TUI slideshows
 | 
			
		||||
      pkgs.mpv # Video player
 | 
			
		||||
@@ -33,8 +32,9 @@
 | 
			
		||||
      pkgs.consul
 | 
			
		||||
      pkgs.noti # Create notifications programmatically
 | 
			
		||||
      pkgs.ipcalc # Make IP network calculations
 | 
			
		||||
      pkgs.teams
 | 
			
		||||
      # pkgs.teams
 | 
			
		||||
      pkgs.cloudflared # Allow connecting to Cloudflare tunnels
 | 
			
		||||
      pkgs.monitorcontrol # Allows adjusting external displays
 | 
			
		||||
      (pkgs.writeShellApplication {
 | 
			
		||||
        name = "ocr";
 | 
			
		||||
        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 = [
 | 
			
		||||
    ./calendar.nix
 | 
			
		||||
    ./calibre.nix
 | 
			
		||||
    ./nautilus.nix
 | 
			
		||||
  ];
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
 | 
			
		||||
    # Quick preview with spacebar
 | 
			
		||||
    services.gnome.sushi.enable = true;
 | 
			
		||||
    environment.systemPackages = [ pkgs.gnome.nautilus ];
 | 
			
		||||
    environment.systemPackages = [ pkgs.nautilus ];
 | 
			
		||||
 | 
			
		||||
    home-manager.users.${config.user} = {
 | 
			
		||||
 | 
			
		||||
@@ -28,13 +28,13 @@
 | 
			
		||||
      xsession.windowManager.i3.config.keybindings = {
 | 
			
		||||
        "${
 | 
			
		||||
          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
 | 
			
		||||
      programs.fish.functions = {
 | 
			
		||||
        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
 | 
			
		||||
    ./lutris.nix
 | 
			
		||||
    ./minecraft-server.nix
 | 
			
		||||
    ./moonlight.nix
 | 
			
		||||
    ./ryujinx.nix
 | 
			
		||||
    ./steam.nix
 | 
			
		||||
  ];
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,10 @@
 | 
			
		||||
  options.gaming.dwarf-fortress.enable = lib.mkEnableOption "Dwarf Fortress free edition.";
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf config.gaming.dwarf-fortress.enable {
 | 
			
		||||
    unfreePackages = [ "dwarf-fortress" ];
 | 
			
		||||
    unfreePackages = [
 | 
			
		||||
      "dwarf-fortress"
 | 
			
		||||
      "phoebus-theme"
 | 
			
		||||
    ];
 | 
			
		||||
    environment.systemPackages =
 | 
			
		||||
      let
 | 
			
		||||
        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"
 | 
			
		||||
      "steamcmd"
 | 
			
		||||
      "steam-run"
 | 
			
		||||
      "steam-unwrapped"
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    programs.steam = {
 | 
			
		||||
@@ -27,7 +28,7 @@
 | 
			
		||||
    environment.systemPackages = with pkgs; [
 | 
			
		||||
 | 
			
		||||
      # Enable terminal interaction
 | 
			
		||||
      steamPackages.steamcmd
 | 
			
		||||
      steamcmd
 | 
			
		||||
      steam-tui
 | 
			
		||||
 | 
			
		||||
      # Overlay with performance monitoring
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,16 @@
 | 
			
		||||
      type = lib.types.str;
 | 
			
		||||
      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 {
 | 
			
		||||
      type = lib.types.path;
 | 
			
		||||
      description = "Wallpaper background image file";
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ in
 | 
			
		||||
 | 
			
		||||
    fonts.packages = with pkgs; [
 | 
			
		||||
      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 ];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@
 | 
			
		||||
            module-margin = 1;
 | 
			
		||||
            modules-left = "i3";
 | 
			
		||||
            modules-center = "xwindow";
 | 
			
		||||
            modules-right = "mailcount network pulseaudio date keyboard power";
 | 
			
		||||
            modules-right = "mailcount network pulseaudio date power";
 | 
			
		||||
            cursor-click = "pointer";
 | 
			
		||||
            cursor-scroll = "ns-resize";
 | 
			
		||||
            enable-ipc = true;
 | 
			
		||||
@@ -209,12 +209,6 @@
 | 
			
		||||
            label-foreground = config.theme.colors.base06;
 | 
			
		||||
            # format-background = colors.background;
 | 
			
		||||
          };
 | 
			
		||||
          "module/keyboard" = {
 | 
			
		||||
            type = "custom/text";
 | 
			
		||||
            content = "";
 | 
			
		||||
            click-left = "doas systemctl restart keyd";
 | 
			
		||||
            content-foreground = config.theme.colors.base04;
 | 
			
		||||
          };
 | 
			
		||||
          "module/power" = {
 | 
			
		||||
            type = "custom/text";
 | 
			
		||||
            content = "  ";
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ in
 | 
			
		||||
        cycle = true;
 | 
			
		||||
        location = "center";
 | 
			
		||||
        pass = { };
 | 
			
		||||
        terminal = lib.mkIf pkgs.stdenv.isLinux config.terminal;
 | 
			
		||||
        plugins = [
 | 
			
		||||
          pkgs.rofi-calc
 | 
			
		||||
          pkgs.rofi-emoji
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,6 @@ in
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
			
		||||
    sound.enable = true;
 | 
			
		||||
 | 
			
		||||
    # Enable PipeWire
 | 
			
		||||
    services.pipewire = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,4 @@
 | 
			
		||||
{
 | 
			
		||||
  config,
 | 
			
		||||
  pkgs,
 | 
			
		||||
  lib,
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
{ config, lib, ... }:
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf config.physical {
 | 
			
		||||
@@ -17,23 +12,29 @@
 | 
			
		||||
      autoRepeatInterval = 40;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Use capslock as escape and/or control
 | 
			
		||||
    services.keyd = {
 | 
			
		||||
    # Swap Caps-Lock with Escape when pressed or LCtrl when held/combined with others
 | 
			
		||||
    # Inspired by: https://www.youtube.com/watch?v=XuQVbZ0wENE
 | 
			
		||||
    services.kanata = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      keyboards = {
 | 
			
		||||
        default = {
 | 
			
		||||
          ids = [ "*" ];
 | 
			
		||||
          settings = {
 | 
			
		||||
            main = {
 | 
			
		||||
              capslock = "overload(control, esc)";
 | 
			
		||||
      keyboards.default = {
 | 
			
		||||
        devices = [
 | 
			
		||||
          "/dev/input/by-id/usb-Logitech_Logitech_G710_Keyboard-event-kbd"
 | 
			
		||||
          "/dev/input/by-id/usb-Logitech_Logitech_G710_Keyboard-if01-event-kbd"
 | 
			
		||||
        ];
 | 
			
		||||
        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
 | 
			
		||||
    home-manager.users.${config.user}.xsession.numlock.enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -37,16 +37,16 @@
 | 
			
		||||
      # Set up screen position and rotation
 | 
			
		||||
      setupCommands = ''
 | 
			
		||||
        ${pkgs.xorg.xrandr}/bin/xrandr --output DisplayPort-1 \
 | 
			
		||||
                                            --mode 1920x1200 \
 | 
			
		||||
                                            --pos 1920x0 \
 | 
			
		||||
                                            --rotate left \
 | 
			
		||||
                                        --output HDMI-A-0 \
 | 
			
		||||
                                            --primary \
 | 
			
		||||
                                            --mode 1920x1080 \
 | 
			
		||||
                                            --pos 0x560 \
 | 
			
		||||
                                            --rotate normal \
 | 
			
		||||
                                            --mode 2560x1440 \
 | 
			
		||||
                                            --rate 165 \
 | 
			
		||||
                                        --output DisplayPort-2 \
 | 
			
		||||
                                            --right-of DisplayPort-1 \
 | 
			
		||||
                                            --rotate left \
 | 
			
		||||
                                        --output DVI-0 --off \
 | 
			
		||||
                                        --output DVI-1 --off \
 | 
			
		||||
                                        || echo "xrandr failed"
 | 
			
		||||
      '';
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
    # Cursor
 | 
			
		||||
    home-manager.users.${config.user}.home.pointerCursor = {
 | 
			
		||||
      name = "Adwaita";
 | 
			
		||||
      package = pkgs.gnome3.adwaita-icon-theme;
 | 
			
		||||
      package = pkgs.adwaita-icon-theme;
 | 
			
		||||
      size = 24;
 | 
			
		||||
      gtk.enable = true;
 | 
			
		||||
      x11.enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,10 @@
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
    powerManagement.powerDownCommands = ''
 | 
			
		||||
      set +e
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,9 @@
 | 
			
		||||
{ config, lib, ... }:
 | 
			
		||||
{
 | 
			
		||||
  config,
 | 
			
		||||
  pkgs,
 | 
			
		||||
  lib,
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  options = {
 | 
			
		||||
@@ -8,7 +13,7 @@
 | 
			
		||||
  config = lib.mkIf (config.server && config.zfs.enable) {
 | 
			
		||||
 | 
			
		||||
    # 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.supportedFilesystems = [ "zfs" ];
 | 
			
		||||
    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";
 | 
			
		||||
      apiKey = config.secrets.radarrApiKey.dest;
 | 
			
		||||
    };
 | 
			
		||||
    readarr = {
 | 
			
		||||
      exportarrPort = "9711";
 | 
			
		||||
      url = "localhost:8787";
 | 
			
		||||
      apiKey = config.secrets.readarrApiKey.dest;
 | 
			
		||||
    };
 | 
			
		||||
    sonarr = {
 | 
			
		||||
      exportarrPort = "9708";
 | 
			
		||||
      url = "localhost:8989";
 | 
			
		||||
@@ -39,37 +44,44 @@ in
 | 
			
		||||
 | 
			
		||||
  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 = {
 | 
			
		||||
      bazarr = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        group = "media";
 | 
			
		||||
        group = "shared";
 | 
			
		||||
      };
 | 
			
		||||
      jellyseerr.enable = true;
 | 
			
		||||
      prowlarr.enable = true;
 | 
			
		||||
      sabnzbd = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        group = "media";
 | 
			
		||||
        group = "shared";
 | 
			
		||||
        # The config file must be editable within the application
 | 
			
		||||
        # It contains server configs and credentials
 | 
			
		||||
        configFile = "/data/downloads/sabnzbd/sabnzbd.ini";
 | 
			
		||||
      };
 | 
			
		||||
      sonarr = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        group = "media";
 | 
			
		||||
        group = "shared";
 | 
			
		||||
      };
 | 
			
		||||
      radarr = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        group = "media";
 | 
			
		||||
        group = "shared";
 | 
			
		||||
      };
 | 
			
		||||
      readarr = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        group = "shared";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Create a media group to be shared between services
 | 
			
		||||
    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
 | 
			
		||||
    # Allows shared group to read/write the sabnzbd directory
 | 
			
		||||
    users.users.sabnzbd.homeMode = "0770";
 | 
			
		||||
 | 
			
		||||
    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";
 | 
			
		||||
        match = [
 | 
			
		||||
@@ -223,6 +250,11 @@ in
 | 
			
		||||
      dest = "/var/private/radarr-api";
 | 
			
		||||
      prefix = "API_KEY=";
 | 
			
		||||
    };
 | 
			
		||||
    secrets.readarrApiKey = {
 | 
			
		||||
      source = ../../../private/radarr-api-key.age;
 | 
			
		||||
      dest = "/var/private/readarr-api";
 | 
			
		||||
      prefix = "API_KEY=";
 | 
			
		||||
    };
 | 
			
		||||
    secrets.sonarrApiKey = {
 | 
			
		||||
      source = ../../../private/sonarr-api-key.age;
 | 
			
		||||
      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";
 | 
			
		||||
        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 = { };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Broken on 2024-08-23
 | 
			
		||||
    # https://github.com/NixOS/nixpkgs/commit/0875d0ce1c778f344cd2377a5337a45385d6ffa0
 | 
			
		||||
    insecurePackages = [ "litestream-0.3.13" ];
 | 
			
		||||
 | 
			
		||||
    # Wait for secret to exist
 | 
			
		||||
    systemd.services.litestream = {
 | 
			
		||||
      after = [ "backup-secret.service" ];
 | 
			
		||||
@@ -65,5 +74,30 @@
 | 
			
		||||
    #   timerConfig = { OnCalendar = "00:05:00"; };
 | 
			
		||||
    #   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.books
 | 
			
		||||
    config.hostnames.download
 | 
			
		||||
    config.hostnames.photos
 | 
			
		||||
  ];
 | 
			
		||||
  mkRecord = service: "${service}       A       ${localIp}";
 | 
			
		||||
  localRecords = lib.concatLines (map mkRecord localServices);
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@
 | 
			
		||||
 | 
			
		||||
    # Force Caddy to 403 if not coming from allowlisted source
 | 
			
		||||
    caddy.cidrAllowlist = [ "127.0.0.1/32" ];
 | 
			
		||||
    caddy.routes = [
 | 
			
		||||
    caddy.routes = lib.mkBefore [
 | 
			
		||||
      {
 | 
			
		||||
        match = [ { not = [ { remote_ip.ranges = config.caddy.cidrAllowlist; } ]; } ];
 | 
			
		||||
        handle = [
 | 
			
		||||
@@ -58,7 +58,26 @@
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    services.caddy = {
 | 
			
		||||
    services.caddy =
 | 
			
		||||
      let
 | 
			
		||||
        default_logger_name = "other";
 | 
			
		||||
        roll_size_mb = 25;
 | 
			
		||||
        # Extract list of hostnames (fqdns) from current caddy routes
 | 
			
		||||
        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 {
 | 
			
		||||
@@ -69,24 +88,110 @@
 | 
			
		||||
              routes = config.caddy.routes;
 | 
			
		||||
              errors.routes = config.caddy.blocks;
 | 
			
		||||
 | 
			
		||||
            logs = { }; # Uncommenting collects access logs
 | 
			
		||||
              # Uncommenting collects access logs
 | 
			
		||||
              logs = {
 | 
			
		||||
                inherit default_logger_name;
 | 
			
		||||
                # Invert hostnames keys and values
 | 
			
		||||
                logger_names = lib.mapAttrs' (name: value: {
 | 
			
		||||
                  name = value;
 | 
			
		||||
                  value = name;
 | 
			
		||||
                }) hostname_map;
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
            apps.http.servers.metrics = { }; # Enables Prometheus metrics
 | 
			
		||||
            apps.tls.automation.policies = config.caddy.tlsPolicies;
 | 
			
		||||
 | 
			
		||||
          # Setup logging to file
 | 
			
		||||
          logging.logs.main = {
 | 
			
		||||
            encoder = {
 | 
			
		||||
              format = "console";
 | 
			
		||||
            # Setup logging to journal and files
 | 
			
		||||
            logging.logs =
 | 
			
		||||
              {
 | 
			
		||||
                # 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}/caddy.log";
 | 
			
		||||
                    filename = "${config.services.caddy.logDir}/other.log";
 | 
			
		||||
                    roll = true;
 | 
			
		||||
              roll_size_mb = 1;
 | 
			
		||||
                    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);
 | 
			
		||||
          }
 | 
			
		||||
        );
 | 
			
		||||
      };
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ in
 | 
			
		||||
  config = lib.mkIf config.services.calibre-web.enable {
 | 
			
		||||
 | 
			
		||||
    services.calibre-web = {
 | 
			
		||||
      group = "shared";
 | 
			
		||||
      openFirewall = true;
 | 
			
		||||
      options = {
 | 
			
		||||
        reverseProxyAuth.enable = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -78,6 +78,8 @@ in
 | 
			
		||||
        issuers = [
 | 
			
		||||
          {
 | 
			
		||||
            module = "acme";
 | 
			
		||||
            email = "acme@${config.mail.server}";
 | 
			
		||||
            account_key = "{env.ACME_ACCOUNT_KEY}";
 | 
			
		||||
            challenges = {
 | 
			
		||||
              dns = {
 | 
			
		||||
                provider = {
 | 
			
		||||
@@ -92,7 +94,18 @@ in
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
    # 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
 | 
			
		||||
    secrets.cloudflare-api = {
 | 
			
		||||
@@ -104,8 +117,14 @@ in
 | 
			
		||||
 | 
			
		||||
    # Wait for secret to exist
 | 
			
		||||
    systemd.services.caddy = {
 | 
			
		||||
      after = [ "cloudflare-api-secret.service" ];
 | 
			
		||||
      requires = [ "cloudflare-api-secret.service" ];
 | 
			
		||||
      after = [
 | 
			
		||||
        "cloudflare-api-secret.service"
 | 
			
		||||
        "letsencrypt-key-secret.service"
 | 
			
		||||
      ];
 | 
			
		||||
      requires = [
 | 
			
		||||
        "cloudflare-api-secret.service"
 | 
			
		||||
        "letsencrypt-key-secret.service"
 | 
			
		||||
      ];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Allows Nextcloud to trust Cloudflare IPs
 | 
			
		||||
@@ -116,6 +135,9 @@ in
 | 
			
		||||
      [ "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 =
 | 
			
		||||
      lib.mkIf ((builtins.length config.services.cloudflare-dyndns.domains) > 0)
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,8 @@
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  imports = [
 | 
			
		||||
    ./actualbudget.nix
 | 
			
		||||
    ./audiobookshelf.nix
 | 
			
		||||
    ./arr.nix
 | 
			
		||||
    ./backups.nix
 | 
			
		||||
    ./bind.nix
 | 
			
		||||
@@ -12,7 +14,9 @@
 | 
			
		||||
    ./calibre.nix
 | 
			
		||||
    ./cloudflare-tunnel.nix
 | 
			
		||||
    ./cloudflare.nix
 | 
			
		||||
    ./filebrowser.nix
 | 
			
		||||
    ./identity.nix
 | 
			
		||||
    ./immich.nix
 | 
			
		||||
    ./irc.nix
 | 
			
		||||
    ./gitea-runner.nix
 | 
			
		||||
    ./gitea.nix
 | 
			
		||||
@@ -26,6 +30,7 @@
 | 
			
		||||
    ./n8n.nix
 | 
			
		||||
    ./netdata.nix
 | 
			
		||||
    ./nextcloud.nix
 | 
			
		||||
    ./ntfy.nix
 | 
			
		||||
    ./paperless.nix
 | 
			
		||||
    ./postgresql.nix
 | 
			
		||||
    ./prometheus.nix
 | 
			
		||||
@@ -33,6 +38,7 @@
 | 
			
		||||
    ./secrets.nix
 | 
			
		||||
    ./sshd.nix
 | 
			
		||||
    ./transmission.nix
 | 
			
		||||
    ./uptime-kuma.nix
 | 
			
		||||
    ./vaultwarden.nix
 | 
			
		||||
    ./victoriametrics.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;
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
        # TODO: Add option to pull services from a list like Caddy does
 | 
			
		||||
        dashboards.settings.providers = [
 | 
			
		||||
          {
 | 
			
		||||
            name = "test";
 | 
			
		||||
@@ -368,6 +369,18 @@ in
 | 
			
		||||
                          range = true;
 | 
			
		||||
                          refId = "C";
 | 
			
		||||
                        }
 | 
			
		||||
                        {
 | 
			
		||||
                          datasource = {
 | 
			
		||||
                            type = "prometheus";
 | 
			
		||||
                            uid = promUid;
 | 
			
		||||
                          };
 | 
			
		||||
                          editorMode = "code";
 | 
			
		||||
                          expr = "readarr_system_status";
 | 
			
		||||
                          hide = false;
 | 
			
		||||
                          legendFormat = "Readarr";
 | 
			
		||||
                          range = true;
 | 
			
		||||
                          refId = "F";
 | 
			
		||||
                        }
 | 
			
		||||
                        {
 | 
			
		||||
                          datasource = {
 | 
			
		||||
                            type = "prometheus";
 | 
			
		||||
@@ -669,7 +682,7 @@ in
 | 
			
		||||
                          };
 | 
			
		||||
                          editorMode = "code";
 | 
			
		||||
                          exemplar = false;
 | 
			
		||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[1d])'';
 | 
			
		||||
                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[1d])'';
 | 
			
		||||
                          hide = false;
 | 
			
		||||
                          instant = false;
 | 
			
		||||
                          interval = "";
 | 
			
		||||
@@ -683,7 +696,7 @@ in
 | 
			
		||||
                            uid = promUid;
 | 
			
		||||
                          };
 | 
			
		||||
                          editorMode = "code";
 | 
			
		||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[7d])'';
 | 
			
		||||
                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[7d])'';
 | 
			
		||||
                          hide = false;
 | 
			
		||||
                          legendFormat = "Past Week";
 | 
			
		||||
                          range = true;
 | 
			
		||||
@@ -695,7 +708,7 @@ in
 | 
			
		||||
                            uid = promUid;
 | 
			
		||||
                          };
 | 
			
		||||
                          editorMode = "code";
 | 
			
		||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[30d])'';
 | 
			
		||||
                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[30d])'';
 | 
			
		||||
                          hide = false;
 | 
			
		||||
                          legendFormat = "Past Month";
 | 
			
		||||
                          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 = {
 | 
			
		||||
                              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 = {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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 {
 | 
			
		||||
 | 
			
		||||
    services.jellyfin.group = "media";
 | 
			
		||||
    services.jellyfin.group = "shared";
 | 
			
		||||
    users.users.jellyfin = {
 | 
			
		||||
      isSystemUser = true;
 | 
			
		||||
    };
 | 
			
		||||
@@ -49,8 +49,8 @@
 | 
			
		||||
 | 
			
		||||
    # Create videos directory, allow anyone in Jellyfin group to manage it
 | 
			
		||||
    systemd.tmpfiles.rules = [
 | 
			
		||||
      "d /var/lib/jellyfin 0775 jellyfin media"
 | 
			
		||||
      "d /var/lib/jellyfin/library 0775 jellyfin media"
 | 
			
		||||
      "d /var/lib/jellyfin 0775 jellyfin shared"
 | 
			
		||||
      "d /var/lib/jellyfin/library 0775 jellyfin shared"
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    # Enable VA-API for hardware transcoding
 | 
			
		||||
 
 | 
			
		||||
@@ -9,12 +9,18 @@
 | 
			
		||||
    unfreePackages = [ "n8n" ];
 | 
			
		||||
 | 
			
		||||
    services.n8n = {
 | 
			
		||||
      webhookUrl = "https://${config.hostnames.n8n}";
 | 
			
		||||
      settings = {
 | 
			
		||||
        listen_address = "127.0.0.1";
 | 
			
		||||
        port = 5678;
 | 
			
		||||
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    systemd.services.n8n.environment = {
 | 
			
		||||
      N8N_EDITOR_BASE_URL = config.services.n8n.webhookUrl;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Configure Cloudflare DNS to point to this machine
 | 
			
		||||
    services.cloudflare-dyndns.domains = [ config.hostnames.n8n ];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
  config = lib.mkIf config.services.nextcloud.enable {
 | 
			
		||||
 | 
			
		||||
    services.nextcloud = {
 | 
			
		||||
      package = pkgs.nextcloud29; # Required to specify
 | 
			
		||||
      package = pkgs.nextcloud30; # Required to specify
 | 
			
		||||
      configureRedis = true;
 | 
			
		||||
      datadir = "/data/nextcloud";
 | 
			
		||||
      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-scheduler.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 {
 | 
			
		||||
      openFirewall = true;
 | 
			
		||||
      shares.data = {
 | 
			
		||||
      settings.data = {
 | 
			
		||||
        path = "/data";
 | 
			
		||||
        browseable = "yes";
 | 
			
		||||
        "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,
 | 
			
		||||
  pkgs,
 | 
			
		||||
  lib,
 | 
			
		||||
  pkgs-stable,
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
@@ -88,6 +89,7 @@ in
 | 
			
		||||
    # VMAgent
 | 
			
		||||
 | 
			
		||||
    services.vmagent = {
 | 
			
		||||
      package = pkgs-stable.vmagent;
 | 
			
		||||
      prometheusConfig = prometheusConfig;
 | 
			
		||||
      remoteWrite = {
 | 
			
		||||
        url = "https://${config.hostnames.prometheus}/api/v1/write";
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@
 | 
			
		||||
    ./auto-upgrade.nix
 | 
			
		||||
    ./doas.nix
 | 
			
		||||
    ./journald.nix
 | 
			
		||||
    ./shared.nix
 | 
			
		||||
    ./user.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 {
 | 
			
		||||
 | 
			
		||||
    services.tzupdate.enable = true;
 | 
			
		||||
 | 
			
		||||
    # Service to determine location for time zone
 | 
			
		||||
    # This is required for redshift which depends on the location provider
 | 
			
		||||
    services.geoclue2.enable = true;
 | 
			
		||||
    services.geoclue2.enableWifi = false; # Breaks when it can't connect
 | 
			
		||||
    location = {
 | 
			
		||||
      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 {
 | 
			
		||||
    pname = "gh-collaborators";
 | 
			
		||||
    version = "v2.0.3";
 | 
			
		||||
    version = "v3.0.0";
 | 
			
		||||
    src = inputs.gh-collaborators;
 | 
			
		||||
 | 
			
		||||
    src = prev.fetchFromGitHub {
 | 
			
		||||
      owner = "nmasur";
 | 
			
		||||
      repo = "gh-collaborators";
 | 
			
		||||
      rev = version;
 | 
			
		||||
      sha256 = "sha256-XgAZ/+7QxIRKiAZ4Gp/rLgTABSXkVjFQ8TbXOFj9vpM=";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # vendorHash = "sha256-rsRDOgJBa8T6+bC/APcmuRmg6ykbIp9pwRnJ9rrfHEs=";
 | 
			
		||||
    vendorHash = "sha256-fykxRb2U9DDsXorRTLiVWmhMY89N7RS07sal8ww6gz4=";
 | 
			
		||||
    vendorHash = "sha256-9qmvG2q9t1Zj8yhKFyA99IaJ90R/gRVdQVjdliVKLRE";
 | 
			
		||||
 | 
			
		||||
    ldflags = [
 | 
			
		||||
      "-s"
 | 
			
		||||
 
 | 
			
		||||
@@ -38,6 +38,7 @@ in
 | 
			
		||||
    base16-nvim = plugin "base16-nvim" inputs.base16-nvim-src;
 | 
			
		||||
    baleia-nvim = plugin "baleia-nvim" inputs.baleia-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;
 | 
			
		||||
      sha256 = inputs.nextcloud-news.narHash;
 | 
			
		||||
      license = "agpl3Plus";
 | 
			
		||||
      unpack = true;
 | 
			
		||||
    };
 | 
			
		||||
    external = prev.fetchNextcloudApp {
 | 
			
		||||
      url = inputs.nextcloud-external.outPath;
 | 
			
		||||
      sha256 = inputs.nextcloud-external.narHash;
 | 
			
		||||
      license = "agpl3Plus";
 | 
			
		||||
      unpack = true;
 | 
			
		||||
    };
 | 
			
		||||
    cookbook = prev.fetchNextcloudApp {
 | 
			
		||||
      url = inputs.nextcloud-cookbook.outPath;
 | 
			
		||||
      sha256 = inputs.nextcloud-cookbook.narHash;
 | 
			
		||||
      license = "agpl3Plus";
 | 
			
		||||
      unpack = true;
 | 
			
		||||
    };
 | 
			
		||||
    snappymail = prev.fetchNextcloudApp {
 | 
			
		||||
      url = inputs.nextcloud-snappymail.outPath;
 | 
			
		||||
      sha256 = inputs.nextcloud-snappymail.narHash;
 | 
			
		||||
      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