Compare commits

..

66 Commits

Author SHA1 Message Date
800d0adeea feat(pumo): add config for phone pumo 2026-05-01 16:27:56 +02:00
5514d347c7 feat(nix): add marpa as binary cache for Nix 2026-05-01 16:27:56 +02:00
06519d555b feat(packages): add QGIS 2026-05-01 15:24:44 +02:00
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
171d635b72 fix(gampo): refer to proper home config 2026-04-28 10:47:38 +02:00
3bc4e3dd15 feat(vcs): jj config for Creug 2026-04-12 18:07:33 +02:00
4b7a64c8ac fix(copyparty): disable copyparty for elcafe for now 2026-04-12 15:18:38 +02:00
9024d2c744 fix(kernel): remove reference to deprecated hardened kernel 2026-04-12 15:09:52 +02:00
d13d81c60a feat(devshell): add jj and git to dev environment 2026-04-12 15:02:17 +02:00
88cf103332 chore(lockfile): update lockfile 2026-04-12 15:00:14 +02:00
9431a71539 feat(ai): add opencode to AI packages 2026-04-12 15:00:14 +02:00
6fa865644a feat(wl-kbptr): package wl-kbptr for NixOS as home module 2026-04-12 14:58:02 +02:00
154d0e4ddb chore(flake): update flake lock, remove devenv input 2026-04-12 14:58:02 +02:00
cae0357dbe feat(claude-code): add sox for voice mode 2026-04-12 14:58:02 +02:00
477a0b7372 feat(firefox): dedicated module and tridactyl config 2026-04-12 14:57:58 +02:00
5b12250fd5 feat(handy): upgrade to handy 0.8.0 2026-03-28 22:32:47 +01:00
b8c88cae25 chore(flakes): update flakes 2026-03-28 22:32:47 +01:00
63bd1471d8 feat(system): add additional substituters 2026-03-26 11:24:49 +01:00
647432314d feat(jujutsu): add jj-cz options to jujutsu module 2026-03-26 11:24:49 +01:00
bfaaee0f36 feat(zellij): add zellij configuration 2026-03-26 11:24:49 +01:00
ab089afefd feat(spotify): re-enable Spicetify 2026-03-14 14:21:52 +01:00
79e3156bb3 feat(copyparty): create copyparty service for elcafe 2026-03-07 18:50:58 +01:00
5e8db88008 chore(packages): update signal desktop name and remove gplates 2026-03-07 18:03:33 +01:00
ff39f983f9 chore(mpv): update mpv script name 2026-03-07 18:03:33 +01:00
6088946973 chore(handy): update Handy from 0.7.6 to 0.7.7 2026-03-07 18:03:33 +01:00
0f213ed01f chore(flake): update flake lockfile 2026-03-07 18:03:33 +01:00
097ce13793 feat(packages): package inkdrop 2026-02-26 19:42:40 +01:00
efa9be4314 fix(sunshine): automatically set screen resolution for sunshine 2026-02-24 13:04:10 +01:00
7223b63fca chore(flake): update flakes 2026-02-24 01:46:26 +01:00
32b3c81b46 feat(handy): package Handy for Nix 2026-02-22 19:31:27 +01:00
5e934f87a3 feat(spotify): disable spicetify for now 2026-02-22 19:31:27 +01:00
0927313f6d fix(hyprland): fix cursor size on XWayland windows 2026-02-22 19:31:27 +01:00
8fa1d2e111 style: formatting 2026-02-22 19:31:27 +01:00
54e8beecfd feat(caelestia): improve configuration for caelestia 2026-02-22 19:31:27 +01:00
21e85fc77b feat: improve GPU support for modules 2026-02-22 19:31:27 +01:00
b4a57a8f64 feat: improve v4l2loopback support 2026-02-22 19:31:23 +01:00
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
a35d536b75 feat: add possibility to use fingerprint reader 2026-02-22 18:01:42 +01:00
0815dd3a30 feat(elcafe): add creug user 2026-02-13 09:08:21 +01:00
35541ea5ae feat(elcafe): add new server configuration 2026-02-08 16:45:58 +01:00
e90fb1fa0d feat(user/email): add Eittlandic translation to email signature 2026-02-08 00:19:15 +01:00
c8fd643085 feat(user/jj): improve jj configuration 2026-02-08 00:18:53 +01:00
5d9efbb651 feat(shell): improve shell completion 2026-02-08 00:18:30 +01:00
582460d8f4 docs(README): nicer Readme header 2026-02-05 20:51:33 +01:00
76d1a33a78 feat: prefer XDG directories 2026-01-25 05:03:53 +01:00
f5fa1683b4 feat(emacs): improve configuration 2026-01-25 05:03:30 +01:00
36d5c90017 fix(gampo): early video drivers load 2026-01-25 05:03:13 +01:00
5c9c3d199b fix(hosts): temporarily fix hosts file issue 2026-01-25 05:03:13 +01:00
be51aa7cc5 feat(theme): better theming 2026-01-25 05:03:09 +01:00
f6fe7945bb chore(flakes): update flakes lockfile 2026-01-24 20:08:19 +01:00
f0398f4d9c feat(spotify): use Spicetify with Spotify 2026-01-24 13:24:12 +01:00
a1842b22db feat(starship): remove most git info in jj repos 2026-01-24 13:23:38 +01:00
615909867e feat(AI): replace opencode with LM Studio 2026-01-24 12:57:37 +01:00
a632ebbf07 fix(wlr-which-key): add forgotten logout command 2026-01-24 12:57:04 +01:00
51f2c77c02 feat(hyprland): adapt to new Hyprland config and caelestia 2026-01-24 12:56:33 +01:00
e0226af16a feat(marpa): auto login on Marpa’s startup 2026-01-24 12:56:08 +01:00
7a1465bc3b refactor: some code cleanup 2026-01-24 12:55:52 +01:00
87a7fc00fe feat(secrets): update secrets 2026-01-24 12:54:48 +01:00
c6b3abd1a7 chore(flakes): update flake lockfile 2026-01-24 12:54:13 +01:00
32c57b0671 feat: switch frow waybar to quickshell and caelestia 2025-12-24 19:22:58 +01:00
22bd5c7b2a feat(packages): remove some GNOME stuff, add bun and nixfmt 2025-12-22 01:50:07 +01:00
813fc3026c feat(shell): better handling of additional shell aliases/abbreviations 2025-12-22 01:49:21 +01:00
5497d6df51 fix(AI): remove claude desktop, fixes for ollama 2025-12-22 01:48:48 +01:00
1a43dcdad4 fix(gpg): fix password requests when signing with SSH keys 2025-12-22 01:42:22 +01:00
93f009852f feat(tailscale): better defaults 2025-12-22 01:38:20 +01:00
9071957b4c feat(hosts): add NaroMk3 to the existing hosts 2025-12-07 13:31:57 +01:00
88 changed files with 4749 additions and 660 deletions

6
.envrc
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

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

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.
</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>
Personal NixOS configuration for my machines, using Nix Flakes for reproducible and shareable setups.
## 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

485
flake.lock generated
View File

