mirror of
				https://github.com/nmasur/dotfiles
				synced 2025-11-04 04:43:15 +00:00 
			
		
		
		
	Compare commits
	
		
			82 Commits
		
	
	
		
			a47bcf8949
			...
			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 | 
							
								
								
									
										4
									
								
								.github/workflows/update.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/update.yml
									
									
									
									
										vendored
									
									
								
							@@ -3,7 +3,7 @@ name: Update Flake
 | 
			
		||||
on:
 | 
			
		||||
  workflow_dispatch: # allows manual triggering
 | 
			
		||||
  schedule:
 | 
			
		||||
    - cron: '33 3 * * 0' # runs weekly on Sunday at 03:33
 | 
			
		||||
    - cron: '33 3 * * 6' # runs weekly on Saturday at 03:33
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: write
 | 
			
		||||
@@ -19,6 +19,8 @@ jobs:
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
      - name: Install Nix
 | 
			
		||||
        uses: DeterminateSystems/nix-installer-action@v11
 | 
			
		||||
        with:
 | 
			
		||||
          nix-package-url: https://releases.nixos.org/nix/nix-2.18.4/nix-2.18.4-x86_64-linux.tar.xz
 | 
			
		||||
      - name: Check Nixpkgs Inputs
 | 
			
		||||
        uses: DeterminateSystems/flake-checker-action@v7
 | 
			
		||||
      - name: Add Nix Cache
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										301
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										301
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							@@ -3,11 +3,11 @@
 | 
			
		||||
    "baleia-nvim-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1717182435,
 | 
			
		||||
        "narHash": "sha256-duI3myrJSvmtjF9n7NVrVOsuSo1O3JEypA5ghBHsULc=",
 | 
			
		||||
        "lastModified": 1721805312,
 | 
			
		||||
        "narHash": "sha256-qA1x5kplP2I8bURO0I4R0gt/zeznu9hQQ+XHptLGuwc=",
 | 
			
		||||
        "owner": "m00qek",
 | 
			
		||||
        "repo": "baleia.nvim",
 | 
			
		||||
        "rev": "4d3b27dbec65a44ceecd9306f605a980bcf4e9b1",
 | 
			
		||||
        "rev": "1b25eac3ac03659c3d3af75c7455e179e5f197f7",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -87,11 +87,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719845423,
 | 
			
		||||
        "narHash": "sha256-ZLHDmWAsHQQKnmfyhYSHJDlt8Wfjv6SQhl2qek42O7A=",
 | 
			
		||||
        "lastModified": 1731032247,
 | 
			
		||||
        "narHash": "sha256-OjLft7fwkmiRLXQsGAudGFZxEYXOT0nHwrQ9GbsBqJ4=",
 | 
			
		||||
        "owner": "lnl7",
 | 
			
		||||
        "repo": "nix-darwin",
 | 
			
		||||
        "rev": "ec12b88104d6c117871fad55e931addac4626756",
 | 
			
		||||
        "rev": "2fbf4a8417c28cf45bae6e6e97248cbbd9b78632",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -108,11 +108,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719864345,
 | 
			
		||||
        "narHash": "sha256-e4Pw+30vFAxuvkSTaTypd9zYemB/QlWcH186dsGT+Ms=",
 | 
			
		||||
        "lastModified": 1731060864,
 | 
			
		||||
        "narHash": "sha256-aYE7oAYZ+gPU1mPNhM0JwLAQNgjf0/JK1BF1ln2KBgk=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "disko",
 | 
			
		||||
        "rev": "544a80a69d6e2da04e4df7ec8210a858de8c7533",
 | 
			
		||||
        "rev": "5e40e02978e3bd63c2a6a9fa6fa8ba0e310e747f",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -145,11 +145,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719881223,
 | 
			
		||||
        "narHash": "sha256-9eaxGGPw7hIuZ4OaqOyKec262t+TCie0p83tlzkMEpc=",
 | 
			
		||||
        "lastModified": 1731113649,
 | 
			
		||||
        "narHash": "sha256-U6FMghMpHTk2Pb5VsjNk8tBgCiiyB+bebmfOuNtMisA=",
 | 
			
		||||
        "owner": "bandithedoge",
 | 
			
		||||
        "repo": "nixpkgs-firefox-darwin",
 | 
			
		||||
        "rev": "407f201936424ec061d33aa687e7978ae7873b5c",
 | 
			
		||||
        "rev": "22a53e2cae4d37fb24e9326c6f72a54cb4f269d5",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -231,11 +231,11 @@
 | 
			
		||||
        "systems": "systems_3"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710146030,
 | 
			
		||||
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
 | 
			
		||||
        "lastModified": 1726560853,
 | 
			
		||||
        "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
 | 
			
		||||
        "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -244,14 +244,30 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1715076655,
 | 
			
		||||
        "narHash": "sha256-vDTqJQzLyg0nmlC+CrLnPkYti1rPxmvRW8eQq/9Zg+M=",
 | 
			
		||||
        "lastModified": 1729786258,
 | 
			
		||||
        "narHash": "sha256-V5dwIJdxBulFVKk1iSlf4H5NRz1UH7uYQeMvwtgkpIs=",
 | 
			
		||||
        "owner": "calops",
 | 
			
		||||
        "repo": "hmts.nvim",
 | 
			
		||||
        "rev": "19a91816c123173a4551a6a04f2882338f20db1d",
 | 
			
		||||
        "rev": "c7ff4c3ad96cd05664b18fb5bbbe2abbd7682dd2",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -267,11 +283,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719827439,
 | 
			
		||||
        "narHash": "sha256-tneHOIv1lEavZ0vQ+rgz67LPNCgOZVByYki3OkSshFU=",
 | 
			
		||||
        "lastModified": 1730837930,
 | 
			
		||||
        "narHash": "sha256-0kZL4m+bKBJUBQse0HanewWO0g8hDdCvBhudzxgehqc=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "home-manager",
 | 
			
		||||
        "rev": "59ce796b2563e19821361abbe2067c3bb4143a7d",
 | 
			
		||||
        "rev": "2f607e07f3ac7e53541120536708e824acccfaa8",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -291,11 +307,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1718893255,
 | 
			
		||||
        "narHash": "sha256-NdSDGdz5eU/EcnGn8ECP1V+mn5hyGOZQ4ybv2bWTpuk=",
 | 
			
		||||
        "lastModified": 1727470707,
 | 
			
		||||
        "narHash": "sha256-BqkwZ2mvzn+COdfIuzllSzWmiaBwQktt4sw9slfwM70=",
 | 
			
		||||
        "owner": "hraban",
 | 
			
		||||
        "repo": "mac-app-util",
 | 
			
		||||
        "rev": "1857b26aceaf64c2b6a357eb83cf34139b6365cc",
 | 
			
		||||
        "rev": "9c6bbe2a6a7ec647d03f64f0fadb874284f59eac",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -304,72 +320,56 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "markview-nvim-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719592662,
 | 
			
		||||
        "narHash": "sha256-E1lHSjbnOOIeieaFJ+INvxJHCbfVS3mwbQ6wrlKeGSQ=",
 | 
			
		||||
        "owner": "OXY2DEV",
 | 
			
		||||
        "repo": "markview.nvim",
 | 
			
		||||
        "rev": "f60219dce7283192d549f21847fcf8537bf6d260",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "OXY2DEV",
 | 
			
		||||
        "repo": "markview.nvim",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nextcloud-cookbook": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719431638,
 | 
			
		||||
        "narHash": "sha256-a8ekMnEzudHGiqHF53jPtgsVTOTc2QLuPg6YtTw5h68=",
 | 
			
		||||
        "lastModified": 1726214817,
 | 
			
		||||
        "narHash": "sha256-Pfa+Xbopg20os+pnGgg+wpEX1MI5fz5JMb0K4a8rBhs=",
 | 
			
		||||
        "type": "tarball",
 | 
			
		||||
        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.1/cookbook-0.11.1.tar.gz"
 | 
			
		||||
        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "type": "tarball",
 | 
			
		||||
        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.1/cookbook-0.11.1.tar.gz"
 | 
			
		||||
        "url": "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nextcloud-external": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710338675,
 | 
			
		||||
        "narHash": "sha256-bJJ/dVmE1o04QCyrxD0sko0okRsnxJmT6sOTOmBiifs=",
 | 
			
		||||
        "lastModified": 1729501349,
 | 
			
		||||
        "narHash": "sha256-OV6HhFBzmnQBO5btGEnqmKlaUMY7/t2Qm3XebclpBlM=",
 | 
			
		||||
        "type": "tarball",
 | 
			
		||||
        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.4.0/external-v5.4.0.tar.gz"
 | 
			
		||||
        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "type": "tarball",
 | 
			
		||||
        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.4.0/external-v5.4.0.tar.gz"
 | 
			
		||||
        "url": "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nextcloud-news": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1718102703,
 | 
			
		||||
        "narHash": "sha256-XNGjf7SWgJYFdVNOh3ED0jxSG0GJwWImVQq4cJT1Lo4=",
 | 
			
		||||
        "lastModified": 1729667621,
 | 
			
		||||
        "narHash": "sha256-pnvyMZQ+NYMgH0Unfh5S19HdZSjnghgoUDAoi2KIXNI=",
 | 
			
		||||
        "type": "tarball",
 | 
			
		||||
        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha7/news.tar.gz"
 | 
			
		||||
        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "type": "tarball",
 | 
			
		||||
        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha7/news.tar.gz"
 | 
			
		||||
        "url": "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nextcloud-snappymail": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1720361351,
 | 
			
		||||
        "narHash": "sha256-HlqO7xlMSRGgBtwi0t5oz5v7iw0zTSHysc9wGVRwGZI=",
 | 
			
		||||
        "lastModified": 1731123727,
 | 
			
		||||
        "narHash": "sha256-oCw6Brs85rINBHvz3UJXheyLVqvA3RgPXG03b30Fx7E=",
 | 
			
		||||
        "type": "tarball",
 | 
			
		||||
        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.36.4-nextcloud.tar.gz"
 | 
			
		||||
        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.38.2-nextcloud.tar.gz"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "type": "tarball",
 | 
			
		||||
        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.36.4-nextcloud.tar.gz"
 | 
			
		||||
        "url": "https://snappymail.eu/repository/nextcloud/snappymail-2.38.2-nextcloud.tar.gz"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nix2vim": {
 | 
			
		||||
