Compare commits

..

91 Commits

Author SHA1 Message Date
phundrak 53dfdb1cc0 feat(pumo): add config for phone pumo 2026-06-07 18:28:59 +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
phundrak 79e3156bb3 feat(copyparty): create copyparty service for elcafe 2026-03-07 18:50:58 +01:00
phundrak 5e8db88008 chore(packages): update signal desktop name and remove gplates 2026-03-07 18:03:33 +01:00
phundrak ff39f983f9 chore(mpv): update mpv script name 2026-03-07 18:03:33 +01:00
phundrak 6088946973 chore(handy): update Handy from 0.7.6 to 0.7.7 2026-03-07 18:03:33 +01:00
phundrak 0f213ed01f chore(flake): update flake lockfile 2026-03-07 18:03:33 +01:00
phundrak 097ce13793 feat(packages): package inkdrop 2026-02-26 19:42:40 +01:00
phundrak efa9be4314 fix(sunshine): automatically set screen resolution for sunshine 2026-02-24 13:04:10 +01:00
phundrak 7223b63fca chore(flake): update flakes 2026-02-24 01:46:26 +01:00
phundrak 32b3c81b46 feat(handy): package Handy for Nix 2026-02-22 19:31:27 +01:00
phundrak 5e934f87a3 feat(spotify): disable spicetify for now 2026-02-22 19:31:27 +01:00
phundrak 0927313f6d fix(hyprland): fix cursor size on XWayland windows 2026-02-22 19:31:27 +01:00
phundrak 8fa1d2e111 style: formatting 2026-02-22 19:31:27 +01:00
phundrak 54e8beecfd feat(caelestia): improve configuration for caelestia 2026-02-22 19:31:27 +01:00
phundrak 21e85fc77b feat: improve GPU support for modules 2026-02-22 19:31:27 +01:00
phundrak b4a57a8f64 feat: improve v4l2loopback support 2026-02-22 19:31:23 +01:00
phundrak b8ed5984df feat(scripts): enable plock to use Caelestia’s lock screen
This commit also adds the wlr-which-key shortcut for plock.
2026-02-22 18:01:45 +01:00
phundrak a35d536b75 feat: add possibility to use fingerprint reader 2026-02-22 18:01:42 +01:00
phundrak 0815dd3a30 feat(elcafe): add creug user 2026-02-13 09:08:21 +01:00
phundrak 35541ea5ae feat(elcafe): add new server configuration 2026-02-08 16:45:58 +01:00
phundrak e90fb1fa0d feat(user/email): add Eittlandic translation to email signature 2026-02-08 00:19:15 +01:00
phundrak c8fd643085 feat(user/jj): improve jj configuration 2026-02-08 00:18:53 +01:00
phundrak 5d9efbb651 feat(shell): improve shell completion 2026-02-08 00:18:30 +01:00
phundrak 582460d8f4 docs(README): nicer Readme header 2026-02-05 20:51:33 +01:00
phundrak 76d1a33a78 feat: prefer XDG directories 2026-01-25 05:03:53 +01:00
phundrak f5fa1683b4 feat(emacs): improve configuration 2026-01-25 05:03:30 +01:00
phundrak 36d5c90017 fix(gampo): early video drivers load 2026-01-25 05:03:13 +01:00
phundrak 5c9c3d199b fix(hosts): temporarily fix hosts file issue 2026-01-25 05:03:13 +01:00
phundrak be51aa7cc5 feat(theme): better theming 2026-01-25 05:03:09 +01:00
phundrak f6fe7945bb chore(flakes): update flakes lockfile 2026-01-24 20:08:19 +01:00
phundrak f0398f4d9c feat(spotify): use Spicetify with Spotify 2026-01-24 13:24:12 +01:00
phundrak a1842b22db feat(starship): remove most git info in jj repos 2026-01-24 13:23:38 +01:00
phundrak 615909867e feat(AI): replace opencode with LM Studio 2026-01-24 12:57:37 +01:00
phundrak a632ebbf07 fix(wlr-which-key): add forgotten logout command 2026-01-24 12:57:04 +01:00
phundrak 51f2c77c02 feat(hyprland): adapt to new Hyprland config and caelestia 2026-01-24 12:56:33 +01:00
phundrak e0226af16a feat(marpa): auto login on Marpa’s startup 2026-01-24 12:56:08 +01:00
phundrak 7a1465bc3b refactor: some code cleanup 2026-01-24 12:55:52 +01:00
phundrak 87a7fc00fe feat(secrets): update secrets 2026-01-24 12:54:48 +01:00
phundrak c6b3abd1a7 chore(flakes): update flake lockfile 2026-01-24 12:54:13 +01:00
phundrak 32c57b0671 feat: switch frow waybar to quickshell and caelestia 2025-12-24 19:22:58 +01:00
phundrak 22bd5c7b2a feat(packages): remove some GNOME stuff, add bun and nixfmt 2025-12-22 01:50:07 +01:00
phundrak 813fc3026c feat(shell): better handling of additional shell aliases/abbreviations 2025-12-22 01:49:21 +01:00
phundrak 5497d6df51 fix(AI): remove claude desktop, fixes for ollama 2025-12-22 01:48:48 +01:00
phundrak 1a43dcdad4 fix(gpg): fix password requests when signing with SSH keys 2025-12-22 01:42:22 +01:00
phundrak 93f009852f feat(tailscale): better defaults 2025-12-22 01:38:20 +01:00
phundrak 9071957b4c feat(hosts): add NaroMk3 to the existing hosts 2025-12-07 13:31:57 +01:00
120 changed files with 5444 additions and 1010 deletions
+1 -5
View File
@@ -1,11 +1,7 @@
# -*- mode: sh; -*- # -*- 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.nix
watch_file flake.lock watch_file flake.lock
if ! use flake . --no-pure-eval if ! use flake . --no-pure-eval
then 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 fi
+8
View File
@@ -1,10 +1,14 @@
keys: keys:
- &elcafe age1tkywsvddjj6r6ukuqgz9aql92jfx85rz57dhmkkndysh6yx6p5rs0zj0qr
- &elcafe-host age17p69ktg7yfzgdsk00f32mupe4n4fevdpw2wsv7ft30yvpeseau6s7t0zdg
- &gampo age1ajemtm502nn2n4q7v4j8meyd5mxtcqngkkedxq2pqzuwu78zp93qnw8q48 - &gampo age1ajemtm502nn2n4q7v4j8meyd5mxtcqngkkedxq2pqzuwu78zp93qnw8q48
- &gampo-host age197lfdanym647wdaz9uy8hrfqjwj9fs8rm7vs3fsrctceu8mr9gms2jedhz - &gampo-host age197lfdanym647wdaz9uy8hrfqjwj9fs8rm7vs3fsrctceu8mr9gms2jedhz
- &marpa age17pn6suvz2f7zmrm9zxj5hr0putvcvdamqxqt7ewhncgg6ccgmp2qr00xm2 - &marpa age17pn6suvz2f7zmrm9zxj5hr0putvcvdamqxqt7ewhncgg6ccgmp2qr00xm2
- &marpa-host age1cnnpnglkvgw5ffv8qpgwpqvj203lh4uwt698y9mxjwklxt8nysmsa8hepn - &marpa-host age1cnnpnglkvgw5ffv8qpgwpqvj203lh4uwt698y9mxjwklxt8nysmsa8hepn
- &tilo age1g68hxv73llkyc7etzh499ztcrt93pwawy0n8p93px4taqu58mehsp88vjq - &tilo age1g68hxv73llkyc7etzh499ztcrt93pwawy0n8p93px4taqu58mehsp88vjq
- &tilo-host age1awytvphvty4f9wmdn86xnjg9kgetqjx8qlwj5d2882t4fyyzy58s3vg5k4 - &tilo-host age1awytvphvty4f9wmdn86xnjg9kgetqjx8qlwj5d2882t4fyyzy58s3vg5k4
- &NaroMk3 age1erkn7dd022e90ktyj66aux9j9xvl0uzd6ru5cmrjsvcm5rtr5pfs7q6k9h
- &NaroMk3-host age16crkeglm3j3f6rveylytuerptjf9mwtv3hl89ywkmnnvdkntfchsuvrsk5
creation_rules: creation_rules:
- path_regex: secrets/secrets.yaml$ - path_regex: secrets/secrets.yaml$
key_groups: key_groups:
@@ -15,3 +19,7 @@ creation_rules:
- *marpa-host - *marpa-host
- *tilo - *tilo
- *tilo-host - *tilo-host
- *NaroMk3
- *NaroMk3-host
- *elcafe
- *elcafe-host
+14 -3
View File
@@ -1,6 +1,18 @@
# NixOS Configuration <h1 align="center">NixOS Configuration</h1>
<div align="center">
<strong>
Personal NixOS configuration for my machines, using Nix Flakes for reproducible and shareable setups. Personal NixOS configuration for my machines, using Nix Flakes for reproducible and shareable setups.
</strong>
</div>
<br/>
<div align="center">
<!-- Wakapi -->
<img alt="Coding Time Badge" src="https://clock.phundrak.com/api/badge/phundrak/interval:any/project:.dotfiles">
<!-- Emacs -->
<a href="https://www.gnu.org/software/emacs/"><img src="https://img.shields.io/badge/Emacs-30.2-blueviolet.svg?style=flat-square&logo=GNU%20Emacs&logoColor=white" /></a>
</div>
## Repository Structure ## Repository Structure
@@ -8,7 +20,6 @@ Personal NixOS configuration for my machines, using Nix Flakes for reproducible
- **hosts/**: Contains the host-specific NixOS configurations. - **hosts/**: Contains the host-specific NixOS configurations.
- **system/**: Holds system-wide configuration modules that can be shared across different hosts. This includes things like boot settings, desktop environments, hardware configurations, networking, packages, security, and system services. - **system/**: Holds system-wide configuration modules that can be shared across different hosts. This includes things like boot settings, desktop environments, hardware configurations, networking, packages, security, and system services.
- **users/**: Manages user-specific configurations. It's split into `modules` for reusable home-manager configurations and `phundrak` for my personal configuration. - **users/**: Manages user-specific configurations. It's split into `modules` for reusable home-manager configurations and `phundrak` for my personal configuration.
- **keys/**: Public keys for various machines.
- **secrets/**: Encrypted secrets managed with `sops-nix`. - **secrets/**: Encrypted secrets managed with `sops-nix`.
## Usage ## Usage
Generated
+342 -167
View File
@@ -1,39 +1,77 @@
{ {
"nodes": { "nodes": {
"cachix": { "alejandra": {
"inputs": { "inputs": {
"devenv": [ "fenix": "fenix",
"devenv" "flakeCompat": "flakeCompat",
],
"flake-compat": [
"devenv",
"flake-compat"
],
"git-hooks": [
"devenv",
"git-hooks"
],
"nixpkgs": [ "nixpkgs": [
"devenv", "jj-cz",
"nixpkgs" "nixpkgs"
] ]
}, },
"locked": { "locked": {
"lastModified": 1760971495, "lastModified": 1744324181,
"narHash": "sha256-IwnNtbNVrlZIHh7h4Wz6VP0Furxg9Hh0ycighvL5cZc=", "narHash": "sha256-Oi1n2ncF4/AWeY6X55o2FddIRICokbciqFYK64XorYk=",
"owner": "cachix", "owner": "kamadorueda",
"repo": "cachix", "repo": "alejandra",
"rev": "c5bfd933d1033672f51a863c47303fc0e093c2d2", "rev": "3e2a85506627062313e131bf8a85315f3387c8e0",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "cachix", "owner": "kamadorueda",
"ref": "latest", "ref": "4.0.0",
"repo": "cachix", "repo": "alejandra",
"type": "github" "type": "github"
} }
}, },
"claude-desktop": { "caelestia-cli": {
"inputs": {
"caelestia-shell": [
"caelestia-shell"
],
"nixpkgs": [
"caelestia-shell",
"nixpkgs"
]
},
"locked": {
"lastModified": 1780375472,
"narHash": "sha256-Q8RAJoYlakA6B2I5DVcuxzNbhCNU1nnIjqQZYP1KGrM=",
"owner": "caelestia-dots",
"repo": "cli",
"rev": "d1c8c8fc09738d1b40576e97c274b4a11a2e0ac7",
"type": "github"
},
"original": {
"owner": "caelestia-dots",
"repo": "cli",
"type": "github"
}
},
"caelestia-shell": {
"inputs": {
"caelestia-cli": "caelestia-cli",
"m3shapes": "m3shapes",
"nixpkgs": [
"nixpkgs"
],
"quickshell": "quickshell"
},
"locked": {
"lastModified": 1780845600,
"narHash": "sha256-cPAXoIsoPd9d8Mqh1JEZcHFgndAiIe2/z0ZAlgjjKMw=",
"owner": "caelestia-dots",
"repo": "shell",
"rev": "8f49fdb4057c65fb7e591cdc5195d28086e56eb7",
"type": "github"
},
"original": {
"owner": "caelestia-dots",
"repo": "shell",
"type": "github"
}
},
"copyparty": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": [ "nixpkgs": [
@@ -41,82 +79,58 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764098187, "lastModified": 1779822991,
"narHash": "sha256-H6JjWXhKqxZ8QLMoqndZx9e5x0Sv5AiipSmqvIxIbgo=", "narHash": "sha256-r6e4eHEyQJEDhT6gkW3B9+OgB0pZebw2+du4bvN3vww=",
"owner": "k3d3", "owner": "9001",
"repo": "claude-desktop-linux-flake", "repo": "copyparty",
"rev": "b2b040cb68231d2118906507d9cc8fd181ca6308", "rev": "6e75faa62349a59f4df328a4939ba8626d89ee1a",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "k3d3", "owner": "9001",
"repo": "claude-desktop-linux-flake", "repo": "copyparty",
"type": "github" "type": "github"
} }
}, },
"devenv": { "fenix": {
"inputs": { "inputs": {
"cachix": "cachix",
"flake-compat": "flake-compat",
"flake-parts": "flake-parts",
"git-hooks": "git-hooks",
"nix": "nix",
"nixpkgs": [ "nixpkgs": [
"jj-cz",
"alejandra",
"nixpkgs" "nixpkgs"
] ],
"rust-analyzer-src": "rust-analyzer-src"
}, },
"locked": { "locked": {
"lastModified": 1764669403, "lastModified": 1730615655,
"narHash": "sha256-aJCOp0CV/9KIR2LTwSbZZN3j9Avg7umYyaqDFPoOVhI=", "narHash": "sha256-2HBR3zLn57LXKNRtxBb+O+uDqHM4n0pz51rPayMl4cg=",
"owner": "cachix", "owner": "nix-community",
"repo": "devenv", "repo": "fenix",
"rev": "3f2d25e7af748127da0571266054575dd8fec5ab", "rev": "efeb50e2535b17ffd4a135e6e3e5fd60a525180c",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "cachix", "owner": "nix-community",
"repo": "devenv", "repo": "fenix",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1761588595,
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
"devenv",
"nixpkgs"
]
},
"locked": {
"lastModified": 1760948891,
"narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github" "type": "github"
} }
}, },
"flake-utils": { "flake-utils": {
"locked": {
"lastModified": 1678901627,
"narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": { "inputs": {
"systems": "systems" "systems": "systems"
}, },
@@ -134,7 +148,7 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils_2": { "flake-utils_3": {
"inputs": { "inputs": {
"systems": "systems_2" "systems": "systems_2"
}, },
@@ -152,51 +166,37 @@
"type": "github" "type": "github"
} }
}, },
"git-hooks": { "flake-utils_4": {
"inputs": { "inputs": {
"flake-compat": [ "systems": "systems_3"
"devenv",
"flake-compat"
],
"gitignore": "gitignore",
"nixpkgs": [
"devenv",
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1760663237, "lastModified": 1731533236,
"narHash": "sha256-BflA6U4AM1bzuRMR8QqzPXqh8sWVCNDzOdsxXEguJIc=", "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "cachix", "owner": "numtide",
"repo": "git-hooks.nix", "repo": "flake-utils",
"rev": "ca5b894d3e3e151ffc1db040b6ce4dcc75d31c37", "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "cachix", "owner": "numtide",
"repo": "git-hooks.nix", "repo": "flake-utils",
"type": "github" "type": "github"
} }
}, },
"gitignore": { "flakeCompat": {
"inputs": { "flake": false,
"nixpkgs": [
"devenv",
"git-hooks",
"nixpkgs"
]
},
"locked": { "locked": {
"lastModified": 1709087332, "lastModified": 1696426674,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "hercules-ci", "owner": "edolstra",
"repo": "gitignore.nix", "repo": "flake-compat",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394", "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "hercules-ci", "owner": "edolstra",
"repo": "gitignore.nix", "repo": "flake-compat",
"type": "github" "type": "github"
} }
}, },
@@ -207,11 +207,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764780230, "lastModified": 1780679734,
"narHash": "sha256-/hLZoLxzr2jwMStuUofB6PZm2eE3kpw91WObm66vPUs=", "narHash": "sha256-KmRNvpNOb7QEORa06bVgjW9kITcx0VhsI7w0vhmZyD8=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "af324afa72de6d23162f0cdcb0716afe6e626683", "rev": "b2b7db486e06e098711dc291bb25db82850e1d16",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -220,43 +220,60 @@
"type": "github" "type": "github"
} }
}, },
"nix": { "jj-cz": {
"inputs": { "inputs": {
"flake-compat": [ "alejandra": "alejandra",
"devenv", "flake-utils": "flake-utils_3",
"flake-compat"
],
"flake-parts": [
"devenv",
"flake-parts"
],
"git-hooks-nix": [
"devenv",
"git-hooks"
],
"nixpkgs": [ "nixpkgs": [
"devenv",
"nixpkgs" "nixpkgs"
], ],
"nixpkgs-23-11": [ "rust-overlay": "rust-overlay"
"devenv"
],
"nixpkgs-regression": [
"devenv"
]
}, },
"locked": { "locked": {
"lastModified": 1761648602, "lastModified": 1780841807,
"narHash": "sha256-H97KSB/luq/aGobKRuHahOvT1r7C03BgB6D5HBZsbN8=", "narHash": "sha256-7N3iYAUmNjt0wgfpb1ZMVP5xRcXSrihQqOxZPM5N0Tc=",
"owner": "cachix", "ref": "develop",
"repo": "nix", "rev": "0e6b559d002cc7a9bcb758384623de0e8e034bbe",
"rev": "3e5644da6830ef65f0a2f7ec22830c46285bfff6", "revCount": 45,
"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": 1777812556,
"narHash": "sha256-E5nqOucRQBWKuT31AMekmfgMywRdHgSbU86R7t4BKKA=",
"owner": "soramanew",
"repo": "m3shapes",
"rev": "356825d31f16052a782735cce264331cba0cb71b",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "cachix", "owner": "soramanew",
"ref": "devenv-2.30.6", "repo": "m3shapes",
"repo": "nix", "rev": "356825d31f16052a782735cce264331cba0cb71b",
"type": "github"
}
},
"mobile-nixos": {
"flake": false,
"locked": {
"lastModified": 1772289954,
"narHash": "sha256-iDdtwk/dFb6AsXMtcOpZixxXl6C1HNUPe6cglxxHO7M=",
"owner": "mobile-nixos",
"repo": "mobile-nixos",
"rev": "1a9e0af79dc7b5e29ed772f1a8a76fcbd9d45fdf",
"type": "github"
},
"original": {
"owner": "mobile-nixos",
"repo": "mobile-nixos",
"type": "github" "type": "github"
} }
}, },
@@ -267,11 +284,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764475780, "lastModified": 1780816331,
"narHash": "sha256-77jL5H5x51ksLiOUDjY0ZK8e2T4ZXLhj3ap8ETvknWI=", "narHash": "sha256-0BYqs8yKWkOz2Q7+SP18N5E5gmDKSo6LSxIVIa0wWes=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nix-index-database", "repo": "nix-index-database",
"rev": "5a3ff8c1a09003f399f43d5742d893c0b1ab8af0", "rev": "1a2ea89c917781e88508d9fd2b507f2d2a0e173c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -282,11 +299,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1764517877, "lastModified": 1780243769,
"narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=", "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c", "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -296,13 +313,28 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgsStable": {
"locked": {
"lastModified": 1780511130,
"narHash": "sha256-2v9lT4ya59Lh1FqPeLnz1MoX9y/wz2huqfe9RtQZITk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "535f3e6942cb1cead3929c604320d3db54b542b9",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-25.11",
"type": "indirect"
}
},
"pumo-system-info": { "pumo-system-info": {
"inputs": { "inputs": {
"flake-utils": "flake-utils_2", "flake-utils": "flake-utils_4",
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
], ],
"rust-overlay": "rust-overlay" "rust-overlay": "rust-overlay_2"
}, },
"locked": { "locked": {
"lastModified": 1748984111, "lastModified": 1748984111,
@@ -321,37 +353,109 @@
"quickshell": { "quickshell": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
"caelestia-shell",
"nixpkgs" "nixpkgs"
] ]
}, },
"locked": { "locked": {
"lastModified": 1764663772, "lastModified": 1780303737,
"narHash": "sha256-sHqLmm0wAt3PC4vczJeBozI1/f4rv9yp3IjkClHDXDs=", "narHash": "sha256-7HgdJBG4BgAPDyHKKxWtxj7nziqsQo6zQCXtwy+L9fs=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "26531fc46ef17e9365b03770edd3fb9206fcb460", "rev": "b66495fcc5022681b56b61f928c7acbe910e722c",
"revCount": 713, "revCount": 821,
"type": "git", "type": "git",
"url": "https://git.outfoxxed.me/quickshell/quickshell" "url": "https://git.outfoxxed.me/outfoxxed/quickshell"
}, },
"original": { "original": {
"type": "git", "type": "git",
"url": "https://git.outfoxxed.me/quickshell/quickshell" "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": { "root": {
"inputs": { "inputs": {
"claude-desktop": "claude-desktop", "caelestia-shell": "caelestia-shell",
"devenv": "devenv", "copyparty": "copyparty",
"flake-utils": "flake-utils_2",
"home-manager": "home-manager", "home-manager": "home-manager",
"jj-cz": "jj-cz",
"mobile-nixos": "mobile-nixos",
"nix-index-database": "nix-index-database", "nix-index-database": "nix-index-database",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"nixpkgsStable": "nixpkgsStable",
"pumo-system-info": "pumo-system-info", "pumo-system-info": "pumo-system-info",
"quickshell": "quickshell", "rockchip": "rockchip",
"sops-nix": "sops-nix", "sops-nix": "sops-nix",
"spicetify": "spicetify",
"srvos": "srvos",
"zen-browser": "zen-browser" "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": { "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": { "inputs": {
"nixpkgs": [ "nixpkgs": [
"pumo-system-info", "pumo-system-info",
@@ -379,11 +483,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764483358, "lastModified": 1780547341,
"narHash": "sha256-EyyvCzXoHrbL467YSsQBTWWg4sR96MH1sPpKoSOelB4=", "narHash": "sha256-Gq8KNx5A7hBB3uGJaj6eQfLDIz5YdLu92gqBcvHvoUo=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "5aca6ff67264321d47856a2ed183729271107c9c", "rev": "9ed65852b6257fbeae4355bc24ecfea307ca759a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -392,6 +496,47 @@
"type": "github" "type": "github"
} }
}, },
"spicetify": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"systems": "systems_4"
},
"locked": {
"lastModified": 1780422259,
"narHash": "sha256-dWGk4SEdI189kQW5cE4Uo1Mc+P+kQEdgMcyMgTtmQOA=",
"owner": "Gerg-L",
"repo": "spicetify-nix",
"rev": "8414bbf2fcc7bc0a22c675e498e3c7365c1aec0a",
"type": "github"
},
"original": {
"owner": "Gerg-L",
"repo": "spicetify-nix",
"type": "github"
}
},
"srvos": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1780545143,
"narHash": "sha256-y9aFcK8A3pctkW9G9LdppzPDsuBa3VzToADnacjir/A=",
"owner": "nix-community",
"repo": "srvos",
"rev": "bc0ca7b0f7c8ca9dc55166438fec4dc2dd74f8a4",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "srvos",
"type": "github"
}
},
"systems": { "systems": {
"locked": { "locked": {
"lastModified": 1681028828, "lastModified": 1681028828,
@@ -422,6 +567,36 @@
"type": "github" "type": "github"
} }
}, },
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"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"
}
},
"zen-browser": { "zen-browser": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -429,11 +604,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764648680, "lastModified": 1780637620,
"narHash": "sha256-B/nmawJ75/951Xs9ludSxDVd/txFY+odmcbinySqMQo=", "narHash": "sha256-ngPdHinPyF0AMxRr32qt+TZCv0sagmooBW14u6DfjSU=",
"owner": "youwen5", "owner": "youwen5",
"repo": "zen-browser-flake", "repo": "zen-browser-flake",
"rev": "897df2f2ad4880563ce801fa29f348a4e98f0a20", "rev": "8c62bc6a72ac5a5b8d1b41b2b88dfed9d9932c48",
"type": "github" "type": "github"
}, },
"original": { "original": {
+116 -43
View File
@@ -2,12 +2,9 @@
description = "Home Manager configuration of phundrak"; description = "Home Manager configuration of phundrak";
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgsStable.url = "nixpkgs/nixos-25.11";
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
devenv = { flake-utils.url = "github:numtide/flake-utils";
url = "github:cachix/devenv";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = { home-manager = {
url = "github:nix-community/home-manager"; url = "github:nix-community/home-manager";
@@ -19,14 +16,36 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
caelestia-shell = {
url = "github:caelestia-dots/shell";
inputs.nixpkgs.follows = "nixpkgs";
};
copyparty = {
url = "github:9001/copyparty";
inputs.nixpkgs.follows = "nixpkgs";
};
jj-cz = {
url = "git+https://labs.phundrak.com/phundrak/jj-cz?ref=develop";
inputs.nixpkgs.follows = "nixpkgs";
};
mobile-nixos = {
url = "github:mobile-nixos/mobile-nixos";
flake = false; # It is not as a flake
};
pumo-system-info = { pumo-system-info = {
url = "git+https://labs.phundrak.com/phundrak/pumo-system-info"; url = "git+https://labs.phundrak.com/phundrak/pumo-system-info";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
quickshell = { rockchip = {
url = "git+https://git.outfoxxed.me/quickshell/quickshell"; url = "github:raboof/nixos-rockchip/pinetab-linux-7.0";
inputs.nixpkgs.follows = "nixpkgs"; inputs.utils.follows = "flake-utils";
inputs.nixpkgsStable.follows = "nixpkgsStable";
inputs.nixpkgsUnstable.follows = "nixpkgs";
}; };
sops-nix = { sops-nix = {
@@ -34,8 +53,13 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
claude-desktop = { spicetify = {
url = "github:k3d3/claude-desktop-linux-flake"; url = "github:Gerg-L/spicetify-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
srvos = {
url = "github:nix-community/srvos";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -46,53 +70,57 @@
}; };
nixConfig = { nixConfig = {
extra-trusted-public-keys = "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw="; extra-trusted-public-keys = [
extra-substituters = "https://devenv.cachix.org"; "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 = { outputs = {
self, self,
nixpkgs, nixpkgs,
flake-utils,
home-manager, home-manager,
devenv, rockchip,
mobile-nixos,
srvos,
... ...
} @ inputs: let } @ inputs:
flake-utils.lib.eachDefaultSystem (
system: let
inherit (self) outputs; inherit (self) outputs;
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nixpkgs.legacyPackages.${system};
in { in {
formatter.${system} = pkgs.alejandra; formatter = pkgs.alejandra;
devShells.default = pkgs.mkShell {
packages.${system} = { buildInputs = [
devenv-up = self.devShells.${system}.default.config.procfileScript; pkgs.nh
devenv-test = self.devShells.${system}.default.config.test; pkgs.jujutsu
}; pkgs.git
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;
};
}
)
]; ];
}; };
packages = {
homeConfigurations = let homeConfigurations = let
extraSpecialArgs = {inherit inputs outputs system;}; extraSpecialArgs = {inherit inputs outputs system;};
pkgs = nixpkgs.legacyPackages.x86_64-linux; pkgs = nixpkgs.legacyPackages.x86_64-linux;
defaultUserModules = [ defaultUserModules = [
inputs.sops-nix.homeManagerModules.sops inputs.sops-nix.homeManagerModules.sops
inputs.spicetify.homeManagerModules.default
inputs.caelestia-shell.homeManagerModules.default
]; ];
withUserModules = modules: nixpkgs.lib.lists.flatten (defaultUserModules ++ [modules]); withUserModules = modules: nixpkgs.lib.lists.flatten (defaultUserModules ++ [modules]);
in { in {
@@ -100,14 +128,30 @@
inherit extraSpecialArgs pkgs; inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/alys.nix; modules = withUserModules ./users/phundrak/host/alys.nix;
}; };
"phundrak@marpa" = home-manager.lib.homeManagerConfiguration { "creug@elcafe" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs; inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/marpa.nix; modules = withUserModules ./users/creug/host/elcafe.nix;
};
"phundrak@elcafe" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/elcafe.nix;
}; };
"phundrak@gampo" = home-manager.lib.homeManagerConfiguration { "phundrak@gampo" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs; inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/gampo.nix; modules = withUserModules ./users/phundrak/host/gampo.nix;
}; };
"phundrak@marpa" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/marpa.nix;
};
"phundrak@NaroMk3" = home-manager.lib.homeManagerConfiguration {
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;
};
"phundrak@tilo" = home-manager.lib.homeManagerConfiguration { "phundrak@tilo" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs; inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/tilo.nix; modules = withUserModules ./users/phundrak/host/tilo.nix;
@@ -118,20 +162,47 @@
specialArgs = {inherit inputs outputs;}; specialArgs = {inherit inputs outputs;};
defaultSystemModules = [ defaultSystemModules = [
inputs.sops-nix.nixosModules.sops inputs.sops-nix.nixosModules.sops
inputs.copyparty.nixosModules.default
]; ];
withSystemModules = modules: nixpkgs.lib.lists.flatten (defaultSystemModules ++ [modules]); withSystemModules = modules: nixpkgs.lib.lists.flatten (defaultSystemModules ++ [modules]);
pinetabConfig = import ./utils/pinetab.nix {
inherit nixpkgs rockchip specialArgs;
additionalModules = defaultSystemModules;
};
in { in {
alys = nixpkgs.lib.nixosSystem { alys = nixpkgs.lib.nixosSystem {
inherit specialArgs; inherit specialArgs;
modules = withSystemModules ./hosts/alys/configuration.nix; modules = withSystemModules ./hosts/alys/configuration.nix;
}; };
elcafe = nixpkgs.lib.nixosSystem {
inherit specialArgs;
modules = withSystemModules ./hosts/elcafe/configuration.nix;
};
gampo = nixpkgs.lib.nixosSystem { gampo = nixpkgs.lib.nixosSystem {
inherit specialArgs; inherit specialArgs;
modules = withSystemModules ./hosts/gampo/configuration.nix; modules = withSystemModules ./hosts/gampo/configuration.nix;
}; };
marpa = nixpkgs.lib.nixosSystem { marpa = nixpkgs.lib.nixosSystem {
inherit specialArgs; inherit specialArgs;
modules = withSystemModules ./hosts/marpa/configuration.nix; modules = withSystemModules ./hosts/marpa;
};
NaroMk3 = nixpkgs.lib.nixosSystem {
inherit specialArgs;
modules = withSystemModules [
srvos.nixosModules.server
srvos.nixosModules.hardware-hetzner-cloud
srvos.nixosModules.mixins-terminfo
./hosts/naromk3/configuration.nix
];
};
pinetab2 = pinetabConfig "x86_64-linux" ./hosts/pinetab2/gnome.nix;
pumo = nixpkgs.lib.nixosSystem {
system = "aarch64-linux";
inherit specialArgs;
modules = withSystemModules [
(import "${mobile-nixos}/lib/configuration.nix" {device = "oneplus-enchilada";})
./hosts/pumo
];
}; };
tilo = nixpkgs.lib.nixosSystem { tilo = nixpkgs.lib.nixosSystem {
inherit specialArgs; inherit specialArgs;
@@ -140,3 +211,5 @@
}; };
}; };
} }
);
}
+5 -5
View File
@@ -20,10 +20,7 @@
domain = "phundrak.com"; domain = "phundrak.com";
id = "41157110"; id = "41157110";
}; };
packages.nix = { packages.nix.gc.automatic = true;
gc.automatic = true;
trusted-users = ["root" "phundrak"];
};
services = { services = {
endlessh.enable = true; endlessh.enable = true;
ssh = { ssh = {
@@ -34,7 +31,10 @@
}; };
users = { users = {
root.disablePassword = true; root.disablePassword = true;
phundrak.enable = true; phundrak = {
enable = true;
trusted = true;
};
}; };
}; };
system.stateVersion = "23.11"; system.stateVersion = "23.11";
+90
View File
@@ -0,0 +1,90 @@
{
inputs,
config,
...
}: {
imports = [
./hardware-configuration.nix
inputs.home-manager.nixosModules.default
../../system
];
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";
# };
};
mySystem = {
boot = {
kernel = {
hardened = true;
cpuVendor = "intel";
};
grub = {
enable = true;
device = "/dev/sdh";
};
zfs = {
enable = true;
pools = ["tank"];
};
};
dev.docker = {
enable = true;
storage = "/tank/docker/";
};
misc.keymap = "fr";
networking = {
hostname = "elcafe";
id = "501c7fb9";
};
packages.nix.gc.automatic = true;
services = {
endlessh.enable = true;
ssh = {
enable = true;
allowedUsers = ["phundrak"];
passwordAuthentication = true;
};
traefik = {
enable = false;
environmentFiles = [config.sops.secrets."elcafe/traefik/env".path];
dynamicConfigFile = config.sops.secrets."elcafe/traefik/dynamic".path;
};
};
users = {
root.disablePassword = true;
phundrak = {
enable = true;
trusted = true;
};
creug = {
enable = true;
sudo = true;
};
};
};
# 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
# on your system were taken. It's perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "23.11"; # Did you read the comment?
}
+23
View File
@@ -0,0 +1,23 @@
{passwordFiles}: {
enable = true;
user = "creug";
group = "users";
accounts = {
creug.passwordFile = passwordFiles.creug;
phundrak.passwordFile = passwordFiles.phundrak;
};
volumes = {
"/plex" = {
path = "/plex";
access.rwmd = ["creug" "phundrak"];
flags = {
e2dsa = true;
e2ts = true;
xdev = true;
xvol = true;
dedup = true;
nohash = "\\.iso$";
};
};
};
}
+42
View File
@@ -0,0 +1,42 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{
config,
lib,
modulesPath,
...
}: {
imports = [
(modulesPath + "/installer/scan/not-detected.nix")
];
boot = {
initrd = {
availableKernelModules = ["ahci" "xhci_pci" "ehci_pci" "megaraid_sas" "usbhid" "usb_storage" "sd_mod" "sr_mod"];
kernelModules = [];
};
kernelModules = ["kvm-intel"];
extraModulePackages = [];
};
fileSystems."/" = {
device = "/dev/disk/by-uuid/d2e703f7-90e0-43e7-9872-ce036f201c4b";
fsType = "ext4";
};
swapDevices = [];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.eno1.useDHCP = lib.mkDefault true;
# networking.interfaces.eno2.useDHCP = lib.mkDefault true;
# networking.interfaces.eno3.useDHCP = lib.mkDefault true;
# networking.interfaces.eno4.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}
+7 -4
View File
@@ -16,7 +16,6 @@
kernel = { kernel = {
cpuVendor = "intel"; cpuVendor = "intel";
package = pkgs.linuxPackages; package = pkgs.linuxPackages;
modules = ["i915"];
}; };
systemd-boot = true; systemd-boot = true;
}; };
@@ -34,6 +33,7 @@
}; };
hardware = { hardware = {
bluetooth.enable = true; bluetooth.enable = true;
fingerprint.enable = true;
input = { input = {
corne.allowHidAccess = true; corne.allowHidAccess = true;
ibmTrackpoint.disable = true; ibmTrackpoint.disable = true;
@@ -41,18 +41,18 @@
}; };
sound.enable = true; sound.enable = true;
}; };
i18n.input.enable = true;
misc.keymap = "fr-bepo"; misc.keymap = "fr-bepo";
networking = { networking = {
hostname = "gampo"; hostname = "gampo";
id = "0630b33f"; id = "0630b33f";
hostFiles = [config.sops.secrets.extraHosts.path];
}; };
packages = { packages = {
appimage.enable = true; appimage.enable = true;
flatpak.enable = true; flatpak.enable = true;
nix = { nix = {
gc.automatic = true;
nix-ld.enable = true; nix-ld.enable = true;
trusted-users = ["root" "phundrak"];
}; };
}; };
programs.steam.enable = true; programs.steam.enable = true;
@@ -62,7 +62,10 @@
}; };
users = { users = {
root.disablePassword = true; root.disablePassword = true;
phundrak.enable = true; phundrak = {
enable = true;
trusted = true;
};
}; };
}; };
@@ -39,13 +39,21 @@
}; };
}; };
services.displayManager.autoLogin = {
user = "phundrak";
enable = true;
};
mySystem = { mySystem = {
boot = { boot = {
plymouth.enable = true;
kernel = {
cpuVendor = "amd";
v4l2loopback.enable = true;
extraModprobeConfig = '' extraModprobeConfig = ''
options snd_usb_audio vid=0x1235 pid=0x8212 device_setup=1 options snd_usb_audio vid=0x1235 pid=0x8212 device_setup=1
''; '';
plymouth.enable = true; };
kernel.cpuVendor = "amd";
systemd-boot = true; systemd-boot = true;
}; };
desktop = { desktop = {
@@ -74,15 +82,16 @@
}; };
sound = { sound = {
enable = true; enable = true;
noisetorch = true;
jack = true; jack = true;
scarlett.enable = true; scarlett.enable = true;
}; };
}; };
i18n.input.enable = true;
misc.keymap = "fr-bepo"; misc.keymap = "fr-bepo";
networking = { networking = {
hostname = "marpa"; hostname = "marpa";
id = "7EA4A111"; id = "7EA4A111";
hostFiles = [config.sops.secrets.extraHosts.path];
firewall.openPortRanges = [ firewall.openPortRanges = [
{ {
# Sunshine # Sunshine
@@ -94,33 +103,40 @@
packages = { packages = {
appimage.enable = true; appimage.enable = true;
flatpak.enable = true; flatpak.enable = true;
nix = { nix.nix-ld.enable = true;
nix-ld.enable = true;
trusted-users = ["root" "phundrak"];
};
}; };
programs.steam.enable = true; programs.steam.enable = true;
services = { services = {
fwupd.enable = true; fwupd.enable = true;
harmonia = {
enable = true;
signKeyPaths = [config.sops.secrets."marpa/nix-cache-priv-key".path];
};
languagetool.enable = true;
printing.enable = true; printing.enable = true;
ssh.enable = true; ssh.enable = true;
sunshine = { sunshine = {
enable = true; enable = true;
autostart = true; autostart = true;
}; };
languagetool.enable = true;
}; };
users = { users = {
root.disablePassword = true; root.disablePassword = true;
phundrak.enable = true; phundrak = {
enable = true;
trusted = true;
};
}; };
}; };
sops.secrets.extraHosts = { sops.secrets = {
"marpa/nix-cache-priv-key" = {};
extraHosts = {
inherit (config.users.users.root) group; inherit (config.users.users.root) group;
owner = config.users.users.phundrak.name; owner = config.users.users.phundrak.name;
mode = "0440"; mode = "0440";
}; };
};
services.udev.extraHwdb = '' services.udev.extraHwdb = ''
mouse:usb:047d:80a6:* mouse:usb:047d:80a6:*
+75
View File
@@ -0,0 +1,75 @@
{inputs, ...}: {
imports = [
./hardware-configuration.nix
inputs.home-manager.nixosModules.default
../../system
];
mySystem = {
boot = {
kernel = {
hardened = true;
cpuVendor = "amd";
};
grub = {
enable = true;
device = "/dev/sdb";
};
};
dev.docker.enable = true;
misc.keymap = "fr-bepo";
networking = {
hostname = "NaroMk3";
id = "0003beef";
firewall = {
openPorts = [
22 # Gitea SSH
80 # HTTP
443 # HTTPS
];
};
};
packages.nix.gc.automatic = true;
services = {
endlessh.enable = false;
ssh = {
enable = true;
allowedUsers = ["phundrak"];
passwordAuthentication = false;
port = 2222; # port 22 will be used by Gitea
};
};
users = {
root.disablePassword = true;
phundrak = {
enable = true;
trusted = true;
};
};
};
# This option defines the first version of NixOS you have installed
# on this particular machine, and is used to maintain compatibility
# with application data (e.g. databases) created on older NixOS
# versions.
#
# Most users should NEVER change this value after the initial
# install, for any reason, even if you've upgraded your system to a
# new NixOS release.
#
# This value does NOT affect the Nixpkgs version your packages and
# OS are pulled from, so changing it will NOT upgrade your system -
# see https://nixos.org/manual/nixos/stable/#sec-upgrading for how
# to actually do that.
#
# This value being lower than the current NixOS release does NOT
# mean your system is out of date, out of support, or vulnerable.
#
# Do NOT change this value unless you have manually inspected all
# the changes it would make to your configuration, and migrated your
# data accordingly.
#
# For more information, see `man configuration.nix` or
# https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion
system.stateVersion = "25.05"; # Did you read the comment?
}
+50
View File
@@ -0,0 +1,50 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{
lib,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
];
boot = {
initrd = {
availableKernelModules = ["ahci" "xhci_pci" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
kernelModules = [];
};
kernelModules = [];
extraModulePackages = [];
};
fileSystems = {
"/" = {
device = "/dev/disk/by-uuid/28b965a5-940b-4990-87fe-039c9f373bf0";
fsType = "ext4";
};
"/boot" = {
device = "/dev/disk/by-uuid/EBAD-6B85";
fsType = "vfat";
options = ["fmask=0022" "dmask=0022"];
};
"/tank" = {
device = "/dev/disk/by-uuid/ed00871e-a14a-428f-b6e4-5b56febd756a";
fsType = "ext4";
};
};
swapDevices = [];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.enp1s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}
+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
];
}
+90
View File
@@ -0,0 +1,90 @@
# Minimal configuration for OnePlus 6 (enchilada) NixOS Mobile
# Focus on essentials: SSH, wireless, and basic tools
{
pkgs,
inputs,
...
}: {
imports = [
inputs.sops-nix.nixosModules.sops
../../system
];
nixpkgs.config.permittedInsecurePackages = ["olm-3.2.16"];
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;
sound = {
enable = true;
usePulseaudio = true;
};
};
i18n.input.enable = true;
misc = {
keymap = "fr-bepo";
mobile = true;
};
networking = {
hostname = "pumo";
id = "93595b88";
};
packages = {
appimage.enable = true;
flatpak.enable = true;
nix.nix-ld.enable = true;
};
services = {
languagetool.enable = true;
printing.enable = true;
ssh.enable = true;
};
users = {
root.disablePassword = true;
phundrak = {
enable = true;
trusted = true;
extraGroups = ["feedbackd"];
};
};
};
programs = {
dconf.enable = true;
calls.enable = true;
zsh.enable = true;
};
hardware.sensor.iio.enable = true;
# Minimal essential packages
environment.systemPackages = with pkgs; [
chatty # IM and SMS
epiphany
nixd
git
vim
emacs
wget
curl
jujutsu
firefox
kitty
];
system.stateVersion = "25.11";
}
+5 -8
View File
@@ -1,6 +1,3 @@
# Edit this configuration file to define what should be installed on your
# system. Help is available in the configuration.nix(5) man page and in
# the NixOS manual (accessible by running nixos-help).
{inputs, ...}: { {inputs, ...}: {
imports = [ imports = [
./hardware-configuration.nix ./hardware-configuration.nix
@@ -33,10 +30,7 @@
]; ];
}; };
}; };
packages.nix = { packages.nix.gc.automatic = true;
gc.automatic = true;
trusted-users = ["root" "phundrak"];
};
services = { services = {
calibre.enable = true; calibre.enable = true;
endlessh.enable = true; endlessh.enable = true;
@@ -53,7 +47,10 @@
}; };
users = { users = {
root.disablePassword = true; root.disablePassword = true;
phundrak.enable = true; phundrak = {
enable = true;
trusted = true;
};
}; };
}; };
+24
View File
@@ -0,0 +1,24 @@
# https://handy.computer/
{
appimageTools,
fetchurl,
lib,
}: let
name = "Handy";
pname = lib.strings.toLower name;
version = "0.8.0";
src = fetchurl {
url = "https://github.com/cjpais/${name}/releases/download/v${version}/${name}_${version}_amd64.AppImage";
hash = "sha256-PLcssfd6iMx51mglAJ7D4+67HFazwfhJMImgU9WiNDk=";
};
appimageContent = appimageTools.extractType2 {inherit pname version src;};
in
appimageTools.wrapType2 {
inherit pname version src;
extraPkgs = pkgs: [pkgs.wtype];
extraInstallCommands = ''
install -m 444 -D ${appimageContent}/${name}.desktop $out/share/applications/${name}.desktop
install -m 444 -D ${appimageContent}/${name}.png $out/share/icons/hicolor/256x256/apps/${name}.png
install -m 444 -D ${appimageContent}/${pname}.png $out/share/icons/hicolor/256x256/apps/${pname}.png
'';
}
+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;
};
})
+98 -50
View File
@@ -1,67 +1,115 @@
extraHosts: ENC[AES256_GCM,data:i2B5DEjVm7P0V77oVzGIgU08dcpmxy8EgoJz4nPuhfpOBZI1BQpRTOOoSVRZzY6SNpLQCcNDVCwvuhtS12w7NAgIFvBhSigzwJVaWZiC78qTjXanbjSW6fvT1SQqb+YOD+4qkpuuxT5pdBKkyHZvjGM6elyA0K6JzpiCE33+Ag/4SIFTyDrdhJN2HQule54aBDVObg5s7zmPnDo9bCX0XXXCbFpdOfJMKI+89c+Gfm0dJrnDwHcks3p1ZrrSfLn3NhC+Rryc8FHMCtw936WKv+TcP124XGYxXrdEFKngB/pJLhUZlzDeC4v33xtPemOdQrK7vGjO0YZ7WBbO5oXvHw6R1pqC7iMDWjKQBbPit8IB3rngXeMOPEHxbEp1W0MEHbp3bg4GH/SAnxKkfeAFxhMNMBolO12KTntaLCurTSKXhXCIn9SSxFcoWK6kIeo6cpejcHdqGbtV8eL3znZ+MXzvEDRwiy5Sofxa31aAoItwX7kK1YHbpMT95jfr8rKc4yR7tkJWmJkmU494x/lhLkyQbXj25cNcJE7v+hLtQkJ1gdHRgYxYJFxG+VbroSS5HjkRvameuLMfk5dHxg+0bifXEV1FjhKtZqM5JQNEFOHUzvrs5u8m3NKNr13onuT5soh3GKAlh8AMX7p5Etud0BpQPdU7HT5WXRyuP7JMZL5wsjRsGWRxnQaQbnV6qg1b1JP25b6iRj0DFHZJeIEEOU20wDwDQDCoXzJS8vlMbZOC0W9/NVWgwz+UAWQz/yxzRGbconWr6zUhvwcwYBtDhYb6KD0GFxn6yfB/zfMvRHZz8AFF4w00Bx4F2L3nvF4lltnkHkdy9Qql6RsshsVFpPjrhzCrABFBrP0js1OCRw==,iv:Mx7LgF/1z/aZtyvIYafELx2tg2VZ3wTpV0zI04DLxU0=,tag:ZZImkH5/6atDOIzaXJC0Bg==,type:str] 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]
traefik:
env: ENC[AES256_GCM,data:HUdWGYoEPp2v8dnDuVsl7YmPxuBfHmXzGrvKWeiqPlmAwMqVZrZ1j8on/7QKvYDJoTJ40XY2qNynSA==,iv:Vgc/fZERnNp7hSMeRd9EgB3IenKAFTAhwC0bk8CX4DE=,tag:SdfhOST/o29Lt1zRdXXRyQ==,type:str]
dynamic: ENC[AES256_GCM,data:BKsjTfqpZhrocHOUfxjCNS61DVb1oSdPW99IrwmNjpFcs68WvyfD0+QZ9F362L88CQDTnDSXWAbc7mcBtxhqfhkjtsdxkhtLHMGG0WxlnYungTnROh9EDJRLNyjy/RCYWOIVOXIEUE5lLwnQkboZLEiruw1Ri+r27WYmGpD5DaR4XWDankb6BQPJA6f2ziPyynjNYZaRhMIQUDFLM3QRAXPYD00eaYIQtx253z8Uocz4LpOw2JReAQkI2zc+6Oe1O4fP/Cg8klF0owR6NkNUWoIUVwLqFmU7Yr45VO+T/f96Ev0hlDaMklxYJGNOS8kRbSqpaiuMCmL2mQ6rsZGFVfdMdImSL2j51lrPFJCsg/hNGXHAxQ0/OpHtcZz/cwn5nSHBXg6gX21kOpkWGY1+BRA15X0k5sUqXkZWjkP9wkSCV6pQTbr8a3GrX2VvGwguAC4EpTCkCobXw/d9a7bMfZFeJqFhwjpU/dfBi6OjF7bniOQ7k3+5RZRDqAxJiPaBk7NKVN1FzUCvFBjKifbfICOJaPJr1CmayNuBZtsSlj0MXBYx8D8oShzhsCo/+pyni4poMYyfNC9jQKWCBsjKEa6eWb1+TfOHv4W+lSlBFg3vGm4NDxCPnACKWlhKB4WoJGRHqnp809XF2fqP4lZN8S7+sB2rhNlr2CICk9oM80FNmW/8TTtIgbpfEeFeJwNTM+S95cFSqaIRg3kfcqB/bHG37BYthcL1SC85/lxhL2LJ/O0qXxbioyxVAaBIumAO8BB1qrdbOozHZZAU1IIKylDWMWUoJMyMdhMGnOxxxWcbV2jPUXUv03DYNp3G/5F2Hlr+h0bPIJEFZ2kb14wTK+25MsgfBgky26f8qjNwROqKA+bPeB2yUKSSCJb//PzzE4xyqu1mq2/1zTal0eSRTCEnAUCj0wDqCLBMO6GnL0PS4PtGJ9n/IbOjFXZeixWGJzUTcmxPAmsClH6FV8brEMVs5bfrjLieXQvcn0b8b9/1W2jV4dJGUE1TxUQ2B92VG7PrA39O/FO8tQJZrAMXO9iMv495w0Nxbt0HYN6wsFTUwlQ+3DCXxgmmVBqVSf1OtHuhxcznl1oR+sgPSgBRLVB22mv5677ErQGCWp1luyPSF6xvhIaKe9BDwxBwJ+RsqSn4w5t1qJM9uYqFunSJPY5439B4zWG+lUy1ZDNn1oHUaX3hZUhzc9tEm+0CWFNXxH2hiRFb2nYP6Pv/GNqjZCsflY0YYty0UJBqRELGpUO3Sd+zbyJmWtvDjto726/0jHB/jb0RVThUem0PzWmmIUth0ucKp0M7zqEWNyVPbvWOK6rWQW9eaW87bFeMhrD1PC+U0ilq9DKG1J3ldc0lEBrguc4fk72T3I62pw5KdGnsmB+FjAc8kdTFKhM52ylChsAnJGFu0LyBUgjGIzZ03XkO8RbYs/wzc9VQOvyikvB67wImXMu8PJDzMxXnu58y7C4U86kvLdUfYm5bz+MxZmXsDA1L7C4si6oLf7rOCfLLc4A1a/X/aMSk330SARW/UAZ/NaFDXhotYXZUSbr41Z6b0qRPZjjZfOkdeKxTp+r07+8oJpPOaIaaOIlNRkGyRCnbCGvJ4CuUfTQuywIefBHlawGzhsDvOKorWYTuim7MbJcd19bYMG6k8qqTQlNeHjZJaDLKJ/rnSAIGDSNYRP4uUUo0gqSp82E9bXUUn5VuFSPcJ55uvFXZD0f6tLZGIyUuG5tqw3xNQF2cA+4ZXzbxi6VIZQ+ahZELkoBR+dVXQ0yGkDJusNf61A1lfI2bd7JQnJ7YVhbF1gXNnDXdWO0F8zsnZyhSSJY3ZoXLdYn+v39+AxQvE3mpX7zNsk7+0WUHuqAh6JG6OBt7jF5OVwD3bfuQfDhPlfD7YOU5/C+rekDGXmfZOMXxadvQgWFcpHdgbV7NwKqdgj6pJDVoGO8/4HGtlb94/o6dtXzfheSLUhCUZ2Im81yduu8386fCYLHX/ZsP+CuuC2wlXQaSCgoODRXXDz7jsRcQNfW2ohmFT9iDn95NI5ylCgt49t2Cr06ft7Pd0tWjh69VQ8TjNlfqm3Sxlf/Gb9ihwOOytmbDv4bNKhpRIPC0jIZv3aaA7vgdLCbySVeMo1tfMx3Xvf6q8XqlsQ/HgwBxAMmjakIAukNwtU74oJ2AYpIO/Oc47081JR2sVtGWer6l7C8KMy9O0xYtABsofkc9kHQWtAvn82sSQTuI/UgD5ttfdfVZZaanHek3vgJyTYI3sPQDVJ6SXrC0a+fqMlTL7Jux/0B70gK1z46j5C54IBCChNa4CwXhvxofyoDgyF6DVC2qZxoKXGl1veQKJh68q9hCiDlYEpiwuRCs3j6uSUG4Rssc9TKfdY3AQltVrhykEORVEgZe1HWmlms=,iv:3G3geSZRziwGiKcUMVNZ7j5s/4YA6Uk7wCSb4aFNSMo=,tag:FxARskR9+wdV7/xCKP8UdA==,type:str]
marpa:
nix-cache-priv-key: ENC[AES256_GCM,data:H5VsN0nOogvgxWHXHF66BbzJe17zelZCG6mU4vmVJqBoi7a5cQxzU7WnV4k1EOpMJPDj6floVmrsG4DM86FthxcTwixCNDINmaemwAXQnUkgWXFKYY7Ovzten81UVKrtkN4n1S8=,iv:pxnHD5YqyTeNZnxyEJeXAUixZEz8Uq9b2HFZZBsMOzk=,tag:xI+4tFG+Q4Z5IVxlATayJA==,type:str]
opencode:
cors: ENC[AES256_GCM,data:ubvZLYOSbwUSlpyO+1R1BvgxI17gBTNmN3dK9as=,iv:vPEZPvrber41NdOFB299fpIH7o2IFsSdA5EhIdw4CNk=,tag:KufSrvozf0ov7VBpMz/Bfg==,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]
mopidy: mopidy:
spotify: ENC[AES256_GCM,data:SaDT0iSWhsgVOi1s+Nzbr0Mur3t2Zd9z/KIUshGWtbPfkXXIoiJeJFtoZIz5NL/t5FooYsNfU1mGYgDeVYSD4BPibW8hiCYrX6L6OX+Q6ZEWXXx/1eBEs2/q0BrWGvy7frcurq/Px4R3ax0dXJe/YKbpAtU7+bQl,iv:F2zT+uMVBMnSEZqgcRmV8/fc3G/g2fKDuHuBzkyBRN0=,tag:CD8fuOQfe6QCrj4BUh0/xw==,type:str] spotify: ENC[AES256_GCM,data:6i9BzQmlndnROuT1H2zgN/3I6hBiFf14BlcS+XL2PbTiiEQZe2yE3tnZo3KXU9S5CjS3MwxsVdytKOFMQt2s1bVjcibBhJzoKEQByaapdzn1mK3kQLdJfhPf4Hf9YZV9Dlc60ngS7ESLZakdFVlj4rlbV5XReLhK,iv:fYd78r4U0kTyq1TZjBVXkjdNiOQ29gLJ53kwTXsi8W0=,tag:oWaeOuzdHWS4joZAdeA2pg==,type:str]
bandcamp: ENC[AES256_GCM,data:diEx2fbkOR1oUav81jU5bNt/KNmbOaVzLV+G3zBUVXE7nEQpZNqVom0rgNrEVDGzH3u/IaA5eqG5ce9lE0BomeY8Z4MWI1xujhX5KsXdv21aw4UwsNgyLPuWhkN2POUMfCJlvekc/TFfFvJHyysx8aKxeI4dsg==,iv:cxx0cVkjOPG+hMD8JctJHdcICJt7ozpfRBVSCDBo6Ro=,tag:JRjwwvieGaGZJ+k56HWFaw==,type:str] bandcamp: ENC[AES256_GCM,data:3uWlk1W6pgExsUkLpqpFXpMceYEdMfWMxNUq8iGEyq8/P3OAjzg7pvvPBGcVwmh4jSgNilRiqmmGrtYLwdqPUMlmbFB56K6ZLDIcC2yg2SRfulYcObvimOkIkx7ITr1u6jSzjMkTR5ekIlzlPBxFQzEfBbgdrQ==,iv:IY1VH/8vjNCPz8LGbYbyr5U3FcmhV+YhK3fHnLfWiak=,tag:lB78PRuEuFen54csc7jHIQ==,type:str]
emailPassword: ENC[AES256_GCM,data:LALAvyuNN9bfa8D6ZK1YiFXRfxLOBi9kXA0N0Kr7h18eAI4hWQ==,iv:WtidILFfWCMKylax52JP+X57GfZyYlxJtiwrC6SADik=,tag:NvOrsL3fbmxQZp06GZhUZA==,type:str] emailPassword: ENC[AES256_GCM,data:RUuXzEfkqu1hEg12vBko17MtvdcFIxPofB+nFOuuMdWqjqJgEg==,iv:725/ttk8jHmSIj16gqvLykOu8D8rUbzzvOyxyZx8Jds=,tag:jv1ZO14WsKyWFsfqzRzZPg==,type:str]
ssh: ssh:
hosts: ENC[AES256_GCM,data:nuMA50lZVxi/b2Y95Om00DIXkfHV+5epXzgFJTUk1r78y71/q/1wDa0bb9bqaMhElivDrX2mzS7IplLqLry43VkGAiE00WrdT7pLM+NSDtm7VV3kake7qorkpydxczHeVg5VP/b1FMzpQ1gFoAVg6iY9tYBnfTa5MdQI3ktQBRYWU5XmVMFNquTBG10wOKxgTUdkh6smcYmU5YlDUdeM6gTt9QPSHlglOGCe/w3tuXOWkBNcNtNiwQoaKTwIkhisu8R6h/qwtOBBt0wEpOv+KtdYQ0Y9o7/KiN2mG24+/mASfAYTAhifSnCY0vDe145gkrQzFttzZDI6l4OgjYF9rIsP+hKwUChGObW90HVVKQbJ8oDoG+l9L+IxLxs8v/v1690Xtra+PPvZCgGqhXqpoqBL/OgNdR26p/G8Oid81Nb0ob8DstYLjYlcg7ZjPiruMtRwhKoa4z++pe+poepGAPHdKkLvAvzFUKwcqRfR7RNgNgZR8hFAe7Tg5m3ApF+koGWjcoKCyALgc/hP6LTBmiJuj6OySFl1cTtkKHPsYXa49St+lOB32MXCH2ysAI6860ZcJqpAFTQ1Yd2XYu+Xrbxcm381mE02Tw20+VP2OPyEYt+ida2TKAzM3aXiMGTRpSkwzkKXsRoBskVQxv3z+6c+w87I9ZmoZHqHM7dWcRAuj2bT2ZWeExPyEmUFczMjCcFFEepnlKWOYmkUZmjDfqZ1mtR3bBK271AnVHakS5jajbhhyu6VDMLYIQmBPDFpZnyCE2qgb9FbXBbqoq+qc/9w+7gCdXNnb1tDdiJ8E4k7no6oU5jrRMGHNX3UOMDs/Y9NS0vPsnqBpr7Pf+H6bxncXWoaimijoi1OxvUFMbRvT5uUgP/JNDZDGBhlY3zRiUnDhTuHF5vP8wisqsba7zwpoqIchI3hbxm+lWXt09ZTnR2A1uR3DTlEEjGUMpD5K5CWkgTalgaHYI9jh9n66rYop9evlngZlg5Cth/Lieh/34fcIUzHAQMbxUKqoRU9zHHQJ51AZIovTtegXmgPmQ8fw6F3uBQ5gg+T1CiaCqs5nUd9ERM=,iv:DNg2EEPmylLf2CqR9eqJYzngGizTraPNImIGTJwl8kI=,tag:StZ6H+1ec/i0l94Cv+AhOA==,type:str] 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]
sops: sops:
age: age:
- recipient: age1ajemtm502nn2n4q7v4j8meyd5mxtcqngkkedxq2pqzuwu78zp93qnw8q48 - enc: |
enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiYU1MR2w4Njh2cVBocmJq YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA2S3VaTmg3b2QxMGtVeStr
YkxvSmVsWDdGT0h0S3NSbDYxb21EVTlxT21nCjB3WlVmK0hkR1B6Z2lhbndvNFdC WWRpb0RhVFNWM3RJNEV4ZTdRVmJUa2d6YVZrCnFTOWwwTlNhc2hqM2pwZ1hkcWd1
aE9YMHphU1JoV2hwZ0RITXhHZnJmeTAKLS0tIDk4akc0T1FvbURLRFpXNHlRQ3Vx QlE2N0FtSGFFR1NHbzFOSzI5Um4rVTQKLS0tIEFaMHprc3Jlclk3MGtvc2NzZ3cr
TUZMTENMbVNjeVFxMGVSc2FpZ0dXcDgKcacaFS2diAKeKwmVz7KghKjkNI2ij4Ns blMrcWVSVFB3TVc0aTQ0RUYvbDFJS0kKmGisf9VDK2RPA1uQCK5udt7sdeDyh344
fYSd8sq/bEDTvn1wNpF1zLmzX9jmoXc5iORuRKaYcT8OaoUX7SsFvQ== IKhPHzEHAHjKEkE6sWc6TB/l8K3IfL9zdHQZ9ZqTvCiS8CBZOwPQeg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age197lfdanym647wdaz9uy8hrfqjwj9fs8rm7vs3fsrctceu8mr9gms2jedhz recipient: age1ajemtm502nn2n4q7v4j8meyd5mxtcqngkkedxq2pqzuwu78zp93qnw8q48
enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUNlhkZzFoa21tR244dVJ0 YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTRzRqTzlzVWpGMVFEbjV5
cXJWbDA0eVBrZWU4QVRVQm85bVVScFdYbHdnCjRWQWRNajIyQ0JoYTFFQ3RsOFA4 R1RXS1RBMzZGaGZjUkFZc3RLb2JkSzlRQlJZCnp5c0pMOHBZUkhralArcUhLSmx5
cTZGNVhCN2k0NHBMb1Z4VmVqRzNjbEkKLS0tIFhJTVBCM0E4dTkweld6WUx5Z1hQ Uk41cGRUR3RxR1FYVHBWU3d6ZXJpcFUKLS0tIFdLclpadHV0QlRuYmJhYVZGWVc5
WXdwVFJ3cXQzUnFPUnV2NzdqcWwwZkkKqS9IQpB/MjnsVQ4IfIRtH6FESzLkdHq/ eHRMV2o0TXhoVkcyaXZqU0tsR0o2eDQKdYwEuPeQ1fntKQKIlOlxet+SJ0rT5I1y
GJnMHt0VcLt/gYrz+lrPc1ecQwNvVGH2Qt++BbSJxUFftoDLdEMlig== WDpfGZUVvghx5dwdd6EMq3sQUeoFSfjrlgIAwNtHRwMC19A68ubzhQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age17pn6suvz2f7zmrm9zxj5hr0putvcvdamqxqt7ewhncgg6ccgmp2qr00xm2 recipient: age197lfdanym647wdaz9uy8hrfqjwj9fs8rm7vs3fsrctceu8mr9gms2jedhz
enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtcVZPWVNBc1pFWm8zN3hm YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxUEtOZ3Zac01HTjVZVXNF
M1RtenlCbGl3Q0xhWlRWN1BmOUNDK3I0cVQwCk82Vm5IcmZZeVRBdlVUb0NtTXdz endFNVprclpJMmh1eTA2ZmVJRTJlbjI3dEVNCjA4K2U5QWlOdkI0R3JwbVpNRWJG
QTlVMEhCWkpJN0JOM09mSGtqbzl5ZUkKLS0tIE4vTGhEQlRDZ1Vma0VEQ0xtcU9V T0VQWS9uS2UrRVk0YU9VcGhSUkJ6S2sKLS0tIGJZY1VSM1o3QUR5Mk9vNmhsRWxr
MitPc29VYUV3UmJSNXdmMUhwck9MOXMKLXHEKpNvzModiTR1Q6cE1xKSGewV/9PJ YURQR2kxdExKR00vYVJMVVQxekdVOE0KDkPOMeCo1MoM5R89t1rsMWR/bGIx592Z
rEbTgsa0E9C4vm5sDKjSjuvpSF9tNOSByf5So5kzX0ZTxgjdTjsFbw== wvbVmE/El4Z0QzuvXl0XK3CFlKGuwgNw5TvtQ9QZP1aAL3yN0+T5oQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1cnnpnglkvgw5ffv8qpgwpqvj203lh4uwt698y9mxjwklxt8nysmsa8hepn recipient: age17pn6suvz2f7zmrm9zxj5hr0putvcvdamqxqt7ewhncgg6ccgmp2qr00xm2
enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkeUlIL2QxQlhGN3RqOFZR YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQQTV1dkxMK3dxbGhiTGJG
K1p1bjc5R00yclEzL0hYY0c2OFJhRmN4Y0JvCkpIL0Q4Y1Nic3pFYjNIM1hMK2w2 bkVQTUFOU1I4SXAyV21PdThSZFNOTTA0cmpFCkpXcmRXdlE0eVRYWWErQUxSWFN4
cFNGNVhHcW85R2loZ3JveVVZNGptd1kKLS0tIGYvYjlTMzRzUUNlM3padDJHNkFm bjI5bkU1NE84V1FTNVZiYUpLSnhSL2cKLS0tIFl6YmxmM1JLSlpxcDcxTnRnT1k3
VGJHL2c4Z05pTWlxellFMG4rRlp1MkUK4mwb2jMlfHb0ISInZKwbm9+EqBzWfZNU M25EQU5zckVMa1VSK29iYW5PbHRJcVEK6+gstHbcPBdeRNvZa21nZB5sT1SdHWHs
+L/WahvTo4Fe9uSOJffpSMleH0ZJS35loCJE5WIdmGnRQB6Mw7LWag== 8St5tYl5I3CxNWFgFjOrHqteRKc+ZTcj3euAJ6Wathbw0YMiA3gz0Q==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1g68hxv73llkyc7etzh499ztcrt93pwawy0n8p93px4taqu58mehsp88vjq recipient: age1cnnpnglkvgw5ffv8qpgwpqvj203lh4uwt698y9mxjwklxt8nysmsa8hepn
enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIR3FWcElFL2RBRmdFS1cy YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYRGYyUGhlL2NJelZTQ1g0
emRTM201a1ltWndUcDJ5RXptd1RTNHdvWXpNCkxBTXZCNUxvd1dXMDhHK0ZFVUI1 UEhJMFlkVmdlU1E2cGE2UHF2dytVYmhQMlIwCmdrOEZjUUFrQjMzK2FxVjF0NGY1
c2VkRlJJbDNYSzF0djJXN0J4YXltam8KLS0tIEFTZjdWd0NQTVEyU1Q4UCtQVGhy UStNT3ZXbEJlUGxzSXlBTmYwUzRIalEKLS0tIHFuWWIrTGN6eUxyNEhybHIydzRp
K3VUdlpjd0M3RVBHOVVjc04yZzV4UkUKcB8r+FiqZqwsxj40hCtVePnfIZ3S8DFR cUFid1RwRXA4cExWd3poK2hEaVd5Q00KjjiEiQw2OxcGv/qDudLmbM6aysYhLTxi
tgSRDMp8eEm6vXHbbf49E/cpV4iBwVel9zAe64tYs7atk9dcgMmOpw== Qjmh133pyznFs+pLVLdYnId42zvojAeuJD9cJYxuwwgPA2ZlKdSVrg==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
- recipient: age1awytvphvty4f9wmdn86xnjg9kgetqjx8qlwj5d2882t4fyyzy58s3vg5k4 recipient: age1g68hxv73llkyc7etzh499ztcrt93pwawy0n8p93px4taqu58mehsp88vjq
enc: | - enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0TkVLUnFDMnVoT3BUM0kr YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRbUs1Qm1hUnJldDNZNUR0
ZU5hZE1teGF1M21SbmY5MHZTMytKeWpkYnk0CmkwNXlBMDR1cEp2MkZPeWUyU0hZ N3d0YXp5NWtjV0xvc1ZrM3ArZllIbmJtRXpnCnp2TVRyQVFqNC9kWXpBa0NnbW9X
Wlp4SFIwZUNQa25BRENsYWNoZmZoNjQKLS0tIEtIU3NRVS94SW80VXVGZy9hRkNQ VVFONnNleG9wN2IwdkhSWjBObmVGd3cKLS0tIHVDVmVNazdLWUpOQVlTNFRwL1c5
QmJKNDJUY0RSakhwNWlkOVpib0trc1kK0tQxD9I82pjfs54eruu+IjzVUmcVBCPw bkdsaXNINEZpZjdMdHAwdElpWFQ0aW8K0guO/BF8hp1LDToVBFY5JKdz8WXOwK2P
9mp1xKiYRRMXt3YQn6MPiyuuX3l3UB5MH0RJMNtRq0D961rs+iiS5A== prGKdxPsTAfW8xTq97LHHRsLC7+4TVXnjF4LS4SM8EXIX9KCl5FIGA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2025-11-28T12:26:45Z" recipient: age1awytvphvty4f9wmdn86xnjg9kgetqjx8qlwj5d2882t4fyyzy58s3vg5k4
mac: ENC[AES256_GCM,data:T4/aWHN9ILjaI1WAyO8VUQz87H0dmWjC3E6WnlNaRmTr5kDgpm6nYJHFGnrEEFUTPzAGluMTJzC3Sji6CqLKX7opOUtoDgUqiNHgz0oz7B28+RFGqxspo3IoCM4lJNrKBkZHnrKJFPUooYKc8aNm/goWWHQ/dL2uQ46Hvx9zK+o=,iv:Xq5XcYxkBCWMLFCgCYmkPgwBWMXpLFBPZY3iTTnXRcs=,tag:ZAPZAAv+qy4BM47aCgK89g==,type:str] - enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4ZEVtVzM0dFhJYWd5UXZO
ajIzSFp1VENuSjlaYSs4ZUdBSS90aEoyM25JCnhrd0lyUVN0dEV5a2tQUjZwSlFx
eVlLT1kyejhuZDdGeHpDQnRMTllCSHMKLS0tIHZVS1JDVzBaaG1Oend1eDFiT1F4
NU1vREt6SXBWYU1xdW1JSm1uUGZQRVEKtaDeDNo817rXXoMkBHo0MZWtm4LayqwC
NN8vbhGcgT+M+ehnmZ1HdPk8VWRvlQ+SMpG+a6DjK8BjYtAWcO16RQ==
-----END AGE ENCRYPTED FILE-----
recipient: age1erkn7dd022e90ktyj66aux9j9xvl0uzd6ru5cmrjsvcm5rtr5pfs7q6k9h
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6eUFYSC82YVM1WVEwc2Fz
aEl3TG5oOFU5MUFhQ0JhbC9yRVYxOFo0bUVJCnpwQzMyZmN4ZTlNVW5pZTY5bkdY
bjhaSnFxS0Vrb3pHTlJkWjVvczBSOG8KLS0tIHlsbjhxODdvcnd4c21aWUNpK01M
ZW1hTUFtVE15QzVIVU93ZExlUWZjYzAKUZj+/NtMHCPjFFqbJ/8b2ASljV6GEk6p
FbqV9LezRZrfl9GXBVUpB4Oeb9v2yp151aSda07/AG5YO0/jRAV/Bg==
-----END AGE ENCRYPTED FILE-----
recipient: age16crkeglm3j3f6rveylytuerptjf9mwtv3hl89ywkmnnvdkntfchsuvrsk5
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxdjFYN01HcXZMNVBJckVm
eklKZHAxeWgvVlcwWk9yWUJpcFFBUnpUV0FZCi85dGE2L3d3OS9CdW5sL0pZTTM2
SFJkcUN0emh6S3hMenhCcXBhNWF6eVUKLS0tIExwNEVyRmpGRXRLMjgxY1dqbkxQ
bk04K1luNnJVTjZQY25KRXNSVG0venMK7uM4tqqmq/o4QgMlE/x/FXkQsPRkofNO
I6C93RYgp1OcGPH14Kmp5lXtK4/pdToaRnVXPGenDQJsFhwWCEI+Fg==
-----END AGE ENCRYPTED FILE-----
recipient: age1tkywsvddjj6r6ukuqgz9aql92jfx85rz57dhmkkndysh6yx6p5rs0zj0qr
- enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsOTFXaHE0SDRCTnE4di9N
S2JIbHF2a1pzNzU4UFIvQmpZMVpOUjJqd0RJClVxcTd3d05aRDN1RGVmWVpQS2lI
L1RVU3FUM3d4SU9pYXlwSko2RW5uWjgKLS0tIEplR1l1bGlad3p1ZkNBbFY3YmlM
dUpXZis2N2VyN0ZFbjlPRXdwRFQ1aHMKm1Mk6MPKxFmwdATCYUANRSY5rHKgmQer
LBlqqWKt1JiIUAYtazQeQ6KYxmjVlQPY7AZw2t+EhBEPrqbTL3vOiw==
-----END AGE ENCRYPTED FILE-----
recipient: age17p69ktg7yfzgdsk00f32mupe4n4fevdpw2wsv7ft30yvpeseau6s7t0zdg
lastmodified: "2026-06-07T11:56:26Z"
mac: ENC[AES256_GCM,data:kQv2go+ITBpkicwlcy5OIFdU7DrSZCqGFKqmdHJN0hGYzGrabgiomBI7r2bqQPrzlvXNL/GSp9yv2cBO3nlgLdRakXB2ubZ+xGDkarErxuT4B1wG3ps8DaZzdG+Ed9aiHhhM3Fo5tzjF8CAFUAbIy+K45691lP/aXns2slQWVg8=,iv:PZBL1RQ4243vwlbrhRtAG7wt5i1TomQZ4mFy7bjjKRU=,tag:62St2XZxDh0kGd2OupnFPA==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.11.0 version: 3.13.0
+31 -20
View File
@@ -8,13 +8,6 @@ with lib; let
cfg = config.mySystem.boot; cfg = config.mySystem.boot;
in { in {
options.mySystem.boot = { options.mySystem.boot = {
extraModprobeConfig = mkOption {
type = types.lines;
default = "";
example = ''
options snd_usb_audio vid=0x1235 pid=0x8212 device_setup=1
'';
};
kernel = { kernel = {
package = mkOption { package = mkOption {
type = types.raw; type = types.raw;
@@ -29,18 +22,29 @@ in {
type = types.enum ["intel" "amd"]; type = types.enum ["intel" "amd"];
default = "amd"; default = "amd";
}; };
v4l2loopback = mkOption { v4l2loopback.enable = mkEnableOption "Enables v4l2loopback kernel module";
description = "Enables v4l2loopback";
type = types.bool;
default = true;
};
hardened = mkEnableOption "Enables hardened Linux kernel"; hardened = mkEnableOption "Enables hardened Linux kernel";
extraModprobeConfig = mkOption {
type = types.lines;
default = "";
example = ''
options snd_usb_audio vid=0x1235 pid=0x8212 device_setup=1
'';
};
}; };
systemd-boot = mkOption { systemd-boot = mkOption {
type = types.bool; type = types.bool;
default = true; default = !cfg.grub.enable;
description = "Does the system use systemd-boot?"; description = "Does the system use systemd-boot?";
}; };
grub = {
enable = mkEnableOption "Does the system use GRUB? (Disables systemd-boot)";
device = mkOption {
type = types.path;
description = "The GRUB device";
default = "";
};
};
zfs = { zfs = {
enable = mkEnableOption "Enables ZFS"; enable = mkEnableOption "Enables ZFS";
pools = mkOption { pools = mkOption {
@@ -50,22 +54,29 @@ in {
}; };
}; };
config.boot = { config.boot = mkIf (! config.mySystem.misc.mobile) {
initrd.kernelModules = lists.optional config.mySystem.hardware.amdgpu.enable "amdgpu"; initrd.kernelModules = lib.lists.singleton (
if config.mySystem.hardware.amdgpu.enable
then "amdgpu"
else "i915"
);
extraModprobeConfig =
strings.concatLines
([cfg.kernel.extraModprobeConfig]
++ lists.optional cfg.kernel.v4l2loopback.enable ''options v4l2loopback exclusive_caps=1 devices=1 video_nr=0 card_label="OBS Studio"'');
loader = { loader = {
systemd-boot.enable = cfg.systemd-boot; systemd-boot.enable = cfg.systemd-boot;
efi.canTouchEfiVariables = cfg.systemd-boot; efi.canTouchEfiVariables = cfg.systemd-boot;
grub = mkIf cfg.grub.enable {
inherit (cfg.grub) enable device;
};
}; };
supportedFilesystems = mkIf cfg.zfs.enable ["zfs"]; supportedFilesystems = mkIf cfg.zfs.enable ["zfs"];
zfs.extraPools = mkIf cfg.zfs.enable cfg.zfs.pools; zfs.extraPools = mkIf cfg.zfs.enable cfg.zfs.pools;
kernelPackages = kernelPackages = cfg.kernel.package;
if cfg.kernel.hardened
then pkgs.linuxPackages_hardened
else cfg.kernel.package;
kernelModules = kernelModules =
cfg.kernel.modules cfg.kernel.modules
++ ["kvm-${cfg.kernel.cpuVendor}"] ++ ["kvm-${cfg.kernel.cpuVendor}"]
++ lists.optional cfg.kernel.v4l2loopback "v4l2loopback"
++ lists.optional cfg.kernel.hardened "tcp_bbr"; ++ lists.optional cfg.kernel.hardened "tcp_bbr";
kernel.sysctl = mkIf cfg.kernel.hardened { kernel.sysctl = mkIf cfg.kernel.hardened {
"kernel.sysrq" = 0; # Disable magic SysRq key "kernel.sysrq" = 0; # Disable magic SysRq key
+1 -30
View File
@@ -1,44 +1,15 @@
{ {
lib,
config,
...
}:
with lib; let
cfg = config.mySystem.misc;
in {
imports = [ imports = [
./boot ./boot
./desktop ./desktop
./dev ./dev
./hardware ./hardware
./i18n ./i18n
./misc.nix
./network ./network
./packages ./packages
./security ./security
./services ./services
./users ./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;
time.timeZone = cfg.timezone;
console.keyMap = cfg.keymap;
services = {
orca.enable = false;
envfs.enable = true;
};
};
} }
+4 -1
View File
@@ -9,7 +9,10 @@ with lib; let
in { in {
options.mySystem.desktop.waydroid.enable = mkEnableOption "Enables Waydroid"; options.mySystem.desktop.waydroid.enable = mkEnableOption "Enables Waydroid";
config = mkIf cfg.enable { config = mkIf cfg.enable {
virtualisation.waydroid.enable = cfg.enable; virtualisation.waydroid = {
enable = cfg.enable;
package = pkgs.waydroid-nftables;
};
environment.systemPackages = [pkgs.waydroid-helper]; environment.systemPackages = [pkgs.waydroid-helper];
}; };
} }
+1
View File
@@ -30,6 +30,7 @@ in {
games.enable = false; games.enable = false;
gnome-remote-desktop.enable = true; gnome-remote-desktop.enable = true;
gnome-online-accounts.enable = true; gnome-online-accounts.enable = true;
gnome-keyring.enable = true;
sushi.enable = true; sushi.enable = true;
}; };
+12 -1
View File
@@ -12,9 +12,17 @@ in {
podman.enable = mkEnableOption "Enable Podman rather than Docker"; podman.enable = mkEnableOption "Enable Podman rather than Docker";
nvidia.enable = mkEnableOption "Activate Nvidia support"; nvidia.enable = mkEnableOption "Activate Nvidia support";
autoprune.enable = mkEnableOption "Enable autoprune"; autoprune.enable = mkEnableOption "Enable autoprune";
storage = mkOption {
type = types.nullOr types.path;
default = null;
example = "/path/to/docker/storage";
};
}; };
config = mkIf cfg.enable { 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; environment.systemPackages = with pkgs;
[ [
dive # A tool for exploring each layer in a docker image dive # A tool for exploring each layer in a docker image
@@ -24,11 +32,14 @@ in {
podman-compose podman-compose
podman-desktop podman-desktop
]; ];
virtualisation = mkIf cfg.enable { virtualisation = {
docker = mkIf (!cfg.podman.enable) { docker = mkIf (!cfg.podman.enable) {
enable = true; enable = true;
enableNvidia = cfg.nvidia.enable; enableNvidia = cfg.nvidia.enable;
autoPrune.enable = cfg.autoprune.enable; autoPrune.enable = cfg.autoprune.enable;
daemon.settings = mkIf (cfg.storage != null) {
"data-root" = cfg.storage;
};
}; };
podman = mkIf cfg.podman.enable { podman = mkIf cfg.podman.enable {
enable = true; enable = true;
+6 -2
View File
@@ -1,8 +1,12 @@
{ {lib, ...}: {
imports = [ imports = [
./amdgpu.nix ./amdgpu.nix
./bluetooth.nix ./bluetooth.nix
./sound.nix ./fingerprint.nix
./input ./input
./pinetab2.nix
./sound.nix
]; ];
hardware.enableAllFirmware = lib.mkDefault true;
} }
+13
View File
@@ -0,0 +1,13 @@
{
lib,
config,
...
}:
with lib; let
cfg = config.mySystem.hardware.fingerprint;
in {
options.mySystem.hardware.fingerprint.enable = mkEnableOption "Enable fingerprint reader";
config = mkIf cfg.enable {
hardware.facter.detected.fingerprint.enable = cfg.enable;
};
}
+4 -1
View File
@@ -7,8 +7,11 @@ with lib; let
cfg = config.mySystem.hardware.input.opentablet; cfg = config.mySystem.hardware.input.opentablet;
in { in {
options.mySystem.hardware.input.opentablet.enable = mkEnableOption "Enables OpenTablet drivers"; 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; inherit (cfg) enable;
daemon.enable = true; 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;
};
};
}
+8 -3
View File
@@ -8,7 +8,9 @@ with lib; let
cfg = config.mySystem.hardware.sound; cfg = config.mySystem.hardware.sound;
in { in {
options.mySystem.hardware.sound = { options.mySystem.hardware.sound = {
enable = mkEnableOption "Whether to enable sounds with Pipewire"; enable = mkEnableOption "Whether to enable sounds";
noisetorch = mkEnableOption "Whether to activate noisetorch support";
usePulseaudio = mkEnableOption "Activate sound support with Pulseaudio";
scarlett.enable = mkEnableOption "Activate support for Scarlett sound card"; scarlett.enable = mkEnableOption "Activate support for Scarlett sound card";
alsa = mkOption { alsa = mkOption {
type = types.bool; type = types.bool;
@@ -32,7 +34,8 @@ in {
config = { config = {
environment.systemPackages = mkIf cfg.scarlett.enable [pkgs.alsa-scarlett-gui]; environment.systemPackages = mkIf cfg.scarlett.enable [pkgs.alsa-scarlett-gui];
services.pipewire = mkIf cfg.enable { services = {
pipewire = mkIf (cfg.enable && ! cfg.usePulseaudio) {
enable = true; enable = true;
alsa = mkIf cfg.alsa { alsa = mkIf cfg.alsa {
enable = mkDefault true; enable = mkDefault true;
@@ -40,8 +43,10 @@ in {
}; };
jack.enable = mkDefault cfg.jack; jack.enable = mkDefault cfg.jack;
}; };
pulseaudio.enable = cfg.usePulseaudio;
};
programs.noisetorch = mkIf cfg.enable { programs.noisetorch = mkIf cfg.enable {
inherit (cfg) enable; enable = cfg.noisetorch;
}; };
}; };
} }
+1
View File
@@ -1,5 +1,6 @@
{ {
imports = [ imports = [
./input.nix
./locale.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
];
};
}
+56
View File
@@ -0,0 +1,56 @@
{
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";
};
mobile = mkEnableOption "Enable if using Mobile NixOS";
};
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; 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 = { config.networking = {
hostName = cfg.hostname; # Define your hostname. hostName = cfg.hostname; # Define your hostname.
hostId = cfg.id; hostId = cfg.id;
networkmanager.enable = true; networkmanager = {
enable = true;
wifi.powersave = ! cfg.wifi.disablePowersave;
};
inherit (cfg) hostFiles domain; inherit (cfg) hostFiles domain;
firewall = { firewall = {
enable = true; enable = true;
+8 -1
View File
@@ -12,5 +12,12 @@ in {
default = true; default = true;
}; };
}; };
config.services.tailscale.enable = cfg.enable; config.services.tailscale = {
inherit (cfg) enable;
extraSetFlags = [
"--accept-dns"
"--accept-routes"
"--ssh"
];
};
} }
+3 -7
View File
@@ -11,12 +11,8 @@ in {
enable = mkEnableOption "Enable Flatpak support"; enable = mkEnableOption "Enable Flatpak support";
builder.enable = mkEnableOption "Enable Flatpak builder"; builder.enable = mkEnableOption "Enable Flatpak builder";
}; };
config = { config = mkIf cfg.enable {
services.flatpak = mkIf cfg.enable { environment.systemPackages = lists.optional cfg.builder.enable pkgs.flatpak-builder;
inherit (cfg) enable; services.flatpak.enable = true;
};
environment.systemPackages = mkIf cfg.builder.enable [
pkgs.flatpak-buildR
];
}; };
} }
+1 -1
View File
@@ -27,7 +27,7 @@ in {
trusted-users = mkOption { trusted-users = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
example = ["alice" "bob"]; example = ["alice" "bob"];
default = []; default = ["@wheel" "root"];
}; };
}; };
+1
View File
@@ -2,4 +2,5 @@
imports = [ imports = [
./sops.nix ./sops.nix
]; ];
security.rtkit.enable = true;
} }
+2
View File
@@ -3,11 +3,13 @@
./calibre.nix ./calibre.nix
./endlessh.nix ./endlessh.nix
./fwupd.nix ./fwupd.nix
./harmonia.nix
./jellyfin.nix ./jellyfin.nix
./languagetool.nix ./languagetool.nix
./plex.nix ./plex.nix
./printing.nix ./printing.nix
./ssh.nix ./ssh.nix
./sunshine.nix ./sunshine.nix
./traefik.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}";
};
};
};
}
+5
View File
@@ -18,9 +18,14 @@ in {
example = true; example = true;
default = false; default = false;
}; };
port = mkOption {
type = types.int;
default = 22;
};
}; };
config.services.openssh = mkIf cfg.enable { config.services.openssh = mkIf cfg.enable {
inherit (cfg) enable; inherit (cfg) enable;
ports = [cfg.port];
settings = { settings = {
AllowUsers = cfg.allowedUsers; AllowUsers = cfg.allowedUsers;
PermitRootLogin = "no"; PermitRootLogin = "no";
+26 -6
View File
@@ -15,33 +15,53 @@ in {
autoStart = cfg.autostart; autoStart = cfg.autostart;
capSysAdmin = true; capSysAdmin = true;
openFirewall = true; openFirewall = true;
settings.sunshine_name = config.mySystem.networking.hostname; settings = {
applications.apps = [ sunshine_name = config.mySystem.networking.hostname;
locale = "en_GB";
system_tray = "enabled";
output_name = 1;
};
applications.apps = let
defaultPrep = [
{
do = "sh -c \"hyprctl -i 0 keyword monitor \\\"DP-2,\${SUNSHINE_CLIENT_WIDTH}x\${SUNSHINE_CLIENT_HEIGHT}@\${SUNSHINE_CLIENT_FPS},0x0,1\\\"\"";
undo = "sh -c \"hyprctl -i 0 keyword monitor 'DP-2,2560x1080@60,0x0,1,transform,1'\"";
}
];
in [
{ {
name = "Desktop"; name = "Desktop";
image-path = "desktop.png"; image-path = "desktop.png";
prep-cmd = defaultPrep;
} }
{ {
name = "Low Res Desktop"; name = "Low Res Desktop";
image-path = "desktop.png"; image-path = "desktop.png";
prep-cmd = defaultPrep;
} }
{ {
name = "Steam Big Picture"; name = "Steam Big Picture";
detached = ["setsid steam steam://open/bigpicture"]; detached = ["setsid steam steam://open/bigpicture"];
prep-cmd = { prep-cmd = defaultPrep;
do = "";
undo = "setsid steam steam://close/bigpicture";
};
image-path = "steam.png"; image-path = "steam.png";
} }
{ {
name = "OpenTTD"; name = "OpenTTD";
cmd = "openttd"; cmd = "openttd";
image-path = "/home/phundrak/.config/sunshine/covers/igdb_18074.png"; image-path = "/home/phundrak/.config/sunshine/covers/igdb_18074.png";
prep-cmd = defaultPrep;
} }
{ {
name = "OpenMW"; name = "OpenMW";
cmd = "openmw"; cmd = "openmw";
image-path = "/home/phundrak/.config/sunshine/covers/igdb_24775.png";
prep-cmd = defaultPrep;
}
{
name = "Vintage Story";
cmd = "flatpak run at.vintagestory.VintageStory";
image-path = "/home/phundrak/.config/sunshine/covers/igdb_69547.png";
prep-cmd = defaultPrep;
} }
]; ];
}; };
+71
View File
@@ -0,0 +1,71 @@
{
config,
lib,
...
}:
with lib; let
cfg = config.mySystem.services.traefik;
in {
options.mySystem.services.traefik = {
enable = mkEnableOption "Enable Traefik";
email = mkOption {
type = types.str;
default = "";
};
dataDir = mkOption {
type = types.path;
default = "/tank/traefik";
example = "/path/to/traefik/data";
};
environmentFiles = mkOption {
type = types.listOf types.path;
example = ["/var/traefik/traefik.env"];
default = [];
};
dynamicConfigFile = mkOption {
type = types.path;
default = "${cfg.dataDir}/traefik.yaml";
example = "/var/traefik/dynamic.yaml";
};
};
config.services.traefik = {
inherit (cfg) enable dynamicConfigFile environmentFiles;
staticConfigOptions = {
api.dashboard = true;
log = {
level = "INFO";
filePath = "${cfg.dataDir}/traefik.log";
format = "json";
};
accessLog.filePath = "${cfg.dataDir}/access.log";
entryPoints = {
web = {
address = ":80";
asDefault = true;
http.redirections.entrypoint = {
to = "websecure";
scheme = "https";
};
};
websecure = {
address = ":443";
asDefault = true;
httpChallenge.entryPoint = "websecure";
};
};
providers.docker = {
endpoint = "unix:///var/run/docker.sock";
exposedByDefault = false;
};
certificatesResolvers.cloudflare.acme = {
inherit (cfg) email;
storage = "${cfg.dataDir}/acme.json";
dnsChallenge = {
provider = "cloudflare";
resolvers = ["1.1.1.1:53" "1.0.0.1:53"];
propagation.delayBeforeChecks = 60;
};
};
};
};
}
+36
View File
@@ -0,0 +1,36 @@
{
lib,
config,
pkgs,
...
}:
with lib; let
cfg = config.mySystem.users.creug;
in {
options.mySystem.users.creug = {
enable = mkEnableOption "Enables user creug";
sudo = mkEnableOption "Make the user a superuser";
trusted = mkOption {
description = "Mark the user as trusted by Nix";
default = cfg.sudo;
example = true;
};
};
config = {
users.users.creug = mkIf cfg.enable {
isNormalUser = true;
description = "Greg";
extraGroups =
["networkmanager" "dialout" "games" "audio" "input"]
++ lists.optional config.mySystem.dev.docker.enable "docker"
++ lists.optional config.mySystem.dev.docker.podman.enable "podman"
++ lists.optional cfg.sudo "wheel";
shell = pkgs.zsh;
openssh.authorizedKeys.keyFiles = lib.filesystem.listFilesRecursive ../../users/creug/keys;
};
nix.settings = mkIf cfg.trusted {
trusted-users = ["creug"];
};
};
}
+3
View File
@@ -1,5 +1,8 @@
{ {
imports = [ imports = [
./creug.nix
./phundrak.nix ./phundrak.nix
./root.nix
]; ];
programs.zsh.enable = true;
} }
+16 -13
View File
@@ -5,27 +5,30 @@
... ...
}: }:
with lib; let with lib; let
cfg = config.mySystem.users; cfg = config.mySystem.users.phundrak;
in { in {
options.mySystem.users = { options.mySystem.users.phundrak = {
root.disablePassword = mkEnableOption "Disables root password"; enable = mkEnableOption "Enables user phundrak";
phundrak.enable = mkEnableOption "Enables users phundrak"; trusted = mkEnableOption "Mark the user as trusted by Nix";
extraGroups = mkOption {
type = types.listOf types.str;
default = [];
example = ["feedbackd"];
};
}; };
config = { config = {
users.users = { users.users.phundrak = mkIf cfg.enable {
root = {
hashedPassword = mkIf cfg.root.disablePassword "*";
shell = pkgs.zsh;
};
phundrak = mkIf cfg.phundrak.enable {
isNormalUser = true; isNormalUser = true;
description = "Lucien Cartier-Tilet"; 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; shell = pkgs.zsh;
openssh.authorizedKeys.keyFiles = lib.filesystem.listFilesRecursive ../../keys; openssh.authorizedKeys.keyFiles = lib.filesystem.listFilesRecursive ../../users/phundrak/keys;
}; };
nix.settings = mkIf cfg.trusted {
trusted-users = ["phundrak"];
}; };
programs.zsh.enable = true;
}; };
} }
+17
View File
@@ -0,0 +1,17 @@
{
lib,
config,
pkgs,
...
}:
with lib; let
cfg = config.mySystem.users.root;
in {
options.mySystem.users.root.disablePassword = mkEnableOption "Disables root password";
config = {
users.users.root = {
hashedPassword = mkIf cfg.disablePassword "*";
shell = pkgs.zsh;
};
};
}
+66
View File
@@ -0,0 +1,66 @@
{
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.home.creug;
in {
imports = [../modules];
options.home.creug = {
sshKey = {
content = mkOption {
type = types.nullOr types.str;
example = "ssh-ed25519 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
default = null;
};
file = mkOption {
type = with types; nullOr path;
default = "/home/creug/.ssh/id_ed25519.pub";
};
};
};
config = {
nixpkgs.config.allowUnfree = true;
home = {
username = "creug";
homeDirectory = "/home/creug";
packages = [pkgs.tree pkgs.ncdu];
preferXdgDirectories = true;
creug.sshKey.file = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
dev.vcs = {
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;
};
security.ssh.enable = true;
shell = {
bash.enable = true;
zsh.enable = true;
starship.enable = true;
tmux.enable = false;
zoxide.enable = false;
};
stateVersion = "24.11"; # Do not modify!
};
manual.manpages.enable = true;
};
}
+8
View File
@@ -0,0 +1,8 @@
{
imports = [../home.nix];
home = {
cli.nh.flake = "/home/creug/.dotfiles";
dev.editors.emacs.enable = false;
creug.sshKey.content = builtins.readFile ../keys/id_elcafe.pub;
};
}
+1
View File
@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBdd4cNNhONjhuH4jWZ8Z8K1gbBmeDNqRybKRHMQEvZj gregoryfoulachon@googlemail.com
+15 -5
View File
@@ -1,10 +1,20 @@
{pkgs, ...}: { {
pkgs,
config,
...
}: let
inherit (config.home) gpuType;
in {
programs.btop = { programs.btop = {
enable = true; enable = true;
package = pkgs.btop.override { package =
rocmSupport = true; if gpuType != null
cudaSupport = true; then
}; pkgs.btop.override {
rocmSupport = gpuType == "amd";
cudaSupport = gpuType == "nvidia";
}
else pkgs.btop;
settings = { settings = {
color_theme = "${pkgs.btop}/share/btop/themes/nord.theme"; color_theme = "${pkgs.btop}/share/btop/themes/nord.theme";
cpu_bottom = false; cpu_bottom = false;
+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
@@ -1,3 +1,3 @@
{pkgs, ...}: {pkgs, ...}:
pkgs.writeShellScriptBin "mp42webm" '' pkgs.writeShellScriptBin "mp42webm" ''
${pkgs.ffmpeg}/bin/ffmpeg -i "$1" -c:v libvpx -crf 10 -b:v 1M -c:a libvorbis "$1".webm'' ${pkgs.ffmpeg}/bin/ffmpeg -i "$1" -c:v libvpx -crf 10 -b:v 1M -c:a -hwaccel=auto libvorbis "$1".webm''
+25 -1
View File
@@ -1,16 +1,40 @@
{pkgs, ...}: {pkgs, ...}:
pkgs.writeShellScriptBin "plock" '' pkgs.writeShellScriptBin "plock" ''
LOG_FILE="$HOME/.local/share/plock.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 "locking Caelestia session"
caelestia shell lock lock || \
logger error "failed to lock Caelestia session"
exit 0
fi
TMPBG="/tmp/screen.png" TMPBG="/tmp/screen.png"
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
logger info "wayland session detected"
SCREENER=${pkgs.grim}/bin/grim SCREENER=${pkgs.grim}/bin/grim
LOCKER="${pkgs.swaylock}/bin/swaylock -feF" LOCKER="${pkgs.swaylock}/bin/swaylock -feF"
else else
logger info "x11 session detected"
SCREENER=${pkgs.scrot}/bin/scrot SCREENER=${pkgs.scrot}/bin/scrot
LOCKER="${pkgs.i3lock}/bin/i3lock -ef" LOCKER="${pkgs.i3lock}/bin/i3lock -ef"
fi fi
$SCREENER "$TMPBG" $SCREENER "$TMPBG"
${pkgs.corrupter}/bin/corrupter -add 0 "$TMPBG" "$TMPBG" logger info "generating lock screen image"
${pkgs.corrupter}/bin/corrupter -add 0 "$TMPBG" "$TMPBG" || logger error "failed to generate lock screen image"
logger info "locking screen"
logger debug "locking screen with command `''${SCREENER}`"
$LOCKER -ti "$TMPBG" $LOCKER -ti "$TMPBG"
rm "$TMPBG" rm "$TMPBG"
'' ''
+9 -2
View File
@@ -17,13 +17,20 @@ in {
./shell ./shell
]; ];
options.home.fullDesktop = mkEnableOption "Enable most modules"; options.home = {
fullDesktop = mkEnableOption "Enable most modules";
gpuType = mkOption {
type = types.nullOr (types.enum ["nvidia" "amd" "intel"]);
default = null;
example = "amd";
};
};
config.home = { config.home = {
cli.fullDesktop = mkDefault cfg.fullDesktop; cli.fullDesktop = mkDefault cfg.fullDesktop;
desktop.fullDesktop = mkDefault cfg.fullDesktop; desktop.fullDesktop = mkDefault cfg.fullDesktop;
dev.fullDesktop = mkDefault cfg.fullDesktop; dev.fullDesktop = mkDefault cfg.fullDesktop;
media.fullDesktop = mkDefault cfg.fullDesktop; media.fullDesktop = mkDefault cfg.fullDesktop;
security.fullDesktop = mkDefault cfg.fullDesktop; security.fullDesktop = mkDefault cfg.fullDesktop;
services.fullDesktop = mkDefault cfg.fullDesktop; myServices.fullDesktop = mkDefault cfg.fullDesktop;
}; };
} }
+82
View File
@@ -0,0 +1,82 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.home.desktop.caelestia;
in {
options.home.desktop.caelestia.enable = mkEnableOption "Enables Caelestia Shell";
config.programs.caelestia = mkIf cfg.enable {
inherit (cfg) enable;
systemd = {
enable = true;
target = "graphical-session.target";
environment = ["QT3_QPA_PLATFORMTHEME=gtk3"];
};
settings = {
paths.wallpaperDir = "~/Pictures/Wallpapers/nord";
general = {
apps = {
terminal = ["kitty"];
audio = ["pavucontrol"];
playback = ["mpv"];
explorer = ["${pkgs.nemo-with-extensions}/bin/nemo"];
};
idle = {
inhibitWhenAudio = true;
timeouts = [
{
timeout = 3600;
idleAction = "lock";
}
];
};
};
background = {
desktopClock.enabled = true;
visualiser.enabled = true;
};
dashboard = {
enabled = true;
showOnHover = true;
};
launcher = {
enabled = true;
showOnHover = true;
useFuzzy = {
apps = true;
schemes = true;
wallpapers = true;
};
};
osd.enableMicrophone = true;
bar = {
status = {
showAudio = true;
showKbLayout = false;
};
tray.compact = true;
};
services = mkIf (config.home.gpuType != null) {
inherit (config.home) gpuType;
};
session.commands = {
logout = ["uwsm" "stop"];
shutdown = ["systemctl" "poweroff"];
hibernate = ["systemctl" "hibernate"];
reboot = ["systemctl" "reboot"];
};
utilities.toasts = {
capsLockChanged = false;
numLockChanged = false;
kbLayoutChanged = false;
};
};
cli = {
enable = true;
settings.theme.enableGtk = true;
};
};
}
+9 -4
View File
@@ -7,28 +7,33 @@ with lib; let
cfg = config.home.desktop; cfg = config.home.desktop;
in { in {
imports = [ imports = [
./eww.nix ./caelestia.nix
./firefox.nix
./hyprland.nix ./hyprland.nix
./kdeconnect.nix ./kdeconnect.nix
./kitty.nix ./kitty.nix
./obs.nix ./obs.nix
./qt.nix
./rofi ./rofi
./spotify.nix
./swaync.nix ./swaync.nix
./theme.nix
./waybar.nix ./waybar.nix
./wl-kbptr.nix
./wlr-which-key.nix ./wlr-which-key.nix
./wlsunset.nix ./wlsunset.nix
]; ];
options.home.desktop.fullDesktop = mkEnableOption "Enable options for graphical environments"; options.home.desktop.fullDesktop = mkEnableOption "Enable options for graphical environments";
config.home.desktop = { config.home.desktop = {
eww.enable = mkDefault cfg.fullDesktop; firefox.enable = mkDefault cfg.fullDesktop;
hyprland.enable = mkDefault cfg.fullDesktop; hyprland.enable = mkDefault cfg.fullDesktop;
kdeconnect.enable = mkDefault cfg.fullDesktop; kdeconnect.enable = mkDefault cfg.fullDesktop;
kitty.enable = mkDefault cfg.fullDesktop; kitty.enable = mkDefault cfg.fullDesktop;
obs.enable = mkDefault cfg.fullDesktop; obs.enable = mkDefault cfg.fullDesktop;
qt.enable = mkDefault cfg.fullDesktop;
rofi.enable = mkDefault cfg.fullDesktop; rofi.enable = mkDefault cfg.fullDesktop;
spotify.enable = mkDefault cfg.fullDesktop;
spotify.spicetify.enable = mkDefault cfg.fullDesktop;
theme.enable = mkDefault cfg.fullDesktop;
wlr-which-key.enable = mkDefault cfg.fullDesktop; wlr-which-key.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
]);
};
};
}
+29 -13
View File
@@ -7,6 +7,7 @@
with lib; let with lib; let
cfg = config.home.desktop.hyprland; cfg = config.home.desktop.hyprland;
laptops = ["gampo"]; laptops = ["gampo"];
caelestiaEnabled = config.home.desktop.caelestia.enable;
in { in {
imports = [ imports = [
./swaync.nix ./swaync.nix
@@ -34,38 +35,43 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.desktop = { home.desktop = {
hyprpaper.enable = true; hyprpaper.enable = mkDefault (! caelestiaEnabled);
rofi.enable = mkDefault true; rofi.enable = mkDefault true;
swaync.enable = mkDefault true; swaync.enable = mkDefault (! caelestiaEnabled);
waybar = { waybar = {
enable = mkDefault true; enable = mkDefault (! caelestiaEnabled);
battery = mkDefault (builtins.elem cfg.host laptops); battery = mkDefault (builtins.elem cfg.host laptops);
}; };
wlsunset.enable = mkDefault true; wlsunset.enable = mkDefault true;
}; };
services.blueman-applet.enable = true; services.blueman-applet.enable = ! caelestiaEnabled;
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
enable = true; enable = true;
xwayland.enable = true;
systemd.enable = false; systemd.enable = false;
importantPrefixes = ["$left" "$right" "$up" "$down" "$menu"]; importantPrefixes = ["$left" "$right" "$up" "$down" "$menu"];
settings = { settings = {
env = [
"XMODIFIERS,@im=fcitx"
"XCURSOR_SIZE,12"
];
input = { input = {
kb_layout = "fr,us"; kb_layout = "fr,us";
kb_variant = "bepo_afnor,"; kb_variant = "bepo_afnor,";
# kb_options = "caps:ctrl_modifier";
numlock_by_default = true; numlock_by_default = true;
follow_mouse = 1; follow_mouse = 1;
touchpad.natural_scroll = false; touchpad.natural_scroll = false;
sensitivity = "0"; sensitivity = "0";
}; };
device = {
name = "wacom-usb-bamboo-pad-finger";
sensitivity = 0.5;
};
monitor = monitor =
{ {
"marpa" = [ "marpa" = [
"DP-1, 3440x1440@144, 1080x550, 1" "DP-1, 3440x1440@144, 1080x550, 1"
# "DP-1, 2560x1440@144, 1080x550, 1" # streaming
"DP-2, 2560x1080@60, 0x0, 1, transform, 1" "DP-2, 2560x1080@60, 0x0, 1, transform, 1"
# "DP-2, 1366x768@60, 0x0, 1"
# "DP-2, 1829x1143@60, 0x0, 1"
]; ];
"gampo" = []; "gampo" = [];
}."${cfg.host}"; }."${cfg.host}";
@@ -82,11 +88,12 @@ in {
new_status = "inherit"; new_status = "inherit";
}; };
workspace = [ workspace = [
"10, layoutopt:orientation:bottom"
"1, layoutopt:orientation:bottom" "1, layoutopt:orientation:bottom"
"9, layoutopt:orientation:bottom"
"10, layoutopt:orientation:bottom"
]; ];
decoration = { decoration = {
rounding = 5; rounding = 20;
}; };
animations = { animations = {
enabled = true; enabled = true;
@@ -103,14 +110,23 @@ in {
pseudotile = true; pseudotile = true;
preserve_split = true; preserve_split = true;
}; };
exec-once = [ exec-once =
[
"pactl load-module module-switch-on-connect" "pactl load-module module-switch-on-connect"
"${pkgs.mpc}/bin/mpc stop" "${pkgs.mpc}/bin/mpc stop"
"${pkgs.networkmanagerapplet}/bin/nm-applet"
"${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1" "${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 = '' extraConfig = ''
device {
name = wacom-usb-bamboo-pad-finger
sensitivity = 0.5
accel_profile = adaptive
}
$left = c $left = c
$right = r $right = r
$up = s $up = s
+67 -65
View File
@@ -29,84 +29,86 @@ in {
detect_urls = true; detect_urls = true;
background_opacity = 0.7; background_opacity = 0.7;
}; };
keybindings = { keybindings = let
prefix = "kitty_mod+space";
in {
"alt+c" = "copy_to_clipboard"; "alt+c" = "copy_to_clipboard";
"kitty_mod+c" = "copy_to_clipboard"; "kitty_mod+c" = "copy_to_clipboard";
"alt+v" = "paste_from_clipboard"; "alt+v" = "paste_from_clipboard";
"kitty_mod+v" = "paste_from_clipboard"; "kitty_mod+v" = "paste_from_clipboard";
"kitty_mod+s>c" = "show_scrollback"; "${prefix}>s>c" = "show_scrollback";
"kitty_mod+s>down" = "scroll_line_down"; "${prefix}>s>down" = "scroll_line_down";
"kitty_mod+s>t" = "scroll_line_down"; "${prefix}>s>t" = "scroll_line_down";
"kitty_mod+s>up" = "scroll_line_up"; "${prefix}>s>up" = "scroll_line_up";
"kitty_mod+s>s" = "scroll_line_up"; "${prefix}>s>s" = "scroll_line_up";
"kitty_mod+s>end" = "scroll_end"; "${prefix}>s>end" = "scroll_end";
"kitty_mod+s>home" = "scroll_home"; "${prefix}>s>home" = "scroll_home";
"kitty_mod+s>page_down" = "scroll_page_down"; "${prefix}>s>page_down" = "scroll_page_down";
"kitty_mod+s>page_up" = "scroll_page_up"; "${prefix}>s>page_up" = "scroll_page_up";
"kitty_mod+enter" = "new_window"; "${prefix}>enter" = "new_window";
"kitty_mod+w>q" = "close_window"; "${prefix}>w>q" = "close_window";
"kitty_mod+w>p" = "next_window"; "${prefix}>w>p" = "next_window";
"kitty_mod+w>n" = "previous_window"; "${prefix}>w>n" = "previous_window";
"kitty_mod+w>f" = "move_window_forward"; "${prefix}>w>f" = "move_window_forward";
"kitty_mod+w>b" = "move_window_backward"; "${prefix}>w>b" = "move_window_backward";
"kitty_mod+w>t" = "move_window_to_top"; "${prefix}>w>t" = "move_window_to_top";
"kitty_mod+w>r" = "start_resizing_window"; "${prefix}>w>r" = "start_resizing_window";
"kitty_mod+w>1" = "first_window"; "${prefix}>w>1" = "first_window";
"kitty_mod+w>2" = "second_window"; "${prefix}>w>2" = "second_window";
"kitty_mod+w>3" = "third_window"; "${prefix}>w>3" = "third_window";
"kitty_mod+w>4" = "fourth_window"; "${prefix}>w>4" = "fourth_window";
"kitty_mod+w>5" = "fifth_window"; "${prefix}>w>5" = "fifth_window";
"kitty_mod+w>6" = "sixth_window"; "${prefix}>w>6" = "sixth_window";
"kitty_mod+w>7" = "seventh_window"; "${prefix}>w>7" = "seventh_window";
"kitty_mod+w>8" = "eighth_window"; "${prefix}>w>8" = "eighth_window";
"kitty_mod+w>9" = "ninth_window"; "${prefix}>w>9" = "ninth_window";
"kitty_mod+w>0" = "tenth_window"; "${prefix}>w>0" = "tenth_window";
"kitty_mod+tab>n" = "next_tab"; "${prefix}>tab>n" = "next_tab";
"kitty_mod+tab>p" = "previous_tab"; "${prefix}>tab>p" = "previous_tab";
"kitty_mod+tab>c" = "new_tab"; "${prefix}>tab>c" = "new_tab";
"kitty_mod+tab>q" = "close_tab"; "${prefix}>tab>q" = "close_tab";
"kitty_mod+tab>shift+n" = "move_tab_backward"; "${prefix}>tab>shift+n" = "move_tab_backward";
"kitty_mod+tab>shift+p" = "move_tab_forward"; "${prefix}>tab>shift+p" = "move_tab_forward";
"kitty_mod+tab>t" = "set_tab_title"; "${prefix}>tab>t" = "set_tab_title";
"kitty_mod+l" = "next_layout"; "${prefix}>l" = "next_layout";
"kitty_mod+f>equal" = "change_font_size all 0"; "${prefix}>f>equal" = "change_font_size all 0";
"kitty_mod+f>kp_add" = "change_font_size all +2.0"; "${prefix}>f>kp_add" = "change_font_size all +2.0";
"kitty_mod+f>plus" = "change_font_size all +2.0"; "${prefix}>f>plus" = "change_font_size all +2.0";
"kitty_mod+f>kp_subtract" = "change_font_size all -2.0"; "${prefix}>f>kp_subtract" = "change_font_size all -2.0";
"kitty_mod+f>minus" = "change_font_size all -2.0"; "${prefix}>f>minus" = "change_font_size all -2.0";
"kitty_mod+shift+h" = "kitten hints"; "${prefix}>shift+h" = "kitten hints";
"kitty_mod+h>p" = "kitten hints --type path --program -"; "${prefix}>h>p" = "kitten hints --type path --program -";
"kitty_mod+h>shift+p" = "kitten hints --type path"; "${prefix}>h>shift+p" = "kitten hints --type path";
"kitty_mod+h>l" = "kitten hints --type line --program -"; "${prefix}>h>l" = "kitten hints --type line --program -";
"kitty_mod+h>w" = "kitten hints --type word --program -"; "${prefix}>h>w" = "kitten hints --type word --program -";
"kitty_mod+h>h" = "kitten hints --type hash --program -"; "${prefix}>h>h" = "kitten hints --type hash --program -";
"kitty_mod+h>n" = "kitten hints --type linenum"; "${prefix}>h>n" = "kitten hints --type linenum";
"kitty_mod+h>y" = "kitten hints --type hyperlink"; "${prefix}>h>y" = "kitten hints --type hyperlink";
"kitty_mod+f10" = "toggle_maximized"; "${prefix}>f10" = "toggle_maximized";
"kitty_mod+f11" = "toggle_fullscreen"; "${prefix}>f11" = "toggle_fullscreen";
"kitty_mod+a>equal" = "set_background_opacity 1"; "${prefix}>a>equal" = "set_background_opacity 1";
"kitty_mod+a>d" = "set_background_opacity default"; "${prefix}>a>d" = "set_background_opacity default";
"kitty_mod+a>plus" = "set_background_opacity +0.1"; "${prefix}>a>plus" = "set_background_opacity +0.1";
"kitty_mod+a>up" = "set_background_opacity +0.1"; "${prefix}>a>up" = "set_background_opacity +0.1";
"kitty_mod+a>kp_add" = "set_background_opacity +0.1"; "${prefix}>a>kp_add" = "set_background_opacity +0.1";
"kitty_mod+a>minus" = "set_background_opacity -0.1"; "${prefix}>a>minus" = "set_background_opacity -0.1";
"kitty_mod+a>down" = "set_background_opacity -0.1"; "${prefix}>a>down" = "set_background_opacity -0.1";
"kitty_mod+a>kp_substract" = "set_background_opacity -0.1"; "${prefix}>a>kp_substract" = "set_background_opacity -0.1";
"kitty_mod+delete" = "clear_terminal reset active"; "${prefix}>delete" = "clear_terminal reset active";
"kitty_mod+escape" = "kitty_shell window"; "${prefix}>escape" = "kitty_shell window";
"kitty_mod+f2" = "edit_config_file"; "${prefix}>f2" = "edit_config_file";
"kitty_mod+n" = "new_os_window"; "${prefix}>n" = "new_os_window";
"kitty_mod+o" = "pass_selection_to_program"; "${prefix}>o" = "pass_selection_to_program";
"kitty_mod+u" = "kitten unicode_input"; "${prefix}>u" = "kitten unicode_input";
}; };
}; };
} }
+4
View File
@@ -6,6 +6,7 @@
}: }:
with lib; let with lib; let
cfg = config.home.desktop.obs; cfg = config.home.desktop.obs;
obs-image-reaction = pkgs.callPackage ../../../packages/obs-image-reaction.nix {};
in { in {
options.home.desktop.obs.enable = mkEnableOption "Enables OBS Studio"; options.home.desktop.obs.enable = mkEnableOption "Enables OBS Studio";
config.programs.obs-studio = mkIf cfg.enable { config.programs.obs-studio = mkIf cfg.enable {
@@ -13,11 +14,14 @@ in {
plugins = with pkgs.obs-studio-plugins; [ plugins = with pkgs.obs-studio-plugins; [
input-overlay input-overlay
obs-backgroundremoval obs-backgroundremoval
obs-markdown
obs-mute-filter obs-mute-filter
obs-pipewire-audio-capture obs-pipewire-audio-capture
obs-scale-to-sound
obs-source-clone obs-source-clone
obs-source-record obs-source-record
obs-tuna obs-tuna
obs-image-reaction
]; ];
}; };
} }
-11
View File
@@ -1,11 +0,0 @@
{
lib,
config,
...
}:
with lib; let
cfg = config.home.desktop.qt;
in {
options.home.desktop.qt.enable = mkEnableOption "Enable Qt support";
config.qt.enable = cfg.enable;
}
+25
View File
@@ -0,0 +1,25 @@
{
pkgs,
config,
lib,
inputs,
...
}:
with lib; let
inherit (pkgs.stdenv.hostPlatform) system;
cfg = config.home.desktop.spotify;
spicePkgs = inputs.spicetify.legacyPackages.${system};
in {
options.home.desktop.spotify = {
enable = mkEnableOption "Enable Spotify";
spicetify.enable = mkEnableOption "Enable Spicetify";
};
config.programs = mkIf cfg.enable {
spotify-player.enable = cfg.enable;
spicetify = mkIf cfg.spicetify.enable {
inherit (cfg.spicetify) enable;
theme = spicePkgs.themes.sleek;
colorScheme = "Nord";
};
};
}
+34
View File
@@ -0,0 +1,34 @@
{
pkgs,
config,
lib,
...
}:
with lib; let
cfg = config.home.desktop.theme;
in {
options.home.desktop.theme.enable = mkEnableOption "Enable theme options";
config = mkIf cfg.enable {
gtk = {
enable = true;
colorScheme = "dark";
iconTheme = {
name = "Nordzy-icons";
package = pkgs.nordzy-icon-theme;
};
theme = {
package = pkgs.nordic;
name = "Nordic";
};
gtk4.theme = config.gtk.theme;
};
home.pointerCursor = {
enable = true;
gtk.enable = true;
hyprcursor.enable = config.home.desktop.hyprland.enable;
name = "Nordzy-cursors";
package = pkgs.nordzy-cursor-theme;
};
qt.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;
};
};
};
}
+1 -1
View File
@@ -21,7 +21,7 @@
# Recursively filter out null values and convert kebab-case keys to snake_case # Recursively filter out null values and convert kebab-case keys to snake_case
filterNulls = value: filterNulls = value:
if lib.isAttrs value if lib.isAttrs value
then lib.mapAttrs' (n: v: lib.nameValuePair (toSnakeCase n) (filterNulls v)) (lib.filterAttrs (n: v: v != null) value) then lib.mapAttrs' (n: v: lib.nameValuePair (toSnakeCase n) (filterNulls v)) (lib.filterAttrs (_: v: v != null) value)
else if lib.isList value else if lib.isList value
then map filterNulls value then map filterNulls value
else value; else value;
+15 -5
View File
@@ -1,18 +1,28 @@
{ {
config, config,
lib, lib,
inputs, pkgs,
system,
... ...
}: }:
with lib; let with lib; let
cfg = config.home.dev.ai.claude; cfg = config.home.dev.ai.claude;
jsonFormat = pkgs.formats.json {};
in { 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 { config = mkIf cfg.enable {
home.packages = [inputs.claude-desktop.packages.${system}.claude-desktop-with-fhs]; 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.' "$@"
'';
in [claude-jj pkgs.sox];
programs.claude-code = { programs.claude-code = {
inherit (cfg) enable; inherit (cfg) enable mcpServers;
}; };
}; };
} }
+26 -4
View File
@@ -1,19 +1,41 @@
{ {
config, config,
lib, lib,
pkgs,
... ...
}: }:
with lib; let with lib; let
cfg = config.home.dev.ai; cfg = config.home.dev.ai;
jsonFormat = pkgs.formats.json {};
in { in {
imports = [ imports = [
./ollama.nix
./claude.nix ./claude.nix
./ollama.nix
./opencode.nix
]; ];
options.home.dev.ai.enable = mkEnableOption "Enables AI features"; options.home.dev.ai = {
config.home.dev.ai = mkIf cfg.enable { enable = mkEnableOption "Enables AI features";
mcpServers = mkOption {
inherit (jsonFormat) type;
default = {};
};
};
config = {
home = mkIf cfg.enable {
dev.ai = {
claude = {
enable = mkDefault cfg.enable;
mcpServers = mkDefault cfg.mcpServers;
};
ollama.enable = mkDefault cfg.enable; ollama.enable = mkDefault cfg.enable;
claude.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;
};
};
}
+5
View File
@@ -37,7 +37,12 @@ in {
services.emacs = mkIf cfg.service { services.emacs = mkIf cfg.service {
enable = true; enable = true;
inherit (cfg) package; inherit (cfg) package;
defaultEditor = true;
startWithUserSession = "graphical"; startWithUserSession = "graphical";
client = {
enable = true;
arguments = ["-c" "-a" "${cfg.package}/bin/emacs"];
};
}; };
xdg.desktopEntries.mu4e = mkIf cfg.mu4eMime { xdg.desktopEntries.mu4e = mkIf cfg.mu4eMime {
+4
View File
@@ -48,6 +48,10 @@ in {
enable = mkDefault true; enable = mkDefault true;
inherit (cfg) name email editor; inherit (cfg) name email editor;
signing.sshKey = mkDefault (cfg.publicKey.file or cfg.publicKey.content); 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/" "dist/"
]; ];
signing = {
format =
if cfg.publicKeyFile != null
then "ssh"
else "openpgp";
key = cfg.publicKeyFile;
signByDefault = true;
};
settings = { settings = {
user = { user = {
inherit (cfg) name email; inherit (cfg) name email;
@@ -151,8 +159,6 @@ in {
renames = "copy"; renames = "copy";
interHunkContext = 10; interHunkContext = 10;
}; };
commit.gpgsign = cfg.publicKeyFile != null;
gpg.format = "ssh";
gpg.ssh.allowedSignersFile = "${config.home.homeDirectory}/.ssh/allowed_signers"; gpg.ssh.allowedSignersFile = "${config.home.homeDirectory}/.ssh/allowed_signers";
init.defaultBranch = "main"; init.defaultBranch = "main";
pull.rebase = true; pull.rebase = true;
@@ -168,7 +174,6 @@ in {
updateRefs = true; updateRefs = true;
}; };
help.autocorrect = "prompt"; help.autocorrect = "prompt";
user.signingkey = mkIf (cfg.publicKeyFile != null) cfg.publicKeyFile;
web.browser = mkIf (cfg.browser != null) cfg.browser; web.browser = mkIf (cfg.browser != null) cfg.browser;
sendemail = mkIf cfg.sendmail.enable { sendemail = mkIf cfg.sendmail.enable {
smtpserver = cfg.sendmail.server; smtpserver = cfg.sendmail.server;
+39 -5
View File
@@ -2,10 +2,13 @@
lib, lib,
config, config,
pkgs, pkgs,
inputs,
... ...
}: }:
with lib; let with lib; let
inherit (pkgs.stdenv.hostPlatform) system;
cfg = config.home.dev.vcs.jj; cfg = config.home.dev.vcs.jj;
jj-cz = inputs.jj-cz.packages.${system}.default;
in { in {
options.home.dev.vcs.jj = { options.home.dev.vcs.jj = {
enable = mkEnableOption "enables jj"; enable = mkEnableOption "enables jj";
@@ -33,9 +36,21 @@ in {
description = "Path to the private SSH key for signing."; 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; enable = true;
settings = { settings = {
user = { user = {
@@ -45,9 +60,8 @@ in {
default-command = "st"; default-command = "st";
pager = ":builtin"; pager = ":builtin";
show-cryptographic-signatures = true; show-cryptographic-signatures = true;
conflict-marker-style = "git"; # Support for vc-jj.el
diff-formatter = ":git"; # Support for vc-jj.el
diff-editor = ":builtin"; diff-editor = ":builtin";
merge-editort = ":builtin";
inherit (cfg) editor; inherit (cfg) editor;
}; };
signing = mkIf cfg.signing.enable { signing = mkIf cfg.signing.enable {
@@ -60,27 +74,45 @@ in {
aliases = { aliases = {
blame = ["file" "annotate"]; blame = ["file" "annotate"];
consume = ["squash" "--into" "@" "--from"]; consume = ["squash" "--into" "@" "--from"];
cz = mkIf cfg.cz.alias ["util" "exec" "--" "${jj-cz}/bin/jj-cz"];
eject = ["squash" "--from" "@" "--into"]; eject = ["squash" "--from" "@" "--into"];
d = ["diff"]; d = ["diff"];
dm = ["desc" "-m"]; dm = ["desc" "-m"];
gc = ["git" "clone"];
gcc = ["git" "clone" "--colocate"];
l = ["log"]; l = ["log"];
la = ["log" "-r" "::"];
lc = ["log" "-r" "(remote_bookmarks()..@)::"]; lc = ["log" "-r" "(remote_bookmarks()..@)::"];
ll = ["log" "-T" "builtin_log_detailed"]; ll = ["log" "-T" "builtin_log_detailed"];
open = ["log" "-r" "open()"]; open = ["log" "-r" "open()"];
n = ["new"]; n = ["new"];
nd = ["new" "dev()"]; nd = ["new" "dev()"];
nt = ["new" "trunk()"]; nt = ["new" "trunk()"];
revlog = ["evolog"];
s = ["show"]; s = ["show"];
tug = ["bookmark" "move" "--from" "heads(::@- & bookmarks())" "--to" "@-"]; tug = ["bookmark" "move" "--from" "heads(::@- & bookmarks())" "--to" "@-"];
}; };
colors.working_copy.underline = true;
git = {
private-commits = "blacklist()";
colocate = true;
subprocess = true;
};
revset-aliases = { revset-aliases = {
"immutable_heads()" = "present(trunk()) | tags()";
# Resolves by default to latest main/master remote bookmarks
"trunk()" = "latest((present(main) | present(master)) & remote_bookmarks())";
# Same as trunk() but for `dev` or `develop` bookmarks
"dev()" = "latest((present(dev) | present(develop)) & remote_bookmarks())";
"user(x)" = "author(x) | committer(x)"; "user(x)" = "author(x) | committer(x)";
"gh_pages()" = "ancestors(remote_bookmarks(exact:\"gh-pages\"))"; "gh_pages()" = "ancestors(remote_bookmarks(exact:\"gh-pages\"))";
"trunk()" = "latest((present(main) | present(master)) & remote_bookmarks())";
"dev()" = "latest((present(dev) | present(develop)) & remote_bookmarks())"; #Private and WIP commits that should never be pushed
"wip()" = "description(glob:\"wip:*\")"; "wip()" = "description(glob:\"wip:*\")";
"private()" = "description(glob:\"private:*\")"; "private()" = "description(glob:\"private:*\")";
"blacklist()" = "wip() | private()"; "blacklist()" = "wip() | private()";
# stack(x, n) is the set of mutable commits reachable from # stack(x, n) is the set of mutable commits reachable from
# 'x', with 'n' parents. 'n' is often useful to customize the # 'x', with 'n' parents. 'n' is often useful to customize the
# display and return set for certain operations. 'x' can be # display and return set for certain operations. 'x' can be
@@ -93,6 +125,8 @@ in {
"open()" = "stack(dev().. & mine(), 1)"; "open()" = "stack(dev().. & mine(), 1)";
"ready()" = "open() ~ blacklist()::"; "ready()" = "open() ~ blacklist()::";
}; };
remotes.origin.auto-track-bookmarks = "*";
};
}; };
}; };
} }
+2
View File
@@ -11,6 +11,7 @@ in {
./mpd.nix ./mpd.nix
./mpd-mpris.nix ./mpd-mpris.nix
./mpv.nix ./mpv.nix
./ncmpcpp.nix
]; ];
options.home.media.fullDesktop = mkEnableOption "Enables everything"; options.home.media.fullDesktop = mkEnableOption "Enables everything";
@@ -18,5 +19,6 @@ in {
mopidy.enable = mkDefault cfg.fullDesktop; mopidy.enable = mkDefault cfg.fullDesktop;
mpd.enable = mkDefault (cfg.fullDesktop or cfg.mpd-mpris.enable); mpd.enable = mkDefault (cfg.fullDesktop or cfg.mpd-mpris.enable);
mpv.enable = mkDefault cfg.fullDesktop; mpv.enable = mkDefault cfg.fullDesktop;
ncmpcpp.enable = mkDefault config.home.media.mpd.enable;
}; };
} }
+5
View File
@@ -19,6 +19,11 @@ in {
bind_to_address "localhost" bind_to_address "localhost"
auto_update "yes" auto_update "yes"
audio_output {
type "pipewire"
name "PipeWire"
}
audio_output { audio_output {
type "fifo" type "fifo"
name "my_fifo" name "my_fifo"
+2 -2
View File
@@ -15,7 +15,7 @@ in {
force-seekable = true; # force streams to be seekable force-seekable = true; # force streams to be seekable
slang = "jpn,jp,eng,en,fra,fr"; slang = "jpn,jp,eng,en,fra,fr";
alang = "eng,en,fra,fr"; alang = "eng,en,fra,fr";
gpu-api = "vulkan"; gpu-api = "auto";
osc = true; osc = true;
profile = "gpu-hq"; profile = "gpu-hq";
# geometry = "50%x50%"; # geometry = "50%x50%";
@@ -44,7 +44,7 @@ in {
encode encode
inhibit-gnome inhibit-gnome
mpris mpris
mpv-cheatsheet mpv-cheatsheet-ng
quality-menu quality-menu
sponsorblock sponsorblock
thumbfast thumbfast
+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";
};
};
}
+2 -5
View File
@@ -11,10 +11,7 @@ in {
enable = mkEnableOption "Enable GPG"; enable = mkEnableOption "Enable GPG";
pinentry.package = mkOption { pinentry.package = mkOption {
type = types.package; type = types.package;
default = default = pkgs.pinentry-gnome3;
if config.home.dev.editors.emacs.enable
then pkgs.pinentry-emacs
else pkgs.pinentry-gtk2;
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
@@ -25,7 +22,7 @@ in {
}; };
services.gpg-agent = { services.gpg-agent = {
enable = true; enable = true;
enableSshSupport = true; enableSshSupport = false;
pinentry.package = cfg.pinentry.package; pinentry.package = cfg.pinentry.package;
}; };
}; };
+2 -2
View File
@@ -4,8 +4,8 @@
... ...
}: }:
with lib; let with lib; let
cfg = config.home.services.blanket; cfg = config.home.myServices.blanket;
in { in {
options.home.services.blanket.enable = mkEnableOption "Enable blanket"; options.home.myServices.blanket.enable = mkEnableOption "Enable blanket";
config.services.blanket.enable = cfg.enable; config.services.blanket.enable = cfg.enable;
} }
+7 -3
View File
@@ -4,7 +4,7 @@
... ...
}: }:
with lib; let with lib; let
cfg = config.home.services; cfg = config.home.myServices;
in { in {
imports = [ imports = [
./blanket.nix ./blanket.nix
@@ -12,8 +12,12 @@ in {
./mpris-proxy.nix ./mpris-proxy.nix
./playerctld.nix ./playerctld.nix
]; ];
options.home.services.fullDesktop = mkEnableOption "Enable all modules"; options.home.myServices.fullDesktop = mkOption {
config.home.services = { description = "Enable all modules";
type = types.bool;
default = config.home.fullDesktop;
};
config.home.myServices = {
blanket.enable = mkDefault cfg.fullDesktop; blanket.enable = mkDefault cfg.fullDesktop;
mbsync.enable = mkDefault cfg.fullDesktop; mbsync.enable = mkDefault cfg.fullDesktop;
mpris-proxy.enable = mkDefault cfg.fullDesktop; mpris-proxy.enable = mkDefault cfg.fullDesktop;
+2 -2
View File
@@ -4,9 +4,9 @@
... ...
}: }:
with lib; let with lib; let
cfg = config.home.services.mbsync; cfg = config.home.myServices.mbsync;
in { in {
options.home.services.mbsync = { options.home.myServices.mbsync = {
enable = mkEnableOption "Enables mbsync"; enable = mkEnableOption "Enables mbsync";
service.enable = mkOption { service.enable = mkOption {
type = types.bool; type = types.bool;
+2 -2
View File
@@ -4,8 +4,8 @@
... ...
}: }:
with lib; let with lib; let
cfg = config.home.services.mpris-proxy; cfg = config.home.myServices.mpris-proxy;
in { 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; config.services.mpris-proxy.enable = cfg.enable;
} }
+2 -2
View File
@@ -4,8 +4,8 @@
... ...
}: }:
with lib; let with lib; let
cfg = config.home.services.playerctld; cfg = config.home.myServices.playerctld;
in { 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; config.services.playerctld.enable = cfg.enable;
} }
+7
View File
@@ -16,6 +16,11 @@ in {
lns = "ln -si"; lns = "ln -si";
}; };
}; };
autocompletion = mkOption {
type = types.bool;
default = config.home.shell.autocompletion;
example = true;
};
eatIntegration = mkEnableOption "Enable Emacs Eat integration"; eatIntegration = mkEnableOption "Enable Emacs Eat integration";
bashrcExtra = mkOption { bashrcExtra = mkOption {
type = types.lines; type = types.lines;
@@ -31,8 +36,10 @@ in {
concatLines concatLines
[ [
(strings.optionalString cfg.eatIntegration ''[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/bash"'') (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 cfg.bashrcExtra
]; ];
enableCompletion = cfg.autocompletion;
shellAliases = cfg.aliases; shellAliases = cfg.aliases;
shellOptions = [ shellOptions = [
"histappend" "histappend"
+17 -5
View File
@@ -4,7 +4,7 @@
... ...
}: }:
with lib; let with lib; let
aliases = { defaultAliases = {
df = "df -H"; df = "df -H";
diskspace = "sudo df -h | grep -E \"sd|lv|Size\""; diskspace = "sudo df -h | grep -E \"sd|lv|Size\"";
du = "du -ch"; du = "du -ch";
@@ -78,22 +78,34 @@ in {
./fish.nix ./fish.nix
./starship.nix ./starship.nix
./tmux.nix ./tmux.nix
./zellij.nix
./zsh.nix ./zsh.nix
./zoxide.nix ./zoxide.nix
]; ];
options.home.shell.fullDesktop = mkEnableOption "Enable all shells"; options.home.shell = {
fullDesktop = mkEnableOption "Enable all shells";
aliases = mkOption {
type = types.attrsOf types.str;
default = {};
example = {la = "ls -a";};
};
autocompletion = mkOption {
type = types.bool;
default = true;
};
};
config.home.shell = { config.home.shell = {
enableShellIntegration = cfg.bash.enable or cfg.zsh.enable or cfg.fish.enable; enableShellIntegration = cfg.bash.enable or cfg.zsh.enable or cfg.fish.enable;
bash = { bash = {
aliases = mkDefault aliases; aliases = defaultAliases // cfg.aliases;
enable = mkDefault cfg.fullDesktop; enable = mkDefault cfg.fullDesktop;
}; };
fish = { fish = {
abbrs = mkDefault aliases; abbrs = defaultAliases // cfg.aliases;
enable = mkDefault cfg.fullDesktop; enable = mkDefault cfg.fullDesktop;
}; };
zsh = { zsh = {
abbrs = mkDefault aliases; abbrs = defaultAliases // cfg.aliases;
enable = mkDefault cfg.fullDesktop; enable = mkDefault cfg.fullDesktop;
}; };
}; };
+7
View File
@@ -17,6 +17,11 @@ in {
lns = "ln -si"; lns = "ln -si";
}; };
}; };
autocompletion = mkOption {
type = types.bool;
default = config.home.shell.autocompletion;
example = true;
};
extraShellInit = mkOption { extraShellInit = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
@@ -26,6 +31,7 @@ in {
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
programs.fish = { programs.fish = {
enable = true; enable = true;
generateCompletions = cfg.autocompletion;
shellAbbrs = cfg.abbrs; shellAbbrs = cfg.abbrs;
preferAbbrs = true; preferAbbrs = true;
shellInit = with lib; shellInit = with lib;
@@ -35,6 +41,7 @@ in {
__fish_default_command_not_found_handler $argv __fish_default_command_not_found_handler $argv
end end
'' ''
(strings.optionalString config.home.dev.vcs.jj.shellCompletion "jj util completion fish | source")
cfg.extraShellInit cfg.extraShellInit
]; ];
plugins = [ plugins = [
+29 -1
View File
@@ -19,7 +19,34 @@ in {
inherit (cfg) enable; inherit (cfg) enable;
enableTransience = true; enableTransience = true;
settings = mkIf cfg.jjIntegration { settings = mkIf cfg.jjIntegration {
custom.jj = { # Disabling these so they can be enabled conditionally
# See https://github.com/jj-vcs/jj/wiki/Starship
git_status.disabled = true;
git_commit.disabled = true;
git_metrics.disabled = true;
git_branch.disabled = true;
custom = let
when = "! jj --ignore-working-copy-root";
description = "Only show if were not in a jj repository";
style = "";
in {
git_status = {
inherit when description style;
command = "starship module git_status";
};
git_commit = {
inherit when description style;
command = "starship module git_commit";
};
git_metrics = {
inherit when description style;
command = "starship module git_metrics";
};
git_branch = {
inherit when description style;
command = "starship module git_branch";
};
jj = {
description = "The current jj status"; description = "The current jj status";
detect_folders = [".jj"]; detect_folders = [".jj"];
symbol = "🥋 "; symbol = "🥋 ";
@@ -46,4 +73,5 @@ in {
}; };
}; };
}; };
};
} }
+51 -65
View File
@@ -6,8 +6,42 @@
}: }:
with lib; let with lib; let
cfg = config.home.shell.tmux; 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 { 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 { config.programs.tmux = mkIf cfg.enable {
inherit (cfg) enable; inherit (cfg) enable;
baseIndex = 1; baseIndex = 1;
@@ -25,71 +59,23 @@ in {
sensible sensible
yank yank
]; ];
extraConfig = '' extraConfig = let
set-option -sa terminal-overrides ",xterm*:Tc" 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 ${generateUnbind}
${generateBinds}
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
''; '';
}; };
} }
+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;
};
}
+11 -1
View File
@@ -17,6 +17,11 @@ in {
lns = "ln -si"; lns = "ln -si";
}; };
}; };
autocompletion = mkOption {
type = types.bool;
default = config.home.shell.autocompletion;
example = true;
};
eatIntegration = mkEnableOption "Enable Emacs Eat integration"; eatIntegration = mkEnableOption "Enable Emacs Eat integration";
zshrcExtra = lib.mkOption { zshrcExtra = lib.mkOption {
type = types.lines; type = types.lines;
@@ -32,7 +37,7 @@ in {
enable = true; enable = true;
strategy = ["match_prev_cmd" "completion"]; strategy = ["match_prev_cmd" "completion"];
}; };
enableCompletion = true; enableCompletion = cfg.autocompletion;
enableVteIntegration = true; enableVteIntegration = true;
history = { history = {
findNoDups = true; findNoDups = true;
@@ -57,6 +62,11 @@ in {
zstyle ':fzf-tab:complete:cd:*' fzf-preview '${pkgs.eza}/bin/eza $realpath' 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 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 cfg.zshrcExtra
]; ];
oh-my-zsh = { oh-my-zsh = {
File diff suppressed because it is too large Load Diff
+54
View File
@@ -0,0 +1,54 @@
{config, ...}: {
home.dev.ai = {
enable = 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 = {
npm = "@ai-sdk/openai-compatible";
name = "Ollama (marpa)";
options.baseURL = "http://marpa:11434/v1";
};
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";
read = {
"*" = "allow";
"*.env" = "deny";
"*.env.*" = "deny";
"*.env.example" = "allow";
};
};
formatter.nixfmt = {
command = ["nix" "fmt" "$FILE"];
extensions = [".nix"];
};
};
web = {
enable = true;
cors = config.sops.secrets."opencode/cors".path;
mdns.enable = true;
};
};
};
}
+1
View File
@@ -8,6 +8,7 @@
@@@ Sauvez un arbre, mangez un castor @@@ @@@ Sauvez un arbre, mangez un castor @@@
@@@ Save a tree, eat a beaver @@@ @@@ Save a tree, eat a beaver @@@
@@@ Bjarg tré, et bjórr @@@
''; '';
in { in {
home.file.".signature" = { home.file.".signature" = {
+77
View File
@@ -0,0 +1,77 @@
{
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 = ''
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?)://youtube\.com f
unbind ^http(s?)://youtube\.com t
unbind ^http(s?)://youtube\.com l
unbind ^http(s?)://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 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}"`)
'';
};
};
}
+29 -5
View File
@@ -5,9 +5,12 @@
... ...
}: { }: {
imports = [ imports = [
./ai.nix
./light-home.nix ./light-home.nix
./packages.nix ./packages.nix
./email.nix ./email.nix
./firefox.nix
./tmux.nix
./wlr-which-key ./wlr-which-key
../modules ../modules
]; ];
@@ -54,24 +57,44 @@
emailPassword = {}; emailPassword = {};
"mopidy/bandcamp" = {}; "mopidy/bandcamp" = {};
"mopidy/spotify" = {}; "mopidy/spotify" = {};
"opencode/cors" = {};
}; };
home = { home = {
sessionVariables = { sessionVariables = {
EDITOR = "${config.home.dev.editors.emacs.package}/bin/emacsclient -c -a ${config.home.dev.editors.emacs.package}/bin/emacs";
LAUNCH_EDITOR = "${launchWithEmacsclient}/bin/launch-with-emacsclient"; LAUNCH_EDITOR = "${launchWithEmacsclient}/bin/launch-with-emacsclient";
SUDO_ASKPASS = "${askpass}/bin/askpass"; SUDO_ASKPASS = "${askpass}/bin/askpass";
LSP_USE_PLISTS = "true"; LSP_USE_PLISTS = "true";
OPENAI_API_URL = "http://localhost:1234/"; OPENAI_API_URL = "http://localhost:1234/";
}; };
desktop.waybar.style = ./config/waybar/style.css; desktop = {
caelestia.enable = true;
spotify = {
enable = true;
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 = { dev = {
ai.claude.enable = true;
editors.emacs.package = emacsPackage; editors.emacs.package = emacsPackage;
vcs.jj.signing.enable = true; vcs.jj.signing.enable = true;
}; };
fullDesktop = true; fullDesktop = true;
file."${config.home.homeDirectory}/.ssh/allowed_signers" = { file = {
".XCompose".source = ./XCompose;
"${config.home.homeDirectory}/.ssh/allowed_signers" = {
enable = true; enable = true;
text = lib.strings.join "\n" ( text = lib.strings.join "\n" (
map (file: let map (file: let
@@ -79,10 +102,11 @@
parts = lib.strings.splitString " " content; parts = lib.strings.splitString " " content;
email = lib.lists.last parts; email = lib.lists.last parts;
in "${email} namespaces=\"git\" ${content}") in "${email} namespaces=\"git\" ${content}")
(lib.filesystem.listFilesRecursive ../../keys) (lib.filesystem.listFilesRecursive ./keys)
); );
}; };
}; };
};
manual = { manual = {
html.enable = true; html.enable = true;
+1 -4
View File
@@ -2,9 +2,6 @@
imports = [../light-home.nix]; imports = [../light-home.nix];
home = { home = {
cli.nh.flake = "${config.home.homeDirectory}/nixos"; cli.nh.flake = "${config.home.homeDirectory}/nixos";
phundrak.sshKey = { phundrak.sshKey.content = builtins.readFile ../keys/id_alys.pub;
content = builtins.readFile ../../../keys/id_alys.pub;
# file = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
};
}; };
} }

Some files were not shown because too many files have changed in this diff Show More