@@ -1,19 +1,47 @@
{ {
"nodes": { "nodes": {
"alejandra": {
"inputs": {
"fenix": "fenix",
"flakeCompat": "flakeCompat",
"nixpkgs": [
"jj-cz",
"nixpkgs"
]
},
"locked": {
"lastModified": 1744324181,
"narHash": "sha256-Oi1n2ncF4/AWeY6X55o2FddIRICokbciqFYK64XorYk=",
"owner": "kamadorueda",
"repo": "alejandra",
"rev": "3e2a85506627062313e131bf8a85315f3387c8e0",
"type": "github"
},
"original": {
"owner": "kamadorueda",
"ref": "4.0.0",
"repo": "alejandra",
"type": "github"
}
},
"cachix": { "cachix": {
"inputs": { "inputs": {
"devenv": [ "devenv": [
"jj-cz",
"devenv" "devenv"
], ],
"flake-compat": [ "flake-compat": [
"jj-cz",
"devenv", "devenv",
"flake-compat" "flake-compat"
], ],
"git-hooks": [ "git-hooks": [
"jj-cz",
"devenv", "devenv",
"git-hooks" "git-hooks"
], ],
"nixpkgs": [ "nixpkgs": [
"jj-cz",
"devenv", "devenv",
"nixpkgs" "nixpkgs"
] ]
@@ -33,7 +61,53 @@
"type": "github" "type": "github"
} }
}, },
"claude-desktop": { "caelestia-cli": {
"inputs": {
"caelestia-shell": [
"caelestia-shell"
],
"nixpkgs": [
"caelestia-shell",
"nixpkgs"
]
},
"locked": {
"lastModified": 1772764582,
"narHash": "sha256-hSwjmpXHFqzSXrndVekA0IheKrbC7wi0IbfZTYwlmXw=",
"owner": "caelestia-dots",
"repo": "cli",
"rev": "4bcd42f482d038b98145b0b03388244b68b7d35d",
"type": "github"
},
"original": {
"owner": "caelestia-dots",
"repo": "cli",
"type": "github"
}
},
"caelestia-shell": {
"inputs": {
"caelestia-cli": "caelestia-cli",
"nixpkgs": [
"nixpkgs"
],
"quickshell": "quickshell"
},
"locked": {
"lastModified": 1775660122,
"narHash": "sha256-qMKB06TE0MY1anDQKBrzZEpktNPyvMxQQzTEEwWAA6I=",
"owner": "caelestia-dots",
"repo": "shell",
"rev": "aa2b08dd45963dc9558de94dbff5e1615e347d02",
"type": "github"
},
"original": {
"owner": "caelestia-dots",
"repo": "shell",
"type": "github"
}
},
"copyparty": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": [ "nixpkgs": [
@@ -41,16 +115,16 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764098187, "lastModified": 1775334496,
"narHash": "sha256-H6JjWXhKqxZ8QLMoqndZx9e5x0Sv5AiipSmqvIxIbgo=", "narHash": "sha256-dUopEMj5KhH1vnv43o29kMsayp0Ki+9EfIn4UAE9sAU=",
"owner": "k3d3", "owner": "9001",
"repo": "claude-desktop-linux-flake", "repo": "copyparty",
"rev": "b2b040cb68231d2118906507d9cc8fd181ca6308", "rev": "ede692925edfc6fca7a52f483414d543e9303237",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "k3d3", "owner": "9001",
"repo": "claude-desktop-linux-flake", "repo": "copyparty",
"type": "github" "type": "github"
} }
}, },
@@ -61,16 +135,18 @@
"flake-parts": "flake-parts", "flake-parts": "flake-parts",
"git-hooks": "git-hooks", "git-hooks": "git-hooks",
"nix": "nix", "nix": "nix",
"nixd": "nixd",
"nixpkgs": [ "nixpkgs": [
"jj-cz",
"nixpkgs" "nixpkgs"
] ]
}, },
"locked": { "locked": {
"lastModified": 1764669403, "lastModified": 1770304289,
"narHash": "sha256-aJCOp0CV/9KIR2LTwSbZZN3j9Avg7umYyaqDFPoOVhI=", "narHash": "sha256-+g+XMyB1zi50h2N38GE32l7ZONX4oW7Nw6QSXzfNiwk=",
"owner": "cachix", "owner": "cachix",
"repo": "devenv", "repo": "devenv",
"rev": "3f2d25e7af748127da0571266054575dd8fec5ab", "rev": "fd777e39027d393346e4df672d51ad2bf44b2a12",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -79,6 +155,29 @@
"type": "github" "type": "github"
} }
}, },
"fenix": {
"inputs": {
"nixpkgs": [
"jj-cz",
"alejandra",
"nixpkgs"
],
"rust-analyzer-src": "rust-analyzer-src"
},
"locked": {
"lastModified": 1730615655,
"narHash": "sha256-2HBR3zLn57LXKNRtxBb+O+uDqHM4n0pz51rPayMl4cg=",
"owner": "nix-community",
"repo": "fenix",
"rev": "efeb50e2535b17ffd4a135e6e3e5fd60a525180c",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "fenix",
"type": "github"
}
},
"flake-compat": { "flake-compat": {
"flake": false, "flake": false,
"locked": { "locked": {
@@ -98,6 +197,7 @@
"flake-parts": { "flake-parts": {
"inputs": { "inputs": {
"nixpkgs-lib": [ "nixpkgs-lib": [
"jj-cz",
"devenv", "devenv",
"nixpkgs" "nixpkgs"
] ]
@@ -116,7 +216,37 @@
"type": "github" "type": "github"
} }
}, },
"flake-root": {
"locked": {
"lastModified": 1723604017,
"narHash": "sha256-rBtQ8gg+Dn4Sx/s+pvjdq3CB2wQNzx9XGFq/JVGCB6k=",
"owner": "srid",
"repo": "flake-root",
"rev": "b759a56851e10cb13f6b8e5698af7b59c44be26e",
"type": "github"
},
"original": {
"owner": "srid",
"repo": "flake-root",
"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 +264,7 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils_2": { "flake-utils_3": {
"inputs": { "inputs": {
"systems": "systems_2" "systems": "systems_2"
}, },
@@ -152,14 +282,50 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils_4": {
"inputs": {
"systems": "systems_3"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flakeCompat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"git-hooks": { "git-hooks": {
"inputs": { "inputs": {
"flake-compat": [ "flake-compat": [
"jj-cz",
"devenv", "devenv",
"flake-compat" "flake-compat"
], ],
"gitignore": "gitignore", "gitignore": "gitignore",
"nixpkgs": [ "nixpkgs": [
"jj-cz",
"devenv", "devenv",
"nixpkgs" "nixpkgs"
] ]
@@ -181,6 +347,7 @@
"gitignore": { "gitignore": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
"jj-cz",
"devenv", "devenv",
"git-hooks", "git-hooks",
"nixpkgs" "nixpkgs"
@@ -207,11 +374,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764780230, "lastModified": 1775683737,
"narHash": "sha256-/hLZoLxzr2jwMStuUofB6PZm2eE3kpw91WObm66vPUs=", "narHash": "sha256-oBYyowo6yfgb95Z78s3uTnAd9KkpJpwzjJbfnpLaM2Y=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "af324afa72de6d23162f0cdcb0716afe6e626683", "rev": "7ba4ee4228ed36123c7cb75d50524b43514ef992",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -220,42 +387,88 @@
"type": "github" "type": "github"
} }
}, },
"jj-cz": {
"inputs": {
"alejandra": "alejandra",
"devenv": "devenv",
"flake-utils": "flake-utils_3",
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1775400071,
"narHash": "sha256-uFoqOUB1wbqqDKRdHNEYdgyRQECYWhJBq4Oxjm3Dx9M=",
"ref": "refs/heads/develop",
"rev": "3da214ae4c14f57dc5f6ecd480330936f00e1a4f",
"revCount": 35,
"type": "git",
"url": "https://labs.phundrak.com/phundrak/jj-cz"
},
"original": {
"type": "git",
"url": "https://labs.phundrak.com/phundrak/jj-cz"
}
},
"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"
}
},
"nix": { "nix": {
"inputs": { "inputs": {
"flake-compat": [ "flake-compat": [
"jj-cz",
"devenv", "devenv",
"flake-compat" "flake-compat"
], ],
"flake-parts": [ "flake-parts": [
"jj-cz",
"devenv", "devenv",
"flake-parts" "flake-parts"
], ],
"git-hooks-nix": [ "git-hooks-nix": [
"jj-cz",
"devenv", "devenv",
"git-hooks" "git-hooks"
], ],
"nixpkgs": [ "nixpkgs": [
"jj-cz",
"devenv", "devenv",
"nixpkgs" "nixpkgs"
], ],
"nixpkgs-23-11": [ "nixpkgs-23-11": [
"jj-cz",
"devenv" "devenv"
], ],
"nixpkgs-regression": [ "nixpkgs-regression": [
"jj-cz",
"devenv" "devenv"
] ]
}, },
"locked": { "locked": {
"lastModified": 1761648602, "lastModified": 1769708679,
"narHash": "sha256-H97KSB/luq/aGobKRuHahOvT1r7C03BgB6D5HBZsbN8=", "narHash": "sha256-uFKkp2/SjIqbu5HtINg/hwHN6qaqcxLIbL/om7dT3kI=",
"owner": "cachix", "owner": "cachix",
"repo": "nix", "repo": "nix",
"rev": "3e5644da6830ef65f0a2f7ec22830c46285bfff6", "rev": "72bec37fabbfe378d677868ec42eeb83acf07a4c",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "cachix", "owner": "cachix",
"ref": "devenv-2.30.6", "ref": "devenv-2.32",
"repo": "nix", "repo": "nix",
"type": "github" "type": "github"
} }
@@ -267,11 +480,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764475780, "lastModified": 1775365369,
"narHash": "sha256-77jL5H5x51ksLiOUDjY0ZK8e2T4ZXLhj3ap8ETvknWI=", "narHash": "sha256-DgH5mveLoau20CuTnaU5RXZWgFQWn56onQ4Du2CqYoI=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nix-index-database", "repo": "nix-index-database",
"rev": "5a3ff8c1a09003f399f43d5742d893c0b1ab8af0", "rev": "cef5cf82671e749ac87d69aadecbb75967e6f6c3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -280,13 +493,42 @@
"type": "github" "type": "github"
} }
}, },
"nixd": {
"inputs": {
"flake-parts": [
"jj-cz",
"devenv",
"flake-parts"
],
"flake-root": "flake-root",
"nixpkgs": [
"jj-cz",
"devenv",
"nixpkgs"
],
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1763964548,
"narHash": "sha256-JTRoaEWvPsVIMFJWeS4G2isPo15wqXY/otsiHPN0zww=",
"owner": "nix-community",
"repo": "nixd",
"rev": "d4bf15e56540422e2acc7bc26b20b0a0934e3f5e",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixd",
"type": "github"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1764517877, "lastModified": 1775423009,
"narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=", "narHash": "sha256-vPKLpjhIVWdDrfiUM8atW6YkIggCEKdSAlJPzzhkQlw=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c", "rev": "68d8aa3d661f0e6bd5862291b5bb263b2a6595c9",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -296,13 +538,34 @@
"type": "github" "type": "github"
} }
}, },
"opencode": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1775336060,
"narHash": "sha256-KkjMN2xA8jGBnj96UtzffvOeYJJZM05/5T36nSdpZkE=",
"owner": "anomalyco",
"repo": "opencode",
"rev": "930e94a3ea098b9d56fcb6d08b545256d2546a82",
"type": "github"
},
"original": {
"owner": "anomalyco",
"ref": "v1.3.15",
"repo": "opencode",
"type": "github"
}
},
"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 +584,81 @@
"quickshell": { "quickshell": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
"caelestia-shell",
"nixpkgs" "nixpkgs"
] ]
}, },
"locked": { "locked": {
"lastModified": 1764663772, "lastModified": 1772925576,
"narHash": "sha256-sHqLmm0wAt3PC4vczJeBozI1/f4rv9yp3IjkClHDXDs=", "narHash": "sha256-mMoiXABDtkSJxCYDrkhJ/TrrJf5M46oUfIlJvv2gkZ0=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "26531fc46ef17e9365b03770edd3fb9206fcb460", "rev": "15a84097653593dd15fad59a56befc2b7bdc270d",
"revCount": 713, "revCount": 750,
"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"
} }
}, },
"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",
"opencode": "opencode",
"pumo-system-info": "pumo-system-info", "pumo-system-info": "pumo-system-info",
"quickshell": "quickshell",
"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": 1770260791,
"narHash": "sha256-ADTBfENFjRVDQMcCycyX/pAy6NFI/Ct6Mrar3gsmXI0=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "42ec85352e419e601775c57256a52f6d48a39906",
"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 +686,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764483358, "lastModified": 1775682595,
"narHash": "sha256-EyyvCzXoHrbL467YSsQBTWWg4sR96MH1sPpKoSOelB4=", "narHash": "sha256-0E9PohY/VuESLq0LR4doaH7hTag513sDDW5n5qmHd1Q=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "5aca6ff67264321d47856a2ed183729271107c9c", "rev": "d2e8438d5886e92bc5e7c40c035ab6cae0c41f76",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -392,6 +699,47 @@
"type": "github" "type": "github"
} }
}, },
"spicetify": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"systems": "systems_4"
},
"locked": {
"lastModified": 1775421933,
"narHash": "sha256-JkEbzFDFTsUlVtHEzA8Y4r3O9LInhb96eOCbtGjGnbM=",
"owner": "Gerg-L",
"repo": "spicetify-nix",
"rev": "ec8d73085fdf807d55765335dc8126e14e7b2096",
"type": "github"
},
"original": {
"owner": "Gerg-L",
"repo": "spicetify-nix",
"type": "github"
}
},
"srvos": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1775701952,
"narHash": "sha256-xj9u8fz2hTTTELMorqox0hPWrmAvGRnQUEnlj+vCjFo=",
"owner": "nix-community",
"repo": "srvos",
"rev": "f56f1053ae9f878501d3a8ae1961c73d1d7abce3",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "srvos",
"type": "github"
}
},
"systems": { "systems": {
"locked": { "locked": {
"lastModified": 1681028828, "lastModified": 1681028828,
@@ -422,6 +770,59 @@
"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"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"jj-cz",
"devenv",
"nixd",
"nixpkgs"
]
},
"locked": {
"lastModified": 1734704479,
"narHash": "sha256-MMi74+WckoyEWBRcg/oaGRvXC9BVVxDZNRMpL+72wBI=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "65712f5af67234dad91a5a4baee986a8b62dbf8f",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"zen-browser": { "zen-browser": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -429,11 +830,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764648680, "lastModified": 1775710180,
"narHash": "sha256-B/nmawJ75/951Xs9ludSxDVd/txFY+odmcbinySqMQo=", "narHash": "sha256-sCokvdNvl8zIzsnjgG0TN5h3RUI7GJyWW9ErfmEj0rM=",
"owner": "youwen5", "owner": "youwen5",
"repo": "zen-browser-flake", "repo": "zen-browser-flake",
"rev": "897df2f2ad4880563ce801fa29f348a4e98f0a20", "rev": "2c138beb648d1cbbfae76695a8230ee04e4db25a",
"type": "github" "type": "github"
}, },
"original": { "original": {

250
flake.nix
View File

@@ -2,12 +2,8 @@
description = "Home Manager configuration of phundrak"; description = "Home Manager configuration of phundrak";
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
devenv = {
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,13 +15,33 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
pumo-system-info = { caelestia-shell = {
url = "git+https://labs.phundrak.com/phundrak/pumo-system-info"; url = "github:caelestia-dots/shell";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
quickshell = { copyparty = {
url = "git+https://git.outfoxxed.me/quickshell/quickshell"; url = "github:9001/copyparty";
inputs.nixpkgs.follows = "nixpkgs";
};
jj-cz = {
url = "git+https://labs.phundrak.com/phundrak/jj-cz";
inputs.nixpkgs.follows = "nixpkgs";
};
mobile-nixos = {
url = "github:mobile-nixos/mobile-nixos";
flake = false; # It is not as a flake
};
opencode = {
url = "github:anomalyco/opencode/v1.3.15";
inputs.nixpkgs.follows = "nixpkgs";
};
pumo-system-info = {
url = "git+https://labs.phundrak.com/phundrak/pumo-system-info";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -34,8 +50,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,97 +67,136 @@
}; };
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, mobile-nixos,
srvos,
... ...
} @ inputs: let } @ inputs:
inherit (self) outputs; flake-utils.lib.eachDefaultSystem (
system = "x86_64-linux"; system: let
pkgs = nixpkgs.legacyPackages.${system}; inherit (self) outputs;
in { pkgs = nixpkgs.legacyPackages.${system};
formatter.${system} = pkgs.alejandra; in {
formatter = pkgs.alejandra;
devShells.default = pkgs.mkShell {
buildInputs = [
pkgs.nh
pkgs.jujutsu
pkgs.git
];
};
packages.${system} = { packages = {
devenv-up = self.devShells.${system}.default.config.procfileScript; homeConfigurations = let
devenv-test = self.devShells.${system}.default.config.test; extraSpecialArgs = {inherit inputs outputs system;};
}; pkgs = nixpkgs.legacyPackages.x86_64-linux;
defaultUserModules = [
devShells.${system}.default = devenv.lib.mkShell { inputs.sops-nix.homeManagerModules.sops
inherit inputs pkgs; inputs.spicetify.homeManagerModules.default
modules = [ inputs.caelestia-shell.homeManagerModules.default
( ];
{pkgs, ...}: { withUserModules = modules: nixpkgs.lib.lists.flatten (defaultUserModules ++ [modules]);
packages = [pkgs.nh]; in {
git-hooks.hooks = { "phundrak@alys" = home-manager.lib.homeManagerConfiguration {
alejandra.enable = true; inherit extraSpecialArgs pkgs;
commitizen.enable = true; modules = withUserModules ./users/phundrak/host/alys.nix;
detect-private-keys.enable = true;
end-of-file-fixer.enable = true;
deadnix.enable = true;
ripsecrets.enable = true;
statix.enable = true;
}; };
} "creug@elcafe" = home-manager.lib.homeManagerConfiguration {
) inherit extraSpecialArgs pkgs;
]; 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 {
inherit extraSpecialArgs pkgs;
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@tilo" = home-manager.lib.homeManagerConfiguration {
inherit extraSpecialArgs pkgs;
modules = withUserModules ./users/phundrak/host/tilo.nix;
};
};
homeConfigurations = let nixosConfigurations = let
extraSpecialArgs = {inherit inputs outputs system;}; specialArgs = {inherit inputs outputs;};
pkgs = nixpkgs.legacyPackages.x86_64-linux; defaultSystemModules = [
defaultUserModules = [ inputs.sops-nix.nixosModules.sops
inputs.sops-nix.homeManagerModules.sops inputs.copyparty.nixosModules.default
]; ];
withUserModules = modules: nixpkgs.lib.lists.flatten (defaultUserModules ++ [modules]); withSystemModules = modules: nixpkgs.lib.lists.flatten (defaultSystemModules ++ [modules]);
in { in {
"phundrak@alys" = home-manager.lib.homeManagerConfiguration { alys = nixpkgs.lib.nixosSystem {
inherit extraSpecialArgs pkgs; inherit specialArgs;
modules = withUserModules ./users/phundrak/host/alys.nix; modules = withSystemModules ./hosts/alys/configuration.nix;
}; };
"phundrak@marpa" = home-manager.lib.homeManagerConfiguration { elcafe = nixpkgs.lib.nixosSystem {
inherit extraSpecialArgs pkgs; inherit specialArgs;
modules = withUserModules ./users/phundrak/host/marpa.nix; modules = withSystemModules ./hosts/elcafe/configuration.nix;
}; };
"phundrak@gampo" = home-manager.lib.homeManagerConfiguration { gampo = nixpkgs.lib.nixosSystem {
inherit extraSpecialArgs pkgs; inherit specialArgs;
modules = withUserModules ./users/phundrak/host/gampo.nix; modules = withSystemModules ./hosts/gampo/configuration.nix;
}; };
"phundrak@tilo" = home-manager.lib.homeManagerConfiguration { marpa = nixpkgs.lib.nixosSystem {
inherit extraSpecialArgs pkgs; inherit specialArgs;
modules = withUserModules ./users/phundrak/host/tilo.nix; modules = withSystemModules ./hosts/marpa;
}; };
}; NaroMk3 = nixpkgs.lib.nixosSystem {
inherit specialArgs;
nixosConfigurations = let modules = withSystemModules [
specialArgs = {inherit inputs outputs;}; srvos.nixosModules.server
defaultSystemModules = [ srvos.nixosModules.hardware-hetzner-cloud
inputs.sops-nix.nixosModules.sops srvos.nixosModules.mixins-terminfo
]; ./hosts/naromk3/configuration.nix
withSystemModules = modules: nixpkgs.lib.lists.flatten (defaultSystemModules ++ [modules]); ];
in { };
alys = nixpkgs.lib.nixosSystem { pumo = nixpkgs.lib.nixosSystem {
inherit specialArgs; system = "aarch64-linux";
modules = withSystemModules ./hosts/alys/configuration.nix; inherit specialArgs;
}; modules = withSystemModules [
gampo = nixpkgs.lib.nixosSystem { (import "${mobile-nixos}/lib/configuration.nix" {device = "oneplus-enchilada";})
inherit specialArgs; ./hosts/pumo
modules = withSystemModules ./hosts/gampo/configuration.nix; ];
}; };
marpa = nixpkgs.lib.nixosSystem { tilo = nixpkgs.lib.nixosSystem {
inherit specialArgs; inherit specialArgs;
modules = withSystemModules ./hosts/marpa/configuration.nix; modules = withSystemModules ./hosts/tilo/configuration.nix;
}; };
tilo = nixpkgs.lib.nixosSystem { };
inherit specialArgs; };
modules = withSystemModules ./hosts/tilo/configuration.nix; }
}; );
};
};
} }

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";

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?
}

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$";
};
};
};
}

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;
}

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;
};
}; };
}; };

