mirror of
				https://github.com/nmasur/dotfiles
				synced 2025-11-03 22:53:16 +00:00 
			
		
		
		
	Compare commits
	
		
			100 Commits
		
	
	
		
			63b90102f2
			...
			microcode
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					1105bc8fed | ||
| 
						 | 
					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 | ||
| 
						 | 
					a47bcf8949 | ||
| 
						 | 
					6c024107ee | ||
| 
						 | 
					4ca25aa194 | ||
| 
						 | 
					20fcca6bda | ||
| 
						 | 
					0bbbabd6e8 | ||
| 
						 | 
					ff05b99fe1 | ||
| 
						 | 
					abdf4b64be | ||
| 
						 | 
					6d0d36165e | ||
| 
						 | 
					b4470727e5 | ||
| 
						 | 
					126baae735 | ||
| 
						 | 
					892dfbbee4 | ||
| 
						 | 
					0198469b83 | ||
| 
						 | 
					c89ca7ea94 | ||
| 
						 | 
					0a98b72784 | ||
| 
						 | 
					c7de16b14c | ||
| 
						 | 
					1d405e1828 | ||
| 
						 | 
					97f99a149e | ||
| 
						 | 
					bc794f89bc | 
							
								
								
									
										6
									
								
								.github/workflows/update.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/update.yml
									
									
									
									
										vendored
									
									
								
							@@ -3,7 +3,7 @@ name: Update Flake
 | 
				
			|||||||
on:
 | 
					on:
 | 
				
			||||||
  workflow_dispatch: # allows manual triggering
 | 
					  workflow_dispatch: # allows manual triggering
 | 
				
			||||||
  schedule:
 | 
					  schedule:
 | 
				
			||||||
    - cron: '33 3 * * 0' # runs weekly on Sunday at 03:33
 | 
					    - cron: '33 3 * * 6' # runs weekly on Saturday at 03:33
 | 
				
			||||||
 | 
					
 | 
				
			||||||
permissions:
 | 
					permissions:
 | 
				
			||||||
  contents: write
 | 
					  contents: write
 | 
				
			||||||
