Compare commits

..

51 Commits

Author SHA1 Message Date
phundrak d1c066e592 feat(hosts): add home config for steamdeck 2026-06-17 22:48:08 +02:00
phundrak c2485cc0db feat(naromk3): open ports for email server 2026-06-17 22:47:53 +02:00
phundrak 8e3d2fe850 feat(packages): added chatterino 2026-06-14 01:18:43 +02:00
phundrak 00b44d3041 fix(hyprland): remove unused and deprecated settings 2026-06-14 01:18:43 +02:00
phundrak 05a42f74db chore(deps): update lockfile 2026-06-14 01:17:23 +02:00
phundrak 971ce23e49 feat(streamlink): add streamlink 2026-06-07 19:04:53 +02:00
phundrak 88e31d3ce4 feat(opencode): add opencode configuration 2026-06-07 18:28:59 +02:00
phundrak 773d28e40b chore(nix): update flakes 2026-06-07 16:31:43 +02:00
phundrak 35856afcad feat(inkdrop): remove inkdrop package 2026-06-07 14:12:38 +02:00
phundrak 77b908c4bb feat(eww): remove eww config 2026-06-07 14:09:37 +02:00
phundrak 6d14f79d4a feat(modules): add ncmpcpp configuration 2026-06-03 17:49:40 +02:00
phundrak 89e98df9e5 feat(obs): add image-reaction OBS plugin packaging 2026-06-03 17:49:40 +02:00
phundrak f0a1793889 feat(hyprland): make workspace 9 vertical 2026-06-03 17:49:40 +02:00
phundrak 98f6c0ea21 feat(hyprland): add main monitor resolution for streaming 2026-06-03 17:49:40 +02:00
phundrak 84219edfc9 feat(caelestia): remove annoying toasts 2026-06-03 17:49:40 +02:00
phundrak 626d2682ae feat(mousewrap): better mousewrap config 2026-06-03 17:49:40 +02:00
phundrak 1337c9d44f feat(sounds): make noisetorch optional 2026-06-03 17:49:40 +02:00
phundrak dc6229aaac refactor(flatpak): simplify flatpak module 2026-06-03 17:49:40 +02:00
phundrak 8282295824 refactor: enable modules to add groups to users themselves 2026-06-03 17:49:40 +02:00
phundrak 91dc8e5070 feat(jujutsu): enable jujutsu shell autocompletion 2026-05-24 10:48:41 +02:00
phundrak 206b170d3e refactor(kitty): refactor kitty config with prefix for keybinds 2026-05-24 10:48:41 +02:00
phundrak a5836d3637 fix(caelestia): fix incorrect settings name for marpa’s caelestia 2026-05-24 10:11:37 +02:00
phundrak af888d5838 fix: enable my Wacom tablet to work properly 2026-05-24 10:10:56 +02:00
phundrak 84d7137aa5 feat(hosts): add PineTab2 config 2026-05-24 10:10:52 +02:00
phundrak 673b32c33b feat(wlr-which-key): use caelestia launcher when available 2026-05-13 00:10:38 +02:00
phundrak d27f63a0f7 feat(caelestia): increase timeout from 5m to 1h 2026-05-06 23:50:55 +02:00
phundrak 90f6102481 feat(packages): add KiCad to phundrak packages 2026-05-06 23:50:19 +02:00
phundrak e44acd9b06 refactor(firefox): move phundrak firefox config to separate file
For better readability
2026-05-06 23:49:40 +02:00
phundrak 177ce475a9 refactor(tmux): declare keybinds with Nix syntax 2026-05-06 23:49:23 +02:00
phundrak 1411f6c47e feat(jj-cz): use develop branch for jj-cz 2026-05-06 23:49:23 +02:00
phundrak d1bee6c14d fix(waydroid): use package that won’t error out 2026-05-03 15:37:16 +02:00
phundrak 5514d347c7 feat(nix): add marpa as binary cache for Nix 2026-05-01 16:27:56 +02:00
phundrak 06519d555b feat(packages): add QGIS 2026-05-01 15:24:44 +02:00
phundrak ce94f09dd4 feat(i18n): proper multilingual input
Use fcitx5 to switch between different inputs. Installed mozc-ut for
Japanese input with the bepo layout, as well as fcitx5-chinese to load
table-defined layouts for the IPA/X-SAMPA input method.