View File

@@ -39,13 +39,21 @@
}; };
}; };
services.displayManager.autoLogin = {
user = "phundrak";
enable = true;
};
mySystem = { mySystem = {
boot = { boot = {
extraModprobeConfig = ''
options snd_usb_audio vid=0x1235 pid=0x8212 device_setup=1
'';
plymouth.enable = true; plymouth.enable = true;
kernel.cpuVendor = "amd"; kernel = {
cpuVendor = "amd";
v4l2loopback.enable = true;
extraModprobeConfig = ''
options snd_usb_audio vid=0x1235 pid=0x8212 device_setup=1
'';
};
systemd-boot = true; systemd-boot = true;
}; };
desktop = { desktop = {
@@ -78,11 +86,11 @@
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,32 +102,39 @@
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 = {
inherit (config.users.users.root) group; "marpa/nix-cache-priv-key" = {};
owner = config.users.users.phundrak.name; extraHosts = {
mode = "0440"; inherit (config.users.users.root) group;
owner = config.users.users.phundrak.name;
mode = "0440";
};
}; };
services.udev.extraHwdb = '' services.udev.extraHwdb = ''

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?
}

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";
}

91
hosts/pumo/default.nix Normal file
View File

@@ -0,0 +1,91 @@
# 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";
}

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
packages/handy.nix Normal file
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
'';
}