@@ -19,12 +19,14 @@ jobs:
 | 
				
			|||||||
        uses: actions/checkout@v3
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
      - name: Install Nix
 | 
					      - name: Install Nix
 | 
				
			||||||
        uses: DeterminateSystems/nix-installer-action@v11
 | 
					        uses: DeterminateSystems/nix-installer-action@v11
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          nix-package-url: https://releases.nixos.org/nix/nix-2.18.4/nix-2.18.4-x86_64-linux.tar.xz
 | 
				
			||||||
      - name: Check Nixpkgs Inputs
 | 
					      - name: Check Nixpkgs Inputs
 | 
				
			||||||
        uses: DeterminateSystems/flake-checker-action@v7
 | 
					        uses: DeterminateSystems/flake-checker-action@v7
 | 
				
			||||||
      - name: Add Nix Cache
 | 
					      - name: Add Nix Cache
 | 
				
			||||||
        uses: DeterminateSystems/magic-nix-cache-action@v6
 | 
					        uses: DeterminateSystems/magic-nix-cache-action@v6
 | 
				
			||||||
      - name: Update flake.lock
 | 
					      - name: Update flake.lock
 | 
				
			||||||
        uses: DeterminateSystems/update-flake-lock@v21
 | 
					        uses: DeterminateSystems/update-flake-lock@v23
 | 
				
			||||||
        id: update
 | 
					        id: update
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          pr-title: "Update flake.lock" # Title of PR to be created
 | 
					          pr-title: "Update flake.lock" # Title of PR to be created
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										286
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										286
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							@@ -3,11 +3,11 @@
 | 
				
			|||||||
    "baleia-nvim-src": {
 | 
					    "baleia-nvim-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1717182435,
 | 
					        "lastModified": 1721805312,
 | 
				
			||||||
        "narHash": "sha256-duI3myrJSvmtjF9n7NVrVOsuSo1O3JEypA5ghBHsULc=",
 | 
					        "narHash": "sha256-qA1x5kplP2I8bURO0I4R0gt/zeznu9hQQ+XHptLGuwc=",
 | 
				
			||||||
        "owner": "m00qek",
 | 
					        "owner": "m00qek",
 | 
				
			||||||
        "repo": "baleia.nvim",
 | 
					        "repo": "baleia.nvim",
 | 
				
			||||||
        "rev": "4d3b27dbec65a44ceecd9306f605a980bcf4e9b1",
 | 
					        "rev": "1b25eac3ac03659c3d3af75c7455e179e5f197f7",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -87,11 +87,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718662658,
 | 
					        "lastModified": 1731032247,
 | 
				
			||||||
        "narHash": "sha256-AKG7BsqtVWDlefgzyKz7vjaKTLi4+bmTSBhowbQoZtM=",
 | 
					        "narHash": "sha256-OjLft7fwkmiRLXQsGAudGFZxEYXOT0nHwrQ9GbsBqJ4=",
 | 
				
			||||||
        "owner": "lnl7",
 | 
					        "owner": "lnl7",
 | 
				
			||||||
        "repo": "nix-darwin",
 | 
					        "repo": "nix-darwin",
 | 
				
			||||||
        "rev": "29b3096a6e283d7e6779187244cb2a3942239fdf",
 | 
					        "rev": "2fbf4a8417c28cf45bae6e6e97248cbbd9b78632",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -108,11 +108,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718846788,
 | 
					        "lastModified": 1731060864,
 | 
				
			||||||
        "narHash": "sha256-9dtXYtEkmXoUJV+PGLqscqF7qTn4AIhAKpFWRFU2NYs=",
 | 
					        "narHash": "sha256-aYE7oAYZ+gPU1mPNhM0JwLAQNgjf0/JK1BF1ln2KBgk=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "disko",
 | 
					        "repo": "disko",
 | 
				
			||||||
        "rev": "e1174d991944a01eaaa04bc59c6281edca4c0e6e",
 | 
					        "rev": "5e40e02978e3bd63c2a6a9fa6fa8ba0e310e747f",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -145,11 +145,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718930737,
 | 
					        "lastModified": 1731113649,
 | 
				
			||||||
        "narHash": "sha256-+nKJ/VP6X+hirXqRry3GzdNn4OJvOdB4nRnJY22ixFw=",
 | 
					        "narHash": "sha256-U6FMghMpHTk2Pb5VsjNk8tBgCiiyB+bebmfOuNtMisA=",
 | 
				
			||||||
        "owner": "bandithedoge",
 | 
					        "owner": "bandithedoge",
 | 
				
			||||||
        "repo": "nixpkgs-firefox-darwin",
 | 
					        "repo": "nixpkgs-firefox-darwin",
 | 
				
			||||||
        "rev": "087919070dffc9798a8cb753e97babe287f06c25",
 | 
					        "rev": "22a53e2cae4d37fb24e9326c6f72a54cb4f269d5",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -231,11 +231,11 @@
 | 
				
			|||||||
        "systems": "systems_3"
 | 
					        "systems": "systems_3"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1710146030,
 | 
					        "lastModified": 1726560853,
 | 
				
			||||||
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
 | 
					        "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
 | 
				
			||||||
        "owner": "numtide",
 | 
					        "owner": "numtide",
 | 
				
			||||||
        "repo": "flake-utils",
 | 
					        "repo": "flake-utils",
 | 
				
			||||||
        "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
 | 
					        "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -244,14 +244,30 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "gh-collaborators": {
 | 
				
			||||||
 | 
					      "flake": false,
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1717117275,
 | 
				
			||||||
 | 
					        "narHash": "sha256-x3p2bHL6U8gWanXnTTJGgA9x4Ixy9AOZiBbfcfn5VVw=",
 | 
				
			||||||
 | 
					        "owner": "katiem0",
 | 
				
			||||||
 | 
					        "repo": "gh-collaborators",
 | 
				
			||||||
 | 
					        "rev": "4dfcd0b5c2e31f2d0fbfd4b83fdfae787a5e6ff8",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "katiem0",
 | 
				
			||||||
 | 
					        "repo": "gh-collaborators",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "hmts-nvim-src": {
 | 
					    "hmts-nvim-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1715076655,
 | 
					        "lastModified": 1729786258,
 | 
				
			||||||
        "narHash": "sha256-vDTqJQzLyg0nmlC+CrLnPkYti1rPxmvRW8eQq/9Zg+M=",
 | 
					        "narHash": "sha256-V5dwIJdxBulFVKk1iSlf4H5NRz1UH7uYQeMvwtgkpIs=",
 | 
				
			||||||
        "owner": "calops",
 | 
					        "owner": "calops",
 | 
				
			||||||
        "repo": "hmts.nvim",
 | 
					        "repo": "hmts.nvim",
 | 
				
			||||||
        "rev": "19a91816c123173a4551a6a04f2882338f20db1d",
 | 
					        "rev": "c7ff4c3ad96cd05664b18fb5bbbe2abbd7682dd2",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -267,11 +283,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718983978,
 | 
					        "lastModified": 1730837930,
 | 
				
			||||||
        "narHash": "sha256-lp6stESwTLBZUQ5GBivxwNehShmBp4jqeX/1xahM61w=",
 | 
					        "narHash": "sha256-0kZL4m+bKBJUBQse0HanewWO0g8hDdCvBhudzxgehqc=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "home-manager",
 | 
					        "repo": "home-manager",
 | 
				
			||||||
        "rev": "c559542f0aa87971a7f4c1b3478fe33cc904b902",
 | 
					        "rev": "2f607e07f3ac7e53541120536708e824acccfaa8",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -291,11 +307,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718893255,
 | 
					        "lastModified": 1727470707,
 | 
				
			||||||
        "narHash": "sha256-NdSDGdz5eU/EcnGn8ECP1V+mn5hyGOZQ4ybv2bWTpuk=",
 | 
					        "narHash": "sha256-BqkwZ2mvzn+COdfIuzllSzWmiaBwQktt4sw9slfwM70=",
 | 
				
			||||||
        "owner": "hraban",
 | 
					        "owner": "hraban",
 | 
				
			||||||
        "repo": "mac-app-util",
 | 
					        "repo": "mac-app-util",
 | 
				
			||||||
        "rev": "1857b26aceaf64c2b6a357eb83cf34139b6365cc",
 | 
					        "rev": "9c6bbe2a6a7ec647d03f64f0fadb874284f59eac",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -307,52 +323,53 @@
 | 
				
			|||||||
    "nextcloud-cookbook": {
 | 
					    "nextcloud-cookbook": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1702545935,
 | 
					        "lastModified": 1726214817,
 | 
				
			||||||
        "narHash": "sha256-19LN1nYJJ0RMWj6DrYPvHzocTyhMfYdpdhBFch3fpHE=",
 | 
					        "narHash": "sha256-Pfa+Xbopg20os+pnGgg+wpEX1MI5fz5JMb0K4a8rBhs=",
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.0/cookbook-0.11.0.tar.gz"
 | 
					        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.0/cookbook-0.11.0.tar.gz"
 | 
					        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nextcloud-external": {
 | 
					    "nextcloud-external": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1699624334,
 | 
					        "lastModified": 1729501349,
 | 
				
			||||||
        "narHash": "sha256-RCL2RP5twRDLxI/KfAX6QLYQOzqZmSWsfrC5ZQIwTD4=",
 | 
					        "narHash": "sha256-OV6HhFBzmnQBO5btGEnqmKlaUMY7/t2Qm3XebclpBlM=",
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.3.1/external-v5.3.1.tar.gz"
 | 
					        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.3.1/external-v5.3.1.tar.gz"
 | 
					        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nextcloud-news": {
 | 
					    "nextcloud-news": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1703426420,
 | 
					        "lastModified": 1729667621,
 | 
				
			||||||
        "narHash": "sha256-AENBJH/bEob5JQvw4WEi864mdLYJ5Mqe78HJH6ceCpI=",
 | 
					        "narHash": "sha256-pnvyMZQ+NYMgH0Unfh5S19HdZSjnghgoUDAoi2KIXNI=",
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha3/news.tar.gz"
 | 
					        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "type": "tarball",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha3/news.tar.gz"
 | 
					        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nextcloud-snappymail": {
 | 
					    "nextcloud-snappymail": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "narHash": "sha256-7oJEJ6t6iS/pcnSHashf1AkOEf+gKizpQHBy9XwY4Yo=",
 | 
					        "lastModified": 1731123727,
 | 
				
			||||||
        "type": "file",
 | 
					        "narHash": "sha256-oCw6Brs85rINBHvz3UJXheyLVqvA3RgPXG03b30Fx7E=",
 | 
				
			||||||
        "url": "https://github.com/nmasur/snappymail-nextcloud/releases/download/v2.36.1/snappymail-2.36.1-nextcloud.tar.gz"
 | 
					        "type": "tarball",
 | 
				
			||||||
 | 
					        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.38.2-nextcloud.tar.gz"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "type": "file",
 | 
					        "type": "tarball",
 | 
				
			||||||
        "url": "https://github.com/nmasur/snappymail-nextcloud/releases/download/v2.36.1/snappymail-2.36.1-nextcloud.tar.gz"
 | 
					        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.38.2-nextcloud.tar.gz"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nix2vim": {
 | 
					    "nix2vim": {
 | 
				
			||||||
@@ -363,11 +380,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718621825,
 | 
					        "lastModified": 1729103549,
 | 
				
			||||||
        "narHash": "sha256-bSfjwRgKKpLyjEDPRAF1hlJKc7QDoqopalHwNCB/eAA=",
 | 
					        "narHash": "sha256-9caCn1wB0bD39bwwjnTsHoDveCUKs06nBe212fs5TKU=",
 | 
				
			||||||
        "owner": "gytis-ivaskevicius",
 | 
					        "owner": "gytis-ivaskevicius",
 | 
				
			||||||
        "repo": "nix2vim",
 | 
					        "repo": "nix2vim",
 | 
				
			||||||
        "rev": "1db11dbf8a4d124e02244fa5c4ff219b672a8e5b",
 | 
					        "rev": "b3900e6d79233573f318006505d9ad3fb7170b92",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -378,11 +395,11 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    "nixlib": {
 | 
					    "nixlib": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1712450863,
 | 
					        "lastModified": 1729386149,
 | 
				
			||||||
        "narHash": "sha256-K6IkdtMtq9xktmYPj0uaYc8NsIqHuaAoRBaMgu9Fvrw=",
 | 
					        "narHash": "sha256-hUP9oxmnOmNnKcDOf5Y55HQ+NnoT0+bLWHLQWLLw9Ks=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "nixpkgs.lib",
 | 
					        "repo": "nixpkgs.lib",
 | 
				
			||||||
        "rev": "3c62b6a12571c9a7f65ab037173ee153d539905f",
 | 
					        "rev": "cce4521b6df014e79a7b7afc58c703ed683c916e",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -399,11 +416,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718025593,
 | 
					        "lastModified": 1729472750,
 | 
				
			||||||
        "narHash": "sha256-WZ1gdKq/9u1Ns/oXuNsDm+W0salonVA0VY1amw8urJ4=",
 | 
					        "narHash": "sha256-s93LPHi5BN7I2xSGNAFWiYb8WRsPvT1LE9ZjZBrpFlg=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "nixos-generators",
 | 
					        "repo": "nixos-generators",
 | 
				
			||||||
        "rev": "35c20ba421dfa5059e20e0ef2343c875372bdcf3",
 | 
					        "rev": "7c60ba4bc8d6aa2ba3e5b0f6ceb9fc07bc261565",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -414,11 +431,11 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    "nixpkgs": {
 | 
					    "nixpkgs": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718895438,
 | 
					        "lastModified": 1730785428,
 | 
				
			||||||
        "narHash": "sha256-k3JqJrkdoYwE3fHE6xGDY676AYmyh4U2Zw+0Bwe5DLU=",
 | 
					        "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=",
 | 
				
			||||||
        "owner": "nixos",
 | 
					        "owner": "nixos",
 | 
				
			||||||
        "repo": "nixpkgs",
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
        "rev": "d603719ec6e294f034936c0d0dc06f689d91b6c3",
 | 
					        "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -444,13 +461,45 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "nixpkgs-stable": {
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1730883749,
 | 
				
			||||||
 | 
					        "narHash": "sha256-mwrFF0vElHJP8X3pFCByJR365Q2463ATp2qGIrDUdlE=",
 | 
				
			||||||
 | 
					        "owner": "nixos",
 | 
				
			||||||
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
 | 
					        "rev": "dba414932936fde69f0606b4f1d87c5bc0003ede",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "nixos",
 | 
				
			||||||
 | 
					        "ref": "nixos-24.05",
 | 
				
			||||||
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nixpkgs_2": {
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1730531603,
 | 
				
			||||||
 | 
					        "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=",
 | 
				
			||||||
 | 
					        "owner": "NixOS",
 | 
				
			||||||
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
 | 
					        "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "NixOS",
 | 
				
			||||||
 | 
					        "ref": "nixos-unstable",
 | 
				
			||||||
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "nur": {
 | 
					    "nur": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1719001822,
 | 
					        "lastModified": 1731119600,
 | 
				
			||||||
        "narHash": "sha256-rbEP1CTzYvdSAKf1a729De9t8GMIrZ5GmD+PdYCnrgg=",
 | 
					        "narHash": "sha256-Asx9nXJBdRN4AvuA8+etlQWY8PrqrXXvPb1uNFveV8k=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "nur",
 | 
					        "repo": "nur",
 | 
				
			||||||
        "rev": "e7edcaeae9db01224266febe88eb7d3411055636",
 | 
					        "rev": "b29499982ee565c8dab5ca5c7be8d2ebfc267d87",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -462,11 +511,11 @@
 | 
				
			|||||||
    "nvim-lint-src": {
 | 
					    "nvim-lint-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1717789608,
 | 
					        "lastModified": 1730367889,
 | 
				
			||||||
        "narHash": "sha256-LNYFxAM9lQNNOIOc+IgKgbSRp2U09B/9HivSCwMyUpQ=",
 | 
					        "narHash": "sha256-vLsyRc8nbJJBjWebNFy5yrS6w2TmibEeMNpyzFenoTg=",
 | 
				
			||||||
        "owner": "mfussenegger",
 | 
					        "owner": "mfussenegger",
 | 
				
			||||||
        "repo": "nvim-lint",
 | 
					        "repo": "nvim-lint",
 | 
				
			||||||
        "rev": "941fa1220a61797a51f3af9ec6b7d74c8c7367ce",
 | 
					        "rev": "36da8dd0ddc4f88e0beae234c20e75397326f143",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -495,11 +544,11 @@
 | 
				
			|||||||
    "nvim-tree-lua-src": {
 | 
					    "nvim-tree-lua-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1717900986,
 | 
					        "lastModified": 1731122044,
 | 
				
			||||||
        "narHash": "sha256-7KO3wPW65IH4m0jEoyFScNiAVwrlNHU+p0H55AuwlWk=",
 | 
					        "narHash": "sha256-pf4S8iMtgCJU8jOMxqr0oItO0htBGafGglKnEU1neus=",
 | 
				
			||||||
        "owner": "kyazdani42",
 | 
					        "owner": "kyazdani42",
 | 
				
			||||||
        "repo": "nvim-tree.lua",
 | 
					        "repo": "nvim-tree.lua",
 | 
				
			||||||
        "rev": "2086e564c4d23fea714e8a6d63b881e551af2f41",
 | 
					        "rev": "3fc8de198c15ec4e5395f57b70579b3959976960",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -511,16 +560,16 @@
 | 
				
			|||||||
    "nvim-treesitter-src": {
 | 
					    "nvim-treesitter-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718957498,
 | 
					        "lastModified": 1705679158,
 | 
				
			||||||
        "narHash": "sha256-GEuKEAZxLGMkyjdJGzrIKNR1X10RHlACC6s1lNOq7aw=",
 | 
					        "narHash": "sha256-zAyiitJIgOCZTB0CmgNt0MHENM70SOHLIoWrVwOJKFg=",
 | 
				
			||||||
        "owner": "nvim-treesitter",
 | 
					        "owner": "nvim-treesitter",
 | 
				
			||||||
        "repo": "nvim-treesitter",
 | 
					        "repo": "nvim-treesitter",
 | 
				
			||||||
        "rev": "b967bbc27b564001c3d3b8ea93444cf6d0b21d23",
 | 
					        "rev": "f197a15b0d1e8d555263af20add51450e5aaa1f0",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "owner": "nvim-treesitter",
 | 
					        "owner": "nvim-treesitter",
 | 
				
			||||||
        "ref": "master",
 | 
					        "ref": "v0.9.2",
 | 
				
			||||||
        "repo": "nvim-treesitter",
 | 
					        "repo": "nvim-treesitter",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -567,6 +616,7 @@
 | 
				
			|||||||
        "disko": "disko",
 | 
					        "disko": "disko",
 | 
				
			||||||
        "fidget-nvim-src": "fidget-nvim-src",
 | 
					        "fidget-nvim-src": "fidget-nvim-src",
 | 
				
			||||||
        "firefox-darwin": "firefox-darwin",
 | 
					        "firefox-darwin": "firefox-darwin",
 | 
				
			||||||
 | 
					        "gh-collaborators": "gh-collaborators",
 | 
				
			||||||
        "hmts-nvim-src": "hmts-nvim-src",
 | 
					        "hmts-nvim-src": "hmts-nvim-src",
 | 
				
			||||||
        "home-manager": "home-manager",
 | 
					        "home-manager": "home-manager",
 | 
				
			||||||
        "mac-app-util": "mac-app-util",
 | 
					        "mac-app-util": "mac-app-util",
 | 
				
			||||||
@@ -578,6 +628,7 @@
 | 
				
			|||||||
        "nixos-generators": "nixos-generators",
 | 
					        "nixos-generators": "nixos-generators",
 | 
				
			||||||
        "nixpkgs": "nixpkgs",
 | 
					        "nixpkgs": "nixpkgs",
 | 
				
			||||||
        "nixpkgs-caddy": "nixpkgs-caddy",
 | 
					        "nixpkgs-caddy": "nixpkgs-caddy",
 | 
				
			||||||
 | 
					        "nixpkgs-stable": "nixpkgs-stable",
 | 
				
			||||||
        "nur": "nur",
 | 
					        "nur": "nur",
 | 
				
			||||||
        "nvim-lint-src": "nvim-lint-src",
 | 
					        "nvim-lint-src": "nvim-lint-src",
 | 
				
			||||||
        "nvim-lspconfig-src": "nvim-lspconfig-src",
 | 
					        "nvim-lspconfig-src": "nvim-lspconfig-src",
 | 
				
			||||||
@@ -585,8 +636,10 @@
 | 
				
			|||||||
        "nvim-treesitter-src": "nvim-treesitter-src",
 | 
					        "nvim-treesitter-src": "nvim-treesitter-src",
 | 
				
			||||||
        "ren": "ren",
 | 
					        "ren": "ren",
 | 
				
			||||||
        "rep": "rep",
 | 
					        "rep": "rep",
 | 
				
			||||||
 | 
					        "snipe-nvim-src": "snipe-nvim-src",
 | 
				
			||||||
        "telescope-nvim-src": "telescope-nvim-src",
 | 
					        "telescope-nvim-src": "telescope-nvim-src",
 | 
				
			||||||
        "telescope-project-nvim-src": "telescope-project-nvim-src",
 | 
					        "telescope-project-nvim-src": "telescope-project-nvim-src",
 | 
				
			||||||
 | 
					        "tiny-inline-diagnostic-nvim-src": "tiny-inline-diagnostic-nvim-src",
 | 
				
			||||||
        "toggleterm-nvim-src": "toggleterm-nvim-src",
 | 
					        "toggleterm-nvim-src": "toggleterm-nvim-src",
 | 
				
			||||||
        "tree-sitter-bash": "tree-sitter-bash",
 | 
					        "tree-sitter-bash": "tree-sitter-bash",
 | 
				
			||||||
        "tree-sitter-ini": "tree-sitter-ini",
 | 
					        "tree-sitter-ini": "tree-sitter-ini",
 | 
				
			||||||
@@ -595,11 +648,28 @@
 | 
				
			|||||||
        "tree-sitter-python": "tree-sitter-python",
 | 
					        "tree-sitter-python": "tree-sitter-python",
 | 
				
			||||||
        "tree-sitter-rasi": "tree-sitter-rasi",
 | 
					        "tree-sitter-rasi": "tree-sitter-rasi",
 | 
				
			||||||
        "tree-sitter-vimdoc": "tree-sitter-vimdoc",
 | 
					        "tree-sitter-vimdoc": "tree-sitter-vimdoc",
 | 
				
			||||||
 | 
					        "ucodenix": "ucodenix",
 | 
				
			||||||
        "wallpapers": "wallpapers",
 | 
					        "wallpapers": "wallpapers",
 | 
				
			||||||
        "wsl": "wsl",
 | 
					        "wsl": "wsl",
 | 
				
			||||||
        "zenyd-mpv-scripts": "zenyd-mpv-scripts"
 | 
					        "zenyd-mpv-scripts": "zenyd-mpv-scripts"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "snipe-nvim-src": {
 | 
				
			||||||
 | 
					      "flake": false,
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1730493972,
 | 
				
			||||||
 | 
					        "narHash": "sha256-9Q/ZbhtteS9SemQJ/3Nov1rshQgm1Beiw88/zgmJbRg=",
 | 
				
			||||||
 | 
					        "owner": "leath-dub",
 | 
				
			||||||
 | 
					        "repo": "snipe.nvim",
 | 
				
			||||||
 | 
					        "rev": "64b3763c1b388ac5a3d5a2da615a3d0824af4a45",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "leath-dub",
 | 
				
			||||||
 | 
					        "repo": "snipe.nvim",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "systems": {
 | 
					    "systems": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1681028828,
 | 
					        "lastModified": 1681028828,
 | 
				
			||||||
@@ -665,11 +735,11 @@
 | 
				
			|||||||
    "telescope-project-nvim-src": {
 | 
					    "telescope-project-nvim-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1701464478,
 | 
					        "lastModified": 1725880250,
 | 
				
			||||||
        "narHash": "sha256-touMCltcnqkrQYV1NtNeWLQeFVGt+WM3aIWIdKilA7w=",
 | 
					        "narHash": "sha256-wO/cm5PT1L0hFr/CX466w0UimoFg/tWrDK8T0QeKZMU=",
 | 
				
			||||||
        "owner": "nvim-telescope",
 | 
					        "owner": "nvim-telescope",
 | 
				
			||||||
        "repo": "telescope-project.nvim",
 | 
					        "repo": "telescope-project.nvim",
 | 
				
			||||||
        "rev": "1aaf16580a614601a7f7077d9639aeb457dc5559",
 | 
					        "rev": "796200876bb0fe8157b8eb1ce03d927d3827a052",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -678,19 +748,35 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "tiny-inline-diagnostic-nvim-src": {
 | 
				
			||||||
 | 
					      "flake": false,
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1731028203,
 | 
				
			||||||
 | 
					        "narHash": "sha256-A4v8pZuzuH/MSWYF7Hg7ZQo2HNLqlE7dZMhylPEpTdM=",
 | 
				
			||||||
 | 
					        "owner": "rachartier",
 | 
				
			||||||
 | 
					        "repo": "tiny-inline-diagnostic.nvim",
 | 
				
			||||||
 | 
					        "rev": "86050f39a62de48734f1a2876d70d179b75deb7c",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "rachartier",
 | 
				
			||||||
 | 
					        "repo": "tiny-inline-diagnostic.nvim",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "toggleterm-nvim-src": {
 | 
					    "toggleterm-nvim-src": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1713792255,
 | 
					        "lastModified": 1721232722,
 | 
				
			||||||
        "narHash": "sha256-mM5bGgAemsRJD9U6U5K6ia5qb8NaTusM99x6xrtEBfw=",
 | 
					        "narHash": "sha256-hJ6nBCgSyYF1pY4lX+b8WZd49i5F6BwOmrl7xVSIwRw=",
 | 
				
			||||||
        "owner": "akinsho",
 | 
					        "owner": "akinsho",
 | 
				
			||||||
        "repo": "toggleterm.nvim",
 | 
					        "repo": "toggleterm.nvim",
 | 
				
			||||||
        "rev": "066cccf48a43553a80a210eb3be89a15d789d6e6",
 | 
					        "rev": "48be57eaba817f038d61bbf64d2c597f578c0827",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
        "owner": "akinsho",
 | 
					        "owner": "akinsho",
 | 
				
			||||||
        "ref": "v2.11.0",
 | 
					        "ref": "v2.12.0",
 | 
				
			||||||
        "repo": "toggleterm.nvim",
 | 
					        "repo": "toggleterm.nvim",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -698,11 +784,11 @@
 | 
				
			|||||||
    "tree-sitter-bash": {
 | 
					    "tree-sitter-bash": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1715005250,
 | 
					        "lastModified": 1728963142,
 | 
				
			||||||
        "narHash": "sha256-rCuQbnQAOnQWKYreNH80nlL+0A1qbWbjMvtczcoWPrY=",
 | 
					        "narHash": "sha256-h6L5eIItu3IOJBKSZCajHMhhencN1Fk/4dXgBMuVxYc=",
 | 
				
			||||||
        "owner": "tree-sitter",
 | 
					        "owner": "tree-sitter",
 | 
				
			||||||
        "repo": "tree-sitter-bash",
 | 
					        "repo": "tree-sitter-bash",
 | 
				
			||||||
        "rev": "2fbd860f802802ca76a6661ce025b3a3bca2d3ed",
 | 
					        "rev": "597a5ed6ed4d932fd44697feec988f977081ae59",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -715,11 +801,11 @@
 | 
				
			|||||||
    "tree-sitter-ini": {
 | 
					    "tree-sitter-ini": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1716889525,
 | 
					        "lastModified": 1725233451,
 | 
				
			||||||
        "narHash": "sha256-IyHrIxcmuzs60zUiJv4E3nSkhSkgbcaLDUdeDx5mlHk=",
 | 
					        "narHash": "sha256-G11Aynq2rnkRwdkhspjYqtBD/h5k4aD+NvuE0QfploU=",
 | 
				
			||||||
        "owner": "justinmk",
 | 
					        "owner": "justinmk",
 | 
				
			||||||
        "repo": "tree-sitter-ini",
 | 
					        "repo": "tree-sitter-ini",
 | 
				
			||||||
        "rev": "87176e524f0a98f5be75fa44f4f0ff5c6eac069c",
 | 
					        "rev": "962568c9efa71d25720ab42c5d36e222626ef3a6",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -731,11 +817,11 @@
 | 
				
			|||||||
    "tree-sitter-lua": {
 | 
					    "tree-sitter-lua": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1710150044,
 | 
					        "lastModified": 1729494737,
 | 
				
			||||||
        "narHash": "sha256-uFaEptW4wPrqgHfB1mYmVltf+4no61L2cPgpsr5qBIU=",
 | 
					        "narHash": "sha256-v+fFcIOv+bu+2IGI/Lh/Xbqd5BzbBjaa51ECd0hG7Ow=",
 | 
				
			||||||
        "owner": "MunifTanjim",
 | 
					        "owner": "MunifTanjim",
 | 
				
			||||||
        "repo": "tree-sitter-lua",
 | 
					        "repo": "tree-sitter-lua",
 | 
				
			||||||
        "rev": "a24dab177e58c9c6832f96b9a73102a0cfbced4a",
 | 
					        "rev": "34e60e7f45fc313463c68090d88d742a55d1bd7a",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -764,11 +850,11 @@
 | 
				
			|||||||
    "tree-sitter-python": {
 | 
					    "tree-sitter-python": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1714528221,
 | 
					        "lastModified": 1728966077,
 | 
				
			||||||
        "narHash": "sha256-hHQ5gK4dTRSdp0fLKarytU9vFhsBeQp7Ka61vFoIr7Y=",
 | 
					        "narHash": "sha256-pD4JedYrnz6d5pgzRPtKPY0XPRoot1FMI9XgTgONOyw=",
 | 
				
			||||||
        "owner": "tree-sitter",
 | 
					        "owner": "tree-sitter",
 | 
				
			||||||
        "repo": "tree-sitter-python",
 | 
					        "repo": "tree-sitter-python",
 | 
				
			||||||
        "rev": "71778c2a472ed00a64abf4219544edbf8e4b86d7",
 | 
					        "rev": "7f4b9c2d8039701b0579b7c060a918f8548aa7cd",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -797,11 +883,11 @@
 | 
				
			|||||||
    "tree-sitter-vimdoc": {
 | 
					    "tree-sitter-vimdoc": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1717834376,
 | 
					        "lastModified": 1729686839,
 | 
				
			||||||
        "narHash": "sha256-v+XSWGm2Wdn9/rxNFMqXYACkGn6AvxZdxkClLuKnWGU=",
 | 
					        "narHash": "sha256-Vrl4/cZL+TWlUMEeWZoHCAWhvlefcl3ajGcwyTNKOhI=",
 | 
				
			||||||
        "owner": "neovim",
 | 
					        "owner": "neovim",
 | 
				
			||||||
        "repo": "tree-sitter-vimdoc",
 | 
					        "repo": "tree-sitter-vimdoc",
 | 
				
			||||||
        "rev": "2249c44ecd3f5cf22da3dcccfb74f816ddb29245",
 | 
					        "rev": "d2e4b5c172a109966c2ce0378f73df6cede39400",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
@@ -810,6 +896,24 @@
 | 
				
			|||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "ucodenix": {
 | 
				
			||||||
 | 
					      "inputs": {
 | 
				
			||||||
 | 
					        "nixpkgs": "nixpkgs_2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "locked": {
 | 
				
			||||||
 | 
					        "lastModified": 1731337052,
 | 
				
			||||||
 | 
					        "narHash": "sha256-/wKkjAHHmaov6VWW7POdL+dUWtAWA9Zs6Ys/r7ugy00=",
 | 
				
			||||||
 | 
					        "owner": "e-tho",
 | 
				
			||||||
 | 
					        "repo": "ucodenix",
 | 
				
			||||||
 | 
					        "rev": "5d8df57d4258d225dc9f5c2c4bb96855842cbac2",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "original": {
 | 
				
			||||||
 | 
					        "owner": "e-tho",
 | 
				
			||||||
 | 
					        "repo": "ucodenix",
 | 
				
			||||||
 | 
					        "type": "github"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "wallpapers": {
 | 
					    "wallpapers": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
@@ -835,11 +939,11 @@
 | 
				
			|||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1718710563,
 | 
					        "lastModified": 1730453870,
 | 
				
			||||||
        "narHash": "sha256-O4rrM0Bkh3IRe8D600iniQ52QTmlnuTSp2KyXV7C2jE=",
 | 
					        "narHash": "sha256-d+kIgz4BvTXb7emjSFV3zjNydGmLUmuluQjdBb51R9o=",
 | 
				
			||||||
        "owner": "nix-community",
 | 
					        "owner": "nix-community",
 | 
				
			||||||
        "repo": "NixOS-WSL",
 | 
					        "repo": "NixOS-WSL",
 | 
				
			||||||
        "rev": "2fb93bea657ad99a7005ef601c67cb2820560a41",
 | 
					        "rev": "adb6bc4b661a43328752b4575be4968a4990c033",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										43
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								flake.nix
									
									
									
									
									
								
							@@ -7,6 +7,9 @@
 | 
				
			|||||||
    # Used for system packages
 | 
					    # Used for system packages
 | 
				
			||||||
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
 | 
					    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Used for specific stable packages
 | 
				
			||||||
 | 
					    nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.05";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Used for caddy plugins
 | 
					    # Used for caddy plugins
 | 
				
			||||||
    nixpkgs-caddy.url = "github:jpds/nixpkgs/caddy-external-plugins";
 | 
					    nixpkgs-caddy.url = "github:jpds/nixpkgs/caddy-external-plugins";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,6 +31,9 @@
 | 
				
			|||||||
      inputs.nixpkgs.follows = "nixpkgs"; # Use system packages list for their inputs
 | 
					      inputs.nixpkgs.follows = "nixpkgs"; # Use system packages list for their inputs
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Used for AMD CPU microcode
 | 
				
			||||||
 | 
					    ucodenix.url = "github:e-tho/ucodenix";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Community packages; used for Firefox extensions
 | 
					    # Community packages; used for Firefox extensions
 | 
				
			||||||
    nur.url = "github:nix-community/nur";
 | 
					    nur.url = "github:nix-community/nur";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -88,7 +94,7 @@
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    nvim-treesitter-src = {
 | 
					    nvim-treesitter-src = {
 | 
				
			||||||
      # https://github.com/nvim-treesitter/nvim-treesitter/tags
 | 
					      # https://github.com/nvim-treesitter/nvim-treesitter/tags
 | 
				
			||||||
      url = "github:nvim-treesitter/nvim-treesitter/master";
 | 
					      url = "github:nvim-treesitter/nvim-treesitter/v0.9.2";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    telescope-nvim-src = {
 | 
					    telescope-nvim-src = {
 | 
				
			||||||
@@ -102,7 +108,7 @@
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    toggleterm-nvim-src = {
 | 
					    toggleterm-nvim-src = {
 | 
				
			||||||
      # https://github.com/akinsho/toggleterm.nvim/tags
 | 
					      # https://github.com/akinsho/toggleterm.nvim/tags
 | 
				
			||||||
      url = "github:akinsho/toggleterm.nvim/v2.11.0";
 | 
					      url = "github:akinsho/toggleterm.nvim/v2.12.0";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    bufferline-nvim-src = {
 | 
					    bufferline-nvim-src = {
 | 
				
			||||||
@@ -127,6 +133,14 @@
 | 
				
			|||||||
      url = "github:mfussenegger/nvim-lint";
 | 
					      url = "github:mfussenegger/nvim-lint";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    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;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Tree-Sitter Grammars
 | 
					    # Tree-Sitter Grammars
 | 
				
			||||||
    tree-sitter-bash = {
 | 
					    tree-sitter-bash = {
 | 
				
			||||||
@@ -174,26 +188,32 @@
 | 
				
			|||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gh-collaborators = {
 | 
				
			||||||
 | 
					      url = "github:katiem0/gh-collaborators";
 | 
				
			||||||
 | 
					      flake = false;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Nextcloud Apps
 | 
					    # Nextcloud Apps
 | 
				
			||||||
    nextcloud-news = {
 | 
					    nextcloud-news = {
 | 
				
			||||||
      # https://github.com/nextcloud/news/releases
 | 
					      # https://github.com/nextcloud/news/releases
 | 
				
			||||||
      url = "https://github.com/nextcloud/news/releases/download/25.0.0-alpha3/news.tar.gz";
 | 
					      url = "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    nextcloud-external = {
 | 
					    nextcloud-external = {
 | 
				
			||||||
      # https://github.com/nextcloud-releases/external/releases
 | 
					      # https://github.com/nextcloud-releases/external/releases
 | 
				
			||||||
      url = "https://github.com/nextcloud-releases/external/releases/download/v5.3.1/external-v5.3.1.tar.gz";
 | 
					      url = "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    nextcloud-cookbook = {
 | 
					    nextcloud-cookbook = {
 | 
				
			||||||
      # https://github.com/christianlupus-nextcloud/cookbook-releases/releases/
 | 
					      # https://github.com/christianlupus-nextcloud/cookbook-releases/releases/
 | 
				
			||||||
      url = "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.0/cookbook-0.11.0.tar.gz";
 | 
					      url = "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz";
 | 
				
			||||||
      flake = false;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    nextcloud-snappymail = {
 | 
					    nextcloud-snappymail = {
 | 
				
			||||||
      # https://github.com/the-djmaze/snappymail/releases
 | 
					      # https://github.com/the-djmaze/snappymail/releases
 | 
				
			||||||
      # https://snappymail.eu/repository/nextcloud
 | 
					      # https://snappymail.eu/repository/nextcloud
 | 
				
			||||||
      url = "file+https://github.com/nmasur/snappymail-nextcloud/releases/download/v2.36.1/snappymail-2.36.1-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;
 | 
					      flake = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
@@ -218,12 +238,15 @@
 | 
				
			|||||||
          mail.smtpHost = "smtp.purelymail.com";
 | 
					          mail.smtpHost = "smtp.purelymail.com";
 | 
				
			||||||
          dotfilesRepo = "https://github.com/nmasur/dotfiles";
 | 
					          dotfilesRepo = "https://github.com/nmasur/dotfiles";
 | 
				
			||||||
          hostnames = {
 | 
					          hostnames = {
 | 
				
			||||||
 | 
					            audiobooks = "read.${baseName}";
 | 
				
			||||||
 | 
					            files = "files.${baseName}";
 | 
				
			||||||
            git = "git.${baseName}";
 | 
					            git = "git.${baseName}";
 | 
				
			||||||
            influxdb = "influxdb.${baseName}";
 | 
					            influxdb = "influxdb.${baseName}";
 | 
				
			||||||
            irc = "irc.${baseName}";
 | 
					            irc = "irc.${baseName}";
 | 
				
			||||||
            metrics = "metrics.${baseName}";
 | 
					            metrics = "metrics.${baseName}";
 | 
				
			||||||
            minecraft = "minecraft.${baseName}";
 | 
					            minecraft = "minecraft.${baseName}";
 | 
				
			||||||
            n8n = "n8n2.${baseName}";
 | 
					            n8n = "n8n.${baseName}";
 | 
				
			||||||
 | 
					            notifications = "ntfy.${baseName}";
 | 
				
			||||||
            prometheus = "prom.${baseName}";
 | 
					            prometheus = "prom.${baseName}";
 | 
				
			||||||
            paperless = "paper.${baseName}";
 | 
					            paperless = "paper.${baseName}";
 | 
				
			||||||
            secrets = "vault.${baseName}";
 | 
					            secrets = "vault.${baseName}";
 | 
				
			||||||
@@ -231,6 +254,7 @@
 | 
				
			|||||||
            content = "cloud.${baseName}";
 | 
					            content = "cloud.${baseName}";
 | 
				
			||||||
            books = "books.${baseName}";
 | 
					            books = "books.${baseName}";
 | 
				
			||||||
            download = "download.${baseName}";
 | 
					            download = "download.${baseName}";
 | 
				
			||||||
 | 
					            status = "status.${baseName}";
 | 
				
			||||||
            transmission = "transmission.${baseName}";
 | 
					            transmission = "transmission.${baseName}";
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
@@ -240,13 +264,12 @@
 | 
				
			|||||||
        inputs.nur.overlay
 | 
					        inputs.nur.overlay
 | 
				
			||||||
        inputs.nix2vim.overlay
 | 
					        inputs.nix2vim.overlay
 | 
				
			||||||
        (import ./overlays/neovim-plugins.nix inputs)
 | 
					        (import ./overlays/neovim-plugins.nix inputs)
 | 
				
			||||||
        (import ./overlays/calibre-web.nix)
 | 
					 | 
				
			||||||
        (import ./overlays/disko.nix inputs)
 | 
					        (import ./overlays/disko.nix inputs)
 | 
				
			||||||
        (import ./overlays/tree-sitter.nix inputs)
 | 
					        (import ./overlays/tree-sitter.nix inputs)
 | 
				
			||||||
        (import ./overlays/mpv-scripts.nix inputs)
 | 
					        (import ./overlays/mpv-scripts.nix inputs)
 | 
				
			||||||
        (import ./overlays/nextcloud-apps.nix inputs)
 | 
					        (import ./overlays/nextcloud-apps.nix inputs)
 | 
				
			||||||
        (import ./overlays/betterlockscreen.nix)
 | 
					        (import ./overlays/betterlockscreen.nix)
 | 
				
			||||||
        (import ./overlays/gh-collaborators.nix)
 | 
					        (import ./overlays/gh-collaborators.nix inputs)
 | 
				
			||||||
        (import ./overlays/ren-rep.nix inputs)
 | 
					        (import ./overlays/ren-rep.nix inputs)
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -319,6 +342,7 @@
 | 
				
			|||||||
            system = "x86_64-linux";
 | 
					            system = "x86_64-linux";
 | 
				
			||||||
            format = "iso";
 | 
					            format = "iso";
 | 
				
			||||||
            specialArgs = {
 | 
					            specialArgs = {
 | 
				
			||||||
 | 
					              pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
					              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; };
 | 
					            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; };
 | 
				
			||||||
@@ -327,6 +351,7 @@
 | 
				
			|||||||
            system = "x86_64-linux";
 | 
					            system = "x86_64-linux";
 | 
				
			||||||
            format = "amazon";
 | 
					            format = "amazon";
 | 
				
			||||||
            specialArgs = {
 | 
					            specialArgs = {
 | 
				
			||||||
 | 
					              pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
					              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; } ++ [
 | 
					            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; } ++ [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@
 | 
				
			|||||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
					inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			||||||
  system = "aarch64-linux";
 | 
					  system = "aarch64-linux";
 | 
				
			||||||
  specialArgs = {
 | 
					  specialArgs = {
 | 
				
			||||||
 | 
					    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
					    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  modules = [
 | 
					  modules = [
 | 
				
			||||||
@@ -79,6 +80,9 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
      services.gitea.enable = true;
 | 
					      services.gitea.enable = true;
 | 
				
			||||||
      services.vaultwarden.enable = true;
 | 
					      services.vaultwarden.enable = true;
 | 
				
			||||||
      services.minecraft-server.enable = true; # Setup Minecraft server
 | 
					      services.minecraft-server.enable = true; # Setup Minecraft server
 | 
				
			||||||
 | 
					      services.n8n.enable = true;
 | 
				
			||||||
 | 
					      services.ntfy-sh.enable = true;
 | 
				
			||||||
 | 
					      services.uptime-kuma.enable = true;
 | 
				
			||||||
      system.autoUpgrade.enable = true;
 | 
					      system.autoUpgrade.enable = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Allows private remote access over the internet
 | 
					      # Allows private remote access over the internet
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,6 +53,7 @@ inputs.darwin.lib.darwinSystem {
 | 
				
			|||||||
      _1password.enable = true;
 | 
					      _1password.enable = true;
 | 
				
			||||||
      slack.enable = true;
 | 
					      slack.enable = true;
 | 
				
			||||||
      wezterm.enable = true;
 | 
					      wezterm.enable = true;
 | 
				
			||||||
 | 
					      yt-dlp.enable = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@
 | 
				
			|||||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
					inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			||||||
  system = "x86_64-linux";
 | 
					  system = "x86_64-linux";
 | 
				
			||||||
  specialArgs = {
 | 
					  specialArgs = {
 | 
				
			||||||
 | 
					    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
					    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  modules = [
 | 
					  modules = [
 | 
				
			||||||
@@ -66,6 +67,14 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
        devices = (import ../../disks/root.nix { disk = "/dev/nvme0n1"; });
 | 
					        devices = (import ../../disks/root.nix { disk = "/dev/nvme0n1"; });
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      zramSwap.enable = true;
 | 
				
			||||||
 | 
					      swapDevices = [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          device = "/swapfile";
 | 
				
			||||||
 | 
					          size = 4 * 1024; # 4 GB
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      boot.zfs = {
 | 
					      boot.zfs = {
 | 
				
			||||||
        # Automatically load the ZFS pool on boot
 | 
					        # Automatically load the ZFS pool on boot
 | 
				
			||||||
        extraPools = [ "tank" ];
 | 
					        extraPools = [ "tank" ];
 | 
				
			||||||
@@ -96,6 +105,8 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			|||||||
      cloudflare.enable = true;
 | 
					      cloudflare.enable = true;
 | 
				
			||||||
      dotfiles.enable = true;
 | 
					      dotfiles.enable = true;
 | 
				
			||||||
      arrs.enable = true;
 | 
					      arrs.enable = true;
 | 
				
			||||||
 | 
					      filebrowser.enable = true;
 | 
				
			||||||
 | 
					      services.audiobookshelf.enable = true;
 | 
				
			||||||
      services.bind.enable = true;
 | 
					      services.bind.enable = true;
 | 
				
			||||||
      services.caddy.enable = true;
 | 
					      services.caddy.enable = true;
 | 
				
			||||||
      services.jellyfin.enable = true;
 | 
					      services.jellyfin.enable = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,11 +8,16 @@
 | 
				
			|||||||
  ...
 | 
					  ...
 | 
				
			||||||
}:
 | 
					}:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inputs.nixpkgs.lib.nixosSystem {
 | 
					inputs.nixpkgs.lib.nixosSystem rec {
 | 
				
			||||||
  system = "x86_64-linux";
 | 
					  system = "x86_64-linux";
 | 
				
			||||||
 | 
					  specialArgs = {
 | 
				
			||||||
 | 
					    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
				
			||||||
 | 
					    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
  modules = [
 | 
					  modules = [
 | 
				
			||||||
    globals
 | 
					    globals
 | 
				
			||||||
    inputs.home-manager.nixosModules.home-manager
 | 
					    inputs.home-manager.nixosModules.home-manager
 | 
				
			||||||
 | 
					    inputs.ucodenix.nixosModules.default
 | 
				
			||||||
    ../../modules/common
 | 
					    ../../modules/common
 | 
				
			||||||
    ../../modules/nixos
 | 
					    ../../modules/nixos
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -45,6 +50,7 @@ inputs.nixpkgs.lib.nixosSystem {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      # Allow firmware updates
 | 
					      # Allow firmware updates
 | 
				
			||||||
      hardware.cpu.amd.updateMicrocode = true;
 | 
					      hardware.cpu.amd.updateMicrocode = true;
 | 
				
			||||||
 | 
					      services.ucodenix.enable = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Helps reduce GPU fan noise under idle loads
 | 
					      # Helps reduce GPU fan noise under idle loads
 | 
				
			||||||
      hardware.fancontrol.enable = true;
 | 
					      hardware.fancontrol.enable = true;
 | 
				
			||||||
@@ -118,6 +124,7 @@ inputs.nixpkgs.lib.nixosSystem {
 | 
				
			|||||||
        dwarf-fortress.enable = true;
 | 
					        dwarf-fortress.enable = true;
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
        steam.enable = true;
 | 
					        steam.enable = true;
 | 
				
			||||||
 | 
					        moonlight.enable = true;
 | 
				
			||||||
        legendary.enable = true;
 | 
					        legendary.enable = true;
 | 
				
			||||||
        lutris.enable = true;
 | 
					        lutris.enable = true;
 | 
				
			||||||
        ryujinx.enable = true;
 | 
					        ryujinx.enable = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,10 +22,9 @@
 | 
				
			|||||||
      "1password-cli"
 | 
					      "1password-cli"
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    home-manager.users.${config.user} = {
 | 
					    home-manager.users.${config.user} = {
 | 
				
			||||||
      home.packages = with pkgs; [
 | 
					      home.packages = [
 | 
				
			||||||
        _1password-gui
 | 
					        pkgs._1password-cli
 | 
				
			||||||
        _1password
 | 
					      ] ++ (if pkgs.stdenv.isLinux then [ pkgs._1password-gui ] else [ ]);
 | 
				
			||||||
      ];
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # https://1password.community/discussion/135462/firefox-extension-does-not-connect-to-linux-app
 | 
					    # https://1password.community/discussion/135462/firefox-extension-does-not-connect-to-linux-app
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,6 +71,8 @@
 | 
				
			|||||||
            "cookiebanners.ui.desktop.enabled" = true; # Reject cookie popups
 | 
					            "cookiebanners.ui.desktop.enabled" = true; # Reject cookie popups
 | 
				
			||||||
            "devtools.command-button-screenshot.enabled" = true; # Scrolling screenshot of entire page
 | 
					            "devtools.command-button-screenshot.enabled" = true; # Scrolling screenshot of entire page
 | 
				
			||||||
            "svg.context-properties.content.enabled" = true; # Sidebery styling
 | 
					            "svg.context-properties.content.enabled" = true; # Sidebery styling
 | 
				
			||||||
 | 
					            "browser.tabs.hoverPreview.enabled" = false; # Disable tab previews
 | 
				
			||||||
 | 
					            "browser.tabs.hoverPreview.showThumbnails" = false; # Disable tab previews
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
          userChrome = ''
 | 
					          userChrome = ''
 | 
				
			||||||
            :root {
 | 
					            :root {
 | 
				
			||||||
@@ -157,6 +159,15 @@
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Mimic nixpkgs package environment for read-only profiles.ini management
 | 
				
			||||||
 | 
					      # From: https://github.com/booxter/home-manager/commit/dd1602e306fec366280f5953c5e1b553e3d9672a
 | 
				
			||||||
 | 
					      home.sessionVariables = {
 | 
				
			||||||
 | 
					        MOZ_LEGACY_PROFILES = 1;
 | 
				
			||||||
 | 
					        MOZ_ALLOW_DOWNGRADE = 1;
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # launchd.user.envVariables = config.home-manager.users.${config.user}.home.sessionVariables;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      xdg.mimeApps = {
 | 
					      xdg.mimeApps = {
 | 
				
			||||||
        associations.added = {
 | 
					        associations.added = {
 | 
				
			||||||
          "text/html" = [ "firefox.desktop" ];
 | 
					          "text/html" = [ "firefox.desktop" ];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,10 +34,13 @@
 | 
				
			|||||||
      programs.rofi.terminal = lib.mkIf pkgs.stdenv.isLinux (lib.mkDefault "${pkgs.kitty}/bin/kitty");
 | 
					      programs.rofi.terminal = lib.mkIf pkgs.stdenv.isLinux (lib.mkDefault "${pkgs.kitty}/bin/kitty");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Display images in the terminal
 | 
					      # Display images in the terminal
 | 
				
			||||||
      programs.fish.shellAliases = {
 | 
					      programs.fish.interactiveShellInit = # fish
 | 
				
			||||||
        icat = "kitty +kitten icat";
 | 
					        ''
 | 
				
			||||||
        ssh = "kitty +kitten ssh";
 | 
					          if test "$TERM" = "xterm-kitty"
 | 
				
			||||||
      };
 | 
					              alias icat="kitty +kitten icat"
 | 
				
			||||||
 | 
					              alias ssh="kitty +kitten ssh"
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      programs.kitty = {
 | 
					      programs.kitty = {
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,6 +119,9 @@
 | 
				
			|||||||
                font = wezterm.font('${font}', { weight = 'Bold'}),
 | 
					                font = wezterm.font('${font}', { weight = 'Bold'}),
 | 
				
			||||||
                font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"},
 | 
					                font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                -- Fix color blocks instead of text
 | 
				
			||||||
 | 
					                front_end = "WebGpu",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                -- Tab Bar
 | 
					                -- Tab Bar
 | 
				
			||||||
                hide_tab_bar_if_only_one_tab = true,
 | 
					                hide_tab_bar_if_only_one_tab = true,
 | 
				
			||||||
                window_frame = {
 | 
					                window_frame = {
 | 
				
			||||||
@@ -169,7 +172,7 @@
 | 
				
			|||||||
                  -- super-t open new tab in new dir
 | 
					                  -- super-t open new tab in new dir
 | 
				
			||||||
                  {
 | 
					                  {
 | 
				
			||||||
                    key = 't',
 | 
					                    key = 't',
 | 
				
			||||||
                    mods = 'SUPER',
 | 
					                    mods = ${if pkgs.stdenv.isDarwin then "'SUPER'" else "'ALT'"},
 | 
				
			||||||
                    action = wezterm.action.SpawnCommandInNewTab {
 | 
					                    action = wezterm.action.SpawnCommandInNewTab {
 | 
				
			||||||
                      cwd = wezterm.home_dir,
 | 
					                      cwd = wezterm.home_dir,
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,6 +77,14 @@
 | 
				
			|||||||
      default = [ ];
 | 
					      default = [ ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    hostnames = {
 | 
					    hostnames = {
 | 
				
			||||||
 | 
					      audiobooks = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for audiobook server (Audiobookshelf).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      files = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for files server (Filebrowser).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
      git = lib.mkOption {
 | 
					      git = lib.mkOption {
 | 
				
			||||||
        type = lib.types.str;
 | 
					        type = lib.types.str;
 | 
				
			||||||
        description = "Hostname for git server (Gitea).";
 | 
					        description = "Hostname for git server (Gitea).";
 | 
				
			||||||
@@ -129,6 +137,14 @@
 | 
				
			|||||||
        type = lib.types.str;
 | 
					        type = lib.types.str;
 | 
				
			||||||
        description = "Hostname for n8n automation.";
 | 
					        description = "Hostname for n8n automation.";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					      notifications = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for push notification services (ntfy).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      status = lib.mkOption {
 | 
				
			||||||
 | 
					        type = lib.types.str;
 | 
				
			||||||
 | 
					        description = "Hostname for status page (Uptime-Kuma).";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
      transmission = lib.mkOption {
 | 
					      transmission = lib.mkOption {
 | 
				
			||||||
        type = lib.types.str;
 | 
					        type = lib.types.str;
 | 
				
			||||||
        description = "Hostname for peer2peer downloads (Transmission).";
 | 
					        description = "Hostname for peer2peer downloads (Transmission).";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@
 | 
				
			|||||||
  plugins = [
 | 
					  plugins = [
 | 
				
			||||||
    pkgs.vimPlugins.bufferline-nvim
 | 
					    pkgs.vimPlugins.bufferline-nvim
 | 
				
			||||||
    pkgs.vimPlugins.vim-bbye # Better closing of buffers
 | 
					    pkgs.vimPlugins.vim-bbye # Better closing of buffers
 | 
				
			||||||
 | 
					    pkgs.vimPlugins.snipe-nvim # Jump between open buffers
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
  setup.bufferline = {
 | 
					  setup.bufferline = {
 | 
				
			||||||
    options = {
 | 
					    options = {
 | 
				
			||||||
@@ -15,6 +16,7 @@
 | 
				
			|||||||
      offsets = [ { filetype = "NvimTree"; } ];
 | 
					      offsets = [ { filetype = "NvimTree"; } ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					  setup.snipe = { };
 | 
				
			||||||
  lua = ''
 | 
					  lua = ''
 | 
				
			||||||
    -- Move buffers
 | 
					    -- Move buffers
 | 
				
			||||||
    vim.keymap.set("n", "L", ":BufferLineCycleNext<CR>", { silent = true })
 | 
					    vim.keymap.set("n", "L", ":BufferLineCycleNext<CR>", { silent = true })
 | 
				
			||||||
@@ -22,5 +24,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    -- Kill buffer
 | 
					    -- Kill buffer
 | 
				
			||||||
    vim.keymap.set("n", "<Leader>x", " :Bdelete<CR>", { silent = true })
 | 
					    vim.keymap.set("n", "<Leader>x", " :Bdelete<CR>", { silent = true })
 | 
				
			||||||
  '';
 | 
					
 | 
				
			||||||
 | 
					    -- Jump to buffer
 | 
				
			||||||
 | 
					    vim.keymap.set("n", "gb", require("snipe").open_buffer_menu, { silent = true }) '';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,9 +19,11 @@
 | 
				
			|||||||
      pkgs.vimPlugins.fidget-nvim
 | 
					      pkgs.vimPlugins.fidget-nvim
 | 
				
			||||||
      pkgs.vimPlugins.nvim-lint
 | 
					      pkgs.vimPlugins.nvim-lint
 | 
				
			||||||
      pkgs.vimPlugins.vim-table-mode
 | 
					      pkgs.vimPlugins.vim-table-mode
 | 
				
			||||||
 | 
					      pkgs.vimPlugins.tiny-inline-diagnostic-nvim
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    setup.fidget = { };
 | 
					    setup.fidget = { };
 | 
				
			||||||
 | 
					    setup.tiny-inline-diagnostic = { };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    use.lspconfig.lua_ls.setup = dsl.callWith {
 | 
					    use.lspconfig.lua_ls.setup = dsl.callWith {
 | 
				
			||||||
      settings = {
 | 
					      settings = {
 | 
				
			||||||
@@ -71,6 +73,9 @@
 | 
				
			|||||||
          files = {
 | 
					          files = {
 | 
				
			||||||
            excludeDirs = [ ".direnv" ];
 | 
					            excludeDirs = [ ".direnv" ];
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
 | 
					          cargo = {
 | 
				
			||||||
 | 
					            features = "all";
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -133,6 +138,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      -- Prevent infinite log size (change this when debugging)
 | 
					      -- Prevent infinite log size (change this when debugging)
 | 
				
			||||||
      vim.lsp.set_log_level("off")
 | 
					      vim.lsp.set_log_level("off")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      -- Hide buffer diagnostics (use tiny-inline-diagnostic.nvim instead)
 | 
				
			||||||
 | 
					      vim.diagnostic.config({ virtual_text = false })
 | 
				
			||||||
    '';
 | 
					    '';
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,8 @@
 | 
				
			|||||||
    pkgs.vimPlugins.vim-eunuch # File manipulation commands
 | 
					    pkgs.vimPlugins.vim-eunuch # File manipulation commands
 | 
				
			||||||
    pkgs.vimPlugins.vim-fugitive # Git commands
 | 
					    pkgs.vimPlugins.vim-fugitive # Git commands
 | 
				
			||||||
    pkgs.vimPlugins.vim-repeat # Better repeat using .
 | 
					    pkgs.vimPlugins.vim-repeat # Better repeat using .
 | 
				
			||||||
    pkgs.vimPlugins.glow-nvim # Markdown preview popup
 | 
					    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.nvim-colorizer-lua # Hex color previews
 | 
				
			||||||
    pkgs.vimPlugins.which-key-nvim # Keybind helper
 | 
					    pkgs.vimPlugins.which-key-nvim # Keybind helper
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
@@ -21,7 +22,7 @@
 | 
				
			|||||||
      names = false;
 | 
					      names = false;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  setup.glow = { };
 | 
					  setup.markview = { };
 | 
				
			||||||
  setup.which-key = { };
 | 
					  setup.which-key = { };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  vim.o = {
 | 
					  vim.o = {
 | 
				
			||||||
@@ -57,8 +58,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  # Better backup, swap and undo storage
 | 
					  # Better backup, swap and undo storage
 | 
				
			||||||
  vim.o.backup = true; # Easier to recover and more secure
 | 
					  vim.o.backup = true; # Easier to recover and more secure
 | 
				
			||||||
  vim.bo.swapfile = false; # Instead of swaps, create backups
 | 
					  vim.opt.undofile = true; # Keeps undos after quit
 | 
				
			||||||
  vim.bo.undofile = true; # Keeps undos after quit
 | 
					  vim.opt.swapfile = false; # Instead of swaps, create backups
 | 
				
			||||||
  vim.o.backupdir = dsl.rawLua ''vim.fn.expand("~/.local/state/nvim/backup//")'';
 | 
					  vim.o.backupdir = dsl.rawLua ''vim.fn.expand("~/.local/state/nvim/backup//")'';
 | 
				
			||||||
  vim.o.undodir = dsl.rawLua ''vim.fn.expand("~/.local/state/nvim/undo//")'';
 | 
					  vim.o.undodir = dsl.rawLua ''vim.fn.expand("~/.local/state/nvim/undo//")'';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ function TERM_TOGGLE()
 | 
				
			|||||||
    basicterminal:toggle()
 | 
					    basicterminal:toggle()
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local nixpkgs = terminal:new({ cmd = "nix repl '<nixpkgs>'" })
 | 
					local nixpkgs = terminal:new({ cmd = "nix repl --expr 'import <nixpkgs>{}'" })
 | 
				
			||||||
function NIXPKGS_TOGGLE()
 | 
					function NIXPKGS_TOGGLE()
 | 
				
			||||||
    nixpkgs:toggle()
 | 
					    nixpkgs:toggle()
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,11 +14,6 @@
 | 
				
			|||||||
    open_mapping = dsl.rawLua "[[<c-\\>]]";
 | 
					    open_mapping = dsl.rawLua "[[<c-\\>]]";
 | 
				
			||||||
    hide_numbers = true;
 | 
					    hide_numbers = true;
 | 
				
			||||||
    direction = "float";
 | 
					    direction = "float";
 | 
				
			||||||
    float_opts = {
 | 
					 | 
				
			||||||
      width = dsl.rawLua "vim.o.columns - 4";
 | 
					 | 
				
			||||||
      height = dsl.rawLua "vim.o.lines - 4";
 | 
					 | 
				
			||||||
      row = 0;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  lua = ''
 | 
					  lua = ''
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,9 +50,9 @@ in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # Create a desktop option for launching Neovim from a file manager
 | 
					        # Create a desktop option for launching Neovim from a file manager
 | 
				
			||||||
        # (Requires launching the terminal and then executing Neovim)
 | 
					        # (Requires launching the terminal and then executing Neovim)
 | 
				
			||||||
        xdg.desktopEntries.nvim = lib.mkIf pkgs.stdenv.isLinux {
 | 
					        xdg.desktopEntries.nvim = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
				
			||||||
          name = "Neovim wrapper";
 | 
					          name = "Neovim wrapper";
 | 
				
			||||||
          exec = "kitty nvim %F";
 | 
					          exec = "${config.home-manager.users.${config.user}.programs.rofi.terminal} nvim %F";
 | 
				
			||||||
          mimeType = [
 | 
					          mimeType = [
 | 
				
			||||||
            "text/plain"
 | 
					            "text/plain"
 | 
				
			||||||
            "text/markdown"
 | 
					            "text/markdown"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,8 +71,8 @@ key("n", "co", ":copen<CR>")
 | 
				
			|||||||
key("n", "cq", ":cclose<CR>")
 | 
					key("n", "cq", ":cclose<CR>")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Other
 | 
					-- Other
 | 
				
			||||||
key("n", "<A-CR>", ":noh<CR>", { silent = true })           --- Clear search in VimWiki
 | 
					key("n", "<A-CR>", ":noh<CR>", { silent = true }) --- Clear search in VimWiki
 | 
				
			||||||
key("n", "Y", "y$")                                         --- Copy to end of line
 | 
					key("n", "Y", "y$") --- Copy to end of line
 | 
				
			||||||
key("v", "<C-r>", "y<Esc>:%s/<C-r>+//gc<left><left><left>") --- Substitute selected
 | 
					key("v", "<C-r>", "y<Esc>:%s/<C-r>+//gc<left><left><left>") --- Substitute selected
 | 
				
			||||||
key("v", "D", "y'>gp")                                      --- Duplicate selected
 | 
					key("v", "D", "y'>gp") --- Duplicate selected
 | 
				
			||||||
key("x", "<Leader>p", '"_dP')                               --- Paste but keep register
 | 
					key("x", "<Leader>p", '"_dP') --- Paste but keep register
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,14 +6,15 @@ BUCKET_NAME_PART_1="t2"
 | 
				
			|||||||
BUCKET_NAME_PART_2="global"
 | 
					BUCKET_NAME_PART_2="global"
 | 
				
			||||||
BUCKET_NAME_PART_3="terraformstate"
 | 
					BUCKET_NAME_PART_3="terraformstate"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKFLOW_FILE=".github/workflows/terraform.yml"
 | 
					PROJECT_ROOT=$(git rev-parse --show-toplevel)
 | 
				
			||||||
 | 
					WORKFLOW_FILE="${PROJECT_ROOT}/.github/workflows/terraform.yml"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ ! -f $WORKFLOW_FILE ]; then
 | 
					if [ ! -f "$WORKFLOW_FILE" ]; then
 | 
				
			||||||
    WORKFLOW_FILE=".github/workflows/apply.yml"
 | 
					    WORKFLOW_FILE="${PROJECT_ROOT}/.github/workflows/apply.yml"
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AWS_ACCOUNT_NUMBER=$(
 | 
					AWS_ACCOUNT_NUMBER=$(
 | 
				
			||||||
    awk '/aws_account_number: .*/ {print $2}' $WORKFLOW_FILE | # Grab account number
 | 
					    awk '/aws_account_number: .*/ {print $2}' "$WORKFLOW_FILE" | # Grab account number
 | 
				
			||||||
        echo "$(
 | 
					        echo "$(
 | 
				
			||||||
            read -r s
 | 
					            read -r s
 | 
				
			||||||
            s=${s//\'/}
 | 
					            s=${s//\'/}
 | 
				
			||||||
@@ -23,7 +24,7 @@ AWS_ACCOUNT_NUMBER=$(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
if [ -z "${AWS_ACCOUNT_NUMBER}" ]; then
 | 
					if [ -z "${AWS_ACCOUNT_NUMBER}" ]; then
 | 
				
			||||||
    AWS_ACCOUNT_NUMBER=$(
 | 
					    AWS_ACCOUNT_NUMBER=$(
 | 
				
			||||||
        awk '/AWS_ACCOUNT_NUMBER: .*/ {print $2}' $WORKFLOW_FILE | # Grab account number
 | 
					        awk '/AWS_ACCOUNT_NUMBER: .*/ {print $2}' "$WORKFLOW_FILE" | # Grab account number
 | 
				
			||||||
            echo "$(
 | 
					            echo "$(
 | 
				
			||||||
                read -r s
 | 
					                read -r s
 | 
				
			||||||
                s=${s//\'/}
 | 
					                s=${s//\'/}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -76,6 +76,10 @@
 | 
				
			|||||||
          description = "Full git commit on notes";
 | 
					          description = "Full git commit on notes";
 | 
				
			||||||
          body = builtins.readFile ./functions/syncnotes.fish;
 | 
					          body = builtins.readFile ./functions/syncnotes.fish;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					        _which = {
 | 
				
			||||||
 | 
					          description = "Identify the path to a program in the shell";
 | 
				
			||||||
 | 
					          body = "command --search (string sub --start=2 $argv)";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      interactiveShellInit = ''
 | 
					      interactiveShellInit = ''
 | 
				
			||||||
        fish_vi_key_bindings
 | 
					        fish_vi_key_bindings
 | 
				
			||||||
@@ -101,10 +105,18 @@
 | 
				
			|||||||
        "-" = "cd -";
 | 
					        "-" = "cd -";
 | 
				
			||||||
        mkd = "mkdir -pv";
 | 
					        mkd = "mkdir -pv";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Convert a program into its full path
 | 
				
			||||||
 | 
					        "=" = {
 | 
				
			||||||
 | 
					          position = "anywhere";
 | 
				
			||||||
 | 
					          regex = "=\\w+";
 | 
				
			||||||
 | 
					          function = "_which";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # System
 | 
					        # System
 | 
				
			||||||
        s = "sudo";
 | 
					        s = "sudo";
 | 
				
			||||||
        sc = "systemctl";
 | 
					        sc = "systemctl";
 | 
				
			||||||
        scs = "systemctl status";
 | 
					        scs = "systemctl status";
 | 
				
			||||||
 | 
					        sca = "systemctl cat";
 | 
				
			||||||
        m = "make";
 | 
					        m = "make";
 | 
				
			||||||
        t = "trash";
 | 
					        t = "trash";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,6 +113,11 @@ in
 | 
				
			|||||||
        gpd = "git push origin -d";
 | 
					        gpd = "git push origin -d";
 | 
				
			||||||
        gbd = "git branch -d";
 | 
					        gbd = "git branch -d";
 | 
				
			||||||
        gbD = "git branch -D";
 | 
					        gbD = "git branch -D";
 | 
				
			||||||
 | 
					        gdd = {
 | 
				
			||||||
 | 
					          position = "anywhere";
 | 
				
			||||||
 | 
					          setCursor = true;
 | 
				
			||||||
 | 
					          expansion = "BRANCH=% git push origin -d $BRANCH and git branch -d $BRANCH";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
        gr = "git reset";
 | 
					        gr = "git reset";
 | 
				
			||||||
        grh = "git reset --hard";
 | 
					        grh = "git reset --hard";
 | 
				
			||||||
        gm = "git merge";
 | 
					        gm = "git merge";
 | 
				
			||||||
@@ -158,6 +163,13 @@ in
 | 
				
			|||||||
                and git branch -D $branch
 | 
					                and git branch -D $branch
 | 
				
			||||||
              '';
 | 
					              '';
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					            git-delete-both = {
 | 
				
			||||||
 | 
					              argumentNames = "branch";
 | 
				
			||||||
 | 
					              body = ''
 | 
				
			||||||
 | 
					                git push origin -d $branch
 | 
				
			||||||
 | 
					                git branch -d $branch
 | 
				
			||||||
 | 
					              '';
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
            git-merge-fuzzy = {
 | 
					            git-merge-fuzzy = {
 | 
				
			||||||
              body = ''
 | 
					              body = ''
 | 
				
			||||||
                set branch (git-fuzzy-branch "merge from...")
 | 
					                set branch (git-fuzzy-branch "merge from...")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@
 | 
				
			|||||||
        ns = "nix-shell -p";
 | 
					        ns = "nix-shell -p";
 | 
				
			||||||
        nsf = "nix-shell --run fish -p";
 | 
					        nsf = "nix-shell --run fish -p";
 | 
				
			||||||
        nsr = "nix-shell-run";
 | 
					        nsr = "nix-shell-run";
 | 
				
			||||||
        nps = "nix repl '<nixpkgs>'";
 | 
					        nps = "nix repl --expr 'import <nixpkgs>{}'";
 | 
				
			||||||
        nixo = "man configuration.nix";
 | 
					        nixo = "man configuration.nix";
 | 
				
			||||||
        nixh = "man home-configuration.nix";
 | 
					        nixh = "man home-configuration.nix";
 | 
				
			||||||
        nr = "rebuild-nixos";
 | 
					        nr = "rebuild-nixos";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,34 +12,40 @@
 | 
				
			|||||||
    home.packages =
 | 
					    home.packages =
 | 
				
			||||||
      let
 | 
					      let
 | 
				
			||||||
        ldap_scheme = "ldaps";
 | 
					        ldap_scheme = "ldaps";
 | 
				
			||||||
        magic_number = "2";
 | 
					 | 
				
			||||||
        magic_end_seq = "corp";
 | 
					 | 
				
			||||||
        magic_prefix = "take";
 | 
					        magic_prefix = "take";
 | 
				
			||||||
        ldap_host = "${magic_prefix}${magic_number}.t${magic_number}.${magic_end_seq}";
 | 
					        ldap_port = 3269;
 | 
				
			||||||
        ldap_port = 636;
 | 
					        jq_parse = pkgs.writeShellScriptBin "ljq" ''
 | 
				
			||||||
        ldap_dc_1 = "${magic_prefix}${magic_number}";
 | 
					          jq --slurp \
 | 
				
			||||||
        ldap_dc_2 = "t${magic_number}";
 | 
					            --raw-input 'split("\n\n")|map(split("\n")|map(select(.[0:1]!="#" and length>0)) |select(length > 0)|map(capture("^(?<key>[^:]*:?): *(?<value>.*)") |if .key[-1:.key|length] == ":" then .key=.key[0:-1]|.value=(.value|@base64d) else . end)| group_by(.key) | map({key:.[0].key,value:(if .|length > 1 then [.[].value] else .[].value end)}) | from_entries)' | jq -r 'del(.[].thumbnailPhoto)'
 | 
				
			||||||
        ldap_dc_3 = magic_end_seq;
 | 
					        '';
 | 
				
			||||||
        ldap_script = pkgs.writeShellScriptBin "ldap" ''
 | 
					        ldap_script = pkgs.writeShellScriptBin "ldap" ''
 | 
				
			||||||
          # if ! [ "$LDAP_HOST" ]; then
 | 
					          if ! [ "$LDAP_HOST" ]; then
 | 
				
			||||||
          #     echo "No LDAP_HOST specified!"
 | 
					              echo "No LDAP_HOST specified!"
 | 
				
			||||||
          #     exit 1
 | 
					              exit 1
 | 
				
			||||||
          # fi
 | 
					          fi
 | 
				
			||||||
          SEARCH_FILTER="$@"
 | 
					          SEARCH_FILTER="$@"
 | 
				
			||||||
          ldapsearch -LLL \
 | 
					          ldapsearch -LLL \
 | 
				
			||||||
              -B -o ldif-wrap=no \
 | 
					              -B -o ldif-wrap=no \
 | 
				
			||||||
              -H "${ldap_scheme}://${ldap_host}:${builtins.toString ldap_port}" \
 | 
					              -E pr=5000/prompt \
 | 
				
			||||||
              -D "${pkgs.lib.toUpper magic_prefix}${magic_number}\\${pkgs.lib.toLower config.user}" \
 | 
					              -H "${ldap_scheme}://''${LDAP_HOST}:${builtins.toString ldap_port}" \
 | 
				
			||||||
              -w "$(${pkgs._1password}/bin/op item get T${magic_number} --fields label=password)" \
 | 
					              -D "${pkgs.lib.toUpper magic_prefix}2\\${pkgs.lib.toLower config.user}" \
 | 
				
			||||||
              -b "DC=${ldap_dc_1},DC=${ldap_dc_2},DC=${ldap_dc_3}" \
 | 
					              -w "$(${pkgs._1password-cli}/bin/op item get T2 --fields label=password --reveal)" \
 | 
				
			||||||
              -s "sub" -x "(cn=$SEARCH_FILTER)" \
 | 
					              -b "dc=''${LDAP_HOST//./,dc=}" \
 | 
				
			||||||
              | jq --slurp \
 | 
					              -s "sub" -x "(cn=''${SEARCH_FILTER})" \
 | 
				
			||||||
                  --raw-input 'split("\n\n")|map(split("\n")|map(select(.[0:1]!="#" and length>0)) |select(length > 0)|map(capture("^(?<key>[^:]*:?): *(?<value>.*)") |if .key[-1:.key|length] == ":" then .key=.key[0:-1]|.value=(.value|@base64d) else . end)| group_by(.key) | map({key:.[0].key,value:(if .|length > 1 then [.[].value] else .[].value end)}) | from_entries)' | jq -r 'del(.[].thumbnailPhoto)'
 | 
					              | ${jq_parse}/bin/ljq
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
        ldapm_script = pkgs.writeShellScriptBin "ldapm" ''
 | 
					        ldapm_script = pkgs.writeShellScriptBin "ldapm" ''
 | 
				
			||||||
 | 
					          if ! [ "$LDAP_HOST" ]; then
 | 
				
			||||||
 | 
					              echo "No LDAP_HOST specified!"
 | 
				
			||||||
 | 
					              exit 1
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
          ${ldap_script}/bin/ldap "$@" | jq '[ .[].memberOf] | add'
 | 
					          ${ldap_script}/bin/ldap "$@" | jq '[ .[].memberOf] | add'
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
        ldapg_script = pkgs.writeShellScriptBin "ldapg" ''
 | 
					        ldapg_script = pkgs.writeShellScriptBin "ldapg" ''
 | 
				
			||||||
 | 
					          if ! [ "$LDAP_HOST" ]; then
 | 
				
			||||||
 | 
					              echo "No LDAP_HOST specified!"
 | 
				
			||||||
 | 
					              exit 1
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
          ${ldap_script}/bin/ldap "$@" | jq '[ .[].member] | add'
 | 
					          ${ldap_script}/bin/ldap "$@" | jq '[ .[].member] | add'
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
      in
 | 
					      in
 | 
				
			||||||
@@ -47,6 +53,7 @@
 | 
				
			|||||||
        ldap_script
 | 
					        ldap_script
 | 
				
			||||||
        ldapm_script
 | 
					        ldapm_script
 | 
				
			||||||
        ldapg_script
 | 
					        ldapg_script
 | 
				
			||||||
 | 
					        jq_parse
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@
 | 
				
			|||||||
    homebrew.casks = [ "hammerspoon" ];
 | 
					    homebrew.casks = [ "hammerspoon" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    system.activationScripts.postUserActivation.text = ''
 | 
					    system.activationScripts.postUserActivation.text = ''
 | 
				
			||||||
      defaults write org.hammerspoon.Hammerspoon MJConfigFile "~/.config/hammerspoon/init.lua"
 | 
					      defaults write org.hammerspoon.Hammerspoon MJConfigFile "${config.homePath}/.config/hammerspoon/init.lua"
 | 
				
			||||||
      sudo killall Dock
 | 
					      sudo killall Dock
 | 
				
			||||||
    '';
 | 
					    '';
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    system = {
 | 
					    system = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      stateVersion = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      keyboard = {
 | 
					      keyboard = {
 | 
				
			||||||
        remapCapsLockToControl = true;
 | 
					        remapCapsLockToControl = true;
 | 
				
			||||||
        enableKeyMapping = true; # Allows for skhd
 | 
					        enableKeyMapping = true; # Allows for skhd
 | 
				
			||||||
@@ -106,7 +108,6 @@
 | 
				
			|||||||
            "${pkgs.discord}/Applications/Discord.app"
 | 
					            "${pkgs.discord}/Applications/Discord.app"
 | 
				
			||||||
            "${pkgs.obsidian}/Applications/Obsidian.app"
 | 
					            "${pkgs.obsidian}/Applications/Obsidian.app"
 | 
				
			||||||
            "${pkgs.wezterm}/Applications/WezTerm.app"
 | 
					            "${pkgs.wezterm}/Applications/WezTerm.app"
 | 
				
			||||||
            "/System/Applications/System Settings.app"
 | 
					 | 
				
			||||||
          ];
 | 
					          ];
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,9 @@
 | 
				
			|||||||
      # shell = pkgs.fish; # Default shell
 | 
					      # shell = pkgs.fish; # Default shell
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # This might fix the shell issues
 | 
				
			||||||
 | 
					    # users.knownUsers = [ config.user ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    home-manager.users.${config.user} = {
 | 
					    home-manager.users.${config.user} = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Default shell setting doesn't work
 | 
					      # Default shell setting doesn't work
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,6 @@
 | 
				
			|||||||
      pkgs.visidata # CSV inspector
 | 
					      pkgs.visidata # CSV inspector
 | 
				
			||||||
      pkgs.dos2unix # Convert Windows text files
 | 
					      pkgs.dos2unix # Convert Windows text files
 | 
				
			||||||
      pkgs.inetutils # Includes telnet
 | 
					      pkgs.inetutils # Includes telnet
 | 
				
			||||||
      pkgs.youtube-dl # Convert web videos
 | 
					 | 
				
			||||||
      pkgs.pandoc # Convert text documents
 | 
					      pkgs.pandoc # Convert text documents
 | 
				
			||||||
      pkgs.mpd # TUI slideshows
 | 
					      pkgs.mpd # TUI slideshows
 | 
				
			||||||
      pkgs.mpv # Video player
 | 
					      pkgs.mpv # Video player
 | 
				
			||||||
@@ -27,12 +26,14 @@
 | 
				
			|||||||
      pkgs.awscli2
 | 
					      pkgs.awscli2
 | 
				
			||||||
      pkgs.ssm-session-manager-plugin
 | 
					      pkgs.ssm-session-manager-plugin
 | 
				
			||||||
      pkgs.awslogs
 | 
					      pkgs.awslogs
 | 
				
			||||||
 | 
					      pkgs.stu # TUI for AWS S3
 | 
				
			||||||
      pkgs.google-cloud-sdk
 | 
					      pkgs.google-cloud-sdk
 | 
				
			||||||
      pkgs.vault-bin
 | 
					      pkgs.vault-bin
 | 
				
			||||||
      pkgs.consul
 | 
					      pkgs.consul
 | 
				
			||||||
      pkgs.noti # Create notifications programmatically
 | 
					      pkgs.noti # Create notifications programmatically
 | 
				
			||||||
      pkgs.ipcalc # Make IP network calculations
 | 
					      pkgs.ipcalc # Make IP network calculations
 | 
				
			||||||
      pkgs.teams
 | 
					      pkgs.teams
 | 
				
			||||||
 | 
					      pkgs.cloudflared # Allow connecting to Cloudflare tunnels
 | 
				
			||||||
      (pkgs.writeShellApplication {
 | 
					      (pkgs.writeShellApplication {
 | 
				
			||||||
        name = "ocr";
 | 
					        name = "ocr";
 | 
				
			||||||
        runtimeInputs = [ pkgs.tesseract ];
 | 
					        runtimeInputs = [ pkgs.tesseract ];
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								modules/nixos/applications/calendar.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								modules/nixos/applications/calendar.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  pkgs,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  options = {
 | 
				
			||||||
 | 
					    calendar = {
 | 
				
			||||||
 | 
					      enable = lib.mkEnableOption {
 | 
				
			||||||
 | 
					        description = "Enable calendar.";
 | 
				
			||||||
 | 
					        default = false;
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf (config.gui.enable && config.calendar.enable) {
 | 
				
			||||||
 | 
					    home-manager.users.${config.user} = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      accounts.calendar.accounts.default = {
 | 
				
			||||||
 | 
					        basePath = "other/calendars"; # Where to save calendars in ~ directory
 | 
				
			||||||
 | 
					        name = "personal";
 | 
				
			||||||
 | 
					        local.type = "filesystem";
 | 
				
			||||||
 | 
					        primary = true;
 | 
				
			||||||
 | 
					        remote = {
 | 
				
			||||||
 | 
					          passwordCommand = [ "" ];
 | 
				
			||||||
 | 
					          type = "caldav";
 | 
				
			||||||
 | 
					          url = "https://${config.hostnames.content}/remote.php/dav/principals/users/${config.user}";
 | 
				
			||||||
 | 
					          userName = config.user;
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      home.packages = with pkgs; [ gnome-calendar ];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  imports = [
 | 
					  imports = [
 | 
				
			||||||
 | 
					    ./calendar.nix
 | 
				
			||||||
    ./calibre.nix
 | 
					    ./calibre.nix
 | 
				
			||||||
    ./nautilus.nix
 | 
					    ./nautilus.nix
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Quick preview with spacebar
 | 
					    # Quick preview with spacebar
 | 
				
			||||||
    services.gnome.sushi.enable = true;
 | 
					    services.gnome.sushi.enable = true;
 | 
				
			||||||
    environment.systemPackages = [ pkgs.gnome.nautilus ];
 | 
					    environment.systemPackages = [ pkgs.nautilus ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    home-manager.users.${config.user} = {
 | 
					    home-manager.users.${config.user} = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,13 +28,13 @@
 | 
				
			|||||||
      xsession.windowManager.i3.config.keybindings = {
 | 
					      xsession.windowManager.i3.config.keybindings = {
 | 
				
			||||||
        "${
 | 
					        "${
 | 
				
			||||||
          config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
 | 
					          config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
 | 
				
			||||||
        }+n" = "exec --no-startup-id ${pkgs.gnome.nautilus}/bin/nautilus";
 | 
					        }+n" = "exec --no-startup-id ${pkgs.nautilus}/bin/nautilus";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Generates a QR code and previews it with sushi
 | 
					      # Generates a QR code and previews it with sushi
 | 
				
			||||||
      programs.fish.functions = {
 | 
					      programs.fish.functions = {
 | 
				
			||||||
        qr = {
 | 
					        qr = {
 | 
				
			||||||
          body = "${pkgs.qrencode}/bin/qrencode $argv[1] -o /tmp/qr.png | ${pkgs.gnome.sushi}/bin/sushi /tmp/qr.png";
 | 
					          body = "${pkgs.qrencode}/bin/qrencode $argv[1] -o /tmp/qr.png | ${pkgs.sushi}/bin/sushi /tmp/qr.png";
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@
 | 
				
			|||||||
    ./legendary.nix
 | 
					    ./legendary.nix
 | 
				
			||||||
    ./lutris.nix
 | 
					    ./lutris.nix
 | 
				
			||||||
    ./minecraft-server.nix
 | 
					    ./minecraft-server.nix
 | 
				
			||||||
 | 
					    ./moonlight.nix
 | 
				
			||||||
    ./ryujinx.nix
 | 
					    ./ryujinx.nix
 | 
				
			||||||
    ./steam.nix
 | 
					    ./steam.nix
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,10 @@
 | 
				
			|||||||
  options.gaming.dwarf-fortress.enable = lib.mkEnableOption "Dwarf Fortress free edition.";
 | 
					  options.gaming.dwarf-fortress.enable = lib.mkEnableOption "Dwarf Fortress free edition.";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf config.gaming.dwarf-fortress.enable {
 | 
					  config = lib.mkIf config.gaming.dwarf-fortress.enable {
 | 
				
			||||||
    unfreePackages = [ "dwarf-fortress" ];
 | 
					    unfreePackages = [
 | 
				
			||||||
 | 
					      "dwarf-fortress"
 | 
				
			||||||
 | 
					      "phoebus-theme"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
    environment.systemPackages =
 | 
					    environment.systemPackages =
 | 
				
			||||||
      let
 | 
					      let
 | 
				
			||||||
        dfDesktopItem = pkgs.makeDesktopItem {
 | 
					        dfDesktopItem = pkgs.makeDesktopItem {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								modules/nixos/gaming/moonlight.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								modules/nixos/gaming/moonlight.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  pkgs,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  options.gaming.moonlight.enable = lib.mkEnableOption "Enable Moonlight game streaming client.";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.gaming.moonlight.enable {
 | 
				
			||||||
 | 
					    environment.systemPackages = with pkgs; [ moonlight-qt ];
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -15,6 +15,7 @@
 | 
				
			|||||||
      "steam-original"
 | 
					      "steam-original"
 | 
				
			||||||
      "steamcmd"
 | 
					      "steamcmd"
 | 
				
			||||||
      "steam-run"
 | 
					      "steam-run"
 | 
				
			||||||
 | 
					      "steam-unwrapped"
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    programs.steam = {
 | 
					    programs.steam = {
 | 
				
			||||||
@@ -27,7 +28,7 @@
 | 
				
			|||||||
    environment.systemPackages = with pkgs; [
 | 
					    environment.systemPackages = with pkgs; [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Enable terminal interaction
 | 
					      # Enable terminal interaction
 | 
				
			||||||
      steamPackages.steamcmd
 | 
					      steamcmd
 | 
				
			||||||
      steam-tui
 | 
					      steam-tui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Overlay with performance monitoring
 | 
					      # Overlay with performance monitoring
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,7 +42,7 @@
 | 
				
			|||||||
            module-margin = 1;
 | 
					            module-margin = 1;
 | 
				
			||||||
            modules-left = "i3";
 | 
					            modules-left = "i3";
 | 
				
			||||||
            modules-center = "xwindow";
 | 
					            modules-center = "xwindow";
 | 
				
			||||||
            modules-right = "mailcount network pulseaudio date keyboard power";
 | 
					            modules-right = "mailcount network pulseaudio date power";
 | 
				
			||||||
            cursor-click = "pointer";
 | 
					            cursor-click = "pointer";
 | 
				
			||||||
            cursor-scroll = "ns-resize";
 | 
					            cursor-scroll = "ns-resize";
 | 
				
			||||||
            enable-ipc = true;
 | 
					            enable-ipc = true;
 | 
				
			||||||
@@ -209,12 +209,6 @@
 | 
				
			|||||||
            label-foreground = config.theme.colors.base06;
 | 
					            label-foreground = config.theme.colors.base06;
 | 
				
			||||||
            # format-background = colors.background;
 | 
					            # format-background = colors.background;
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
          "module/keyboard" = {
 | 
					 | 
				
			||||||
            type = "custom/text";
 | 
					 | 
				
			||||||
            content = "";
 | 
					 | 
				
			||||||
            click-left = "doas systemctl restart keyd";
 | 
					 | 
				
			||||||
            content-foreground = config.theme.colors.base04;
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
          "module/power" = {
 | 
					          "module/power" = {
 | 
				
			||||||
            type = "custom/text";
 | 
					            type = "custom/text";
 | 
				
			||||||
            content = "  ";
 | 
					            content = "  ";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,8 +36,6 @@ in
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
					  config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
				
			||||||
    sound.enable = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Enable PipeWire
 | 
					    # Enable PipeWire
 | 
				
			||||||
    services.pipewire = {
 | 
					    services.pipewire = {
 | 
				
			||||||
      enable = true;
 | 
					      enable = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,4 @@
 | 
				
			|||||||
{
 | 
					{ config, lib, ... }:
 | 
				
			||||||
  config,
 | 
					 | 
				
			||||||
  pkgs,
 | 
					 | 
				
			||||||
  lib,
 | 
					 | 
				
			||||||
  ...
 | 
					 | 
				
			||||||
}:
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  config = lib.mkIf config.physical {
 | 
					  config = lib.mkIf config.physical {
 | 
				
			||||||
@@ -17,24 +12,30 @@
 | 
				
			|||||||
      autoRepeatInterval = 40;
 | 
					      autoRepeatInterval = 40;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Use capslock as escape and/or control
 | 
					    # Swap Caps-Lock with Escape when pressed or LCtrl when held/combined with others
 | 
				
			||||||
    services.keyd = {
 | 
					    # Inspired by: https://www.youtube.com/watch?v=XuQVbZ0wENE
 | 
				
			||||||
 | 
					    services.kanata = {
 | 
				
			||||||
      enable = true;
 | 
					      enable = true;
 | 
				
			||||||
      keyboards = {
 | 
					      keyboards.default = {
 | 
				
			||||||
        default = {
 | 
					        devices = [
 | 
				
			||||||
          ids = [ "*" ];
 | 
					          "/dev/input/by-id/usb-Logitech_Logitech_G710_Keyboard-event-kbd"
 | 
				
			||||||
          settings = {
 | 
					          "/dev/input/by-id/usb-Logitech_Logitech_G710_Keyboard-if01-event-kbd"
 | 
				
			||||||
            main = {
 | 
					        ];
 | 
				
			||||||
              capslock = "overload(control, esc)";
 | 
					        extraDefCfg = "process-unmapped-keys yes";
 | 
				
			||||||
            };
 | 
					        config = ''
 | 
				
			||||||
          };
 | 
					          (defsrc
 | 
				
			||||||
        };
 | 
					              caps
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					          (defalias
 | 
				
			||||||
 | 
					              escctrl (tap-hold-press 1000 1000 esc lctrl)
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					          (deflayer base
 | 
				
			||||||
 | 
					              @escctrl
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # For some reason, keyd doesn't restart properly when updating
 | 
					 | 
				
			||||||
    system.activationScripts.keyd.text = "${pkgs.systemd}/bin/systemctl restart keyd.service";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Enable num lock on login
 | 
					    # Enable num lock on login
 | 
				
			||||||
    home-manager.users.${config.user}.xsession.numlock.enable = true;
 | 
					    home-manager.users.${config.user}.xsession.numlock.enable = true;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,5 +21,15 @@
 | 
				
			|||||||
      accelProfile = "flat";
 | 
					      accelProfile = "flat";
 | 
				
			||||||
      accelSpeed = "1.15";
 | 
					      accelSpeed = "1.15";
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Cursor
 | 
				
			||||||
 | 
					    home-manager.users.${config.user}.home.pointerCursor = {
 | 
				
			||||||
 | 
					      name = "Adwaita";
 | 
				
			||||||
 | 
					      package = pkgs.adwaita-icon-theme;
 | 
				
			||||||
 | 
					      size = 24;
 | 
				
			||||||
 | 
					      gtk.enable = true;
 | 
				
			||||||
 | 
					      x11.enable = true;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,9 @@
 | 
				
			|||||||
{ config, lib, ... }:
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  pkgs,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  options = {
 | 
					  options = {
 | 
				
			||||||
@@ -8,7 +13,7 @@
 | 
				
			|||||||
  config = lib.mkIf (config.server && config.zfs.enable) {
 | 
					  config = lib.mkIf (config.server && config.zfs.enable) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Only use compatible Linux kernel, since ZFS can be behind
 | 
					    # Only use compatible Linux kernel, since ZFS can be behind
 | 
				
			||||||
    boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
 | 
					    boot.kernelPackages = pkgs.linuxPackages; # Defaults to latest LTS
 | 
				
			||||||
    boot.kernelParams = [ "nohibernate" ];
 | 
					    boot.kernelParams = [ "nohibernate" ];
 | 
				
			||||||
    boot.supportedFilesystems = [ "zfs" ];
 | 
					    boot.supportedFilesystems = [ "zfs" ];
 | 
				
			||||||
    services.prometheus.exporters.zfs.enable = config.prometheus.exporters.enable;
 | 
					    services.prometheus.exporters.zfs.enable = config.prometheus.exporters.enable;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,11 @@ let
 | 
				
			|||||||
      url = "localhost:7878";
 | 
					      url = "localhost:7878";
 | 
				
			||||||
      apiKey = config.secrets.radarrApiKey.dest;
 | 
					      apiKey = config.secrets.radarrApiKey.dest;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    readarr = {
 | 
				
			||||||
 | 
					      exportarrPort = "9711";
 | 
				
			||||||
 | 
					      url = "localhost:8787";
 | 
				
			||||||
 | 
					      apiKey = config.secrets.readarrApiKey.dest;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    sonarr = {
 | 
					    sonarr = {
 | 
				
			||||||
      exportarrPort = "9708";
 | 
					      exportarrPort = "9708";
 | 
				
			||||||
      url = "localhost:8989";
 | 
					      url = "localhost:8989";
 | 
				
			||||||
@@ -61,6 +66,10 @@ in
 | 
				
			|||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
        group = "media";
 | 
					        group = "media";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					      readarr = {
 | 
				
			||||||
 | 
					        enable = true;
 | 
				
			||||||
 | 
					        group = "media";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Create a media group to be shared between services
 | 
					    # Create a media group to be shared between services
 | 
				
			||||||
@@ -110,6 +119,21 @@ in
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        group = "download";
 | 
				
			||||||
 | 
					        match = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            host = [ config.hostnames.download ];
 | 
				
			||||||
 | 
					            path = [ "/readarr*" ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [ { dial = arrConfig.readarr.url; } ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        group = "download";
 | 
					        group = "download";
 | 
				
			||||||
        match = [
 | 
					        match = [
 | 
				
			||||||
@@ -223,6 +247,11 @@ in
 | 
				
			|||||||
      dest = "/var/private/radarr-api";
 | 
					      dest = "/var/private/radarr-api";
 | 
				
			||||||
      prefix = "API_KEY=";
 | 
					      prefix = "API_KEY=";
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    secrets.readarrApiKey = {
 | 
				
			||||||
 | 
					      source = ../../../private/radarr-api-key.age;
 | 
				
			||||||
 | 
					      dest = "/var/private/readarr-api";
 | 
				
			||||||
 | 
					      prefix = "API_KEY=";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    secrets.sonarrApiKey = {
 | 
					    secrets.sonarrApiKey = {
 | 
				
			||||||
      source = ../../../private/sonarr-api-key.age;
 | 
					      source = ../../../private/sonarr-api-key.age;
 | 
				
			||||||
      dest = "/var/private/sonarr-api";
 | 
					      dest = "/var/private/sonarr-api";
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								modules/nixos/services/audiobookshelf.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								modules/nixos/services/audiobookshelf.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					{ config, lib, ... }:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.services.audiobookshelf.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    services.audiobookshelf = {
 | 
				
			||||||
 | 
					      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 ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Grant user access to Audiobookshelf directories
 | 
				
			||||||
 | 
					    users.users.${config.user}.extraGroups = [ config.services.audiobookshelf.group ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Grant audiobookshelf access to media and Calibre directories
 | 
				
			||||||
 | 
					    users.users.${config.services.audiobookshelf.user}.extraGroups = [
 | 
				
			||||||
 | 
					      "media"
 | 
				
			||||||
 | 
					      "calibre-web"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -44,6 +44,10 @@
 | 
				
			|||||||
      settings = { };
 | 
					      settings = { };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Broken on 2024-08-23
 | 
				
			||||||
 | 
					    # https://github.com/NixOS/nixpkgs/commit/0875d0ce1c778f344cd2377a5337a45385d6ffa0
 | 
				
			||||||
 | 
					    nixpkgs.config.permittedInsecurePackages = [ "litestream-0.3.13" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Wait for secret to exist
 | 
					    # Wait for secret to exist
 | 
				
			||||||
    systemd.services.litestream = {
 | 
					    systemd.services.litestream = {
 | 
				
			||||||
      after = [ "backup-secret.service" ];
 | 
					      after = [ "backup-secret.service" ];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,7 +46,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Force Caddy to 403 if not coming from allowlisted source
 | 
					    # Force Caddy to 403 if not coming from allowlisted source
 | 
				
			||||||
    caddy.cidrAllowlist = [ "127.0.0.1/32" ];
 | 
					    caddy.cidrAllowlist = [ "127.0.0.1/32" ];
 | 
				
			||||||
    caddy.routes = [
 | 
					    caddy.routes = lib.mkBefore [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        match = [ { not = [ { remote_ip.ranges = config.caddy.cidrAllowlist; } ]; } ];
 | 
					        match = [ { not = [ { remote_ip.ranges = config.caddy.cidrAllowlist; } ]; } ];
 | 
				
			||||||
        handle = [
 | 
					        handle = [
 | 
				
			||||||
@@ -58,42 +58,155 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.caddy = {
 | 
					    services.caddy =
 | 
				
			||||||
      adapter = "''"; # Required to enable JSON
 | 
					      let
 | 
				
			||||||
      configFile = pkgs.writeText "Caddyfile" (
 | 
					        default_logger_name = "other";
 | 
				
			||||||
        builtins.toJSON {
 | 
					        roll_size_mb = 25;
 | 
				
			||||||
          apps.http.servers.main = {
 | 
					        # Extract list of hostnames (fqdns) from current caddy routes
 | 
				
			||||||
            listen = [ ":443" ];
 | 
					        getHostnameFromMatch = match: if (lib.hasAttr "host" match) then match.host else [ ];
 | 
				
			||||||
 | 
					        getHostnameFromRoute =
 | 
				
			||||||
 | 
					          route:
 | 
				
			||||||
 | 
					          if (lib.hasAttr "match" route) then (lib.concatMap getHostnameFromMatch route.match) else [ ];
 | 
				
			||||||
 | 
					        hostnames_non_unique = lib.concatMap getHostnameFromRoute config.caddy.routes;
 | 
				
			||||||
 | 
					        hostnames = lib.unique hostnames_non_unique;
 | 
				
			||||||
 | 
					        # Create attrset of subdomains to their fqdns
 | 
				
			||||||
 | 
					        hostname_map = builtins.listToAttrs (
 | 
				
			||||||
 | 
					          map (hostname: {
 | 
				
			||||||
 | 
					            name = builtins.head (lib.splitString "." hostname);
 | 
				
			||||||
 | 
					            value = hostname;
 | 
				
			||||||
 | 
					          }) hostnames
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      in
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        adapter = "''"; # Required to enable JSON
 | 
				
			||||||
 | 
					        configFile = pkgs.writeText "Caddyfile" (
 | 
				
			||||||
 | 
					          builtins.toJSON {
 | 
				
			||||||
 | 
					            apps.http.servers.main = {
 | 
				
			||||||
 | 
					              listen = [ ":443" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # These routes are pulled from the rest of this repo
 | 
					              # These routes are pulled from the rest of this repo
 | 
				
			||||||
            routes = config.caddy.routes;
 | 
					              routes = config.caddy.routes;
 | 
				
			||||||
            errors.routes = config.caddy.blocks;
 | 
					              errors.routes = config.caddy.blocks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            logs = { }; # Uncommenting collects access logs
 | 
					              # Uncommenting collects access logs
 | 
				
			||||||
          };
 | 
					              logs = {
 | 
				
			||||||
          apps.http.servers.metrics = { }; # Enables Prometheus metrics
 | 
					                inherit default_logger_name;
 | 
				
			||||||
          apps.tls.automation.policies = config.caddy.tlsPolicies;
 | 
					                # Invert hostnames keys and values
 | 
				
			||||||
 | 
					                logger_names = lib.mapAttrs' (name: value: {
 | 
				
			||||||
          # Setup logging to file
 | 
					                  name = value;
 | 
				
			||||||
          logging.logs.main = {
 | 
					                  value = name;
 | 
				
			||||||
            encoder = {
 | 
					                }) hostname_map;
 | 
				
			||||||
              format = "console";
 | 
					              };
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            writer = {
 | 
					            apps.http.servers.metrics = { }; # Enables Prometheus metrics
 | 
				
			||||||
              output = "file";
 | 
					            apps.tls.automation.policies = config.caddy.tlsPolicies;
 | 
				
			||||||
              filename = "${config.services.caddy.logDir}/caddy.log";
 | 
					
 | 
				
			||||||
              roll = true;
 | 
					            # Setup logging to journal and files
 | 
				
			||||||
              roll_size_mb = 1;
 | 
					            logging.logs =
 | 
				
			||||||
            };
 | 
					              {
 | 
				
			||||||
            level = "INFO";
 | 
					                # System logs and catch-all
 | 
				
			||||||
          };
 | 
					                # Must be called `default` to override Caddy's built-in default logger
 | 
				
			||||||
        }
 | 
					                default = {
 | 
				
			||||||
      );
 | 
					                  level = "INFO";
 | 
				
			||||||
 | 
					                  encoder.format = "console";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "stderr";
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  exclude = (map (hostname: "http.log.access.${hostname}") (builtins.attrNames hostname_map)) ++ [
 | 
				
			||||||
 | 
					                    "http.log.access.${default_logger_name}"
 | 
				
			||||||
 | 
					                  ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                # This is for the default access logs (anything not captured by hostname)
 | 
				
			||||||
 | 
					                other = {
 | 
				
			||||||
 | 
					                  level = "INFO";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/other.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  include = [ "http.log.access.${default_logger_name}" ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                # This is for using the Caddy API, which will probably never happen
 | 
				
			||||||
 | 
					                admin = {
 | 
				
			||||||
 | 
					                  level = "INFO";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/admin.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  include = [ "admin" ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                # This is for TLS cert management tracking
 | 
				
			||||||
 | 
					                tls = {
 | 
				
			||||||
 | 
					                  level = "INFO";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/tls.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  include = [ "tls" ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                # This is for debugging
 | 
				
			||||||
 | 
					                debug = {
 | 
				
			||||||
 | 
					                  level = "DEBUG";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/debug.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    roll_keep = 1;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              # These are the access logs for individual hostnames
 | 
				
			||||||
 | 
					              // (lib.mapAttrs (name: value: {
 | 
				
			||||||
 | 
					                level = "INFO";
 | 
				
			||||||
 | 
					                encoder.format = "json";
 | 
				
			||||||
 | 
					                writer = {
 | 
				
			||||||
 | 
					                  output = "file";
 | 
				
			||||||
 | 
					                  filename = "${config.services.caddy.logDir}/${name}-access.log";
 | 
				
			||||||
 | 
					                  roll = true;
 | 
				
			||||||
 | 
					                  inherit roll_size_mb;
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                include = [ "http.log.access.${name}" ];
 | 
				
			||||||
 | 
					              }) hostname_map)
 | 
				
			||||||
 | 
					              # We also capture just the errors separately for easy debugging
 | 
				
			||||||
 | 
					              // (lib.mapAttrs' (name: value: {
 | 
				
			||||||
 | 
					                name = "${name}-error";
 | 
				
			||||||
 | 
					                value = {
 | 
				
			||||||
 | 
					                  level = "ERROR";
 | 
				
			||||||
 | 
					                  encoder.format = "json";
 | 
				
			||||||
 | 
					                  writer = {
 | 
				
			||||||
 | 
					                    output = "file";
 | 
				
			||||||
 | 
					                    filename = "${config.services.caddy.logDir}/${name}-error.log";
 | 
				
			||||||
 | 
					                    roll = true;
 | 
				
			||||||
 | 
					                    inherit roll_size_mb;
 | 
				
			||||||
 | 
					                  };
 | 
				
			||||||
 | 
					                  include = [ "http.log.access.${name}" ];
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					              }) hostname_map);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    systemd.services.caddy.serviceConfig = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Allows Caddy to serve lower ports (443, 80)
 | 
				
			||||||
 | 
					      AmbientCapabilities = "CAP_NET_BIND_SERVICE";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Prevent flooding of logs by rate-limiting
 | 
				
			||||||
 | 
					      LogRateLimitIntervalSec = "5s"; # Limit period
 | 
				
			||||||
 | 
					      LogRateLimitBurst = 100; # Limit threshold
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Allows Caddy to serve lower ports (443, 80)
 | 
					 | 
				
			||||||
    systemd.services.caddy.serviceConfig.AmbientCapabilities = "CAP_NET_BIND_SERVICE";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Required for web traffic to reach this machine
 | 
					    # Required for web traffic to reach this machine
 | 
				
			||||||
    networking.firewall.allowedTCPPorts = [
 | 
					    networking.firewall.allowedTCPPorts = [
 | 
				
			||||||
      80
 | 
					      80
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,6 +78,8 @@ in
 | 
				
			|||||||
        issuers = [
 | 
					        issuers = [
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            module = "acme";
 | 
					            module = "acme";
 | 
				
			||||||
 | 
					            email = "acme@${config.mail.server}";
 | 
				
			||||||
 | 
					            account_key = "{env.ACME_ACCOUNT_KEY}";
 | 
				
			||||||
            challenges = {
 | 
					            challenges = {
 | 
				
			||||||
              dns = {
 | 
					              dns = {
 | 
				
			||||||
                provider = {
 | 
					                provider = {
 | 
				
			||||||
@@ -92,7 +94,18 @@ in
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    # Allow Caddy to read Cloudflare API key for DNS validation
 | 
					    # Allow Caddy to read Cloudflare API key for DNS validation
 | 
				
			||||||
    systemd.services.caddy.serviceConfig.EnvironmentFile = config.secrets.cloudflare-api.dest;
 | 
					    systemd.services.caddy.serviceConfig.EnvironmentFile = [
 | 
				
			||||||
 | 
					      config.secrets.cloudflare-api.dest
 | 
				
			||||||
 | 
					      config.secrets.letsencrypt-key.dest
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Private key is used for LetsEncrypt
 | 
				
			||||||
 | 
					    secrets.letsencrypt-key = {
 | 
				
			||||||
 | 
					      source = ../../../private/letsencrypt-key.age;
 | 
				
			||||||
 | 
					      dest = "${config.secretsDirectory}/letsencrypt-key";
 | 
				
			||||||
 | 
					      owner = "caddy";
 | 
				
			||||||
 | 
					      group = "caddy";
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # API key must have access to modify Cloudflare DNS records
 | 
					    # API key must have access to modify Cloudflare DNS records
 | 
				
			||||||
    secrets.cloudflare-api = {
 | 
					    secrets.cloudflare-api = {
 | 
				
			||||||
@@ -104,8 +117,14 @@ in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    # Wait for secret to exist
 | 
					    # Wait for secret to exist
 | 
				
			||||||
    systemd.services.caddy = {
 | 
					    systemd.services.caddy = {
 | 
				
			||||||
      after = [ "cloudflare-api-secret.service" ];
 | 
					      after = [
 | 
				
			||||||
      requires = [ "cloudflare-api-secret.service" ];
 | 
					        "cloudflare-api-secret.service"
 | 
				
			||||||
 | 
					        "letsencrypt-key-secret.service"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					      requires = [
 | 
				
			||||||
 | 
					        "cloudflare-api-secret.service"
 | 
				
			||||||
 | 
					        "letsencrypt-key-secret.service"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Allows Nextcloud to trust Cloudflare IPs
 | 
					    # Allows Nextcloud to trust Cloudflare IPs
 | 
				
			||||||
@@ -116,6 +135,9 @@ in
 | 
				
			|||||||
      [ "127.0.0.1" ] ++ cloudflareIpRanges
 | 
					      [ "127.0.0.1" ] ++ cloudflareIpRanges
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Using dyn-dns instead of ddclient because I can't find a way to choose
 | 
				
			||||||
 | 
					    # between proxied and non-proxied records for Cloudflare using just
 | 
				
			||||||
 | 
					    # ddclient.
 | 
				
			||||||
    services.cloudflare-dyndns =
 | 
					    services.cloudflare-dyndns =
 | 
				
			||||||
      lib.mkIf ((builtins.length config.services.cloudflare-dyndns.domains) > 0)
 | 
					      lib.mkIf ((builtins.length config.services.cloudflare-dyndns.domains) > 0)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  imports = [
 | 
					  imports = [
 | 
				
			||||||
 | 
					    ./audiobookshelf.nix
 | 
				
			||||||
    ./arr.nix
 | 
					    ./arr.nix
 | 
				
			||||||
    ./backups.nix
 | 
					    ./backups.nix
 | 
				
			||||||
    ./bind.nix
 | 
					    ./bind.nix
 | 
				
			||||||
@@ -12,6 +13,7 @@
 | 
				
			|||||||
    ./calibre.nix
 | 
					    ./calibre.nix
 | 
				
			||||||
    ./cloudflare-tunnel.nix
 | 
					    ./cloudflare-tunnel.nix
 | 
				
			||||||
    ./cloudflare.nix
 | 
					    ./cloudflare.nix
 | 
				
			||||||
 | 
					    ./filebrowser.nix
 | 
				
			||||||
    ./identity.nix
 | 
					    ./identity.nix
 | 
				
			||||||
    ./irc.nix
 | 
					    ./irc.nix
 | 
				
			||||||
    ./gitea-runner.nix
 | 
					    ./gitea-runner.nix
 | 
				
			||||||
@@ -26,6 +28,7 @@
 | 
				
			|||||||
    ./n8n.nix
 | 
					    ./n8n.nix
 | 
				
			||||||
    ./netdata.nix
 | 
					    ./netdata.nix
 | 
				
			||||||
    ./nextcloud.nix
 | 
					    ./nextcloud.nix
 | 
				
			||||||
 | 
					    ./ntfy.nix
 | 
				
			||||||
    ./paperless.nix
 | 
					    ./paperless.nix
 | 
				
			||||||
    ./postgresql.nix
 | 
					    ./postgresql.nix
 | 
				
			||||||
    ./prometheus.nix
 | 
					    ./prometheus.nix
 | 
				
			||||||
@@ -33,6 +36,7 @@
 | 
				
			|||||||
    ./secrets.nix
 | 
					    ./secrets.nix
 | 
				
			||||||
    ./sshd.nix
 | 
					    ./sshd.nix
 | 
				
			||||||
    ./transmission.nix
 | 
					    ./transmission.nix
 | 
				
			||||||
 | 
					    ./uptime-kuma.nix
 | 
				
			||||||
    ./vaultwarden.nix
 | 
					    ./vaultwarden.nix
 | 
				
			||||||
    ./victoriametrics.nix
 | 
					    ./victoriametrics.nix
 | 
				
			||||||
    ./wireguard.nix
 | 
					    ./wireguard.nix
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										74
									
								
								modules/nixos/services/filebrowser.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								modules/nixos/services/filebrowser.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
 | 
					  pkgs,
 | 
				
			||||||
 | 
					  lib,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
 | 
					let
 | 
				
			||||||
 | 
					  user =
 | 
				
			||||||
 | 
					    if config.services.nextcloud.enable then
 | 
				
			||||||
 | 
					      config.services.phpfpm.pools.nextcloud.user
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      "filebrowser";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  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 = !config.services.nextcloud.enable; # Unique user if not using Nextcloud
 | 
				
			||||||
 | 
					        User = user;
 | 
				
			||||||
 | 
					        Group = user;
 | 
				
			||||||
 | 
					        ReadWritePaths = [ dataDir ];
 | 
				
			||||||
 | 
					        StateDirectory = [ "filebrowser" ];
 | 
				
			||||||
 | 
					        Restart = "on-failure";
 | 
				
			||||||
 | 
					        RestartPreventExitStatus = 1;
 | 
				
			||||||
 | 
					        RestartSec = "5s";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    caddy.routes = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        match = [ { host = [ config.hostnames.files ]; } ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [ { dial = "localhost:${builtins.toString settings.port}"; } ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.files ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -53,6 +53,7 @@ in
 | 
				
			|||||||
            uid = promUid;
 | 
					            uid = promUid;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					        # TODO: Add option to pull services from a list like Caddy does
 | 
				
			||||||
        dashboards.settings.providers = [
 | 
					        dashboards.settings.providers = [
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            name = "test";
 | 
					            name = "test";
 | 
				
			||||||
@@ -368,6 +369,18 @@ in
 | 
				
			|||||||
                          range = true;
 | 
					                          range = true;
 | 
				
			||||||
                          refId = "C";
 | 
					                          refId = "C";
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                          datasource = {
 | 
				
			||||||
 | 
					                            type = "prometheus";
 | 
				
			||||||
 | 
					                            uid = promUid;
 | 
				
			||||||
 | 
					                          };
 | 
				
			||||||
 | 
					                          editorMode = "code";
 | 
				
			||||||
 | 
					                          expr = "readarr_system_status";
 | 
				
			||||||
 | 
					                          hide = false;
 | 
				
			||||||
 | 
					                          legendFormat = "Readarr";
 | 
				
			||||||
 | 
					                          range = true;
 | 
				
			||||||
 | 
					                          refId = "F";
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                          datasource = {
 | 
					                          datasource = {
 | 
				
			||||||
                            type = "prometheus";
 | 
					                            type = "prometheus";
 | 
				
			||||||
@@ -669,7 +682,7 @@ in
 | 
				
			|||||||
                          };
 | 
					                          };
 | 
				
			||||||
                          editorMode = "code";
 | 
					                          editorMode = "code";
 | 
				
			||||||
                          exemplar = false;
 | 
					                          exemplar = false;
 | 
				
			||||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[1d])'';
 | 
					                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[1d])'';
 | 
				
			||||||
                          hide = false;
 | 
					                          hide = false;
 | 
				
			||||||
                          instant = false;
 | 
					                          instant = false;
 | 
				
			||||||
                          interval = "";
 | 
					                          interval = "";
 | 
				
			||||||
@@ -683,7 +696,7 @@ in
 | 
				
			|||||||
                            uid = promUid;
 | 
					                            uid = promUid;
 | 
				
			||||||
                          };
 | 
					                          };
 | 
				
			||||||
                          editorMode = "code";
 | 
					                          editorMode = "code";
 | 
				
			||||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[7d])'';
 | 
					                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[7d])'';
 | 
				
			||||||
                          hide = false;
 | 
					                          hide = false;
 | 
				
			||||||
                          legendFormat = "Past Week";
 | 
					                          legendFormat = "Past Week";
 | 
				
			||||||
                          range = true;
 | 
					                          range = true;
 | 
				
			||||||
@@ -695,7 +708,7 @@ in
 | 
				
			|||||||
                            uid = promUid;
 | 
					                            uid = promUid;
 | 
				
			||||||
                          };
 | 
					                          };
 | 
				
			||||||
                          editorMode = "code";
 | 
					                          editorMode = "code";
 | 
				
			||||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[30d])'';
 | 
					                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[30d])'';
 | 
				
			||||||
                          hide = false;
 | 
					                          hide = false;
 | 
				
			||||||
                          legendFormat = "Past Month";
 | 
					                          legendFormat = "Past Month";
 | 
				
			||||||
                          range = true;
 | 
					                          range = true;
 | 
				
			||||||
@@ -819,6 +832,28 @@ in
 | 
				
			|||||||
                              }
 | 
					                              }
 | 
				
			||||||
                            ];
 | 
					                            ];
 | 
				
			||||||
                          }
 | 
					                          }
 | 
				
			||||||
 | 
					                          {
 | 
				
			||||||
 | 
					                            matcher = {
 | 
				
			||||||
 | 
					                              id = "byName";
 | 
				
			||||||
 | 
					                              options = "localhost:8787";
 | 
				
			||||||
 | 
					                            };
 | 
				
			||||||
 | 
					                            properties = [
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "displayName";
 | 
				
			||||||
 | 
					                                value = "Readarr";
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "links";
 | 
				
			||||||
 | 
					                                value = [
 | 
				
			||||||
 | 
					                                  {
 | 
				
			||||||
 | 
					                                    targetBlank = true;
 | 
				
			||||||
 | 
					                                    title = "";
 | 
				
			||||||
 | 
					                                    url = "https://${config.hostnames.download}/readarr";
 | 
				
			||||||
 | 
					                                  }
 | 
				
			||||||
 | 
					                                ];
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                            ];
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
                          {
 | 
					                          {
 | 
				
			||||||
                            matcher = {
 | 
					                            matcher = {
 | 
				
			||||||
                              id = "byName";
 | 
					                              id = "byName";
 | 
				
			||||||
@@ -885,6 +920,28 @@ in
 | 
				
			|||||||
                              }
 | 
					                              }
 | 
				
			||||||
                            ];
 | 
					                            ];
 | 
				
			||||||
                          }
 | 
					                          }
 | 
				
			||||||
 | 
					                          {
 | 
				
			||||||
 | 
					                            matcher = {
 | 
				
			||||||
 | 
					                              id = "byName";
 | 
				
			||||||
 | 
					                              options = "localhost:8086";
 | 
				
			||||||
 | 
					                            };
 | 
				
			||||||
 | 
					                            properties = [
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "displayName";
 | 
				
			||||||
 | 
					                                value = "InfluxDB";
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "links";
 | 
				
			||||||
 | 
					                                value = [
 | 
				
			||||||
 | 
					                                  {
 | 
				
			||||||
 | 
					                                    targetBlank = true;
 | 
				
			||||||
 | 
					                                    title = "";
 | 
				
			||||||
 | 
					                                    url = "https://${config.hostnames.influxdb}";
 | 
				
			||||||
 | 
					                                  }
 | 
				
			||||||
 | 
					                                ];
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                            ];
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
                          {
 | 
					                          {
 | 
				
			||||||
                            matcher = {
 | 
					                            matcher = {
 | 
				
			||||||
                              id = "byName";
 | 
					                              id = "byName";
 | 
				
			||||||
@@ -929,6 +986,28 @@ in
 | 
				
			|||||||
                              }
 | 
					                              }
 | 
				
			||||||
                            ];
 | 
					                            ];
 | 
				
			||||||
                          }
 | 
					                          }
 | 
				
			||||||
 | 
					                          {
 | 
				
			||||||
 | 
					                            matcher = {
 | 
				
			||||||
 | 
					                              id = "byName";
 | 
				
			||||||
 | 
					                              options = "localhost:9000";
 | 
				
			||||||
 | 
					                            };
 | 
				
			||||||
 | 
					                            properties = [
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "displayName";
 | 
				
			||||||
 | 
					                                value = "The Lounge";
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "links";
 | 
				
			||||||
 | 
					                                value = [
 | 
				
			||||||
 | 
					                                  {
 | 
				
			||||||
 | 
					                                    targetBlank = true;
 | 
				
			||||||
 | 
					                                    title = "";
 | 
				
			||||||
 | 
					                                    url = "https://${config.hostnames.irc}";
 | 
				
			||||||
 | 
					                                  }
 | 
				
			||||||
 | 
					                                ];
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                            ];
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
                          {
 | 
					                          {
 | 
				
			||||||
                            matcher = {
 | 
					                            matcher = {
 | 
				
			||||||
                              id = "byName";
 | 
					                              id = "byName";
 | 
				
			||||||
@@ -1039,6 +1118,50 @@ in
 | 
				
			|||||||
                              }
 | 
					                              }
 | 
				
			||||||
                            ];
 | 
					                            ];
 | 
				
			||||||
                          }
 | 
					                          }
 | 
				
			||||||
 | 
					                          {
 | 
				
			||||||
 | 
					                            matcher = {
 | 
				
			||||||
 | 
					                              id = "byName";
 | 
				
			||||||
 | 
					                              options = "localhost:${builtins.toString config.services.paperless.port}";
 | 
				
			||||||
 | 
					                            };
 | 
				
			||||||
 | 
					                            properties = [
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "displayName";
 | 
				
			||||||
 | 
					                                value = "Paperless";
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "links";
 | 
				
			||||||
 | 
					                                value = [
 | 
				
			||||||
 | 
					                                  {
 | 
				
			||||||
 | 
					                                    targetBlank = true;
 | 
				
			||||||
 | 
					                                    title = "";
 | 
				
			||||||
 | 
					                                    url = "https://${config.hostnames.paperless}";
 | 
				
			||||||
 | 
					                                  }
 | 
				
			||||||
 | 
					                                ];
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                            ];
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
 | 
					                          {
 | 
				
			||||||
 | 
					                            matcher = {
 | 
				
			||||||
 | 
					                              id = "byName";
 | 
				
			||||||
 | 
					                              options = "localhost:${builtins.toString config.services.audiobookshelf.port}";
 | 
				
			||||||
 | 
					                            };
 | 
				
			||||||
 | 
					                            properties = [
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "displayName";
 | 
				
			||||||
 | 
					                                value = "Audiobookshelf";
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                              {
 | 
				
			||||||
 | 
					                                id = "links";
 | 
				
			||||||
 | 
					                                value = [
 | 
				
			||||||
 | 
					                                  {
 | 
				
			||||||
 | 
					                                    targetBlank = true;
 | 
				
			||||||
 | 
					                                    title = "";
 | 
				
			||||||
 | 
					                                    url = "https://${config.hostnames.audiobooks}";
 | 
				
			||||||
 | 
					                                  }
 | 
				
			||||||
 | 
					                                ];
 | 
				
			||||||
 | 
					                              }
 | 
				
			||||||
 | 
					                            ];
 | 
				
			||||||
 | 
					                          }
 | 
				
			||||||
                        ];
 | 
					                        ];
 | 
				
			||||||
                      };
 | 
					                      };
 | 
				
			||||||
                      gridPos = {
 | 
					                      gridPos = {
 | 
				
			||||||
@@ -2418,7 +2541,7 @@ in
 | 
				
			|||||||
                  execErrState = "Error";
 | 
					                  execErrState = "Error";
 | 
				
			||||||
                  for = "5m";
 | 
					                  for = "5m";
 | 
				
			||||||
                  annotations = {
 | 
					                  annotations = {
 | 
				
			||||||
                    description = "Cloudflare Tunnel for {{ $job }}.";
 | 
					                    description = "Cloudflare Tunnel for {{ index $labels \"job\" }}.";
 | 
				
			||||||
                    summary = "Cloudflare Tunnel is down.";
 | 
					                    summary = "Cloudflare Tunnel is down.";
 | 
				
			||||||
                  };
 | 
					                  };
 | 
				
			||||||
                  isPaused = false;
 | 
					                  isPaused = false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,12 +9,18 @@
 | 
				
			|||||||
    unfreePackages = [ "n8n" ];
 | 
					    unfreePackages = [ "n8n" ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.n8n = {
 | 
					    services.n8n = {
 | 
				
			||||||
 | 
					      webhookUrl = "https://${config.hostnames.n8n}";
 | 
				
			||||||
      settings = {
 | 
					      settings = {
 | 
				
			||||||
        listen_address = "127.0.0.1";
 | 
					        listen_address = "127.0.0.1";
 | 
				
			||||||
        port = 5678;
 | 
					        port = 5678;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    systemd.services.n8n.environment = {
 | 
				
			||||||
 | 
					      N8N_EDITOR_BASE_URL = config.services.n8n.webhookUrl;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Configure Cloudflare DNS to point to this machine
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
    services.cloudflare-dyndns.domains = [ config.hostnames.n8n ];
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.n8n ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
  config = lib.mkIf config.services.nextcloud.enable {
 | 
					  config = lib.mkIf config.services.nextcloud.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.nextcloud = {
 | 
					    services.nextcloud = {
 | 
				
			||||||
      package = pkgs.nextcloud29; # Required to specify
 | 
					      package = pkgs.nextcloud30; # Required to specify
 | 
				
			||||||
      configureRedis = true;
 | 
					      configureRedis = true;
 | 
				
			||||||
      datadir = "/data/nextcloud";
 | 
					      datadir = "/data/nextcloud";
 | 
				
			||||||
      database.createLocally = true;
 | 
					      database.createLocally = true;
 | 
				
			||||||
@@ -26,6 +26,8 @@
 | 
				
			|||||||
        trusted_domains = [ config.hostnames.content ];
 | 
					        trusted_domains = [ config.hostnames.content ];
 | 
				
			||||||
        trusted_proxies = [ "127.0.0.1" ];
 | 
					        trusted_proxies = [ "127.0.0.1" ];
 | 
				
			||||||
        maintenance_window_start = 4; # Run jobs at 4am UTC
 | 
					        maintenance_window_start = 4; # Run jobs at 4am UTC
 | 
				
			||||||
 | 
					        log_type = "file";
 | 
				
			||||||
 | 
					        loglevel = 1; # Include all actions in the log
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      extraAppsEnable = true;
 | 
					      extraAppsEnable = true;
 | 
				
			||||||
      extraApps = {
 | 
					      extraApps = {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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 ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    services.samba = lib.mkIf config.services.samba.enable {
 | 
					    services.samba = lib.mkIf config.services.samba.enable {
 | 
				
			||||||
      openFirewall = true;
 | 
					      openFirewall = true;
 | 
				
			||||||
      shares.data = {
 | 
					      settings.data = {
 | 
				
			||||||
        path = "/data";
 | 
					        path = "/data";
 | 
				
			||||||
        browseable = "yes";
 | 
					        browseable = "yes";
 | 
				
			||||||
        "read only" = "no";
 | 
					        "read only" = "no";
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								modules/nixos/services/uptime-kuma.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								modules/nixos/services/uptime-kuma.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					{ config, lib, ... }:
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  config = lib.mkIf config.services.uptime-kuma.enable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    services.uptime-kuma = {
 | 
				
			||||||
 | 
					      settings = {
 | 
				
			||||||
 | 
					        PORT = "3033";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Allow web traffic to Caddy
 | 
				
			||||||
 | 
					    caddy.routes = [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        match = [ { host = [ config.hostnames.status ]; } ];
 | 
				
			||||||
 | 
					        handle = [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            handler = "reverse_proxy";
 | 
				
			||||||
 | 
					            upstreams = [
 | 
				
			||||||
 | 
					              { dial = "localhost:${config.services.uptime-kuma.settings.PORT}"; }
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Configure Cloudflare DNS to point to this machine
 | 
				
			||||||
 | 
					    services.cloudflare-dyndns.domains = [ config.hostnames.status ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
  config,
 | 
					  config,
 | 
				
			||||||
  pkgs,
 | 
					  pkgs,
 | 
				
			||||||
  lib,
 | 
					  lib,
 | 
				
			||||||
 | 
					  pkgs-stable,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}:
 | 
					}:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -38,6 +39,10 @@ in
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  config = {
 | 
					  config = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    services.victoriametrics.extraOptions = [
 | 
				
			||||||
 | 
					      "-promscrape.config=${(pkgs.formats.yaml { }).generate "scrape.yml" prometheusConfig}"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    systemd.services.vmauth = lib.mkIf config.services.victoriametrics.enable {
 | 
					    systemd.services.vmauth = lib.mkIf config.services.victoriametrics.enable {
 | 
				
			||||||
      description = "VictoriaMetrics basic auth proxy";
 | 
					      description = "VictoriaMetrics basic auth proxy";
 | 
				
			||||||
      after = [ "network.target" ];
 | 
					      after = [ "network.target" ];
 | 
				
			||||||
@@ -84,7 +89,10 @@ in
 | 
				
			|||||||
    # VMAgent
 | 
					    # VMAgent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    services.vmagent = {
 | 
					    services.vmagent = {
 | 
				
			||||||
 | 
					      package = pkgs-stable.vmagent;
 | 
				
			||||||
      prometheusConfig = prometheusConfig;
 | 
					      prometheusConfig = prometheusConfig;
 | 
				
			||||||
 | 
					      # https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5567
 | 
				
			||||||
 | 
					      extraArgs = [ "-promscrape.maxScrapeSize 450000000" ];
 | 
				
			||||||
      remoteWrite = {
 | 
					      remoteWrite = {
 | 
				
			||||||
        url = "https://${config.hostnames.prometheus}/api/v1/write";
 | 
					        url = "https://${config.hostnames.prometheus}/api/v1/write";
 | 
				
			||||||
        basicAuthUsername = username;
 | 
					        basicAuthUsername = username;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,10 @@
 | 
				
			|||||||
  # How long to keep journalctl entries
 | 
					  # How long to keep journalctl entries
 | 
				
			||||||
  # This helps to make sure log disk usage doesn't grow too unwieldy
 | 
					  # This helps to make sure log disk usage doesn't grow too unwieldy
 | 
				
			||||||
  services.journald.extraConfig = ''
 | 
					  services.journald.extraConfig = ''
 | 
				
			||||||
    SystemMaxUse=100M
 | 
					    SystemMaxUse=4G
 | 
				
			||||||
 | 
					    SystemKeepFree=10G
 | 
				
			||||||
 | 
					    SystemMaxFileSize=128M
 | 
				
			||||||
 | 
					    SystemMaxFiles=500
 | 
				
			||||||
    MaxFileSec=1month
 | 
					    MaxFileSec=1month
 | 
				
			||||||
    MaxRetentionSec=2month
 | 
					    MaxRetentionSec=2month
 | 
				
			||||||
  '';
 | 
					  '';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,15 +1,9 @@
 | 
				
			|||||||
_final: prev: {
 | 
					inputs: _final: prev: {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gh-collaborators = prev.buildGoModule rec {
 | 
					  gh-collaborators = prev.buildGoModule rec {
 | 
				
			||||||
    pname = "gh-collaborators";
 | 
					    pname = "gh-collaborators";
 | 
				
			||||||
    version = "v2.0.3";
 | 
					    version = "v2.0.3";
 | 
				
			||||||
 | 
					    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-rsRDOgJBa8T6+bC/APcmuRmg6ykbIp9pwRnJ9rrfHEs=";
 | 
				
			||||||
    vendorHash = "sha256-fykxRb2U9DDsXorRTLiVWmhMY89N7RS07sal8ww6gz4=";
 | 
					    vendorHash = "sha256-fykxRb2U9DDsXorRTLiVWmhMY89N7RS07sal8ww6gz4=";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,5 +38,7 @@ in
 | 
				
			|||||||
    base16-nvim = plugin "base16-nvim" inputs.base16-nvim-src;
 | 
					    base16-nvim = plugin "base16-nvim" inputs.base16-nvim-src;
 | 
				
			||||||
    baleia-nvim = plugin "baleia-nvim" inputs.baleia-nvim-src;
 | 
					    baleia-nvim = plugin "baleia-nvim" inputs.baleia-nvim-src;
 | 
				
			||||||
    hmts-nvim = plugin "hmts-nvim" inputs.hmts-nvim-src;
 | 
					    hmts-nvim = plugin "hmts-nvim" inputs.hmts-nvim-src;
 | 
				
			||||||
 | 
					    tiny-inline-diagnostic-nvim = plugin "tiny-inline-diagnostic-nvim" inputs.tiny-inline-diagnostic-nvim-src;
 | 
				
			||||||
 | 
					    snipe-nvim = plugin "snipe-nvim" inputs.snipe-nvim-src;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,21 +5,25 @@ inputs: _final: prev: {
 | 
				
			|||||||
      url = inputs.nextcloud-news.outPath;
 | 
					      url = inputs.nextcloud-news.outPath;
 | 
				
			||||||
      sha256 = inputs.nextcloud-news.narHash;
 | 
					      sha256 = inputs.nextcloud-news.narHash;
 | 
				
			||||||
      license = "agpl3Plus";
 | 
					      license = "agpl3Plus";
 | 
				
			||||||
 | 
					      unpack = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    external = prev.fetchNextcloudApp {
 | 
					    external = prev.fetchNextcloudApp {
 | 
				
			||||||
      url = inputs.nextcloud-external.outPath;
 | 
					      url = inputs.nextcloud-external.outPath;
 | 
				
			||||||
      sha256 = inputs.nextcloud-external.narHash;
 | 
					      sha256 = inputs.nextcloud-external.narHash;
 | 
				
			||||||
      license = "agpl3Plus";
 | 
					      license = "agpl3Plus";
 | 
				
			||||||
 | 
					      unpack = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    cookbook = prev.fetchNextcloudApp {
 | 
					    cookbook = prev.fetchNextcloudApp {
 | 
				
			||||||
      url = inputs.nextcloud-cookbook.outPath;
 | 
					      url = inputs.nextcloud-cookbook.outPath;
 | 
				
			||||||
      sha256 = inputs.nextcloud-cookbook.narHash;
 | 
					      sha256 = inputs.nextcloud-cookbook.narHash;
 | 
				
			||||||
      license = "agpl3Plus";
 | 
					      license = "agpl3Plus";
 | 
				
			||||||
 | 
					      unpack = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    snappymail = prev.fetchNextcloudApp {
 | 
					    snappymail = prev.fetchNextcloudApp {
 | 
				
			||||||
      url = inputs.nextcloud-snappymail.outPath;
 | 
					      url = inputs.nextcloud-snappymail.outPath;
 | 
				
			||||||
      sha256 = inputs.nextcloud-snappymail.narHash;
 | 
					      sha256 = inputs.nextcloud-snappymail.narHash;
 | 
				
			||||||
      license = "agpl3Plus";
 | 
					      license = "agpl3Plus";
 | 
				
			||||||
 | 
					      unpack = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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-----
 | 
				
			||||||
		Reference in New Issue
	
	Block a user