@@ -380,11 +380,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1718621825,
 | 
			
		||||
        "narHash": "sha256-bSfjwRgKKpLyjEDPRAF1hlJKc7QDoqopalHwNCB/eAA=",
 | 
			
		||||
        "lastModified": 1729103549,
 | 
			
		||||
        "narHash": "sha256-9caCn1wB0bD39bwwjnTsHoDveCUKs06nBe212fs5TKU=",
 | 
			
		||||
        "owner": "gytis-ivaskevicius",
 | 
			
		||||
        "repo": "nix2vim",
 | 
			
		||||
        "rev": "1db11dbf8a4d124e02244fa5c4ff219b672a8e5b",
 | 
			
		||||
        "rev": "b3900e6d79233573f318006505d9ad3fb7170b92",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -395,11 +395,11 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixlib": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719708727,
 | 
			
		||||
        "narHash": "sha256-XFNKtyirrGNdehpg7lMNm1skEcBApjqGhaHc/OI95HY=",
 | 
			
		||||
        "lastModified": 1729386149,
 | 
			
		||||
        "narHash": "sha256-hUP9oxmnOmNnKcDOf5Y55HQ+NnoT0+bLWHLQWLLw9Ks=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "nixpkgs.lib",
 | 
			
		||||
        "rev": "1bba8a624b3b9d4f68db94fb63aaeb46039ce9e6",
 | 
			
		||||
        "rev": "cce4521b6df014e79a7b7afc58c703ed683c916e",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -416,11 +416,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719841141,
 | 
			
		||||
        "narHash": "sha256-WOyohxFJJdfDvEB7N3eTcX44lNU2rZes1inHsyHL7mM=",
 | 
			
		||||
        "lastModified": 1729472750,
 | 
			
		||||
        "narHash": "sha256-s93LPHi5BN7I2xSGNAFWiYb8WRsPvT1LE9ZjZBrpFlg=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "nixos-generators",
 | 
			
		||||
        "rev": "140dcc2b9a0eb87ba5e9011076a1a7af19179ab1",
 | 
			
		||||
        "rev": "7c60ba4bc8d6aa2ba3e5b0f6ceb9fc07bc261565",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -431,11 +431,11 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719848872,
 | 
			
		||||
        "narHash": "sha256-H3+EC5cYuq+gQW8y0lSrrDZfH71LB4DAf+TDFyvwCNA=",
 | 
			
		||||
        "lastModified": 1730785428,
 | 
			
		||||
        "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=",
 | 
			
		||||
        "owner": "nixos",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "00d80d13810dbfea8ab4ed1009b09100cca86ba8",
 | 
			
		||||
        "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -461,13 +461,45 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719925604,
 | 
			
		||||
        "narHash": "sha256-cLmqi+P1sn+7497GS4fNWayoTDa0ZiJecjmEM4iQN9U=",
 | 
			
		||||
        "lastModified": 1731119600,
 | 
			
		||||
        "narHash": "sha256-Asx9nXJBdRN4AvuA8+etlQWY8PrqrXXvPb1uNFveV8k=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "nur",
 | 
			
		||||
        "rev": "574405811547dcec59e912c5e82bfd224648bd5e",
 | 
			
		||||
        "rev": "b29499982ee565c8dab5ca5c7be8d2ebfc267d87",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -479,11 +511,11 @@
 | 
			
		||||
    "nvim-lint-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719415114,
 | 
			
		||||
        "narHash": "sha256-a9Mfoi1NzQ3b1w1VUqqJZddyCZYyacRnc128t5X3Wb0=",
 | 
			
		||||
        "lastModified": 1730367889,
 | 
			
		||||
        "narHash": "sha256-vLsyRc8nbJJBjWebNFy5yrS6w2TmibEeMNpyzFenoTg=",
 | 
			
		||||
        "owner": "mfussenegger",
 | 
			
		||||
        "repo": "nvim-lint",
 | 
			
		||||
        "rev": "efc6fc83f0772283e064c53a8f9fb5645bde0bc0",
 | 
			
		||||
        "rev": "36da8dd0ddc4f88e0beae234c20e75397326f143",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -512,11 +544,11 @@
 | 
			
		||||
    "nvim-tree-lua-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719107085,
 | 
			
		||||
        "narHash": "sha256-RfrbxYD7RYBEy/grSYnKKkWd4BHxGYEFeLiDB5OYGpg=",
 | 
			
		||||
        "lastModified": 1731122044,
 | 
			
		||||
        "narHash": "sha256-pf4S8iMtgCJU8jOMxqr0oItO0htBGafGglKnEU1neus=",
 | 
			
		||||
        "owner": "kyazdani42",
 | 
			
		||||
        "repo": "nvim-tree.lua",
 | 
			
		||||
        "rev": "8b2c5c678be4b49dff6a2df794877000113fd77b",
 | 
			
		||||
        "rev": "3fc8de198c15ec4e5395f57b70579b3959976960",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -528,16 +560,16 @@
 | 
			
		||||
    "nvim-treesitter-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719904131,
 | 
			
		||||
        "narHash": "sha256-RbTBilXbgMFfwkbIyLMZuZw1DyzDol7g0V6uu4MaEh0=",
 | 
			
		||||
        "lastModified": 1705679158,
 | 
			
		||||
        "narHash": "sha256-zAyiitJIgOCZTB0CmgNt0MHENM70SOHLIoWrVwOJKFg=",
 | 
			
		||||
        "owner": "nvim-treesitter",
 | 
			
		||||
        "repo": "nvim-treesitter",
 | 
			
		||||
        "rev": "e0d6c7643dc953acc2e817d0cebfc2f1f8c008e1",
 | 
			
		||||
        "rev": "f197a15b0d1e8d555263af20add51450e5aaa1f0",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "nvim-treesitter",
 | 
			
		||||
        "ref": "master",
 | 
			
		||||
        "ref": "v0.9.2",
 | 
			
		||||
        "repo": "nvim-treesitter",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
@@ -584,10 +616,10 @@
 | 
			
		||||
        "disko": "disko",
 | 
			
		||||
        "fidget-nvim-src": "fidget-nvim-src",
 | 
			
		||||
        "firefox-darwin": "firefox-darwin",
 | 
			
		||||
        "gh-collaborators": "gh-collaborators",
 | 
			
		||||
        "hmts-nvim-src": "hmts-nvim-src",
 | 
			
		||||
        "home-manager": "home-manager",
 | 
			
		||||
        "mac-app-util": "mac-app-util",
 | 
			
		||||
        "markview-nvim-src": "markview-nvim-src",
 | 
			
		||||
        "nextcloud-cookbook": "nextcloud-cookbook",
 | 
			
		||||
        "nextcloud-external": "nextcloud-external",
 | 
			
		||||
        "nextcloud-news": "nextcloud-news",
 | 
			
		||||
@@ -596,6 +628,7 @@
 | 
			
		||||
        "nixos-generators": "nixos-generators",
 | 
			
		||||
        "nixpkgs": "nixpkgs",
 | 
			
		||||
        "nixpkgs-caddy": "nixpkgs-caddy",
 | 
			
		||||
        "nixpkgs-stable": "nixpkgs-stable",
 | 
			
		||||
        "nur": "nur",
 | 
			
		||||
        "nvim-lint-src": "nvim-lint-src",
 | 
			
		||||
        "nvim-lspconfig-src": "nvim-lspconfig-src",
 | 
			
		||||
@@ -603,9 +636,10 @@
 | 
			
		||||
        "nvim-treesitter-src": "nvim-treesitter-src",
 | 
			
		||||
        "ren": "ren",
 | 
			
		||||
        "rep": "rep",
 | 
			
		||||
        "stu": "stu",
 | 
			
		||||
        "snipe-nvim-src": "snipe-nvim-src",
 | 
			
		||||
        "telescope-nvim-src": "telescope-nvim-src",
 | 
			
		||||
        "telescope-project-nvim-src": "telescope-project-nvim-src",
 | 
			
		||||
        "tiny-inline-diagnostic-nvim-src": "tiny-inline-diagnostic-nvim-src",
 | 
			
		||||
        "toggleterm-nvim-src": "toggleterm-nvim-src",
 | 
			
		||||
        "tree-sitter-bash": "tree-sitter-bash",
 | 
			
		||||
        "tree-sitter-ini": "tree-sitter-ini",
 | 
			
		||||