149
packages/inkdrop.nix Normal file
View File

@@ -0,0 +1,149 @@
# https://www.inkdrop.app/
{
lib,
fetchurl,
stdenv,
autoPatchelfHook,
makeWrapper,
wrapGAppsHook3,
alsa-lib,
at-spi2-atk,
at-spi2-core,
cairo,
cups,
dbus,
expat,
gdk-pixbuf,
glib,
gtk3,
libdrm,
libnotify,
libpulseaudio,
libsecret,
libuuid,
libxkbcommon,
mesa,
nspr,
nss,
pango,
systemd,
libx11,
libxscrnsaver,
libxcomposite,
libxcursor,
libxdamage,
libxext,
libxfixes,
libxi,
libxrandr,
libxrender,
libxtst,
libxcb,
libxkbfile,
libxshmfence,
}:
stdenv.mkDerivation rec {
pname = "inkdrop";
version = "5.11.8";
src = fetchurl {
url = "https://dist.inkdrop.app/v${version}/${pname}_${version}_amd64.deb";
hash = "sha256-8aJSeUi5K9PgNJvfYAtnRnI2t+vM10jiqVAZmX+zni0=";
};
nativeBuildInputs = [
autoPatchelfHook
makeWrapper
wrapGAppsHook3
];
buildInputs = [
alsa-lib
at-spi2-atk
at-spi2-core
cairo
cups
dbus
expat
gdk-pixbuf
glib
gtk3
libdrm
libnotify
libpulseaudio
libsecret
libuuid
libxkbcommon
mesa
nspr
nss
pango
systemd
libx11
libxscrnsaver
libxcomposite
libxcursor
libxdamage
libxext
libxfixes
libxi
libxrandr
libxrender
libxtst
libxcb
libxkbfile
libxshmfence
];
dontBuild = true;
dontConfigure = true;
# Ignore musl dependency since we're using glibc
autoPatchelfIgnoreMissingDeps = ["libc.musl-x86_64.so.1"];
unpackPhase = ''
runHook preUnpack
# Extract deb file manually to avoid setuid issues
ar x $src
tar xf data.tar.xz --no-same-permissions --no-same-owner
runHook postUnpack
'';
installPhase = ''
runHook preInstall
# Create output directories
mkdir -p $out/bin $out/share
# Copy the main application
cp -r usr/lib/inkdrop $out/share/inkdrop
# Copy desktop file and icon
cp -r usr/share/applications $out/share/
cp -r usr/share/pixmaps $out/share/
# Fix desktop file to use absolute paths
substituteInPlace $out/share/applications/inkdrop.desktop \
--replace-quiet "Exec=inkdrop" "Exec=$out/bin/inkdrop" \
--replace-quiet "Icon=inkdrop" "Icon=$out/share/pixmaps/inkdrop.png"
# Create wrapper script in bin
makeWrapper $out/share/inkdrop/inkdrop $out/bin/inkdrop \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}" \
--set-default ELECTRON_IS_DEV 0 \
--inherit-argv0
runHook postInstall
'';
meta = with lib; {
description = "Notebook app for Markdown lovers";
homepage = "https://www.inkdrop.app/";
license = licenses.unfree;
maintainers = [];
platforms = ["x86_64-linux"];
mainProgram = "inkdrop";
};
}

View File

@@ -1,67 +1,113 @@
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]
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 - 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: age197lfdanym647wdaz9uy8hrfqjwj9fs8rm7vs3fsrctceu8mr9gms2jedhz
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: age17pn6suvz2f7zmrm9zxj5hr0putvcvdamqxqt7ewhncgg6ccgmp2qr00xm2
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: age1cnnpnglkvgw5ffv8qpgwpqvj203lh4uwt698y9mxjwklxt8nysmsa8hepn
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: age1g68hxv73llkyc7etzh499ztcrt93pwawy0n8p93px4taqu58mehsp88vjq
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: age1awytvphvty4f9wmdn86xnjg9kgetqjx8qlwj5d2882t4fyyzy58s3vg5k4
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: age1erkn7dd022e90ktyj66aux9j9xvl0uzd6ru5cmrjsvcm5rtr5pfs7q6k9h
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: age16crkeglm3j3f6rveylytuerptjf9mwtv3hl89ywkmnnvdkntfchsuvrsk5
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6eUFYSC82YVM1WVEwc2Fz
aEl3TG5oOFU5MUFhQ0JhbC9yRVYxOFo0bUVJCnpwQzMyZmN4ZTlNVW5pZTY5bkdY
bjhaSnFxS0Vrb3pHTlJkWjVvczBSOG8KLS0tIHlsbjhxODdvcnd4c21aWUNpK01M
ZW1hTUFtVE15QzVIVU93ZExlUWZjYzAKUZj+/NtMHCPjFFqbJ/8b2ASljV6GEk6p
FbqV9LezRZrfl9GXBVUpB4Oeb9v2yp151aSda07/AG5YO0/jRAV/Bg==
-----END AGE ENCRYPTED FILE-----
- recipient: age1tkywsvddjj6r6ukuqgz9aql92jfx85rz57dhmkkndysh6yx6p5rs0zj0qr
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxdjFYN01HcXZMNVBJckVm
eklKZHAxeWgvVlcwWk9yWUJpcFFBUnpUV0FZCi85dGE2L3d3OS9CdW5sL0pZTTM2
SFJkcUN0emh6S3hMenhCcXBhNWF6eVUKLS0tIExwNEVyRmpGRXRLMjgxY1dqbkxQ
bk04K1luNnJVTjZQY25KRXNSVG0venMK7uM4tqqmq/o4QgMlE/x/FXkQsPRkofNO
I6C93RYgp1OcGPH14Kmp5lXtK4/pdToaRnVXPGenDQJsFhwWCEI+Fg==
-----END AGE ENCRYPTED FILE-----
- recipient: age17p69ktg7yfzgdsk00f32mupe4n4fevdpw2wsv7ft30yvpeseau6s7t0zdg
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsOTFXaHE0SDRCTnE4di9N
S2JIbHF2a1pzNzU4UFIvQmpZMVpOUjJqd0RJClVxcTd3d05aRDN1RGVmWVpQS2lI
L1RVU3FUM3d4SU9pYXlwSko2RW5uWjgKLS0tIEplR1l1bGlad3p1ZkNBbFY3YmlM
dUpXZis2N2VyN0ZFbjlPRXdwRFQ1aHMKm1Mk6MPKxFmwdATCYUANRSY5rHKgmQer
LBlqqWKt1JiIUAYtazQeQ6KYxmjVlQPY7AZw2t+EhBEPrqbTL3vOiw==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2026-05-01T13:20:34Z"
mac: ENC[AES256_GCM,data:OueL0eHYmFKWfSyCZxburRJ2FS1xkowx7ha/Zv7r++26D85GSHDeIL9HdfByI5a1OhH90rH3WLxZrJgT3FiwBw27HhhHtS7Fs6MBFvTuPmSA7ZtMeGMWBRVjwbGAWN17BZAhJzMlZHq2nPX0xXIKT0HuTLVRPLuVCSlvDzMXsTE=,iv:+JN4Vzs8o8PJAam/uKBbUXt3ArxC88D6xR7rMeeGglg=,tag:S+OtbxLhVKFnqBZtyKDGyA==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.11.0 version: 3.12.2

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

View File

@@ -30,15 +30,40 @@ in {
example = "fr-bepo"; example = "fr-bepo";
description = "Keymap to use in the TTY console"; description = "Keymap to use in the TTY console";
}; };
mobile = mkEnableOption "Enable if using Mobile NixOS";
}; };
config = { config = {
boot.tmp.cleanOnBoot = true; boot.tmp.cleanOnBoot = true;
time.timeZone = cfg.timezone;
console.keyMap = cfg.keymap; console.keyMap = cfg.keymap;
time.timeZone = cfg.timezone;
environment.pathsToLink = [
"/share/bash-completion"
"/share/zsh"
];
services = { services = {
orca.enable = false; orca.enable = false;
envfs.enable = true; 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"
];
};
}; };
} }

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;
}; };