Currently, mozc_server and fcitx5 need to be launched by the
compositor (only Hyprland for now), auto-launching from module options
needs to be implemented in the future.
2026-05-01 15:24:44 +02:00
phundrak 171d635b72 fix(gampo): refer to proper home config 2026-04-28 10:47:38 +02:00
phundrak 3bc4e3dd15 feat(vcs): jj config for Creug 2026-04-12 18:07:33 +02:00
phundrak 4b7a64c8ac fix(copyparty): disable copyparty for elcafe for now 2026-04-12 15:18:38 +02:00
phundrak 9024d2c744 fix(kernel): remove reference to deprecated hardened kernel 2026-04-12 15:09:52 +02:00
phundrak d13d81c60a feat(devshell): add jj and git to dev environment 2026-04-12 15:02:17 +02:00
phundrak 88cf103332 chore(lockfile): update lockfile 2026-04-12 15:00:14 +02:00
phundrak 9431a71539 feat(ai): add opencode to AI packages 2026-04-12 15:00:14 +02:00
phundrak 6fa865644a feat(wl-kbptr): package wl-kbptr for NixOS as home module 2026-04-12 14:58:02 +02:00
phundrak 154d0e4ddb chore(flake): update flake lock, remove devenv input 2026-04-12 14:58:02 +02:00
phundrak cae0357dbe feat(claude-code): add sox for voice mode 2026-04-12 14:58:02 +02:00
phundrak 477a0b7372 feat(firefox): dedicated module and tridactyl config 2026-04-12 14:57:58 +02:00
phundrak 5b12250fd5 feat(handy): upgrade to handy 0.8.0 2026-03-28 22:32:47 +01:00
phundrak b8c88cae25 chore(flakes): update flakes 2026-03-28 22:32:47 +01:00
phundrak 63bd1471d8 feat(system): add additional substituters 2026-03-26 11:24:49 +01:00
phundrak 647432314d feat(jujutsu): add jj-cz options to jujutsu module 2026-03-26 11:24:49 +01:00
phundrak bfaaee0f36 feat(zellij): add zellij configuration 2026-03-26 11:24:49 +01:00
phundrak ab089afefd feat(spotify): re-enable Spicetify 2026-03-14 14:21:52 +01:00
83 changed files with 4279 additions and 1167 deletions
+1 -5
View File
@@ -1,11 +1,7 @@
# -*- mode: sh; -*-
if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs="
fi
watch_file flake.nix
watch_file flake.lock
if ! use flake . --no-pure-eval
then
echo "devenv could not be built. The devenv environment was not loaded. Make the necessary changes to devenv.nix and hit enter to try again." >&2
echo "dev shell could not be built. The environment was not loaded. Make the necessary changes to flake.nix and hit enter to try again." >&2
fi
+2
View File
@@ -9,6 +9,7 @@ keys:
- &tilo-host age1awytvphvty4f9wmdn86xnjg9kgetqjx8qlwj5d2882t4fyyzy58s3vg5k4
- &NaroMk3 age1erkn7dd022e90ktyj66aux9j9xvl0uzd6ru5cmrjsvcm5rtr5pfs7q6k9h
- &NaroMk3-host age16crkeglm3j3f6rveylytuerptjf9mwtv3hl89ywkmnnvdkntfchsuvrsk5
- &steamdeck age1ztuc996dapd7gpw5g7t4k3e9egv3dj6czxyslhnwula97w3cuytqlgzru0
creation_rules:
- path_regex: secrets/secrets.yaml$
key_groups:
@@ -23,3 +24,4 @@ creation_rules:
- *NaroMk3-host
- *elcafe
- *elcafe-host
- *steamdeck
Generated
+232 -226
View File
@@ -1,35 +1,26 @@
{
"nodes": {
"cachix": {
"alejandra": {
"inputs": {
"devenv": [
"devenv"
],
"flake-compat": [
"devenv",
"flake-compat"
],
"git-hooks": [
"devenv",
"git-hooks"
],
"fenix": "fenix",
"flakeCompat": "flakeCompat",
"nixpkgs": [
"devenv",
"jj-cz",
"nixpkgs"
]
},
"locked": {
"lastModified": 1767714506,
"narHash": "sha256-WaTs0t1CxhgxbIuvQ97OFhDTVUGd1HA+KzLZUZBhe0s=",
"owner": "cachix",
"repo": "cachix",
"rev": "894c649f0daaa38bbcfb21de64be47dfa7cd0ec9",
"lastModified": 1744324181,
"narHash": "sha256-Oi1n2ncF4/AWeY6X55o2FddIRICokbciqFYK64XorYk=",
"owner": "kamadorueda",
"repo": "alejandra",
"rev": "3e2a85506627062313e131bf8a85315f3387c8e0",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "latest",
"repo": "cachix",
"owner": "kamadorueda",
"ref": "4.0.0",
"repo": "alejandra",
"type": "github"
}
},
@@ -44,11 +35,11 @@
]
},
"locked": {
"lastModified": 1771987897,
"narHash": "sha256-5pNQFGxG3fxS9pGnNBJjT76veotKIKq2XpAVFGAhCdI=",
"lastModified": 1780375472,
"narHash": "sha256-Q8RAJoYlakA6B2I5DVcuxzNbhCNU1nnIjqQZYP1KGrM=",
"owner": "caelestia-dots",
"repo": "cli",
"rev": "b0d68f0a1c48fa138d6fde94dcbecea801a86a01",
"rev": "d1c8c8fc09738d1b40576e97c274b4a11a2e0ac7",
"type": "github"
},
"original": {
@@ -60,17 +51,18 @@
"caelestia-shell": {
"inputs": {
"caelestia-cli": "caelestia-cli",
"m3shapes": "m3shapes",
"nixpkgs": [
"nixpkgs"
],
"quickshell": "quickshell"
},
"locked": {
"lastModified": 1772330657,
"narHash": "sha256-cWblprYsDUeAWA57xAqxIjNxXvDI/rqYn6TFp2OPi/k=",
"lastModified": 1781178648,
"narHash": "sha256-z6V1T7MHShM7TfFIMCDp94Bi1Wk9LJfK96vm8YFGY5M=",
"owner": "caelestia-dots",
"repo": "shell",
"rev": "278fd4a4ed1bfb42c3fe197ff38b587539c012aa",
"rev": "a16c957a8bd13e0cfd09928ca0a22fecd3681e44",
"type": "github"
},
"original": {
@@ -87,11 +79,11 @@
]
},
"locked": {
"lastModified": 1772839279,
"narHash": "sha256-pAI7T/9Gl6SUTKmNZhtxYjBGnYPNzBLMgfqILfYa1Us=",
"lastModified": 1781307432,
"narHash": "sha256-96fOVwSAFEoZNZtJM10E4Fz1kr59CwzYfUFidypPkKY=",
"owner": "9001",
"repo": "copyparty",
"rev": "31b23843f2d51049da00c821f2418d0c44389cd7",
"rev": "a00bc93fe1b6f71afffa43fab4efb88dceddea62",
"type": "github"
},
"original": {
@@ -100,81 +92,26 @@
"type": "github"
}
},
"devenv": {
"fenix": {
"inputs": {
"cachix": "cachix",
"flake-compat": "flake-compat",
"flake-parts": "flake-parts",
"git-hooks": "git-hooks",
"nix": "nix",
"nixd": "nixd",
"nixpkgs": [
"jj-cz",
"alejandra",
"nixpkgs"
]
],
"rust-analyzer-src": "rust-analyzer-src"
},
"locked": {
"lastModified": 1772819008,
"narHash": "sha256-1DpF5F7zgOZ7QrRjz23315pUoF532dHnsU/V4UQithk=",
"owner": "cachix",
"repo": "devenv",
"rev": "9e5c17caf0ead1bb29d430d4c0a26a77bc5d374b",
"lastModified": 1730615655,
"narHash": "sha256-2HBR3zLn57LXKNRtxBb+O+uDqHM4n0pz51rPayMl4cg=",
"owner": "nix-community",
"repo": "fenix",
"rev": "efeb50e2535b17ffd4a135e6e3e5fd60a525180c",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1767039857,
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
"devenv",
"nixpkgs"
]
},
"locked": {
"lastModified": 1772408722,
"narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-root": {
"locked": {
"lastModified": 1723604017,
"narHash": "sha256-rBtQ8gg+Dn4Sx/s+pvjdq3CB2wQNzx9XGFq/JVGCB6k=",
"owner": "srid",
"repo": "flake-root",
"rev": "b759a56851e10cb13f6b8e5698af7b59c44be26e",
"type": "github"
},
"original": {
"owner": "srid",
"repo": "flake-root",
"owner": "nix-community",
"repo": "fenix",
"type": "github"
}
},
@@ -211,51 +148,55 @@
"type": "github"
}
},
"git-hooks": {
"flake-utils_3": {
"inputs": {
"flake-compat": [
"devenv",
"flake-compat"
],
"gitignore": "gitignore",
"nixpkgs": [
"devenv",
"nixpkgs"
]
"systems": "systems_2"
},
"locked": {
"lastModified": 1772665116,
"narHash": "sha256-XmjUDG/J8Z8lY5DVNVUf5aoZGc400FxcjsNCqHKiKtc=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "39f53203a8458c330f61cc0759fe243f0ac0d198",
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"gitignore": {
"flake-utils_4": {
"inputs": {
"nixpkgs": [
"devenv",
"git-hooks",
"nixpkgs"
]
"systems": "systems_3"
},
"locked": {
"lastModified": 1709087332,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flakeCompat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
@@ -266,11 +207,11 @@
]
},
"locked": {
"lastModified": 1772807318,
"narHash": "sha256-Qjw6ILt8cb2HQQpCmWNLMZZ63wEo1KjTQt+1BcQBr7k=",
"lastModified": 1781305496,
"narHash": "sha256-g8Vv4Qfc7n+lgov97REu3X6BeJtvYY0hlSUZR1GrGQQ=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "daa2c221320809f5514edde74d0ad0193ad54ed8",
"rev": "c87a39aa979acc4848016d2220c6238390d84779",
"type": "github"
},
"original": {
@@ -279,43 +220,44 @@
"type": "github"
}
},
"nix": {
"jj-cz": {
"inputs": {
"flake-compat": [
"devenv",
"flake-compat"
],
"flake-parts": [
"devenv",
"flake-parts"
],
"git-hooks-nix": [
"devenv",
"git-hooks"
],
"alejandra": "alejandra",
"flake-utils": "flake-utils_3",
"nixpkgs": [
"devenv",
"nixpkgs"
],
"nixpkgs-23-11": [
"devenv"
],
"nixpkgs-regression": [
"devenv"
]
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1772748357,
"narHash": "sha256-vtf03lfgQKNkPH9FdXdboBDS5DtFkXB8xRw5EBpuDas=",
"owner": "cachix",
"repo": "nix",
"rev": "41eee9d3b1f611b1b90d51caa858b6d83834c44a",
"lastModified": 1781450428,
"narHash": "sha256-EWQpPImWpq0RHgyqa/lBoiMsjRjNdJCYa9fU2q+7nOg=",
"ref": "develop",
"rev": "4ad6e944b22a1d9990d43ac02650fc4d90fb1b4c",
"revCount": 49,
"type": "git",
"url": "https://labs.phundrak.com/phundrak/jj-cz"
},
"original": {
"ref": "develop",
"type": "git",
"url": "https://labs.phundrak.com/phundrak/jj-cz"
}
},
"m3shapes": {
"flake": false,
"locked": {
"lastModified": 1781017666,
"narHash": "sha256-kfHyzZaPHgqZML48OA+5JwBOsLdQJ2ci/aGPShvUB4Y=",
"owner": "soramanew",
"repo": "m3shapes",
"rev": "bdc327b29f95394a732baf3c9b19658ba23755b6",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "devenv-2.32",
"repo": "nix",
"owner": "soramanew",
"repo": "m3shapes",
"rev": "bdc327b29f95394a732baf3c9b19658ba23755b6",
"type": "github"
}
},
@@ -326,11 +268,11 @@
]
},
"locked": {
"lastModified": 1772341813,
"narHash": "sha256-/PQ0ubBCMj/MVCWEI/XMStn55a8dIKsvztj4ZVLvUrQ=",
"lastModified": 1780816331,
"narHash": "sha256-0BYqs8yKWkOz2Q7+SP18N5E5gmDKSo6LSxIVIa0wWes=",
"owner": "nix-community",
"repo": "nix-index-database",
"rev": "a2051ff239ce2e8a0148fa7a152903d9a78e854f",
"rev": "1a2ea89c917781e88508d9fd2b507f2d2a0e173c",
"type": "github"
},
"original": {
@@ -339,40 +281,13 @@
"type": "github"
}
},
"nixd": {
"inputs": {
"flake-parts": [
"devenv",
"flake-parts"
],
"flake-root": "flake-root",
"nixpkgs": [
"devenv",
"nixpkgs"
],
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1772441848,
"narHash": "sha256-H3W5PSJQTh8Yp51PGU3GUoGCcrD+y7nCsxYHQr+Orvw=",
"owner": "nix-community",
"repo": "nixd",
"rev": "c896f916addae5b133ee0f4f01f9cd93906f62ea",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixd",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1772624091,
"narHash": "sha256-QKyJ0QGWBn6r0invrMAK8dmJoBYWoOWy7lN+UHzW1jc=",
"lastModified": 1781074563,
"narHash": "sha256-md8WlXOlfnIeHeOScMTTHFyf2d6iaTwPl2apR5EQ3P4=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "80bdc1e5ce51f56b19791b52b2901187931f5353",
"rev": "9ae611a455b90cf061d8f332b977e387bda8e1ca",
"type": "github"
},
"original": {
@@ -382,13 +297,28 @@
"type": "github"
}
},
"nixpkgsStable": {
"locked": {
"lastModified": 1780952837,
"narHash": "sha256-Fwd1+spDtQ0hDyBwme6ufG3n4mY0UrjjFdYHv+G/Hds=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e820eb4a444b46a19b2e03e8dfd2359439ff30fe",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-25.11",
"type": "indirect"
}
},
"pumo-system-info": {
"inputs": {
"flake-utils": "flake-utils_2",
"flake-utils": "flake-utils_4",
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay"
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1748984111,
@@ -412,11 +342,11 @@
]
},
"locked": {
"lastModified": 1771926182,
"narHash": "sha256-QbXuSLhiSxOq6ydBL3+KGe1aiYWBW+e3J6qjJZaRMq0=",
"lastModified": 1780303737,
"narHash": "sha256-7HgdJBG4BgAPDyHKKxWtxj7nziqsQo6zQCXtwy+L9fs=",
"ref": "refs/heads/master",
"rev": "cddb4f061bab495f4473ca5f2c571b6c710efef7",
"revCount": 744,
"rev": "b66495fcc5022681b56b61f928c7acbe910e722c",
"revCount": 821,
"type": "git",
"url": "https://git.outfoxxed.me/outfoxxed/quickshell"
},
@@ -425,22 +355,90 @@
"url": "https://git.outfoxxed.me/outfoxxed/quickshell"
}
},
"rockchip": {
"inputs": {
"nixpkgsStable": [
"nixpkgsStable"
],
"nixpkgsUnstable": [
"nixpkgs"
],
"utils": [
"flake-utils"
]
},
"locked": {
"lastModified": 1778273074,
"narHash": "sha256-gPbn0KjsgS2cJa/ENSMtjN0h8dIEy+2N6g8tw9915pM=",
"owner": "raboof",
"repo": "nixos-rockchip",
"rev": "2aab433a41cc9ba862ae73012acdd2eec3547667",
"type": "github"
},
"original": {
"owner": "raboof",
"ref": "pinetab-linux-7.0",
"repo": "nixos-rockchip",
"type": "github"
}
},
"root": {
"inputs": {
"caelestia-shell": "caelestia-shell",
"copyparty": "copyparty",
"devenv": "devenv",
"flake-utils": "flake-utils_2",
"home-manager": "home-manager",
"jj-cz": "jj-cz",
"nix-index-database": "nix-index-database",
"nixpkgs": "nixpkgs",
"nixpkgsStable": "nixpkgsStable",
"pumo-system-info": "pumo-system-info",
"rockchip": "rockchip",
"sops-nix": "sops-nix",
"spicetify": "spicetify",
"srvos": "srvos",
"zen-browser": "zen-browser"
}
},
"rust-analyzer-src": {
"flake": false,
"locked": {
"lastModified": 1730555913,
"narHash": "sha256-KNHZUlqsEibg3YtfUyOFQSofP8hp1HKoY+laoesBxRM=",
"owner": "rust-lang",
"repo": "rust-analyzer",
"rev": "f17a5bbfd0969ba2e63a74505a80e55ecb174ed9",
"type": "github"
},
"original": {
"owner": "rust-lang",
"ref": "nightly",
"repo": "rust-analyzer",
"type": "github"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"jj-cz",
"nixpkgs"
]
},
"locked": {
"lastModified": 1779992051,
"narHash": "sha256-4YWGv/0NkAdtTW1MXfaLYpfC9BhpCy9k1pWkR0xI9uw=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "e93ad0df1073b2c969a8f0c1f10b84e870469d40",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"rust-overlay_2": {
"inputs": {
"nixpkgs": [
"pumo-system-info",
@@ -468,11 +466,11 @@
]
},
"locked": {
"lastModified": 1772495394,
"narHash": "sha256-hmIvE/slLKEFKNEJz27IZ8BKlAaZDcjIHmkZ7GCEjfw=",
"lastModified": 1780547341,
"narHash": "sha256-Gq8KNx5A7hBB3uGJaj6eQfLDIz5YdLu92gqBcvHvoUo=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "1d9b98a29a45abe9c4d3174bd36de9f28755e3ff",
"rev": "9ed65852b6257fbeae4355bc24ecfea307ca759a",
"type": "github"
},
"original": {
@@ -486,14 +484,14 @@
"nixpkgs": [
"nixpkgs"
],
"systems": "systems_2"
"systems": "systems_4"
},
"locked": {
"lastModified": 1772494187,
"narHash": "sha256-6ksgNAFXVK+Cg/6ww7bB2nJUPZlnS75UwZC7G+L03EE=",
"lastModified": 1781101834,
"narHash": "sha256-gNVY6SYglFe37FpD+NnOjTipsqvVMM2vh/uc22KDEsA=",
"owner": "Gerg-L",
"repo": "spicetify-nix",
"rev": "915ab06b046d05613041780c575c62a32fe67cea",
"rev": "0243dd6707c969fc8440216c811b3f2e4a4cceb7",
"type": "github"
},
"original": {
@@ -509,11 +507,11 @@
]
},
"locked": {
"lastModified": 1772799438,
"narHash": "sha256-81/Ow6L5azplWp9p8gtl/Q1m5s2gCX4iuKNF5ujwxBA=",
"lastModified": 1781149687,
"narHash": "sha256-TanScAdzeSOcaVDN4V4rnTAlbuizMJlrVSSt9QkkPEA=",
"owner": "nix-community",
"repo": "srvos",
"rev": "e6ec80588a07aea2cdb67c2865759e02d85b94b2",
"rev": "7a66d11f03dd0588229af7a2b7018a435638dbf5",
"type": "github"
},
"original": {
@@ -552,25 +550,33 @@
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"devenv",
"nixd",
"nixpkgs"
]
},
"systems_3": {
"locked": {
"lastModified": 1734704479,
"narHash": "sha256-MMi74+WckoyEWBRcg/oaGRvXC9BVVxDZNRMpL+72wBI=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "65712f5af67234dad91a5a4baee986a8b62dbf8f",
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_4": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
@@ -581,11 +587,11 @@
]
},
"locked": {
"lastModified": 1772685307,
"narHash": "sha256-5xthZHeqwBeXNhnRIlxnCuaZLky0SZ6vQsxtd+eqhTU=",
"lastModified": 1781242638,
"narHash": "sha256-n0s/QM5ZJl3/v4tgDLsATIHR2dC+4+Aa2BT6FnthGy4=",
"owner": "youwen5",
"repo": "zen-browser-flake",
"rev": "dc92d88524ee83308795bc90f6a9f1d965265aaa",
"rev": "79f7cca35f9e4e38d1f8767bac130159f60866cc",
"type": "github"
},
"original": {
+61 -37
View File
@@ -2,12 +2,9 @@
description = "Home Manager configuration of phundrak";
inputs = {
nixpkgsStable.url = "nixpkgs/nixos-25.11";
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
devenv = {
url = "github:cachix/devenv";
inputs.nixpkgs.follows = "nixpkgs";
};
flake-utils.url = "github:numtide/flake-utils";
home-manager = {
url = "github:nix-community/home-manager";
@@ -29,11 +26,23 @@
inputs.nixpkgs.follows = "nixpkgs";
};
jj-cz = {
url = "git+https://labs.phundrak.com/phundrak/jj-cz?ref=develop";
inputs.nixpkgs.follows = "nixpkgs";
};
pumo-system-info = {
url = "git+https://labs.phundrak.com/phundrak/pumo-system-info";
inputs.nixpkgs.follows = "nixpkgs";
};
rockchip = {
url = "github:raboof/nixos-rockchip/pinetab-linux-7.0";
inputs.utils.follows = "flake-utils";
inputs.nixpkgsStable.follows = "nixpkgsStable";
inputs.nixpkgsUnstable.follows = "nixpkgs";
};
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
@@ -56,49 +65,49 @@
};
nixConfig = {
extra-trusted-public-keys = "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=";
extra-substituters = "https://devenv.cachix.org";
extra-trusted-public-keys = [
"marpa-local:XoO+dFN4PeauF52pYuy3Vh4Sdtl2qIdxu5aUasWKv6Q="
"phundrak.cachix.org-1:osJAkYO0ioTOPqaQCIXMfIRz1/+YYlVFkup3R2KSexk="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
];
extra-substituters = [
"http://marpa:5000?priority=5"
"https://phundrak.cachix.org?priority=10"
"https://nix-community.cachix.org?priority=20"
"https://cache.nixos.org?priority=40"
];
extra-experimental-features = [
"nix-command"
"flakes"
];
http-connections = 128;
};
outputs = {
self,
nixpkgs,
flake-utils,
home-manager,
devenv,
rockchip,
srvos,
...
} @ inputs: let
} @ inputs:
flake-utils.lib.eachDefaultSystem (
system: let
inherit (self) outputs;
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
formatter.${system} = pkgs.alejandra;
packages.${system} = {
devenv-up = self.devShells.${system}.default.config.procfileScript;
devenv-test = self.devShells.${system}.default.config.test;
};
devShells.${system}.default = devenv.lib.mkShell {
inherit inputs pkgs;
modules = [
(
{pkgs, ...}: {
packages = [pkgs.nh];
git-hooks.hooks = {
alejandra.enable = true;
commitizen.enable = true;
detect-private-keys.enable = true;
end-of-file-fixer.enable = true;
deadnix.enable = true;
ripsecrets.enable = true;
statix.enable = true;
};
}
)
formatter = pkgs.alejandra;
devShells.default = pkgs.mkShell {
buildInputs = [
pkgs.nh
pkgs.jujutsu
pkgs.git
];
};
packages = {
homeConfigurations = let
extraSpecialArgs = {inherit inputs outputs system;};
pkgs = nixpkgs.legacyPackages.x86_64-linux;
@@ -123,7 +132,7 @@
};
"phundrak@gampo" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/marpa.nix;
modules = withUserModules ./users/phundrak/host/gampo.nix;
};
"phundrak@marpa" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs;
@@ -133,6 +142,14 @@
inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/naromk3.nix;
};
"phundrak@pinetab2" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/pinetab2.nix;
};
"deck@steamdeck" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/steamdeck.nix;
};
"phundrak@tilo" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/tilo.nix;
@@ -146,6 +163,10 @@
inputs.copyparty.nixosModules.default
];
withSystemModules = modules: nixpkgs.lib.lists.flatten (defaultSystemModules ++ [modules]);
pinetabConfig = import ./utils/pinetab.nix {
inherit nixpkgs rockchip specialArgs;
additionalModules = defaultSystemModules;
};
in {
alys = nixpkgs.lib.nixosSystem {
inherit specialArgs;
@@ -161,7 +182,7 @@
};
marpa = nixpkgs.lib.nixosSystem {
inherit specialArgs;
modules = withSystemModules ./hosts/marpa/configuration.nix;
modules = withSystemModules ./hosts/marpa;
};
NaroMk3 = nixpkgs.lib.nixosSystem {
inherit specialArgs;
@@ -169,9 +190,10 @@
srvos.nixosModules.server
srvos.nixosModules.hardware-hetzner-cloud
srvos.nixosModules.mixins-terminfo
./hosts/naromk3/configuration.nix
./hosts/naromk3
];
};
pinetab2 = pinetabConfig "x86_64-linux" ./hosts/pinetab2/gnome.nix;
tilo = nixpkgs.lib.nixosSystem {
inherit specialArgs;
modules = withSystemModules ./hosts/tilo/configuration.nix;
@@ -179,3 +201,5 @@
};
};
}
);
}
+14 -14
View File
@@ -12,14 +12,14 @@
sops.secrets = {
"elcafe/traefik/env".restartUnits = ["traefik.service"];
"elcafe/traefik/dynamic".restartUnits = ["traefik.service"];
"elcafe/copyparty/passwords/creug" = {
restartUnits = ["copyparty.service"];
owner = "creug";
};
"elcafe/copyparty/passwords/phundrak" = {
restartUnits = ["copyparty.service"];
owner = "phundrak";
};
# "elcafe/copyparty/passwords/creug" = {
# restartUnits = ["copyparty.service"];
# owner = "creug";
# };
# "elcafe/copyparty/passwords/phundrak" = {
# restartUnits = ["copyparty.service"];
# owner = "phundrak";
# };
};
mySystem = {
@@ -73,12 +73,12 @@
};
};
services.copyparty = import ./copyparty.nix {
passwordFiles = {
creug = config.sops.secrets."elcafe/copyparty/passwords/creug".path;
phundrak = config.sops.secrets."elcafe/copyparty/passwords/phundrak".path;
};
};
# services.copyparty = import ./copyparty.nix {
# passwordFiles = {
# creug = config.sops.secrets."elcafe/copyparty/passwords/creug".path;
# phundrak = config.sops.secrets."elcafe/copyparty/passwords/phundrak".path;
# };
# };
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
+1
View File
@@ -41,6 +41,7 @@
};
sound.enable = true;
};
i18n.input.enable = true;
misc.keymap = "fr-bepo";
networking = {
hostname = "gampo";
@@ -82,10 +82,12 @@
};
sound = {
enable = true;
noisetorch = true;
jack = true;
scarlett.enable = true;
};
};
i18n.input.enable = true;
misc.keymap = "fr-bepo";
networking = {
hostname = "marpa";
@@ -106,6 +108,10 @@
programs.steam.enable = true;
services = {
fwupd.enable = true;
harmonia = {
enable = true;
signKeyPaths = [config.sops.secrets."marpa/nix-cache-priv-key".path];
};
languagetool.enable = true;
printing.enable = true;
ssh.enable = true;
@@ -123,11 +129,14 @@
};
};
sops.secrets.extraHosts = {
sops.secrets = {
"marpa/nix-cache-priv-key" = {};
extraHosts = {
inherit (config.users.users.root) group;
owner = config.users.users.phundrak.name;
mode = "0440";
};
};
services.udev.extraHwdb = ''
mouse:usb:047d:80a6:*
@@ -24,8 +24,11 @@
firewall = {
openPorts = [
22 # Gitea SSH
25 # SMTP
80 # HTTP
443 # HTTPS
465 # SMTPS
993 # IMAPS
];
};
};
+74
View File
@@ -0,0 +1,74 @@
{
config,
inputs,
...
}: {
imports = [
inputs.sops-nix.nixosModules.sops
../../system/desktop
../../system/dev
../../system/hardware
../../system/i18n
../../system/misc.nix
../../system/network
../../system/packages
../../system/security
../../system/services
../../system/users
];
system.stateVersion = "25.11";
# documentation.nixos.enable = false;
# nix.settings.trusted-users = ["root" "@wheel"];
mySystem = {
desktop = {
hyprland.enable = true;
niri.enable = true;
waydroid.enable = true;
xserver = {
enable = true;
de = "gnome";
};
};
dev.docker = {
enable = true;
podman.enable = true;
autoprune.enable = true;
};
hardware = {
bluetooth.enable = true;
input.opentablet.enable = true;
sound.enable = true;
};
i18n.input.enable = true;
misc.keymap = "fr-bepo";
networking = {
hostname = "pinetab2";
id = "99a11b15";
wifi.disablePowersave = true;
};
packages = {
appimage.enable = true;
flatpak.enable = true;
nix = {
gc.automatic = true;
nix-ld.enable = true;
};
};
services.ssh.enable = true;
users = {
root.disablePassword = true;
phundrak = {
enable = true;
trusted = true;
};
};
};
sops.secrets.extraHosts = {
inherit (config.users.users.root) group;
owner = config.users.users.phundrak.name;
mode = "0440";
};
}
+37
View File
@@ -0,0 +1,37 @@
{
pkgs,
config,
...
}: {
# https://github.com/systemd/systemd/pull/35304#issuecomment-3855146191
# gnome autorotate expects 'normal' is the _display panel_ normal, but
# mutter autoconfiguration rotates by 90deg.
# compensating with gdctl for now, though it would be better to 'properly'
# fix this.
services.udev = {
extraHwdb = ''
sensor:modalias:*sc7a20:*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, 0, 1; 0, 1, 0
'';
extraRules = ''
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1018", ATTRS{idProduct}=="1006", ENV{SYSTEMD_WANTS}+="landscape.service", TAG+="systemd"
'';
};
systemd.services.landscape = {
script = ''
${pkgs.mutter}/bin/gdctl set --logical-monitor --primary --monitor=DSI-1 --transform normal
'';
serviceConfig.User = "phundrak";
serviceConfig.Type = "oneshot";
environment = {
"DBUS_SESSION_BUS_ADDRESS" = "unix:path=/run/user/${toString config.users.users."phundrak".uid}/bus";
};
};
environment.systemPackages = with pkgs; [
gnomeExtensions.arc-menu
gnomeExtensions.dash-to-dock
gnomeExtensions.dash-to-panel
gnomeExtensions.gjs-osk
gnomeExtensions.one-window-wonderland
];
}
+2 -2
View File
@@ -6,10 +6,10 @@
}: let
name = "Handy";
pname = lib.strings.toLower name;
version = "0.7.7";
version = "0.8.0";
src = fetchurl {
url = "https://github.com/cjpais/${name}/releases/download/v${version}/${name}_${version}_amd64.AppImage";
hash = "sha256-76Hno39I3+46blnVW6XWwg944vF5n7IdMYXGMlYMNb0=";
hash = "sha256-PLcssfd6iMx51mglAJ7D4+67HFazwfhJMImgU9WiNDk=";
};
appimageContent = appimageTools.extractType2 {inherit pname version src;};
in
-149
View File
@@ -1,149 +0,0 @@
# https://www.inkdrop.app/
{
lib,
fetchurl,
stdenv,
autoPatchelfHook,
makeWrapper,
wrapGAppsHook3,
alsa-lib,
at-spi2-atk,
at-spi2-core,
cairo,
cups,
dbus,
expat,
gdk-pixbuf,
glib,
gtk3,
libdrm,
libnotify,
libpulseaudio,
libsecret,
libuuid,
libxkbcommon,
mesa,
nspr,
nss,
pango,
systemd,
libx11,
libxscrnsaver,
libxcomposite,
libxcursor,
libxdamage,
libxext,
libxfixes,
libxi,
libxrandr,
libxrender,
libxtst,
libxcb,
libxkbfile,
libxshmfence,
}:
stdenv.mkDerivation rec {
pname = "inkdrop";
version = "5.11.8";
src = fetchurl {
url = "https://dist.inkdrop.app/v${version}/${pname}_${version}_amd64.deb";
hash = "sha256-8aJSeUi5K9PgNJvfYAtnRnI2t+vM10jiqVAZmX+zni0=";
};
nativeBuildInputs = [
autoPatchelfHook
makeWrapper
wrapGAppsHook3
];
buildInputs = [
alsa-lib
at-spi2-atk
at-spi2-core
cairo
cups
dbus
expat
gdk-pixbuf
glib
gtk3
libdrm
libnotify
libpulseaudio
libsecret
libuuid
libxkbcommon
mesa
nspr
nss
pango
systemd
libx11
libxscrnsaver
libxcomposite
libxcursor
libxdamage
libxext
libxfixes
libxi
libxrandr
libxrender
libxtst
libxcb
libxkbfile
libxshmfence
];
dontBuild = true;
dontConfigure = true;
# Ignore musl dependency since we're using glibc
autoPatchelfIgnoreMissingDeps = ["libc.musl-x86_64.so.1"];
unpackPhase = ''
runHook preUnpack
# Extract deb file manually to avoid setuid issues
ar x $src
tar xf data.tar.xz --no-same-permissions --no-same-owner
runHook postUnpack
'';
installPhase = ''
runHook preInstall
# Create output directories
mkdir -p $out/bin $out/share
# Copy the main application
cp -r usr/lib/inkdrop $out/share/inkdrop
# Copy desktop file and icon
cp -r usr/share/applications $out/share/
cp -r usr/share/pixmaps $out/share/
# Fix desktop file to use absolute paths
substituteInPlace $out/share/applications/inkdrop.desktop \
--replace-quiet "Exec=inkdrop" "Exec=$out/bin/inkdrop" \
--replace-quiet "Icon=inkdrop" "Icon=$out/share/pixmaps/inkdrop.png"
# Create wrapper script in bin
makeWrapper $out/share/inkdrop/inkdrop $out/bin/inkdrop \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}" \
--set-default ELECTRON_IS_DEV 0 \
--inherit-argv0
runHook postInstall
'';
meta = with lib; {
description = "Notebook app for Markdown lovers";
homepage = "https://www.inkdrop.app/";
license = licenses.unfree;
maintainers = [];
platforms = ["x86_64-linux"];
mainProgram = "inkdrop";
};
}
+29
View File
@@ -0,0 +1,29 @@
{
lib,
stdenv,
obs-studio,
fetchFromGitHub,
cmake,
...
}:
stdenv.mkDerivation (finalAttrs: rec {
pname = "obs-image-reaction";
version = "0.1.0";
# https://github.com/scaledteam/obs-image-reaction
src = fetchFromGitHub {
owner = "scaledteam";
repo = pname;
rev = "4cd345e78c714e80e894cfb51c72b94135a6014d";
hash = "sha256-mC1B8tveHx35pfbAcOlosB8YKaBVg87MjXbr79sf7+k=";
};
nativeBuildInputs = [cmake];
buildInputs = [obs-studio];
postInstall = "rm -rf $out/obs-plugins $out/data";
meta = {
description = "OBS Plugin with image that reacts to sound source";
homepage = "https://github.com/scaledteam/obs-image-reaction";
license = lib.licenses.gpl2;
platforms = lib.platforms.linux;
};
})
+95 -82
View File
@@ -1,111 +1,124 @@
elcafe:
copyparty:
passwords:
creug: ENC[AES256_GCM,data:bWiDsIB9xbCC8N3VNzoXQ/ciyh5LyX5gaH5HrCR1n18=,iv:UOUUs/dXMQ4gF5x1UZuSs/DZh14OErWq1EJjv1B5+No=,tag:gMrL7RlaIegw+gXE4Du0KQ==,type:str]
phundrak: ENC[AES256_GCM,data:0kdrtlw2KeF4ZGqhejdnf1j59Lm5Gchh+wka2lOf8jU=,iv:4XG7M6oqRL0ZQiWMBe4oQ+mHjONkvuIXGa6m2Zqfd/A=,tag:A54LlE+7W2wXYn3HfCfBDw==,type:str]
creug: ENC[AES256_GCM,data:7qzpipXxKVEGRnXkkD/HRSH82gqA0qviwWw1TwFqsoc=,iv:OvMwxY/zyljUNn8UiwxCQ904z43RakuImxh4RP2G0G4=,tag:gKGDkVuecktMg31HjdYMIQ==,type:str]
phundrak: ENC[AES256_GCM,data:vN/MCJi6SH8jZ89C1DTQvDJ+GkscXRo/Puhm0LwbZ0M=,iv:2IBTdy+hMCeDH4P3E2fz82ZQB0jM/t5GPDbPYhsEHSs=,tag:zUBLCkbdkwG4IJSMV+9DMg==,type:str]
traefik:
env: ENC[AES256_GCM,data:HUdWGYoEPp2v8dnDuVsl7YmPxuBfHmXzGrvKWeiqPlmAwMqVZrZ1j8on/7QKvYDJoTJ40XY2qNynSA==,iv:Vgc/fZERnNp7hSMeRd9EgB3IenKAFTAhwC0bk8CX4DE=,tag:SdfhOST/o29Lt1zRdXXRyQ==,type:str]
dynamic: ENC[AES256_GCM,data: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,iv:3G3geSZRziwGiKcUMVNZ7j5s/4YA6Uk7wCSb4aFNSMo=,tag:FxARskR9+wdV7/xCKP8UdA==,type:str]
extraHosts: ENC[AES256_GCM,data:4lp7w0snYle7vGVLJq3zlTxoC8eVpaSreW3P8Aq+O6oRJoWo3IASpwi7zSx6nxmLo5LGPeupVXfy3xOkG9d5QFNU2uU6vXKvOnnm6wrpS+UcYp/4U/z+R3rFnFsI5PsCgmlL1bSUFCFkXlrLDIyoW50Q/DLXDS8QaUYAtto1DcRUXc9j8RnunYF38HFlAOD/Xa4DY048pvZu8TMsmLQjM5txZnZBq4+P8aBjY3SF+K9cqZ+SgQkU+gdGo0/S/N5OUZJ3ATJ6mglPl/Nplw/Dh9HvC7jEMJZKrVzWiYquTOn0/IytqOCS2SkhsmVMRqf06hpvhlz6sFXzkDfxKMIRTULEkjZDkZ7QioSbLeqmQePSg7xs28SvToiVKSpg0PxeH5LvJE73hgX3ATUXA2BmRvqQuqBwLaDU6TPm8xkYe7qbabaN5oFtXCI/XydZTao5Glqw/BZQRTise/qGgn3Bfl/ieMYQOqCMEdHzR0Beipur6spliGFC4YnwL3Nh4CO6qOB/j61a7rqY6nLyo54jWtjvHX42pTuGWhvhGH1z4NRZqcKks+KCMB4PcCXgul1hrb04wLXYVu7R/7QqOACp4SZBUFZCj+izcsnB1sKdKliL87VBUkwOSF+1JUCY,iv:5A3jCWLkooCkuOMiybbeQ9+TRA7CoiW3qbzmJLVarSc=,tag:qLsGhrFHs65Vesj4Ot4I/g==,type:str]
env: ENC[AES256_GCM,data:VUS9oF/HLcxQ2QPLnQA14z0kokTuJVGNBfrS2KHWlBaJbqd/nxxWwHYIga7bK1dop1hznPyKVIZ/7A==,iv:0BKkKL6q5KANiu7PSxp0uGeRTXbnPN6HMYxMGnyijok=,tag:iBQupkVQTOqgp5z+tN726A==,type:str]
dynamic: ENC[AES256_GCM,data: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,iv:8JtxoykF20VZ0exOq3fSQ9JiK97yhSTbvEtFkCXU6RI=,tag:dAkgklzWAI2NvOre4BTo7A==,type:str]
marpa:
nix-cache-priv-key: ENC[AES256_GCM,data:aOHqvU2O9dN+NZ4qPF8RdFVK2OyrMUDsy95AXCcvyQcTgT+79e3Gv2zuWAXwW1O7E4BDzlzbBYYFd3F9uCo7f4gd5I4gKu1cI1Nr8BUvyQdSy8uSa2FeasmNEdAFg1HE7ZJtYHk=,iv:aLizbDMFACYiBXthlKsFDvYIpf0Eb2x1rlWBP5xT4zE=,tag:OL/x9nS67Z0y2LoZ3B7szw==,type:str]
opencode:
cors: ENC[AES256_GCM,data:DTKTN48/uE8GcdbqnCtCLmtQUX0Y3NW0cTLtIAU=,iv:A5wahOtJweVvWTp2C3QzIr0spKPXBMygUwDMPSHmriA=,tag:ao7XkG9N8nC6yFwT6pNs7Q==,type:str]
extraHosts: ENC[AES256_GCM,data:bAHBFj3RbrDrTyIaq8RZ7peqxZS23gRu5lhiu3DXlfY8seSaN7BXU1+XKXPPRJRGoYRCpH0MaskAlz1r3vc3mItzUPmOU4Vqqo/7CCMLb4ezIRhqpA/Q7MGnIj9m5V9pQZjgk+BTiMHdb/qOeG6VGv42dhYKUvxGcFIGoM5pjCaCGkM840Xb1XR9rMOY7wqtaE0kPpM355nTSAJqAM9NZ+CpNASpodRvXPPEhmbC0UrL93OCl/w8Ltvm2bDiB00jOKG2QukrWYdkGhigVweejiHz3+GHoDgY4fuRX/C78RW40PehnyqOd3S0dw6IwcnYK/Bx1dlk1UXydl4kYWgdAN0XO7YwoAM9fB4ESwjLop/xJXp4lFOxeiHi3TO9d0R0DqFEWuUpLmu7EKltQ44Xngz+EmJTBK0UhWfUqr/wRb4cVuchCxjvG9NFFwOTKzy8JJYI0oOgmJ9CqgCfmOp/KTV/I98HhHqykRCTTp4fYtXTQTxMrK5RAlovAnzEAaV8EWgwNDoDU62ChOT/o47xoj2bG481huyOT8dQWoKCWllPrYKu1bzH6/8klrDT9i3xVgRVWTlsnMYxrNhmP9dg5QrHn/4wfne+BfuUONoUjWkNHre11DdkQxIiMK+4,iv:bnTicEoQsjPbfyISHts+J8s/DC++khcuAainlvIViI8=,tag:8b/WGsIaGGQDqaoTRw9a8g==,type:str]
mopidy:
spotify: ENC[AES256_GCM,data:6i9BzQmlndnROuT1H2zgN/3I6hBiFf14BlcS+XL2PbTiiEQZe2yE3tnZo3KXU9S5CjS3MwxsVdytKOFMQt2s1bVjcibBhJzoKEQByaapdzn1mK3kQLdJfhPf4Hf9YZV9Dlc60ngS7ESLZakdFVlj4rlbV5XReLhK,iv:fYd78r4U0kTyq1TZjBVXkjdNiOQ29gLJ53kwTXsi8W0=,tag:oWaeOuzdHWS4joZAdeA2pg==,type:str]
bandcamp: ENC[AES256_GCM,data:3uWlk1W6pgExsUkLpqpFXpMceYEdMfWMxNUq8iGEyq8/P3OAjzg7pvvPBGcVwmh4jSgNilRiqmmGrtYLwdqPUMlmbFB56K6ZLDIcC2yg2SRfulYcObvimOkIkx7ITr1u6jSzjMkTR5ekIlzlPBxFQzEfBbgdrQ==,iv:IY1VH/8vjNCPz8LGbYbyr5U3FcmhV+YhK3fHnLfWiak=,tag:lB78PRuEuFen54csc7jHIQ==,type:str]
emailPassword: ENC[AES256_GCM,data:RUuXzEfkqu1hEg12vBko17MtvdcFIxPofB+nFOuuMdWqjqJgEg==,iv:725/ttk8jHmSIj16gqvLykOu8D8rUbzzvOyxyZx8Jds=,tag:jv1ZO14WsKyWFsfqzRzZPg==,type:str]
spotify: ENC[AES256_GCM,data:YdqncyUBw1UaXbVYBMZHWEP4iFoRtUSBnKosYirvyq2tjx/d16L6hLzWiGILir6hSE9x0Kmwq+qm91m4AuwJUZgg2Qfp+8A3hfCaCWk4NKP8mKRsV5yUrO5ruP9GOEJBOaoZV61AO/dQDIFdgAnKsMWrwofy/J52,iv:wdFUL3RKw2gMKJ25BKBdEs+p8kluigpaNbY7e0ZPono=,tag:fbOF4haBjxm8zcQD0GKB8g==,type:str]
bandcamp: ENC[AES256_GCM,data:RZWVvqUM/oR81OI7VNhX9cq6r22UrZvx1mkcOQqcLWFh3+a9YpSaeNljoJszmIyGnApt2MR1L/vyX9apcWY4NEIPAsWfaSMUecXIA/LdVDN7fnvCjxBZqO9SjpKb9eW1MEImL/vkpaEd84BXVelcX2sgzSbJYA==,iv:a+0Owxtz5GWrnt9geuPOPZ9ab/J5lFHp/0nyiYYekNs=,tag:pdvBhNNvSnPR4nMHy1C8Fw==,type:str]
emailPassword: ENC[AES256_GCM,data:jUEhu/wBhp25K0w14i/+p2H9F2fcVz/TtUZ8gl85oKAXeJR7/Q==,iv:h0N/smryCKp1ZgXlxQZplQ3wXYBXxL2rTgqJUMdWsZY=,tag:7dwQ0U5wefw9dTTIrYJ5NQ==,type:str]
ssh:
hosts: ENC[AES256_GCM,data:WTgCxNIyKTwFxDVlWkJcxrvUjYuVionDQSWgSqSc0SZ5mGbl228mv7Z6mXvwbN78+jIwTuuUtfmTsDoaUaSqyIReaXFsrIHAoCGoSMbJ10RiAbyDfCEH9vbHamAX22Ccfnyh7eUOb3AsAQo/pJs/95bdCpKEPy4SXcpB0tc+KpgrEijVLpRJFyB6UGl+2qg/hVfo8no5l4tZMUBxzS5KEU7pEEcA/SLfdVMM/4+aeVmJudxJPi3RsqnA8qORVpvJC0y/ln71OrFdRVrX4e47NEXzX2Hfr+hiFbW190xBp6a/kZypQl4vk4fzn8RUathQMOVmf1r4v7eJOYRWeGeZinZtQNe7SFWtiYc0pTbQ6GNyOMwzk3bMjlyzhlrTe1MqFqVbAHSsKk6ydpcjtXt4DgQ93IL4BU6emJu7HBFBOuQ9QWEvDubhB/0Y68BWUqGqY/2lPdllGJrXL87h5KJrLHSMyUX4mF9Je84aC0cv1N3d78kepo2wCz7jrfsxixT+qN7ufu/TurLloC6y2skOCmB+gcRo79Jzk4LRi+Zf+RWnWiXw5HsZWwO7so5JIDlgApkERif6vwup12jhdu+ZxcqFfjMt1wEFceS8YGNvUl0XWPgvmM9kdqn/4XXOYCnysbpcfZaBMGDOBUlbhLUybHdDzvGYV/kMU5m8xoXAjA==,iv:Gf2f71TluSEQtiHf7CIHE2tFX8N4Y17AjP1PnNuWuNA=,tag:sGmZR1lKbbOeEhPvrHHO8Q==,type:str]
hosts: ENC[AES256_GCM,data:dwJ0cC+y2o+fK0eNBbpo/TAEqWgRSWPida7CHTTziVgxvRPVLprdjb2cfntgb9JCCNo7dA9onRzkOqVDnWOz9mvCGa6W8QYJSbAcc9mpXCv0+5FKllLXE/c/i86VgW1qlCNQCtMzFtnTWWurOIG/dR546jzYoy0BYUA8ZUYKHWLRuUM7K00WtNgYyZ1O5QK+SbekkGFeBj4oSuzHB5Ik/dzuETULggZ5kTb4YTx9lePXUWf9zgeCi3+m2Za2bTngj9cxNDtepgJUPGFKvwaWq3nh+miW97ZcZEFCReYGHhRGiZe+SOJHMOFcvRBdek5Jce6SOZ/MYbHaOiXRwt94V2WaIX3jQtlvrEZ86cErC3kfWrW9J42x1r9gFtagXSGq20phcPEq/dAMkJyFviAtsRgIEAQL0Z7B1xGYlq8Pqqswu2HKrLNUxVMVpTZn/815Ii73sJ5TbHKiXq1iNSBeIH7dlzhM1t4OhH4gYbz7z1vT+fcfHQ4ocOzXNcH0X2uUXZPZLFLPJ4VZgZSPFjLXevkoeboHMWh21+u0R0pMPdRX3q46+iO4muMpiLbCgvDeNSk6oRFIr7J1sHpCj0alIh3QPRFT8Lk59MDsz4RrzD+8Xx4KXdfrhH3cl14XZQ0MZylruZY5QiewpvPt77JzRThVglMcrCjDYYYjp9TsXg==,iv:ctBJG65M/UDS3p4CAeYa3wvFoinyiY261FASJz0XkiY=,tag:XGFgIq49kDjetpLCQs4n2A==,type:str]
sops:
age:
- recipient: age1ajemtm502nn2n4q7v4j8meyd5mxtcqngkkedxq2pqzuwu78zp93qnw8q48
enc: |
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA2S3VaTmg3b2QxMGtVeStr
WWRpb0RhVFNWM3RJNEV4ZTdRVmJUa2d6YVZrCnFTOWwwTlNhc2hqM2pwZ1hkcWd1
QlE2N0FtSGFFR1NHbzFOSzI5Um4rVTQKLS0tIEFaMHprc3Jlclk3MGtvc2NzZ3cr
blMrcWVSVFB3TVc0aTQ0RUYvbDFJS0kKmGisf9VDK2RPA1uQCK5udt7sdeDyh344
IKhPHzEHAHjKEkE6sWc6TB/l8K3IfL9zdHQZ9ZqTvCiS8CBZOwPQeg==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPdzBQVG9DM0JEODVPMHYy
dXhJcG8ydG9BSEJYRmpCMzNXRUNtQjhWRFZZCjdDelozdzZWbmkzWG8xZFRwVVVx
ZmMxWGF6b3R1Z2RlNjRuOExoUlNWa2sKLS0tIDRJWEw0ZmltUWYrT09ESndFa3RD
ait2ZUpTMXpkQitUaWp3eGRldDZDNzAKw5ud8Zrs/OVnJVF4rNcFVYsaJpKP5sVG
Q9v3d6pFqDg04WTcompVOeYOxKiQeDiBYLplrI0L5L4ykcBoWH11Qw==
-----END AGE ENCRYPTED FILE-----
- recipient: age197lfdanym647wdaz9uy8hrfqjwj9fs8rm7vs3fsrctceu8mr9gms2jedhz
enc: |
recipient: age1ajemtm502nn2n4q7v4j8meyd5mxtcqngkkedxq2pqzuwu78zp93qnw8q48
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTRzRqTzlzVWpGMVFEbjV5
R1RXS1RBMzZGaGZjUkFZc3RLb2JkSzlRQlJZCnp5c0pMOHBZUkhralArcUhLSmx5
Uk41cGRUR3RxR1FYVHBWU3d6ZXJpcFUKLS0tIFdLclpadHV0QlRuYmJhYVZGWVc5
eHRMV2o0TXhoVkcyaXZqU0tsR0o2eDQKdYwEuPeQ1fntKQKIlOlxet+SJ0rT5I1y
WDpfGZUVvghx5dwdd6EMq3sQUeoFSfjrlgIAwNtHRwMC19A68ubzhQ==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2cjNBcksvZ3BJTyt1S0Zs
VGxkL0phMXlrL09NNjRRTkM5UFROZVNheVZzCld0eTcwcGQwMCs1dmdpcGE3Y05F
Q2ErNG1hemNMbGVOOFRrN3ZMOTNOSU0KLS0tIGcvd0duODlpUC9RMGl4QkdsOGVn
ZkhCUmRCZUhnWjY3K3llQUR3cVYxYWcKb6gKRIjcVksT4gdSKSvl+U3yJ9osrnVp
X9ToceiCN0DnSLRK1njH1U0LIGs5zyDE0iSejJY3Pp/6lID44Ary7A==
-----END AGE ENCRYPTED FILE-----
- recipient: age17pn6suvz2f7zmrm9zxj5hr0putvcvdamqxqt7ewhncgg6ccgmp2qr00xm2
enc: |
recipient: age197lfdanym647wdaz9uy8hrfqjwj9fs8rm7vs3fsrctceu8mr9gms2jedhz
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxUEtOZ3Zac01HTjVZVXNF
endFNVprclpJMmh1eTA2ZmVJRTJlbjI3dEVNCjA4K2U5QWlOdkI0R3JwbVpNRWJG
T0VQWS9uS2UrRVk0YU9VcGhSUkJ6S2sKLS0tIGJZY1VSM1o3QUR5Mk9vNmhsRWxr
YURQR2kxdExKR00vYVJMVVQxekdVOE0KDkPOMeCo1MoM5R89t1rsMWR/bGIx592Z
wvbVmE/El4Z0QzuvXl0XK3CFlKGuwgNw5TvtQ9QZP1aAL3yN0+T5oQ==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuRDlaZjRNSkNyV1pOZkh2
Ti9UYldsdGlVdmFnTUlvcWRVRjRZYXh6WlhNClpOVlRpU3c4T0FkTUo5MytFK21i
RnZQVE9SYUJ3Z2g1N3RKbHh4em5ITWsKLS0tICtNNWVyYjdaYkR5dW9PejlGSmNP
NDFybGZZazFZa1RnV1hhclRXZS82bkUKb4ZYkZw1lQbwUQ+nz2pHvrLmKk03lEzu
FQOLoBer82Xvv2X12UZBKUGydGT6kenCK9Cxdp2CptnvCKQPUmhk/A==
-----END AGE ENCRYPTED FILE-----
- recipient: age1cnnpnglkvgw5ffv8qpgwpqvj203lh4uwt698y9mxjwklxt8nysmsa8hepn
enc: |
recipient: age17pn6suvz2f7zmrm9zxj5hr0putvcvdamqxqt7ewhncgg6ccgmp2qr00xm2
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQQTV1dkxMK3dxbGhiTGJG
bkVQTUFOU1I4SXAyV21PdThSZFNOTTA0cmpFCkpXcmRXdlE0eVRYWWErQUxSWFN4
bjI5bkU1NE84V1FTNVZiYUpLSnhSL2cKLS0tIFl6YmxmM1JLSlpxcDcxTnRnT1k3
M25EQU5zckVMa1VSK29iYW5PbHRJcVEK6+gstHbcPBdeRNvZa21nZB5sT1SdHWHs
8St5tYl5I3CxNWFgFjOrHqteRKc+ZTcj3euAJ6Wathbw0YMiA3gz0Q==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5anY1ZG9zaUo3bEozUXo2
T0hVK1dUQzVIbnZ4ZnA0dUhHQ3ZONWNoZXlNCnB1ZU1mTjYwSTdNN09KWTc2WU9N
NUVCQkkxM2hXNFU0eEJpRU5QelN1UlUKLS0tIFF2c1lueVQzY1hsRWptR3N2UzFz
RUsxTkZVRzFoelNqeDRVVDM4R3JlNnMKUvGEbBmA7hRcmeXk0zJhJGvBPWKKtgp3
Vhk7+E0zMmlzDoTcZyaeNDozzT6RGTmNS3q5h0biIutK/6FLKreWlQ==
-----END AGE ENCRYPTED FILE-----
- recipient: age1g68hxv73llkyc7etzh499ztcrt93pwawy0n8p93px4taqu58mehsp88vjq
enc: |
recipient: age1cnnpnglkvgw5ffv8qpgwpqvj203lh4uwt698y9mxjwklxt8nysmsa8hepn
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYRGYyUGhlL2NJelZTQ1g0
UEhJMFlkVmdlU1E2cGE2UHF2dytVYmhQMlIwCmdrOEZjUUFrQjMzK2FxVjF0NGY1
UStNT3ZXbEJlUGxzSXlBTmYwUzRIalEKLS0tIHFuWWIrTGN6eUxyNEhybHIydzRp
cUFid1RwRXA4cExWd3poK2hEaVd5Q00KjjiEiQw2OxcGv/qDudLmbM6aysYhLTxi
Qjmh133pyznFs+pLVLdYnId42zvojAeuJD9cJYxuwwgPA2ZlKdSVrg==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCZUo1ZDh6cTM0VTREMFIz
OWRJNW1aL2RyKysxTDA5RVNjOHFjb2hvalNZCllYeTJjTWZONmd3RWxhdi9udTJC
elFCdStNZE96Q2d3cjhiREtwb1ZnRGsKLS0tIGhoZXdpMW1Qa3Z0Yk9zU1ZmUGJj
YlRkTWlmSE9TNWNmMkNmbHJEWEFrNXcKxwFWZ1qtfudrjB4pxHW0wmBsmpKAvQSm
q9t7SiFKqRPZKEPqDQo3G+xoXsjt0nC0iKKikYF5XcFHHXWFb5sepA==
-----END AGE ENCRYPTED FILE-----
- recipient: age1awytvphvty4f9wmdn86xnjg9kgetqjx8qlwj5d2882t4fyyzy58s3vg5k4
enc: |
recipient: age1g68hxv73llkyc7etzh499ztcrt93pwawy0n8p93px4taqu58mehsp88vjq
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRbUs1Qm1hUnJldDNZNUR0
N3d0YXp5NWtjV0xvc1ZrM3ArZllIbmJtRXpnCnp2TVRyQVFqNC9kWXpBa0NnbW9X
VVFONnNleG9wN2IwdkhSWjBObmVGd3cKLS0tIHVDVmVNazdLWUpOQVlTNFRwL1c5
bkdsaXNINEZpZjdMdHAwdElpWFQ0aW8K0guO/BF8hp1LDToVBFY5JKdz8WXOwK2P
prGKdxPsTAfW8xTq97LHHRsLC7+4TVXnjF4LS4SM8EXIX9KCl5FIGA==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQVEczOHNXaVdzdExpWnRQ
bElRbGpHdm90Z2FxRWNkanBjbVJFbHFQWmlNCjNhZFNMa25kTGVCcEFWeXV1Vnlv
TytRbklGRkNENEtaeDMxN0t0NGp6SjQKLS0tIG9YNWhPWjhWd2VXWlNUaGhuVWpi
dE9EUTNVaTgyMWFNZ3FzOUhFUHZmeHMKuiICVTlhhHOAqr+t2g8VEWmjQ7OEr6x/
1FOEAjGif5qrYK2JAkYRCTz6DnxZRcpWCgc51lvrbjVtP9ehLHdhAg==
-----END AGE ENCRYPTED FILE-----
- recipient: age1erkn7dd022e90ktyj66aux9j9xvl0uzd6ru5cmrjsvcm5rtr5pfs7q6k9h
enc: |
recipient: age1awytvphvty4f9wmdn86xnjg9kgetqjx8qlwj5d2882t4fyyzy58s3vg5k4
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4ZEVtVzM0dFhJYWd5UXZO
ajIzSFp1VENuSjlaYSs4ZUdBSS90aEoyM25JCnhrd0lyUVN0dEV5a2tQUjZwSlFx
eVlLT1kyejhuZDdGeHpDQnRMTllCSHMKLS0tIHZVS1JDVzBaaG1Oend1eDFiT1F4
NU1vREt6SXBWYU1xdW1JSm1uUGZQRVEKtaDeDNo817rXXoMkBHo0MZWtm4LayqwC
NN8vbhGcgT+M+ehnmZ1HdPk8VWRvlQ+SMpG+a6DjK8BjYtAWcO16RQ==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAybWd4SnU0N1ZPZ3JJUkFr
MUl2ejVRUGZ6eGU1Q1NVZktuOXcwUlBpakNJCkdwaEtPYzlqSlN3WU5zYVB2QVB0
aDZVOWpCOGppeU1lYUJhVS95bFVUbHcKLS0tIFJNRzc3VStlblRmYXZma1MzY01p
RzlZNFg5d2tVTVoxbDA1RStjMk9JYkkKf09NyGYpu/LszVrIXVpRzmFFkY3L4wmH
3b7Iev9HCVTzcRqxUpXXcL8pRKjLEOAI+HcFZUQiBmD4+xOCYMfuGw==
-----END AGE ENCRYPTED FILE-----
- recipient: age16crkeglm3j3f6rveylytuerptjf9mwtv3hl89ywkmnnvdkntfchsuvrsk5
enc: |
recipient: age1erkn7dd022e90ktyj66aux9j9xvl0uzd6ru5cmrjsvcm5rtr5pfs7q6k9h
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6eUFYSC82YVM1WVEwc2Fz
aEl3TG5oOFU5MUFhQ0JhbC9yRVYxOFo0bUVJCnpwQzMyZmN4ZTlNVW5pZTY5bkdY
bjhaSnFxS0Vrb3pHTlJkWjVvczBSOG8KLS0tIHlsbjhxODdvcnd4c21aWUNpK01M
ZW1hTUFtVE15QzVIVU93ZExlUWZjYzAKUZj+/NtMHCPjFFqbJ/8b2ASljV6GEk6p
FbqV9LezRZrfl9GXBVUpB4Oeb9v2yp151aSda07/AG5YO0/jRAV/Bg==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwUGZOM1U1NlEzL0N0VjBM
TFJpUTJuNmtEMUxTZno4M2dUVkZVZGdNeEFvCmQ3Q21vM0xoSnFuUTIwNFZGUjJz
bTlBUzhKZ2FZYVJMSjdzT3R5WmxzRncKLS0tIDNVYlUvM29sMFdIaGhwSkJUOG81
L2ExYktQVkw3WU9pYk9haktKd3R1UW8Kuqh/4fmHmBNJKkotCau2gTHx+CEj7L0f
HuRVxbC8smhRNhM7x8jRJ0ui/SF05A4qwvC/LMv6P3W7W42bCRxErQ==
-----END AGE ENCRYPTED FILE-----
- recipient: age1tkywsvddjj6r6ukuqgz9aql92jfx85rz57dhmkkndysh6yx6p5rs0zj0qr
enc: |
recipient: age16crkeglm3j3f6rveylytuerptjf9mwtv3hl89ywkmnnvdkntfchsuvrsk5
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxdjFYN01HcXZMNVBJckVm
eklKZHAxeWgvVlcwWk9yWUJpcFFBUnpUV0FZCi85dGE2L3d3OS9CdW5sL0pZTTM2
SFJkcUN0emh6S3hMenhCcXBhNWF6eVUKLS0tIExwNEVyRmpGRXRLMjgxY1dqbkxQ
bk04K1luNnJVTjZQY25KRXNSVG0venMK7uM4tqqmq/o4QgMlE/x/FXkQsPRkofNO
I6C93RYgp1OcGPH14Kmp5lXtK4/pdToaRnVXPGenDQJsFhwWCEI+Fg==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUMzdDa2ROL0h3MExRY2tp
RGM0cmdXMlhGSDFob1FycVVHN0ozUTBudjM0ClF4a2JQT3pNbmZKL1BCNC95R0lm
Q0VOdUI4Z0hHcEpwREE0NW02QVVRbzAKLS0tIFVqbFBVNDJ3eTBsZFNNSEpDak1y
c2h6eWxKN3FramxGNGZsRlcrL1VpUnMK4nUJnjktSe94uGXGU/aw/SP5X/EPiQjz
97j0nMDIc1cxnh0oB7dK9xq4s1LpBOJWGCUSVkBYU9pAWgcQVtHOSg==
-----END AGE ENCRYPTED FILE-----
- recipient: age17p69ktg7yfzgdsk00f32mupe4n4fevdpw2wsv7ft30yvpeseau6s7t0zdg
enc: |
recipient: age1tkywsvddjj6r6ukuqgz9aql92jfx85rz57dhmkkndysh6yx6p5rs0zj0qr
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsOTFXaHE0SDRCTnE4di9N
S2JIbHF2a1pzNzU4UFIvQmpZMVpOUjJqd0RJClVxcTd3d05aRDN1RGVmWVpQS2lI
L1RVU3FUM3d4SU9pYXlwSko2RW5uWjgKLS0tIEplR1l1bGlad3p1ZkNBbFY3YmlM
dUpXZis2N2VyN0ZFbjlPRXdwRFQ1aHMKm1Mk6MPKxFmwdATCYUANRSY5rHKgmQer
LBlqqWKt1JiIUAYtazQeQ6KYxmjVlQPY7AZw2t+EhBEPrqbTL3vOiw==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxKzhoOEVjdkNBaUl5dW1i
aktGWm9ZTDNTWGcvK2xJZDVMMk44S0UrdG5ZCjV0WUw2YndHdXM2b1lCSGhxbHRn
TEM5cVRHZXQzS2poeWZ4azVlWXNqVzAKLS0tIDRSV2hEWGMwa1FXOG1jaGwxR2Y5
Z1h1R3hVMWc1WmVRSENtekdhOVhMWlkKPxcztky7YjMEcMMvjis52VsS6OyxqT5r
WHZ4l41AZQZg59QYvA29L8G2YWJHnOHKd83LsFw627/eR2c2pAHS9w==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2026-03-07T17:19:05Z"
mac: ENC[AES256_GCM,data:hT4mPKLcIuAFmllJBYFXL5sGyMn95mYEv+eGVA+KQYm629YKSncgvn5g8elau/8HXR1O/bwQlkGmGr8VPeR/0KRb6TPCA4MrCwox38fy3ZLx2e0movVi/xIgKXIo5wYUq4Qm/pSo715limxGChxUxKtdEK/lmMkSnxyGmlkQtwM=,iv:XoOfhdK/CK6shUXhH4h14gtyqZqcqmTV6/R2jkynFr8=,tag:q3V0xcWQxjFi2drk5fLJoQ==,type:str]
recipient: age17p69ktg7yfzgdsk00f32mupe4n4fevdpw2wsv7ft30yvpeseau6s7t0zdg
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBMclFDR0wxNm0xYUNydE43
VjkrREZGWFk5Si9MYjY4ZU1JVW1kT2VwZG0wCmdJT3ZoOGRxd3lqUGdPUG1sa25W
RjZ1Ymc3RGFEaEZoNnY4NmV4TGYzaWsKLS0tIEcwdDl2aWtyWTNsa1F6bzg3Vmx4
MEV0cnJoWVcxVktwY05yUUNvbGNpZlEK2LbBLBooezdoNvUCwjGNp5TbAl5duIP8
QUd0alW52eTCpVBWsXU2JbXIwfc3HY7fl2dbPgD38mcCsoFBQ3hH7w==
-----END AGE ENCRYPTED FILE-----
recipient: age1ztuc996dapd7gpw5g7t4k3e9egv3dj6czxyslhnwula97w3cuytqlgzru0
lastmodified: "2026-06-13T23:40:11Z"
mac: ENC[AES256_GCM,data:a4PQgcTV86va1Ht4ZyG40XGEbV+P5bwgSIWmnaqTKHaRSQTvmUhRzwU7VSCPwNhOr2FqeGWpSl6QcI8p/RrthP1s43FwNo57T+3ZEjLB+AjywLENDu64wv9RFVK+mYSPzUsZwq2X98Lq6ygmHLHohDJFhZIDjq+WqYB4m2gf3uQ=,iv:ZdgwbsKscihqApFz8BSvW673UJsJAjPWPFPSN0xKRSA=,tag:vGa7CV6yXWRmpSMsW0yQkw==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0
version: 3.13.1
+1 -4
View File
@@ -73,10 +73,7 @@ in {
};
supportedFilesystems = mkIf cfg.zfs.enable ["zfs"];
zfs.extraPools = mkIf cfg.zfs.enable cfg.zfs.pools;
kernelPackages =
if cfg.kernel.hardened
then pkgs.linuxPackages_hardened
else cfg.kernel.package;
kernelPackages = cfg.kernel.package;
kernelModules =
cfg.kernel.modules
++ ["kvm-${cfg.kernel.cpuVendor}"]
+1 -31
View File
@@ -1,45 +1,15 @@
{
lib,
config,
...
}:
with lib; let
cfg = config.mySystem.misc;
in {
imports = [
./boot
./desktop
./dev
./hardware
./i18n
./misc.nix
./network
./packages
./security
./services
./users
];
options.mySystem.misc = {
timezone = mkOption {
type = types.str;
default = "Europe/Paris";
};
keymap = mkOption {
type = types.str;
default = "fr";
example = "fr-bepo";
description = "Keymap to use in the TTY console";
};
};
config = {
boot.tmp.cleanOnBoot = true;
console.keyMap = cfg.keymap;
time.timeZone = cfg.timezone;
environment.pathsToLink = ["/share/bash-completion" "/share/zsh"];
services = {
orca.enable = false;
envfs.enable = true;
};
};
}
+4 -1
View File
@@ -9,7 +9,10 @@ with lib; let
in {
options.mySystem.desktop.waydroid.enable = mkEnableOption "Enables Waydroid";
config = mkIf cfg.enable {
virtualisation.waydroid.enable = cfg.enable;
virtualisation.waydroid = {
enable = cfg.enable;
package = pkgs.waydroid-nftables;
};
environment.systemPackages = [pkgs.waydroid-helper];
};
}
+4 -1
View File
@@ -20,6 +20,9 @@ in {
};
config = mkIf cfg.enable {
mySystem.users.phundrak = mkIf config.mySystem.users.phundrak.enable {
extraGroups = ["docker"] ++ lists.optional cfg.podman.enable "podman";
};
environment.systemPackages = with pkgs;
[
dive # A tool for exploring each layer in a docker image
@@ -29,7 +32,7 @@ in {
podman-compose
podman-desktop
];
virtualisation = mkIf cfg.enable {
virtualisation = {
docker = mkIf (!cfg.podman.enable) {
enable = true;
enableNvidia = cfg.nvidia.enable;
+2 -1
View File
@@ -3,8 +3,9 @@
./amdgpu.nix
./bluetooth.nix
./fingerprint.nix
./sound.nix
./input
./pinetab2.nix
./sound.nix
];
hardware.enableAllFirmware = lib.mkDefault true;
+4 -1
View File
@@ -7,8 +7,11 @@ with lib; let
cfg = config.mySystem.hardware.input.opentablet;
in {
options.mySystem.hardware.input.opentablet.enable = mkEnableOption "Enables OpenTablet drivers";
config.hardware.opentabletdriver = mkIf cfg.enable {
config = mkIf cfg.enable {
hardware.opentabletdriver = {
inherit (cfg) enable;
daemon.enable = true;
};
boot.kernelModules = ["wacom"];
};
}
+18
View File
@@ -0,0 +1,18 @@
{
lib,
config,
...
}:
with lib; let
cfg = config.mySystem.hardware.pinetab2;
in {
options.mySystem.hardware.pinetab2.enable = mkEnableOption "Activate support for the PineTab2";
config = {
boot.kernelParams = ["console=tty0" "console=ttyS2,1500000n8" "rootwait" "root=LABEL=NIXOS_SD" "rw"];
hardware.sensor.iio.enable = true;
services.avahi = {
enable = true;
openFirewall = true;
};
};
}
+6 -2
View File
@@ -9,6 +9,7 @@ with lib; let
in {
options.mySystem.hardware.sound = {
enable = mkEnableOption "Whether to enable sounds with Pipewire";
noisetorch = mkEnableOption "Whether to activate noisetorch support";
scarlett.enable = mkEnableOption "Activate support for Scarlett sound card";
alsa = mkOption {
type = types.bool;
@@ -32,7 +33,8 @@ in {
config = {
environment.systemPackages = mkIf cfg.scarlett.enable [pkgs.alsa-scarlett-gui];
services.pipewire = mkIf cfg.enable {
services = {
pipewire = mkIf cfg.enable {
enable = true;
alsa = mkIf cfg.alsa {
enable = mkDefault true;
@@ -40,8 +42,10 @@ in {
};
jack.enable = mkDefault cfg.jack;
};
pulseaudio.enable = false;
};
programs.noisetorch = mkIf cfg.enable {
inherit (cfg) enable;
enable = cfg.noisetorch;
};
};
}
+1
View File
@@ -1,5 +1,6 @@
{
imports = [
./input.nix
./locale.nix
];
}
+25
View File
@@ -0,0 +1,25 @@
{
lib,
config,
pkgs,
...
}:
with lib; let
cfg = config.mySystem.i18n.input;
in {
options.mySystem.i18n.input.enable = mkEnableOption "Enable i18n input with fcitx5";
config.i18n.inputMethod = mkIf cfg.enable {
enable = true;
type = "fcitx5";
fcitx5.addons = with pkgs; [
fcitx5-gtk
fcitx5-mozc-ut # Japanese input support
fcitx5-nord
fcitx5-table-other # X-SAMPA to IPA support
qt6Packages.fcitx5-chinese-addons # allow to load table addons
qt6Packages.fcitx5-configtool
qt6Packages.fcitx5-with-addons
];
};
}
+55
View File
@@ -0,0 +1,55 @@
{
lib,
config,
...
}:
with lib; let
cfg = config.mySystem.misc;
in {
options.mySystem.misc = {
timezone = mkOption {
type = types.str;
default = "Europe/Paris";
};
keymap = mkOption {
type = types.str;
default = "fr";
example = "fr-bepo";
description = "Keymap to use in the TTY console";
};
};
config = {
boot.tmp.cleanOnBoot = true;
console.keyMap = cfg.keymap;
time.timeZone = cfg.timezone;
environment.pathsToLink = [
"/share/bash-completion"
"/share/zsh"
];
services = {
orca.enable = false;
envfs.enable = true;
};
nix.settings = {
substituters = [
"http://marpa:5000?priority=5"
"https://phundrak.cachix.org?priority=10"
"https://nix-community.cachix.org?priority=20"
"https://cache.nixos.org?priority=40"
];
trusted-public-keys = [
"marpa-local:XoO+dFN4PeauF52pYuy3Vh4Sdtl2qIdxu5aUasWKv6Q="
"phundrak.cachix.org-1:osJAkYO0ioTOPqaQCIXMfIRz1/+YYlVFkup3R2KSexk="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
];
http-connections = 128;
experimental-features = [
"nix-command"
"flakes"
];
};
};
}
+9 -1
View File
@@ -51,12 +51,20 @@ in {
default = null;
};
};
wifi.disablePowersave = mkEnableOption ''
Disables powersave for Wifi.
Used mainly for the PineTab2, as leaving WiFi powersave with the bes2600 can cause stability issues.
'';
};
config.networking = {
hostName = cfg.hostname; # Define your hostname.
hostId = cfg.id;
networkmanager.enable = true;
networkmanager = {
enable = true;
wifi.powersave = ! cfg.wifi.disablePowersave;
};
inherit (cfg) hostFiles domain;
firewall = {
enable = true;
+3 -7
View File
@@ -11,12 +11,8 @@ in {
enable = mkEnableOption "Enable Flatpak support";
builder.enable = mkEnableOption "Enable Flatpak builder";
};
config = {
services.flatpak = mkIf cfg.enable {
inherit (cfg) enable;
};
environment.systemPackages = mkIf cfg.builder.enable [
pkgs.flatpak-buildR
];
config = mkIf cfg.enable {
environment.systemPackages = lists.optional cfg.builder.enable pkgs.flatpak-builder;
services.flatpak.enable = true;
};
}
+1 -1
View File
@@ -27,7 +27,7 @@ in {
trusted-users = mkOption {
type = types.listOf types.str;
example = ["alice" "bob"];
default = [];
default = ["@wheel" "root"];
};
};
+1
View File
@@ -2,4 +2,5 @@
imports = [
./sops.nix
];
security.rtkit.enable = true;
}
+1
View File
@@ -3,6 +3,7 @@
./calibre.nix
./endlessh.nix
./fwupd.nix
./harmonia.nix
./jellyfin.nix
./languagetool.nix
./plex.nix
+36
View File
@@ -0,0 +1,36 @@
{
config,
lib,
...
}:
with lib; let
cfg = config.mySystem.services.harmonia;
in {
options.mySystem.services.harmonia = {
enable = mkEnableOption "Harmonia Nix binary cache server";
port = mkOption {
type = types.port;
default = 5000;
description = "Port to listen on";
};
priority = mkOption {
type = types.ints.between 0 100;
default = 50;
description = "Cache priority (lower = higher priority, 0-100)";
};
signKeyPaths = mkOption {
type = types.listOf types.path;
description = "Paths to the signing keys to use for signing the cache.";
};
};
config = mkIf cfg.enable {
services.harmonia.cache = {
enable = true;
inherit (cfg) signKeyPaths;
settings = {
inherit (cfg) priority;
bind = "[::]:${toString cfg.port}";
};
};
};
}
+8 -1
View File
@@ -10,13 +10,20 @@ in {
options.mySystem.users.phundrak = {
enable = mkEnableOption "Enables user phundrak";
trusted = mkEnableOption "Mark the user as trusted by Nix";
extraGroups = mkOption {
type = types.listOf types.str;
default = [];
example = ["feedbackd"];
};
};
config = {
users.users.phundrak = mkIf cfg.enable {
isNormalUser = true;
description = "Lucien Cartier-Tilet";
extraGroups = ["networkmanager" "wheel" "docker" "dialout" "podman" "plugdev" "games" "audio" "input"];
extraGroups =
["networkmanager" "wheel" "dialout" "plugdev" "games" "audio" "input"]
++ cfg.extraGroups;
shell = pkgs.zsh;
openssh.authorizedKeys.keyFiles = lib.filesystem.listFilesRecursive ../../users/phundrak/keys;
};
+10 -1
View File
@@ -34,7 +34,16 @@ in {
creug.sshKey.file = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
dev.vcs = {
jj.enable = false;
name = "Creug";
email = "gregory.foulachon@gmail.com";
editor = "${pkgs.nano}/bin/nano";
jj = {
enable = true;
cz = {
enable = true;
alias = true;
};
};
git.enable = true;
publicKey = cfg.sshKey;
};
+23
View File
@@ -0,0 +1,23 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "app-launcher" ''
LOG_FILE="$HOME/.local/share/app-launcher.log"
logger() {
local level="$1"
local message="$2"
local timestamp
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
printf "[%s] [%-7s] %s\n" "$timestamp" "''${level^^}" "$message" >> "$LOG_FILE"
}
CAELESTIA_ACTIVE=$(systemctl --user is-active caelestia.service)
logger debug "Caelestia activity: $CAELESTIA_ACTIVE"
if systemctl --user is-active caelestia.service | grep 'active' &> /dev/null ; then
logger info "Using Caelestia app launcher"
caelestia shell drawers toggle launcher || \
logger error "failed to launch Caelestia app launcher"
exit 0
fi
rofi -show drun
''
+1 -1
View File
@@ -31,6 +31,6 @@ in {
dev.fullDesktop = mkDefault cfg.fullDesktop;
media.fullDesktop = mkDefault cfg.fullDesktop;
security.fullDesktop = mkDefault cfg.fullDesktop;
services.fullDesktop = mkDefault cfg.fullDesktop;
myServices.fullDesktop = mkDefault cfg.fullDesktop;
};
}
+8 -4
View File
@@ -13,9 +13,7 @@ in {
systemd = {
enable = true;
target = "graphical-session.target";
environment = [
"QT3_QPA_PLATFORMTHEME=gtk3"
];
environment = ["QT3_QPA_PLATFORMTHEME=gtk3"];
};
settings = {
paths.wallpaperDir = "~/Pictures/Wallpapers/nord";
@@ -27,9 +25,10 @@ in {
explorer = ["${pkgs.nemo-with-extensions}/bin/nemo"];
};
idle = {
inhibitWhenAudio = true;
timeouts = [
{
timeout = 300;
timeout = 3600;
idleAction = "lock";
}
];
@@ -69,6 +68,11 @@ in {
hibernate = ["systemctl" "hibernate"];
reboot = ["systemctl" "reboot"];
};
utilities.toasts = {
capsLockChanged = false;
numLockChanged = false;
kbLayoutChanged = false;
};
};
cli = {
enable = true;
+3 -2
View File
@@ -8,7 +8,7 @@ with lib; let
in {
imports = [
./caelestia.nix
./eww.nix
./firefox.nix
./hyprland.nix
./kdeconnect.nix
./kitty.nix
@@ -18,13 +18,14 @@ in {
./swaync.nix
./theme.nix
./waybar.nix
./wl-kbptr.nix
./wlr-which-key.nix
./wlsunset.nix
];
options.home.desktop.fullDesktop = mkEnableOption "Enable options for graphical environments";
config.home.desktop = {
eww.enable = mkDefault cfg.fullDesktop;
firefox.enable = mkDefault cfg.fullDesktop;
hyprland.enable = mkDefault cfg.fullDesktop;
kdeconnect.enable = mkDefault cfg.fullDesktop;
kitty.enable = mkDefault cfg.fullDesktop;
-12
View File
@@ -1,12 +0,0 @@
(defwindow example
:monitor 0
:geometry (geometry :x "0%"
:y "20%"
:width "90%"
:height "30px"
:anchor "top center")
:stacking "fg"
:reserve (struts :distance "40px" :side "top")
:windowtype "dock"
:wm-ignore false
"example content")
-14
View File
@@ -1,14 +0,0 @@
{
lib,
config,
...
}:
with lib; let
cfg = config.home.desktop.eww;
in {
options.home.desktop.eww.enable = mkEnableOption "Enable eww support";
config.programs.eww = mkIf cfg.enable {
inherit (cfg) enable;
configDir = ./eww-config;
};
}
+72
View File
@@ -0,0 +1,72 @@
{
config,
lib,
inputs,
pkgs,
...
}:
with lib; let
cfg = config.home.desktop.firefox;
inherit (pkgs.stdenv.hostPlatform) system;
zen = inputs.zen-browser.packages.${system}.default;
settingsToLines = settings:
concatStringsSep "\n" (mapAttrsToList (name: value: "set ${name} ${toString value}") settings);
in {
options.home.desktop.firefox = {
enable = mkEnableOption "enable Firefox";
useZen = mkEnableOption "use Zen instead of Firefox";
tridactyl = {
enable = mkEnableOption "enable Tridactyl";
preConfig = mkOption {
description = "Lines to add to the beginning of tridactylrc";
type = types.lines;
default = "";
};
config = mkOption {
type = with types;
attrsOf (oneOf [
int
str
bool
]);
description = "Tridactyl settings (converted to 'set key value' lines)";
default = {};
example = {
smoothscroll = true;
history = 1000;
};
};
extraConfig = mkOption {
description = "Extra lines to add to tridactylrc (for bindings, autocmds, etc)";
type = types.lines;
default = "";
};
};
};
config = mkIf cfg.enable {
home.sessionVariables.MOZ_ENABLE_WAYLAND = "1";
programs.firefox = {
inherit (cfg) enable;
package =
if cfg.useZen
then zen
else pkgs.firefox;
nativeMessagingHosts = lists.optional cfg.tridactyl.enable pkgs.tridactyl-native;
configPath = ".mozilla/firefox";
};
xdg.configFile."tridactyl/tridactylrc" = mkIf cfg.tridactyl.enable {
text = concatStringsSep "\n" (filter (s: s != "") [
cfg.tridactyl.preConfig
(settingsToLines (cfg.tridactyl.config
// {
browser =
if cfg.useZen
then "zen"
else "firefox";
}))
cfg.tridactyl.extraConfig
]);
};
};
}
+21 -9
View File
@@ -47,22 +47,30 @@ in {
services.blueman-applet.enable = ! caelestiaEnabled;
wayland.windowManager.hyprland = {
enable = true;
systemd.enable = false;
systemd.enable = true;
importantPrefixes = ["$left" "$right" "$up" "$down" "$menu"];
settings = {
env = [
"XMODIFIERS,@im=fcitx"
"XCURSOR_SIZE,12"
];
input = {
kb_layout = "fr,us";
kb_variant = "bepo_afnor,";
# kb_options = "caps:ctrl_modifier";
numlock_by_default = true;
follow_mouse = 1;
touchpad.natural_scroll = false;
sensitivity = "0";
};
device = {
name = "wacom-usb-bamboo-pad-finger";
sensitivity = 0.5;
};
monitor =
{
"marpa" = [
"DP-1, 3440x1440@144, 1080x550, 1"
# "DP-1, 2560x1440@144, 1080x550, 1" # streaming
"DP-2, 2560x1080@60, 0x0, 1, transform, 1"
];
"gampo" = [];
@@ -80,8 +88,9 @@ in {
new_status = "inherit";
};
workspace = [
"10, layoutopt:orientation:bottom"
"1, layoutopt:orientation:bottom"
"9, layoutopt:orientation:bottom"
"10, layoutopt:orientation:bottom"
];
decoration = {
rounding = 20;
@@ -97,19 +106,24 @@ in {
"workspaces, 1, 6, default"
];
};
dwindle = {
pseudotile = true;
preserve_split = true;
};
dwindle.preserve_split = true;
exec-once =
[
"pactl load-module module-switch-on-connect"
"${pkgs.mpc}/bin/mpc stop"
"${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"
"${pkgs.mozc}/lib/mozc/mozc_server"
"${pkgs.fcitx5}/bin/fcitx5 -d"
]
++ lib.lists.optional (! caelestiaEnabled) "${pkgs.networkmanagerapplet}/bin/nm-applet";
};
extraConfig = ''
device {
name = wacom-usb-bamboo-pad-finger
sensitivity = 0.5
accel_profile = adaptive
}
$left = c
$right = r
$up = s
@@ -170,8 +184,6 @@ in {
bind = SUPER_SHIFT, minus, movetoworkspace, 8
bind = SUPER_SHIFT, slash, movetoworkspace, 9
bind = SUPER_SHIFT, asterisk, movetoworkspace, 10
env = XCURSOR_SIZE,12
'';
};
};
+67 -65
View File
@@ -29,84 +29,86 @@ in {
detect_urls = true;
background_opacity = 0.7;
};
keybindings = {
keybindings = let
prefix = "kitty_mod+space";
in {
"alt+c" = "copy_to_clipboard";
"kitty_mod+c" = "copy_to_clipboard";
"alt+v" = "paste_from_clipboard";
"kitty_mod+v" = "paste_from_clipboard";
"kitty_mod+s>c" = "show_scrollback";
"kitty_mod+s>down" = "scroll_line_down";
"kitty_mod+s>t" = "scroll_line_down";
"kitty_mod+s>up" = "scroll_line_up";
"kitty_mod+s>s" = "scroll_line_up";
"kitty_mod+s>end" = "scroll_end";
"kitty_mod+s>home" = "scroll_home";
"kitty_mod+s>page_down" = "scroll_page_down";
"kitty_mod+s>page_up" = "scroll_page_up";
"${prefix}>s>c" = "show_scrollback";
"${prefix}>s>down" = "scroll_line_down";
"${prefix}>s>t" = "scroll_line_down";
"${prefix}>s>up" = "scroll_line_up";
"${prefix}>s>s" = "scroll_line_up";
"${prefix}>s>end" = "scroll_end";
"${prefix}>s>home" = "scroll_home";
"${prefix}>s>page_down" = "scroll_page_down";
"${prefix}>s>page_up" = "scroll_page_up";
"kitty_mod+enter" = "new_window";
"kitty_mod+w>q" = "close_window";
"kitty_mod+w>p" = "next_window";
"kitty_mod+w>n" = "previous_window";
"kitty_mod+w>f" = "move_window_forward";
"kitty_mod+w>b" = "move_window_backward";
"kitty_mod+w>t" = "move_window_to_top";
"kitty_mod+w>r" = "start_resizing_window";
"kitty_mod+w>1" = "first_window";
"kitty_mod+w>2" = "second_window";
"kitty_mod+w>3" = "third_window";
"kitty_mod+w>4" = "fourth_window";
"kitty_mod+w>5" = "fifth_window";
"kitty_mod+w>6" = "sixth_window";
"kitty_mod+w>7" = "seventh_window";
"kitty_mod+w>8" = "eighth_window";
"kitty_mod+w>9" = "ninth_window";
"kitty_mod+w>0" = "tenth_window";
"${prefix}>enter" = "new_window";
"${prefix}>w>q" = "close_window";
"${prefix}>w>p" = "next_window";
"${prefix}>w>n" = "previous_window";
"${prefix}>w>f" = "move_window_forward";
"${prefix}>w>b" = "move_window_backward";
"${prefix}>w>t" = "move_window_to_top";
"${prefix}>w>r" = "start_resizing_window";
"${prefix}>w>1" = "first_window";
"${prefix}>w>2" = "second_window";
"${prefix}>w>3" = "third_window";
"${prefix}>w>4" = "fourth_window";
"${prefix}>w>5" = "fifth_window";
"${prefix}>w>6" = "sixth_window";
"${prefix}>w>7" = "seventh_window";
"${prefix}>w>8" = "eighth_window";
"${prefix}>w>9" = "ninth_window";
"${prefix}>w>0" = "tenth_window";
"kitty_mod+tab>n" = "next_tab";
"kitty_mod+tab>p" = "previous_tab";
"kitty_mod+tab>c" = "new_tab";
"kitty_mod+tab>q" = "close_tab";
"kitty_mod+tab>shift+n" = "move_tab_backward";
"kitty_mod+tab>shift+p" = "move_tab_forward";
"kitty_mod+tab>t" = "set_tab_title";
"${prefix}>tab>n" = "next_tab";
"${prefix}>tab>p" = "previous_tab";
"${prefix}>tab>c" = "new_tab";
"${prefix}>tab>q" = "close_tab";
"${prefix}>tab>shift+n" = "move_tab_backward";
"${prefix}>tab>shift+p" = "move_tab_forward";
"${prefix}>tab>t" = "set_tab_title";
"kitty_mod+l" = "next_layout";
"${prefix}>l" = "next_layout";
"kitty_mod+f>equal" = "change_font_size all 0";
"kitty_mod+f>kp_add" = "change_font_size all +2.0";
"kitty_mod+f>plus" = "change_font_size all +2.0";
"kitty_mod+f>kp_subtract" = "change_font_size all -2.0";
"kitty_mod+f>minus" = "change_font_size all -2.0";
"${prefix}>f>equal" = "change_font_size all 0";
"${prefix}>f>kp_add" = "change_font_size all +2.0";
"${prefix}>f>plus" = "change_font_size all +2.0";
"${prefix}>f>kp_subtract" = "change_font_size all -2.0";
"${prefix}>f>minus" = "change_font_size all -2.0";
"kitty_mod+shift+h" = "kitten hints";
"kitty_mod+h>p" = "kitten hints --type path --program -";
"kitty_mod+h>shift+p" = "kitten hints --type path";
"kitty_mod+h>l" = "kitten hints --type line --program -";
"kitty_mod+h>w" = "kitten hints --type word --program -";
"kitty_mod+h>h" = "kitten hints --type hash --program -";
"kitty_mod+h>n" = "kitten hints --type linenum";
"kitty_mod+h>y" = "kitten hints --type hyperlink";
"${prefix}>shift+h" = "kitten hints";
"${prefix}>h>p" = "kitten hints --type path --program -";
"${prefix}>h>shift+p" = "kitten hints --type path";
"${prefix}>h>l" = "kitten hints --type line --program -";
"${prefix}>h>w" = "kitten hints --type word --program -";
"${prefix}>h>h" = "kitten hints --type hash --program -";
"${prefix}>h>n" = "kitten hints --type linenum";
"${prefix}>h>y" = "kitten hints --type hyperlink";
"kitty_mod+f10" = "toggle_maximized";
"kitty_mod+f11" = "toggle_fullscreen";
"${prefix}>f10" = "toggle_maximized";
"${prefix}>f11" = "toggle_fullscreen";
"kitty_mod+a>equal" = "set_background_opacity 1";
"kitty_mod+a>d" = "set_background_opacity default";
"kitty_mod+a>plus" = "set_background_opacity +0.1";
"kitty_mod+a>up" = "set_background_opacity +0.1";
"kitty_mod+a>kp_add" = "set_background_opacity +0.1";
"kitty_mod+a>minus" = "set_background_opacity -0.1";
"kitty_mod+a>down" = "set_background_opacity -0.1";
"kitty_mod+a>kp_substract" = "set_background_opacity -0.1";
"${prefix}>a>equal" = "set_background_opacity 1";
"${prefix}>a>d" = "set_background_opacity default";
"${prefix}>a>plus" = "set_background_opacity +0.1";
"${prefix}>a>up" = "set_background_opacity +0.1";
"${prefix}>a>kp_add" = "set_background_opacity +0.1";
"${prefix}>a>minus" = "set_background_opacity -0.1";
"${prefix}>a>down" = "set_background_opacity -0.1";
"${prefix}>a>kp_substract" = "set_background_opacity -0.1";
"kitty_mod+delete" = "clear_terminal reset active";
"kitty_mod+escape" = "kitty_shell window";
"kitty_mod+f2" = "edit_config_file";
"kitty_mod+n" = "new_os_window";
"kitty_mod+o" = "pass_selection_to_program";
"kitty_mod+u" = "kitten unicode_input";
"${prefix}>delete" = "clear_terminal reset active";
"${prefix}>escape" = "kitty_shell window";
"${prefix}>f2" = "edit_config_file";
"${prefix}>n" = "new_os_window";
"${prefix}>o" = "pass_selection_to_program";
"${prefix}>u" = "kitten unicode_input";
};
};
}
+4
View File
@@ -6,6 +6,7 @@
}:
with lib; let
cfg = config.home.desktop.obs;
obs-image-reaction = pkgs.callPackage ../../../packages/obs-image-reaction.nix {};
in {
options.home.desktop.obs.enable = mkEnableOption "Enables OBS Studio";
config.programs.obs-studio = mkIf cfg.enable {
@@ -13,11 +14,14 @@ in {
plugins = with pkgs.obs-studio-plugins; [
input-overlay
obs-backgroundremoval
obs-markdown
obs-mute-filter
obs-pipewire-audio-capture
obs-scale-to-sound
obs-source-clone
obs-source-record
obs-tuna
obs-image-reaction
];
};
}
+1
View File
@@ -20,6 +20,7 @@ in {
package = pkgs.nordic;
name = "Nordic";
};
gtk4.theme = config.gtk.theme;
};
home.pointerCursor = {
enable = true;
+37
View File
@@ -0,0 +1,37 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
configDir = config.xdg.configHome;
cfg = config.home.desktop.wl-kbptr;
iniFormat = pkgs.formats.ini {};
in {
options.home.desktop.wl-kbptr = {
enable = mkEnableOption "enable wl-kbptr";
config = mkOption {
inherit (iniFormat) type;
default = {};
description = ''
Options to add to the {file}`config` file. See
<https://github.com/moverest/wl-kbptr/blob/main/config.example>
for options.
'';
example = {
general = {
home_row_keys = "abcd";
};
};
};
};
config = mkIf cfg.enable {
home = {
packages = [pkgs.wl-kbptr];
file."${configDir}/wl-kbptr/config" = mkIf (cfg.config != {}) {
source = iniFormat.generate "wl-kbptr-config" cfg.config;
};
};
};
}
+11 -4
View File
@@ -6,16 +6,23 @@
}:
with lib; let
cfg = config.home.dev.ai.claude;
jsonFormat = pkgs.formats.json {};
in {
options.home.dev.ai.claude.enable = mkEnableOption "Enables Claude-related packages";
options.home.dev.ai.claude = {
enable = mkEnableOption "Enables Claude-related packages";
mcpServers = mkOption {
inherit (jsonFormat) type;
default = {};
};
};
config = mkIf cfg.enable {
home.packages = let
claude-jj = pkgs.writeShellScriptBin "claude-jj" ''
${pkgs.claude-code}/bin/claude --append-system-prompt 'CRITICAL: This repository uses Jujutsu (jj), NOT git. Never use git commands. Use jj equivalents. See CLAUDE.md.' "$@"
${pkgs.claude-code}/bin/claude --append-system-prompt 'CRITICAL: This repository uses Jujutsu (jj), NOT git. Never use git commands. Use jj equivalents.' "$@"
'';
in [claude-jj];
in [claude-jj pkgs.sox];
programs.claude-code = {
inherit (cfg) enable;
inherit (cfg) enable mcpServers;
};
};
}
+21 -3
View File
@@ -6,18 +6,36 @@
}:
with lib; let
cfg = config.home.dev.ai;
jsonFormat = pkgs.formats.json {};
in {
imports = [
./claude.nix
./ollama.nix
./opencode.nix
];
options.home.dev.ai.enable = mkEnableOption "Enables AI features";
config.home = mkIf cfg.enable {
options.home.dev.ai = {
enable = mkEnableOption "Enables AI features";
mcpServers = mkOption {
inherit (jsonFormat) type;
default = {};
};
};
config = {
home = mkIf cfg.enable {
dev.ai = {
claude.enable = mkDefault cfg.enable;
claude = {
enable = mkDefault cfg.enable;
mcpServers = mkDefault cfg.mcpServers;
};
ollama.enable = mkDefault cfg.enable;
opencode.enable = mkDefault cfg.enable;
};
packages = [pkgs.lmstudio];
};
programs.mcp = mkIf (cfg.mcpServers != {}) {
enable = true;
servers = cfg.mcpServers;
};
};
}
+85
View File
@@ -0,0 +1,85 @@
{
config,
lib,
inputs,
pkgs,
...
}:
with lib; let
inherit (pkgs.stdenv.hostPlatform) system;
cfg = config.home.dev.ai.opencode;
defaultPackageCli = inputs.opencode.packages.${system}.opencode;
defaultPackageDesktop = inputs.opencode.packages.${system}.desktop;
corsList = domains: lists.remove "" (lists.forEach (strings.splitString "," domains) trim);
in {
options.home.dev.ai.opencode = {
enable = mkEnableOption "Enables OpenCode";
package = mkOption {
type = types.package;
default = defaultPackageCli;
description = "The CLI package for OpenCode";
};
settings = mkOption {
type = types.json;
default = {};
};
tui = mkOption {
type = types.json;
default = {};
};
desktop = {
enable = mkEnableOption "Enables the desktop app";
package = mkOption {
type = types.package;
default = defaultPackageDesktop;
description = "The desktop package for OpenCode";
};
};
web = {
enable = mkEnableOption "Enables OpenCode web";
extraArgs = mkOption {
type = types.listOf types.str;
default = [];
example = [
"--hostname"
"0.0.0.0"
];
};
cors = mkOption {
type = types.nullOr (types.either types.str types.path);
default = null;
example = "opencode.example.com,code.example.com";
description = ''
Either a string containing the domain allowed to connect to OpenCodes web instance, or a file containing the target value. The latter is useful when using secret management if you dont want to publicize the hostname of your OpenCode instance.
If you want to use multiple domains, you can separate them with a comma.
'';
};
mdns = {
enable = mkEnableOption "Enables mDNS with OpenCode";
hostname = mkOption {
type = types.nullOr types.str;
default = null;
example = "opencode.local";
};
};
};
};
config.programs.opencode = mkIf cfg.enable {
inherit (cfg) enable tui;
enableMcpIntegration = true;
extraPackages = with pkgs; [uv];
settings =
{
server = mkIf cfg.web.mdns.enable {
mdns = true;
mdnsDomain = mkIf (cfg.web.mdns.hostname != null) cfg.web.mdns.hostname;
cors = corsList cfg.web.cors;
};
}
// cfg.settings;
web = {
inherit (cfg.web) enable extraArgs;
};
};
}
+4
View File
@@ -48,6 +48,10 @@ in {
enable = mkDefault true;
inherit (cfg) name email editor;
signing.sshKey = mkDefault (cfg.publicKey.file or cfg.publicKey.content);
cz = {
enable = mkDefault true;
alias = mkDefault true;
};
};
};
}
+8 -3
View File
@@ -127,6 +127,14 @@ in {
"dist/"
];
signing = {
format =
if cfg.publicKeyFile != null
then "ssh"
else "openpgp";
key = cfg.publicKeyFile;
signByDefault = true;
};
settings = {
user = {
inherit (cfg) name email;
@@ -151,8 +159,6 @@ in {
renames = "copy";
interHunkContext = 10;
};
commit.gpgsign = cfg.publicKeyFile != null;
gpg.format = "ssh";
gpg.ssh.allowedSignersFile = "${config.home.homeDirectory}/.ssh/allowed_signers";
init.defaultBranch = "main";
pull.rebase = true;
@@ -168,7 +174,6 @@ in {
updateRefs = true;
};
help.autocorrect = "prompt";
user.signingkey = mkIf (cfg.publicKeyFile != null) cfg.publicKeyFile;
web.browser = mkIf (cfg.browser != null) cfg.browser;
sendemail = mkIf cfg.sendmail.enable {
smtpserver = cfg.sendmail.server;
+18 -1
View File
@@ -2,10 +2,13 @@
lib,
config,
pkgs,
inputs,
...
}:
with lib; let
inherit (pkgs.stdenv.hostPlatform) system;
cfg = config.home.dev.vcs.jj;
jj-cz = inputs.jj-cz.packages.${system}.default;
in {
options.home.dev.vcs.jj = {
enable = mkEnableOption "enables jj";
@@ -33,9 +36,21 @@ in {
description = "Path to the private SSH key for signing.";
};
};
cz = {
enable = mkEnableOption "Enables jj-cz";
alias = mkEnableOption "Enable `jj cz` as an alias to `jj-cz`";
};
# used in my shell .nix files
shellCompletion = mkOption {
description = "Enable Jujutsu shell completion";
type = types.bool;
default = true;
};
};
config.programs.jujutsu = mkIf cfg.enable {
config = mkIf cfg.enable {
home.packages = mkIf cfg.cz.enable [jj-cz];
programs.jujutsu = {
enable = true;
settings = {
user = {
@@ -59,6 +74,7 @@ in {
aliases = {
blame = ["file" "annotate"];
consume = ["squash" "--into" "@" "--from"];
cz = mkIf cfg.cz.alias ["util" "exec" "--" "${jj-cz}/bin/jj-cz"];
eject = ["squash" "--from" "@" "--into"];
d = ["diff"];
dm = ["desc" "-m"];
@@ -112,4 +128,5 @@ in {
remotes.origin.auto-track-bookmarks = "*";
};
};
};
}
+4
View File
@@ -11,6 +11,8 @@ in {
./mpd.nix
./mpd-mpris.nix
./mpv.nix
./ncmpcpp.nix
./streamlink.nix
];
options.home.media.fullDesktop = mkEnableOption "Enables everything";
@@ -18,5 +20,7 @@ in {
mopidy.enable = mkDefault cfg.fullDesktop;
mpd.enable = mkDefault (cfg.fullDesktop or cfg.mpd-mpris.enable);
mpv.enable = mkDefault cfg.fullDesktop;
ncmpcpp.enable = mkDefault config.home.media.mpd.enable;
streamlink.enable = mkDefault config.home.media.mpv.enable;
};
}
+5
View File
@@ -19,6 +19,11 @@ in {
bind_to_address "localhost"
auto_update "yes"
audio_output {
type "pipewire"
name "PipeWire"
}
audio_output {
type "fifo"
name "my_fifo"
+87
View File
@@ -0,0 +1,87 @@
{
lib,
config,
...
}:
with lib; let
cfg = config.home.media.ncmpcpp;
in {
options.home.media.ncmpcpp.enable = mkEnableOption "Enable ncmpcpp";
config.programs.ncmpcpp = let
musicDir = config.services.mpd.musicDirectory;
in
mkIf cfg.enable {
inherit (cfg) enable;
mpdMusicDir = musicDir;
settings = {
# directories
ncmpcpp_directory = "${config.home.homeDirectory}/.config/ncmpcpp";
lyrics_directory = "${musicDir}/.lyrics";
# MPD
mpd_host = "localhost";
mpd_port = 6600;
mpd_connection_timeout = 5;
mpd_crossfade_time = 0;
# music visualizer
visualizer_output_name = "my_fifo";
visualizer_in_stereo = "yes";
# visualizer_type = "spectrum";
visualizer_look = "+|";
visualizer_color = "blue, cyan, green, yellow, magenta, red";
system_encoding = "UTF-8";
# song format
song_list_format = "(6)[]{} (23)[red]{a} (26)[yellow]{t|f} (40)[green]{b} (4)[blue]{l}";
now_playing_prefix = "$b";
now_playing_suffix = "$8$/b";
# columns settings
song_columns_list_format = "(6)[]{} (23)[red]{a} (26)[yellow]{t|f} (40)[green]{b} (4)[blue]{l}";
playlist_shorten_total_times = "yes";
playlist_display_mode = "columns";
browser_display_mode = "columns";
search_engine_display_mode = "columns";
playlist_editor_display_mode = "columns";
autocenter_mode = "yes";
centered_cursor = "yes";
progressbar_look = "> ";
header_visibility = "no";
statusbar_visibility = "no";
titles_visibility = "no";
allow_for_physical_item_deletion = "yes";
lastfm_preferred_language = "en";
space_add_mode = "add_remove";
locked_screen_width_part = "50";
ask_for_locked_screen_width_part = "yes";
jump_to_now_playing_song_at_start = "yes";
ask_before_clearing_playlists = "yes";
clock_display_seconds = "no";
display_volume_level = "yes";
display_bitrate = "no";
display_remaining_time = "yes";
regular_expressions = "extended";
ignore_leading_the = "yes";
ignore_diacritics = "yes";
mouse_support = "no";
tags_separator = ";";
enable_window_title = "yes";
search_engine_default_search_mode = 1;
external_editor = "emacsclient -c";
use_console_editor = "yes";
# colours
colors_enabled = "yes";
volume_color = "default";
progressbar_color = "black";
progressbar_elapsed_color = "white";
statusbar_color = "white";
};
};
}
+17
View File
@@ -0,0 +1,17 @@
{
lib,
config,
pkgs,
...
}:
with lib; let
cfg = config.home.media.streamlink;
in {
options.home.media.streamlink.enable = mkEnableOption "Enable Streamlink";
config.programs.streamlink = mkIf cfg.enable {
enable = true;
settings = {
player = "${pkgs.mpv}/bin/mpv";
};
};
}
+2 -2
View File
@@ -4,8 +4,8 @@
...
}:
with lib; let
cfg = config.home.services.blanket;
cfg = config.home.myServices.blanket;
in {
options.home.services.blanket.enable = mkEnableOption "Enable blanket";
options.home.myServices.blanket.enable = mkEnableOption "Enable blanket";
config.services.blanket.enable = cfg.enable;
}
+7 -3
View File
@@ -4,7 +4,7 @@
...
}:
with lib; let
cfg = config.home.services;
cfg = config.home.myServices;
in {
imports = [
./blanket.nix
@@ -12,8 +12,12 @@ in {
./mpris-proxy.nix
./playerctld.nix
];
options.home.services.fullDesktop = mkEnableOption "Enable all modules";
config.home.services = {
options.home.myServices.fullDesktop = mkOption {
description = "Enable all modules";
type = types.bool;
default = config.home.fullDesktop;
};
config.home.myServices = {
blanket.enable = mkDefault cfg.fullDesktop;
mbsync.enable = mkDefault cfg.fullDesktop;
mpris-proxy.enable = mkDefault cfg.fullDesktop;
+2 -2
View File
@@ -4,9 +4,9 @@
...
}:
with lib; let
cfg = config.home.services.mbsync;
cfg = config.home.myServices.mbsync;
in {
options.home.services.mbsync = {
options.home.myServices.mbsync = {
enable = mkEnableOption "Enables mbsync";
service.enable = mkOption {
type = types.bool;
+2 -2
View File
@@ -4,8 +4,8 @@
...
}:
with lib; let
cfg = config.home.services.mpris-proxy;
cfg = config.home.myServices.mpris-proxy;
in {
options.home.services.mpris-proxy.enable = mkEnableOption "Enable MPRIS forwarding towards bluetooth and MIDI";
options.home.myServices.mpris-proxy.enable = mkEnableOption "Enable MPRIS forwarding towards bluetooth and MIDI";
config.services.mpris-proxy.enable = cfg.enable;
}
+2 -2
View File
@@ -4,8 +4,8 @@
...
}:
with lib; let
cfg = config.home.services.playerctld;
cfg = config.home.myServices.playerctld;
in {
options.home.services.playerctld.enable = mkEnableOption "Enable playerctld daemon";
options.home.myServices.playerctld.enable = mkEnableOption "Enable playerctld daemon";
config.services.playerctld.enable = cfg.enable;
}
+1
View File
@@ -36,6 +36,7 @@ in {
concatLines
[
(strings.optionalString cfg.eatIntegration ''[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/bash"'')
(strings.optionalString config.home.dev.vcs.jj.shellCompletion "source <(jj util completion bash)")
cfg.bashrcExtra
];
enableCompletion = cfg.autocompletion;
+4 -3
View File
@@ -78,6 +78,7 @@ in {
./fish.nix
./starship.nix
./tmux.nix
./zellij.nix
./zsh.nix
./zoxide.nix
];
@@ -96,15 +97,15 @@ in {
config.home.shell = {
enableShellIntegration = cfg.bash.enable or cfg.zsh.enable or cfg.fish.enable;
bash = {
aliases = cfg.aliases // defaultAliases;
aliases = defaultAliases // cfg.aliases;
enable = mkDefault cfg.fullDesktop;
};
fish = {
abbrs = cfg.aliases // defaultAliases;
abbrs = defaultAliases // cfg.aliases;
enable = mkDefault cfg.fullDesktop;
};
zsh = {
abbrs = cfg.aliases // defaultAliases;
abbrs = defaultAliases // cfg.aliases;
enable = mkDefault cfg.fullDesktop;
};
};
+1
View File
@@ -41,6 +41,7 @@ in {
__fish_default_command_not_found_handler $argv
end
''
(strings.optionalString config.home.dev.vcs.jj.shellCompletion "jj util completion fish | source")
cfg.extraShellInit
];
plugins = [
+51 -65
View File
@@ -6,8 +6,42 @@
}:
with lib; let
cfg = config.home.shell.tmux;
keyType = types.submodule {
options = {
key = mkOption {
type = types.str;
example = "C-b";
};
action = mkOption {
type = types.str;
example = "resize-pane -Z";
};
};
};
in {
options.home.shell.tmux.enable = mkEnableOption "Enable tmux";
options.home.shell.tmux = with types; {
enable = mkEnableOption "Enable tmux";
bind = mkOption {
type = attrsOf (listOf keyType);
default = {};
example = {
"prefix" = [
{
key = "C-r";
action = "resize-pane -R";
}
];
};
};
unbind = mkOption {
type = listOf (either str (attrsOf (listOf str)));
default = [];
};
extraConfig = mkOption {
type = types.lines;
default = "";
};
};
config.programs.tmux = mkIf cfg.enable {
inherit (cfg) enable;
baseIndex = 1;
@@ -25,71 +59,23 @@ in {
sensible
yank
];
extraConfig = ''
set-option -sa terminal-overrides ",xterm*:Tc"
extraConfig = let
generateBinds = concatLines (
mapAttrsToList (table: keys: concatMapStrings (key: "bind -T ${table} ${key.key} ${key.action}\n") keys) cfg.bind
);
generateUnbind =
concatMapStrings (
entry:
if builtins.isString entry
then "unbind ${entry}\n"
else concatStrings (mapAttrsToList (table: keys: concatMapStrings (key: "unbind -T ${table} ${key}\n") keys) entry)
)
cfg.unbind;
in ''
${cfg.extraConfig}
unbind C-b
bind-key -T prefix « select-window -p
bind-key -T prefix » select-window -n
bind-key -T prefix Tab switch-client -T windows
bind-key -T prefix w switch-client -T pane
bind-key -T prefix y switch-client -T copy-mode
bind-key -T pane / split-window -h -c "#{pane-current_path}"
bind-key -T pane - split-window -v -c "#{pane-current_path}"
bind-key -T pane c select-pane -L
bind-key -T pane t select-pane -D
bind-key -T pane s select-pane -U
bind-key -T pane r select-pane -R
bind-key -T pane f resize-pane -Z
bind-key -T pane . switch-client -T pane-resize
bind-key -T pane-resize c resize-pane -L 5\; switch-client -T pane-resize
bind-key -T pane-resize t resize-pane -D 5\; switch-client -T pane-resize
bind-key -T pane-resize s resize-pane -U 5\; switch-client -T pane-resize
bind-key -T pane-resize r resize-pane -R 5\; switch-client -T pane-resize
bind-key -T pane-resize C resize-pane -L\; switch-client -T pane-resize
bind-key -T pane-resize T resize-pane -D\; switch-client -T pane-resize
bind-key -T pane-resize S resize-pane -U\; switch-client -T pane-resize
bind-key -T pane-resize R resize-pane -R\; switch-client -T pane-resize
bind-key -T windows c new-window
bind-key -T windows n next-window
bind-key -T windows p previous-window
bind-key -T windows \" select-window -t :=1
bind-key -T windows « select-window -t :=2
bind-key -T windows » select-window -t :=3
bind-key -T windows ( select-window -t :=4
bind-key -T windows ) select-window -t :=5
bind-key -T windows @ select-window -t :=6
bind-key -T windows + select-window -t :=7
bind-key -T windows - select-window -t :=8
bind-key -T windows / select-window -t :=9
bind-key -T windows * select-window -t :=10
unbind -T copy-mode-vi H
unbind -T copy-mode-vi J
unbind -T copy-mode-vi K
unbind -T copy-mode-vi L
unbind -T copy-mode-vi h
unbind -T copy-mode-vi j
unbind -T copy-mode-vi k
unbind -T copy-mode-vi l
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
bind-key -T copy-mode-vi C send-keys -X top-line
bind-key -T copy-mode-vi J send-keys -X jump-to-backward
bind-key -T copy-mode-vi S send-keys -X scroll-up
bind-key -T copy-mode-vi R send-keys -X bottom-line
bind-key -T copy-mode-vi T send-keys -X scroll-down
bind-key -T copy-mode-vi c send-keys -X cursor-left
bind-key -T copy-mode-vi t send-keys -X cursor-down
bind-key -T copy-mode-vi s send-keys -X cursor-up
bind-key -T copy-mode-vi r send-keys -X cursor-right
${generateUnbind}
${generateBinds}
'';
};
}
+173
View File
@@ -0,0 +1,173 @@
{
pkgs,
lib,
config,
...
}:
with lib; let
cfg = config.home.shell.zellij;
isEmpty = list: list == [];
keybind = {
options = {
bind = mkOption {
type = types.either types.str (types.listOf types.str);
example = "Alt j";
description = "Value used as a string after `bind` in zellij config";
};
actions = mkOption {
type = with types; let
allowed = oneOf [int str];
in
attrsOf (either (listOf allowed) allowed);
default = {};
example = {
SwitchToMode = ["normal"];
SwitchFocus = [];
PaneNameInput = [0];
};
};
useUnlockFirst = mkOption {
type = types.bool;
default = false;
description = ''
Go back to locked mode after the actions are done.
Only works when `config.home.shell.zellij.useUnlockFirst` is true.
'';
};
};
};
convertBind = item: {
bind = let
useUnlockFirst = cfg.useUnlockFirst && item.useUnlockFirst;
children =
mapAttrsToList (action: args: let
actualArgs =
if isEmpty args
then {}
else {_args = lists.toList args;};
in {"${action}" = actualArgs;})
(item.actions
// (
if useUnlockFirst
then {SwitchToMode = ["locked"];}
else {}
));
in {
_args = lists.toList item.bind;
_children = children;
};
};
keybindsModule = {
options = mergeAttrsList (forEach [
"normal"
"locked"
"resize"
"pane"
"move"
"tab"
"scroll"
"search"
"entersearch"
"renametab"
"renamepane"
"session"
"tmux"
]
(x: {
"${x}" = mkOption {
type = types.listOf (types.submodule keybind);
default = [];
};
}));
};
makeKeybinds = keybinds: let
values =
attrsets.concatMapAttrs (
mode: binds:
if (isEmpty binds)
then {}
else {
"${mode}"._children = lists.forEach binds convertBind;
}
)
keybinds;
in
if values == {}
then {}
else {
keybinds = values;
};
in {
options.home.shell.zellij = let
jsonFormat = pkgs.formats.yaml {};
in {
enable = mkEnableOption "Enable Zellij";
clearDefaultKeybinds = mkEnableOption "Clear default keybinds";
settings = mkOption {
inherit (jsonFormat) type;
default = {};
};
layouts = mkOption {
inherit (jsonFormat) type;
default = {};
};
extraSettings = mkOption {
type = types.lines;
default = "";
description = ''
Extra configuration lines to add to `$XDG_CONFIG_HOME/zellij/config.kdl`
'';
};
useUnlockFirst = mkEnableOption "Use Unlock-First (non-colliding) behaviour by default";
plugins = mkOption {
type = types.listOf (types.submodule plugin);
default = {};
example = [
{name = "about";}
{
name = "filepicker";
location = "zellij:strider";
options = {
cwd = "/";
};
}
];
};
keybinds = mkOption {
type = types.submodule keybindsModule;
default = {};
example = {
pane = [
{
bind = "c";
actions = [
{
action = "SwitchToMode";
args = ["renamepane"];
}
{
action = "PaneNameInput";
args = [0];
}
];
}
];
};
};
};
config.programs.zellij = mkIf cfg.enable {
inherit (cfg) enable layouts;
extraConfig = cfg.extraSettings;
settings = let
resetKeybinds =
if cfg.clearDefaultKeybinds
then {
keybinds._props.clear-defaults = true;
}
else {};
keybinds = makeKeybinds cfg.keybinds;
in
cfg.settings // resetKeybinds // keybinds;
};
}
+5
View File
@@ -62,6 +62,11 @@ in {
zstyle ':fzf-tab:complete:cd:*' fzf-preview '${pkgs.eza}/bin/eza $realpath'
''
(strings.optionalString cfg.eatIntegration ''[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/zsh"'')
(strings.optionalString config.home.dev.vcs.jj.shellCompletion ''
autoload -U compinit
compinit
source <(jj util completion zsh)
'')
cfg.zshrcExtra
];
oh-my-zsh = {
File diff suppressed because it is too large Load Diff
+56
View File
@@ -0,0 +1,56 @@
{config, lib, ...}: {
home.dev.ai = {
enable = lib.mkDefault true;
opencode = {
tui = {
mouse = true;
theme = "nord";
attention = {
enabled = true;
notifications = true;
};
keybinds = {
leader = "ctrl+x";
"command_list" = "<leader><leader>";
};
};
settings = {
autoupdate = false;
provider = {
ollama = {
name = "Ollama (marpa)";
options.baseURL = "http://marpa:11434";
};
models = {
"qwen3.5:9b".name = "Qwen 3.5 Medium";
"gemma4:e4b".name = "Gemma E4B";
"qwen2.5-coder:1.5b-base".name = "Qwen 2.5 Coder Light";
};
};
permission = {
"*" = "ask";
glob = "allow";
grep = "allow";
skill = "allow";
question = "allow";
read = {
"*" = "allow";
"*.env" = "deny";
"*.env.*" = "deny";
"*.env.example" = "allow";
};
"doom_loop" = "deny";
};
formatter.nixfmt = {
command = ["nix" "fmt" "$FILE"];
extensions = [".nix"];
};
};
web = {
enable = true;
cors = config.sops.secrets."opencode/cors".path;
mdns.enable = true;
};
};
};
}
+89
View File
@@ -0,0 +1,89 @@
{pkgs, ...}: {
config.home.desktop.firefox = {
enable = true;
useZen = true;
tridactyl = {
enable = true;
preConfig = "sanitise tridactyllocal tridactylsync";
config = {
editorcmd = "emacsclient -c";
keyboardlayoutbase = "bepo";
keyboardlayoutforce = "true";
hintchars = "auiectsr";
smothscroll = "true";
};
extraConfig = ''
command openTwitchInMpv js -d@\
const url = new URL(document.location.href);\
const cleanUrl = url.hostname + url.pathname;\
const token = document.cookie.split("; ")\
.find(item => item.startsWith("auth-token="))?.split("=")[1];\
const auth = "--twitch-api-header=Authorization=OAuth " + token;\
const cmd = `${pkgs.streamlink}/bin/streamlink "''${auth}" "''${cleanUrl}" best`;\
tri.native.run(cmd)\
@
unbind h
unbind j
unbind k
unbind l
unbind c
unbind t
unbind s
unbind r
unbind H
unbind J
unbind K
unbind L
unbind C
unbind T
unbind S
unbind R
" === Bépo layout scrolling (ctsr = hjkl) ===
bind c scrollpx -300 0
bind t scrollline 5
bind s scrollline -5
bind r scrollpx 300 0
" Half/full page scroll (replacing C-f/C-b/C-d/C-u)
bind <C-t> scrollpage 0.5
bind <C-s> scrollpage -0.5
" === History navigation (C/R = H/L) ===
bind C back
bind R forward
" === Tab navigation ===
bind T tabnext
bind S tabprev
" === Displaced commands ===
" reload was on r move to h (bépo's 'replace' position)
bind h reload
bind H reloadhard
" tabopen was on t move to j (bépo's 'find char to' position)
bind j fillcmdline tabopen
unbind ^http(s?)://(www\.)?youtube\.com c
unbind ^http(s?)://(www\.)?youtube\.com f
unbind ^http(s?)://(www\.)?youtube\.com t
unbind ^http(s?)://(www\.)?youtube\.com l
unbind ^http(s?)://(www\.)?youtube\.com j
unbind ^http(s?)://twitch\.tv f
bind n findnext
bind N findnext -f
bind p findnext --reverse
bind P findnext -f --reverse
bind < urlincrement -1
bind > urlincrement 1
bind ypt openTwitchInMpv
bind ypv js tri.native.run(`mpv --ytdl-format="[height >=? 480]" --ontop --fs "''${document.location.href}"`)
bind ypm hint -JF e => tri.native.run(`mpv --ytdl-format="[height >=? 480]" --ontop --fs "''${e.href}"`)
'';
};
};
}
+22 -3
View File
@@ -5,9 +5,12 @@
...
}: {
imports = [
./ai.nix
./light-home.nix
./packages.nix
./email.nix
./firefox.nix
./tmux.nix
./wlr-which-key
../modules
];
@@ -54,6 +57,7 @@
emailPassword = {};
"mopidy/bandcamp" = {};
"mopidy/spotify" = {};
"opencode/cors" = {};
};
home = {
@@ -67,16 +71,30 @@
caelestia.enable = true;
spotify = {
enable = true;
spicetify.enable = false;
spicetify.enable = true;
};
wl-kbptr = {
enable = true;
config = {
general = {
# first eight chars to select areas, last three chars
# for left, right, middle click
# First eigh chars to select areas: auiectsr
# last three chars for left, right, and middle click: tsr
home_row_keys = "auiectsrtsr";
modes = "tile,bisect,click";
};
};
};
};
dev = {
ai.claude.enable = true;
editors.emacs.package = emacsPackage;
vcs.jj.signing.enable = true;
};
fullDesktop = true;
file."${config.home.homeDirectory}/.ssh/allowed_signers" = {
file = {
".XCompose".source = ./XCompose;
"${config.home.homeDirectory}/.ssh/allowed_signers" = {
enable = true;
text = lib.strings.join "\n" (
map (file: let
@@ -88,6 +106,7 @@
);
};
};
};
manual = {
html.enable = true;
+1 -1
View File
@@ -10,7 +10,7 @@
desktop.hyprland.host = "marpa";
phundrak.sshKey.content = builtins.readFile ../keys/id_marpa.pub;
};
programs.caelestia.settings.bar = {
programs.caelestia.settings.bar.status = {
showBattery = false;
showWifi = false;
};
+9
View File
@@ -0,0 +1,9 @@
{config, ...}: {
imports = [../home.nix];
home = {
cli.nh.flake = "${config.home.homeDirectory}/.dotfiles";
desktop.hyprland.host = "gampo";
phundrak.sshKey.content = builtins.readFile ../keys/id_pinetab2.pub;
};
programs.caelestia.settings.bar.persistent = false;
}
+14
View File
@@ -0,0 +1,14 @@
{config, ...}: {
import = [../home.nix];
home = {
cli.nh.flake = "${config.home.homeDirectory}/.dotfiles";
desktop.hyprland.enable = false;
phundrak.sshKey.content = builtins.readFile ../keys/id_steamdeck.pub;
dev.ai = {
enable = true;
ollama.enable = false;
};
stateVersion = "25.11";
};
programs.caelestia.enable = false;
}
+1
View File
@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJCMgI5WDOKVUe6rUrOG4VS+hoUUVrAb1UhOECawUkrv Lucien Cartier-Tilet <lucien@phundrak.com>
+1
View File
@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJkXdss1nRdBcl/8bjDssPaS68ozWw8sP98OsO+7iqi1 lucien@phundrak.com
+8 -6
View File
@@ -7,9 +7,13 @@
with lib; let
cfg = config.home.phundrak;
in {
imports = [../modules];
imports = [../modules ./zellij.nix];
options.home.phundrak = {
username = mkOption {
default = "phundrak";
type = types.str;
};
sshKey = {
content = mkOption {
type = types.nullOr types.str;
@@ -32,9 +36,7 @@ in {
secrets."ssh/hosts" = {};
age = {
# automatically import user SSH keys as age keys
sshKeyPaths = [
"${config.home.homeDirectory}/.ssh/id_ed25519"
];
sshKeyPaths = ["${config.home.homeDirectory}/.ssh/id_ed25519"];
# this will use an age key that is expected to already be in the filesystem
keyFile = "${config.home.homeDirectory}/.local/sops-nix/key.txt";
# generate a new key if the key specified above does not exist
@@ -43,8 +45,8 @@ in {
};
home = {
username = "phundrak";
homeDirectory = "/home/phundrak";
username = cfg.username;
homeDirectory = "/home/${cfg.username}";
packages = [pkgs.tree pkgs.ncdu];
preferXdgDirectories = true;
+3 -7
View File
@@ -7,9 +7,7 @@
with lib; let
inherit (pkgs.stdenv.hostPlatform) system;
handy = pkgs.callPackage ../../packages/handy.nix {};
inkdrop = pkgs.callPackage ../../packages/inkdrop.nix {};
pumo-system-info = inputs.pumo-system-info.packages.${system}.default;
zen = inputs.zen-browser.packages.${system}.default;
in {
programs.bun.enable = true;
home.packages = with pkgs; [
@@ -33,17 +31,16 @@ in {
audacity
plexamp
plex-desktop
spicetify-cli
pavucontrol # Volume control
# Social
vesktop # Discord alternative that works well with wayland
element-desktop
signal-desktop
# Misc
bitwarden-desktop
# gplates
kicad-small
qgis
handy
libnotify
nextcloud-client
@@ -52,7 +49,7 @@ in {
scrcpy
syncthing
watchmate
zen
chatterino7
# Games
atlauncher
@@ -73,7 +70,6 @@ in {
# Dev
dbeaver-bin
devenv
inkdrop
nodejs
sqlite
tectonic # better LaTeX engine
+210
View File
@@ -0,0 +1,210 @@
{
home.shell.tmux = {
enable = true;
extraConfig = "set-option -sa terminal-overrides \",xterm*:Tc\"";
unbind = [
"C-b"
{"copy-mode-vi" = ["H" "J" "K" "L" "h" "j" "k" "l"];}
];
bind = {
prefix = [
{
key = "«";
action = "select-window -p";
}
{
key = "»";
action = "select-window -n";
}
{
key = "Tab";
action = "switch-client -T windows";
}
{
key = "w";
action = "switch-client -T pane";
}
{
key = "y";
action = "switch-client -T copy-mode";
}
];
pane = [
{
key = "/";
action = "split-window -h -c \"#{pane-current_path}\"";
}
{
key = "-";
action = "split-window -v -c \"#{pane-current_path}\"";
}
{
key = "c";
action = "select-pane -L";
}
{
key = "t";
action = "select-pane -D";
}
{
key = "s";
action = "select-pane -U";
}
{
key = "r";
action = "select-pane -R";
}
{
key = "f";
action = "resize-pane -Z";
}
{
key = ".";
action = "switch-client -T pane-resize";
}
];
"pane-resize" = [
{
key = "c";
action = "resize-pane -L 5\\; switch-client -T pane-resize";
}
{
key = "t";
action = "resize-pane -D 5\\; switch-client -T pane-resize";
}
{
key = "s";
action = "resize-pane -U 5\\; switch-client -T pane-resize";
}
{
key = "r";
action = "resize-pane -R 5\\; switch-client -T pane-resize";
}
{
key = "C";
action = "resize-pane -L\\; switch-client -T pane-resize";
}
{
key = "T";
action = "resize-pane -D\\; switch-client -T pane-resize";
}
{
key = "S";
action = "resize-pane -U\\; switch-client -T pane-resize";
}
{
key = "R";
action = "resize-pane -R\\; switch-client -T pane-resize";
}
];
windows = [
{
key = "c";
action = "new-window";
}
{
key = "n";
action = "next-window";
}
{
key = "p";
action = "previous-window";
}
{
key = "r";
action = "command-prompt \"rename-window '%%'\"";
}
{
key = "\\\"";
action = "select-window -t :=1";
}
{
key = "«";
action = "select-window -t :=2";
}
{
key = "»";
action = "select-window -t :=3";
}
{
key = "(";
action = "select-window -t :=4";
}
{
key = ")";
action = "select-window -t :=5";
}
{
key = "@";
action = "select-window -t :=6";
}
{
key = "+";
action = "select-window -t :=7";
}
{
key = "-";
action = "select-window -t :=8";
}
{
key = "/";
action = "select-window -t :=9";
}
{
key = "*";
action = "select-window -t :=10";
}
];
"copy-mode-vi" = [
{
key = "v";
action = "send-keys -X begin-selection";
}
{
key = "C-v";
action = "send-keys -X rectangle-toggle";
}
{
key = "y";
action = "send-keys -X copy-selection-and-cancel";
}
{
key = "C";
action = "send-keys -X top-line";
}
{
key = "J";
action = "send-keys -X jump-to-backward";
}
{
key = "S";
action = "send-keys -X scroll-up";
}
{
key = "R";
action = "send-keys -X bottom-line";
}
{
key = "T";
action = "send-keys -X scroll-down";
}
{
key = "c";
action = "send-keys -X cursor-left";
}
{
key = "t";
action = "send-keys -X cursor-down";
}
{
key = "s";
action = "send-keys -X cursor-up";
}
{
key = "r";
action = "send-keys -X cursor-right";
}
];
};
};
}
+19 -3
View File
@@ -1,6 +1,7 @@
{
config,
pkgs,
lib,
...
}: {
config.home.desktop.wlr-which-key.settings = {
@@ -25,9 +26,11 @@
focus-urgent = import ./focus-urgent.nix {inherit pkgs;};
fullscreen = import ./fullscreen.nix {inherit pkgs;};
logout = import ./logout.nix {inherit pkgs;};
ytplay = import ../../modules/cli/scripts/ytplay.nix {inherit pkgs;};
app-launcher = import ../../modules/cli/scripts/launcher.nix {inherit pkgs;};
plock = import ../../modules/cli/scripts/plock.nix {inherit pkgs;};
in [
ytplay = import ../../modules/cli/scripts/ytplay.nix {inherit pkgs;};
in
[
{
key = "a";
desc = "Apps";
@@ -94,7 +97,7 @@
{
key = "r";
desc = "App Menu";
cmd = "rofi -show drun";
cmd = "${app-launcher}/bin/app-launcher";
}
{
key = "s";
@@ -238,6 +241,19 @@
}
];
}
]
++ lib.lists.optionals config.home.desktop.wl-kbptr.enable [
{
key = "m";
desc = "Mouse Warp";
cmd = "wl-kbptr";
}
{
key = "M";
desc = "Mouse click";
# cmd = "wl-kbptr -o modes=floating,click";
cmd = "wl-kbptr -o modes=floating,click -o mode_floating.source=detect";
}
];
};
}
+264
View File
@@ -0,0 +1,264 @@
{lib, ...}: {
home.shell.zellij = with lib; {
enable = true;
clearDefaultKeybinds = true;
useUnlockFirst = true;
settings.copy_on_select = true;
extraSettings = ''
plugins {
about location="zellij:about"
compact-bar location="zellij:compact-bar"
configuration location="zellij:configuration"
filepicker location="zellij:strider" {
cwd "/"
}
plugin-manager location="zellij:plugin-manager"
session-manager location="zellij:session-manager"
status-bar location="zellij:status-bar"
strider location="zellij:strider"
tab-bar location="zellij:tab-bar"
welcome-screen location="zellij:session-manager" {
welcome_screen true
}
}
'';
keybinds = let
# bépo layout
left = ["c" "Left"];
down = ["t" "Down"];
up = ["s" "Up"];
right = ["r" "Right"];
numRow = ["\"" "«" "»" "(" ")" "@" "+" "-" "/" "*"];
in {
locked = [
{
bind = "Ctrl Alt g";
actions = {SwitchToMode = "normal";};
}
];
pane = [
{
bind = left;
actions = {MoveFocus = "Left";};
}
{
bind = down;
actions = {MoveFocus = "Down";};
}
{
bind = up;
actions = {MoveFocus = "Up";};
}
{
bind = right;
actions = {MoveFocus = "Right";};
}
{
bind = "n";
actions = {NewPane = [];};
useUnlockFirst = true;
}
{
bind = "T";
actions = {NewPane = "Down";};
useUnlockFirst = true;
}
{
bind = "R";
actions = {NewPane = "Right";};
useUnlockFirst = true;
}
{
bind = "S";
actions = {NewPane = "stacked";};
useUnlockFirst = true;
}
{
bind = "N";
actions = {SwitchToMode = "normal";};
}
{
bind = "e";
actions = {TogglePaneEmbedOrFloating = [];};
useUnlockFirst = true;
}
{
bind = "i";
actions = {TogglePanePinned = [];};
}
{
bind = "f";
actions = {ToggleFocusFullscreen = [];};
useUnlockFirst = true;
}
{
bind = "F";
actions = {ToggleFloatingPanes = [];};
}
{
bind = "q";
actions = {CloseFocus = [];};
useUnlockFirst = true;
}
{
bind = "p";
actions = {SwitchToMode = "normal";};
}
{
bind = "P";
actions = {
SwitchToMode = "renamepane";
PaneNameInput = 0;
};
}
{
bind = "z";
actions = {TogglePaneFrames = [];};
useUnlockFirst = true;
}
{
bind = "tab";
actions = {SwitchFocus = [];};
}
];
resize = [
{
bind = "n";
actions = {SwitchToMode = "locked";};
}
{
bind = left;
actions = {Resize = "Increase Left";};
}
{
bind = down;
actions = {Resize = "Increase Down";};
}
{
bind = up;
actions = {Resize = "Increase Up";};
}
{
bind = right;
actions = {Resize = "Increase Right";};
}
{
bind = "C";
actions = {Resize = "Decrease Left";};
}
{
bind = "T";
actions = {Resize = "Decrease Down";};
}
{
bind = "S";
actions = {Resize = "Decrease Up";};
}
{
bind = "R";
actions = {Resize = "Decrease Right";};
}
{
bind = "+";
actions = {Resize = "Increase";};
}
{
bind = "-";
actions = {Resize = "Decrease";};
}
];
move = [
{
bind = left;
actions = {MovePane = "left";};
}
{
bind = down;
actions = {MovePane = "down";};
}
{
bind = up;
actions = {MovePane = "up";};
}
{
bind = right;
actions = {MovePane = "right";};
}
{
bind = "m";
actions = {SwitchToMode = "normal";};
}
{
bind = ["n" "tab"];
actions = {MovePane = [];};
}
{
bind = "p";
actions = {MovePaneBackwards = [];};
}
];
tab =
[
{
bind = left ++ up;
actions = {GoToPreviousTab = [];};
}
{
bind = down ++ right;
actions = {GoToNextTab = [];};
}
{
bind = "[";
actions = {BreakPaneLeft = [];};
useUnlockFirst = true;
}
{
bind = "]";
actions = {BreakPaneRight = [];};
useUnlockFirst = true;
}
{
bind = "b";
actions = {BreakPane = [];};
useUnlockFirst = true;
}
{
bind = "n";
actions = {NewTab = [];};
useUnlockFirst = true;
}
{
bind = "R";
actions = {
SwitchToMode = "renametab";
TabNameInput = 0;
};
}
{
bind = "s";
actions = {ToggleActiveSyncTab = [];};
useUnlockFirst = true;
}
{
bind = "T";
actions = {SwitchToMode = "normal";};
}
{
bind = "x";
actions = {CloseTab = [];};
useUnlockFirst = true;
}
{
bind = "tab";
actions = {ToggleTab = [];};
}
]
++ (lists.imap1 (i: key: {
bind = key;
actions = {GoToTab = i;};
useUnlockFirst = true;
})
numRow);
};
};
}
+29
View File
@@ -0,0 +1,29 @@
{
nixpkgs,
rockchip,
additionalModules,
specialArgs,
...
}: buildPlatform: variant:
nixpkgs.lib.nixosSystem {
system = "aarch64-linux";
inherit specialArgs;
modules =
[
rockchip.nixosModules.sdImageRockchip
rockchip.nixosModules.dtOverlayPCIeFix
rockchip.nixosModules.noZFS
../hosts/pinetab2
variant
{
rockchip.uBoot = rockchip.packages.${buildPlatform}.uBootPineTab2;
boot.kernelPackages = rockchip.legacyPackages.${buildPlatform}.kernel_linux_7_0_pinetab_unstable;
hardware.firmware = [rockchip.packages.aarch64-linux.bes2600];
nixpkgs.config.allowUnfreePredicate = pkg:
builtins.elem (nixpkgs.lib.getName pkg) [
"bes2600-firmware"
];
}
]
++ additionalModules;
}