@@ -614,24 +648,25 @@
 | 
			
		||||
        "tree-sitter-python": "tree-sitter-python",
 | 
			
		||||
        "tree-sitter-rasi": "tree-sitter-rasi",
 | 
			
		||||
        "tree-sitter-vimdoc": "tree-sitter-vimdoc",
 | 
			
		||||
        "ucodenix": "ucodenix",
 | 
			
		||||
        "wallpapers": "wallpapers",
 | 
			
		||||
        "wsl": "wsl",
 | 
			
		||||
        "zenyd-mpv-scripts": "zenyd-mpv-scripts"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "stu": {
 | 
			
		||||
    "snipe-nvim-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1720424134,
 | 
			
		||||
        "narHash": "sha256-c6nLQOhwztwnUfKLx69Le9pCHE0GtruqKMnvYpGyr+0=",
 | 
			
		||||
        "owner": "lusingander",
 | 
			
		||||
        "repo": "stu",
 | 
			
		||||
        "rev": "279edc8d63c04b42773434bf8c6f2744a66d71a8",
 | 
			
		||||
        "lastModified": 1730493972,
 | 
			
		||||
        "narHash": "sha256-9Q/ZbhtteS9SemQJ/3Nov1rshQgm1Beiw88/zgmJbRg=",
 | 
			
		||||
        "owner": "leath-dub",
 | 
			
		||||
        "repo": "snipe.nvim",
 | 
			
		||||
        "rev": "64b3763c1b388ac5a3d5a2da615a3d0824af4a45",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "lusingander",
 | 
			
		||||
        "repo": "stu",
 | 
			
		||||
        "owner": "leath-dub",
 | 
			
		||||
        "repo": "snipe.nvim",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -700,11 +735,11 @@
 | 
			
		||||
    "telescope-project-nvim-src": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1701464478,
 | 
			
		||||
        "narHash": "sha256-touMCltcnqkrQYV1NtNeWLQeFVGt+WM3aIWIdKilA7w=",
 | 
			
		||||
        "lastModified": 1725880250,
 | 
			
		||||
        "narHash": "sha256-wO/cm5PT1L0hFr/CX466w0UimoFg/tWrDK8T0QeKZMU=",
 | 
			
		||||
        "owner": "nvim-telescope",
 | 
			
		||||
        "repo": "telescope-project.nvim",
 | 
			
		||||
        "rev": "1aaf16580a614601a7f7077d9639aeb457dc5559",
 | 
			
		||||
        "rev": "796200876bb0fe8157b8eb1ce03d927d3827a052",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -713,19 +748,35 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1713792255,
 | 
			
		||||
        "narHash": "sha256-mM5bGgAemsRJD9U6U5K6ia5qb8NaTusM99x6xrtEBfw=",
 | 
			
		||||
        "lastModified": 1721232722,
 | 
			
		||||
        "narHash": "sha256-hJ6nBCgSyYF1pY4lX+b8WZd49i5F6BwOmrl7xVSIwRw=",
 | 
			
		||||
        "owner": "akinsho",
 | 
			
		||||
        "repo": "toggleterm.nvim",
 | 
			
		||||
        "rev": "066cccf48a43553a80a210eb3be89a15d789d6e6",
 | 
			
		||||
        "rev": "48be57eaba817f038d61bbf64d2c597f578c0827",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "akinsho",
 | 
			
		||||
        "ref": "v2.11.0",
 | 
			
		||||
        "ref": "v2.12.0",
 | 
			
		||||
        "repo": "toggleterm.nvim",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
@@ -733,11 +784,11 @@
 | 
			
		||||
    "tree-sitter-bash": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1715005250,
 | 
			
		||||
        "narHash": "sha256-rCuQbnQAOnQWKYreNH80nlL+0A1qbWbjMvtczcoWPrY=",
 | 
			
		||||
        "lastModified": 1728963142,
 | 
			
		||||
        "narHash": "sha256-h6L5eIItu3IOJBKSZCajHMhhencN1Fk/4dXgBMuVxYc=",
 | 
			
		||||
        "owner": "tree-sitter",
 | 
			
		||||
        "repo": "tree-sitter-bash",
 | 
			
		||||
        "rev": "2fbd860f802802ca76a6661ce025b3a3bca2d3ed",
 | 
			
		||||
        "rev": "597a5ed6ed4d932fd44697feec988f977081ae59",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -750,11 +801,11 @@
 | 
			
		||||
    "tree-sitter-ini": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1716889525,
 | 
			
		||||
        "narHash": "sha256-IyHrIxcmuzs60zUiJv4E3nSkhSkgbcaLDUdeDx5mlHk=",
 | 
			
		||||
        "lastModified": 1725233451,
 | 
			
		||||
        "narHash": "sha256-G11Aynq2rnkRwdkhspjYqtBD/h5k4aD+NvuE0QfploU=",
 | 
			
		||||
        "owner": "justinmk",
 | 
			
		||||
        "repo": "tree-sitter-ini",
 | 
			
		||||
        "rev": "87176e524f0a98f5be75fa44f4f0ff5c6eac069c",
 | 
			
		||||
        "rev": "962568c9efa71d25720ab42c5d36e222626ef3a6",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -766,11 +817,11 @@
 | 
			
		||||
    "tree-sitter-lua": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710150044,
 | 
			
		||||
        "narHash": "sha256-uFaEptW4wPrqgHfB1mYmVltf+4no61L2cPgpsr5qBIU=",
 | 
			
		||||
        "lastModified": 1729494737,
 | 
			
		||||
        "narHash": "sha256-v+fFcIOv+bu+2IGI/Lh/Xbqd5BzbBjaa51ECd0hG7Ow=",
 | 
			
		||||
        "owner": "MunifTanjim",
 | 
			
		||||
        "repo": "tree-sitter-lua",
 | 
			
		||||
        "rev": "a24dab177e58c9c6832f96b9a73102a0cfbced4a",
 | 
			
		||||
        "rev": "34e60e7f45fc313463c68090d88d742a55d1bd7a",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -799,11 +850,11 @@
 | 
			
		||||
    "tree-sitter-python": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1714528221,
 | 
			
		||||
        "narHash": "sha256-hHQ5gK4dTRSdp0fLKarytU9vFhsBeQp7Ka61vFoIr7Y=",
 | 
			
		||||
        "lastModified": 1728966077,
 | 
			
		||||
        "narHash": "sha256-pD4JedYrnz6d5pgzRPtKPY0XPRoot1FMI9XgTgONOyw=",
 | 
			
		||||
        "owner": "tree-sitter",
 | 
			
		||||
        "repo": "tree-sitter-python",
 | 
			
		||||
        "rev": "71778c2a472ed00a64abf4219544edbf8e4b86d7",
 | 
			
		||||
        "rev": "7f4b9c2d8039701b0579b7c060a918f8548aa7cd",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -832,11 +883,11 @@
 | 
			
		||||
    "tree-sitter-vimdoc": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1717834376,
 | 
			
		||||
        "narHash": "sha256-v+XSWGm2Wdn9/rxNFMqXYACkGn6AvxZdxkClLuKnWGU=",
 | 
			
		||||
        "lastModified": 1729686839,
 | 
			
		||||
        "narHash": "sha256-Vrl4/cZL+TWlUMEeWZoHCAWhvlefcl3ajGcwyTNKOhI=",
 | 
			
		||||
        "owner": "neovim",
 | 
			
		||||
        "repo": "tree-sitter-vimdoc",
 | 
			
		||||
        "rev": "2249c44ecd3f5cf22da3dcccfb74f816ddb29245",
 | 
			
		||||
        "rev": "d2e4b5c172a109966c2ce0378f73df6cede39400",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -845,6 +896,24 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
@@ -870,11 +939,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1719220171,
 | 
			
		||||
        "narHash": "sha256-xywM6JoGT8AwfoOFJBTv8GRlvNu8LYqqqMS/OQ6uCgE=",
 | 
			
		||||
        "lastModified": 1730453870,
 | 
			
		||||
        "narHash": "sha256-d+kIgz4BvTXb7emjSFV3zjNydGmLUmuluQjdBb51R9o=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "NixOS-WSL",
 | 
			
		||||
        "rev": "269411cfed6aab694e46f719277c972de96177bb",
 | 
			
		||||
        "rev": "adb6bc4b661a43328752b4575be4968a4990c033",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								flake.nix
									
									
									
									
									
								
							@@ -7,6 +7,9 @@
 | 
			
		||||
    # Used for system packages
 | 
			
		||||
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
 | 
			
		||||
 | 
			
		||||
    # Used for specific stable packages
 | 
			
		||||
    nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.05";
 | 
			
		||||
 | 
			
		||||
    # Used for caddy plugins
 | 
			
		||||
    nixpkgs-caddy.url = "github:jpds/nixpkgs/caddy-external-plugins";
 | 
			
		||||
 | 
			
		||||
@@ -28,6 +31,9 @@
 | 
			
		||||
      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
 | 
			
		||||
    nur.url = "github:nix-community/nur";
 | 
			
		||||
 | 
			
		||||
@@ -88,7 +94,7 @@
 | 
			
		||||
    };
 | 
			
		||||
    nvim-treesitter-src = {
 | 
			
		||||
      # https://github.com/nvim-treesitter/nvim-treesitter/tags
 | 
			
		||||
      url = "github:nvim-treesitter/nvim-treesitter/master";
 | 
			
		||||
      url = "github:nvim-treesitter/nvim-treesitter/v0.9.2";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    telescope-nvim-src = {
 | 
			
		||||
@@ -102,7 +108,7 @@
 | 
			
		||||
    };
 | 
			
		||||
    toggleterm-nvim-src = {
 | 
			
		||||
      # https://github.com/akinsho/toggleterm.nvim/tags
 | 
			
		||||
      url = "github:akinsho/toggleterm.nvim/v2.11.0";
 | 
			
		||||
      url = "github:akinsho/toggleterm.nvim/v2.12.0";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    bufferline-nvim-src = {
 | 
			
		||||
@@ -127,8 +133,12 @@
 | 
			
		||||
      url = "github:mfussenegger/nvim-lint";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    markview-nvim-src = {
 | 
			
		||||
      url = "github:OXY2DEV/markview.nvim";
 | 
			
		||||
    tiny-inline-diagnostic-nvim-src = {
 | 
			
		||||
      url = "github:rachartier/tiny-inline-diagnostic.nvim";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    snipe-nvim-src = {
 | 
			
		||||
      url = "github:leath-dub/snipe.nvim";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@@ -178,32 +188,31 @@
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Stu - TUI for S3
 | 
			
		||||
    stu = {
 | 
			
		||||
      url = "github:lusingander/stu";
 | 
			
		||||
    gh-collaborators = {
 | 
			
		||||
      url = "github:katiem0/gh-collaborators";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Nextcloud Apps
 | 
			
		||||
    nextcloud-news = {
 | 
			
		||||
      # https://github.com/nextcloud/news/releases
 | 
			
		||||
      url = "https://github.com/nextcloud/news/releases/download/25.0.0-alpha7/news.tar.gz";
 | 
			
		||||
      url = "https://github.com/nextcloud/news/releases/download/25.0.0-alpha12/news.tar.gz";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    nextcloud-external = {
 | 
			
		||||
      # https://github.com/nextcloud-releases/external/releases
 | 
			
		||||
      url = "https://github.com/nextcloud-releases/external/releases/download/v5.4.0/external-v5.4.0.tar.gz";
 | 
			
		||||
      url = "https://github.com/nextcloud-releases/external/releases/download/v5.5.2/external-v5.5.2.tar.gz";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    nextcloud-cookbook = {
 | 
			
		||||
      # https://github.com/christianlupus-nextcloud/cookbook-releases/releases/
 | 
			
		||||
      url = "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.1/cookbook-0.11.1.tar.gz";
 | 
			
		||||
      url = "https://github.com/christianlupus-nextcloud/cookbook-releases/releases/download/v0.11.2/cookbook-0.11.2.tar.gz";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    nextcloud-snappymail = {
 | 
			
		||||
      # https://github.com/the-djmaze/snappymail/releases
 | 
			
		||||
      # https://snappymail.eu/repository/nextcloud
 | 
			
		||||
      url = "https://snappymail.eu/repository/nextcloud/snappymail-2.36.4-nextcloud.tar.gz";
 | 
			
		||||
      url = "https://snappymail.eu/repository/nextcloud/snappymail-2.38.2-nextcloud.tar.gz";
 | 
			
		||||
      # url = "https://github.com/nmasur/snappymail-nextcloud/releases/download/v2.36.3/snappymail-2.36.3-nextcloud.tar.gz";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
@@ -229,12 +238,15 @@
 | 
			
		||||
          mail.smtpHost = "smtp.purelymail.com";
 | 
			
		||||
          dotfilesRepo = "https://github.com/nmasur/dotfiles";
 | 
			
		||||
          hostnames = {
 | 
			
		||||
            audiobooks = "read.${baseName}";
 | 
			
		||||
            files = "files.${baseName}";
 | 
			
		||||
            git = "git.${baseName}";
 | 
			
		||||
            influxdb = "influxdb.${baseName}";
 | 
			
		||||
            irc = "irc.${baseName}";
 | 
			
		||||
            metrics = "metrics.${baseName}";
 | 
			
		||||
            minecraft = "minecraft.${baseName}";
 | 
			
		||||
            n8n = "n8n2.${baseName}";
 | 
			
		||||
            n8n = "n8n.${baseName}";
 | 
			
		||||
            notifications = "ntfy.${baseName}";
 | 
			
		||||
            prometheus = "prom.${baseName}";
 | 
			
		||||
            paperless = "paper.${baseName}";
 | 
			
		||||
            secrets = "vault.${baseName}";
 | 
			
		||||
@@ -242,6 +254,7 @@
 | 
			
		||||
            content = "cloud.${baseName}";
 | 
			
		||||
            books = "books.${baseName}";
 | 
			
		||||
            download = "download.${baseName}";
 | 
			
		||||
            status = "status.${baseName}";
 | 
			
		||||
            transmission = "transmission.${baseName}";
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
@@ -251,15 +264,13 @@
 | 
			
		||||
        inputs.nur.overlay
 | 
			
		||||
        inputs.nix2vim.overlay
 | 
			
		||||
        (import ./overlays/neovim-plugins.nix inputs)
 | 
			
		||||
        (import ./overlays/calibre-web.nix)
 | 
			
		||||
        (import ./overlays/disko.nix inputs)
 | 
			
		||||
        (import ./overlays/tree-sitter.nix inputs)
 | 
			
		||||
        (import ./overlays/mpv-scripts.nix inputs)
 | 
			
		||||
        (import ./overlays/nextcloud-apps.nix inputs)
 | 
			
		||||
        (import ./overlays/betterlockscreen.nix)
 | 
			
		||||
        (import ./overlays/gh-collaborators.nix)
 | 
			
		||||
        (import ./overlays/gh-collaborators.nix inputs)
 | 
			
		||||
        (import ./overlays/ren-rep.nix inputs)
 | 
			
		||||
        (import ./overlays/stu.nix inputs)
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      # System types to support.
 | 
			
		||||
@@ -331,6 +342,7 @@
 | 
			
		||||
            system = "x86_64-linux";
 | 
			
		||||
            format = "iso";
 | 
			
		||||
            specialArgs = {
 | 
			
		||||
              pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
            };
 | 
			
		||||
            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; };
 | 
			
		||||
@@ -339,6 +351,7 @@
 | 
			
		||||
            system = "x86_64-linux";
 | 
			
		||||
            format = "amazon";
 | 
			
		||||
            specialArgs = {
 | 
			
		||||
              pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
              pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
            };
 | 
			
		||||
            modules = import ./hosts/arrow/modules.nix { inherit inputs globals overlays; } ++ [
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@
 | 
			
		||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
  system = "aarch64-linux";
 | 
			
		||||
  specialArgs = {
 | 
			
		||||
    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
  };
 | 
			
		||||
  modules = [
 | 
			
		||||
@@ -79,6 +80,9 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
      services.gitea.enable = true;
 | 
			
		||||
      services.vaultwarden.enable = true;
 | 
			
		||||
      services.minecraft-server.enable = true; # Setup Minecraft server
 | 
			
		||||
      services.n8n.enable = true;
 | 
			
		||||
      services.ntfy-sh.enable = true;
 | 
			
		||||
      services.uptime-kuma.enable = true;
 | 
			
		||||
      system.autoUpgrade.enable = true;
 | 
			
		||||
 | 
			
		||||
      # Allows private remote access over the internet
 | 
			
		||||
 
 | 
			
		||||
@@ -53,6 +53,7 @@ inputs.darwin.lib.darwinSystem {
 | 
			
		||||
      _1password.enable = true;
 | 
			
		||||
      slack.enable = true;
 | 
			
		||||
      wezterm.enable = true;
 | 
			
		||||
      yt-dlp.enable = true;
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@
 | 
			
		||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
  system = "x86_64-linux";
 | 
			
		||||
  specialArgs = {
 | 
			
		||||
    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
  };
 | 
			
		||||
  modules = [
 | 
			
		||||
@@ -66,6 +67,14 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
        devices = (import ../../disks/root.nix { disk = "/dev/nvme0n1"; });
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      zramSwap.enable = true;
 | 
			
		||||
      swapDevices = [
 | 
			
		||||
        {
 | 
			
		||||
          device = "/swapfile";
 | 
			
		||||
          size = 4 * 1024; # 4 GB
 | 
			
		||||
        }
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
      boot.zfs = {
 | 
			
		||||
        # Automatically load the ZFS pool on boot
 | 
			
		||||
        extraPools = [ "tank" ];
 | 
			
		||||
@@ -96,6 +105,8 @@ inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
      cloudflare.enable = true;
 | 
			
		||||
      dotfiles.enable = true;
 | 
			
		||||
      arrs.enable = true;
 | 
			
		||||
      filebrowser.enable = true;
 | 
			
		||||
      services.audiobookshelf.enable = true;
 | 
			
		||||
      services.bind.enable = true;
 | 
			
		||||
      services.caddy.enable = true;
 | 
			
		||||
      services.jellyfin.enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,11 +8,16 @@
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
inputs.nixpkgs.lib.nixosSystem {
 | 
			
		||||
inputs.nixpkgs.lib.nixosSystem rec {
 | 
			
		||||
  system = "x86_64-linux";
 | 
			
		||||
  specialArgs = {
 | 
			
		||||
    pkgs-stable = import inputs.nixpkgs-stable { inherit system; };
 | 
			
		||||
    pkgs-caddy = import inputs.nixpkgs-caddy { inherit system; };
 | 
			
		||||
  };
 | 
			
		||||
  modules = [
 | 
			
		||||
    globals
 | 
			
		||||
    inputs.home-manager.nixosModules.home-manager
 | 
			
		||||
    inputs.ucodenix.nixosModules.default
 | 
			
		||||
    ../../modules/common
 | 
			
		||||
    ../../modules/nixos
 | 
			
		||||
    {
 | 
			
		||||
@@ -45,6 +50,7 @@ inputs.nixpkgs.lib.nixosSystem {
 | 
			
		||||
 | 
			
		||||
      # Allow firmware updates
 | 
			
		||||
      hardware.cpu.amd.updateMicrocode = true;
 | 
			
		||||
      services.ucodenix.enable = true;
 | 
			
		||||
 | 
			
		||||
      # Helps reduce GPU fan noise under idle loads
 | 
			
		||||
      hardware.fancontrol.enable = true;
 | 
			
		||||
@@ -118,6 +124,7 @@ inputs.nixpkgs.lib.nixosSystem {
 | 
			
		||||
        dwarf-fortress.enable = true;
 | 
			
		||||
        enable = true;
 | 
			
		||||
        steam.enable = true;
 | 
			
		||||
        moonlight.enable = true;
 | 
			
		||||
        legendary.enable = true;
 | 
			
		||||
        lutris.enable = true;
 | 
			
		||||
        ryujinx.enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -22,10 +22,9 @@
 | 
			
		||||
      "1password-cli"
 | 
			
		||||
    ];
 | 
			
		||||
    home-manager.users.${config.user} = {
 | 
			
		||||
      home.packages = with pkgs; [
 | 
			
		||||
        _1password-gui
 | 
			
		||||
        _1password
 | 
			
		||||
      ];
 | 
			
		||||
      home.packages = [
 | 
			
		||||
        pkgs._1password-cli
 | 
			
		||||
      ] ++ (if pkgs.stdenv.isLinux then [ pkgs._1password-gui ] else [ ]);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # https://1password.community/discussion/135462/firefox-extension-does-not-connect-to-linux-app
 | 
			
		||||
 
 | 
			
		||||
@@ -71,6 +71,8 @@
 | 
			
		||||
            "cookiebanners.ui.desktop.enabled" = true; # Reject cookie popups
 | 
			
		||||
            "devtools.command-button-screenshot.enabled" = true; # Scrolling screenshot of entire page
 | 
			
		||||
            "svg.context-properties.content.enabled" = true; # Sidebery styling
 | 
			
		||||
            "browser.tabs.hoverPreview.enabled" = false; # Disable tab previews
 | 
			
		||||
            "browser.tabs.hoverPreview.showThumbnails" = false; # Disable tab previews
 | 
			
		||||
          };
 | 
			
		||||
          userChrome = ''
 | 
			
		||||
            :root {
 | 
			
		||||
@@ -157,6 +159,15 @@
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      # Mimic nixpkgs package environment for read-only profiles.ini management
 | 
			
		||||
      # From: https://github.com/booxter/home-manager/commit/dd1602e306fec366280f5953c5e1b553e3d9672a
 | 
			
		||||
      home.sessionVariables = {
 | 
			
		||||
        MOZ_LEGACY_PROFILES = 1;
 | 
			
		||||
        MOZ_ALLOW_DOWNGRADE = 1;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      # launchd.user.envVariables = config.home-manager.users.${config.user}.home.sessionVariables;
 | 
			
		||||
 | 
			
		||||
      xdg.mimeApps = {
 | 
			
		||||
        associations.added = {
 | 
			
		||||
          "text/html" = [ "firefox.desktop" ];
 | 
			
		||||
 
 | 
			
		||||
@@ -119,6 +119,9 @@
 | 
			
		||||
                font = wezterm.font('${font}', { weight = 'Bold'}),
 | 
			
		||||
                font_size = ${if pkgs.stdenv.isLinux then "14.0" else "18.0"},
 | 
			
		||||
 | 
			
		||||
                -- Fix color blocks instead of text
 | 
			
		||||
                front_end = "WebGpu",
 | 
			
		||||
 | 
			
		||||
                -- Tab Bar
 | 
			
		||||
                hide_tab_bar_if_only_one_tab = true,
 | 
			
		||||
                window_frame = {
 | 
			
		||||
@@ -169,7 +172,7 @@
 | 
			
		||||
                  -- super-t open new tab in new dir
 | 
			
		||||
                  {
 | 
			
		||||
                    key = 't',
 | 
			
		||||
                    mods = 'SUPER',
 | 
			
		||||
                    mods = ${if pkgs.stdenv.isDarwin then "'SUPER'" else "'ALT'"},
 | 
			
		||||
                    action = wezterm.action.SpawnCommandInNewTab {
 | 
			
		||||
                      cwd = wezterm.home_dir,
 | 
			
		||||
                    },
 | 
			
		||||
 
 | 
			
		||||
@@ -77,6 +77,14 @@
 | 
			
		||||
      default = [ ];
 | 
			
		||||
    };
 | 
			
		||||
    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 {
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for git server (Gitea).";
 | 
			
		||||
@@ -129,6 +137,14 @@
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for n8n automation.";
 | 
			
		||||
      };
 | 
			
		||||
      notifications = lib.mkOption {
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for push notification services (ntfy).";
 | 
			
		||||
      };
 | 
			
		||||
      status = lib.mkOption {
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for status page (Uptime-Kuma).";
 | 
			
		||||
      };
 | 
			
		||||
      transmission = lib.mkOption {
 | 
			
		||||
        type = lib.types.str;
 | 
			
		||||
        description = "Hostname for peer2peer downloads (Transmission).";
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@
 | 
			
		||||
  plugins = [
 | 
			
		||||
    pkgs.vimPlugins.bufferline-nvim
 | 
			
		||||
    pkgs.vimPlugins.vim-bbye # Better closing of buffers
 | 
			
		||||
    pkgs.vimPlugins.snipe-nvim # Jump between open buffers
 | 
			
		||||
  ];
 | 
			
		||||
  setup.bufferline = {
 | 
			
		||||
    options = {
 | 
			
		||||
@@ -15,6 +16,7 @@
 | 
			
		||||
      offsets = [ { filetype = "NvimTree"; } ];
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  setup.snipe = { };
 | 
			
		||||
  lua = ''
 | 
			
		||||
    -- Move buffers
 | 
			
		||||
    vim.keymap.set("n", "L", ":BufferLineCycleNext<CR>", { silent = true })
 | 
			
		||||
@@ -22,5 +24,7 @@
 | 
			
		||||
 | 
			
		||||
    -- Kill buffer
 | 
			
		||||
    vim.keymap.set("n", "<Leader>x", " :Bdelete<CR>", { silent = true })
 | 
			
		||||
  '';
 | 
			
		||||
 | 
			
		||||
    -- Jump to buffer
 | 
			
		||||
    vim.keymap.set("n", "gb", require("snipe").open_buffer_menu, { silent = true }) '';
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,9 +19,11 @@
 | 
			
		||||
      pkgs.vimPlugins.fidget-nvim
 | 
			
		||||
      pkgs.vimPlugins.nvim-lint
 | 
			
		||||
      pkgs.vimPlugins.vim-table-mode
 | 
			
		||||
      pkgs.vimPlugins.tiny-inline-diagnostic-nvim
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    setup.fidget = { };
 | 
			
		||||
    setup.tiny-inline-diagnostic = { };
 | 
			
		||||
 | 
			
		||||
    use.lspconfig.lua_ls.setup = dsl.callWith {
 | 
			
		||||
      settings = {
 | 
			
		||||
@@ -71,6 +73,9 @@
 | 
			
		||||
          files = {
 | 
			
		||||
            excludeDirs = [ ".direnv" ];
 | 
			
		||||
          };
 | 
			
		||||
          cargo = {
 | 
			
		||||
            features = "all";
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
@@ -133,6 +138,9 @@
 | 
			
		||||
 | 
			
		||||
      -- Prevent infinite log size (change this when debugging)
 | 
			
		||||
      vim.lsp.set_log_level("off")
 | 
			
		||||
 | 
			
		||||
      -- Hide buffer diagnostics (use tiny-inline-diagnostic.nvim instead)
 | 
			
		||||
      vim.diagnostic.config({ virtual_text = false })
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@
 | 
			
		||||
    pkgs.vimPlugins.vim-eunuch # File manipulation commands
 | 
			
		||||
    pkgs.vimPlugins.vim-fugitive # Git commands
 | 
			
		||||
    pkgs.vimPlugins.vim-repeat # Better repeat using .
 | 
			
		||||
    pkgs.vimPlugins.vim-abolish # Keep capitalization in substitute (Subvert)
 | 
			
		||||
    pkgs.vimPlugins.markview-nvim # Markdown preview
 | 
			
		||||
    pkgs.vimPlugins.nvim-colorizer-lua # Hex color previews
 | 
			
		||||
    pkgs.vimPlugins.which-key-nvim # Keybind helper
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ function TERM_TOGGLE()
 | 
			
		||||
    basicterminal:toggle()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local nixpkgs = terminal:new({ cmd = "nix repl '<nixpkgs>'" })
 | 
			
		||||
local nixpkgs = terminal:new({ cmd = "nix repl --expr 'import <nixpkgs>{}'" })
 | 
			
		||||
function NIXPKGS_TOGGLE()
 | 
			
		||||
    nixpkgs:toggle()
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -50,9 +50,9 @@ in
 | 
			
		||||
 | 
			
		||||
        # Create a desktop option for launching Neovim from a file manager
 | 
			
		||||
        # (Requires launching the terminal and then executing Neovim)
 | 
			
		||||
        xdg.desktopEntries.nvim = lib.mkIf pkgs.stdenv.isLinux {
 | 
			
		||||
        xdg.desktopEntries.nvim = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
			
		||||
          name = "Neovim wrapper";
 | 
			
		||||
          exec = "kitty nvim %F";
 | 
			
		||||
          exec = "${config.home-manager.users.${config.user}.programs.rofi.terminal} nvim %F";
 | 
			
		||||
          mimeType = [
 | 
			
		||||
            "text/plain"
 | 
			
		||||
            "text/markdown"
 | 
			
		||||
 
 | 
			
		||||
@@ -6,14 +6,15 @@ BUCKET_NAME_PART_1="t2"
 | 
			
		||||
BUCKET_NAME_PART_2="global"
 | 
			
		||||
BUCKET_NAME_PART_3="terraformstate"
 | 
			
		||||
 | 
			
		||||
WORKFLOW_FILE=".github/workflows/terraform.yml"
 | 
			
		||||
PROJECT_ROOT=$(git rev-parse --show-toplevel)
 | 
			
		||||
WORKFLOW_FILE="${PROJECT_ROOT}/.github/workflows/terraform.yml"
 | 
			
		||||
 | 
			
		||||
if [ ! -f $WORKFLOW_FILE ]; then
 | 
			
		||||
    WORKFLOW_FILE=".github/workflows/apply.yml"
 | 
			
		||||
if [ ! -f "$WORKFLOW_FILE" ]; then
 | 
			
		||||
    WORKFLOW_FILE="${PROJECT_ROOT}/.github/workflows/apply.yml"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AWS_ACCOUNT_NUMBER=$(
 | 
			
		||||
    awk '/aws_account_number: .*/ {print $2}' $WORKFLOW_FILE | # Grab account number
 | 
			
		||||
    awk '/aws_account_number: .*/ {print $2}' "$WORKFLOW_FILE" | # Grab account number
 | 
			
		||||
        echo "$(
 | 
			
		||||
            read -r s
 | 
			
		||||
            s=${s//\'/}
 | 
			
		||||
@@ -23,7 +24,7 @@ AWS_ACCOUNT_NUMBER=$(
 | 
			
		||||
 | 
			
		||||
if [ -z "${AWS_ACCOUNT_NUMBER}" ]; then
 | 
			
		||||
    AWS_ACCOUNT_NUMBER=$(
 | 
			
		||||
        awk '/AWS_ACCOUNT_NUMBER: .*/ {print $2}' $WORKFLOW_FILE | # Grab account number
 | 
			
		||||
        awk '/AWS_ACCOUNT_NUMBER: .*/ {print $2}' "$WORKFLOW_FILE" | # Grab account number
 | 
			
		||||
            echo "$(
 | 
			
		||||
                read -r s
 | 
			
		||||
                s=${s//\'/}
 | 
			
		||||
 
 | 
			
		||||
@@ -76,6 +76,10 @@
 | 
			
		||||
          description = "Full git commit on notes";
 | 
			
		||||
          body = builtins.readFile ./functions/syncnotes.fish;
 | 
			
		||||
        };
 | 
			
		||||
        _which = {
 | 
			
		||||
          description = "Identify the path to a program in the shell";
 | 
			
		||||
          body = "command --search (string sub --start=2 $argv)";
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
      interactiveShellInit = ''
 | 
			
		||||
        fish_vi_key_bindings
 | 
			
		||||
@@ -101,10 +105,18 @@
 | 
			
		||||
        "-" = "cd -";
 | 
			
		||||
        mkd = "mkdir -pv";
 | 
			
		||||
 | 
			
		||||
        # Convert a program into its full path
 | 
			
		||||
        "=" = {
 | 
			
		||||
          position = "anywhere";
 | 
			
		||||
          regex = "=\\w+";
 | 
			
		||||
          function = "_which";
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        # System
 | 
			
		||||
        s = "sudo";
 | 
			
		||||
        sc = "systemctl";
 | 
			
		||||
        scs = "systemctl status";
 | 
			
		||||
        sca = "systemctl cat";
 | 
			
		||||
        m = "make";
 | 
			
		||||
        t = "trash";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -113,6 +113,11 @@ in
 | 
			
		||||
        gpd = "git push origin -d";
 | 
			
		||||
        gbd = "git branch -d";
 | 
			
		||||
        gbD = "git branch -D";
 | 
			
		||||
        gdd = {
 | 
			
		||||
          position = "anywhere";
 | 
			
		||||
          setCursor = true;
 | 
			
		||||
          expansion = "BRANCH=% git push origin -d $BRANCH and git branch -d $BRANCH";
 | 
			
		||||
        };
 | 
			
		||||
        gr = "git reset";
 | 
			
		||||
        grh = "git reset --hard";
 | 
			
		||||
        gm = "git merge";
 | 
			
		||||
@@ -158,6 +163,13 @@ in
 | 
			
		||||
                and git branch -D $branch
 | 
			
		||||
              '';
 | 
			
		||||
            };
 | 
			
		||||
            git-delete-both = {
 | 
			
		||||
              argumentNames = "branch";
 | 
			
		||||
              body = ''
 | 
			
		||||
                git push origin -d $branch
 | 
			
		||||
                git branch -d $branch
 | 
			
		||||
              '';
 | 
			
		||||
            };
 | 
			
		||||
            git-merge-fuzzy = {
 | 
			
		||||
              body = ''
 | 
			
		||||
                set branch (git-fuzzy-branch "merge from...")
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
        ns = "nix-shell -p";
 | 
			
		||||
        nsf = "nix-shell --run fish -p";
 | 
			
		||||
        nsr = "nix-shell-run";
 | 
			
		||||
        nps = "nix repl '<nixpkgs>'";
 | 
			
		||||
        nps = "nix repl --expr 'import <nixpkgs>{}'";
 | 
			
		||||
        nixo = "man configuration.nix";
 | 
			
		||||
        nixh = "man home-configuration.nix";
 | 
			
		||||
        nr = "rebuild-nixos";
 | 
			
		||||
 
 | 
			
		||||
@@ -12,34 +12,40 @@
 | 
			
		||||
    home.packages =
 | 
			
		||||
      let
 | 
			
		||||
        ldap_scheme = "ldaps";
 | 
			
		||||
        magic_number = "2";
 | 
			
		||||
        magic_end_seq = "corp";
 | 
			
		||||
        magic_prefix = "take";
 | 
			
		||||
        ldap_host = "${magic_prefix}${magic_number}.t${magic_number}.${magic_end_seq}";
 | 
			
		||||
        ldap_port = 636;
 | 
			
		||||
        ldap_dc_1 = "${magic_prefix}${magic_number}";
 | 
			
		||||
        ldap_dc_2 = "t${magic_number}";
 | 
			
		||||
        ldap_dc_3 = magic_end_seq;
 | 
			
		||||
        ldap_port = 3269;
 | 
			
		||||
        jq_parse = pkgs.writeShellScriptBin "ljq" ''
 | 
			
		||||
          jq --slurp \
 | 
			
		||||
            --raw-input 'split("\n\n")|map(split("\n")|map(select(.[0:1]!="#" and length>0)) |select(length > 0)|map(capture("^(?<key>[^:]*:?): *(?<value>.*)") |if .key[-1:.key|length] == ":" then .key=.key[0:-1]|.value=(.value|@base64d) else . end)| group_by(.key) | map({key:.[0].key,value:(if .|length > 1 then [.[].value] else .[].value end)}) | from_entries)' | jq -r 'del(.[].thumbnailPhoto)'
 | 
			
		||||
        '';
 | 
			
		||||
        ldap_script = pkgs.writeShellScriptBin "ldap" ''
 | 
			
		||||
          # if ! [ "$LDAP_HOST" ]; then
 | 
			
		||||
          #     echo "No LDAP_HOST specified!"
 | 
			
		||||
          #     exit 1
 | 
			
		||||
          # fi
 | 
			
		||||
          if ! [ "$LDAP_HOST" ]; then
 | 
			
		||||
              echo "No LDAP_HOST specified!"
 | 
			
		||||
              exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          SEARCH_FILTER="$@"
 | 
			
		||||
          ldapsearch -LLL \
 | 
			
		||||
              -B -o ldif-wrap=no \
 | 
			
		||||
              -H "${ldap_scheme}://${ldap_host}:${builtins.toString ldap_port}" \
 | 
			
		||||
              -D "${pkgs.lib.toUpper magic_prefix}${magic_number}\\${pkgs.lib.toLower config.user}" \
 | 
			
		||||
              -w "$(${pkgs._1password}/bin/op item get T${magic_number} --fields label=password)" \
 | 
			
		||||
              -b "DC=${ldap_dc_1},DC=${ldap_dc_2},DC=${ldap_dc_3}" \
 | 
			
		||||
              -s "sub" -x "(cn=$SEARCH_FILTER)" \
 | 
			
		||||
              | jq --slurp \
 | 
			
		||||
                  --raw-input 'split("\n\n")|map(split("\n")|map(select(.[0:1]!="#" and length>0)) |select(length > 0)|map(capture("^(?<key>[^:]*:?): *(?<value>.*)") |if .key[-1:.key|length] == ":" then .key=.key[0:-1]|.value=(.value|@base64d) else . end)| group_by(.key) | map({key:.[0].key,value:(if .|length > 1 then [.[].value] else .[].value end)}) | from_entries)' | jq -r 'del(.[].thumbnailPhoto)'
 | 
			
		||||
              -E pr=5000/prompt \
 | 
			
		||||
              -H "${ldap_scheme}://''${LDAP_HOST}:${builtins.toString ldap_port}" \
 | 
			
		||||
              -D "${pkgs.lib.toUpper magic_prefix}2\\${pkgs.lib.toLower config.user}" \
 | 
			
		||||
              -w "$(${pkgs._1password-cli}/bin/op item get T2 --fields label=password --reveal)" \
 | 
			
		||||
              -b "dc=''${LDAP_HOST//./,dc=}" \
 | 
			
		||||
              -s "sub" -x "(cn=''${SEARCH_FILTER})" \
 | 
			
		||||
              | ${jq_parse}/bin/ljq
 | 
			
		||||
        '';
 | 
			
		||||
        ldapm_script = pkgs.writeShellScriptBin "ldapm" ''
 | 
			
		||||
          if ! [ "$LDAP_HOST" ]; then
 | 
			
		||||
              echo "No LDAP_HOST specified!"
 | 
			
		||||
              exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          ${ldap_script}/bin/ldap "$@" | jq '[ .[].memberOf] | add'
 | 
			
		||||
        '';
 | 
			
		||||
        ldapg_script = pkgs.writeShellScriptBin "ldapg" ''
 | 
			
		||||
          if ! [ "$LDAP_HOST" ]; then
 | 
			
		||||
              echo "No LDAP_HOST specified!"
 | 
			
		||||
              exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          ${ldap_script}/bin/ldap "$@" | jq '[ .[].member] | add'
 | 
			
		||||
        '';
 | 
			
		||||
      in
 | 
			
		||||
@@ -47,6 +53,7 @@
 | 
			
		||||
        ldap_script
 | 
			
		||||
        ldapm_script
 | 
			
		||||
        ldapg_script
 | 
			
		||||
        jq_parse
 | 
			
		||||
      ];
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@
 | 
			
		||||
    homebrew.casks = [ "hammerspoon" ];
 | 
			
		||||
 | 
			
		||||
    system.activationScripts.postUserActivation.text = ''
 | 
			
		||||
      defaults write org.hammerspoon.Hammerspoon MJConfigFile "~/.config/hammerspoon/init.lua"
 | 
			
		||||
      defaults write org.hammerspoon.Hammerspoon MJConfigFile "${config.homePath}/.config/hammerspoon/init.lua"
 | 
			
		||||
      sudo killall Dock
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,8 @@
 | 
			
		||||
 | 
			
		||||
    system = {
 | 
			
		||||
 | 
			
		||||
      stateVersion = 5;
 | 
			
		||||
 | 
			
		||||
      keyboard = {
 | 
			
		||||
        remapCapsLockToControl = true;
 | 
			
		||||
        enableKeyMapping = true; # Allows for skhd
 | 
			
		||||
@@ -106,7 +108,6 @@
 | 
			
		||||
            "${pkgs.discord}/Applications/Discord.app"
 | 
			
		||||
            "${pkgs.obsidian}/Applications/Obsidian.app"
 | 
			
		||||
            "${pkgs.wezterm}/Applications/WezTerm.app"
 | 
			
		||||
            "/System/Applications/System Settings.app"
 | 
			
		||||
          ];
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,9 @@
 | 
			
		||||
      # shell = pkgs.fish; # Default shell
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # This might fix the shell issues
 | 
			
		||||
    # users.knownUsers = [ config.user ];
 | 
			
		||||
 | 
			
		||||
    home-manager.users.${config.user} = {
 | 
			
		||||
 | 
			
		||||
      # Default shell setting doesn't work
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@
 | 
			
		||||
      pkgs.visidata # CSV inspector
 | 
			
		||||
      pkgs.dos2unix # Convert Windows text files
 | 
			
		||||
      pkgs.inetutils # Includes telnet
 | 
			
		||||
      pkgs.youtube-dl # Convert web videos
 | 
			
		||||
      pkgs.pandoc # Convert text documents
 | 
			
		||||
      pkgs.mpd # TUI slideshows
 | 
			
		||||
      pkgs.mpv # Video player
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								modules/nixos/applications/calendar.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								modules/nixos/applications/calendar.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
{
 | 
			
		||||
  config,
 | 
			
		||||
  pkgs,
 | 
			
		||||
  lib,
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  options = {
 | 
			
		||||
    calendar = {
 | 
			
		||||
      enable = lib.mkEnableOption {
 | 
			
		||||
        description = "Enable calendar.";
 | 
			
		||||
        default = false;
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf (config.gui.enable && config.calendar.enable) {
 | 
			
		||||
    home-manager.users.${config.user} = {
 | 
			
		||||
 | 
			
		||||
      accounts.calendar.accounts.default = {
 | 
			
		||||
        basePath = "other/calendars"; # Where to save calendars in ~ directory
 | 
			
		||||
        name = "personal";
 | 
			
		||||
        local.type = "filesystem";
 | 
			
		||||
        primary = true;
 | 
			
		||||
        remote = {
 | 
			
		||||
          passwordCommand = [ "" ];
 | 
			
		||||
          type = "caldav";
 | 
			
		||||
          url = "https://${config.hostnames.content}/remote.php/dav/principals/users/${config.user}";
 | 
			
		||||
          userName = config.user;
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      home.packages = with pkgs; [ gnome-calendar ];
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  imports = [
 | 
			
		||||
    ./calendar.nix
 | 
			
		||||
    ./calibre.nix
 | 
			
		||||
    ./nautilus.nix
 | 
			
		||||
  ];
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
 | 
			
		||||
    # Quick preview with spacebar
 | 
			
		||||
    services.gnome.sushi.enable = true;
 | 
			
		||||
    environment.systemPackages = [ pkgs.gnome.nautilus ];
 | 
			
		||||
    environment.systemPackages = [ pkgs.nautilus ];
 | 
			
		||||
 | 
			
		||||
    home-manager.users.${config.user} = {
 | 
			
		||||
 | 
			
		||||
@@ -28,13 +28,13 @@
 | 
			
		||||
      xsession.windowManager.i3.config.keybindings = {
 | 
			
		||||
        "${
 | 
			
		||||
          config.home-manager.users.${config.user}.xsession.windowManager.i3.config.modifier
 | 
			
		||||
        }+n" = "exec --no-startup-id ${pkgs.gnome.nautilus}/bin/nautilus";
 | 
			
		||||
        }+n" = "exec --no-startup-id ${pkgs.nautilus}/bin/nautilus";
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      # Generates a QR code and previews it with sushi
 | 
			
		||||
      programs.fish.functions = {
 | 
			
		||||
        qr = {
 | 
			
		||||
          body = "${pkgs.qrencode}/bin/qrencode $argv[1] -o /tmp/qr.png | ${pkgs.gnome.sushi}/bin/sushi /tmp/qr.png";
 | 
			
		||||
          body = "${pkgs.qrencode}/bin/qrencode $argv[1] -o /tmp/qr.png | ${pkgs.sushi}/bin/sushi /tmp/qr.png";
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@
 | 
			
		||||
    ./legendary.nix
 | 
			
		||||
    ./lutris.nix
 | 
			
		||||
    ./minecraft-server.nix
 | 
			
		||||
    ./moonlight.nix
 | 
			
		||||
    ./ryujinx.nix
 | 
			
		||||
    ./steam.nix
 | 
			
		||||
  ];
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,10 @@
 | 
			
		||||
  options.gaming.dwarf-fortress.enable = lib.mkEnableOption "Dwarf Fortress free edition.";
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf config.gaming.dwarf-fortress.enable {
 | 
			
		||||
    unfreePackages = [ "dwarf-fortress" ];
 | 
			
		||||
    unfreePackages = [
 | 
			
		||||
      "dwarf-fortress"
 | 
			
		||||
      "phoebus-theme"
 | 
			
		||||
    ];
 | 
			
		||||
    environment.systemPackages =
 | 
			
		||||
      let
 | 
			
		||||
        dfDesktopItem = pkgs.makeDesktopItem {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								modules/nixos/gaming/moonlight.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								modules/nixos/gaming/moonlight.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
{
 | 
			
		||||
  config,
 | 
			
		||||
  pkgs,
 | 
			
		||||
  lib,
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  options.gaming.moonlight.enable = lib.mkEnableOption "Enable Moonlight game streaming client.";
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf config.gaming.moonlight.enable {
 | 
			
		||||
    environment.systemPackages = with pkgs; [ moonlight-qt ];
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -15,6 +15,7 @@
 | 
			
		||||
      "steam-original"
 | 
			
		||||
      "steamcmd"
 | 
			
		||||
      "steam-run"
 | 
			
		||||
      "steam-unwrapped"
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    programs.steam = {
 | 
			
		||||
@@ -27,7 +28,7 @@
 | 
			
		||||
    environment.systemPackages = with pkgs; [
 | 
			
		||||
 | 
			
		||||
      # Enable terminal interaction
 | 
			
		||||
      steamPackages.steamcmd
 | 
			
		||||
      steamcmd
 | 
			
		||||
      steam-tui
 | 
			
		||||
 | 
			
		||||
      # Overlay with performance monitoring
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@
 | 
			
		||||
            module-margin = 1;
 | 
			
		||||
            modules-left = "i3";
 | 
			
		||||
            modules-center = "xwindow";
 | 
			
		||||
            modules-right = "mailcount network pulseaudio date keyboard power";
 | 
			
		||||
            modules-right = "mailcount network pulseaudio date power";
 | 
			
		||||
            cursor-click = "pointer";
 | 
			
		||||
            cursor-scroll = "ns-resize";
 | 
			
		||||
            enable-ipc = true;
 | 
			
		||||
@@ -209,12 +209,6 @@
 | 
			
		||||
            label-foreground = config.theme.colors.base06;
 | 
			
		||||
            # format-background = colors.background;
 | 
			
		||||
          };
 | 
			
		||||
          "module/keyboard" = {
 | 
			
		||||
            type = "custom/text";
 | 
			
		||||
            content = "";
 | 
			
		||||
            click-left = "doas systemctl restart keyd";
 | 
			
		||||
            content-foreground = config.theme.colors.base04;
 | 
			
		||||
          };
 | 
			
		||||
          "module/power" = {
 | 
			
		||||
            type = "custom/text";
 | 
			
		||||
            content = "  ";
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,6 @@ in
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
 | 
			
		||||
    sound.enable = true;
 | 
			
		||||
 | 
			
		||||
    # Enable PipeWire
 | 
			
		||||
    services.pipewire = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,4 @@
 | 
			
		||||
{
 | 
			
		||||
  config,
 | 
			
		||||
  pkgs,
 | 
			
		||||
  lib,
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
{ config, lib, ... }:
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf config.physical {
 | 
			
		||||
@@ -17,23 +12,29 @@
 | 
			
		||||
      autoRepeatInterval = 40;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Use capslock as escape and/or control
 | 
			
		||||
    services.keyd = {
 | 
			
		||||
    # Swap Caps-Lock with Escape when pressed or LCtrl when held/combined with others
 | 
			
		||||
    # Inspired by: https://www.youtube.com/watch?v=XuQVbZ0wENE
 | 
			
		||||
    services.kanata = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      keyboards = {
 | 
			
		||||
        default = {
 | 
			
		||||
          ids = [ "*" ];
 | 
			
		||||
          settings = {
 | 
			
		||||
            main = {
 | 
			
		||||
              capslock = "overload(control, esc)";
 | 
			
		||||
      keyboards.default = {
 | 
			
		||||
        devices = [
 | 
			
		||||
          "/dev/input/by-id/usb-Logitech_Logitech_G710_Keyboard-event-kbd"
 | 
			
		||||
          "/dev/input/by-id/usb-Logitech_Logitech_G710_Keyboard-if01-event-kbd"
 | 
			
		||||
        ];
 | 
			
		||||
        extraDefCfg = "process-unmapped-keys yes";
 | 
			
		||||
        config = ''
 | 
			
		||||
          (defsrc
 | 
			
		||||
              caps
 | 
			
		||||
          )
 | 
			
		||||
          (defalias
 | 
			
		||||
              escctrl (tap-hold-press 1000 1000 esc lctrl)
 | 
			
		||||
          )
 | 
			
		||||
          (deflayer base
 | 
			
		||||
              @escctrl
 | 
			
		||||
          )
 | 
			
		||||
        '';
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # For some reason, keyd doesn't restart properly when updating
 | 
			
		||||
    system.activationScripts.keyd.text = "${pkgs.systemd}/bin/systemctl restart keyd.service";
 | 
			
		||||
 | 
			
		||||
    # Enable num lock on login
 | 
			
		||||
    home-manager.users.${config.user}.xsession.numlock.enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
    # Cursor
 | 
			
		||||
    home-manager.users.${config.user}.home.pointerCursor = {
 | 
			
		||||
      name = "Adwaita";
 | 
			
		||||
      package = pkgs.gnome3.adwaita-icon-theme;
 | 
			
		||||
      package = pkgs.adwaita-icon-theme;
 | 
			
		||||
      size = 24;
 | 
			
		||||
      gtk.enable = true;
 | 
			
		||||
      x11.enable = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,9 @@
 | 
			
		||||
{ config, lib, ... }:
 | 
			
		||||
{
 | 
			
		||||
  config,
 | 
			
		||||
  pkgs,
 | 
			
		||||
  lib,
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  options = {
 | 
			
		||||
@@ -8,7 +13,7 @@
 | 
			
		||||
  config = lib.mkIf (config.server && config.zfs.enable) {
 | 
			
		||||
 | 
			
		||||
    # Only use compatible Linux kernel, since ZFS can be behind
 | 
			
		||||
    boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
 | 
			
		||||
    boot.kernelPackages = pkgs.linuxPackages; # Defaults to latest LTS
 | 
			
		||||
    boot.kernelParams = [ "nohibernate" ];
 | 
			
		||||
    boot.supportedFilesystems = [ "zfs" ];
 | 
			
		||||
    services.prometheus.exporters.zfs.enable = config.prometheus.exporters.enable;
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,11 @@ let
 | 
			
		||||
      url = "localhost:7878";
 | 
			
		||||
      apiKey = config.secrets.radarrApiKey.dest;
 | 
			
		||||
    };
 | 
			
		||||
    readarr = {
 | 
			
		||||
      exportarrPort = "9711";
 | 
			
		||||
      url = "localhost:8787";
 | 
			
		||||
      apiKey = config.secrets.readarrApiKey.dest;
 | 
			
		||||
    };
 | 
			
		||||
    sonarr = {
 | 
			
		||||
      exportarrPort = "9708";
 | 
			
		||||
      url = "localhost:8989";
 | 
			
		||||
@@ -61,6 +66,10 @@ in
 | 
			
		||||
        enable = true;
 | 
			
		||||
        group = "media";
 | 
			
		||||
      };
 | 
			
		||||
      readarr = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        group = "media";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # 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";
 | 
			
		||||
        match = [
 | 
			
		||||
@@ -223,6 +247,11 @@ in
 | 
			
		||||
      dest = "/var/private/radarr-api";
 | 
			
		||||
      prefix = "API_KEY=";
 | 
			
		||||
    };
 | 
			
		||||
    secrets.readarrApiKey = {
 | 
			
		||||
      source = ../../../private/radarr-api-key.age;
 | 
			
		||||
      dest = "/var/private/readarr-api";
 | 
			
		||||
      prefix = "API_KEY=";
 | 
			
		||||
    };
 | 
			
		||||
    secrets.sonarrApiKey = {
 | 
			
		||||
      source = ../../../private/sonarr-api-key.age;
 | 
			
		||||
      dest = "/var/private/sonarr-api";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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 = { };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Broken on 2024-08-23
 | 
			
		||||
    # https://github.com/NixOS/nixpkgs/commit/0875d0ce1c778f344cd2377a5337a45385d6ffa0
 | 
			
		||||
    nixpkgs.config.permittedInsecurePackages = [ "litestream-0.3.13" ];
 | 
			
		||||
 | 
			
		||||
    # Wait for secret to exist
 | 
			
		||||
    systemd.services.litestream = {
 | 
			
		||||
      after = [ "backup-secret.service" ];
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@
 | 
			
		||||
 | 
			
		||||
    # Force Caddy to 403 if not coming from allowlisted source
 | 
			
		||||
    caddy.cidrAllowlist = [ "127.0.0.1/32" ];
 | 
			
		||||
    caddy.routes = [
 | 
			
		||||
    caddy.routes = lib.mkBefore [
 | 
			
		||||
      {
 | 
			
		||||
        match = [ { not = [ { remote_ip.ranges = config.caddy.cidrAllowlist; } ]; } ];
 | 
			
		||||
        handle = [
 | 
			
		||||
@@ -58,7 +58,26 @@
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    services.caddy = {
 | 
			
		||||
    services.caddy =
 | 
			
		||||
      let
 | 
			
		||||
        default_logger_name = "other";
 | 
			
		||||
        roll_size_mb = 25;
 | 
			
		||||
        # Extract list of hostnames (fqdns) from current caddy routes
 | 
			
		||||
        getHostnameFromMatch = match: if (lib.hasAttr "host" match) then match.host else [ ];
 | 
			
		||||
        getHostnameFromRoute =
 | 
			
		||||
          route:
 | 
			
		||||
          if (lib.hasAttr "match" route) then (lib.concatMap getHostnameFromMatch route.match) else [ ];
 | 
			
		||||
        hostnames_non_unique = lib.concatMap getHostnameFromRoute config.caddy.routes;
 | 
			
		||||
        hostnames = lib.unique hostnames_non_unique;
 | 
			
		||||
        # Create attrset of subdomains to their fqdns
 | 
			
		||||
        hostname_map = builtins.listToAttrs (
 | 
			
		||||
          map (hostname: {
 | 
			
		||||
            name = builtins.head (lib.splitString "." hostname);
 | 
			
		||||
            value = hostname;
 | 
			
		||||
          }) hostnames
 | 
			
		||||
        );
 | 
			
		||||
      in
 | 
			
		||||
      {
 | 
			
		||||
        adapter = "''"; # Required to enable JSON
 | 
			
		||||
        configFile = pkgs.writeText "Caddyfile" (
 | 
			
		||||
          builtins.toJSON {
 | 
			
		||||
@@ -69,24 +88,110 @@
 | 
			
		||||
              routes = config.caddy.routes;
 | 
			
		||||
              errors.routes = config.caddy.blocks;
 | 
			
		||||
 | 
			
		||||
            logs = { }; # Uncommenting collects access logs
 | 
			
		||||
              # Uncommenting collects access logs
 | 
			
		||||
              logs = {
 | 
			
		||||
                inherit default_logger_name;
 | 
			
		||||
                # Invert hostnames keys and values
 | 
			
		||||
                logger_names = lib.mapAttrs' (name: value: {
 | 
			
		||||
                  name = value;
 | 
			
		||||
                  value = name;
 | 
			
		||||
                }) hostname_map;
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
            apps.http.servers.metrics = { }; # Enables Prometheus metrics
 | 
			
		||||
            apps.tls.automation.policies = config.caddy.tlsPolicies;
 | 
			
		||||
 | 
			
		||||
          # Setup logging to file
 | 
			
		||||
          logging.logs.main = {
 | 
			
		||||
            encoder = {
 | 
			
		||||
              format = "console";
 | 
			
		||||
            # Setup logging to journal and files
 | 
			
		||||
            logging.logs =
 | 
			
		||||
              {
 | 
			
		||||
                # System logs and catch-all
 | 
			
		||||
                # Must be called `default` to override Caddy's built-in default logger
 | 
			
		||||
                default = {
 | 
			
		||||
                  level = "INFO";
 | 
			
		||||
                  encoder.format = "console";
 | 
			
		||||
                  writer = {
 | 
			
		||||
                    output = "stderr";
 | 
			
		||||
                  };
 | 
			
		||||
                  exclude = (map (hostname: "http.log.access.${hostname}") (builtins.attrNames hostname_map)) ++ [
 | 
			
		||||
                    "http.log.access.${default_logger_name}"
 | 
			
		||||
                  ];
 | 
			
		||||
                };
 | 
			
		||||
                # This is for the default access logs (anything not captured by hostname)
 | 
			
		||||
                other = {
 | 
			
		||||
                  level = "INFO";
 | 
			
		||||
                  encoder.format = "json";
 | 
			
		||||
                  writer = {
 | 
			
		||||
                    output = "file";
 | 
			
		||||
              filename = "${config.services.caddy.logDir}/caddy.log";
 | 
			
		||||
                    filename = "${config.services.caddy.logDir}/other.log";
 | 
			
		||||
                    roll = true;
 | 
			
		||||
              roll_size_mb = 1;
 | 
			
		||||
                    inherit roll_size_mb;
 | 
			
		||||
                  };
 | 
			
		||||
                  include = [ "http.log.access.${default_logger_name}" ];
 | 
			
		||||
                };
 | 
			
		||||
                # This is for using the Caddy API, which will probably never happen
 | 
			
		||||
                admin = {
 | 
			
		||||
                  level = "INFO";
 | 
			
		||||
                  encoder.format = "json";
 | 
			
		||||
                  writer = {
 | 
			
		||||
                    output = "file";
 | 
			
		||||
                    filename = "${config.services.caddy.logDir}/admin.log";
 | 
			
		||||
                    roll = true;
 | 
			
		||||
                    inherit roll_size_mb;
 | 
			
		||||
                  };
 | 
			
		||||
                  include = [ "admin" ];
 | 
			
		||||
                };
 | 
			
		||||
                # This is for TLS cert management tracking
 | 
			
		||||
                tls = {
 | 
			
		||||
                  level = "INFO";
 | 
			
		||||
                  encoder.format = "json";
 | 
			
		||||
                  writer = {
 | 
			
		||||
                    output = "file";
 | 
			
		||||
                    filename = "${config.services.caddy.logDir}/tls.log";
 | 
			
		||||
                    roll = true;
 | 
			
		||||
                    inherit roll_size_mb;
 | 
			
		||||
                  };
 | 
			
		||||
                  include = [ "tls" ];
 | 
			
		||||
                };
 | 
			
		||||
                # This is for debugging
 | 
			
		||||
                debug = {
 | 
			
		||||
                  level = "DEBUG";
 | 
			
		||||
                  encoder.format = "json";
 | 
			
		||||
                  writer = {
 | 
			
		||||
                    output = "file";
 | 
			
		||||
                    filename = "${config.services.caddy.logDir}/debug.log";
 | 
			
		||||
                    roll = true;
 | 
			
		||||
                    roll_keep = 1;
 | 
			
		||||
                    inherit roll_size_mb;
 | 
			
		||||
                  };
 | 
			
		||||
                };
 | 
			
		||||
              }
 | 
			
		||||
              # These are the access logs for individual hostnames
 | 
			
		||||
              // (lib.mapAttrs (name: value: {
 | 
			
		||||
                level = "INFO";
 | 
			
		||||
                encoder.format = "json";
 | 
			
		||||
                writer = {
 | 
			
		||||
                  output = "file";
 | 
			
		||||
                  filename = "${config.services.caddy.logDir}/${name}-access.log";
 | 
			
		||||
                  roll = true;
 | 
			
		||||
                  inherit roll_size_mb;
 | 
			
		||||
                };
 | 
			
		||||
                include = [ "http.log.access.${name}" ];
 | 
			
		||||
              }) hostname_map)
 | 
			
		||||
              # We also capture just the errors separately for easy debugging
 | 
			
		||||
              // (lib.mapAttrs' (name: value: {
 | 
			
		||||
                name = "${name}-error";
 | 
			
		||||
                value = {
 | 
			
		||||
                  level = "ERROR";
 | 
			
		||||
                  encoder.format = "json";
 | 
			
		||||
                  writer = {
 | 
			
		||||
                    output = "file";
 | 
			
		||||
                    filename = "${config.services.caddy.logDir}/${name}-error.log";
 | 
			
		||||
                    roll = true;
 | 
			
		||||
                    inherit roll_size_mb;
 | 
			
		||||
                  };
 | 
			
		||||
                  include = [ "http.log.access.${name}" ];
 | 
			
		||||
                };
 | 
			
		||||
              }) hostname_map);
 | 
			
		||||
          }
 | 
			
		||||
        );
 | 
			
		||||
      };
 | 
			
		||||
 
 | 
			
		||||
@@ -78,6 +78,8 @@ in
 | 
			
		||||
        issuers = [
 | 
			
		||||
          {
 | 
			
		||||
            module = "acme";
 | 
			
		||||
            email = "acme@${config.mail.server}";
 | 
			
		||||
            account_key = "{env.ACME_ACCOUNT_KEY}";
 | 
			
		||||
            challenges = {
 | 
			
		||||
              dns = {
 | 
			
		||||
                provider = {
 | 
			
		||||
@@ -92,7 +94,18 @@ in
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
    # Allow Caddy to read Cloudflare API key for DNS validation
 | 
			
		||||
    systemd.services.caddy.serviceConfig.EnvironmentFile = config.secrets.cloudflare-api.dest;
 | 
			
		||||
    systemd.services.caddy.serviceConfig.EnvironmentFile = [
 | 
			
		||||
      config.secrets.cloudflare-api.dest
 | 
			
		||||
      config.secrets.letsencrypt-key.dest
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    # Private key is used for LetsEncrypt
 | 
			
		||||
    secrets.letsencrypt-key = {
 | 
			
		||||
      source = ../../../private/letsencrypt-key.age;
 | 
			
		||||
      dest = "${config.secretsDirectory}/letsencrypt-key";
 | 
			
		||||
      owner = "caddy";
 | 
			
		||||
      group = "caddy";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # API key must have access to modify Cloudflare DNS records
 | 
			
		||||
    secrets.cloudflare-api = {
 | 
			
		||||
@@ -104,8 +117,14 @@ in
 | 
			
		||||
 | 
			
		||||
    # Wait for secret to exist
 | 
			
		||||
    systemd.services.caddy = {
 | 
			
		||||
      after = [ "cloudflare-api-secret.service" ];
 | 
			
		||||
      requires = [ "cloudflare-api-secret.service" ];
 | 
			
		||||
      after = [
 | 
			
		||||
        "cloudflare-api-secret.service"
 | 
			
		||||
        "letsencrypt-key-secret.service"
 | 
			
		||||
      ];
 | 
			
		||||
      requires = [
 | 
			
		||||
        "cloudflare-api-secret.service"
 | 
			
		||||
        "letsencrypt-key-secret.service"
 | 
			
		||||
      ];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Allows Nextcloud to trust Cloudflare IPs
 | 
			
		||||
@@ -116,6 +135,9 @@ in
 | 
			
		||||
      [ "127.0.0.1" ] ++ cloudflareIpRanges
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    # Using dyn-dns instead of ddclient because I can't find a way to choose
 | 
			
		||||
    # between proxied and non-proxied records for Cloudflare using just
 | 
			
		||||
    # ddclient.
 | 
			
		||||
    services.cloudflare-dyndns =
 | 
			
		||||
      lib.mkIf ((builtins.length config.services.cloudflare-dyndns.domains) > 0)
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  imports = [
 | 
			
		||||
    ./audiobookshelf.nix
 | 
			
		||||
    ./arr.nix
 | 
			
		||||
    ./backups.nix
 | 
			
		||||
    ./bind.nix
 | 
			
		||||
@@ -12,6 +13,7 @@
 | 
			
		||||
    ./calibre.nix
 | 
			
		||||
    ./cloudflare-tunnel.nix
 | 
			
		||||
    ./cloudflare.nix
 | 
			
		||||
    ./filebrowser.nix
 | 
			
		||||
    ./identity.nix
 | 
			
		||||
    ./irc.nix
 | 
			
		||||
    ./gitea-runner.nix
 | 
			
		||||
@@ -26,6 +28,7 @@
 | 
			
		||||
    ./n8n.nix
 | 
			
		||||
    ./netdata.nix
 | 
			
		||||
    ./nextcloud.nix
 | 
			
		||||
    ./ntfy.nix
 | 
			
		||||
    ./paperless.nix
 | 
			
		||||
    ./postgresql.nix
 | 
			
		||||
    ./prometheus.nix
 | 
			
		||||
@@ -33,6 +36,7 @@
 | 
			
		||||
    ./secrets.nix
 | 
			
		||||
    ./sshd.nix
 | 
			
		||||
    ./transmission.nix
 | 
			
		||||
    ./uptime-kuma.nix
 | 
			
		||||
    ./vaultwarden.nix
 | 
			
		||||
    ./victoriametrics.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;
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
        # TODO: Add option to pull services from a list like Caddy does
 | 
			
		||||
        dashboards.settings.providers = [
 | 
			
		||||
          {
 | 
			
		||||
            name = "test";
 | 
			
		||||
@@ -368,6 +369,18 @@ in
 | 
			
		||||
                          range = true;
 | 
			
		||||
                          refId = "C";
 | 
			
		||||
                        }
 | 
			
		||||
                        {
 | 
			
		||||
                          datasource = {
 | 
			
		||||
                            type = "prometheus";
 | 
			
		||||
                            uid = promUid;
 | 
			
		||||
                          };
 | 
			
		||||
                          editorMode = "code";
 | 
			
		||||
                          expr = "readarr_system_status";
 | 
			
		||||
                          hide = false;
 | 
			
		||||
                          legendFormat = "Readarr";
 | 
			
		||||
                          range = true;
 | 
			
		||||
                          refId = "F";
 | 
			
		||||
                        }
 | 
			
		||||
                        {
 | 
			
		||||
                          datasource = {
 | 
			
		||||
                            type = "prometheus";
 | 
			
		||||
@@ -669,7 +682,7 @@ in
 | 
			
		||||
                          };
 | 
			
		||||
                          editorMode = "code";
 | 
			
		||||
                          exemplar = false;
 | 
			
		||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[1d])'';
 | 
			
		||||
                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[1d])'';
 | 
			
		||||
                          hide = false;
 | 
			
		||||
                          instant = false;
 | 
			
		||||
                          interval = "";
 | 
			
		||||
@@ -683,7 +696,7 @@ in
 | 
			
		||||
                            uid = promUid;
 | 
			
		||||
                          };
 | 
			
		||||
                          editorMode = "code";
 | 
			
		||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[7d])'';
 | 
			
		||||
                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[7d])'';
 | 
			
		||||
                          hide = false;
 | 
			
		||||
                          legendFormat = "Past Week";
 | 
			
		||||
                          range = true;
 | 
			
		||||
@@ -695,7 +708,7 @@ in
 | 
			
		||||
                            uid = promUid;
 | 
			
		||||
                          };
 | 
			
		||||
                          editorMode = "code";
 | 
			
		||||
                          "expr" = ''increase(zfs_dataset_used_bytes{name="tank"}[30d])'';
 | 
			
		||||
                          "expr" = ''delta(zfs_dataset_used_bytes{name="tank"}[30d])'';
 | 
			
		||||
                          hide = false;
 | 
			
		||||
                          legendFormat = "Past Month";
 | 
			
		||||
                          range = true;
 | 
			
		||||
@@ -819,6 +832,28 @@ in
 | 
			
		||||
                              }
 | 
			
		||||
                            ];
 | 
			
		||||
                          }
 | 
			
		||||
                          {
 | 
			
		||||
                            matcher = {
 | 
			
		||||
                              id = "byName";
 | 
			
		||||
                              options = "localhost:8787";
 | 
			
		||||
                            };
 | 
			
		||||
                            properties = [
 | 
			
		||||
                              {
 | 
			
		||||
                                id = "displayName";
 | 
			
		||||
                                value = "Readarr";
 | 
			
		||||
                              }
 | 
			
		||||
                              {
 | 
			
		||||
                                id = "links";
 | 
			
		||||
                                value = [
 | 
			
		||||
                                  {
 | 
			
		||||
                                    targetBlank = true;
 | 
			
		||||
                                    title = "";
 | 
			
		||||
                                    url = "https://${config.hostnames.download}/readarr";
 | 
			
		||||
                                  }
 | 
			
		||||
                                ];
 | 
			
		||||
                              }
 | 
			
		||||
                            ];
 | 
			
		||||
                          }
 | 
			
		||||
                          {
 | 
			
		||||
                            matcher = {
 | 
			
		||||
                              id = "byName";
 | 
			
		||||
@@ -1083,6 +1118,50 @@ in
 | 
			
		||||
                              }
 | 
			
		||||
                            ];
 | 
			
		||||
                          }
 | 
			
		||||
                          {
 | 
			
		||||
                            matcher = {
 | 
			
		||||
                              id = "byName";
 | 
			
		||||
                              options = "localhost:${builtins.toString config.services.paperless.port}";
 | 
			
		||||
                            };
 | 
			
		||||
                            properties = [
 | 
			
		||||
                              {
 | 
			
		||||
                                id = "displayName";
 | 
			
		||||
                                value = "Paperless";
 | 
			
		||||
                              }
 | 
			
		||||
                              {
 | 
			
		||||
                                id = "links";
 | 
			
		||||
                                value = [
 | 
			
		||||
                                  {
 | 
			
		||||
                                    targetBlank = true;
 | 
			
		||||
                                    title = "";
 | 
			
		||||
                                    url = "https://${config.hostnames.paperless}";
 | 
			
		||||
                                  }
 | 
			
		||||
                                ];
 | 
			
		||||
                              }
 | 
			
		||||
                            ];
 | 
			
		||||
                          }
 | 
			
		||||
                          {
 | 
			
		||||
                            matcher = {
 | 
			
		||||
                              id = "byName";
 | 
			
		||||
                              options = "localhost:${builtins.toString config.services.audiobookshelf.port}";
 | 
			
		||||
                            };
 | 
			
		||||
                            properties = [
 | 
			
		||||
                              {
 | 
			
		||||
                                id = "displayName";
 | 
			
		||||
                                value = "Audiobookshelf";
 | 
			
		||||
                              }
 | 
			
		||||
                              {
 | 
			
		||||
                                id = "links";
 | 
			
		||||
                                value = [
 | 
			
		||||
                                  {
 | 
			
		||||
                                    targetBlank = true;
 | 
			
		||||
                                    title = "";
 | 
			
		||||
                                    url = "https://${config.hostnames.audiobooks}";
 | 
			
		||||
                                  }
 | 
			
		||||
                                ];
 | 
			
		||||
                              }
 | 
			
		||||
                            ];
 | 
			
		||||
                          }
 | 
			
		||||
                        ];
 | 
			
		||||
                      };
 | 
			
		||||
                      gridPos = {
 | 
			
		||||
 
 | 
			
		||||
@@ -9,12 +9,18 @@
 | 
			
		||||
    unfreePackages = [ "n8n" ];
 | 
			
		||||
 | 
			
		||||
    services.n8n = {
 | 
			
		||||
      webhookUrl = "https://${config.hostnames.n8n}";
 | 
			
		||||
      settings = {
 | 
			
		||||
        listen_address = "127.0.0.1";
 | 
			
		||||
        port = 5678;
 | 
			
		||||
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    systemd.services.n8n.environment = {
 | 
			
		||||
      N8N_EDITOR_BASE_URL = config.services.n8n.webhookUrl;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Configure Cloudflare DNS to point to this machine
 | 
			
		||||
    services.cloudflare-dyndns.domains = [ config.hostnames.n8n ];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
  config = lib.mkIf config.services.nextcloud.enable {
 | 
			
		||||
 | 
			
		||||
    services.nextcloud = {
 | 
			
		||||
      package = pkgs.nextcloud29; # Required to specify
 | 
			
		||||
      package = pkgs.nextcloud30; # Required to specify
 | 
			
		||||
      configureRedis = true;
 | 
			
		||||
      datadir = "/data/nextcloud";
 | 
			
		||||
      database.createLocally = true;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								modules/nixos/services/ntfy.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								modules/nixos/services/ntfy.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
{ config, lib, ... }:
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf config.services.ntfy-sh.enable {
 | 
			
		||||
    services.ntfy-sh = {
 | 
			
		||||
      settings = {
 | 
			
		||||
        base-url = "https://${config.hostnames.notifications}";
 | 
			
		||||
        upstream-base-url = "https://ntfy.sh";
 | 
			
		||||
        listen-http = ":8333";
 | 
			
		||||
        behind-proxy = true;
 | 
			
		||||
        auth-default-access = "deny-all";
 | 
			
		||||
        auth-file = "/var/lib/ntfy-sh/user.db";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    caddy.routes = [
 | 
			
		||||
      {
 | 
			
		||||
        match = [ { host = [ config.hostnames.notifications ]; } ];
 | 
			
		||||
        handle = [
 | 
			
		||||
          {
 | 
			
		||||
            handler = "reverse_proxy";
 | 
			
		||||
            upstreams = [ { dial = "localhost${config.services.ntfy-sh.settings.listen-http}"; } ];
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    # Configure Cloudflare DNS to point to this machine
 | 
			
		||||
    services.cloudflare-dyndns.domains = [ config.hostnames.notifications ];
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
    services.samba = lib.mkIf config.services.samba.enable {
 | 
			
		||||
      openFirewall = true;
 | 
			
		||||
      shares.data = {
 | 
			
		||||
      settings.data = {
 | 
			
		||||
        path = "/data";
 | 
			
		||||
        browseable = "yes";
 | 
			
		||||
        "read only" = "no";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								modules/nixos/services/uptime-kuma.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								modules/nixos/services/uptime-kuma.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
{ config, lib, ... }:
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  config = lib.mkIf config.services.uptime-kuma.enable {
 | 
			
		||||
 | 
			
		||||
    services.uptime-kuma = {
 | 
			
		||||
      settings = {
 | 
			
		||||
        PORT = "3033";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Allow web traffic to Caddy
 | 
			
		||||
    caddy.routes = [
 | 
			
		||||
      {
 | 
			
		||||
        match = [ { host = [ config.hostnames.status ]; } ];
 | 
			
		||||
        handle = [
 | 
			
		||||
          {
 | 
			
		||||
            handler = "reverse_proxy";
 | 
			
		||||
            upstreams = [
 | 
			
		||||
              { dial = "localhost:${config.services.uptime-kuma.settings.PORT}"; }
 | 
			
		||||
            ];
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    # Configure Cloudflare DNS to point to this machine
 | 
			
		||||
    services.cloudflare-dyndns.domains = [ config.hostnames.status ];
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
  config,
 | 
			
		||||
  pkgs,
 | 
			
		||||
  lib,
 | 
			
		||||
  pkgs-stable,
 | 
			
		||||
  ...
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
@@ -88,7 +89,10 @@ in
 | 
			
		||||
    # VMAgent
 | 
			
		||||
 | 
			
		||||
    services.vmagent = {
 | 
			
		||||
      package = pkgs-stable.vmagent;
 | 
			
		||||
      prometheusConfig = prometheusConfig;
 | 
			
		||||
      # https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5567
 | 
			
		||||
      extraArgs = [ "-promscrape.maxScrapeSize 450000000" ];
 | 
			
		||||
      remoteWrite = {
 | 
			
		||||
        url = "https://${config.hostnames.prometheus}/api/v1/write";
 | 
			
		||||
        basicAuthUsername = username;
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
    pname = "gh-collaborators";
 | 
			
		||||
    version = "v2.0.3";
 | 
			
		||||
 | 
			
		||||
    src = prev.fetchFromGitHub {
 | 
			
		||||
      owner = "nmasur";
 | 
			
		||||
      repo = "gh-collaborators";
 | 
			
		||||
      rev = version;
 | 
			
		||||
      sha256 = "sha256-XgAZ/+7QxIRKiAZ4Gp/rLgTABSXkVjFQ8TbXOFj9vpM=";
 | 
			
		||||
    };
 | 
			
		||||
    src = inputs.gh-collaborators;
 | 
			
		||||
 | 
			
		||||
    # vendorHash = "sha256-rsRDOgJBa8T6+bC/APcmuRmg6ykbIp9pwRnJ9rrfHEs=";
 | 
			
		||||
    vendorHash = "sha256-fykxRb2U9DDsXorRTLiVWmhMY89N7RS07sal8ww6gz4=";
 | 
			
		||||
 
 | 
			
		||||
@@ -38,6 +38,7 @@ in
 | 
			
		||||
    base16-nvim = plugin "base16-nvim" inputs.base16-nvim-src;
 | 
			
		||||
    baleia-nvim = plugin "baleia-nvim" inputs.baleia-nvim-src;
 | 
			
		||||
    hmts-nvim = plugin "hmts-nvim" inputs.hmts-nvim-src;
 | 
			
		||||
    markview-nvim = plugin "markview-nvim" inputs.markview-nvim-src;
 | 
			
		||||
    tiny-inline-diagnostic-nvim = plugin "tiny-inline-diagnostic-nvim" inputs.tiny-inline-diagnostic-nvim-src;
 | 
			
		||||
    snipe-nvim = plugin "snipe-nvim" inputs.snipe-nvim-src;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,21 +5,25 @@ inputs: _final: prev: {
 | 
			
		||||
      url = inputs.nextcloud-news.outPath;
 | 
			
		||||
      sha256 = inputs.nextcloud-news.narHash;
 | 
			
		||||
      license = "agpl3Plus";
 | 
			
		||||
      unpack = true;
 | 
			
		||||
    };
 | 
			
		||||
    external = prev.fetchNextcloudApp {
 | 
			
		||||
      url = inputs.nextcloud-external.outPath;
 | 
			
		||||
      sha256 = inputs.nextcloud-external.narHash;
 | 
			
		||||
      license = "agpl3Plus";
 | 
			
		||||
      unpack = true;
 | 
			
		||||
    };
 | 
			
		||||
    cookbook = prev.fetchNextcloudApp {
 | 
			
		||||
      url = inputs.nextcloud-cookbook.outPath;
 | 
			
		||||
      sha256 = inputs.nextcloud-cookbook.narHash;
 | 
			
		||||
      license = "agpl3Plus";
 | 
			
		||||
      unpack = true;
 | 
			
		||||
    };
 | 
			
		||||
    snappymail = prev.fetchNextcloudApp {
 | 
			
		||||
      url = inputs.nextcloud-snappymail.outPath;
 | 
			
		||||
      sha256 = inputs.nextcloud-snappymail.narHash;
 | 
			
		||||
      license = "agpl3Plus";
 | 
			
		||||
      unpack = true;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
inputs: _final: prev: {
 | 
			
		||||
 | 
			
		||||
  stu = prev.rustPlatform.buildRustPackage {
 | 
			
		||||
    pname = "stu";
 | 
			
		||||
    version = "0.5.0";
 | 
			
		||||
    src = inputs.stu;
 | 
			
		||||
    cargoHash = "sha256-gUolS7HXkTddxDWDGir4YC+2tJjgB/CCQC49SSRaR6U=";
 | 
			
		||||
    buildInputs =
 | 
			
		||||
      if prev.stdenv.isDarwin then
 | 
			
		||||
        [
 | 
			
		||||
          prev.darwin.apple_sdk.frameworks.CoreGraphics
 | 
			
		||||
          prev.darwin.apple_sdk.frameworks.AppKit
 | 
			
		||||
        ]
 | 
			
		||||
      else
 | 
			
		||||
        [ ];
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										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