View File

@@ -12,6 +12,11 @@ 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 {
@@ -29,6 +34,9 @@ in {
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;

View File

@@ -1,8 +1,11 @@
{ {lib, ...}: {
imports = [ imports = [
./amdgpu.nix ./amdgpu.nix
./bluetooth.nix ./bluetooth.nix
./fingerprint.nix
./sound.nix ./sound.nix
./input ./input
]; ];
hardware.enableAllFirmware = lib.mkDefault true;
} }

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;
};
}

View File

@@ -8,7 +8,8 @@ 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";
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,13 +33,14 @@ 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 = {
enable = true; pipewire.enable = mkForce (cfg.enable && ! cfg.usePulseaudio);
alsa = mkIf cfg.alsa { pipewire.alsa = {
enable = mkDefault true; enable = mkDefault true;
support32Bit = mkDefault true; support32Bit = mkDefault true;
}; };
jack.enable = mkDefault cfg.jack; pipewire.jack.enable = cfg.jack;
pulseaudio.enable = cfg.usePulseaudio;
}; };
programs.noisetorch = mkIf cfg.enable { programs.noisetorch = mkIf cfg.enable {
inherit (cfg) enable; inherit (cfg) enable;

View File

@@ -1,5 +1,6 @@
{ {
imports = [ imports = [
./input.nix
./locale.nix ./locale.nix
]; ];
} }

25
system/i18n/input.nix Normal file
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
];
};
}

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"
];
};
} }

View File

@@ -1,5 +1,4 @@
{ {
pkgs,
lib, lib,
config, config,
... ...
@@ -11,12 +10,7 @@ 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.services.flatpak = mkIf cfg.enable {
services.flatpak = mkIf cfg.enable { inherit (cfg) enable;
inherit (cfg) enable;
};
environment.systemPackages = mkIf cfg.builder.enable [
pkgs.flatpak-buildR
];
}; };
} }

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
]; ];
} }

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}";
};
};
};
}

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";

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;
} }
]; ];
}; };

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
system/users/creug.nix Normal file
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"];
};
};
}

View File

@@ -1,5 +1,8 @@
{ {
imports = [ imports = [
./creug.nix
./phundrak.nix ./phundrak.nix
./root.nix
]; ];
programs.zsh.enable = true;
} }

View File

@@ -5,27 +5,28 @@
... ...
}: }:
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 = { isNormalUser = true;
hashedPassword = mkIf cfg.root.disablePassword "*"; description = "Lucien Cartier-Tilet";
shell = pkgs.zsh; extraGroups = ["networkmanager" "wheel" "docker" "dialout" "podman" "plugdev" "games" "audio" "input"] ++ cfg.extraGroups;
}; shell = pkgs.zsh;
phundrak = mkIf cfg.phundrak.enable { openssh.authorizedKeys.keyFiles = lib.filesystem.listFilesRecursive ../../users/phundrak/keys;
isNormalUser = true; };
description = "Lucien Cartier-Tilet"; nix.settings = mkIf cfg.trusted {
extraGroups = ["networkmanager" "wheel" "docker" "dialout" "podman" "plugdev" "games" "audio" "input"]; trusted-users = ["phundrak"];
shell = pkgs.zsh;
openssh.authorizedKeys.keyFiles = lib.filesystem.listFilesRecursive ../../keys;
};
}; };
programs.zsh.enable = true;
}; };
} }

17
system/users/root.nix Normal file
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
users/creug/home.nix Normal file
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;
};
}

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;
};
}

View File

@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBdd4cNNhONjhuH4jWZ8Z8K1gbBmeDNqRybKRHMQEvZj gregoryfoulachon@googlemail.com

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;

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''

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"
'' ''

View File

@@ -17,7 +17,14 @@ 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;

View File

@@ -0,0 +1,78 @@
{
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 = {
timeouts = [
{
timeout = 300;
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"];
};
};
cli = {
enable = true;
settings.theme.enableGtk = true;
};
};
}

View File

@@ -7,15 +7,19 @@ with lib; let
cfg = config.home.desktop; cfg = config.home.desktop;
in { in {
imports = [ imports = [
./caelestia.nix
./eww.nix ./eww.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
]; ];
@@ -23,12 +27,15 @@ in {
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; 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;
}; };
} }

View File

@@ -0,0 +1,70 @@
{
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 {
programs.firefox = {
inherit (cfg) enable;
package =
if cfg.useZen
then zen
else pkgs.firefox;
nativeMessagingHosts = lists.optional cfg.tridactyl.enable pkgs.tridactyl-native;
};
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
]);
};
};
}

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,26 +35,28 @@ 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;
@@ -64,8 +67,6 @@ in {
"marpa" = [ "marpa" = [
"DP-1, 3440x1440@144, 1080x550, 1" "DP-1, 3440x1440@144, 1080x550, 1"
"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}";
@@ -86,7 +87,7 @@ in {
"1, layoutopt:orientation:bottom" "1, layoutopt:orientation:bottom"
]; ];
decoration = { decoration = {
rounding = 5; rounding = 20;
}; };
animations = { animations = {
enabled = true; enabled = true;
@@ -103,12 +104,15 @@ in {
pseudotile = true; pseudotile = true;
preserve_split = true; preserve_split = true;
}; };
exec-once = [ exec-once =
"pactl load-module module-switch-on-connect" [
"${pkgs.mpc}/bin/mpc stop" "pactl load-module module-switch-on-connect"
"${pkgs.networkmanagerapplet}/bin/nm-applet" "${pkgs.mpc}/bin/mpc stop"
"${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 = ''
$left = c $left = c

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;
}

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";
};
};
}

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;
};
}

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;
};
};
};
}

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;

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;
}; };
}; };
} }

View File

