Compare commits

...

9 Commits

Author SHA1 Message Date
Alexander acd16ebc14 Nixos update 15-10-2026 2026-10-15 20:00:27 +02:00
Alexander b9db20d45c Nixos updates 11-10-2026 2026-10-15 19:22:18 +02:00
Alexander d8f2392f80 Point fujin DNS at OPNsense
Old 192.168.1.x Pi-hole/router nameservers returned NXDOMAIN for the
homelab.lan zone; use the OPNsense Unbound resolver (192.168.100.1)
with 1.1.1.1 fallback. Bare http://karate.homelab.lan now resolves and
serves on port 80.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-05 12:45:03 +02:00
Alexander be9f5bccf6 Nixos update 31-08-2026 2026-08-31 14:50:42 +02:00
Alexander 27c8db6b29 Update backlog 2026-08-31 14:18:15 +02:00
Alexander a966a47714 Nixos update 24-08-2026 2026-08-24 12:20:16 +02:00
Alexander c2d2c62364 Nixos update 19-08-2026 2026-08-19 13:55:17 +02:00
Alexander 9eed9f81d4 Add android config 2026-08-17 22:02:42 +02:00
Alexander b471966e8a Fix noctalia, add qoder 2026-08-13 19:40:32 +02:00
24 changed files with 673 additions and 270 deletions
Generated
+160 -173
View File
@@ -20,11 +20,11 @@
]
},
"locked": {
"lastModified": 1785877886,
"narHash": "sha256-H2CrAlJD9FsUbSEIhPVK3IyVjnK0vSxPruBef17GcBs=",
"lastModified": 1791041429,
"narHash": "sha256-Y/Q4JtMo6nHB6XS1LPSfK7Y4AnuNl9jci/5sCps1MRc=",
"owner": "hyprwm",
"repo": "aquamarine",
"rev": "1a10fe26a9f7d989c359e6a9ea61aa2e44d06c36",
"rev": "52ea11f06dd492f34b3cc0b39a9c805beecafcff",
"type": "github"
},
"original": {
@@ -40,17 +40,17 @@
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1779123398,
"narHash": "sha256-8KYQSisso0bn8Z/S3+lunu3sFsMGhf2QXKu+yEWOP7k=",
"owner": "LichHunter",
"repo": "backlog",
"rev": "59507ca9f242950d45d2a6e4d3c10385869344ca",
"type": "github"
"lastModified": 1787939266,
"narHash": "sha256-daj/t7zeuD8XObNPyR1MAw5SziY8t031oenYC5lsyBY=",
"ref": "refs/heads/main",
"rev": "41d18d88aaba1146d09cbe1decd60dcadb8e192e",
"revCount": 33,
"type": "git",
"url": "https://gitea.susano-homelab.duckdns.org/fujin/backlog.git"
},
"original": {
"owner": "LichHunter",
"repo": "backlog",
"type": "github"
"type": "git",
"url": "https://gitea.susano-homelab.duckdns.org/fujin/backlog.git"
}
},
"base16": {
@@ -127,11 +127,11 @@
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1786054218,
"narHash": "sha256-frbTEfqt6fAOcQ4Xk9o1cR5Eq//XhlmqS+3M86ZH1hY=",
"lastModified": 1792020613,
"narHash": "sha256-31skutSMYGBAvGK5vs6wPGXAV4s0ietf1doMynL9FfI=",
"owner": "9001",
"repo": "copyparty",
"rev": "fbcb7733071560bac490ca60b0bb982a00bbe343",
"rev": "8b4593c9a286791eb5dc40862fa24198cea4def7",
"type": "github"
},
"original": {
@@ -147,11 +147,11 @@
]
},
"locked": {
"lastModified": 1781152676,
"narHash": "sha256-RxWs5ND31KzTG7wvMM+PMfUjyNpmIEr999lqNARaM5o=",
"lastModified": 1789770686,
"narHash": "sha256-uZkBR7yHdIKUFB5SZdfgh1qkGfI3XmYmI/lTiquxbck=",
"owner": "nix-community",
"repo": "disko",
"rev": "ff8702b4de27f72b4c78573dfb89ec74e36abdf1",
"rev": "725ea35e410ad83be4931d1bff7e090eacaf3563",
"type": "github"
},
"original": {
@@ -166,11 +166,11 @@
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1786356557,
"narHash": "sha256-d3FqeM5bfyCvMmdygrQ+stj0MKq/T8O1+NdIHMsspzs=",
"lastModified": 1792072733,
"narHash": "sha256-Q+c4fV/OShePs5FdPldh00mywqU0Wl1y8zF8ss07aRM=",
"owner": "nix-community",
"repo": "emacs-overlay",
"rev": "c450874f05714ba7229a4c4e7b9a80da1dafc3c2",
"rev": "08c72b09663805de26057dfed80b7153846336ca",
"type": "github"
},
"original": {
@@ -233,11 +233,11 @@
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1777988971,
"narHash": "sha256-qIoWPDs+0/8JecyYgE3gpKQxW/4bLW/gp45vow9ioCQ=",
"lastModified": 1787559586,
"narHash": "sha256-onL0VLf9vPllmT0H/OlURIU5r5t5WIEl7t4tVNKT0Nw=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "0678d8986be1661af6bb555f3489f2fdfc31f6ff",
"rev": "9d0d87172c374f89da73c1cfe6d81ae62feac1f1",
"type": "github"
},
"original": {
@@ -337,15 +337,14 @@
"git-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1776796298,
"narHash": "sha256-PcRvlWayisPSjd0UcRQbhG8Oqw78AcPE6x872cPRHN8=",
"lastModified": 1787424939,
"narHash": "sha256-O2tBn84NNuHrnqNVxx/XqsXwfYvS1YwBh+7CBnbCYsk=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "3cfd774b0a530725a077e17354fbdb87ea1c4aad",
"rev": "809414f0cdadf82cf11b06c2b29ba9b3168b3297",
"type": "github"
},
"original": {
@@ -354,28 +353,6 @@
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"backlog",
"git-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"gnome-shell": {
"flake": false,
"locked": {
@@ -424,11 +401,11 @@
]
},
"locked": {
"lastModified": 1785531816,
"narHash": "sha256-vkMnV0JIyw+g/NmcfoajlGaAO+9a0ezia+FZohQJrik=",
"lastModified": 1790819692,
"narHash": "sha256-rvubAPbh3QCliic3sAK+CXTrPCGgJstY52OTs/5H1J4=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "bf9ce9fec78f95f374e8dd3b503863a3ec128ebe",
"rev": "c8ecc29e5175452bee4a2aa1ba2383856d795338",
"type": "github"
},
"original": {
@@ -453,11 +430,11 @@
]
},
"locked": {
"lastModified": 1776511930,
"narHash": "sha256-fCpwFiTW0rT7oKJqr3cqHMnkwypSwQKpbtUEtxdkgrM=",
"lastModified": 1786464181,
"narHash": "sha256-2alOMkLjXANh7unkZnYnCF2K2rApZaOLMoQ3o+VX2CY=",
"owner": "hyprwm",
"repo": "hyprcursor",
"rev": "39435900785d0c560c6ae8777d29f28617d031ef",
"rev": "e4ed7c08123df5af460a0a70961380cbfb872f76",
"type": "github"
},
"original": {
@@ -482,11 +459,11 @@
]
},
"locked": {
"lastModified": 1785855875,
"narHash": "sha256-dpW3UKG2NTboxxYGzOX4nZiH8YI++CpgosHmVaquOEI=",
"lastModified": 1791066858,
"narHash": "sha256-hLh6ALHrGpgYm8viWCo1pO+ErC22YDGdAvVPcfYsXA8=",
"owner": "hyprwm",
"repo": "hyprgraphics",
"rev": "8699c38f0e4a1ca3bfc84f84ba020509ced1f133",
"rev": "80c7d00f2236732853e390019ff8d79d17fa3612",
"type": "github"
},
"original": {
@@ -503,6 +480,7 @@
"hyprland-guiutils": "hyprland-guiutils",
"hyprland-protocols": "hyprland-protocols",
"hyprlang": "hyprlang",
"hyprtoolkit": "hyprtoolkit",
"hyprutils": "hyprutils",
"hyprwayland-scanner": "hyprwayland-scanner",
"hyprwire": "hyprwire",
@@ -512,11 +490,11 @@
"xdph": "xdph"
},
"locked": {
"lastModified": 1786298417,
"narHash": "sha256-nJZCCA1YXQqnLQSNVrtY+IxK0pnVLV5qJSw79axtpCo=",
"lastModified": 1792003461,
"narHash": "sha256-sqWBYgjkJd5xTJKd9Jz/SbtrJfY3eTqxyqn1xfH6O00=",
"ref": "refs/heads/main",
"rev": "f7daeb7f79d48745a2894367e9e73229ac162abe",
"revCount": 7721,
"rev": "e2ad066c9ffd45ddfbe4dc76d2de16b382fbe3eb",
"revCount": 7911,
"type": "git",
"url": "https://github.com/hyprwm/Hyprland"
},
@@ -539,7 +517,10 @@
"hyprland",
"hyprlang"
],
"hyprtoolkit": "hyprtoolkit",
"hyprtoolkit": [
"hyprland",
"hyprtoolkit"
],
"hyprutils": [
"hyprland",
"hyprutils"
@@ -558,11 +539,11 @@
]
},
"locked": {
"lastModified": 1784533903,
"narHash": "sha256-Ee78BRFi+MrmgHmmW+2dZUEI1R3cssEzza0ar3fsNX8=",
"lastModified": 1791805511,
"narHash": "sha256-p7R3xnbJf6MqvgWAmR86PkHUba97Fotm8RR16tYDF9I=",
"owner": "hyprwm",
"repo": "hyprland-guiutils",
"rev": "a16ad89ed5fb4192c966018a80c652de8d96f748",
"rev": "204f39d6c7a4aca7042587d4638e19cdeccf63bc",
"type": "github"
},
"original": {
@@ -588,11 +569,11 @@
]
},
"locked": {
"lastModified": 1786227627,
"narHash": "sha256-bc4jNVx0agB40xwxJ0r7hAAk5tk5Lm0uKtwP5rNyvZQ=",
"lastModified": 1791378645,
"narHash": "sha256-9Eix+ZUcI9IUklrtJAD9l/nTcS/Byz7fi94Y3InxS2Y=",
"owner": "hyprwm",
"repo": "hyprland-plugins",
"rev": "faf5ef1bd5916051ed3252463697dd2ae479f629",
"rev": "428bfcd1c9ee34965400bb359349f518140c9920",
"type": "github"
},
"original": {
@@ -613,11 +594,11 @@
]
},
"locked": {
"lastModified": 1772460177,
"narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=",
"lastModified": 1791277361,
"narHash": "sha256-+dv/mMnrw+uBgY+WW3KpoKQ8Nl3bVLS3lknXsbJ03zQ=",
"owner": "hyprwm",
"repo": "hyprland-protocols",
"rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917",
"rev": "4c27ba9ce104782bf718aabf59df3f503afe7caa",
"type": "github"
},
"original": {
@@ -642,11 +623,11 @@
]
},
"locked": {
"lastModified": 1777320127,
"narHash": "sha256-Qu+Wf2Bp5qUjyn2YpZNq8a7JyzTGowhT1knrwE38a9U=",
"lastModified": 1786464129,
"narHash": "sha256-339AkTlpMYSIvFuG0rnR+8Yg4/AZKeJalshJavlnKfg=",
"owner": "hyprwm",
"repo": "hyprlang",
"rev": "090117506ddc3d7f26e650ff344d378c2ec329cc",
"rev": "9508458be316a0d70d37ebed1ab725ccd10411ff",
"type": "github"
},
"original": {
@@ -659,46 +640,39 @@
"inputs": {
"aquamarine": [
"hyprland",
"hyprland-guiutils",
"aquamarine"
],
"hyprgraphics": [
"hyprland",
"hyprland-guiutils",
"hyprgraphics"
],
"hyprlang": [
"hyprland",
"hyprland-guiutils",
"hyprlang"
],
"hyprutils": [
"hyprland",
"hyprland-guiutils",
"hyprutils"
],
"hyprwayland-scanner": [
"hyprland",
"hyprland-guiutils",
"hyprwayland-scanner"
],
"nixpkgs": [
"hyprland",
"hyprland-guiutils",
"nixpkgs"
],
"systems": [
"hyprland",
"hyprland-guiutils",
"systems"
]
},
"locked": {
"lastModified": 1782554491,
"narHash": "sha256-+p3MlyN/nqRefcf2IckPlGRUn9+hielqpS9XClbLleM=",
"lastModified": 1791849226,
"narHash": "sha256-q9Kgz/ZSo6ftVliPGQuRZYWYp3eK4vggO0IR6LcsWl0=",
"owner": "hyprwm",
"repo": "hyprtoolkit",
"rev": "bdba25ced39ea39ab004a8f31593ba0b0ff1ca35",
"rev": "2907e0d1f8a3a540737a0e738acc40d48ad7ba0d",
"type": "github"
},
"original": {
@@ -719,11 +693,11 @@
]
},
"locked": {
"lastModified": 1785843795,
"narHash": "sha256-DFc543bQN94Kt+RsD3Hiu7qCA1uKdqaFJKPMjzANKGU=",
"lastModified": 1789968180,
"narHash": "sha256-YGRfhw+fJW7oKW3IspoceD34jeokN1KXNxKU6APlFH4=",
"owner": "hyprwm",
"repo": "hyprutils",
"rev": "5a7b8cf221914ce4714407950e4ffbdddcd8b66f",
"rev": "95983ee836ff205e615bba67d1f67098e1231941",
"type": "github"
},
"original": {
@@ -744,11 +718,11 @@
]
},
"locked": {
"lastModified": 1777159683,
"narHash": "sha256-Jxixw6wZphUp+nHYxOKUYSckL17QMBx2d5Zp0rJHr1g=",
"lastModified": 1786464033,
"narHash": "sha256-QM8Qe4/L8lpdVN4bgwahmi+jyyc4fisseDMe4afcDxA=",
"owner": "hyprwm",
"repo": "hyprwayland-scanner",
"rev": "b8632713a6beaf28b56f2a7b0ab2fb7088dbb404",
"rev": "62e62c1ca23da17612c6890d4ad2064f575643db",
"type": "github"
},
"original": {
@@ -773,11 +747,11 @@
]
},
"locked": {
"lastModified": 1784465130,
"narHash": "sha256-ak5fWEmWZyax8trkV4aphdvjrbUiSyl6qS+y5GwBS7Y=",
"lastModified": 1786464294,
"narHash": "sha256-ZQsZ2WvBdkboCIyh8LStDPdAIARmxzn0XMNxxoOhjPE=",
"owner": "hyprwm",
"repo": "hyprwire",
"rev": "7d935bb54674aa0fbd327d2a6888bd0630079ed0",
"rev": "4ce7cd6b6128c1ac41caf23c58a30a26b327f9dd",
"type": "github"
},
"original": {
@@ -791,11 +765,11 @@
"nixpkgs": "nixpkgs_6"
},
"locked": {
"lastModified": 1783209925,
"narHash": "sha256-NO94JBjSI4jHPaSxXhaZDv3oT7lKpoCzLxjAbWdSjwc=",
"lastModified": 1791490285,
"narHash": "sha256-JPu+WSXX4TaQnue+UKGMmv2YYCbM5t9Bwwm0fp6lJXc=",
"owner": "Lxtharia",
"repo": "minegrub-theme",
"rev": "d0aec4523e1800c3196227dc420d326891292508",
"rev": "cdd067ebc31ac59e24ae3c99e5b0f05a18eb8a1d",
"type": "github"
},
"original": {
@@ -826,11 +800,11 @@
]
},
"locked": {
"lastModified": 1785141927,
"narHash": "sha256-vaPZJgjFL13DlDZcO25XNuAfsOPQm2i9Jmg42dj4wj4=",
"lastModified": 1791190188,
"narHash": "sha256-d+5+d7r62PZcHc4UFA5HkjxnzBDfVIixsdJX+dwQsyI=",
"owner": "Mic92",
"repo": "nix-ld",
"rev": "1267405dbb13b1b664445ff3654da3a33ee272e4",
"rev": "2ba7201c2db8a49b9bd745d240430282f67bbe39",
"type": "github"
},
"original": {
@@ -880,11 +854,11 @@
"nixpkgs": "nixpkgs_7"
},
"locked": {
"lastModified": 1785232496,
"narHash": "sha256-65EQYIRRpTdpH8lUiB6Mvo5uBkG60aBIzAJuALfx+O0=",
"lastModified": 1791721963,
"narHash": "sha256-BYhx89XJltnRyQeuDKHVL5eSqbbfAcOKuDts7QRsrxQ=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "2e790b0a6be8ec2b76174ac0931b8ff11919ec98",
"rev": "60a624466c08787ee8303393b7d4752d1826f14f",
"type": "github"
},
"original": {
@@ -896,11 +870,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1770073757,
"narHash": "sha256-Vy+G+F+3E/Tl+GMNgiHl9Pah2DgShmIUBJXmbiQPHbI=",
"lastModified": 1782918843,
"narHash": "sha256-ETYnV9U7Sr+A45dohzZdfCZKOss4qrTkO+wgNZNvEc0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "47472570b1e607482890801aeaf29bfb749884f6",
"rev": "e8273b29fe1390ec8d4603f2477357555291432e",
"type": "github"
},
"original": {
@@ -912,11 +886,11 @@
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1777168982,
"narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
"lastModified": 1785031560,
"narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
"rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c",
"type": "github"
},
"original": {
@@ -942,11 +916,11 @@
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1786201459,
"narHash": "sha256-CiOTEjmwAmG2AWnaIno9YaCJJmpca2FXPhMAsnrolCg=",
"lastModified": 1791883866,
"narHash": "sha256-yvkDdToRZ4IgPc9tSBzzCYJvTLf8n5eE3rgUkpCuD5A=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "8b8c811c7c2541c30382c5de7ed26be055569c60",
"rev": "a033e66ab94a6bedf2c3d58d93a36319d3cbbbaf",
"type": "github"
},
"original": {
@@ -958,11 +932,11 @@
},
"nixpkgs_10": {
"locked": {
"lastModified": 1785454630,
"narHash": "sha256-LQy14TZp77TwbQf40gg1V3jo8FwJG0jGDkAH+zRHqg8=",
"lastModified": 1790689126,
"narHash": "sha256-ilerN1WLSvF+HMjziC/Wv99J5y02maDH+6hZPwsORKg=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "1559d3daa3ecc813a650b79375ea61b6741b8746",
"rev": "b4fd65b198c599cbe814fcb9f42d25d021595ec9",
"type": "github"
},
"original": {
@@ -974,11 +948,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1778093112,
"narHash": "sha256-18rT4EfMrtYVMQX7AMAEsnv5KhCryLxGolmJ+v+vZdM=",
"lastModified": 1787921194,
"narHash": "sha256-BgYCc3Gn0MuVOj8XpkisNIiTJ5XXFoQ3Ngs0SkVSiOg=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "cf9db9282552bb3f2743fc9ed3852d239692089a",
"rev": "0525b37d4207b34aafae53206e7aac1fdf80dbac",
"type": "github"
},
"original": {
@@ -1004,11 +978,11 @@
},
"nixpkgs_4": {
"locked": {
"lastModified": 1786106723,
"narHash": "sha256-zDSUbpoeo/9ZmD2+wXnzxoo1+uhL8vxc0b8yuYMKYq0=",
"lastModified": 1791956154,
"narHash": "sha256-jBYGPi4udQ9uo4KQp9m2J0546nJVQitG15gvZSaVVAs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f13ff45afd1bb73e640eaa08a7066dbed07e3238",
"rev": "55bfb4d7437bd4e09ab7cba58a43bd68eb310044",
"type": "github"
},
"original": {
@@ -1020,11 +994,11 @@
},
"nixpkgs_5": {
"locked": {
"lastModified": 1786106723,
"narHash": "sha256-zDSUbpoeo/9ZmD2+wXnzxoo1+uhL8vxc0b8yuYMKYq0=",
"lastModified": 1791734076,
"narHash": "sha256-i5qk1kLiit98rRbh1AXmWBNT9QXC/y4l5Wk/u5EdpDQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f13ff45afd1bb73e640eaa08a7066dbed07e3238",
"rev": "7fd4004d0511991fff3a0524856a9be09e28c5f0",
"type": "github"
},
"original": {
@@ -1052,11 +1026,11 @@
},
"nixpkgs_7": {
"locked": {
"lastModified": 1767892417,
"narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=",
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
"lastModified": 1789546076,
"narHash": "sha256-vWkSk5bbfTqdtMoSgD9FshACO8JCvXTFi+3cqEp0mH0=",
"rev": "b1b875982b17dabde9b4a37f3e229e74913e6db3",
"type": "tarball",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz"
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1074753.b1b875982b17/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
@@ -1081,11 +1055,11 @@
},
"nixpkgs_9": {
"locked": {
"lastModified": 1775036866,
"narHash": "sha256-ZojAnPuCdy657PbTq5V0Y+AHKhZAIwSIT2cb8UgAz/U=",
"lastModified": 1789149629,
"narHash": "sha256-H6GwaZzZf+4npqv0tph94w9tZddSjFjmQrVsW0z78uk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "6201e203d09599479a3b3450ed24fa81537ebc4e",
"rev": "eaad089433ca2bb662274377d33df3d0e51ef28b",
"type": "github"
},
"original": {
@@ -1102,11 +1076,11 @@
]
},
"locked": {
"lastModified": 1786338498,
"narHash": "sha256-qy3Cheg/FQ9ZaBPTIgdq4IkmkNtC6XBpmtC8nT+wU/Y=",
"lastModified": 1792070304,
"narHash": "sha256-gCF1P9r0UzPah0fqBTg2nVuxuuNnRxnYYHklvq8VKZI=",
"owner": "noctalia-dev",
"repo": "noctalia",
"rev": "45e721ba0fb47d6efc00ca47e156237954037c99",
"rev": "a33122c4208a385e19c9a252e65e2751b2c44fbb",
"type": "github"
},
"original": {
@@ -1149,11 +1123,11 @@
]
},
"locked": {
"lastModified": 1784288435,
"narHash": "sha256-ReRHaLgr/uVqdD8afFSn+myXIfpHeOhP0yYe0TJqAA8=",
"lastModified": 1791909798,
"narHash": "sha256-VAhpCOmrun/KXimYfR8NM88bciKCui7CqHHhThSzgag=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "43b3c1ab9d40fb1dbb008f451988a91e375825e9",
"rev": "1ba1dbfe28738c9a71c266be6efa5b89e75491a9",
"type": "github"
},
"original": {
@@ -1178,11 +1152,11 @@
]
},
"locked": {
"lastModified": 1773870109,
"narHash": "sha256-ZoTdqZP03DcdoyxvpFHCAek4bkPUTUPUF3oCCgc3dP4=",
"lastModified": 1788149501,
"narHash": "sha256-XKJP4KvhawV3pyVfraX3sflz05Rp7KP74gRt6QqKjNE=",
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"rev": "b6e74f433b02fa4b8a7965ee24680f4867e2926f",
"rev": "150839ac67b5a34db56a55e8f6b7099a4e7878ab",
"type": "github"
},
"original": {
@@ -1199,11 +1173,11 @@
]
},
"locked": {
"lastModified": 1775439158,
"narHash": "sha256-NHY9SJNU019n+8NCabBDtmuzRFeE2gZlYKHowp9bV24=",
"lastModified": 1788394333,
"narHash": "sha256-xYOP0Xym1eVGUaHFx+eJEaycFGoiCbst3fZf0xFHP78=",
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"rev": "fb6b728260f3f32761367e9fd1e1a25b4245bcd0",
"rev": "6a8a7881d75b6f98967e7b8069f4ead331384301",
"type": "github"
},
"original": {
@@ -1244,11 +1218,11 @@
]
},
"locked": {
"lastModified": 1783174389,
"narHash": "sha256-aCWC8ngycU7OdJrU2+Je3qf+1a2ykuBvpPhZT/9tXMc=",
"lastModified": 1792056300,
"narHash": "sha256-YU1LjDe1o2Ymg5zEiCHbmMXLkDCtxHQRiVqZ3nC5GGk=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "f1406619a3884cd5c47992a70b8b35c9c0fcb4c9",
"rev": "44931708c62937c2b1bf7953902989fa5bb9ee1b",
"type": "github"
},
"original": {
@@ -1265,11 +1239,11 @@
"nix-filter": "nix-filter"
},
"locked": {
"lastModified": 1786046605,
"narHash": "sha256-+ROT5vBruI7d0B2RKbpl2dT76Zf90urrOxfrhzfaVr4=",
"lastModified": 1790431438,
"narHash": "sha256-D0pKfzVlRz8VnLIZVaPtr2d+LHYspICllgIz+oQlw98=",
"owner": "zjeffer",
"repo": "split-monitor-workspaces",
"rev": "3c2020a1f574aaec17ffe39e73468b73643990e3",
"rev": "f26d624c2638d0661f3e0352a634650bfd08296d",
"type": "github"
},
"original": {
@@ -1298,15 +1272,16 @@
"tinted-zed": "tinted-zed"
},
"locked": {
"lastModified": 1786216702,
"narHash": "sha256-fOOmw9tUYeqWVnK2w2NiuMTmGIbluj8xiBFTTFDCcEE=",
"owner": "nix-community",
"lastModified": 1790322631,
"narHash": "sha256-/EDdHSkJwOQUNDdlLXhC1FyMuERiL/fkPAF/LWZy+HY=",
"owner": "Azd325",
"repo": "stylix",
"rev": "b67debfd2db1eb1f0fd8740b950f598bbaf74b8f",
"rev": "a1198612edba320a39c5cc5c4ab30dbee6fd66ea",
"type": "github"
},
"original": {
"owner": "nix-community",
"owner": "Azd325",
"ref": "rofi-settings-font",
"repo": "stylix",
"type": "github"
}
@@ -1366,11 +1341,11 @@
"uv2nix": "uv2nix"
},
"locked": {
"lastModified": 1776248910,
"narHash": "sha256-MrwY8D48uZMTI/D6TEBmG1osklyAlqdtYeH+1cBeRNU=",
"lastModified": 1791196392,
"narHash": "sha256-BQ2f4gEtc2An1t9xac66C+ZIPEopJotoH2OhNcm5eLg=",
"owner": "LichHunter",
"repo": "thefuck",
"rev": "7cac5ac8709dade676264af51afbe7a4d3c84582",
"rev": "7a102bb398407e57aaf64f4e5123f47256b11c04",
"type": "github"
},
"original": {
@@ -1445,11 +1420,11 @@
},
"unstable": {
"locked": {
"lastModified": 1786106723,
"narHash": "sha256-zDSUbpoeo/9ZmD2+wXnzxoo1+uhL8vxc0b8yuYMKYq0=",
"lastModified": 1791956154,
"narHash": "sha256-jBYGPi4udQ9uo4KQp9m2J0546nJVQitG15gvZSaVVAs=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "f13ff45afd1bb73e640eaa08a7066dbed07e3238",
"rev": "55bfb4d7437bd4e09ab7cba58a43bd68eb310044",
"type": "github"
},
"original": {
@@ -1466,11 +1441,11 @@
]
},
"locked": {
"lastModified": 1786356609,
"narHash": "sha256-ou8fYz5w9yhXC8YbvvExybFIa19MyW5G/8dEPqa90hM=",
"lastModified": 1792082440,
"narHash": "sha256-TppYgfBkqAs4IaO3AV+t4zlH9FZIL/AdJFI+PagXwVw=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "c30c7955cec30d664a9baced6bc0112e263d4647",
"rev": "6d9c00bad9a3c763f842c2b08193e5844bdcedfa",
"type": "github"
},
"original": {
@@ -1492,11 +1467,11 @@
]
},
"locked": {
"lastModified": 1775386139,
"narHash": "sha256-n82p7WF+dYxf5r01pXlqbk8CAF7xX0Tk7wAcmMjkuhc=",
"lastModified": 1788001239,
"narHash": "sha256-AELmsXPI546MhbC/ZXC7WRUkCz7d4rqKTHUmliIgPpI=",
"owner": "pyproject-nix",
"repo": "uv2nix",
"rev": "3cffcee173635d553e213d11418690b5290ff1c9",
"rev": "7f9c6b613d2e749e54854b1d60ab6a2192db889e",
"type": "github"
},
"original": {
@@ -1525,6 +1500,14 @@
},
"xdph": {
"inputs": {
"aquamarine": [
"hyprland",
"aquamarine"
],
"hyprgraphics": [
"hyprland",
"hyprgraphics"
],
"hyprland-protocols": [
"hyprland",
"hyprland-protocols"
@@ -1533,6 +1516,10 @@
"hyprland",
"hyprlang"
],
"hyprtoolkit": [
"hyprland",
"hyprtoolkit"
],
"hyprutils": [
"hyprland",
"hyprutils"
@@ -1551,11 +1538,11 @@
]
},
"locked": {
"lastModified": 1786032767,
"narHash": "sha256-C5K27sF/jaQe1BgB1/575r01oTAvw6mrDWPS1qUl6X0=",
"lastModified": 1791822904,
"narHash": "sha256-gsxPblA9YV+By4SxXWkj2HGGk7MKGxiNj/T9bU4q31U=",
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
"rev": "688feb3d88404598f12440a668136e74044391de",
"rev": "0121b2e3f85c7ebf6280173f1054f7e5606262d1",
"type": "github"
},
"original": {
@@ -1570,11 +1557,11 @@
"nixpkgs": "nixpkgs_10"
},
"locked": {
"lastModified": 1786347712,
"narHash": "sha256-yH+jWXH2TVd5h3J5KoZiE8/4O4HqoggfB0zl9uVj39w=",
"lastModified": 1792047775,
"narHash": "sha256-Ks46+ZukSOvdgmextucbLykzpAmygNZ2I+HWxCe03ok=",
"owner": "0xc000022070",
"repo": "zen-browser-flake",
"rev": "945efbc704b7f8c1731a922aabbc5d95edc9eb74",
"rev": "9342d127aa8c585e82f3f57ddb25800fd546029f",
"type": "github"
},
"original": {
+34 -14
View File
@@ -41,7 +41,11 @@
emacs-overlay.url = "github:nix-community/emacs-overlay/master";
stylix = {
url = "github:nix-community/stylix";
# TODO: revert to github:nix-community/stylix once
# https://github.com/nix-community/stylix/pull/2501 is merged;
# stylix master still sets `programs.rofi.font`, which
# home-manager renamed to `programs.rofi.settings.font`.
url = "github:Azd325/stylix/rofi-settings-font";
inputs.nixpkgs.follows = "unstable";
};
@@ -70,7 +74,7 @@
thefuck.url = "github:LichHunter/thefuck";
backlog.url = "github:LichHunter/backlog";
backlog.url = "git+https://gitea.susano-homelab.duckdns.org/fujin/backlog.git";
noctalia = {
url = "github:noctalia-dev/noctalia";
@@ -213,19 +217,35 @@
"fujin";
};
packages.x86_64-linux = {
nixos-lxc = (nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./machines/builder
({ modulesPath, ... }: {
imports = [ (modulesPath + "/virtualisation/proxmox-lxc.nix") ];
})
];
specialArgs = {
inherit inputs;
packages.x86_64-linux =
let
builderSystem = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./machines/builder
({ modulesPath, ... }: {
imports = [ (modulesPath + "/virtualisation/proxmox-lxc.nix") ];
})
];
specialArgs = {
inherit inputs;
};
};
}).config.system.build.image;
in {
# pve-build keys template identity on this output's outPath: the
# store-path hash (covers nixpkgs pin + builder config) becomes the
# template filename on PVE. overrideAttrs only names the derivation
# so the filename reads <hash>-nixos-lxc-builder.tar.xz instead of
# <hash>-tarball.tar.xz.
nixos-lxc = builderSystem.config.system.build.image.overrideAttrs (_: {
name = "nixos-lxc-builder";
});
# Toplevel the builder image boots. pve-build compares it against
# /run/current-system inside a running disposable to detect clones
# of stale templates (pct config drops the ostemplate field after
# creation, so it cannot be used for this).
nixos-lxc-toplevel = builderSystem.config.system.build.toplevel;
izanami-proxmox = nixos-generators.nixosGenerate {
system = "x86_64-linux";
+3 -3
View File
@@ -70,7 +70,7 @@ in
config = mkIf cfg.enable {
programs.noctalia = {
enable = true;
package = inputs.noctalia.packages.${pkgs.system}.default;
package = inputs.noctalia.packages.${pkgs.stdenv.hostPlatform.system}.default;
systemd.enable = true;
customPalettes.stylix = {
@@ -107,7 +107,7 @@ in
widget = {
clock = {
format = "{:%H:%M}";
format = "{:%a %d %b, %H:%M}";
tooltip_format = "{:%A, %B %d, %Y}";
};
@@ -121,7 +121,7 @@ in
ram = {
type = "sysmon";
stat = "memory_usage";
stat = "ram_pct";
};
# Microphone — named volume widget with input device
+2 -2
View File
@@ -8,8 +8,8 @@ in {
options.dov.browser.zen.enable = mkEnableOption "zen config";
config = mkIf cfg.enable {
home.packages = with pkgs; [
inputs.zen-browser.packages."${system}".default
home.packages = [
inputs.zen-browser.packages."${pkgs.stdenv.hostPlatform.system}".default
];
};
}
+1
View File
@@ -215,6 +215,7 @@ in {
stylix = {
enable = true;
autoEnable = true;
overlays.enable = false;
# Base scheme/polarity; overridable per specialisation below.
base16Scheme = mkDefault themeVariants.${baseVariant}.scheme;
polarity = mkDefault themeVariants.${baseVariant}.polarity;
+1 -1
View File
@@ -19,7 +19,7 @@ in {
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
+1 -1
View File
@@ -19,7 +19,7 @@ in {
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
+1 -1
View File
@@ -26,7 +26,7 @@ in {
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
+1 -1
View File
@@ -33,7 +33,7 @@ in
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
+1 -1
View File
@@ -41,7 +41,7 @@ in {
nix = {
settings = {
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
flake-registry = "";
nix-path = config.nix.nixPath;
+10 -3
View File
@@ -66,9 +66,11 @@
};
networking = {
# OPNsense (192.168.100.1) runs Unbound with the homelab.lan overrides;
# the old 192.168.1.x Pi-hole/router are gone and returned NXDOMAIN for
# the local zone. 1.1.1.1 stays as a fallback if the firewall is down.
nameservers = [
"192.168.1.2" # PyHole
"192.168.1.1" # Router
"192.168.100.1" # OPNsense Unbound
"1.1.1.1"
];
dhcpcd.extraConfig = ''
@@ -112,6 +114,12 @@
dov = {
development.emacs.enable = true;
development.qoder = {
enable = false;
version = "1.19.2";
hash = "sha256-/P3UStsRHKKWC1xET9SL23E0CUPxQ5DkmWFco+dH37A="; # nix store prefetch-file --json https://download.qoder.com/release/latest/qoder_amd64.deb | jq -r .hash
};
development.android.enable = true;
virtualisation.docker.enable = true;
virtualisation.incus.enable = true;
@@ -138,7 +146,6 @@
# option exists for fujin's home configuration.
sharedModules = [
inputs.stylix.homeModules.stylix
inputs.noctalia.homeModules.default
];
users."${username}" = { imports = [ ./home.nix ] ++ extraHomeModules; };
@@ -42,6 +42,12 @@
;; change `org-directory'. It must be set before org loads!
(setq org-directory "~/org/")
;; Use bash, not nu, for non-interactive subprocesses (compile, shell-command,
;; lsp-mode installers). Nu doesn't unescape Emacs's POSIX-style backslash
;; escaping, which corrupts args like -Djdt.download.url=...?...=... .
;; vterm keeps using nu (see vterm-shell below).
(setq shell-file-name "/run/current-system/sw/bin/bash")
;; Whenever you reconfigure a package, make sure to wrap your config in an
;; `after!' block, otherwise Doom's defaults may override your settings. E.g.
+2 -1
View File
@@ -152,13 +152,14 @@
wl-clipboard
#cloudflared
kdePackages.okular #pdf tool
kdePackages.gwenview # image viewer
#nextcloud-client
#music
#mpd
#mpv
#mpc-cli
] ++ [ inputs.thefuck.packages.${pkgs.system}.default ];
] ++ [ inputs.thefuck.packages.${pkgs.stdenv.hostPlatform.system}.default ];
# Stylix theming is driven by `dov.dynamic-theme` (hm-modules/theme),
# which sets `enable`, `base16Scheme` and `polarity` + specialisations.
+1 -1
View File
@@ -26,7 +26,7 @@ in {
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
+1 -1
View File
@@ -33,7 +33,7 @@ in {
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
+1 -1
View File
@@ -51,7 +51,7 @@ in {
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
+1 -1
View File
@@ -43,7 +43,7 @@ in
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
+1 -1
View File
@@ -42,7 +42,7 @@ in
nix = {
settings = {
# Enable flakes and new 'nix' command
experimental-features = "nix-command flakes";
experimental-features = [ "nix-command" "flakes" ];
# Opinionated: disable global registry
flake-registry = "";
# Workaround for https://github.com/NixOS/nix/issues/9574
+43
View File
@@ -0,0 +1,43 @@
{
config,
lib,
pkgs,
username,
...
}:
let
cfg = config.dov.development.android;
mtk-udev-rules = pkgs.writeTextFile {
name = "mtk-udev-rules";
destination = "/etc/udev/rules.d/60-mtk.rules";
text = ''
# MediaTek BROM (0003), Preloader VCOM (2000/2001), META (6000)
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", MODE="0666", TAG+="uaccess"
# Oppo/Realme fastboot + adb
SUBSYSTEM=="usb", ATTR{idVendor}=="22d9", MODE="0666", TAG+="uaccess"
# keep ModemManager's hands off the preloader port
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0e8d", ENV{ID_MM_DEVICE_IGNORE}="1"
'';
};
in
{
options.dov.development.android = {
enable = lib.mkEnableOption "Android and MediaTek flashing tools";
};
config = lib.mkIf cfg.enable {
environment.systemPackages = with pkgs; [
android-tools
mtkclient
usbutils
];
users.users.${username}.extraGroups = [ "dialout" ];
services.udev.packages = [ mtk-udev-rules ];
};
}
+2
View File
@@ -4,5 +4,7 @@
imports = [
./nix-vscode-server
./emacs
./qoder
./android
];
}
+3 -3
View File
@@ -18,7 +18,7 @@ in {
## Emacs itself
binutils # native-comp needs 'as', provided by this
# 28.2 + native-comp
((emacsPackagesFor emacs30).emacsWithPackages (epkgs: [
((emacsPackagesFor emacs).emacsWithPackages (epkgs: [
epkgs.vterm
epkgs.treesit-grammars.with-all-grammars
epkgs.mu4e
@@ -39,13 +39,13 @@ in {
## Module dependencies
# :checkers spell
(aspellWithDicts (ds: with ds; [ en en-computers en-science ]))
(aspellWithDicts (ds: with ds; [ en ]))
# :tools editorconfig
editorconfig-core-c # per-project style config
# :tools lookup & :lang org +roam
sqlite
# :lang latex & :lang org (latex previews)
texlive.combined.scheme-medium
texliveMedium
# :lang nix
nixfmt
#nixd
+92
View File
@@ -0,0 +1,92 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.dov.development.qoder;
qoder = pkgs.callPackage ./package.nix {
inherit (cfg)
version
url
hash
extraFlags
;
};
in
{
options.dov.development.qoder = {
enable = mkEnableOption "Qoder IDE (unfree, repackaged from the upstream .deb)";
version = mkOption {
type = types.str;
default = "1.19.2";
description = ''
Label only — upstream publishes a rolling "latest" URL, so this is
just what the store path is called. Bump it together with `hash`.
'';
};
url = mkOption {
type = types.str;
default = "https://download.qoder.com/release/latest/qoder_amd64.deb";
description = "Upstream .deb to repackage.";
};
hash = mkOption {
type = types.str;
default = "";
example = "sha256-0000000000000000000000000000000000000000000=";
description = ''
SRI hash of the .deb. Refresh whenever upstream ships a new build:
nix store prefetch-file --json <url> | jq -r .hash
'';
};
extraFlags = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "--disable-gpu-sandbox" ];
description = "Extra Electron/Chromium flags appended to the wrapper.";
};
keyring = mkOption {
type = types.bool;
default = true;
description = ''
Enable gnome-keyring. Qoder is wrapped with
--password-store=gnome-libsecret; without a running secret service
the sign-in token is lost on every restart.
'';
};
};
config = mkIf cfg.enable (mkMerge [
{
assertions = [
{
assertion = cfg.hash != "";
message = ''
dov.development.qoder.hash is empty. Prefetch the .deb first:
nix store prefetch-file --json ${cfg.url} | jq -r .hash
'';
}
];
environment.systemPackages = [ qoder ];
}
(mkIf cfg.keyring {
services.gnome.gnome-keyring.enable = true;
# gnome-keyring enables gcr-ssh-agent by default, which asserts against
# programs.ssh.startAgent from dov.yubikey. We only want the secret
# service here — SSH keys stay with the OpenSSH agent.
services.gnome.gcr-ssh-agent.enable = false;
})
]);
}
+204
View File
@@ -0,0 +1,204 @@
{
lib,
stdenv,
fetchurl,
autoPatchelfHook,
makeWrapper,
wrapGAppsHook3,
zstd,
alsa-lib,
at-spi2-atk,
at-spi2-core,
atk,
cairo,
cups,
dbus,
expat,
fontconfig,
freetype,
gdk-pixbuf,
glib,
gtk3,
krb5,
libdrm,
libgbm,
libglvnd,
libnotify,
libsecret,
libuuid,
libxkbcommon,
nspr,
nss,
pango,
systemd,
zlib,
libx11,
libxcb,
libxcomposite,
libxcursor,
libxdamage,
libxext,
libxfixes,
libxi,
libxkbfile,
libxrandr,
libxrender,
libxscrnsaver,
libxshmfence,
libxtst,
version,
url,
hash,
passwordStore ? "gnome-libsecret",
extraFlags ? [ ],
}:
let
runtimeLibs = [
alsa-lib
at-spi2-atk
at-spi2-core
atk
cairo
cups
dbus
expat
fontconfig
freetype
gdk-pixbuf
glib
gtk3
krb5
libdrm
libgbm
libglvnd
libnotify
libsecret
libuuid
libxkbcommon
nspr
nss
pango
zlib
(lib.getLib systemd)
libx11
libxcb
libxcomposite
libxcursor
libxdamage
libxext
libxfixes
libxi
libxkbfile
libxrandr
libxrender
libxscrnsaver
libxshmfence
libxtst
];
in
stdenv.mkDerivation (finalAttrs: {
pname = "qoder";
inherit version;
src = fetchurl {
inherit url hash;
name = "qoder-${version}_amd64.deb";
};
nativeBuildInputs = [
autoPatchelfHook
makeWrapper
wrapGAppsHook3
zstd
];
buildInputs = runtimeLibs;
# dlopen'ed at runtime, so autoPatchelf can't see them in the ELF headers
runtimeDependencies = [
(lib.getLib systemd)
libglvnd
libgbm
];
dontConfigure = true;
dontBuild = true;
dontWrapGApps = true; # wrapped by hand in preFixup
# `ar` comes from stdenv. --no-same-permissions keeps the setuid bit on
# chrome-sandbox from blowing up the build inside the nix sandbox.
unpackPhase = ''
runHook preUnpack
ar x $src
tar -xf data.tar.* --no-same-permissions --no-same-owner
runHook postUnpack
'';
installPhase = ''
runHook preInstall
mkdir -p $out/share/qoder $out/bin
if [ -d usr/share/qoder ]; then
cp -r usr/share/qoder/. $out/share/qoder/
elif [ -d opt/Qoder ]; then
cp -r opt/Qoder/. $out/share/qoder/
elif [ -d opt/qoder ]; then
cp -r opt/qoder/. $out/share/qoder/
else
echo "unexpected .deb layout:" >&2
find . -maxdepth 3 -type d >&2
exit 1
fi
for d in applications icons pixmaps; do
if [ -d "usr/share/$d" ]; then
mkdir -p "$out/share/$d"
cp -r "usr/share/$d/." "$out/share/$d/"
fi
done
# Store paths can never be setuid — drop the helper, use --no-sandbox.
rm -f $out/share/qoder/chrome-sandbox
if [ ! -x $out/share/qoder/qoder ]; then
echo "main binary not where expected:" >&2
ls $out/share/qoder >&2
exit 1
fi
for f in $out/share/applications/*.desktop; do
[ -e "$f" ] || continue
substituteInPlace "$f" \
--replace-quiet "/usr/share/qoder/qoder" "$out/bin/qoder" \
--replace-quiet "/opt/Qoder/qoder" "$out/bin/qoder" \
--replace-quiet "/opt/qoder/qoder" "$out/bin/qoder"
done
runHook postInstall
'';
# preFixup, not installPhase: gappsWrapperArgs is only populated by then.
preFixup = ''
makeWrapper $out/share/qoder/qoder $out/bin/qoder \
"''${gappsWrapperArgs[@]}" \
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath runtimeLibs}" \
--set-default NIXOS_OZONE_WL 1 \
--add-flags "--no-sandbox" \
--add-flags "--password-store=${passwordStore}" \
${lib.optionalString (extraFlags != [ ]) ''--add-flags "${lib.escapeShellArgs extraFlags}"''}
'';
meta = {
description = "Qoder — agentic coding IDE, repackaged from the upstream .deb";
homepage = "https://qoder.com";
license = lib.licenses.unfree;
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
platforms = [ "x86_64-linux" ];
mainProgram = "qoder";
};
})
+101 -61
View File
@@ -8,8 +8,8 @@
#
# Stage Step command Effect
# ------ ------------------------- --------------------------------------
# 1 check-image Read-only: is a NixOS LXC ostemplate on PVE?
# deploy-image Idempotent: build+upload if missing, no-op if present.
# 1 check-image Read-only: is the ostemplate matching the current flake on PVE?
# deploy-image Idempotent: build+upload if missing/stale, no-op if current.
# update-image Force: rebuild locally + replace on PVE.
# 2 start-builder deploy-image + clone a fresh CT under a free
# VMID + start it + wait for DHCP.
@@ -90,6 +90,7 @@ PVE_BRIDGE="${PVE_BRIDGE:-vmbr0}" # network bridge
VMID_START="${VMID_START:-9999}" # scan downward from here for a free VMID
VMID_FLOOR="${VMID_FLOOR:-100}" # lowest VMID to consider (PVE minimum)
TEMPLATE_OUTPUT="${TEMPLATE_OUTPUT:-nixos-lxc}" # flake output to build
TEMPLATE_TOPLEVEL_OUTPUT="${TEMPLATE_TOPLEVEL_OUTPUT:-nixos-lxc-toplevel}" # flake output a disposable must be running
CT_HOSTNAME_PREFIX="${CT_HOSTNAME_PREFIX:-nixos-builder}" # disposables' hostname prefix
BUILD_SSH_USER="${BUILD_SSH_USER:-builder}" # user nixos-rebuild SSHes as on the CT
CT_BOOT_TIMEOUT="${CT_BOOT_TIMEOUT:-120}" # seconds to wait for DHCP lease
@@ -244,9 +245,9 @@ Composite commands (chain all stages):
+ destroy-builder. Disposable destroyed on success.
Step commands (run one stage — VMID auto-discovered from PVE if omitted):
check-image Read-only: exit 0 if a NixOS LXC ostemplate is on PVE, 1 if not.
deploy-image Idempotent: build+upload if missing, no-op if present.
update-image Force: rebuild .$TEMPLATE_OUTPUT locally + replace on PVE.
check-image Read-only: exit 0 if the ostemplate matching the current flake is on PVE.
deploy-image Idempotent: build+upload if missing/stale, no-op if current.
update-image Force: rebuild .$TEMPLATE_OUTPUT + upload. Old templates are kept.
start-builder deploy-image + clone a fresh CT + start.
build-on [VMID] Build closure on an existing disposable.
activate <test|switch|boot>
@@ -279,7 +280,8 @@ Options:
Environment:
PVE_HOST, PVE_STORAGE, PVE_ROOTFS_STORAGE, PVE_BRIDGE,
VMID_START, VMID_FLOOR, BUILD_SSH_USER,
CT_BOOT_TIMEOUT, CT_ROOTFS_GIB, TEMPLATE_OUTPUT, CT_HOSTNAME_PREFIX
CT_BOOT_TIMEOUT, CT_ROOTFS_GIB, TEMPLATE_OUTPUT, TEMPLATE_TOPLEVEL_OUTPUT,
CT_HOSTNAME_PREFIX
Examples:
# Full happy path — build + activate susano permanently, auto-destroy CT.
@@ -481,17 +483,33 @@ resolve_vmid() {
## ---------------------------------------------------------------------------
# Stage 1: image management (check / deploy / update).
# All three operate on the NixOS LXC ostemplate stored in PVE's
# /var/lib/vz/template/cache/. The "latest" template is whichever
# nixos-lxc-*.tar.xz sorts last alphabetically (matches the helpers below).
# /var/lib/vz/template/cache/.
#
# Template identity: .$TEMPLATE_OUTPUT's store path is evaluated (no build);
# its basename embeds the full derivation hash — nixpkgs pin AND NixOS
# config — and becomes the uploaded filename. Matching against PVE is exact:
# a template matches the current flake iff its name equals the evaluated
# one. This catches both "missing" and "stale" images. (The previous
# "alphabetically last nixos*lxc*.tar.xz" pick was wrong: unstable version
# strings like 26.05pre-git sort above dated stable ones like 25.05.2026…,
# so a stale image could win over the current one.)
# ---------------------------------------------------------------------------
# Echo the storage-relative path of the newest nixos-lxc template on PVE, or
# empty if none. Read-only.
find_template_on_pve() {
debug "find_template_on_pve: pveam list $PVE_STORAGE"
pve pveam list "$PVE_STORAGE" 2>/dev/null \
| awk '/nixos.*lxc.*\.tar\.xz/ {print $1}' \
| sort | tail -n1 || true
# Evaluate the image derivation's store path WITHOUT building it, and derive
# the canonical template filename from it. Sets TEMPLATE_FILENAME and
# OSTEMPLATE. Because the store-path hash covers the flake lock and the
# whole NixOS config, any edit to machines/builder/ or nixpkgs pin bump
# changes the filename — "same name, older build" becomes impossible.
resolve_template_identity() {
step "Evaluating .$TEMPLATE_OUTPUT image identity (nix eval, no build) ..."
local out_path
out_path=$(cd "$FLAKE_ROOT" && nix eval --raw ".#$TEMPLATE_OUTPUT.outPath") \
|| die "Failed to eval .$TEMPLATE_OUTPUT.outPath — is the flake evaluable?"
TEMPLATE_FILENAME="$(basename "$out_path").tar.xz"
OSTEMPLATE="$PVE_STORAGE:vztmpl/$TEMPLATE_FILENAME"
debug "image outPath: $out_path"
debug "template on PVE: $OSTEMPLATE"
ok "Current flake image: $TEMPLATE_FILENAME"
}
# Build .$TEMPLATE_OUTPUT locally and scp the tarball to PVE's template cache.
@@ -505,80 +523,60 @@ build_and_upload_image() {
|| die "nix build .$TEMPLATE_OUTPUT produced no output path."
log " nix output: $result_dir"
# nixos-generators proxmox-lxc format lays the file under result/tarball/*.tar.xz
# Identity first, so the upload target is the canonical hash-embedded
# filename even when called without a prior check_image (update-image).
resolve_template_identity
# nixos-generators / proxmox-lxc image lays the file under result/tarball/*.tar.xz
local tarball
tarball=$(find "$result_dir/tarball" -maxdepth 1 -type f -name '*.tar.xz' -print -quit | head -n1)
[[ -n "$tarball" ]] \
|| die "No .tar.xz found under $result_dir/tarball/. Did nixos-generators output layout change?"
local tname; tname=$(basename "$tarball")
|| die "No .tar.xz found under $result_dir/tarball/. Did the image output layout change?"
debug "tarball path: $tarball"
debug "tarball name: $tname"
ok "Built image: $tname"
ok "Built image: $(basename "$tarball")"
step "Uploading to $PVE_HOST:/var/lib/vz/template/cache/ ..."
local size_human
size_human=$(du -h "$tarball" | cut -f1)
log " scp $tarball ($size_human) -> $PVE_HOST:/var/lib/vz/template/cache/$tname"
pve_scp "$tarball" "$PVE_HOST:/var/lib/vz/template/cache/$tname"
OSTEMPLATE="$PVE_STORAGE:vztmpl/$tname"
log " scp $tarball ($size_human) -> $PVE_HOST:/var/lib/vz/template/cache/$TEMPLATE_FILENAME"
pve_scp "$tarball" "$PVE_HOST:/var/lib/vz/template/cache/$TEMPLATE_FILENAME"
}
# Remove old nixos-lxc templates from PVE, keeping $1. Must be called after
# the new image is uploaded so a build/upload failure leaves the previous
# template intact.
purge_old_templates_on_pve() {
local keep="${1:-}"
step "Purging old nixos-lxc templates from $PVE_HOST (keeping ${keep:-none}) ..."
local all
all=$(pve pveam list "$PVE_STORAGE" 2>/dev/null \
| awk '/nixos.*lxc.*\.tar\.xz/ {print $1}' || true)
local removed=0
while IFS= read -r t; do
[[ -n "$t" ]] || continue
if [[ -n "$keep" && "$t" == "$keep" ]]; then
debug "keeping: $t"
continue
fi
local filename="${t##*/}"
log " removing: $t"
pve rm -f "/var/lib/vz/template/cache/$filename" 2>/dev/null || true
removed=$((removed + 1))
done <<<"$all"
ok "Purged $removed old template(s)"
}
# Read-only check. Sets OSTEMPLATE and returns 0 if a template exists;
# clears OSTEMPLATE and returns 1 if missing.
# Read-only check. Sets OSTEMPLATE and returns 0 if the template matching
# the CURRENT flake build is on PVE; clears OSTEMPLATE and returns 1 if it
# is missing or stale (a differently-named nixos-lxc template may exist).
check_image() {
step "Checking for nixos-lxc ostemplate on $PVE_HOST (storage: $PVE_STORAGE) ..."
resolve_template_identity
step "Checking for $OSTEMPLATE on $PVE_HOST (storage: $PVE_STORAGE) ..."
local existing
existing=$(find_template_on_pve)
existing=$(pve pveam list "$PVE_STORAGE" 2>/dev/null | awk -v t="$OSTEMPLATE" '$1 == t {print $1}')
if [[ -n "$existing" ]]; then
OSTEMPLATE="$existing"
ok "Image present: $OSTEMPLATE"
ok "Image present (matches current flake build): $OSTEMPLATE"
return 0
fi
OSTEMPLATE=""
warn "No nixos-lxc ostemplate found."
warn "No template matching the current flake build on $PVE_HOST."
return 1
}
# Idempotent deploy: build + upload only if no template exists.
# Idempotent deploy: ensure PVE holds the template matching the CURRENT
# flake build. No-op when it matches; build + upload otherwise. Historical
# templates are deliberately left in place — other tooling (e.g. the
# terraform handler) may pin containers to them.
deploy_image() {
if check_image; then
log "Nothing to do — image already on PVE."
log "Nothing to do — image on PVE matches current flake build."
return
fi
build_and_upload_image
ok "Image deployed: $OSTEMPLATE"
}
# Force update: build + upload first, then purge old. If the build or upload
# fails, the previous template remains on PVE.
# Force update: rebuild + upload even if the current template is present.
# Old templates are never deleted (terraform may pin them); prune manually
# with `pveam remove` if really desired.
update_image() {
build_and_upload_image
purge_old_templates_on_pve "$OSTEMPLATE"
ok "Image updated: $OSTEMPLATE"
}
@@ -640,11 +638,27 @@ create_and_start_ct() {
# Echo the current IPv4 of a running container's eth0, or empty if unavailable.
get_ct_ip() {
local vmid="$1"
pve pct exec "$vmid" -- ip -j -4 addr show eth0 2>/dev/null \
# NixOS containers have no standard /bin|/sbin — lxc-attach needs the
# full path or exec fails with "No such file or directory".
pve pct exec "$vmid" -- /run/current-system/sw/bin/ip -j -4 addr show eth0 2>/dev/null \
| jq -r '.[0].addr_info[]? | select(.scope=="global") | .local' 2>/dev/null \
| head -n1 || true
}
# Echo the NixOS toplevel a running disposable actually booted, or empty.
# pct config drops the ostemplate field after creation, so the container's
# own /run/current-system is the only reliable record of what it runs.
ct_toplevel() {
local vmid="$1"
pve pct exec "$vmid" -- /run/current-system/sw/bin/readlink /run/current-system 2>/dev/null || true
}
# Echo the toplevel the current flake's builder image boots, or empty on
# eval failure (callers treat empty as "cannot tell, skip the check").
expected_toplevel() {
(cd "$FLAKE_ROOT" && nix eval --raw ".#$TEMPLATE_TOPLEVEL_OUTPUT.outPath" 2>/dev/null) || true
}
# Wait for a disposable to become SSH-reachable via its hostname. Echos the
# hostname on success (so the caller can pass it to do_build / probe_ssh).
# We deliberately do NOT use the IP here — the script's contract is that
@@ -832,6 +846,21 @@ cmd_composite() {
step "Container $vmid is stopped — starting ..."
pve pct start "$vmid"
fi
local running_top want_top
running_top=$(ct_toplevel "$vmid")
want_top=$(expected_toplevel)
if [[ -n "$running_top" && -n "$want_top" && "$running_top" != "$want_top" ]]; then
warn "Disposable $vmid runs a stale image:"
warn " running: $running_top"
warn " current: $want_top"
step "Destroying $vmid and recreating from current image ..."
pve pct destroy "$vmid" --purge --force
vmid=$(find_free_vmid)
hostname="$CT_HOSTNAME_PREFIX-$vmid"
log "Created fresh disposable: $hostname"
create_and_start_ct "$vmid"
fi
fi
hostname=$(wait_for_ready "$vmid")
@@ -867,6 +896,7 @@ cmd_composite() {
# ---------------------------------------------------------------------------
cmd_check_image() {
require ssh "drive PVE"
require nix "evaluate the image identity"
require_pve
phase "check-image — read-only probe of ostemplate on PVE"
if check_image; then
@@ -970,6 +1000,16 @@ cmd_build_on() {
die "Start it on PVE first ('pct start $vmid') or pick another VMID."
fi
# Guard: a disposable cloned from a stale template boots without
# sshd/networkd config and hangs the build — refuse instead of hanging.
local running_top want_top
running_top=$(ct_toplevel "$vmid")
want_top=$(expected_toplevel)
if [[ -n "$running_top" && -n "$want_top" && "$running_top" != "$want_top" ]]; then
fail "Disposable $vmid runs a stale image: $running_top"
die "Current flake boots: $want_top — recreate with: $0 destroy-builder $vmid && $0 start-builder"
fi
probe_ssh "$hostname" || { print_debug_info "$vmid" "$hostname"; die "Aborting build-on."; }
do_build "$vmid" "$hostname" && rc=0 || rc=$?