@@ -1,19 +1,43 @@
{ {
config, config,
lib, lib,
pkgs,
inputs,
... ...
}: }:
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
]; ];
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";
ollama.enable = mkDefault cfg.enable; mcpServers = mkOption {
claude.enable = mkDefault cfg.enable; 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;
};
packages = let
inherit (pkgs.stdenv.hostPlatform) system;
inherit (inputs.opencode.packages.${system}) opencode;
in [pkgs.lmstudio opencode];
};
programs.mcp = mkIf (cfg.mcpServers != {}) {
enable = true;
servers = cfg.mcpServers;
};
}; };
} }

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 {

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;
};
}; };
}; };
} }

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;

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,65 +36,90 @@ 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`";
};
}; };
config.programs.jujutsu = mkIf cfg.enable { config = mkIf cfg.enable {
enable = true; home.packages = mkIf cfg.cz.enable [jj-cz];
settings = { programs.jujutsu = {
user = { enable = true;
inherit (cfg) name email; settings = {
}; user = {
ui = { inherit (cfg) name email;
default-command = "st"; };
pager = ":builtin"; ui = {
show-cryptographic-signatures = true; default-command = "st";
conflict-marker-style = "git"; # Support for vc-jj.el pager = ":builtin";
diff-formatter = ":git"; # Support for vc-jj.el show-cryptographic-signatures = true;
diff-editor = ":builtin"; diff-editor = ":builtin";
inherit (cfg) editor; merge-editort = ":builtin";
}; inherit (cfg) editor;
signing = mkIf cfg.signing.enable { };
behavior = "own"; signing = mkIf cfg.signing.enable {
backend = "ssh"; behavior = "own";
key = cfg.signing.sshKey; backend = "ssh";
backends.ssh.allowed-signers = "${config.home.homeDirectory}/.ssh/allowed_signers"; key = cfg.signing.sshKey;
backends.ssh.program = "${pkgs.openssh}/bin/ssh-keygen"; backends.ssh.allowed-signers = "${config.home.homeDirectory}/.ssh/allowed_signers";
}; backends.ssh.program = "${pkgs.openssh}/bin/ssh-keygen";
aliases = { };
blame = ["file" "annotate"]; aliases = {
consume = ["squash" "--into" "@" "--from"]; blame = ["file" "annotate"];
eject = ["squash" "--from" "@" "--into"]; consume = ["squash" "--into" "@" "--from"];
d = ["diff"]; cz = mkIf cfg.cz.alias ["util" "exec" "--" "${jj-cz}/bin/jj-cz"];
dm = ["desc" "-m"]; eject = ["squash" "--from" "@" "--into"];
l = ["log"]; d = ["diff"];
lc = ["log" "-r" "(remote_bookmarks()..@)::"]; dm = ["desc" "-m"];
ll = ["log" "-T" "builtin_log_detailed"]; gc = ["git" "clone"];
open = ["log" "-r" "open()"]; gcc = ["git" "clone" "--colocate"];
n = ["new"]; l = ["log"];
nd = ["new" "dev()"]; la = ["log" "-r" "::"];
nt = ["new" "trunk()"]; lc = ["log" "-r" "(remote_bookmarks()..@)::"];
s = ["show"]; ll = ["log" "-T" "builtin_log_detailed"];
tug = ["bookmark" "move" "--from" "heads(::@- & bookmarks())" "--to" "@-"]; open = ["log" "-r" "open()"];
}; n = ["new"];
revset-aliases = { nd = ["new" "dev()"];
"user(x)" = "author(x) | committer(x)"; nt = ["new" "trunk()"];
"gh_pages()" = "ancestors(remote_bookmarks(exact:\"gh-pages\"))"; revlog = ["evolog"];
"trunk()" = "latest((present(main) | present(master)) & remote_bookmarks())"; s = ["show"];
"dev()" = "latest((present(dev) | present(develop)) & remote_bookmarks())"; tug = ["bookmark" "move" "--from" "heads(::@- & bookmarks())" "--to" "@-"];
"wip()" = "description(glob:\"wip:*\")"; };
"private()" = "description(glob:\"private:*\")"; colors.working_copy.underline = true;
"blacklist()" = "wip() | private()"; git = {
# stack(x, n) is the set of mutable commits reachable from private-commits = "blacklist()";
# 'x', with 'n' parents. 'n' is often useful to customize the colocate = true;
# display and return set for certain operations. 'x' can be subprocess = true;
# used to target the set of 'roots' to traverse, e.g. @ is the };
# current stack. revset-aliases = {
"stack()" = "ancestors(reachable(@, mutable()), 2)"; "immutable_heads()" = "present(trunk()) | tags()";
"stack(x)" = "ancestors(reachable(x, mutable()), 2)"; # Resolves by default to latest main/master remote bookmarks
"stack(x, n)" = "ancestors(reachable(x, mutable()), n)"; "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())";
"open()" = "stack(dev().. & mine(), 1)"; "user(x)" = "author(x) | committer(x)";
"ready()" = "open() ~ blacklist()::"; "gh_pages()" = "ancestors(remote_bookmarks(exact:\"gh-pages\"))";
#Private and WIP commits that should never be pushed
"wip()" = "description(glob:\"wip:*\")";
"private()" = "description(glob:\"private:*\")";
"blacklist()" = "wip() | private()";
# stack(x, n) is the set of mutable commits reachable from
# 'x', with 'n' parents. 'n' is often useful to customize the
# display and return set for certain operations. 'x' can be
# used to target the set of 'roots' to traverse, e.g. @ is the
# current stack.
"stack()" = "ancestors(reachable(@, mutable()), 2)";
"stack(x)" = "ancestors(reachable(x, mutable()), 2)";
"stack(x, n)" = "ancestors(reachable(x, mutable()), n)";
"open()" = "stack(dev().. & mine(), 1)";
"ready()" = "open() ~ blacklist()::";
};
remotes.origin.auto-track-bookmarks = "*";
}; };
}; };
}; };

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

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;
}; };
}; };

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;
@@ -33,6 +38,7 @@ in {
(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"'')
cfg.bashrcExtra cfg.bashrcExtra
]; ];
enableCompletion = cfg.autocompletion;
shellAliases = cfg.aliases; shellAliases = cfg.aliases;
shellOptions = [ shellOptions = [
"histappend" "histappend"

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 = cfg.aliases // defaultAliases;
enable = mkDefault cfg.fullDesktop; enable = mkDefault cfg.fullDesktop;
}; };
fish = { fish = {
abbrs = mkDefault aliases; abbrs = cfg.aliases // defaultAliases;
enable = mkDefault cfg.fullDesktop; enable = mkDefault cfg.fullDesktop;
}; };
zsh = { zsh = {
abbrs = mkDefault aliases; abbrs = cfg.aliases // defaultAliases;
enable = mkDefault cfg.fullDesktop; enable = mkDefault cfg.fullDesktop;
}; };
}; };

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;

View File

@@ -19,30 +19,58 @@ 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
description = "The current jj status"; # See https://github.com/jj-vcs/jj/wiki/Starship
detect_folders = [".jj"]; git_status.disabled = true;
symbol = "🥋 "; git_commit.disabled = true;
command = '' git_metrics.disabled = true;
jj log --revisions @ --no-graph --ignore-working-copy --color always --limit 1 --template ' git_branch.disabled = true;
separate(" ", custom = let
change_id.shortest(4), when = "! jj --ignore-working-copy-root";
bookmarks, description = "Only show if were not in a jj repository";
"|", style = "";
concat( in {
if(conflict, "💥"), git_status = {
if(divergent, "🚧"), inherit when description style;
if(hidden, "👻"), command = "starship module git_status";
if(immutable, "🔒"), };
), git_commit = {
raw_escape_sequence("\x1b[1;32m") ++ if(empty, "(empty)"), inherit when description style;
raw_escape_sequence("\x1b[1;32m") ++ coalesce( command = "starship module git_commit";
truncate_end(29, description.first_line(), ""), };
"(no description set)", git_metrics = {
) ++ raw_escape_sequence("\x1b[0m"), 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";
detect_folders = [".jj"];
symbol = "🥋 ";
command = ''
jj log --revisions @ --no-graph --ignore-working-copy --color always --limit 1 --template '
separate(" ",
change_id.shortest(4),
bookmarks,
"|",
concat(
if(conflict, "💥"),
if(divergent, "🚧"),
if(hidden, "👻"),
if(immutable, "🔒"),
),
raw_escape_sequence("\x1b[1;32m") ++ if(empty, "(empty)"),
raw_escape_sequence("\x1b[1;32m") ++ coalesce(
truncate_end(29, description.first_line(), ""),
"(no description set)",
) ++ raw_escape_sequence("\x1b[0m"),
)
'
'';
};
}; };
}; };
}; };

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;
};
}

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;

1673
users/phundrak/XCompose Normal file

File diff suppressed because it is too large Load Diff

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" = {

View File

@@ -58,29 +58,118 @@
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;
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 < 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}"`)
'';
};
};
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
home_row_keys = "auiectsrtsr";
modes = "tile,bisect";
};
};
};
};
dev = { dev = {
ai.claude.enable = true; 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 = {
enable = true; ".XCompose".source = ./XCompose;
text = lib.strings.join "\n" ( "${config.home.homeDirectory}/.ssh/allowed_signers" = {
map (file: let enable = true;
content = lib.strings.trim (builtins.readFile file); text = lib.strings.join "\n" (
parts = lib.strings.splitString " " content; map (file: let
email = lib.lists.last parts; content = lib.strings.trim (builtins.readFile file);
in "${email} namespaces=\"git\" ${content}") parts = lib.strings.splitString " " content;
(lib.filesystem.listFilesRecursive ../../keys) email = lib.lists.last parts;
); in "${email} namespaces=\"git\" ${content}")
(lib.filesystem.listFilesRecursive ./keys)
);
};
}; };
}; };

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";
};
}; };
} }

View File

@@ -0,0 +1,8 @@
{
imports = [../light-home.nix];
home = {
cli.nh.flake = "/home/phundrak/.dotfiles";
dev.editors.emacs.enable = false;
phundrak.sshKey.content = builtins.readFile ../keys/id_elcafe.pub;
};
}

View File

@@ -3,8 +3,7 @@
home = { home = {
cli.nh.flake = "${config.home.homeDirectory}/.dotfiles"; cli.nh.flake = "${config.home.homeDirectory}/.dotfiles";
desktop.hyprland.host = "gampo"; desktop.hyprland.host = "gampo";
phundrak.sshKey = { phundrak.sshKey.content = builtins.readFile ../keys/id_gampo.pub;
content = builtins.readFile ../../../keys/id_gampo.pub;
};
}; };
programs.caelestia.settings.bar.persistent = false;
} }

View File

@@ -1,14 +1,17 @@
{config, ...}: { {config, ...}: {
imports = [../home.nix]; imports = [../home.nix];
home = { home = {
gpuType = "amd";
cli.nh.flake = "${config.home.homeDirectory}/.dotfiles"; cli.nh.flake = "${config.home.homeDirectory}/.dotfiles";
dev.ai.ollama = { dev.ai = {
enable = true; enable = true;
gpu = "rocm"; ollama.gpu = "rocm";
}; };
desktop.hyprland.host = "marpa"; desktop.hyprland.host = "marpa";
phundrak.sshKey = { phundrak.sshKey.content = builtins.readFile ../keys/id_marpa.pub;
content = builtins.readFile ../../../keys/id_marpa.pub; };
}; programs.caelestia.settings.bar = {
showBattery = false;
showWifi = false;
}; };
} }

View File

@@ -0,0 +1,7 @@
{
imports = [../light-home.nix];
home = {
cli.nh.flake = "/home/phundrak/.dotfiles";
phundrak.sshKey.content = builtins.readFile ../keys/id_naromk3.pub;
};
}

View File

@@ -1,7 +1,7 @@
{ {
imports = [../light-home.nix]; imports = [../light-home.nix];
home = { home = {
cli.nh.flake = "/tank/phundrak/nixos"; cli.nh.flake = "/tank/phundrak/.dotfiles";
phundrak.sshKey.content = builtins.readFile ../../../keys/id_tilo.pub; phundrak.sshKey.content = builtins.readFile ../keys/id_tilo.pub;
}; };
} }

View File

@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA+UvZISwPdbDUQKbcBksi6dKvsVccvRIbdOE0zDQt60 lucien@phundrak.com

View File

@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID8C2Upks4/feloFsgZkQ6iOZBEJ6o87NdXdHeBYNUhg lucien@phundrak.com

View File

@@ -7,13 +7,13 @@
with lib; let with lib; let
cfg = config.home.phundrak; cfg = config.home.phundrak;
in { in {
imports = [../modules]; imports = [../modules ./zellij.nix];
options.home.phundrak = { options.home.phundrak = {
sshKey = { sshKey = {
content = mkOption { content = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
example = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGj+J6N6SO+4P8dOZqfR1oiay2yxhhHnagH52avUqw5h"; example = "ssh-ed25519 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
default = null; default = null;
}; };
file = mkOption { file = mkOption {
@@ -46,6 +46,7 @@ in {
username = "phundrak"; username = "phundrak";
homeDirectory = "/home/phundrak"; homeDirectory = "/home/phundrak";
packages = [pkgs.tree pkgs.ncdu]; packages = [pkgs.tree pkgs.ncdu];
preferXdgDirectories = true;
phundrak.sshKey.file = "${config.home.homeDirectory}/.ssh/id_ed25519.pub"; phundrak.sshKey.file = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";

View File

@@ -4,7 +4,13 @@
lib, lib,
... ...
}: }:
with lib; { with lib; let
inherit (pkgs.stdenv.hostPlatform) system;
handy = pkgs.callPackage ../../packages/handy.nix {};
inkdrop = pkgs.callPackage ../../packages/inkdrop.nix {};
pumo-system-info = inputs.pumo-system-info.packages.${system}.default;
in {
programs.bun.enable = true;
home.packages = with pkgs; [ home.packages = with pkgs; [
# Terminal stuff # Terminal stuff
duf duf
@@ -26,27 +32,24 @@ with lib; {
audacity audacity
plexamp plexamp
plex-desktop plex-desktop
spicetify-cli
spotify
pavucontrol # Volume control pavucontrol # Volume control
# Social # Social
vesktop # Discord alternative that works well with wayland vesktop # Discord alternative that works well with wayland
element-desktop signal-desktop
signal-desktop-bin
# Misc # Misc
bitwarden-desktop # gplates
gplates qgis
kicad
handy
libnotify libnotify
nextcloud-client nextcloud-client
onlyoffice-desktopeditors onlyoffice-desktopeditors
pumo-system-info
scrcpy scrcpy
syncthing syncthing
watchmate watchmate
inputs.zen-browser.packages.${system}.default
inputs.pumo-system-info.packages.${system}.default
inputs.quickshell.packages.${system}.default
# Games # Games
atlauncher atlauncher
@@ -56,9 +59,6 @@ with lib; {
moonlight-qt moonlight-qt
# Gnome stuff # Gnome stuff
gnome-tweaks
gnomeExtensions.docker
gnomeExtensions.syncthing-indicator
gnomeExtensions.tray-icons-reloaded gnomeExtensions.tray-icons-reloaded
gthumb gthumb
@@ -70,6 +70,7 @@ with lib; {
# Dev # Dev
dbeaver-bin dbeaver-bin
devenv devenv
inkdrop
nodejs nodejs
sqlite sqlite
tectonic # better LaTeX engine tectonic # better LaTeX engine
@@ -81,6 +82,7 @@ with lib; {
docker-language-server docker-language-server
kdePackages.qtdeclarative # For QML LSP kdePackages.qtdeclarative # For QML LSP
nixd nixd
nixfmt
marksman marksman
python3 # for Emacs and LSP python3 # for Emacs and LSP
vscode-json-languageserver vscode-json-languageserver

View File

@@ -1,6 +1,7 @@
{ {
config, config,
pkgs, pkgs,
lib,
... ...
}: { }: {
config.home.desktop.wlr-which-key.settings = { config.home.desktop.wlr-which-key.settings = {
@@ -26,207 +27,224 @@
fullscreen = import ./fullscreen.nix {inherit pkgs;}; fullscreen = import ./fullscreen.nix {inherit pkgs;};
logout = import ./logout.nix {inherit pkgs;}; logout = import ./logout.nix {inherit pkgs;};
ytplay = import ../../modules/cli/scripts/ytplay.nix {inherit pkgs;}; ytplay = import ../../modules/cli/scripts/ytplay.nix {inherit pkgs;};
in [ plock = import ../../modules/cli/scripts/plock.nix {inherit pkgs;};
{ in
key = "a"; [
desc = "Apps"; {
submenu = [ key = "a";
{ desc = "Apps";
key = "b"; submenu = [
desc = "Browser"; {
cmd = "zen"; key = "b";
} desc = "Browser";
{ cmd = "zen";
key = "B"; }
desc = "Qutebrowser"; {
cmd = "${pkgs.qutebrowser}/bin/qutebrowser"; key = "B";
} desc = "Qutebrowser";
{ cmd = "${pkgs.qutebrowser}/bin/qutebrowser";
key = "d"; }
desc = "Discord"; {
cmd = "${pkgs.vesktop}/bin/vesktop"; key = "d";
} desc = "Discord";
{ cmd = "${pkgs.vesktop}/bin/vesktop";
key = "e"; }
desc = "Emacs"; {
cmd = "${config.home.dev.editors.emacs.package}/bin/emacsclient -c -n"; key = "e";
} desc = "Emacs";
{ cmd = "${config.home.dev.editors.emacs.package}/bin/emacsclient -c -n";
key = "g"; }
desc = "Gimp"; {
cmd = "${pkgs.gimp}/bin/gimp"; key = "g";
} desc = "Gimp";
{ cmd = "${pkgs.gimp}/bin/gimp";
key = "n"; }
desc = "Nemo"; {
cmd = "${pkgs.nemo-with-extensions}/bin/nemo"; key = "h";
} desc = "Handy";
{ cmd = "pkill -USR2 -n handy";
key = "N"; }
desc = "Nextcloud"; {
cmd = "${pkgs.nextcloud-client}/bin/nextcloud"; key = "n";
} desc = "Nemo";
{ cmd = "${pkgs.nemo-with-extensions}/bin/nemo";
key = "r"; }
desc = "Rofi"; {
submenu = [ key = "N";
{ desc = "Nextcloud";
key = "b"; cmd = "${pkgs.nextcloud-client}/bin/nextcloud";
desc = "Bluetooth"; }
cmd = "${pkgs.rofi-bluetooth}/bin/rofi-bluetooth"; {
} key = "r";
{ desc = "Rofi";
key = "c"; submenu = [
desc = "calc"; {
cmd = "rofi -show calc"; key = "b";
} desc = "Bluetooth";
{ cmd = "${pkgs.rofi-bluetooth}/bin/rofi-bluetooth";
key = "e"; }
desc = "Emoji"; {
cmd = "rofi -show emoji"; key = "c";
} desc = "calc";
{ cmd = "rofi -show calc";
key = "r"; }
desc = "App Menu"; {
cmd = "rofi -show drun"; key = "e";
} desc = "Emoji";
{ cmd = "rofi -show emoji";
key = "s"; }
desc = "SSH"; {
cmd = "rofi -show ssh"; key = "r";
} desc = "App Menu";
{ cmd = "rofi -show drun";
key = "y"; }
desc = "YouTube"; {
cmd = "${ytplay}/bin/ytplay"; key = "s";
} desc = "SSH";
]; cmd = "rofi -show ssh";
} }
]; {
} key = "y";
{ desc = "YouTube";
key = "b"; cmd = "${ytplay}/bin/ytplay";
desc = "Buffers"; }
submenu = [ ];
{ }
key = "c"; ];
desc = "Center"; }
cmd = "${center-window}/bin/center-window"; {
} key = "b";
{ desc = "Buffers";
key = "d"; submenu = [
desc = "Close"; {
cmd = "${close-window}/bin/close-window"; key = "c";
} desc = "Center";
{ cmd = "${center-window}/bin/center-window";
key = "f"; }
desc = "Fullscreen"; {
cmd = "${fullscreen}/bin/fullscreen"; key = "d";
} desc = "Close";
{ cmd = "${close-window}/bin/close-window";
key = "F"; }
desc = "Float"; {
cmd = "${float-window}/bin/float-window"; key = "f";
} desc = "Fullscreen";
{ cmd = "${fullscreen}/bin/fullscreen";
key = "u"; }
desc = "Urgent"; {
cmd = "${focus-urgent}/bin/focus-urgent"; key = "F";
} desc = "Float";
{ cmd = "${float-window}/bin/float-window";
key = "."; }
desc = "Resize"; {
submenu = [ key = "u";
{ desc = "Urgent";
key = left; cmd = "${focus-urgent}/bin/focus-urgent";
desc = "Decrease Width"; }
cmd = "echo decrease width"; {
keep-open = true; key = ".";
} desc = "Resize";
{ submenu = [
key = down; {
desc = "Increase Height"; key = left;
cmd = "echo decrease height"; desc = "Decrease Width";
keep-open = true; cmd = "echo decrease width";
} keep-open = true;
{ }
key = up; {
desc = "Decrease Height"; key = down;
cmd = "echo decrease height"; desc = "Increase Height";
keep-open = true; cmd = "echo decrease height";
} keep-open = true;
{ }
key = right; {
desc = "Increase Width"; key = up;
cmd = "echo increase width"; desc = "Decrease Height";
keep-open = true; cmd = "echo decrease height";
} keep-open = true;
]; }
} {
]; key = right;
} desc = "Increase Width";
{ cmd = "echo increase width";
key = "p"; keep-open = true;
desc = "Power"; }
submenu = [ ];
{ }
key = "l"; ];
desc = "Logout"; }
cmd = ""; {
} key = "l";
{ desc = "Lock session";
key = "s"; cmd = "${plock}/bin/plock";
desc = "Suspend"; }
cmd = "systemctl suspend"; {
} key = "p";
{ desc = "Power";
key = "r"; submenu = [
desc = "Reboot"; {
cmd = "systemctl reboot"; key = "l";
} desc = "Logout";
{ cmd = "${logout}/bin/logout";
key = "o"; }
desc = "Poweroff"; {
cmd = "systemctl poweroff"; key = "s";
} desc = "Suspend";
]; cmd = "systemctl suspend";
} }
{ {
key = "s"; key = "r";
desc = "Screenshots"; desc = "Reboot";
submenu = [ cmd = "systemctl reboot";
{ }
key = "Print"; {
desc = "Screenshot"; key = "o";
cmd = "screenshot"; desc = "Poweroff";
} cmd = "systemctl poweroff";
{ }
key = "d"; ];
desc = "Delayed"; }
cmd = "screenshot -d 3"; {
} key = "s";
{ desc = "Screenshots";
key = "D"; submenu = [
desc = "Select, Delay, Edit, and Copy"; {
cmd = "screenshot -secd 3"; key = "Print";
} desc = "Screenshot";
{ cmd = "screenshot";
key = "e"; }
desc = "Select, Edit, and Copy"; {
cmd = "screenshot -sec"; key = "d";
} desc = "Delayed";
{ cmd = "screenshot -d 3";
key = "g"; }
desc = "Select, Gimp, and Copy"; {
cmd = "screenshot -sgc"; key = "D";
} desc = "Select, Delay, Edit, and Copy";
{ cmd = "screenshot -secd 3";
key = "s"; }
desc = "Select and Copy"; {
cmd = "screenshot -sc"; key = "e";
} desc = "Select, Edit, and Copy";
]; cmd = "screenshot -sec";
} }
]; {
key = "g";
desc = "Select, Gimp, and Copy";
cmd = "screenshot -sgc";
}
{
key = "s";
desc = "Select and Copy";
cmd = "screenshot -sc";
}
];
}
]
++ lib.lists.optional config.home.desktop.wl-kbptr.enable {
key = "m";
desc = "Mouse Warp";
cmd = "wl-kbptr";
};
}; };
} }

264
users/phundrak/zellij.nix Normal file
View File

@@ -0,0 +1,264 @@
{lib, ...}: {
home.shell.zellij = with lib; {
enable = true;
clearDefaultKeybinds = true;
useUnlockFirst = true;
settings.copy_on_select = true;
extraSettings = ''
plugins {
about location="zellij:about"
compact-bar location="zellij:compact-bar"
configuration location="zellij:configuration"
filepicker location="zellij:strider" {
cwd "/"
}
plugin-manager location="zellij:plugin-manager"
session-manager location="zellij:session-manager"
status-bar location="zellij:status-bar"
strider location="zellij:strider"
tab-bar location="zellij:tab-bar"
welcome-screen location="zellij:session-manager" {
welcome_screen true
}
}
'';
keybinds = let
# bépo layout
left = ["c" "Left"];
down = ["t" "Down"];
up = ["s" "Up"];
right = ["r" "Right"];
numRow = ["\"" "«" "»" "(" ")" "@" "+" "-" "/" "*"];
in {
locked = [
{
bind = "Ctrl Alt g";
actions = {SwitchToMode = "normal";};
}
];
pane = [
{
bind = left;
actions = {MoveFocus = "Left";};
}
{
bind = down;
actions = {MoveFocus = "Down";};
}
{
bind = up;
actions = {MoveFocus = "Up";};
}
{
bind = right;
actions = {MoveFocus = "Right";};
}
{
bind = "n";
actions = {NewPane = [];};
useUnlockFirst = true;
}
{
bind = "T";
actions = {NewPane = "Down";};
useUnlockFirst = true;
}
{
bind = "R";
actions = {NewPane = "Right";};
useUnlockFirst = true;
}
{
bind = "S";
actions = {NewPane = "stacked";};
useUnlockFirst = true;
}
{
bind = "N";
actions = {SwitchToMode = "normal";};
}
{
bind = "e";
actions = {TogglePaneEmbedOrFloating = [];};
useUnlockFirst = true;
}
{
bind = "i";
actions = {TogglePanePinned = [];};
}
{
bind = "f";
actions = {ToggleFocusFullscreen = [];};
useUnlockFirst = true;
}
{
bind = "F";
actions = {ToggleFloatingPanes = [];};
}
{
bind = "q";
actions = {CloseFocus = [];};
useUnlockFirst = true;
}
{
bind = "p";
actions = {SwitchToMode = "normal";};
}
{
bind = "P";
actions = {
SwitchToMode = "renamepane";
PaneNameInput = 0;
};
}
{
bind = "z";
actions = {TogglePaneFrames = [];};
useUnlockFirst = true;
}
{
bind = "tab";
actions = {SwitchFocus = [];};
}
];
resize = [
{
bind = "n";
actions = {SwitchToMode = "locked";};
}
{
bind = left;
actions = {Resize = "Increase Left";};
}
{
bind = down;
actions = {Resize = "Increase Down";};
}
{
bind = up;
actions = {Resize = "Increase Up";};
}
{
bind = right;
actions = {Resize = "Increase Right";};
}
{
bind = "C";
actions = {Resize = "Decrease Left";};
}
{
bind = "T";
actions = {Resize = "Decrease Down";};
}
{
bind = "S";
actions = {Resize = "Decrease Up";};
}
{
bind = "R";
actions = {Resize = "Decrease Right";};
}
{
bind = "+";
actions = {Resize = "Increase";};
}
{
bind = "-";
actions = {Resize = "Decrease";};
}
];
move = [
{
bind = left;
actions = {MovePane = "left";};
}
{
bind = down;
actions = {MovePane = "down";};
}
{
bind = up;
actions = {MovePane = "up";};
}
{
bind = right;
actions = {MovePane = "right";};
}
{
bind = "m";
actions = {SwitchToMode = "normal";};
}
{
bind = ["n" "tab"];
actions = {MovePane = [];};
}
{
bind = "p";
actions = {MovePaneBackwards = [];};
}
];
tab =
[
{
bind = left ++ up;
actions = {GoToPreviousTab = [];};
}
{
bind = down ++ right;
actions = {GoToNextTab = [];};
}
{
bind = "[";
actions = {BreakPaneLeft = [];};
useUnlockFirst = true;
}
{
bind = "]";
actions = {BreakPaneRight = [];};
useUnlockFirst = true;
}
{
bind = "b";
actions = {BreakPane = [];};
useUnlockFirst = true;
}
{
bind = "n";
actions = {NewTab = [];};
useUnlockFirst = true;
}
{
bind = "R";
actions = {
SwitchToMode = "renametab";
TabNameInput = 0;
};
}
{
bind = "s";
actions = {ToggleActiveSyncTab = [];};
useUnlockFirst = true;
}
{
bind = "T";
actions = {SwitchToMode = "normal";};
}
{
bind = "x";
actions = {CloseTab = [];};
useUnlockFirst = true;
}
{
bind = "tab";
actions = {ToggleTab = [];};
}
]
++ (lists.imap1 (i: key: {
bind = key;
actions = {GoToTab = i;};
useUnlockFirst = true;
})
numRow);
};
};
}