Compare commits

..
192 Commits
Author SHA1 Message Date
christoph a056e4d98b Modules/Packages: Add ttyper, bandwhich, snitch 2026-03-26 15:21:25 +01:00
christoph 5f17a04fbb Home: Extract common nixos/darwin packages/programs/module-configs into terminal+packages modules 2026-03-24 11:58:45 +01:00
christoph f514387f64 System: Use lib.networking to configure static networks 2026-03-24 11:32:11 +01:00
christoph c328c188b8 Lib/Networking: Add option to configure route-less addresses 2026-03-24 11:31:56 +01:00
christoph 585f74ce0f System: Use common nix configuration 2026-03-24 11:30:38 +01:00
christoph 8263fe01eb Lib/Nixos: Add common nix configuration 2026-03-24 11:30:22 +01:00
christoph d61e6f8b9c Services: Use common dockerhub login 2026-03-24 11:29:21 +01:00
christoph 7c7c195083 Lib/Containers: Add common dockerhub login 2026-03-24 11:27:22 +01:00
christoph 2e78898c5a Modules/Neovim: Add devdocs integration plugin 2026-03-24 10:38:34 +01:00
christoph 1f61e9958c System/Darwinix: Add signal cask 2026-03-23 13:56:54 +01:00
christoph c8954e5854 Home/Darwinix: Add speedtest-cli 2026-03-23 13:42:23 +01:00
christoph e772d93f23 Home: Add speedtest-cli 2026-03-23 13:42:00 +01:00
christoph 4c17560020 Services/Comfyui: Update launch args 2026-03-23 13:06:43 +01:00
christoph e1542a1168 System/Darwinix: Add casks (obsidian, discord, ...) 2026-03-23 13:02:46 +01:00
christoph a351bf59ba Services/Comfyui: Update image + launch args 2026-03-23 11:19:43 +01:00
christoph 7a62f38084 Modules/Waybar: Update widget intervals 2026-03-23 11:19:34 +01:00
christoph b50c5f9f71 Modules/Fish: Update abbrs 2026-03-23 11:19:17 +01:00
christoph 0087145957 Services/ComfyUI: Open port 2026-03-23 10:37:29 +01:00
christoph 48c77e9654 System/Darwinix: Move sketchybar to correct location 2026-03-23 00:34:34 +01:00
christoph 71d06d61b1 Modules/Fish: Update abbrs for nix-darwin 2026-03-23 00:24:11 +01:00
christoph 75d024111e Home/Darwinix: Enable sketchybar 2026-03-23 00:21:19 +01:00
christoph b67aee2a64 Modules/Waybar: Update workspace widget colors (empty/occupied/active/urgent) 2026-03-23 00:20:59 +01:00
christoph 554a76b585 Modules/Waybar: Update warning colors 2026-03-22 23:24:19 +01:00
christoph d9e7e315da Modules/Waybar: Disable systemd-failed-units widget 2026-03-22 23:15:48 +01:00
christoph daee8da3ae Home: Move bat/cava/fastfetch/ssh/tmux configs to modules + deduplicate nix-darwin home config 2026-03-22 23:03:19 +01:00
christoph c2b661adbb System/Darwinix: Update trackpad/keyboard config 2026-03-22 22:43:08 +01:00
christoph aa4ebfbc06 Home: Update nixinator ssh config 2026-03-22 22:42:28 +01:00
christoph db850552e3 Add nix-darwin screenshot 2026-03-21 16:19:47 +01:00
christoph 63afac3d04 Modules/Fish: Add nix-darwin homebrew environment setup 2026-03-21 15:50:27 +01:00
christoph 645fc64ead System/Darwinix: Set known network services 2026-03-21 15:41:48 +01:00
christoph 6561d4c979 Home/Darwinix: Set environment variables 2026-03-21 15:40:36 +01:00
christoph f1ed339968 System/Darwinix: System settings 2026-03-21 15:39:01 +01:00
christoph 50d14ecf83 Home/Darwinix: Remove non-available packages 2026-03-21 15:03:34 +01:00
christoph 1cdc3f25e0 System/Darwinix: Add fonts 2026-03-21 15:00:32 +01:00
christoph 9e62f755bb Modules/Neovim: Don't hardcode home directory 2026-03-21 14:46:11 +01:00
christoph d0e6fe072a Home/Darwinix: Disable keychain 2026-03-21 14:34:13 +01:00
christoph 86ea11c8e8 Modules/Fish: Add darwin rebuild abbr 2026-03-21 14:34:06 +01:00
christoph 1adacf5e1e Home/Darwinix: Add programs 2026-03-21 14:18:23 +01:00
christoph e53787deae Modules/Fish: Update for nix-darwin 2026-03-21 14:18:10 +01:00
christoph efce5c6293 Home/Darwinix: Add packages 2026-03-21 14:06:55 +01:00
christoph 6069a12e64 Modules/Neovim: Update for nix-darwin 2026-03-21 14:01:01 +01:00
christoph 91bd79a051 Modules/Kitty: Update for nix-darwin 2026-03-21 13:56:24 +01:00
christoph 9bec5f42b1 Modules/Fish: Update for nix-darwin 2026-03-21 13:44:12 +01:00
christoph 602aa4cd56 Initialize nix-darwin config for darwinix 2026-03-21 13:28:25 +01:00
christoph 3573a705af Home: Disable rofi 2026-03-21 11:49:04 +01:00
christoph 615d886a98 Update screenshots 2026-03-21 11:22:51 +01:00
christoph 4416f39f0c Modules/Niri: Enable dunst 2026-03-21 11:21:02 +01:00
christoph 0bb481c037 Modules/Niri: Use waypaper with swww backend instead of swaybg 2026-03-21 10:59:19 +01:00
christoph 98a3788f4f Modules/Niri: Add wallpaper switcher keybindings 2026-03-21 01:45:07 +01:00
christoph ac4b005f9b Add wallpapers 2026-03-21 01:41:42 +01:00
christoph 901f58a527 Modules/Niri: Set wallpaper 2026-03-20 22:58:05 +01:00
christoph 9a5bc3e981 Modules/Niri: Add session command menu 2026-03-20 22:47:08 +01:00
christoph fe69d39769 Lib/Rofi: Allow supplying a dmenu command for mkSimpleMenu 2026-03-20 22:46:58 +01:00
christoph 2f675e96f0 Modules/Niri: Theme walker 2026-03-20 22:24:00 +01:00
christoph 56512194ef Modules/Waybar: Update module configurations 2026-03-20 21:41:02 +01:00
christoph d1a6aafed5 Modules/Waybar: Make option accept list of outputs instead of single 2026-03-20 20:00:12 +01:00
christoph 6305d9ca2e Modules/Niri: Replace kde polkit agent with gnome's + fix waybar rounded corner clipping 2026-03-20 19:52:35 +01:00
christoph 887f7db0c7 Modules/Waybar: Align waybar with current colorscheme 2026-03-20 19:51:18 +01:00
christoph d8dbdbc5de Modules/Neovim: Add tombi toml formatter 2026-03-20 19:50:44 +01:00
christoph 4014ed0318 Modules/Niri: Disable DMS (slow af) 2026-03-20 19:25:28 +01:00
christoph 87fa954937 Modules/Firefox: Fix search engine typo 2026-03-20 17:10:53 +01:00
christoph 934644c5e2 Modules/Niri: Update gtk theme + fix flatpak themes 2026-03-20 17:10:43 +01:00
christoph 0bda035ccd Modules/Hyprland: Deprecate hyprland module 2026-03-20 14:08:51 +01:00
christoph 6e999ffa02 Modules/Fish: Update abbrs 2026-03-20 10:32:12 +01:00
christoph 807388d032 Home: Add exiftool 2026-03-20 09:35:06 +01:00
christoph 9b1a7c73e6 Modules/Niri: Update gtk theme 2026-03-19 23:57:52 +01:00
christoph da729f8c22 Services/ComfyUI: Update root directory 2026-03-19 23:57:43 +01:00
christoph d08d795adf System/Nixinator: Add two additional disks to system (disko, luks) 2026-03-19 23:57:32 +01:00
christoph ffc2516353 Home/Nixinator: Add hytale + steam 2026-03-19 23:57:05 +01:00
christoph 135e1e5701 Services/ComfyUI: Init at v2026-03-16 2026-03-19 17:43:22 +01:00
christoph 5b2fc78889 Services/FileFlows: Don't autostart nixinator node 2026-03-19 17:37:19 +01:00
christoph 4cbe9885b2 Home: Remove old ollama config 2026-03-19 17:32:15 +01:00
christoph 9b43074248 Home: Add mars database port forward 2026-03-19 10:29:55 +01:00
christoph be3f6baa17 Home/Nixinator: Use ghidra option instead of package 2026-03-19 10:29:43 +01:00
christoph 837233b552 Modules/Firefox: Update search engines 2026-03-17 18:16:41 +01:00
christoph ca0c718f3b Modules/Firefox: Update HM Search bookmark url 2026-03-17 18:16:34 +01:00
christoph 3c68574aea Home: Add resultbrowser ssh port forward to mars host 2026-03-17 18:16:21 +01:00
christoph aa668d04d3 Modules/Impermanence: Persist ghidra config 2026-03-13 01:10:04 +01:00
christoph d16b645078 System/Nixinator: Disable restic backup service (broken) 2026-03-13 00:55:35 +01:00
christoph b71264b864 Home/Nixinator: Add ghidra 2026-03-13 00:47:33 +01:00
christoph 6ed1882429 System/Nixinator: Open FAIL* port 1111 2026-03-12 20:25:54 +01:00
christoph 952802d4f7 Modules/Neovim: Don't use cursive script front in neovide 2026-03-12 20:25:44 +01:00
christoph 53fc6eedc8 Flake: Update lock 2026-03-12 20:25:25 +01:00
christoph 2e0f378c9e Modules/Neovim: Fix just-lsp configuration 2026-03-12 09:31:01 +01:00
christoph abab1cf2b4 Modules/Neovim: Fix persisted mappings 2026-03-12 09:28:26 +01:00
christoph ad3210f150 Home: Add wl-clipboard 2026-03-11 21:05:29 +01:00
christoph afe74b8fa1 Config/Flake: Update flake template 2026-03-11 21:05:21 +01:00
christoph 8f5a9d753f Services/Fileflows: Update to v26.01 2026-03-11 12:30:56 +01:00
christoph d45a9946bb Modules/Impermanence: Persist man cache 2026-03-09 22:48:36 +01:00
christoph c0f8356205 Home: Add binsider/jujutsu/lurk/radare2 2026-03-09 21:42:09 +01:00
christoph 72a8dcb8d5 System: Rename man cache option 2026-03-09 12:16:37 +01:00
christoph da548f10bb Home/Nixtop: Replace light with brightnessctl 2026-03-09 12:16:27 +01:00
christoph 9bfbbc0dc9 Home: Replace helvum with crosspipe 2026-03-09 12:16:04 +01:00
christoph 26ac3a8e02 Home/Nixtop: Replace light with brightnessctl 2026-03-09 12:15:56 +01:00
christoph 632fcc3dab Derivations/Tiddl: Add typer typing-extensions build input 2026-03-09 12:15:45 +01:00
christoph a204951964 Flake: Update lock 2026-03-09 12:15:23 +01:00
christoph 9aea533693 Home: Update CLion EAP version + masssprings version 2026-03-06 22:15:09 +01:00
christoph a07499813d Home: Add masssprings 2026-03-05 10:28:56 +01:00
christoph 6e2a64a50c Home: Pregenerate keepassxc session config 2026-03-05 10:28:26 +01:00
christoph 80d932838f Overlays: Upgrade clion to 2026.1-EAP 2026-03-01 22:37:01 +01:00
christoph 4bed2e7021 Modules/Fish: Add nix run abbr 2026-03-01 22:36:50 +01:00
christoph 75ffcc5c6e Modules/Neovim: Update clangd launch arguments 2026-02-28 18:33:37 +01:00
christoph cb14d79586 Modules/Neovim: Move trouble to bottom 2026-02-28 18:33:27 +01:00
christoph 9b41d5552e Modules/Impermanence: Persist jetbrains state 2026-02-28 11:26:20 +01:00
christoph 3d50b8fea7 Home: Add czkawka 2026-02-27 20:10:14 +01:00
christoph 5aec2aa971 Home/Nixinator: Add clion 2026-02-27 18:34:01 +01:00
christoph b799d86823 Config/Flake: Add cross-compilation template 2026-02-27 12:19:31 +01:00
christoph d505394753 Modules/Bootloader: Reduce configuration limit to 3 to fit in 512MB /boot partition 2026-02-27 12:19:21 +01:00
christoph 06cf86fa20 System/Nixinator: Move to linux stable with nvidia-open 2026-02-26 16:15:19 +01:00
christoph a4272ea92c Modules/Niri: Disable DMS startup dialog 2026-02-26 16:14:53 +01:00
christoph 89739e3af0 Modules/Niri: Disable autostart of some apps 2026-02-26 00:17:26 +01:00
christoph 52a99db8e0 System/Nixinator: Enable 5 LUKS password retries 2026-02-26 00:17:14 +01:00
christoph 7848fb7274 System/Nixinator: Switch to vanilla linux kernel (doesn't work with nvidia-open currently) 2026-02-26 00:17:03 +01:00
christoph 397d1b014c Config/Flake: Update after xorg package set deprecation 2026-02-26 00:16:29 +01:00
christoph 7f1ce57994 Derivations/UnityHub: Update after xorg package set deprecation 2026-02-26 00:16:18 +01:00
christoph a1f495f138 Modules/Niri: Disable dsearch 2026-02-23 13:48:30 +01:00
christoph 4e9003e0c5 Config/Flake: Provide devShells.default instead of devShell 2026-02-22 13:47:44 +01:00
christoph 380e11edb2 Modules/Niri: Add reset-window-height hotkey 2026-02-19 22:47:28 +01:00
christoph a2153c4418 Modules/Niri: Update DMS config 2026-02-17 11:45:36 +01:00
christoph abdcbe2ce9 Modules/Niri: Place blurred wallpaper in overview backdrop 2026-02-17 11:45:24 +01:00
christoph fa286dce16 System/Nixinator: Mark /home as neededForBoot 2026-02-17 11:08:02 +01:00
christoph c4454daab6 Modules/Firefox: Disable vdhcoapp 2026-02-17 11:07:54 +01:00
christoph a03c9d8227 Flake: Update lock 2026-02-17 10:53:26 +01:00
christoph 9db5d91da6 Modules/Niri: Enable danksearch 2026-02-17 10:53:26 +01:00
christoph 72716230ea Modules/Neovim: Make clangd-extensions non-lazy 2026-02-17 10:53:26 +01:00
christoph 2919e797ed System: Harden SSHD and authorize key 2026-02-17 10:53:26 +01:00
christoph 86d669c2ab Modules/Niri: Add colorpicker widget to bar 2026-02-17 10:53:26 +01:00
christoph 77ac5b70b8 Services/Formula12: Init 2026-02-17 10:53:26 +01:00
christoph 54839be395 Config/Flake: Update pkgs.hiPrio to lib.hiPrio 2026-02-17 10:53:26 +01:00
christoph 714e3e0683 Config/Neovim: Add bundler script to generate portable neovim config 2026-02-10 18:11:01 +01:00
christoph a8d7d1e666 Modules/Impermanence: Persist tiddl config 2026-02-10 14:54:51 +01:00
christoph 40bcc14304 Modules/Neovim: Add justfile support 2026-02-09 18:55:41 +01:00
christoph fa5bd0eefd Modules/Neovim: Display whitespace in visual mode 2026-02-09 15:50:46 +01:00
christoph 6182ada581 Modules/Neovim: Add makefile formatter 2026-02-09 15:50:24 +01:00
christoph 4acddcec09 Modules/Firefox: Add godbolt bookmark 2026-02-09 14:00:05 +01:00
christoph 5c14817464 Config/Navi: Add tiddl cheat 2026-02-04 20:23:40 +01:00
christoph 38920bd3d7 Derivations/Tiddle: Add tiddl derivation 2026-02-04 20:16:54 +01:00
christoph b89934d13f Services/Kiwix: Init kiwix at v3.8.1 2026-02-03 11:28:16 +01:00
christoph 734dfcadfc Services/Immich: Update to v2.5.2 2026-02-03 11:28:00 +01:00
christoph 2c959fdc0c Services/Nginx: Expose hytale port 2026-01-29 16:33:45 +01:00
christoph e00c4f49f5 Modules/Impermanence: Persist jellyfin-tui settings 2026-01-26 13:44:42 +01:00
christoph 61131ca598 Home: Add jellyfin-tui 2026-01-26 13:44:34 +01:00
christoph 9c1a39d699 Modules/Firefox: Disable darkmode plugin 2026-01-26 13:19:43 +01:00
christoph 32de6e24b7 Modules/Neovim: Enable autotools-language-server 2026-01-25 23:01:07 +01:00
christoph 78e554cc30 Modules/Impermanence: Persist feishin config 2026-01-25 19:23:15 +01:00
christoph f65617deed Home: Add feishing 2026-01-25 19:14:11 +01:00
christoph aa3a881d58 Derivations/TidalDL: Fix derivation after original repo got nuked 2026-01-24 19:46:42 +01:00
christoph 7f99b73635 System/Nixinator: Enable IPv6 networking 2026-01-24 19:22:11 +01:00
christoph c1360e5c2c System/ServeNix: Enable IPv6 networking 2026-01-24 02:05:37 +01:00
christoph ca9e66bc35 System/ThinkNix: Enable IPv6 networking 2026-01-24 01:32:31 +01:00
christoph eac705bdfb Modules/Docker: Enable IP forwarding + add IPv6 fallback dns 2026-01-24 01:32:14 +01:00
christoph 69beab4812 Lib/Networking: Accept router advertisements 2026-01-24 01:31:54 +01:00
christoph 515110ff7d Modules/Neovim: Enable nixd + alejandra also for headless 2026-01-24 01:31:42 +01:00
christoph 9a9bffd637 Home: Add gnumake 2026-01-19 12:07:38 +01:00
christoph f1b269e3ee Modules/Impermanence: Persist /var/lib/docker 2026-01-18 21:51:44 +01:00
christoph f09dee5ad8 Home/Nixinator: Add zed + vscode 2026-01-18 21:45:47 +01:00
christoph f246eacdb3 Modules/Impermanence: Persist docker build cache, zed config, jellyfin-desktop config 2026-01-18 21:45:36 +01:00
christoph b7e2bba8f0 Update systemmodules/homemodules paths to allow nixd to differentiate between the two 2026-01-18 15:47:51 +01:00
christoph 25ae0f4b85 System: Rename system/modules to system/systemmodules 2026-01-18 15:34:46 +01:00
christoph d12b247368 Home: Rename home/modules to home/homemodules 2026-01-18 15:34:36 +01:00
christoph 25e9128875 System/Nixinator: Reenable restic backup with NFS "hard" 2026-01-18 14:01:30 +01:00
christoph eee28f57fc System: Replace NFS mounts "soft" option with "hard" 2026-01-18 14:00:16 +01:00
christoph ea03e2266f System/Nixinator: Disable restic until I figure out why the repo breaks all the time 2026-01-18 01:19:19 +01:00
christoph 5e422d05c9 System/Nixinator: Disable rootless docker 2026-01-18 01:19:04 +01:00
christoph eaa36cfce2 Modules/Neovim: Update clangd options 2026-01-18 00:01:14 +01:00
christoph 572d0bfe9e Modules/Neovim: Update nvim-treesitter config after update 2026-01-17 23:46:34 +01:00
christoph 385ca27f8c Modules/Niri: Disable workspace scroll on focus change 2026-01-17 23:46:19 +01:00
christoph 4c18fd8c8e Modules/Niri: Update DMS configuration after update 2026-01-17 23:00:44 +01:00
christoph bf0c55669c Derivations/TidalDL: Disable broken derivation for now 2026-01-17 21:59:22 +01:00
christoph 86a5e79079 System/Nixinator: Enable 16G swap 2026-01-17 21:58:24 +01:00
christoph 7d429a4720 Derivations/TidalDL: Update src after the original repository was removed (thank you anna) 2026-01-17 20:29:17 +01:00
christoph 2e9a4b13d1 System: Fix after update 2026-01-17 20:28:40 +01:00
christoph 73eeff9a0e Home: Fix after update 2026-01-17 20:28:34 +01:00
christoph d216a8018d Flake: Update lock 2026-01-17 20:20:57 +01:00
christoph b09d854e50 Home/Nixinator: Disable ollama 2026-01-17 20:20:31 +01:00
christoph ff39dd1df2 Modules/Neovim: Rewrite clangd root_dir expression for neovim v0.11 2026-01-17 19:50:05 +01:00
christoph 98c520e0bd Services/FileFlows: Don't mount MusicVideos into nixinator node 2026-01-17 19:32:45 +01:00
christoph 7e3d3ca4a5 Modules/Impermanence: Persist user docker images/containers 2026-01-17 19:23:35 +01:00
christoph c8a76751f3 System/Nixinator: Remove GAMES disk mount 2026-01-17 19:23:05 +01:00
christoph 12a10bee82 Home: Rename dankMaterialShell to dank-material-shell after flake update 2026-01-17 19:22:45 +01:00
christoph 767309885a Flake: Update lock 2026-01-17 19:22:45 +01:00
christoph 6d360ed782 System/Servenix: Mount nfs share for music videos/recorded shows 2026-01-05 18:02:51 +01:00
christoph ddccd51b5a Services/Box: Update to v0.30.1 2026-01-05 18:02:51 +01:00
christoph 1fef42e5d4 Home: Disable hyprland bc it's too woke 2025-12-26 13:45:40 +01:00
christoph 0d20883f4f Home: Enable hyprland + niri depending on their system module state 2025-12-26 13:07:07 +01:00
christoph cec5ec5493 Modules/Niri: Update DMS default config 2025-12-14 17:16:16 +01:00
christoph 5833dff19e Home: Disable hyprland 2025-12-14 16:14:14 +01:00
christoph 7b4c2df7af Modules/Hyprland: Update to current config format 2025-12-14 16:14:07 +01:00
christoph 1643f30906 System/Nixinator: Switch to Nvidia beta driver since stable is currently broken on kernel 6.18 2025-12-12 19:52:06 +01:00
christoph 79c617cc91 Flake: Update lock 2025-12-12 19:52:06 +01:00
christoph 474a8badf4 Modules/Niri: Init DankMaterialShell config 2025-12-12 19:52:06 +01:00
christoph 17368396cf Services/Box: Init at v0.29.3 2025-12-09 03:26:30 +01:00
105 changed files with 2453 additions and 5074 deletions
-128
View File
@@ -1,128 +0,0 @@
# AGENTS.md
## Common Commands
```bash
# Enter the dev shell (provides helper utilities)
nix develop
# Preferred shorthand (nh must be enabled in config)
nh os switch # rebuild and switch
nh os boot # new boot entry without switching
# Direct nixos-rebuild (fallback)
sudo nixos-rebuild switch --flake .#nixinator
sudo nixos-rebuild switch --flake .#nixtop
sudo nixos-rebuild switch --flake .#servenix
sudo nixos-rebuild switch --flake .#thinknix
sudo darwin-rebuild switch --flake .#darwinix
# Validate flake without building
nix flake check
# Dev shell helpers (run inside `nix develop`)
list-system-packages # show installed system packages
list-user-packages # show installed user packages
store-optimise # nix store --optimise
store-verify # nix store --verify --repair
```
## MCP Tools
The **nixos** MCP server is available and should be used for any Nix-related lookups instead of `nix search` or manual web searches. It queries live APIs (search.nixos.org, NixHub, FlakeHub) and is more current than training data.
```
# Common intents
nix {"action":"info","query":"<pkg>","channel":"unstable"} # package info
nix {"action":"search","query":"<term>","type":"options"} # NixOS options
nix {"action":"search","source":"home-manager","query":"<term>"} # HM options
nix {"action":"cache","query":"<pkg>"} # binary cache status
nix_versions {"package":"<attr>","version":"<ver>"} # commit that shipped a version
```
## Architecture
This is a multi-host NixOS/nix-darwin flake. Home-manager runs **as a NixOS module** — not standalone. A single `nixos-rebuild switch` rebuilds system and user config together. The HM config can access the system config via the `nixosConfig` special arg.
### Hosts
| Host | Type | Notes |
|------|------|-------|
| `nixinator` | Desktop (x86_64) | Primary machine; disko, lanzaboote, impermanence |
| `nixtop` | Laptop (x86_64) | Intel GPU, NetworkManager |
| `servenix` | Server (x86_64) | Headless; runs OCI container services |
| `thinknix` | Headless (x86_64) | Generic headless config |
| `darwinix` | macOS (aarch64) | Darwin-specific configuration |
### Config Layering (resolved in this order)
1. **Global defaults**`system/default.nix` / `home/christoph/default.nix`
2. **Host overrides**`system/<hostname>/default.nix` / `home/christoph/<hostname>/default.nix`
3. **Hardware**`system/<hostname>/hardware-configuration.nix` (auto-generated, **do not hand-edit**)
The builder (`lib/nixos.nix`: `mkNixosConfigWithHomeManagerModule`) wires these together.
### Special Args
Injected into **all system and HM modules**:
`inputs` `system` `hostname` `mylib` `username` `publicKeys` `headless`
Use `headless` (boolean) to gate anything graphical. Use `mylib.<fn>` instead of reimplementing helpers.
### Module System
Two parallel hierarchies, identical pattern:
| Scope | Path | Option prefix |
|-------|------|---------------|
| System | `system/systemmodules/<name>/` | `systemmodules.<name>.*` |
| Home-manager | `home/homemodules/<name>/` | `homemodules.<name>.*` |
**System modules**`system/systemmodules/<name>/`
- `options.nix` — declares `systemmodules.<name>.*` options
- `default.nix` — imports `./options.nix`, implements `lib.mkIf <name>.enable { ... }`
**Home-manager modules**`home/homemodules/<name>/`
- `options.nix` — declares `homemodules.<name>.*` options
- `default.nix` — same pattern under `homemodules.*`
When adding a new module, copy from `0_template/` in either hierarchy. Modules under `1_deprecated/` are kept for reference only — not imported anywhere.
HM modules are placed in `home-manager.sharedModules` (not `users.<user>.imports`) — this enables proper nixd completions.
### Custom Library (`lib/`)
Always available as `mylib`. Key files:
- `nixos.nix` — host config builders, `mkNixosConfigWithHomeManagerModule`, `mkDarwinConfigWithHomeManagerModule`
- `modules.nix``mkBoolOption`, `mkElse`, `attrName`, `attrValue`, `contains`
- `networking.nix``mkSystemdNetwork`, `mkStaticSystemdNetwork`
- `generators.nix``toLuaObject`, `toLuaKeymap` (used by Neovim module)
- `containers.nix` — OCI container helpers for services
- `color.nix` — theming
Always use `mylib.<fn>` (available as a special arg) rather than reimplementing these utilities.
### Services
Server services are OCI containers (podman/docker) defined in `system/services/`. Each file defines one or more containers. These are only enabled on `servenix`. Use the template at `system/services/0_TEMPLATE.nix`.
### Secrets
Managed via **sops-nix**. Age keys stored in `flake.nix` under `publicKeys.christoph`. Encrypted `.yaml`/`.json` files live alongside the module that uses them, referenced as `sops.secrets.<name>`.
### Overlays and Custom Derivations
- `overlays/default.nix` — package overrides (e.g., patched JetBrains CLion version)
- `derivations/default.nix` — custom packages: `monolisa`, `msty`, `unityhub`, `tidal-dl-ng`, `tiddl`
- `derivations/1_deprecated/` — kept for reference, not imported
### Sub-projects
`config/flake.nix` is a separate, reusable development-project template — **not part of the main NixOS flake**. It uses `flake-utils` for multi-system shells.
## Constraints
- No CI, no tests, no linting — this is a configuration repo
- `nix flake check` is the only validation available
- `documentation.enable = false` by default (slow); toggle it if you need man pages
- Hardware config files are auto-generated — never edit them by hand
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 2.6 MiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 747 KiB

+28 -144
View File
@@ -1,159 +1,43 @@
# NixFlake # NixOS Configuration
NixOS flake with [Niri](https://github.com/niri-wm/niri), [Waybar](https://github.com/Alexays/Waybar) for a lightweight desktop and [home-manager](https://github.com/nix-community/home-manager) for declarative `~/` configuration. Modular NixOS configuration, using [Niri](https://github.com/niri-wm/niri) and [Waybar](https://github.com/Alexays/Waybar) for a light desktop.
## Screenshots ![](FastFetch.png)
![](Darwin.png)
![Fastfetch](FastFetch.png) To install, run `nixos-rebuild` with the `--flake` parameter from the `NixFlake` directory: `nixos-rebuild switch --flake .#nixinator`.
Alternatively, use `nh os switch` or `nh os boot`.
![Neovim](NeoVim.png) ## NixFlake/system
![Darwin](Darwin.png) Contains all the system configurations.
## Hosts - There is a common configuration used for all systems: `NixFlake/system/default.nix`
- Every system has its own special configuration: `NixFlake/system/<hostname>/default.nix`
- System modules are located in `NixFlake/system/systemmodules`
- Hosted services are located in `NixFlake/system/services`
| Host | Type | GPU | Features | When creating a NixOS configuration inside the `NixFlake/flake.nix` the common configuration is imported.
|-|-|-|-| Because the hostname is propagated to the common configuration, it can import the host-specific config by itself.
| `nixinator` | Desktop (x86_64) | NVIDIA | [disko](https://github.com/nix-community/disko) partitioning, [lanzaboote](https://github.com/nix-community/lanzaboote) Secure Boot, [impermanence](https://github.com/nix-community/impermanence) opt-in state, [sops-nix](https://github.com/Mic92/sops-nix) secrets |
| `nixtop` | Laptop (x86_64) | Intel | Obsolete trash computer |
| `servenix` | Headless (x86_64) | NVIDIA | Jellyfin, Nextcloud, Gitea, ... |
| `thinknix` | Headless (x86_64) | - | AdGuard DNS, Nginx, ... |
| `darwinix` | macOS (aarch64) | - | nix-darwin with home-manager |
## Usage ## NixFlake/home
```bash Contains all the home-manager configurations.
# Enter dev shell (provides helper utilities)
nix develop
# Rebuild system + user config together - There is a common configuration for each user: `NixFlake/home/<username>/default.nix`
nh os switch - There is a configuration for a single system of this user: `NixFlake/home/<username>/<hostname>/default.nix`
nh os boot - Home-Manager modules are located in `NixFlake/home/homemodules`
# Or with nixos-rebuild When creating a NixOS configuration inside the `NixFlake/flake.nix` the common configuration is imported.
sudo nixos-rebuild switch --flake .#nixinator Because the hostname is propagated to the common configuration, it can import the host-specific config by itself.
```
## Info ## NixFlake/derivations
Home-manager runs as a NixOS module (not standalone). A single `nixos-rebuild switch` rebuilds both system and user configuration together. Contains all the stuff I packaged.
Each derivation is loaded into `NixFlake/derivations/default.nix`.
### Components ## NixFlake/overlays
Per-host config consists of three layers: Contains all overlays, e.g. package version overrides.
The `NixFlake/overlays/default.nix` imports all overlays and all derivations.
1. **Common Config**: `system/default.nix` (NixOS) / `home/christoph/default.nix` (home-manager) It is then imported by the top-level `NixFlake/flake.nix`, to make everything available to the system/home configurations.
2. **Host Config**: `system/<hostname>/default.nix` (NixOS) / `home/christoph/<hostname>/default.nix` (home-manager)
3. **Hardware**: `system/<hostname>/hardware-configuration.nix`
### Modules
There are two module hierarchies (NixOS and home-manager modules):
```
system/systemmodules/<name>/ home/homemodules/<name>/
- options.nix # declares options - options.nix # declares options
- default.nix # implementation - default.nix # implementation
```
## Files
```
NixFlake/
├── flake.nix # flake entrypoint: inputs, outputs, host definitions
├── flake.lock # flake lockfile
├── shell.nix # dev shell (nix develop)
├── system/ # NixOS system configurations
│ ├── default.nix # global system defaults (all hosts)
│ ├── <hostname>/ # per-host overrides + hardware-config
│ ├── systemmodules/ # reusable system modules
│ └── services/ # OCI container services
├── home/ # home-manager user configuration
│ └── christoph/
│ ├── default.nix # global user defaults
│ ├── <hostname>/ # per-host user overrides
│ └── homemodules/ # reusable home-manager modules
├── lib/ # shared helpers
├── derivations/ # custom packages
├── overlays/ # package overrides
├── config/ # linked dotfiles
└── wallpapers/ # backgrounds
```
## System Modules
| Module | Description |
|--------|-------------|
| `bootloader` | systemd-boot, lanzaboote Secure Boot signing |
| `desktopportal` | xdg-desktop-portal backends (Niri, GTK) |
| `docker` | Docker / podman daemon config |
| `fonts` | System fonts and fontconfig |
| `impermanence` | Opt-in state persistence (wipes `/` on boot) |
| `mime` | MIME type associations |
| `network` | systemd-networkd wired/wireless config |
| `polkit` | Polkit rules for desktop users |
| `sops-nix` | Secrets decryption at boot |
## Home-Manager Modules
### Shell & Terminal
`fish` `terminal` `kitty` `tmux` `paths`
### Editors
`neovim` `vscode` `zed`
### Desktop / WM
`niri` `waybar` `rofi` `color` `fcitx`
### Media
`mpd` `rmpc` `cava` `beets` `jellyfin-tui`
### Browsers
`firefox` `qutebrowser`
### Tools
`git` `ssh` `bat` `btop` `fastfetch` `lazygit` `yazi` `zathura`
## Services
All server services run as OCI containers (podman). Each service is defined in `system/services/<name>.nix`.
| Service | Purpose |
|---------|---------|
| `adguard` | DNS ad blocking |
| `authelia` | SSO |
| `fileflows` | Media processing |
| `gitea` | Git server |
| `immich` | Photo cloud |
| `jellyfin` | Streaming server |
| `kiwix` | Offline mirrors |
| `kopia` | Docker volume backup |
| `nextcloud` | File sync |
| `nginx-proxy-manager` | Reverse proxy with Let's Encrypt |
| `ntfy` | Push notification server |
| `paperless` | Document management |
| `portainer` | Container status monitor |
| `teamspeak` | Voice chat server |
| `tinymediamanager` | Media metadata management |
## Overlays
Package modifications live in `overlays/default.nix`.
## Secrets
Secrets are managed with sops-nix. Public age keys are stored in `flake.nix` under `publicKeys`. Encrypted `.yaml`/`.json` files are referenced via `sops.secrets.<name>`. Decryption happens at activation time.
## Shared Helpers (`lib/`)
| File | Purpose |
|------|---------|
| `nixos.nix` | Host config builders (NixOS + darwin) |
| `modules.nix` | Option helpers |
| `networking.nix` | systemd-networkd config generators |
| `generators.nix` | Lua code generation |
| `containers.nix` | OCI container helpers for services |
| `color.nix` | Color utilities |
| `rofi.nix` | Rofi menu helpers |
Available to all modules as `mylib` (injected via special args).
+18 -45
View File
@@ -98,65 +98,38 @@ rec {
buildDebug = mkBuildScript "Debug"; buildDebug = mkBuildScript "Debug";
buildRelease = mkBuildScript "Release"; buildRelease = mkBuildScript "Release";
# Add project-local fish abbrs here # Use this to specify commands that should be ran after entering fish shell
abbrs = { initProjectShell = pkgs.writers.writeFish "init-shell.fish" ''
echo "Entering \"${description}\" environment..."
# Determine the project root, used e.g. in cmake scripts
set -g -x FLAKE_PROJECT_ROOT (git rev-parse --show-toplevel)
# Rust Bevy: # Rust Bevy:
# build-release-windows = "CARGO_FEATURE_PURE=1 cargo xwin build --release --target x86_64-pc-windows-msvc"; # abbr -a build-release-windows "CARGO_FEATURE_PURE=1 cargo xwin build --release --target x86_64-pc-windows-msvc"
# C/C++: # C/C++:
# cmake-debug = "${cmakeDebug}"; # abbr -a cmake-debug "${cmakeDebug}"
# cmake-release = "${cmakeRelease}"; # abbr -a cmake-release "${cmakeRelease}"
# build-debug = "${buildDebug}"; # abbr -a build-debug "${buildDebug}"
# build-release = "${buildRelease}"; # abbr -a build-release "${buildRelease}"
# Clojure: # Clojure:
# clojure-deps = "deps-lock --lein"; # abbr -a clojure-deps "deps-lock --lein"
# Python: # Python:
# run = "python ./app/main.py"; # abbr -a run "python ./app/main.py"
# profile = "py-spy record -o profile.svg -- python ./app/main.py && firefox profile.svg"; # abbr -a profile "py-spy record -o profile.svg -- python ./app/main.py && firefox profile.svg"
# ptop = "py-spy top -- python ./app/main.py"; # abbr -a ptop "py-spy top -- python ./app/main.py"
};
eraseAbbr = name: value: ''abbr --erase ${name} 2>/dev/null'';
createAbbr = name: value: ''abbr -a ${name} "${value}"'';
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets unset
unloadProjectShell = pkgs.writers.writeFish "unload-shell.fish" ''
echo "Unloading \"${description}\" environment..."
${builtins.concatStringsSep "\n" (lib.mapAttrsToList eraseAbbr abbrs)}
'';
# This will be sourced by the global fish config if INIT_PROJECT_SHELL gets set
initProjectShell = pkgs.writers.writeFish "init-shell.fish" ''
# Unload just in case, to not have redefinition errors
source ${unloadProjectShell}
echo "Sourcing \"${description}\" environment..."
${builtins.concatStringsSep "\n" (lib.mapAttrsToList createAbbr abbrs)}
''; '';
in in
builtins.concatStringsSep "\n" [ builtins.concatStringsSep "\n" [
# Launch into pure fish shell # Launch into pure fish shell
'' ''
# Determine the project root, used e.g. in cmake scripts exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'"
export FLAKE_PROJECT_ROOT="$(git rev-parse --show-toplevel)"
# Can't do the "exec" with nix-direnv
# - The "exec fish" would call direnv again => Infinite loop
# - The shellHook is Bash/POSIX, so fish syntax doesn't work
# Use this for "nix develop" without direnv
# exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'"
# Use this for direnv without "nix develop"
export INIT_PROJECT_SHELL="${initProjectShell}"
export UNLOAD_PROJECT_SHELL="${unloadProjectShell}"
'' ''
# Qt: Launch into wrapped fish shell (direnv incompatible) # Qt: Launch into wrapped fish shell
# https://nixos.org/manual/nixpkgs/stable/#sec-language-qt # https://nixos.org/manual/nixpkgs/stable/#sec-language-qt
# '' # ''
# fishdir=$(mktemp -d) # fishdir=$(mktemp -d)
+1 -1
View File
@@ -356,7 +356,7 @@ background_alpha=0.8
################ INTERACTION ################# ################ INTERACTION #################
### Change toggle keybinds for the hud & logging ### Change toggle keybinds for the hud & logging
toggle_hud=Shift_R+F12 # toggle_hud=Shift_R+F12
# toggle_hud_position=Shift_R+F11 # toggle_hud_position=Shift_R+F11
# toggle_preset=Shift_R+F10 # toggle_preset=Shift_R+F10
# toggle_fps_limit=Shift_L+F1 # toggle_fps_limit=Shift_L+F1
+9 -15
View File
@@ -206,12 +206,12 @@ dos2unix <file>
$ file: eza -1 $ file: eza -1
% unix2dos % unix2dos
# Convert line endings to dos format Convert line endings to dos format
unix2dos <file> unix2dos <file>
$ file: eza -1 $ file: eza -1
% tiddl % tiddl
# Download stuff from tidal Download stuff from tidal
tiddl download --track-quality max --path ~/Downloads/Beet/Albums --videos none url "<url>" tiddl download --track-quality max --path ~/Downloads/Beet/Albums --videos none url "<url>"
; =========================== ; ===========================
@@ -238,11 +238,11 @@ $ mode: echo -e "--export \tExport public key\n--export-secret-keys\t
% sops % sops
# Edit secrets.yaml # Edit secrets.yaml
sops ~/NixFlake/system/systemmodules/sops-nix/secrets.yaml sops ~/NixFlake/system/modules/sops-nix/secrets.yaml
% sops % sops
# Rekey secrets.yaml # Rekey secrets.yaml
sops updatekeys ~/NixFlake/system/systemmodules/sops-nix/secrets.yaml sops updatekeys ~/NixFlake/system/modules/sops-nix/secrets.yaml
% ssh % ssh
# Generate a new SSH key # Generate a new SSH key
@@ -308,33 +308,27 @@ mkdir -p "<name>" && cd "<name>" && spotdl --client-id (cat /home/christoph/.sec
% ffmpeg % ffmpeg
# Create a slow motion version of a video with interpolated/blended frames # Create a slow motion version of a video with interpolated/blended frames
ffmpeg -i <input> -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=<doublefps>',setpts=2*PTS" output.mp4 ffmpeg -i "<input>" -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=<doublefps>',setpts=2*PTS" output.mp4
$ input: eza -f -1 $ input: eza -f -1
% ffmpeg % ffmpeg
# Detect black bar dimensions automatically by looking at the first 10 frames # Detect black bar dimensions automatically by looking at the first 10 frames
ffmpeg -i <input> -vframes 10 -vf cropdetect -f null - ffmpeg -i "<input>" -vframes 10 -vf cropdetect -f null -
$ input: eza -f -1 $ input: eza -f -1
% ffmpeg % ffmpeg
# Preview video with applied crop settings # Preview video with applied crop settings
ffplay -vf crop=<width>:<height>:<x>:<y> <input> ffplay -vf crop=<width>:<height>:<x>:<y> "<input>"
$ input: eza -f -1 $ input: eza -f -1
% ffmpeg % ffmpeg
# Re-encode the video with applied crop settings # Re-encode the video with applied crop settings
ffmpeg -i <input> -vf crop=<width>:<height>:<x>:<y> -c:a copy output.mp4 ffmpeg -i "<input>" -vf crop=<width>:<height>:<x>:<y> -c:a copy output.mp4
$ input: eza -f -1 $ input: eza -f -1
% ffmpeg % ffmpeg
# Reencode and compress the video using the h265 codec # Reencode and compress the video using the h265 codec
ffmpeg -i <input> -vcodec libx265 -crf <quality> out_<input> ffmpeg -i "<input>" -vcodec libx265 -crf <quality> "out_<input>"
$ input: eza -f -1
$ quality: echo -e "24\n25\n26\n27\n28\n29\n30\n"
% ffmpeg
# Reencode, compress and scale the video using the h265 codec
ffmpeg -i <input> -vcodec libx265 -crf <quality> -vf scale=<width>:-2,setsar=1:1 out_<input>
$ input: eza -f -1 $ input: eza -f -1
$ quality: echo -e "24\n25\n26\n27\n28\n29\n30\n" $ quality: echo -e "24\n25\n26\n27\n28\n29\n30\n"
@@ -1,10 +0,0 @@
.bordered-images img {
border-radius: var(--callout-radius);
/* border-style: solid; */
/* border-width: var(--callout-border-width); */
/* border-color: var(--color-purple-rgb); */
/* box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); */
/* Background color so PNGs with transparent backgrounds don't look weird */
/* background-color: var(--background-secondary); */
}
@@ -1,5 +1,5 @@
.center-images img { img[alt*="center"] {
display: block !important; display: block;
margin-left: auto !important; margin-left: auto;
margin-right: auto !important; margin-right: auto;
} }
@@ -1,4 +0,0 @@
.fullwidth-images img {
width: 100% !important;
height: auto !important;
}
@@ -1,5 +0,0 @@
.justify-text.cm-s-obsidian,
.justify-text.markdown-preview-view {
text-align: justify;
hyphens: auto;
}
+13 -15
View File
@@ -4,19 +4,17 @@
pkgs, pkgs,
}: let }: let
pythonPkgs = pkgs.python314Packages.overrideScope (self: super: { pythonPkgs = pkgs.python314Packages.overrideScope (self: super: {
# NOTE: Typer override apparently no longer required on 2026-08-31 typer = super.typer.overridePythonAttrs (old: {
# version = "0.20.1";
# typer = super.typer.overridePythonAttrs (old: { src = pkgs.fetchPypi {
# version = "0.20.1"; pname = "typer";
# src = pkgs.fetchPypi { version = "0.20.0";
# pname = "typer"; sha256 = "sha256-Gq9klAMXk+SHb7C6z6apErVRz0PB5jyADfixqGZyDDc=";
# version = "0.20.0"; };
# sha256 = "sha256-Gq9klAMXk+SHb7C6z6apErVRz0PB5jyADfixqGZyDDc="; propagatedBuildInputs = with pythonPkgs; [
# }; typing-extensions
# propagatedBuildInputs = with pythonPkgs; [ ];
# typing-extensions });
# ];
# });
aiofiles = super.aiofiles.overridePythonAttrs (old: { aiofiles = super.aiofiles.overridePythonAttrs (old: {
version = "25.1.0"; version = "25.1.0";
@@ -36,12 +34,12 @@
in in
pythonPkgs.buildPythonApplication rec { pythonPkgs.buildPythonApplication rec {
pname = "tiddl"; pname = "tiddl";
version = "3.4.3"; version = "3.2.0";
format = "pyproject"; format = "pyproject";
src = pythonPkgs.fetchPypi { src = pythonPkgs.fetchPypi {
inherit pname version; inherit pname version;
sha256 = "sha256-45KHNS1IP59DsH8i2uQ7sua6T21vW/Yw1PQg55jzLGs="; sha256 = "sha256-uLkGyIScYPqFgQdPAOYJDJG0jp+nDAwIl2kFkaJZFco=";
}; };
dontCheckRuntimeDeps = true; dontCheckRuntimeDeps = true;
Generated
+234 -1197
View File
File diff suppressed because it is too large Load Diff
+7 -36
View File
@@ -36,7 +36,7 @@
sops-nix.inputs.nixpkgs.follows = "nixpkgs"; sops-nix.inputs.nixpkgs.follows = "nixpkgs";
# Secure boot # Secure boot
lanzaboote.url = "github:nix-community/lanzaboote/v1.1.0"; lanzaboote.url = "github:nix-community/lanzaboote/v0.4.3";
lanzaboote.inputs.nixpkgs.follows = "nixpkgs"; lanzaboote.inputs.nixpkgs.follows = "nixpkgs";
# Nix User Repository (e.g. Firefox addons) # Nix User Repository (e.g. Firefox addons)
@@ -47,10 +47,6 @@
nps.url = "github:OleMussmann/nps"; nps.url = "github:OleMussmann/nps";
nps.inputs.nixpkgs.follows = "nixpkgs"; nps.inputs.nixpkgs.follows = "nixpkgs";
# Nix Gaming
nix-gaming.url = "github:fufexan/nix-gaming";
nix-gaming.inputs.nixpkgs.follows = "nixpkgs";
# Run unpatched binaries on NixOS # Run unpatched binaries on NixOS
nix-alien.url = "github:thiagokokada/nix-alien"; nix-alien.url = "github:thiagokokada/nix-alien";
# Don't follow nixpkgs: # Don't follow nixpkgs:
@@ -58,16 +54,9 @@
# nix-alien.inputs.nixpkgs.follows = "nixpkgs"; # nix-alien.inputs.nixpkgs.follows = "nixpkgs";
# Niri # Niri
# niri.url = "github:sodiboo/niri-flake"; niri.url = "github:sodiboo/niri-flake";
niri.url = "github:epireyn/niri-flake"; # NOTE: Updated fork of sodiboo's
niri.inputs.nixpkgs.follows = "nixpkgs"; niri.inputs.nixpkgs.follows = "nixpkgs";
# Hyprland
hyprland.url = "github:hyprwm/Hyprland";
# hyprland.inputs.nixpkgs.follows = "nixpkgs";
hyprland-plugins.url = "github:hyprwm/hyprland-plugins";
hyprland-plugins.inputs.hyprland.follows = "hyprland";
# Walker # Walker
elephant.url = "github:abenz1267/elephant"; elephant.url = "github:abenz1267/elephant";
walker.url = "github:abenz1267/walker"; walker.url = "github:abenz1267/walker";
@@ -75,7 +64,7 @@
# NeoVim <3 # NeoVim <3
nixvim.url = "github:nix-community/nixvim"; nixvim.url = "github:nix-community/nixvim";
# nixvim.inputs.nixpkgs.follows = "nixpkgs"; nixvim.inputs.nixpkgs.follows = "nixpkgs";
# Emacs nightly # Emacs nightly
# emacs-overlay.url = "github:nix-community/emacs-overlay"; # emacs-overlay.url = "github:nix-community/emacs-overlay";
@@ -89,24 +78,10 @@
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest"; nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
# nix-flatpak.inputs.nixpkgs.follows = "nixpkgs"; # nix-flatpak doesn't have this # nix-flatpak.inputs.nixpkgs.follows = "nixpkgs"; # nix-flatpak doesn't have this
# Instant Direnv (load environment in background)
# direnv-instant.url = "github:Mic92/direnv-instant";
# direnv-instant.inputs.nixpkgs.follows = "nixpkgs";
# Realtime audio # Realtime audio
# musnix.url = "github:musnix/musnix"; # musnix.url = "github:musnix/musnix";
# musnix.inputs.nixpkgs.follows = "nixpkgs"; # musnix.inputs.nixpkgs.follows = "nixpkgs";
claude-desktop.url = "github:aaddrick/claude-desktop-debian";
claude-desktop.inputs.nixpkgs.follows = "nixpkgs";
# Unofficial
codex-desktop-linux.url = "github:ilysenko/codex-desktop-linux";
codex-desktop-linux.inputs.nixpkgs.follows = "nixpkgs";
stylix.url = "github:nix-community/stylix";
stylix.inputs.nixpkgs.follows = "nixpkgs";
# HyTale # HyTale
hytale-launcher.url = "github:JPyke3/hytale-launcher-nix"; hytale-launcher.url = "github:JPyke3/hytale-launcher-nix";
@@ -163,7 +138,7 @@
inputs.nur.overlays.default inputs.nur.overlays.default
inputs.niri.overlays.niri inputs.niri.overlays.niri
# inputs.emacs-overlay.overlay # inputs.emacs-overlay.overlay
inputs.claude-desktop.overlays.default # inputs.comfyui-nix.overlays.default
# All my own overlays (derivations + modifications) # All my own overlays (derivations + modifications)
(import ./overlays {inherit inputs nixpkgs pkgs-stable;}) (import ./overlays {inherit inputs nixpkgs pkgs-stable;})
@@ -246,10 +221,7 @@
hostname = "darwinix"; hostname = "darwinix";
username = "christoph"; username = "christoph";
headless = false; headless = false;
extraModules = [ extraModules = [];
inputs.sops-nix.darwinModules.sops
inputs.stylix.darwinModules.stylix
];
}; };
}; };
@@ -275,9 +247,8 @@
extraModules = extraModules =
[ [
inputs.disko.nixosModules.disko inputs.disko.nixosModules.disko
inputs.stylix.nixosModules.stylix # inputs.nixified-ai.nixosModules.comfyui
inputs.nix-gaming.nixosModules.platformOptimizations # inputs.comfyui-nix.nixosModules.default
inputs.codex-desktop-linux.nixosModules.default
] ]
++ commonModules; ++ commonModules;
}; };
+2 -191
View File
@@ -54,7 +54,7 @@ in
cursorSize = 24; cursorSize = 24;
cursorPackage = pkgs.bibata-cursors; cursorPackage = pkgs.bibata-cursors;
iconTheme = "Papirus-Dark"; iconTheme = "Papirus";
iconPackage = pkgs.papirus-icon-theme; iconPackage = pkgs.papirus-icon-theme;
scheme = "catppuccin-mocha"; scheme = "catppuccin-mocha";
@@ -77,193 +77,6 @@ in
disableTabBar = true; disableTabBar = true;
}; };
hyprland = {
enable = nixosConfig.programs.hyprland.enable;
bars.enable = false;
hyprpanel.enable = false;
keybindings = {
main-mod = "SUPER";
bindings = let
sessionMenu = mylib.rofi.mkMenu {
prompt = "Session2";
layers = [
{
"󰤂 Poweroff" = "poweroff";
"󰜉 Reboot" = "reboot";
"󰌾 Lock" = "loginctl lock-session";
# " Reload Hyprpanel" = "systemctl --user restart hyprpanel.service";
" Reload Hyprland" = "hyprctl reload";
" Exit Hyprland" = "hyprctl dispatch exit";
# " Exit Niri" = "niri msg action quit";
}
];
prompts = ["Select Session Action"];
rofiCmd = "walker -d";
};
in
lib.mergeAttrsList [
{
"$mainMod SHIFT, a" = ["exec, walker -m providerlist"];
"$mainMod, a" = ["exec, walker -m desktopapplications"];
"$mainMod, c" = ["exec, walker -m clipboard"];
"$mainMod, Escape" = ["exec, ${sessionMenu}/bin/rofi-menu-Session2"];
"$mainMod CTRL, w" = ["exec, waypaper"];
}
{
# Applications
"$mainMod, t" = ["exec, kitty"];
"$mainMod, e" = ["exec, kitty --title=Yazi yazi"];
"$mainMod, n" = ["exec, neovide"];
# "$mainMod, r" = ["exec, kitty --title=Rmpc rmpc"];
"$mainMod CTRL, n" = ["exec, kitty --title=Navi navi"];
"$mainMod SHIFT, n" = ["exec, neovide ${config.paths.dotfiles}/navi/christoph.cheat"];
"$mainMod SHIFT, f" = ["exec, neovide ${config.paths.dotfiles}/flake.nix"];
# "ALT, tab" = ["exec, rofi -show window"];
# Screenshots
"$mainMod, p" = ["exec, hyprpicker --autocopy --format=hex"];
"$mainMod, s" = ["exec, grim -g \"$(slurp)\""];
"$mainMod SHIFT, s" = ["exec, grim -g \"$(slurp)\" - | wl-copy"];
# Audio
", XF86AudioRaiseVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"];
", XF86AudioLowerVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-"];
", XF86AudioPlay" = ["exec, playerctl play-pause"];
", XF86AudioPrev" = ["exec, playerctl previous"];
", XF86AudioNext" = ["exec, playerctl next"];
# Brightness
", XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset gamma -10"];
", XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset gamma +10"];
"$mainMod, XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset temperature 5750"];
"$mainMod, XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset identity"];
"CTRL ALT, f" = let
hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl";
grep = "${pkgs.gnugrep}/bin/grep";
awk = "${pkgs.gawk}/bin/gawk";
notify = "${pkgs.libnotify}/bin/notify-send";
toggleMouseFocus = pkgs.writeScriptBin "hypr-toggle-mouse-focus" ''
CURRENT=$(${hyprctl} getoption input:follow_mouse | ${grep} int | ${awk} -F' ' '{print $2}')
if [[ "$CURRENT" == "1" ]]; then
${hyprctl} keyword input:follow_mouse 0
${notify} "Disabled Mouse Focus!"
else
${hyprctl} keyword input:follow_mouse 1
${notify} "Enabled Mouse Focus!"
fi
'';
in ["exec, ${toggleMouseFocus}/bin/hypr-toggle-mouse-focus"];
# "CTRL ALT, t" = ["exec, bash -c 'systemctl --user restart hyprpanel.service'"];
}
];
ws-bindings = {
# "<Workspace>" = "<Key>";
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
"7" = "7";
"8" = "8";
"9" = "9";
"10" = "0";
};
# special-ws-bindings = {
# "ferdium" = "x";
# "msty" = "z";
# "btop" = "b";
# "rmpc" = "r";
# };
};
autostart = {
immediate = [
"kitty --hold fastfetch"
# "zeal"
# "protonvpn-app"
# "kdeconnect-indicator" # started by services.kdeconnect.indicator
];
delayed = [
# "keepassxc" # The tray doesn't work when started too early
"nextcloud --background"
];
special-silent = {
# "ferdium" = ["ferdium"];
# "msty" = ["msty"];
# "btop" = ["kitty --title=Btop btop"];
# "rmpc" = ["kitty --title=Rmpc rmpc"];
};
};
windowrules = [
# Fix jetbrains tooltip flicker
"match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$, float 1"
"match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$, no_initial_focus 1"
];
workspacerules = {
"1" = [];
"2" = ["neovide" "code-url-handler" "dev.zed.Zed" "code" "jetbrains-(.+)"];
"3" = ["obsidian" "Zotero"];
"4" = ["firefox" "Google-chrome" "chromium-browser" "org.qutebrowser.qutebrowser"];
"5" = ["steam"];
"6" = ["steam_app_(.+)" "factorio"];
"7" = ["signal"];
"8" = [];
"9" = ["discord"];
"10" = [];
};
floating = [
{class = "org.kde.polkit-kde-authentication-agent-1";}
{
class = "thunar";
title = "File Operation Progress";
}
{class = "ffplay";}
{class = "Unity";}
{class = "code-url-handler";}
];
transparent-opacity = "0.85";
transparent = [
"kitty"
"Alacritty"
"discord"
"signal"
"vesktop"
"Spotify"
"tidal-hifi"
"obsidian"
"firefox"
"org.qutebrowser.qutebrowser"
"jetbrains-clion"
"jetbrains-idea"
"jetbrains-pycharm"
"jetbrains-rustrover"
"jetbrains-rider"
"jetbrains-webstorm"
"code-url-handler"
"neovide"
"steam"
"ferdium"
"Msty"
];
};
mpd.enable = !headless; mpd.enable = !headless;
niri.enable = nixosConfig.programs.niri.enable; niri.enable = nixosConfig.programs.niri.enable;
nnn.enable = false; # Use yazi nnn.enable = false; # Use yazi
@@ -323,11 +136,9 @@ in
# Enable wayland # Enable wayland
XDG_SESSION_TYPE = "wayland"; XDG_SESSION_TYPE = "wayland";
# QT_QPA_PLATFORM = "wayland;xcb";
QT_QPA_PLATFORM = "wayland"; QT_QPA_PLATFORM = "wayland";
NIXOS_OZONE_WL = "1"; NIXOS_OZONE_WL = "1";
# ELECTRON_OZONE_PLATFORM_HINT = "auto"; SDL_VIDEODRIVER = "wayland";
SDL_VIDEODRIVER = "wayland"; # Leave unset as gamescope uses xwayland
# Run SSH_ASKPASS as GUI, not TTY for Obsidian git # Run SSH_ASKPASS as GUI, not TTY for Obsidian git
SSH_ASKPASS_REQUIRE = "prefer"; SSH_ASKPASS_REQUIRE = "prefer";
+9 -440
View File
@@ -3,7 +3,6 @@
pkgs, pkgs,
nixosConfig, nixosConfig,
config, config,
hostname,
lib, lib,
mylib, mylib,
username, username,
@@ -18,382 +17,7 @@
# because it forces en-US keyboard layout. # because it forces en-US keyboard layout.
fcitx.enable = true; fcitx.enable = true;
helix.enable = true;
hyprland = {
keyboard = {
layout = "us";
variant = "altgr-intl";
option = "nodeadkeys";
};
monitors = {
"DP-1" = {
width = 3440;
height = 1440;
rate = 165;
x = 1920;
y = 0;
scale = 1;
bitdepth = 10;
cm = "auto"; # with render:cm_auto_hdr, we don't need hdr here
};
"DP-2" = {
width = 1920;
height = 1080;
rate = 60;
x = 0;
y = 0;
scale = 1;
};
};
workspaces = {
"DP-1" = [1 2 3 4 5 6 7 8 9];
"DP-2" = [10];
};
autostart = {
delayed = [
"fcitx5"
];
};
floating = [
{
class = "fcitx";
}
];
};
waybar.monitors = ["DP-1" "DP-2"]; waybar.monitors = ["DP-1" "DP-2"];
vscode.enable = true;
zed.enable = true;
};
programs = {
claude-code = {
enable = true;
enableMcpIntegration = true;
};
codexDesktopLinux = {
enable = true;
linuxFeatures = [
"frameless-titlebar"
"global-dictation"
"read-aloud"
"tray-usage"
"ui-tweaks"
];
};
# NOTE: Starts extremely slow
ghostty = {
enable = true;
enableFishIntegration = true;
systemd.enable = true;
settings = {
theme = "catppuccin-mocha";
font-family = config.homemodules.color.font;
font-size = 12;
window-padding-x = 10;
window-padding-y = 10;
adjust-cursor-thickness = 1;
cursor-click-to-move = true;
gtk-single-instance = true;
# link-previews = true;
};
themes = let
color = config.homemodules.color;
in {
catppuccin-mocha = {
background = color.hex.base;
cursor-color = color.hex.rosewater;
foreground = color.hex.text;
palette = [
"0=#${color.hex.surface1}"
"1=#${color.hex.red}"
"2=#${color.hex.green}"
"3=#${color.hex.yellow}"
"4=#${color.hex.blue}"
"5=#${color.hex.pink}"
"6=#${color.hex.teal}"
"7=#${color.hex.subtext1}"
"8=#${color.hex.surface2}"
"9=#${color.hex.red}"
"10=#${color.hex.green}"
"11=#${color.hex.yellow}"
"12=#${color.hex.blue}"
"13=#${color.hex.pink}"
"14=#${color.hex.teal}"
"15=#${color.hex.subtext0}"
];
selection-background = color.hex.surface1;
selection-foreground = color.hex.text;
};
};
};
mcp = {
enable = true;
servers = {
context7 = {
command = "npx";
args = ["-y" "@upstash/context7-mcp"];
env = {
CONTEXT7_API_KEY.file = nixosConfig.sops.secrets.context7-api-key.path;
};
};
# deepwiki = {
# # https://mcpservers.org/servers/devin/deepwiki
# url = "https://mcp.deepwiki.com/mcp";
# };
# github = {
# # https://mcpservers.org/servers/github-mcp-server
# url = "https://api.githubcopilot.com/mcp/";
# headers = {
# Authorization = "Bearer ${input:github_mcp_pat}";
# };
# };
nixos = {
command = "uvx";
args = ["mcp-nixos"];
};
obsidian = {
command = "uvx";
args = ["mcp-obsidian"];
env = {
OBSIDIAN_API_KEY.file = nixosConfig.sops.secrets.obsidian-rest-api-key.path;
OBSIDIAN_HOST = "127.0.0.1";
OBSIDIAN_PORT = "27124";
};
};
svelte = {
# claude mcp add -t stdio -s [scope] svelte -- npx -y @sveltejs/mcp
command = "npx";
args = ["-y" "@sveltejs/mcp"];
type = "stdio";
};
shadcn = {
# npx shadcn@latest mcp init --client claude
command = "npx";
args = ["-y" "shadcn@latest" "mcp"];
};
zotero = {
command = "uvx";
args = ["zotero-mcp-server"];
};
};
};
opencode = {
enable = true;
enableMcpIntegration = true;
extraPackages = with pkgs; [
# opencode-claude-auth # Installed using npm
];
# Writes opencode.json
settings = {
attachment = {
image = {
auto_resize = true;
max_width = 2000;
max_height = 2000;
max_base64_bytes = 5242880;
};
};
autoupdate = false;
compaction = {
auto = true;
prune = true;
reserved = 10000;
};
default_agent = "plan";
enabled_providers = [
"opencode"
"opencode-go"
"anthropic"
"lmstudio"
];
formatter = {
nixfmt = {
disabled = true;
};
alejandra = {
command = ["alejandra" "$FILE"];
extensions = [".nix"];
};
perltidy = {
command = ["perltidy" "$FILE"];
extensions = [".pl"];
};
};
lsp = {
nixd = {
command = ["nixd"];
extensions = [".nix"];
initialization = {
preferences = {
nixd = {
nixpkgs = {expr = "import <nixpkgs> {}";};
options = {
nixos = {expr = "(builtins.getFlake \"/home/${username}/NixFlake\").nixosConfigurations.${hostname}.options";};
home-manager = {expr = "(builtins.getFlake \"/home/${username}/NixFlake\").nixosConfigurations.\"${hostname}\".options.home-manager.users.type.getSubOptions []";};
};
diagnostic = {
suppress = ["sema-escaping-with" "var-bind-to-this" "escaping-this-with"];
};
};
};
};
};
perlnavigator = {
command = ["perlnavigator"];
extensions = [".pl"];
initialization = {
preferences = {};
};
};
# perlpls = {
# command = ["pls"];
# extensions = [".pl"];
# initialization = {
# preferences = {
# perl = {
# perlcritic = {enabled = false;};
# syntax = {enabled = true;};
# };
# };
# };
# };
r-language-server = {
command = ["R" "--no-echo" "-e" "languageserver::run()"];
extensions = [".r" ".rmd" ".quarto"];
};
};
permission = {
"*" = "ask";
"bash" = {
"*" = "ask";
"awk *" = "ask"; # Can modify files
"basename *" = "allow";
"cmp *" = "allow";
"cut *" = "allow";
"df *" = "allow";
"dirname *" = "allow";
"du *" = "allow";
"echo *" = "allow";
"fd *" = "ask"; # Can execute commands
"file *" = "allow";
"find *" = "ask"; # Can execute commands
"grep *" = "allow";
"head *" = "allow";
"ls *" = "allow";
"nl *" = "allow";
"od *" = "allow";
"pwd *" = "allow";
"readlink *" = "allow";
"rg *" = "ask"; # Can execute commands
"sed *" = "ask"; # Can modify files
"sha256sum *" = "allow";
"sha512sum *" = "allow";
"sort *" = "ask"; # Can modify files
"stat *" = "allow";
"tail *" = "allow";
"test *" = "allow";
"tr *" = "allow";
"uniq *" = "ask"; # Can modify files
"wc *" = "allow";
"which *" = "allow";
"xargs *" = "ask"; # Can modify files
"cat *.env" = "deny";
"cat *.env.*" = "deny";
"cat *.env.example" = "allow";
"printenv *" = "deny";
"env *" = "deny";
"nix eval *" = "allow";
"nix flake metadata *" = "allow";
"nix flake show *" = "allow";
"nix path-info *" = "allow";
"nix why-depends *" = "allow";
"nix derivation show *" = "allow";
"nix store ping *" = "allow";
"nix store diff-closures *" = "allow";
"git branch *" = "ask";
"git check-ignore *" = "allow";
"git diff *" = "allow";
"git log *" = "allow";
"git ls-files *" = "allow";
"git ls-tree *" = "allow";
"git remote *" = "ask";
"git rev-list *" = "allow";
"git rev-parse *" = "allow";
"git stash *" = "ask";
"git status *" = "allow";
};
"external_directory" = {
"/nix/store/**" = "allow";
"/tmp" = "allow";
"/tmp/*" = "allow";
};
"read" = {
"*" = "allow";
"*.env" = "deny";
"*.env.*" = "deny";
"*.env.example" = "allow";
};
"grep" = "allow";
"glob" = "allow";
"lsp" = "allow";
"skill" = "allow";
"task" = "ask";
"todowrite" = "allow";
"webfetch" = "allow";
"websearch" = "allow";
"question" = "allow";
};
plugin = [
# "opencode-claude-auth@latest" # https://github.com/griffinmartin/opencode-claude-auth
# "@tarquinen/opencode-dcp@latest" # better compacting
# "opencode-lmstudio@0.3.1"
# "@slkiser/opencode-quota"
];
share = "disabled";
shell = "fish";
snapshot = false;
watcher = {
ignore = ["node_modules/**" "dist/**" ".git/**"];
};
};
# Writes tui.json
tui = {
theme = "system";
diff_style = "auto";
mouse = true;
attention = {
enabled = true;
notifications = true;
sound = true;
volume = "0.3";
};
};
agents = {};
commands = {};
context = '''';
skills = {};
tools = {};
};
}; };
home = let home = let
@@ -451,9 +75,9 @@
# jetbrains.idea-ultimate # jetbrains.idea-ultimate
# jetbrains.webstorm # jetbrains.webstorm
# jetbrains.rider # jetbrains.rider
zed-editor
vscode
# ghidra # launch with _JAVA_AWT_WM_NONREPARENTING=1 (use programs.ghidra) # ghidra # launch with _JAVA_AWT_WM_NONREPARENTING=1 (use programs.ghidra)
# zed-editor # Using module
# vscode # Using module
# Unity Stuff # Unity Stuff
# unityhub # unityhub
@@ -472,17 +96,17 @@
makemkv makemkv
lrcget lrcget
# msty # msty
# jellyfin-media-player # CVE, can't install
jellyfin-desktop jellyfin-desktop
jellyfin-mpv-shim jellyfin-mpv-shim
# tidal-hifi
# tidal-dl-ng # TODO: Borked
# spotdl
tiddl tiddl
picard picard
handbrake handbrake
teamspeak6-client teamspeak6-client
# virt-manager # use system program option
virt-viewer
gnome-boxes # doesn't list VMs imported using virsh
steam-devices-udev-rules steam-devices-udev-rules
]; ];
@@ -515,51 +139,21 @@
stateVersion = "22.05"; stateVersion = "22.05";
}; };
# Cyberpunk 2077 NXM handler
xdg.desktopEntries."modorganizer2-nxm-handler-cyberpunk" = {
type = "Application";
categories = ["Game"];
name = "Mod Organizer 2 NXM Handler (Cyberpunk 2077)";
mimeType = ["x-scheme-handler/nxm"];
exec = let
# Paths seen from inside the Flatpak Steam sandbox
steam = "$HOME/.steam/steam";
steamapps = "$HOME/Games/SteamLibrary/steamapps";
proton = "Proton - Experimental";
# Runs inside flatpak's sandbox
innerCommand = ''
export STEAM_COMPAT_CLIENT_INSTALL_PATH="${steam}"
export STEAM_COMPAT_DATA_PATH="${steamapps}/compatdata/1091500"
exec "${steam}/steamapps/common/${proton}/proton" run \
"$HOME/Games/CyberpunkMO2/nxmhandler.exe" "$1"
'';
# Important: Run through flatpak's/steam's runtimes
nxmHandler = pkgs.writeShellScript "cyberpunk-nxm-handler" ''
exec flatpak run --command=sh com.valvesoftware.Steam -c ${lib.escapeShellArg innerCommand} _ "$1"
'';
in "${nxmHandler} %u";
};
services = { services = {
flatpak = { flatpak = {
packages = [ packages = [
"com.valvesoftware.Steam" "com.valvesoftware.Steam"
"com.valvesoftware.Steam.Utility.steamtinkerlaunch" "com.valvesoftware.Steam.Utility.steamtinkerlaunch"
"org.freedesktop.Platform.VulkanLayer.gamescope/x86_64/25.08" # TODO: Doesn't work "org.freedesktop.Platform.VulkanLayer.gamescope/x86_64/24.08"
"org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/25.08" "org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/24.08"
"io.github.Foldex.AdwSteamGtk" "io.github.Foldex.AdwSteamGtk"
"com.vysp3r.ProtonPlus" "com.vysp3r.ProtonPlus"
"com.github.Matoking.protontricks"
# "net.davidotek.pupgui2" # "net.davidotek.pupgui2"
"org.prismlauncher.PrismLauncher" "org.prismlauncher.PrismLauncher"
"com.usebottles.bottles" "com.usebottles.bottles"
"io.github.lawstorant.boxflat" "io.github.lawstorant.boxflat"
"org.onlyoffice.desktopeditors"
# "com.unity.UnityHub" # "com.unity.UnityHub"
]; ];
@@ -572,37 +166,12 @@
]; ];
}; };
"com.github.Matoking.protontricks".Context = { "com.valvesoftware.Steam".Context = {
filesystems = [
"${config.home.homeDirectory}/.var/app/com.valvesoftware.Steam"
"${config.home.homeDirectory}/Games"
];
};
"com.valvesoftware.Steam" = {
Environment = {
PATH = "/app/bin:/app/utils/bin:/usr/bin:/usr/lib/extensions/vulkan/gamescope/bin";
};
Context = {
filesystems = [ filesystems = [
"${config.home.homeDirectory}/Games" "${config.home.homeDirectory}/Games"
# This is Proton-GE installed from flatpak. ProtonUpQT doesn't require it. # This is Proton-GE installed from flatpak. ProtonUpQT doesn't require it.
"/var/lib/flatpak/runtime/com.valvesoftware.Steam.CompatibilityTool.Proton-GE" "/var/lib/flatpak/runtime/com.valvesoftware.Steam.CompatibilityTool.Proton-GE"
# This is gamescope installed from flatpak
"/usr/lib/extensions/vulkan/gamescope/bin"
# So ModOrganizer2 can load this plugin symlinked from here
"${config.home.homeDirectory}/Projects/ModOrganizer2_Cyberpunk_Plugin"
];
};
};
"com.valvesoftware.Steam.Utility.steamtinkerlaunch".Context = {
filesystems = [
"${config.home.homeDirectory}/.var/app/com.valvesoftware.Steam"
"${config.home.homeDirectory}/Games"
]; ];
}; };
+1 -3
View File
@@ -2,8 +2,6 @@
{pkgs, ...}: { {pkgs, ...}: {
config = { config = {
homemodules = { homemodules = {
# TODO: Niri config (needs to modularize niri module)
hyprland = { hyprland = {
keyboard = { keyboard = {
layout = "us"; layout = "us";
@@ -27,7 +25,7 @@
}; };
}; };
waybar.monitors = ["eDP-1"]; waybar.monitor = "eDP-1";
}; };
home = { home = {
@@ -15,10 +15,10 @@ in {
options.homemodules.helix = import ./options.nix {inherit lib mylib;}; options.homemodules.helix = import ./options.nix {inherit lib mylib;};
config = mkIf cfg.enable { config = mkIf cfg.enable {
# home.sessionVariables = { home.sessionVariables = {
# EDITOR = "hx"; EDITOR = "hx";
# VISUAL = "hx"; VISUAL = "hx";
# }; };
programs.helix = { programs.helix = {
enable = true; enable = true;
@@ -40,11 +40,11 @@ in {
# https://docs.helix-editor.com/configuration.html # https://docs.helix-editor.com/configuration.html
settings = { settings = {
theme = "catppuccin_mocha"; theme = "catppuccin_latte";
editor = { editor = {
scrolloff = 10; scrolloff = 10;
mouse = true; mouse = false; # Default true
middle-click-paste = true; middle-click-paste = false; # Default true
line-number = "relative"; line-number = "relative";
cursorline = true; cursorline = true;
color-modes = true; color-modes = true;
@@ -5,12 +5,16 @@
hyprland, hyprland,
}: }:
builtins.concatLists [ builtins.concatLists [
(lib.optionals hyprland.dunst.enable ["dunst"]) # Notifications
(lib.optionals hyprland.hyprpanel.enable ["hyprpanel"]) # Panel (lib.optionals hyprland.hyprpanel.enable ["hyprpanel"]) # Panel
(lib.optionals hyprland.caelestia.enable ["caelestia shell"]) # Panel/Shell # TODO: Crashes on startup
[ [
# Start clipboard management
"wl-paste -t text --watch clipman store --no-persist"
"wl-paste -p -t text --watch clipman store -P --histpath=\"~/.local/share/clipman-primary.json\""
"hyprctl setcursor ${config.home.pointerCursor.name} ${builtins.toString config.home.pointerCursor.size}" "hyprctl setcursor ${config.home.pointerCursor.name} ${builtins.toString config.home.pointerCursor.size}"
"hyprsunset --identity" "hyprsunset --identity"
"waypaper --restore"
"fcitx5"
# HACK: Hyprland doesn't set the xwayland/x11 keymap correctly # HACK: Hyprland doesn't set the xwayland/x11 keymap correctly
"setxkbmap -layout ${hyprland.keyboard.layout} -variant ${hyprland.keyboard.variant} -option ${hyprland.keyboard.option} -model pc104" "setxkbmap -layout ${hyprland.keyboard.layout} -variant ${hyprland.keyboard.variant} -option ${hyprland.keyboard.option} -model pc104"
@@ -22,11 +26,6 @@ builtins.concatLists [
# This is used for example when running systemd commands without root. # This is used for example when running systemd commands without root.
# "systemctl --user start hyprpolkitagent.service" # "systemctl --user start hyprpolkitagent.service"
# "${pkgs.kdePackages.polkit-kde-agent-1}/libexec/polkit-kde-authentication-agent-1" # "${pkgs.kdePackages.polkit-kde-agent-1}/libexec/polkit-kde-authentication-agent-1"
"${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"
# TODO: This is started by niri already (extract to module so niri/hyprland can both use it)
# "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"
# TODO: This is started by niri already (extract to module so niri/hyprland can both use it)
"dunst"
] ]
] ]
@@ -0,0 +1,516 @@
{
config,
hyprland,
color,
}: {
enable = hyprland.caelestia.enable;
systemd = {
enable = false; # Start from hyprland autostart
target = "graphical-session.target";
environment = [];
};
settings = {
appearance = {
anim = {durations = {scale = 1;};};
font = {
family = {
clock = "Rubik";
material = "Material Symbols Rounded";
mono = color.font;
sans = color.font;
};
size = {scale = 1;};
};
padding = {scale = 1;};
rounding = {scale = 1;};
spacing = {scale = 1;};
transparency = {
base = 0.85;
enabled = false;
layers = 0.4;
};
};
background = {
desktopClock = {enabled = false;};
enabled = true;
# Lags when visible on both monitors (different refresh rates?)
visualiser = {
autoHide = true;
blur = true;
enabled = false;
rounding = 1;
spacing = 1;
};
};
bar = {
clock = {showIcon = true;};
dragThreshold = 20;
entries = [
{
enabled = true;
id = "logo";
}
{
enabled = true;
id = "workspaces";
}
{
enabled = true;
id = "spacer";
}
{
enabled = true;
id = "activeWindow";
}
{
enabled = true;
id = "spacer";
}
{
enabled = true;
id = "clock";
}
{
enabled = true;
id = "tray";
}
{
enabled = true;
id = "statusIcons";
}
{
enabled = true;
id = "power";
}
];
persistent = true;
popouts = {
activeWindow = true;
statusIcons = true;
tray = true;
};
scrollActions = {
brightness = false;
volume = true;
workspaces = true;
};
showOnHover = true;
status = {
showAudio = true;
showBattery = false;
showBluetooth = true;
showKbLayout = false;
showLockStatus = true;
showMicrophone = false;
showNetwork = true;
};
tray = {
background = true;
compact = false;
iconSubs = [];
recolour = false;
};
workspaces = {
activeIndicator = true;
activeLabel = "󰮯";
activeTrail = true;
label = " ";
occupiedBg = false;
occupiedLabel = "󰮯";
perMonitorWorkspaces = false;
showWindows = false;
shown = 10;
# Pick them here: https://fonts.google.com/icons
specialWorkspaceIcons = [
{
icon = "music_note";
name = "rmpc";
}
{
icon = "memory";
name = "btop";
}
{
icon = "mark_chat_unread";
name = "ferdium";
}
{
icon = "network_intelligence";
name = "msty";
}
];
};
};
border = {
rounding = 25;
thickness = 10;
};
dashboard = {
dragThreshold = 50;
enabled = true;
mediaUpdateInterval = 500;
showOnHover = true;
};
general = {
apps = {
audio = ["kitty" "--title=NcpaMixer" "-e" "ncpamixer"];
explorer = ["kitty" "--title=Yazi" "-e" "yazi"];
playback = ["mpv"];
terminal = ["kitty"];
};
battery = {
criticalLevel = 3;
warnLevels = [
{
icon = "battery_android_frame_2";
level = 20;
message = "You might want to plug in a charger";
title = "Low battery";
}
{
icon = "battery_android_frame_1";
level = 10;
message = "You should probably plug in a charger <b>now</b>";
title = "Did you see the previous message?";
}
{
critical = true;
icon = "battery_android_alert";
level = 5;
message = "PLUG THE CHARGER RIGHT NOW!!";
title = "Critical battery level";
}
];
};
idle = {
inhibitWhenAudio = true;
lockBeforeSleep = true;
timeouts = [
{
idleAction = "lock";
timeout = 600;
}
{
# idleAction = "dpms off";
# returnAction = "dpms on";
idleAction = "echo 'idle'";
returnAction = "echo 'return'";
timeout = 10000;
}
{
# idleAction = ["systemctl" "suspend-then-hibernate"];
idleAction = ["echo" "'idle'"];
timeout = 20000;
}
];
};
};
launcher = {
actionPrefix = ">";
actions = [
{
command = ["autocomplete" "calc"];
dangerous = false;
description = "Do simple math equations (powered by Qalc)";
enabled = true;
icon = "calculate";
name = "Calculator";
}
{
command = ["autocomplete" "scheme"];
dangerous = false;
description = "Change the current colour scheme";
enabled = true;
icon = "palette";
name = "Scheme";
}
{
command = ["autocomplete" "wallpaper"];
dangerous = false;
description = "Change the current wallpaper";
enabled = true;
icon = "image";
name = "Wallpaper";
}
{
command = ["autocomplete" "variant"];
dangerous = false;
description = "Change the current scheme variant";
enabled = true;
icon = "colors";
name = "Variant";
}
{
command = ["autocomplete" "transparency"];
dangerous = false;
description = "Change shell transparency";
enabled = false;
icon = "opacity";
name = "Transparency";
}
{
command = ["caelestia" "wallpaper" "-r"];
dangerous = false;
description = "Switch to a random wallpaper";
enabled = false;
icon = "casino";
name = "Random";
}
{
command = ["setMode" "light"];
dangerous = false;
description = "Change the scheme to light mode";
enabled = true;
icon = "light_mode";
name = "Light";
}
{
command = ["setMode" "dark"];
dangerous = false;
description = "Change the scheme to dark mode";
enabled = true;
icon = "dark_mode";
name = "Dark";
}
{
command = ["systemctl" "poweroff"];
dangerous = true;
description = "Shutdown the system";
enabled = true;
icon = "power_settings_new";
name = "Shutdown";
}
{
command = ["systemctl" "reboot"];
dangerous = true;
description = "Reboot the system";
enabled = true;
icon = "cached";
name = "Reboot";
}
{
command = ["loginctl" "terminate-user" ""];
dangerous = true;
description = "Log out of the current session";
enabled = true;
icon = "exit_to_app";
name = "Logout";
}
{
command = ["loginctl" "lock-session"];
dangerous = false;
description = "Lock the current session";
enabled = true;
icon = "lock";
name = "Lock";
}
{
command = ["systemctl" "suspend-then-hibernate"];
dangerous = false;
description = "Suspend then hibernate";
enabled = false;
icon = "bedtime";
name = "Sleep";
}
];
dragThreshold = 50;
enableDangerousActions = true;
hiddenApps = [];
maxShown = 7;
maxWallpapers = 9;
showOnHover = false;
specialPrefix = "@";
useFuzzy = {
actions = false;
apps = false;
schemes = false;
variants = false;
wallpapers = false;
};
vimKeybinds = false;
};
lock = {recolourLogo = false;};
notifs = {
actionOnClick = false;
clearThreshold = 0.3;
defaultExpireTimeout = 5000;
expandThreshold = 20;
expire = true;
};
osd = {
enableBrightness = false;
enableMicrophone = true;
enabled = true;
hideDelay = 2000;
};
paths = {
mediaGif = "root:/assets/bongocat.gif";
sessionGif = "root:/assets/kurukuru.gif";
wallpaperDir = "~/NixFlake/wallpapers";
};
services = {
audioIncrement = 0.1;
defaultPlayer = "MPD";
gpuType = "";
maxVolume = 1;
playerAliases = [
{
from = "com.github.th_ch.youtube_music";
to = "YT Music";
}
];
smartScheme = true;
useFahrenheit = false;
useTwelveHourClock = false;
visualiserBars = 45;
weatherLocation = "Dortmund, Germany";
};
session = {
commands = {
hibernate = ["systemctl" "hibernate"];
logout = ["loginctl" "terminate-user" ""];
reboot = ["systemctl" "reboot"];
shutdown = ["systemctl" "poweroff"];
};
dragThreshold = 30;
enabled = true;
vimKeybinds = false;
};
sidebar = {
dragThreshold = 80;
enabled = true;
};
utilities = {
enabled = true;
maxToasts = 4;
toasts = {
audioInputChanged = true;
audioOutputChanged = true;
capsLockChanged = true;
chargingChanged = true;
configLoaded = true;
dndChanged = true;
gameModeChanged = true;
kbLayoutChanged = false;
nowPlaying = false;
numLockChanged = true;
vpnChanged = true;
};
vpn = {
enabled = false;
provider = [
{
displayName = "Wireguard (Your VPN)";
interface = "your-connection-name";
name = "wireguard";
}
];
};
};
};
cli = {
enable = hyprland.caelestia.enable;
settings = {
record = {extraArgs = [];};
theme = {
enableBtop = false;
enableDiscord = false;
enableFuzzel = false;
enableGtk = false;
enableHypr = false;
enableQt = false;
enableSpicetify = false;
enableTerm = false;
};
toggles = {
communication = {
discord = {
command = ["discord"];
enable = false;
match = [{class = "discord";}];
move = true;
};
whatsapp = {
enable = false;
match = [{class = "whatsapp";}];
move = true;
};
};
music = {
feishin = {
enable = false;
match = [{class = "feishin";}];
move = true;
};
spotify = {
command = ["spicetify" "watch" "-s"];
enable = false;
match = [{class = "Spotify";} {initialTitle = "Spotify";} {initialTitle = "Spotify Free";}];
move = true;
};
};
sysmon = {
btop = {
command = ["kitty" "--title" "Btop" "-e" "btop"];
enable = false;
match = [
{
class = "btop";
title = "Btop";
workspace = {name = "special:sysmon";};
}
];
};
};
todo = {
todoist = {
command = ["todoist"];
enable = false;
match = [{class = "Todoist";}];
move = true;
};
};
};
wallpaper = {postHook = "echo $WALLPAPER_PATH";};
};
};
}
@@ -0,0 +1,180 @@
{
inputs,
config,
lib,
mylib,
pkgs,
nixosConfig,
username,
...
}: let
inherit (config.homemodules) hyprland color;
# Autostart programs
always-exec = import ./autostart.nix {inherit lib pkgs config hyprland;};
# Keybindings
always-bind = import ./mappings.nix {inherit lib config hyprland;};
# Mousebindings
always-bindm = {
"$mainMod, mouse:272" = ["movewindow"];
"$mainMod, mouse:273" = ["resizewindow"];
};
in {
options.homemodules.hyprland = import ./options.nix {inherit lib mylib;};
config = lib.mkIf hyprland.enable {
assertions = [
{
assertion = nixosConfig.programs.hyprland.enable;
message = "Can't enable Hyprland module with Hyprland disabled!";
}
{
assertion = builtins.hasAttr "hyprlock" nixosConfig.security.pam.services;
message = "Can't enable Hyprland module without Hyprlock PAM service!";
}
{
assertion = hyprland.hyprpanel.enable != hyprland.caelestia.enable;
message = "Can't enable Hyprpanel and Caelestia at the same time!";
}
];
gtk = {
enable = true;
iconTheme.package = lib.mkDefault color.iconPackage;
iconTheme.name = color.iconTheme;
};
homemodules = {
hyprpanel.enable = hyprland.hyprpanel.enable;
};
home = {
pointerCursor = {
gtk.enable = lib.mkDefault true;
x11.enable = lib.mkDefault true;
package = lib.mkDefault color.cursorPackage;
name = color.cursor;
size = color.cursorSize;
};
packages = with pkgs; [
hyprpaper # Wallpaper setter
hyprpicker # Color picker
# hyprpolkitagent # Ugly polkit authentication GUI
hyprland-qt-support
hyprsunset # Blue light filter
wl-clipboard
clipman # Clipboard manager (wl-paste)
libnotify
inotify-tools # Includes inotifywait
ncpamixer # Audio control
slurp # Region selector for screensharing
grim # Grab images from compositor
# Deps for Qt5 and Qt6 apps (e.g., Nextcloud)
qt5.qtwayland
qt6.qtwayland
];
file = {
".config/hypr/keybindings.info".text = let
fixupHomeDir = key:
builtins.replaceStrings ["/home/${username}"] ["~"] key;
fixupNixStore = key: let
# The pattern has to match the entire string, otherwise it won't work
matches = builtins.match ".*/nix/store/(.*)/.*" key;
in
if (matches == null)
then key
else builtins.replaceStrings matches ["..."] key;
fixupNoMod = key:
builtins.replaceStrings ["<-"] ["<"] key;
mkBindHelpKey = key:
builtins.replaceStrings ["$mainMod" " " ","] ["${hyprland.keybindings.main-mod}" "-" ""] key;
mkBindHelpAction = action:
builtins.replaceStrings [","] [""] action;
mkBindHelp = key: action: "<${mkBindHelpKey key}>: ${mkBindHelpAction action}";
mkBindsHelp = key: actions:
actions
|> builtins.map (mkBindHelp key)
|> builtins.map fixupNoMod
|> builtins.map fixupNixStore
|> builtins.map fixupHomeDir;
in
(hyprland.keybindings.bindings // always-bind)
|> builtins.mapAttrs mkBindsHelp
|> builtins.attrValues
|> builtins.concatLists
|> builtins.concatStringsSep "\n";
};
};
programs = {
hyprlock = import ./hyprlock.nix {inherit config hyprland color;};
caelestia = import ./caelestia.nix {inherit config hyprland color;};
};
services = {
dunst = import ./dunst.nix {inherit pkgs config hyprland color;};
hypridle = import ./hypridle.nix {inherit config hyprland color;};
hyprpaper = import ./hyprpaper.nix {inherit config hyprland color;};
};
# Make sure the units only start when using Hyprland
systemd.user.services.dunst.Unit.After = lib.mkIf hyprland.dunst.enable (lib.mkForce ["hyprland-session.target"]);
systemd.user.services.dunst.Unit.PartOf = lib.mkIf hyprland.dunst.enable (lib.mkForce ["hyprland-session.target"]);
systemd.user.services.hypridle.Install.WantedBy = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
systemd.user.services.hypridle.Unit.After = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
systemd.user.services.hypridle.Unit.PartOf = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
systemd.user.services.hyprpaper.Install.WantedBy = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
systemd.user.services.hyprpaper.Unit.After = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
systemd.user.services.hyprpaper.Unit.PartOf = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]);
wayland.windowManager.hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
systemd.enable = true; # Enable hyprland-session.target
systemd.variables = ["--all"]; # Import PATH into systemd
xwayland.enable = true;
plugins = builtins.concatLists [
(lib.optionals
hyprland.bars.enable
[inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprbars])
(lib.optionals
hyprland.dynamicCursor.enable
[inputs.hypr-dynamic-cursors.packages.${pkgs.stdenv.hostPlatform.system}.hypr-dynamic-cursors])
(lib.optionals
hyprland.trails.enable
[inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprtrails])
(lib.optionals
hyprland.hyprspace.enable
[inputs.hyprspace.packages.${pkgs.stdenv.hostPlatform.system}.Hyprspace])
];
settings = import ./settings.nix {
inherit
lib
config
hyprland
color
always-exec
always-bind
always-bindm
;
};
};
};
}
@@ -0,0 +1,36 @@
{
pkgs,
config,
hyprland,
color,
}: {
enable = hyprland.dunst.enable;
iconTheme.package = color.iconPackage;
iconTheme.name = color.iconTheme;
settings = {
global = {
monitor = config.homemodules.waybar.monitor;
font = "${color.font} 11";
offset = "10x10";
background = color.hexS.base;
foreground = color.hexS.text;
frame_width = 2;
corner_radius = 6;
separator_color = "frame";
};
urgency_low = {
frame_color = color.hexS.green;
};
urgency_normal = {
frame_color = color.hexS.green;
};
urgency_critical = {
frame_color = color.hexS.red;
};
};
}
@@ -3,7 +3,7 @@
hyprland, hyprland,
color, color,
}: { }: {
enable = true; enable = !hyprland.caelestia.enable;
settings = { settings = {
general = { general = {
@@ -0,0 +1,44 @@
{
keyboard = {
layout = "us";
variant = "altgr-intl";
option = "nodeadkeys";
};
monitors = {
"DP-1" = {
width = 3440;
height = 1440;
rate = 165;
x = 1920;
y = 0;
scale = 1;
};
"DP-2" = {
width = 1920;
height = 1080;
rate = 60;
x = 0;
y = 0;
scale = 1;
};
};
workspaces = {
"DP-1" = [1 2 3 4 5 6 7 8 9];
"DP-2" = [10];
};
autostart = {
delayed = [
"fcitx5"
];
};
floating = [
{
class = "fcitx";
}
];
}
@@ -0,0 +1,186 @@
{
nixosConfig,
config,
lib,
pkgs,
}: {
enable = nixosConfig.programs.hyprland.enable;
dunst.enable = !config.homemodules.hyprpanel.enable; # Disable for hyprpanel
bars.enable = false;
dynamicCursor.enable = false;
trails.enable = true;
hyprspace.enable = false; # Always broken
hyprpanel.enable = true;
caelestia.enable = false;
keybindings = {
main-mod = "SUPER";
bindings = lib.mergeAttrsList [
# Use Rofi if we don't have caelestia
(lib.optionalAttrs (!config.homemodules.hyprland.caelestia.enable) {
"$mainMod, a" = ["exec, rofi -drun-show-actions -show drun"];
"$mainMod, c" = ["exec, clipman pick --tool=rofi"];
"$mainMod SHIFT, l" = ["exec, loginctl lock-session"];
})
# Caelestia
(lib.optionalAttrs (config.homemodules.hyprland.caelestia.enable) {
"$mainMod, a" = ["exec, caelestia shell drawers toggle launcher"];
# "$mainMod, c" = ["exec, caelestia clipboard"];
"$mainMod SHIFT, l" = ["exec, caelestia shell lock lock"];
"$mainMod, escape" = ["exec, caelestia shell drawers toggle session"];
})
{
# Applications
"$mainMod, t" = ["exec, kitty"];
"$mainMod, e" = ["exec, kitty --title=Yazi yazi"];
"$mainMod, n" = ["exec, neovide"];
# "$mainMod, r" = ["exec, kitty --title=Rmpc rmpc"];
"$mainMod CTRL, n" = ["exec, kitty --title=Navi navi"];
"$mainMod SHIFT, n" = ["exec, neovide ${config.paths.dotfiles}/navi/christoph.cheat"];
"$mainMod SHIFT, f" = ["exec, neovide ${config.paths.dotfiles}/flake.nix"];
# "ALT, tab" = ["exec, rofi -show window"];
# Screenshots
"$mainMod, p" = ["exec, hyprpicker --autocopy --format=hex"];
"$mainMod, s" = ["exec, grim -g \"$(slurp)\""];
"$mainMod SHIFT, s" = ["exec, grim -g \"$(slurp)\" - | wl-copy"];
# Audio
", XF86AudioRaiseVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"];
", XF86AudioLowerVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-"];
", XF86AudioPlay" = ["exec, playerctl play-pause"];
", XF86AudioPrev" = ["exec, playerctl previous"];
", XF86AudioNext" = ["exec, playerctl next"];
# Brightness
", XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset gamma -10"];
", XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset gamma +10"];
"$mainMod, XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset temperature 5750"];
"$mainMod, XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset identity"];
"CTRL ALT, f" = let
hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl";
grep = "${pkgs.gnugrep}/bin/grep";
awk = "${pkgs.gawk}/bin/gawk";
notify = "${pkgs.libnotify}/bin/notify-send";
toggleMouseFocus = pkgs.writeScriptBin "hypr-toggle-mouse-focus" ''
CURRENT=$(${hyprctl} getoption input:follow_mouse | ${grep} int | ${awk} -F' ' '{print $2}')
if [[ "$CURRENT" == "1" ]]; then
${hyprctl} keyword input:follow_mouse 0
${notify} "Disabled Mouse Focus!"
else
${hyprctl} keyword input:follow_mouse 1
${notify} "Enabled Mouse Focus!"
fi
'';
in ["exec, ${toggleMouseFocus}/bin/hypr-toggle-mouse-focus"];
# "CTRL ALT, t" = ["exec, bash -c 'systemctl --user restart hyprpanel.service'"];
}
];
ws-bindings = {
# "<Workspace>" = "<Key>";
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
"7" = "7";
"8" = "8";
"9" = "9";
"10" = "0";
};
special-ws-bindings = {
"ferdium" = "x";
"msty" = "z";
"btop" = "b";
"rmpc" = "r";
};
};
autostart = {
immediate = [
"kitty --hold fastfetch"
"zeal"
"nextcloud --background"
"protonvpn-app"
# "kdeconnect-indicator" # started by services.kdeconnect.indicator
];
delayed = [
"keepassxc" # The tray doesn't work when started too early
];
special-silent = {
"ferdium" = ["ferdium"];
"msty" = ["msty"];
"btop" = ["kitty --title=Btop btop"];
"rmpc" = ["kitty --title=Rmpc rmpc"];
};
};
windowrules = [
# Fix jetbrains tooltip flicker
"match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$, float 1"
"match:class ^(jetbrains-.*)$, match:title ^(win[0-9]+)$, no_initial_focus 1"
];
workspacerules = {
"1" = [];
"2" = ["Zotero" "neovide" "code-url-handler"];
"3" = ["obsidian"];
"4" = ["firefox" "Google-chrome" "chromium-browser" "org.qutebrowser.qutebrowser"];
"5" = ["steam"];
"6" = ["steam_app_(.+)"];
"7" = ["signal"];
"8" = ["tidal-hifi"];
"9" = ["discord"];
"10" = ["python3"];
};
floating = [
{class = "org.kde.polkit-kde-authentication-agent-1";}
{
class = "thunar";
title = "File Operation Progress";
}
{class = "ffplay";}
{class = "Unity";}
];
transparent-opacity = "0.75";
transparent = [
"kitty"
"Alacritty"
"discord"
"signal"
"vesktop"
"Spotify"
"tidal-hifi"
"obsidian"
"firefox"
"org.qutebrowser.qutebrowser"
"jetbrains-clion"
"jetbrains-idea"
"jetbrains-pycharm"
"jetbrains-rustrover"
"jetbrains-rider"
"jetbrains-webstorm"
"code-url-handler"
"neovide"
"steam"
"ferdium"
"Msty"
];
}
@@ -0,0 +1,28 @@
{
config,
hyprland,
color,
}: {
enable = !hyprland.caelestia.enable;
settings = {
ipc = "on";
splash = false;
splash_offset = 2.0;
# Wallpapers have to be preloaded to be displayed
preload = let
mkPreload = name: "${config.paths.nixflake}/wallpapers/${name}.jpg";
in
color.wallpapers |> builtins.map mkPreload;
wallpaper = let
mkWallpaper = monitor:
"${monitor}, "
+ "${config.paths.nixflake}/wallpapers/${color.wallpaper}.jpg";
in
hyprland.monitors
|> builtins.attrNames
|> builtins.map mkWallpaper;
};
}
@@ -5,8 +5,13 @@
}: { }: {
enable = lib.mkEnableOption "Hyprland Window Manager + Compositor"; enable = lib.mkEnableOption "Hyprland Window Manager + Compositor";
dunst.enable = lib.mkEnableOption "Enable Dunst notification daemon";
bars.enable = lib.mkEnableOption "Enable window bars"; bars.enable = lib.mkEnableOption "Enable window bars";
dynamicCursor.enable = lib.mkEnableOption "Enable dynamic cursors";
trails.enable = lib.mkEnableOption "Enable dynamic window trails";
hyprspace.enable = lib.mkEnableOption "Enable Hyprspace workspace overview";
hyprpanel.enable = lib.mkEnableOption "Enable Hyprpanel"; hyprpanel.enable = lib.mkEnableOption "Enable Hyprpanel";
caelestia.enable = lib.mkEnableOption "Enable Caelestia";
keyboard = { keyboard = {
layout = lib.mkOption { layout = lib.mkOption {
@@ -137,12 +137,8 @@
hyprland.windowrules hyprland.windowrules
]; ];
render = {
cm_enabled = true;
cm_auto_hdr = true;
};
dwindle = { dwindle = {
pseudotile = true;
preserve_split = true; preserve_split = true;
}; };
@@ -241,5 +237,123 @@
on_double_click = "hyprctl dispatch fullscreen 1"; on_double_click = "hyprctl dispatch fullscreen 1";
}; };
}) })
(lib.optionalAttrs hyprland.dynamicCursor.enable {
dynamic-cursors = {
# enables the plugin
enabled = true;
# sets the cursor behaviour, supports these values:
# tilt - tilt the cursor based on x-velocity
# rotate - rotate the cursor based on movement direction
# stretch - stretch the cursor shape based on direction and velocity
# none - do not change the cursors behaviour
mode = "rotate";
# minimum angle difference in degrees after which the shape is changed
# smaller values are smoother, but more expensive for hw cursors
threshold = 2;
# for mode = rotate
rotate = {
# length in px of the simulated stick used to rotate the cursor
# most realistic if this is your actual cursor size
length = 20;
# clockwise offset applied to the angle in degrees
# this will apply to ALL shapes
offset = 0.0;
};
# for mode = tilt
tilt = {
# controls how powerful the tilt is, the lower, the more power
# this value controls at which speed (px/s) the full tilt is reached
# the full tilt being 60° in both directions
limit = 1000;
# relationship between speed and tilt, supports these values:
# linear - a linear function is used
# quadratic - a quadratic function is used (most realistic to actual air drag)
# negative_quadratic - negative version of the quadratic one, feels more aggressive
# see `activation` in `src/mode/utils.cpp` for how exactly the calculation is done
function = "negative_quadratic";
# time window (ms) over which the speed is calculated
# higher values will make slow motions smoother but more delayed
window = 100;
};
# configure shake to find
# magnifies the cursor if its is being shaken
shake = {
# enables shake to find
enabled = false;
# use nearest-neighbour (pixelated) scaling when shaking
# may look weird when effects are enabled
nearest = true;
# controls how soon a shake is detected
# lower values mean sooner
threshold = 3.0;
# magnification level immediately after shake start
base = 1.5;
# magnification increase per second when continuing to shake
speed = 0.0;
# how much the speed is influenced by the current shake intensitiy
influence = 0.0;
# maximal magnification the cursor can reach
# values below 1 disable the limit (e.g. 0)
limit = 0.0;
# time in millseconds the cursor will stay magnified after a shake has ended
timeout = 1000;
# show cursor behaviour `tilt`, `rotate`, etc. while shaking
effects = true;
# enable ipc events for shake
# see the `ipc` section below
ipc = false;
};
# use hyprcursor to get a higher resolution texture when the cursor is magnified
# see the `hyprcursor` section below
hyprcursor = {
# use nearest-neighbour (pixelated) scaling when magnifing beyond texture size
# this will also have effect without hyprcursor support being enabled
# 0 / false - never use pixelated scaling
# 1 / true - use pixelated when no highres image
# 2 - always use pixleated scaling
nearest = true;
# enable dedicated hyprcursor support
enabled = true;
# resolution in pixels to load the magnified shapes at
# be warned that loading a very high-resolution image will take a long time and might impact memory consumption
# -1 means we use [normal cursor size] * [shake:base option]
resolution = -1;
# shape to use when clientside cursors are being magnified
# see the shape-name property of shape rules for possible names
# specifying clientside will use the actual shape, but will be pixelated
fallback = "clientside";
};
};
})
(lib.optionalAttrs hyprland.trails.enable {
hyprtrails = {
color = "rgb(${color.hex.accent})";
};
})
(lib.optionalAttrs hyprland.hyprspace.enable {
overview = {};
})
]; ];
} }
@@ -0,0 +1,156 @@
# TODO: Expose some settings
{
config,
nixosConfig,
lib,
mylib,
pkgs,
...
}:
with lib;
with mylib.modules; let
cfg = config.homemodules.vscode;
in {
options.homemodules.vscode = import ./options.nix {inherit lib mylib;};
config = mkIf cfg.enable {
programs.vscode = {
enable = true;
enableExtensionUpdateCheck = false;
enableUpdateCheck = false;
extensions = with pkgs.vscode-extensions; [
# alefragnani.bookmarks # TODO: Use inline bookmarks instead
# alefragnani.project-manager # NOTE: Not much sense with flake dev environments
catppuccin.catppuccin-vsc
catppuccin.catppuccin-vsc-icons
christian-kohler.path-intellisense
# codezombiech.gitignore # NOTE: Superfluous
# coolbear.systemd-unit-file # NOTE: Unnecessary on NixOS
eamodio.gitlens
# formulahendry.auto-rename-tag
# formulahendry.auto-close-tag
# gitlab.gitlab-workflow
# irongeek.vscode-env
# jnoortheen.nix-ide
# kamadorueda.alejandra
# kamikillerto.vscode-colorize
# llvm-vs-code-extensions.vscode-clangd
# matklad.rust-analyzer
mechatroner.rainbow-csv
# mikestead.dotenv
# mkhl.direnv
# ms-azuretools.vscode-docker
# ms-kubernetes-tools.vscode-kubernetes-tools
ms-python.python
ms-toolsai.jupyter
ms-vscode.cmake-tools
ms-vscode.cpptools
# ms-vscode.hexeditor
# ms-vscode.makefile-tools
ms-python.black-formatter
ms-python.vscode-pylance
ms-vscode-remote.remote-ssh
# naumovs.color-highlight
njpwerner.autodocstring
# james-yu.latex-workshop
# redhat.java
# redhat.vscode-xml
# redhat.vscode-yaml
ritwickdey.liveserver
# rubymaniac.vscode-paste-and-indent
ryu1kn.partial-diff
# serayuzgur.crates
shd101wyy.markdown-preview-enhanced
# skyapps.fish-vscode
# tamasfe.even-better-toml
# timonwong.shellcheck
# tomoki1207.pdf # Incompatible with latex workshop
# valentjn.vscode-ltex
vscodevim.vim
vscode-icons-team.vscode-icons
# yzhang.markdown-all-in-one
];
# haskell = {};
# keybindings = {};
userSettings = {
# VSCode Internals
"editor.fontFamily" = "JetBrainsMono Nerd Font Mono";
"editor.fontSize" = 16;
"editor.renderWhitespace" = "selection";
"editor.cursorStyle" = "line"; # Use line for vim plugin
"editor.lineNumbers" = "relative";
"editor.linkedEditing" = true;
"editor.smoothScrolling" = true;
"editor.stickyScroll.enabled" = true;
"editor.tabCompletion" = "on";
"editor.cursorSmoothCaretAnimation" = "on";
"editor.cursorSurroundingLines" = 10;
"editor.minimap.renderCharacters" = false;
"editor.bracketPairColorization.enabled" = true;
"editor.guides.bracketPairs" = "active";
"editor.guides.bracketPairsHorizontal" = "active";
"editor.guides.highlightActiveIndentation" = false;
"files.autoSave" = "onFocusChange";
"files.trimFinalNewlines" = true;
"files.trimTrailingWhitespace" = true; # NOTE: If this is enabled with frequent autosave, the current lines whitespace will always be removed, which is obnoxious
"window.restoreWindows" = "none";
"window.titleBarStyle" = "custom"; # NOTE: Should help with crashing on wayland
# "window.titleBarStyle" = "native";
# "window.menuBarVisibility" = "toggle";
"workbench.enableExperiments" = false;
"workbench.list.smoothScrolling" = true;
# "workbench.colorTheme" = "Default Light Modern";
# "workbench.iconTheme" = "vscode-icons";
"workbench.colorTheme" = "Catppuccin Latte";
"workbench.iconTheme" = "catppuccin-latte";
"remote.SSH.configFile" = "~/.ssh/custom-config";
"security.workspace.trust.enabled" = false;
# Language Tool
"ltex.checkFrequency" = "manual";
# LaTeX
"latex-workshop.latex.tools" = [
{
"name" = "latexmk";
"command" = "latexmk";
"args" = [
"-synctex=1"
"-shell-escape"
"-interaction=nonstopmode"
"-file-line-error"
"-pdf"
"-outdir=%OUTDIR%"
"%DOC%"
];
"env" = {};
}
];
"latex-workshop.latexindent.args" = [
"-c"
"%DIR%/"
"%TMPFILE%"
"-m"
"-y=defaultIndent: '%INDENT%'"
];
# Nix
"[nix]"."editor.tabSize" = 2;
"nix.enableLanguageServer" = true;
"nix.serverPath" = "nil";
"nix.formatterPath" = "alejandra";
# C++
# "C_Cpp.intelliSenseEngine" = "disabled"; # IntelliSense conflics with Clangd
};
# TODO: Snippets
};
};
}
+1 -1
View File
@@ -57,7 +57,7 @@ in {
fetchart = { fetchart = {
auto = "yes"; auto = "yes";
sources = "*"; # sources are queried in this order sources = "filesystem coverart itunes amazon albumart"; # sources are queried in this order
}; };
# lyrics = { # lyrics = {
-1
View File
@@ -7,7 +7,6 @@
./fastfetch ./fastfetch
./fish ./fish
./git ./git
./jellyfin-tui
./kitty ./kitty
./lazygit ./lazygit
./neovim ./neovim
-9
View File
@@ -15,10 +15,6 @@
./firefox ./firefox
./fish ./fish
./git ./git
./helix
./hyprland
./hyprpanel
./jellyfin-tui
./kitty ./kitty
./lazygit ./lazygit
./mpd ./mpd
@@ -34,19 +30,14 @@
./ssh ./ssh
./terminal ./terminal
./tmux ./tmux
./vscode
./yazi ./yazi
./zathura ./zathura
./zed
# HM modules imported from the flake inputs # HM modules imported from the flake inputs
inputs.nix-flatpak.homeManagerModules.nix-flatpak inputs.nix-flatpak.homeManagerModules.nix-flatpak
inputs.nixvim.homeModules.nixvim inputs.nixvim.homeModules.nixvim
inputs.textfox.homeManagerModules.default inputs.textfox.homeManagerModules.default
inputs.walker.homeManagerModules.default inputs.walker.homeManagerModules.default
inputs.codex-desktop-linux.homeManagerModules.default
# inputs.stylix.homeModules.stylix
# inputs.direnv-instant.homeModules.direnv-instant
# inputs.niri.homeModules.niri # Imported by system module # inputs.niri.homeModules.niri # Imported by system module
# inputs.noctalia.homeModules.default # inputs.noctalia.homeModules.default
# inputs.caelestia.homeManagerModules.default # inputs.caelestia.homeManagerModules.default
-3
View File
@@ -32,9 +32,6 @@ in {
"Notes/Obsidian/Chriphost/latex_snippets.json".source = ../../../config/obsidian/latex_snippets.json; # TODO: Symlink "Notes/Obsidian/Chriphost/latex_snippets.json".source = ../../../config/obsidian/latex_snippets.json; # TODO: Symlink
"Notes/Obsidian/Chriphost/.obsidian/snippets/latex_preview.css".source = ../../../config/obsidian/css_snippets/latex_preview.css; "Notes/Obsidian/Chriphost/.obsidian/snippets/latex_preview.css".source = ../../../config/obsidian/css_snippets/latex_preview.css;
"Notes/Obsidian/Chriphost/.obsidian/snippets/center_image.css".source = ../../../config/obsidian/css_snippets/center_image.css; "Notes/Obsidian/Chriphost/.obsidian/snippets/center_image.css".source = ../../../config/obsidian/css_snippets/center_image.css;
"Notes/Obsidian/Chriphost/.obsidian/snippets/fullwidth_image.css".source = ../../../config/obsidian/css_snippets/fullwidth_image.css;
"Notes/Obsidian/Chriphost/.obsidian/snippets/justify_text.css".source = ../../../config/obsidian/css_snippets/justify_text.css;
"Notes/Obsidian/Chriphost/.obsidian/snippets/bordered_image.css".source = ../../../config/obsidian/css_snippets/bordered_image.css;
}; };
}; };
}; };
+19 -19
View File
@@ -63,7 +63,7 @@ in [
# Coding # Coding
{ {
name = "Code"; name = "Coding";
bookmarks = [ bookmarks = [
(mkBm "C++Ref" "https://en.cppreference.com/w/") (mkBm "C++Ref" "https://en.cppreference.com/w/")
(mkBm "Rust" "https://doc.rust-lang.org/stable/book/ch03-00-common-programming-concepts.html") (mkBm "Rust" "https://doc.rust-lang.org/stable/book/ch03-00-common-programming-concepts.html")
@@ -72,21 +72,21 @@ in [
(mkBm "Godbolt" "https://godbolt.org") (mkBm "Godbolt" "https://godbolt.org")
]; ];
} }
# { {
# name = "AI"; name = "\"AI\"";
# bookmarks = [ bookmarks = [
# (mkBm "Mistral Chat" "https://chat.mistral.ai/chat") (mkBm "Mistral Chat" "https://chat.mistral.ai/chat")
# (mkBm "DeepSeek Chat" "https://chat.deepseek.com/") (mkBm "DeepSeek Chat" "https://chat.deepseek.com/")
# (mkBm "Claude Chat" "https://claude.ai/new") (mkBm "Claude Chat" "https://claude.ai/new")
# (mkBm "ChatGPT" "https://chatgpt.com/") (mkBm "ChatGPT" "https://chatgpt.com/")
# (mkBm "DeepWiki" "https://deepwiki.com/") (mkBm "DeepWiki" "https://deepwiki.com/")
# "separator" "separator"
# (mkBm "Mistral API" "https://console.mistral.ai/usage") (mkBm "Mistral API" "https://console.mistral.ai/usage")
# (mkBm "DeepSeek API" "https://platform.deepseek.com/usage") (mkBm "DeepSeek API" "https://platform.deepseek.com/usage")
# (mkBm "Claude API" "https://console.anthropic.com/usage") (mkBm "Claude API" "https://console.anthropic.com/usage")
# (mkBm "OpenRouter API" "https://openrouter.ai/activity") (mkBm "OpenRouter API" "https://openrouter.ai/activity")
# ]; ];
# } }
(mkBm "GH" "https://github.com/churl") (mkBm "GH" "https://github.com/churl")
(mkBm "GL" "https://gitlab.com/churl") (mkBm "GL" "https://gitlab.com/churl")
(mkBm "SO" "https://stackoverflow.com/users/saves/17337508/all") (mkBm "SO" "https://stackoverflow.com/users/saves/17337508/all")
@@ -103,9 +103,9 @@ in [
(mkBm "Heise" "https://www.heise.de/") (mkBm "Heise" "https://www.heise.de/")
(mkBm "HN" "https://news.ycombinator.com/news") (mkBm "HN" "https://news.ycombinator.com/news")
(mkBm "Reddit" "https://www.reddit.com/user/FightingMushroom/saved/") (mkBm "Reddit" "https://www.reddit.com/user/FightingMushroom/saved/")
# (mkBm "F10" "https://f10.local.chriphost.de/race/Everyone") (mkBm "F10" "https://f10.local.chriphost.de/race/Everyone")
(mkBm "F12" "https://f12.local.chriphost.gay/racepicks") (mkBm "F11" "https://f11.local.chriphost.de/racepicks")
(mkBm "F12PB" "https://f12pb.local.chriphost.de/_/") (mkBm "F11PB" "https://f11pb.local.chriphost.de/_/#/collections?collection=pbc_1736455494&filter=&sort=-%40rowid")
(mkBm "ISBNDB" "https://isbndb.com/") (mkBm "ISBNDB" "https://isbndb.com/")
(mkBm "Music" "https://bandcamp.com/chriphost") (mkBm "Music" "https://bandcamp.com/chriphost")
(mkBm "Albums" "https://www.albumoftheyear.org/user/chriphost/list/307966/2025/") (mkBm "Albums" "https://www.albumoftheyear.org/user/chriphost/list/307966/2025/")
-3
View File
@@ -86,9 +86,6 @@ in {
programs.firefox = { programs.firefox = {
enable = true; enable = true;
# configPath = "${config.xdg.configHome}/mozilla/firefox";
configPath = "${config.home.homeDirectory}/.mozilla/firefox";
# firefox-unwrapped is the pure firefox browser, wrapFirefox adds configuration ontop # firefox-unwrapped is the pure firefox browser, wrapFirefox adds configuration ontop
package = pkgs.wrapFirefox pkgs.firefox-unwrapped { package = pkgs.wrapFirefox pkgs.firefox-unwrapped {
# About policies: https://github.com/mozilla/policy-templates#enterprisepoliciesenabled # About policies: https://github.com/mozilla/policy-templates#enterprisepoliciesenabled
+2 -47
View File
@@ -58,7 +58,7 @@ in {
in in
lib.mkMerge [ lib.mkMerge [
# Darwin exclusive config # Darwin exclusive config
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin { (lib.mkIf pkgs.stdenv.isDarwin {
shellInit = '' shellInit = ''
set fish_greeting set fish_greeting
yes | fish_config theme save "system-theme" yes | fish_config theme save "system-theme"
@@ -81,53 +81,12 @@ in {
}) })
# Linux exclusive config # Linux exclusive config
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux { (lib.mkIf pkgs.stdenv.isLinux {
generateCompletions = nixosConfig.programs.fish.generateCompletions; generateCompletions = nixosConfig.programs.fish.generateCompletions;
# TODO: There's a bug with the direnv mechanism:
# - When leaving an env, it unloads (good)
# - When entering another env, it loads (good)
# - When leaving this one, it doesn't unload (bad)
# - When entering leaving it again, it works...
# This only happens sometimes, is there a race condition?
shellInit = '' shellInit = ''
set fish_greeting set fish_greeting
yes | fish_config theme save "system-theme" yes | fish_config theme save "system-theme"
fish_vi_key_bindings
# Because we can't source that in a project flake's shellHook (is POSIX), source it here
function __project_shell_reload --on-variable INIT_PROJECT_SHELL
# Leaving the environment
if not set -q INIT_PROJECT_SHELL; or test -z "$INIT_PROJECT_SHELL"
if test -n "$__last_unload_project_shell"; and test -f "$__last_unload_project_shell"
source "$__last_unload_project_shell"
end
set -e __last_init_project_shell
set -e __last_unload_project_shell
return
end
# Entering or switching environments
if test "$INIT_PROJECT_SHELL" != "$__last_init_project_shell"
# Cleanup the previous environment
if test -n "$__last_unload_project_shell"; and test -f "$__last_unload_project_shell"
source "$__last_unload_project_shell"
end
# Store into variables to persist until next environment switch in the same shell
set -g __last_init_project_shell "$INIT_PROJECT_SHELL"
if set -q UNLOAD_PROJECT_SHELL; and test -f "$UNLOAD_PROJECT_SHELL"
set -g __last_unload_project_shell "$UNLOAD_PROJECT_SHELL"
else
set -e __last_unload_project_shell
end
# Source the new environment
if test -f "$INIT_PROJECT_SHELL"
source "$INIT_PROJECT_SHELL"
end
end
end
''; '';
functions = lib.mergeAttrsList [ functions = lib.mergeAttrsList [
@@ -221,10 +180,6 @@ in {
ns = "nix shell nixpkgs#"; ns = "nix shell nixpkgs#";
nr = "nix run"; nr = "nix run";
nps = "nps -e"; nps = "nps -e";
# Systemctl
st = "sudo systemctl-tui";
sf = "systemctl --failed";
} }
# Abbrs only available if package is installed # Abbrs only available if package is installed
-122
View File
@@ -1,122 +0,0 @@
{
inputs,
config,
lib,
mylib,
pkgs,
nixosConfig,
username,
...
}: let
inherit (config.homemodules) hyprland color;
# Autostart programs
always-exec = import ./autostart.nix {inherit lib pkgs config hyprland;};
# Keybindings
always-bind = import ./mappings.nix {inherit lib config hyprland;};
# Mousebindings
always-bindm = {
"$mainMod, mouse:272" = ["movewindow"];
"$mainMod, mouse:273" = ["resizewindow"];
};
in {
options.homemodules.hyprland = import ./options.nix {inherit lib mylib;};
config = lib.mkIf hyprland.enable {
assertions = [
{
assertion = nixosConfig.programs.hyprland.enable;
message = "Can't enable Hyprland module with Hyprland disabled!";
}
{
assertion = builtins.hasAttr "hyprlock" nixosConfig.security.pam.services;
message = "Can't enable Hyprland module without Hyprlock PAM service!";
}
];
gtk = {
enable = true;
iconTheme.package = lib.mkDefault color.iconPackage;
iconTheme.name = color.iconTheme;
};
homemodules = {
hyprpanel.enable = hyprland.hyprpanel.enable;
};
home = {
pointerCursor = {
enable = true;
gtk.enable = lib.mkDefault true;
x11.enable = lib.mkDefault true;
package = lib.mkDefault color.cursorPackage;
name = color.cursor;
size = color.cursorSize;
};
packages = with pkgs; [
hyprpicker # Color picker
# hyprpolkitagent # Ugly polkit authentication GUI
hyprland-qt-support
hyprsunset # Blue light filter
wl-clipboard
# clipman # Clipboard manager (wl-paste)
libnotify
inotify-tools # Includes inotifywait
# ncpamixer # Audio control
slurp # Region selector for screensharing
grim # Grab images from compositor
# Deps for Qt5 and Qt6 apps (e.g., Nextcloud)
qt5.qtwayland
qt6.qtwayland
# xwayland
# wayland-protocols
];
};
programs = {
hyprlock = import ./hyprlock.nix {inherit config hyprland color;};
};
services = {
hypridle = import ./hypridle.nix {inherit config hyprland color;};
};
# Make sure the units only start when using Hyprland
systemd.user.services.hypridle.Install.WantedBy = lib.mkForce ["hyprland-session.target"];
systemd.user.services.hypridle.Unit.After = lib.mkForce ["hyprland-session.target"];
systemd.user.services.hypridle.Unit.PartOf = lib.mkForce ["hyprland-session.target"];
systemd.user.services.elephant.Install.WantedBy = lib.mkForce ["hyprland-session.target" "graphical-session.target"];
systemd.user.services.elephant.Unit.After = lib.mkForce ["hyprland-session.target" "graphical-session.target"];
systemd.user.services.elephant.Unit.PartOf = lib.mkForce ["hyprland-session.target" "graphical-session.target"];
wayland.windowManager.hyprland = {
enable = true;
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
configType = "hyprlang";
systemd.enable = true; # Enable hyprland-session.target
systemd.variables = ["--all"]; # Import PATH into systemd
xwayland.enable = true;
settings = import ./settings.nix {
inherit
lib
config
hyprland
color
always-exec
always-bind
always-bindm
;
};
};
};
}
-91
View File
@@ -1,91 +0,0 @@
{
config,
nixosConfig,
darwinConfig,
lib,
mylib,
pkgs,
...
}: let
inherit (config.homemodules) jellyfin-tui color;
systemConfig =
if pkgs.stdenv.hostPlatform.isLinux
then nixosConfig
else darwinConfig;
in {
options.homemodules.jellyfin-tui = import ./options.nix {inherit lib mylib;};
config = lib.mkIf jellyfin-tui.enable {
home = {
packages = [
pkgs.jellyfin-tui
];
file = let
jellyfinUrl =
if pkgs.stdenv.hostPlatform.isLinux
then "https://jellyfin.local.chriphost.de"
else "https://jellyfin.vps.chriphost.de";
configFile = ''
servers:
- name: Mafia Dortmund
url: ${jellyfinUrl}
username: root
password_file: ${systemConfig.sops.secrets.jellyfin-password.path}
default: true
# All following settings are OPTIONAL. What you see here are the defaults.
# Show album cover image
art: true
# Save and restore the state of the player (queue, volume, etc.)
persist: true
# Grab the primary color from the cover image (false => uses the current theme's `accent` instead)
auto_color: false
# Time in milliseconds to fade between colors when the track changes
auto_color_fade_ms: 400
# Always show the lyrics pane, even if no lyrics are available
lyrics: 'always' # options: 'always', 'never', 'auto'
rounded_corners: true
transcoding:
bitrate: 320
# container: mp3
# Discord Rich Presence. Shows your listening status on your Discord profile if Discord is running.
# NOTE: I think we're allowed to leak this to the public (hopefully)?
discord: 1466134677537685546 # https://discord.com/developers/applications
# Displays album art on your Discord profile if enabled
# !!CAUTION!! - Enabling this will expose the URL of your Jellyfin instance to all Discord users!
discord_art: false
# Customize the title of the terminal window
window_title: true # default -> {title} {artist} ({year})
# window_title: false # disable
# Custom title: choose from current track's {title} {artist} {album} {year}
# window_title: "\"{title}\" by {artist} ({year}) jellyfin-tui"
# Options specified here will be passed to mpv - https://mpv.io/manual/master/#options
mpv:
log-file: /tmp/mpv.log
no-config: true
# af: lavfi=[loudnorm=I=-23:TP=-1]
gapless-audio: weak
prefetch-playlist: yes
replaygain: no
'';
in
lib.mkMerge [
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
".config/jellyfin-tui/config.yaml".text = configFile;
})
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
"Library/Application Support/jellyfin-tui/config.yaml".text = configFile;
})
];
};
};
}
@@ -1,7 +0,0 @@
{
lib,
mylib,
...
}: {
enable = lib.mkEnableOption "Enable jellyfin-tui";
}
+3 -10
View File
@@ -26,19 +26,13 @@ in {
"kitty_mod+j" = "next_window"; "kitty_mod+j" = "next_window";
"kitty_mod+k" = "previous_window"; "kitty_mod+k" = "previous_window";
"kitty_mod+l" = "next_layout"; "kitty_mod+l" = "next_layout";
"kitty_mod+p" = "command_palette";
"kitty_mod+c" = "copy_to_clipboard";
"ctrl+c" = "copy_or_interrupt";
"kitty_mod+v" = "paste_from_clipboard";
"ctrl+v" = "paste_from_clipboard";
}; };
settings = lib.mkMerge [ settings = lib.mkMerge [
# Linux config # Linux config
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux { (lib.mkIf pkgs.stdenv.isLinux {
allow_remote_control = true; # For nnn file preview or nvim scrollback allow_remote_control = "yes"; # For nnn file preview or nvim scrollback
listen_on = lib.mkDefault "unix:@mykitty"; # This conflicts with direnv-instant listen_on = "unix:@mykitty";
}) })
# Common config # Common config
@@ -48,7 +42,6 @@ in {
window_padding_width = 10; # Looks stupid with editors if bg doesn't match window_padding_width = 10; # Looks stupid with editors if bg doesn't match
# hide_window_decorations = "yes"; # hide_window_decorations = "yes";
enabled_layouts = "grid,vertical,horizontal"; enabled_layouts = "grid,vertical,horizontal";
cursor_trail = 3;
tab_bar_min_tabs = 2; # Don't show a single tab tab_bar_min_tabs = 2; # Don't show a single tab
tab_bar_edge = "bottom"; tab_bar_edge = "bottom";
+41 -215
View File
@@ -30,62 +30,54 @@ in {
(lib.optionals (!headless) [ (lib.optionals (!headless) [
# Language servers # Language servers
autotools-language-server
basedpyright
clang-tools clang-tools
clojure-lsp clojure-lsp
cmake-language-server cmake-language-server
haskell-language-server haskell-language-server
jdt-language-server jdt-language-server
just-lsp
ltex-ls # TODO: Only enable on-demand ltex-ls # TODO: Only enable on-demand
lua-language-server lua-language-server
nil # nil
# perl5Packages.PLS basedpyright
perlnavigator
pyrefly pyrefly
# rPackages.languageserver ty
rust-analyzer rust-analyzer
svelte-language-server svelte-language-server
tailwindcss-language-server tailwindcss-language-server
tex-fmt tex-fmt
texlab texlab
tinymist tinymist
ty
typescript typescript
vscode-langservers-extracted # includes nodejs vscode-langservers-extracted # includes nodejs
autotools-language-server
just-lsp
# Linters # Linters
checkstyle # java checkstyle # java
clippy # rust clippy # rust
clj-kondo # clojure clj-kondo # clojure
eslint_d # javascript eslint_d # javascript
# python313Packages.ruff python313Packages.ruff
# python313Packages.flake8 python313Packages.flake8
# python313Packages.pylint python313Packages.pylint
lua54Packages.luacheck lua54Packages.luacheck
vale # text vale # text
# statix # nix (doesn't recognize pipe operator) # statix # nix (doesn't recognize pipe operator)
# Formatters # Formatters
air-formatter
cljfmt cljfmt
python313Packages.black
google-java-format google-java-format
html-tidy html-tidy
jq # json jq # json
just-formatter
mbake
# nodePackages_latest.prettier # Use local install as plugins change per project
# perl5Packages.PerlTidy
# prettierd # Use prettier instead because of plugins # prettierd # Use prettier instead because of plugins
# python313Packages.black # nodePackages_latest.prettier # Use local install as plugins change per project
rustfmt rustfmt
stylua stylua
tombi
typstyle typstyle
mbake
nodejs_latest just-formatter
uv tombi
]) ])
[ [
@@ -95,54 +87,6 @@ in {
lua54Packages.jsregexp # For tree-sitter lua54Packages.jsregexp # For tree-sitter
# nodejs_latest # nodejs_latest
# TODO: Create a perl module where I can add packages to, so I don't end up with multiple perl installations
# TODO: The same is required for python and R (below)
(perl.withPackages (p:
with p; [
PLS
PerlCritic
PerlTidy
NetOpenSSH
DateTime
DBI
DBDMariaDB
CursesUI
TextCSV_XS
]))
(python314.withPackages (p:
with p; [
# Linters
ruff
flake8
pylint
# Formatters
black
numpy
matplotlib
requests
pygments
pyyaml
]))
(rWrapper.override {
packages = with rPackages; [
languageserver
ggplot2
ggalluvial
plotly
shiny
readr
tibble
svglite
dplyr
tidyr
scales
];
})
nixd nixd
alejandra # nix alejandra # nix
] ]
@@ -150,8 +94,6 @@ in {
}; };
programs.nixvim = { programs.nixvim = {
# nixpkgs.pkgs = pkgs;
defaultEditor = true; defaultEditor = true;
enable = true; enable = true;
enableMan = false; # Nixvim man pages enableMan = false; # Nixvim man pages
@@ -159,15 +101,6 @@ in {
viAlias = neovim.alias; viAlias = neovim.alias;
vimAlias = neovim.alias; vimAlias = neovim.alias;
# extraPackages = let
# yazi-termfix = pkgs.writeShellScriptBin "yazi" ''
# export TERM=xterm-kitty
# exec ${pkgs.yazi}/bin/yazi "@$"
# '';
# in [
# yazi-termfix
# ];
# Configured using plugin # Configured using plugin
# colorschemes.catppuccin = { # colorschemes.catppuccin = {
# enable = true; # enable = true;
@@ -183,7 +116,7 @@ in {
performance.byteCompileLua = { performance.byteCompileLua = {
enable = true; enable = true;
configs = true; configs = true;
initLua = true; # When debugging init.lua turn this off initLua = false; # When debugging init.lua turn this off
nvimRuntime = true; nvimRuntime = true;
plugins = true; plugins = true;
}; };
@@ -226,16 +159,6 @@ in {
# fg = "#${color.hex.dark.text}"; # fg = "#${color.hex.dark.text}";
# bold = false; # bold = false;
# }; # };
# NeoTreeNormal = {bg = "#${color.hex.base}";};
# NeoTreeNormalNC = {bg = "#${color.hex.base}";};
# NeoTreeWinSeparator = {
# fg = "#${color.hex.crust}";
# bg = "#${color.hex.base}";
# };
# NeoTreeVertSplit = {
# fg = "#${color.hex.crust}";
# bg = "#${color.hex.base}";
# };
}; };
# extraLuaPackages = with pkgs.lua51Packages; []; # extraLuaPackages = with pkgs.lua51Packages; [];
@@ -253,7 +176,7 @@ in {
# local renderer = require("neo-tree.ui.renderer") # local renderer = require("neo-tree.ui.renderer")
# local state = manager.get_state("filesystem") # local state = manager.get_state("filesystem")
# local window_exists = renderer.window_exists(state) # local window_exists = renderer.window_exists(state)
#
# if window_exists then # if window_exists then
# require("neo-tree.sources.filesystem.commands").refresh(state) # require("neo-tree.sources.filesystem.commands").refresh(state)
# end # end
@@ -329,15 +252,6 @@ in {
require("${name}").setup(opts) require("${name}").setup(opts)
end end
''; '';
# Like mkDefaultConfig but takes the Lua module name explicitly.
# Use when the Lua module name (e.g. "noice") differs from what
# lazy.nvim expects as the plugin name (e.g. "noice.nvim").
mkDefaultConfigFor = moduleName: ''
function(_, opts)
require("${moduleName}").setup(opts)
end
'';
in { in {
enable = true; enable = true;
@@ -387,7 +301,6 @@ in {
light = "latte"; light = "latte";
dark = "mocha"; dark = "mocha";
}; };
term_colors = true;
# https://github.com/catppuccin/nvim/tree/main?tab=readme-ov-file#integrations # https://github.com/catppuccin/nvim/tree/main?tab=readme-ov-file#integrations
default_integrations = true; default_integrations = true;
integrations = { integrations = {
@@ -424,7 +337,6 @@ in {
# custom_bg = "crust"; # custom_bg = "crust";
}; };
notify = true; notify = true;
terminal = true;
treesitter = true; treesitter = true;
ufo = true; ufo = true;
rainbow_delimiters = true; rainbow_delimiters = true;
@@ -436,15 +348,6 @@ in {
}; };
which_key = true; which_key = true;
}; };
highlight_overrides.mocha.__raw = ''
function(colors)
return {
NeoTreeWinSeparator = { fg = colors.crust, bg = colors.base, },
NeoTreeVertSplit = { fg = colors.crust, bg = colors.base, },
}
end
'';
}; };
}; };
@@ -466,7 +369,6 @@ in {
# pkg = inputs.blink-cmp.packages.${system}.default; # pkg = inputs.blink-cmp.packages.${system}.default;
pkg = pkgs.vimPlugins.blink-cmp; pkg = pkgs.vimPlugins.blink-cmp;
lazy = true; lazy = true;
dependencies = [luasnip];
event = ["InsertEnter"]; event = ["InsertEnter"];
config = mkDefaultConfig name; config = mkDefaultConfig name;
@@ -514,17 +416,13 @@ in {
}; };
}; };
snippets = {
preset = "luasnip";
};
fuzzy = { fuzzy = {
frecency.enabled = true; frecency.enabled = true;
use_proximity = true; use_proximity = true;
}; };
sources = { sources = {
default = ["lsp" "path" "snippets" "omni"]; # No "buffer" default = ["lsp" "path" "snippets"]; # No "buffer"
}; };
cmdline = { cmdline = {
@@ -625,10 +523,8 @@ in {
make = ["bake"]; make = ["bake"];
markdown = ["prettierd" "prettier"]; markdown = ["prettierd" "prettier"];
nix = ["alejandra"]; nix = ["alejandra"];
perl = ["perltidy"];
python = ["black"]; python = ["black"];
qml = ["qmlformat"]; qml = ["qmlformat"];
r = ["air"];
rust = ["rustfmt"]; rust = ["rustfmt"];
svelte = ["prettierd" "prettier"]; svelte = ["prettierd" "prettier"];
toml = ["tombi"]; toml = ["tombi"];
@@ -964,8 +860,9 @@ in {
dependencies = [_lazydev]; dependencies = [_lazydev];
config = let config = let
servers = mylib.generators.toLuaObject [ servers = mylib.generators.toLuaObject [
{name = "autotools-language-server";}
{name = "basedpyright";} {name = "basedpyright";}
# {name = "pyrefly";} # TODO: Config
# {name = "ty";} # TODO: Config
{ {
name = "clangd"; name = "clangd";
extraOptions = { extraOptions = {
@@ -1008,15 +905,16 @@ in {
{name = "html";} # vscode-langservers-extracted {name = "html";} # vscode-langservers-extracted
{name = "just";} {name = "just";}
{name = "lua_ls";} {name = "lua_ls";}
# { {
# name = "ltex"; name = "ltex";
# extraOptions.settings = { extraOptions.settings = {
# ltex = { ltex = {
# checkFrequency = "save"; checkFrequency = "save";
# enabled = ["markdown" "org" "tex" "latex" "plaintext"]; enabled = ["markdown" "org" "tex" "latex" "plaintext"];
# }; };
# }; };
# } }
{name = "autotools-language-server";}
# {name = "nil_ls";} # {name = "nil_ls";}
{ {
name = "nixd"; name = "nixd";
@@ -1058,8 +956,6 @@ in {
}; };
}; };
} }
{name = "perlpls";}
{name = "perlnavigator";}
{ {
name = "qmlls"; name = "qmlls";
extraOptions.cmd = [ extraOptions.cmd = [
@@ -1067,8 +963,6 @@ in {
"-E" # Use QML_IMPORT_PATH env variable "-E" # Use QML_IMPORT_PATH env variable
]; ];
} }
# {name = "pyrefly";} # TODO: Config
{name = "r_language_server";}
{name = "svelte";} {name = "svelte";}
{name = "tailwindcss";} {name = "tailwindcss";}
{name = "texlab";} {name = "texlab";}
@@ -1080,7 +974,6 @@ in {
semanticTokens = "disable"; semanticTokens = "disable";
}; };
} }
# {name = "ty";} # TODO: Config
# {name = "jdtls";} # Don't set up when using nvim-jdtls # {name = "jdtls";} # Don't set up when using nvim-jdtls
# {name = "rust_analyzer";} # Don't set up when using rustaceanvim # {name = "rust_analyzer";} # Don't set up when using rustaceanvim
@@ -1158,7 +1051,6 @@ in {
pkg = pkgs.vimPlugins.lualine-nvim; pkg = pkgs.vimPlugins.lualine-nvim;
lazy = true; lazy = true;
event = ["BufReadPost" "BufNewFile"]; event = ["BufReadPost" "BufNewFile"];
# dependencies = [opencode];
config = '' config = ''
function(_, opts) function(_, opts)
local lualine = require("lualine") local lualine = require("lualine")
@@ -1258,7 +1150,6 @@ in {
lualine_c.__raw = ''{}''; # Use __raw: Nixvim does nothing with "[]", so the default config would be used lualine_c.__raw = ''{}''; # Use __raw: Nixvim does nothing with "[]", so the default config would be used
lualine_x.__raw = ''{}''; lualine_x.__raw = ''{}'';
# lualine_x.__raw = ''{ { require("opencode").statusline, }, }'';
lualine_y = ["filetype" "encoding" "fileformat"]; lualine_y = ["filetype" "encoding" "fileformat"];
lualine_z.__raw = ''{ { "location", separator = {}, } }''; lualine_z.__raw = ''{ { "location", separator = {}, } }'';
}; };
@@ -1424,19 +1315,19 @@ in {
}; };
_nui = { _nui = {
name = "nui.nvim"; name = "nui"; # For noice
pkg = pkgs.vimPlugins.nui-nvim; pkg = pkgs.vimPlugins.nui-nvim;
lazy = true; lazy = true;
}; };
noice = rec { noice = rec {
name = "noice.nvim"; name = "noice";
pkg = pkgs.vimPlugins.noice-nvim; pkg = pkgs.vimPlugins.noice-nvim;
lazy = false; lazy = false;
dependencies = [ dependencies = [
_nui _nui
]; ];
config = mkDefaultConfigFor "noice"; config = mkDefaultConfig name;
opts = { opts = {
presets = { presets = {
bottom_search = false; bottom_search = false;
@@ -1498,32 +1389,6 @@ in {
}; };
}; };
opencode = {
name = "opencode";
pkg = pkgs.vimPlugins.opencode-nvim;
lazy = false;
config = ''
function()
vim.g.opencode_opts = {
server = {
url = "http://localhost:12345",
start = false,
},
events = {
permissions = {
edits = {
-- Disable neovim diff popup tab
enabled = false,
},
},
},
}
vim.o.autoread = true -- Required for `vim.g.opencode_opts.events.reload`
end
'';
};
# obsidian = rec { # obsidian = rec {
# name = "obsidian"; # name = "obsidian";
# pkg = pkgs.vimPlugins.obsidian-nvim; # pkg = pkgs.vimPlugins.obsidian-nvim;
@@ -1748,7 +1613,7 @@ in {
gitbrowse.enabled = false; gitbrowse.enabled = false;
image.enabled = false; image.enabled = false;
indent.enabled = false; indent.enabled = false;
input.enabled = true; input.enabled = false;
keymap.enabled = false; keymap.enabled = false;
layout.enabled = false; layout.enabled = false;
lazygit.enabled = true; lazygit.enabled = true;
@@ -1784,20 +1649,6 @@ in {
truncate = 80; truncate = 80;
}; };
}; };
actions = {
opencode_send.__raw = ''
function(picker)
local items = vim.tbl_map(function(item)
return item.file
and require("opencode").format({ path = item.file, from = item.pos, to = item.end_pos })
or item.text
end, picker:selected({ fallback = true }))
require("opencode").prompt(table.concat(items, ", ") .. " ")
end
'';
};
}; };
profiler.enabled = false; profiler.enabled = false;
@@ -1828,7 +1679,6 @@ in {
function(line) function(line)
local base = { fg = "#${color.hex.base}", bg = "#${color.hex.base}" } local base = { fg = "#${color.hex.base}", bg = "#${color.hex.base}" }
local crust = { fg = "#${color.hex.crust}", bg = "#${color.hex.crust}" } local crust = { fg = "#${color.hex.crust}", bg = "#${color.hex.crust}" }
local mantle = { fg = "#${color.hex.mantle}", bg = "#${color.hex.mantle}" }
local text = { fg = "#${color.hex.text}", bg = "#${color.hex.crust}" } local text = { fg = "#${color.hex.text}", bg = "#${color.hex.crust}" }
local accent = { fg = "#${color.hex.accent}", bg = "#${color.hex.accent}" } local accent = { fg = "#${color.hex.accent}", bg = "#${color.hex.accent}" }
@@ -1854,14 +1704,14 @@ in {
line.sep(sep_start, accent, crust), line.sep(sep_start, accent, crust),
tab.number(), tab.number(),
tab.name(), tab.name(),
line.sep(sep_end, crust, mantle), line.sep(sep_end, crust, base),
hl = hl, hl = hl,
margin = " ", margin = " ",
} }
end), end),
-- Background -- Background
hl = mantle, hl = bg,
} }
end end
''; '';
@@ -1869,7 +1719,7 @@ in {
}; };
_plenary = { _plenary = {
name = "plenary.nvim"; name = "plenary";
pkg = pkgs.vimPlugins.plenary-nvim; pkg = pkgs.vimPlugins.plenary-nvim;
lazy = true; lazy = true;
}; };
@@ -1970,12 +1820,11 @@ in {
shell = "fish"; shell = "fish";
direction = "horizontal"; # 'vertical' | 'horizontal' | 'window' | 'float' direction = "horizontal"; # 'vertical' | 'horizontal' | 'window' | 'float'
auto_scroll = true; auto_scroll = true;
# clear_env = false;
float_opts = { float_opts = {
border = "curved"; # 'single' | 'double' | 'shadow' | 'curved' border = "curved"; # 'single' | 'double' | 'shadow' | 'curved'
width.__raw = "function() return math.floor(vim.o.columns * 0.95) end"; width = 80;
height.__raw = "function() return math.floor(vim.o.lines * 0.85) end"; height = 80;
winblend = 0; winblend = 0;
}; };
}; };
@@ -2148,40 +1997,18 @@ in {
pkg = pkgs.vimPlugins.vimtex; pkg = pkgs.vimPlugins.vimtex;
init = '' init = ''
function() function()
vim.g.vimtex_mappings_enabled = true vim.g.vimtex_mappings_enabled = false
vim.g.vimtex_view_method = "zathura" vim.g.vimtex_view_method = "zathura"
vim.g.vimtex_syntax_conceal_disable = false
vim.g.vimtex_syntax_conceal = {
accents = 1,
ligatures = 1,
cites = 1,
fancy = 1,
texTabularChar = 1,
spacing = 1,
greek = 1,
math_bounds = 1,
math_delimiters = 1,
math_fracs = 1,
math_super_sub = 1,
math_symbols = 1,
sections = 1,
styles = 1,
}
vim.g.vimtex_compiler_method = "latexmk"
vim.g.vimtex_compiler_clean_paths = {"_minted*", "svg-inkscape*"}
vim.g.vimtex_compiler_latexmk = { vim.g.vimtex_compiler_latexmk = {
options = { options = {
"-verbose", "-shell-escape",
"-file-line-error", "-file-line-error",
"-synctex=1", "-synctex=1",
"-interaction=nonstopmode", "-interaction=nonstopmode",
"-shell-escape",
}, },
aux_dir = ".aux", aux_dir = ".aux",
out_dir = ".out", out_dir = ".out",
} }
end end
''; '';
}; };
@@ -2311,12 +2138,12 @@ in {
}; };
yazi = rec { yazi = rec {
name = "yazi.nvim"; name = "yazi";
pkg = pkgs.vimPlugins.yazi-nvim; pkg = pkgs.vimPlugins.yazi-nvim;
lazy = true; lazy = true;
event = ["VeryLazy"]; event = ["VeryLazy"];
dependencies = [_plenary]; dependencies = [_plenary];
config = mkDefaultConfigFor "yazi"; config = mkDefaultConfig name;
opts = { opts = {
open_for_directories = true; open_for_directories = true;
highlight_hovered_buffers_in_same_directory = false; highlight_hovered_buffers_in_same_directory = false;
@@ -2378,7 +2205,6 @@ in {
noice # Modern UI overhaul, e.g. floating cmdline noice # Modern UI overhaul, e.g. floating cmdline
# obsidian # Integration with Obsidian.md # obsidian # Integration with Obsidian.md
opencode # TODO: Doesn't work, can't find "opencode --port" process
# overseer # Run tasks from within neovim (e.g. cargo) # TODO: # overseer # Run tasks from within neovim (e.g. cargo) # TODO:
persisted # Session management persisted # Session management
+2 -20
View File
@@ -60,27 +60,9 @@ end, {
-- Toggle Rmpc -- Toggle Rmpc
local Terminal = require("toggleterm.terminal").Terminal local Terminal = require("toggleterm.terminal").Terminal
local rmpc = Terminal:new({ local rmpc =
cmd = "rmpc", Terminal:new({ cmd = "rmpc", hidden = true, close_on_exit = true, auto_scroll = false, direction = "float" })
hidden = true,
close_on_exit = true,
auto_scroll = false,
direction = "float",
})
vim.g.toggle_rmpc = function() vim.g.toggle_rmpc = function()
rmpc:toggle() rmpc:toggle()
end end
-- Toggle FailNix UI
local failnix = Terminal:new({
cmd = "cd /home/christoph/Notes/TU/MastersThesis/FailNix && nix develop --command bash -c 'perl ./scripts/menu.pl'",
hidden = true,
close_on_exit = true,
auto_scroll = false,
direction = "float",
})
vim.g.toggle_failnix = function()
failnix:toggle()
end
@@ -20,7 +20,7 @@ if g.neovide then
-- Neovide Fonts -- Neovide Fonts
-- o.guifont = "JetBrainsMono Nerd Font Mono:h12:Medium" -- o.guifont = "JetBrainsMono Nerd Font Mono:h12:Medium"
o.guifont = "MonoLisa Alt Script:h12:Medium" o.guifont = "MonoLisa Alt:h12:Medium"
else else
-- require("notify").notify("Not running in NeoVide") -- require("notify").notify("Not running in NeoVide")
end end
-65
View File
@@ -340,12 +340,6 @@ _: let
action = "<cmd>lua vim.g.toggle_rmpc()<cr>"; # Defined in extraConfigLua.lua action = "<cmd>lua vim.g.toggle_rmpc()<cr>"; # Defined in extraConfigLua.lua
options.desc = "Show Rmpc"; options.desc = "Show Rmpc";
} }
{
mode = "n";
key = "<leader>.";
action = "<cmd>lua vim.g.toggle_failnix()<cr>"; # Defined in extraConfigLua.lua
options.desc = "Show FailNix";
}
{ {
mode = "n"; mode = "n";
key = "<leader>i"; key = "<leader>i";
@@ -414,58 +408,6 @@ _: let
} }
]; ];
leader-opencode = [
{
mode = ["n" "v"];
key = "<leader>o";
action = "+opencode";
}
{
mode = ["n" "v"];
key = "<leader>oo";
action.__raw = ''function() require("opencode").ask("@this: ") end'';
options.desc = "Ask about @this";
}
{
mode = ["n" "v"];
key = "<leader>od";
action.__raw = ''function() require("opencode").prompt("Explain @diagnostics") end'';
options.desc = "Explain @diagnostics";
}
{
mode = ["n" "v"];
key = "<leader>oe";
action.__raw = ''function() require("opencode").prompt("Explain @this and its context") end'';
options.desc = "Explain @this";
}
{
mode = ["n" "v"];
key = "<leader>or";
action.__raw = ''function() require("opencode").prompt("Review @this for correctness and readability") end'';
options.desc = "Review @this";
}
{
mode = ["n" "v"];
key = "<leader>os";
action.__raw = ''function() require("opencode").select() end'';
options.desc = "Select Action";
}
{
mode = "n";
key = "<leader>oa";
action.__raw = ''function() return require("opencode").operator("@this ") .. "_" end'';
options.desc = "Append Line to Prompt";
options.expr = true;
}
{
mode = "v";
key = "<leader>oa";
action.__raw = ''function() return require("opencode").operator("@this ") end'';
options.desc = "Append Range to Prompt";
options.expr = true;
}
];
leader-file = [ leader-file = [
{ {
mode = "n"; mode = "n";
@@ -937,12 +879,6 @@ _: let
action = "<cmd>Trouble diagnostics toggle focus=false win.position=bottom<cr>"; action = "<cmd>Trouble diagnostics toggle focus=false win.position=bottom<cr>";
options.desc = "Trouble Diagnostics"; options.desc = "Trouble Diagnostics";
} }
{
mode = "n";
key = "<leader>tT";
action = "<cmd>ToggleTerm direction=float<cr>";
options.desc = "Floating Terminal";
}
{ {
mode = "n"; mode = "n";
key = "<leader>tD"; key = "<leader>tD";
@@ -1062,7 +998,6 @@ in
no-leader no-leader
leader leader
leader-opencode
leader-file leader-file
leader-help leader-help
leader-quit leader-quit
+1 -38
View File
@@ -1,18 +1,3 @@
local ls = require("luasnip")
local s = ls.snippet
local sn = ls.snippet_node
local isn = ls.indent_snippet_node
local t = ls.text_node
local i = ls.insert_node
local f = ls.function_node
local c = ls.choice_node
local d = ls.dynamic_node
local r = ls.restore_node
local extras = require("luasnip.extras")
local rep = extras.rep
local fmt = require("luasnip.extras.fmt").fmt
local fmta = require("luasnip.extras.fmt").fmta
return { return {
-- The first list contains manually expanded snippts -- The first list contains manually expanded snippts
-- --
@@ -33,7 +18,7 @@ return {
-- \begin{environment} -- \begin{environment}
s( s(
{ trig = "beg", name = "begin/end", descr = "begin/end environment (generic)" }, "beg",
fmta( fmta(
[[ [[
\begin{<>} \begin{<>}
@@ -43,28 +28,6 @@ return {
{ i(1), i(0), rep(1) } { i(1), i(0), rep(1) }
) )
), ),
s(
{ trig = "item", name = "itemize", dscr = "bullet points (itemize)" },
fmta(
[[
\begin{itemize}
\item <>
\end{itemize}
]],
{ i(0) }
)
),
s(
{ trig = "enum", name = "enumerate", dscr = "bullet points (enumerate)" },
fmta(
[[
\begin{enumerate}
\item <>
\end{enumerate}
]],
{ i(0) }
)
),
}, { }, {
-- The second list contains autosnippets -- The second list contains autosnippets
} }
File diff suppressed because it is too large Load Diff
+18 -58
View File
@@ -13,7 +13,6 @@ in {
options.homemodules.packages = import ./options.nix {inherit lib mylib;}; options.homemodules.packages = import ./options.nix {inherit lib mylib;};
config = lib.mkIf packages.enable { config = lib.mkIf packages.enable {
# TODO: Add extra packages option and use that from host-specific configs
home.packages = with pkgs; home.packages = with pkgs;
lib.mkMerge [ lib.mkMerge [
# Common packages # Common packages
@@ -43,9 +42,7 @@ in {
# Nix # Nix
nix-search-tv # Search nixpkgs, nur, nixos options and homemanager options nix-search-tv # Search nixpkgs, nur, nixos options and homemanager options
nix-tree # Browse the nix store sorted by size (gdu for closures) nix-tree # Browse the nix store sorted by size (gdu for closures)
inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default # Search nixpkgs
# TODO: Still broken on 2026-09-09
# inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default # Search nixpkgs
# Video/Image/Audio utils # Video/Image/Audio utils
ffmpeg-full # I love ffmpeg (including ffplay) ffmpeg-full # I love ffmpeg (including ffplay)
@@ -77,17 +74,15 @@ in {
# Common !headless packages # Common !headless packages
(lib.optionals (!headless) [ (lib.optionals (!headless) [
ripdrag # drag & drop from terminal ripdrag # drag & drop from terminal
# jellyfin-tui # Use module jellyfin-tui
inputs.masssprings.packages.${stdenv.hostPlatform.system}.default
]) ])
# Linux exclusive packages # Linux exclusive packages
(lib.optionals (pkgs.stdenv.hostPlatform.isLinux) [ (lib.optionals (pkgs.stdenv.isLinux) [
pastel # Color tools pastel # Color tools
nvd # Nix rebuild diff nvd # Nix rebuild diff
nurl # Generate nix fetcher sections based on URLs nurl # Generate nix fetcher sections based on URLs
# python313 # Nicer scripting than bash python313 # Nicer scripting than bash
lazyjournal # Journalctl viewer lazyjournal # Journalctl viewer
systemctl-tui systemctl-tui
restic # Backups restic # Backups
@@ -97,11 +92,6 @@ in {
jujutsu # git-like vcs jujutsu # git-like vcs
lurk # strace analysis lurk # strace analysis
radare2 radare2
disktui
lldb
inotify-tools
xdotool
gnome-keyring
# Hardware/Software info # Hardware/Software info
pciutils # lspci pciutils # lspci
@@ -141,37 +131,35 @@ in {
]) ])
# Linux exclusive packages (!headless) # Linux exclusive packages (!headless)
(lib.optionals (pkgs.stdenv.hostPlatform.isLinux && (!headless)) [ (lib.optionals (pkgs.stdenv.isLinux && (!headless)) [
veracrypt
wl-clipboard wl-clipboard
asciicam
# Proton # Proton
proton-vpn protonvpn-gui
protonmail-bridge-gui protonmail-bridge-gui
# GUI stuff # GUI stuff
nautilus # Just in case
signal-desktop signal-desktop
anki anki
font-manager # Previews fonts, but doesn't set them
nextcloud-client nextcloud-client
keepassxc keepassxc
thunderbird # TODO: Email module thunderbird # TODO: Email module
obsidian obsidian
zotero zotero
zeal # docs browser zeal # docs browser
# helvum # unmaintained
crosspipe
vlc vlc
audacity audacity
# ferdium ferdium
feishin # electron :( gparted
# feishin # electron :(
jellyfin-tui
playerctl # Media player control playerctl # Media player control
czkawka-full # file deduplicator czkawka-full # file deduplicator
binaryninja-free # reverse engineering
tableplus # database explorer
# opencode-desktop
lmstudio # TODO: Ollama
claude-desktop
opencode-desktop
upscayl
calibre
# Office # Office
kdePackages.wacomtablet # For xournalpp/krita kdePackages.wacomtablet # For xournalpp/krita
@@ -180,36 +168,18 @@ in {
hunspellDicts.en_US hunspellDicts.en_US
hunspellDicts.de_DE hunspellDicts.de_DE
# GTK-Apps because I hate nice software inputs.masssprings.packages.${stdenv.hostPlatform.system}.default
# gnome-calculator
# gnome-calendar
# helvum # unmaintained
crosspipe
# nautilus # This is the worst file manager I've ever used
font-manager # Previews fonts, but doesn't set them
gparted
resources
# celluloid
# cine
# eyedropper
hyprpicker
junction
]) ])
# Darwin exclusive packages # Darwin exclusive packages
(lib.optionals pkgs.stdenv.hostPlatform.isDarwin [ (lib.optionals pkgs.stdenv.isDarwin [
# Use homebrew instead # Use homebrew instead
# alt-tab-macos # alt-tab-macos
# discord # discord
# obsidian # obsidian
# nextcloud-client # nextcloud-client
# proton-vpn # protonvpn-gui
# iina # iina
# TODO: Update the docs module to be darwinix compatible
# - The filepaths need to be adapted
texliveFull
typst
]) ])
]; ];
@@ -220,19 +190,9 @@ in {
direnv = { direnv = {
enable = true; enable = true;
enableFishIntegration = true;
silent = true;
nix-direnv.enable = true; nix-direnv.enable = true;
}; };
# This replaces the normal direnv.enableFishIntegration.
# direnv-instant = {
# enable = true;
# enableFishIntegration = true;
# enableKittyIntegration = true;
# settings.use_cache = true;
# };
eza = { eza = {
enable = true; enable = true;
enableFishIntegration = config.homemodules.fish.enable; enableFishIntegration = config.homemodules.fish.enable;
+12 -56
View File
@@ -47,8 +47,6 @@ in {
wrap_navigation: false, wrap_navigation: false,
enable_mouse: true, enable_mouse: true,
enable_config_hot_reload: true, enable_config_hot_reload: true,
enable_lyrics_hot_reload: true,
enable_lyrics_index: true,
status_update_interval_ms: 1000, status_update_interval_ms: 1000,
rewind_to_start_sec: 30, rewind_to_start_sec: 30,
lyrics_dir: "${config.home.homeDirectory}/Music", lyrics_dir: "${config.home.homeDirectory}/Music",
@@ -90,37 +88,24 @@ in {
( (
name: "Queue (1)", name: "Queue (1)",
pane: Split( pane: Split(
borders: "NONE",
direction: Horizontal, direction: Horizontal,
panes: [ panes: [
// Left Column (Queue + Cava) // Left Column (Queue + Cava)
( (
size: "70%", size: "70%",
borders: "NONE",
pane: Split( pane: Split(
direction: Vertical, direction: Vertical,
panes: [ panes: [
( (
size: "75%", size: "75%",
borders: "ALL", borders: "ALL",
border_symbols: Rounded,
pane: Split(
direction: Vertical,
panes: [
(
size: "2",
pane: Pane(QueueHeader()),
),
(
size: "100%",
pane: Pane(Queue), pane: Pane(Queue),
), ),
],
),
),
( (
size: "25%", size: "25%",
borders: "ALL", borders: "ALL",
border_symbols: Rounded,
pane: Pane(Cava), pane: Pane(Cava),
) )
] ]
@@ -130,19 +115,18 @@ in {
// Right Column (AlbumArt + Lyrics) // Right Column (AlbumArt + Lyrics)
( (
size: "30%", size: "30%",
borders: "NONE",
pane: Split( pane: Split(
direction: Vertical, direction: Vertical,
panes: [ panes: [
( (
size: "75%", size: "75%",
borders: "ALL", borders: "ALL",
border_symbols: Rounded,
pane: Pane(AlbumArt), pane: Pane(AlbumArt),
), ),
( (
size: "25%", size: "25%",
borders: "ALL", borders: "ALL",
border_symbols: Rounded,
pane: Pane(Lyrics), pane: Pane(Lyrics),
), ),
] ]
@@ -153,59 +137,31 @@ in {
), ),
( (
name: "Albums (2)", name: "Albums (2)",
pane: Split( pane: Pane(Albums),
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Albums))],
)
), ),
( (
name: "Album Artists (3)", name: "Album Artists (3)",
pane: Split( pane: Pane(AlbumArtists),
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(AlbumArtists))],
)
), ),
( (
name: "Artists (4)", name: "Artists (4)",
pane: Split( pane: Pane(Artists),
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Artists))],
)
), ),
( (
name: "Playlists (5)", name: "Playlists (5)",
pane: Split( pane: Pane(Playlists),
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Playlists))],
)
), ),
// ( // (
// name: "Directories (6)", // name: "Directories (6)",
// pane: Split( // pane: Pane(Directories),
// size: "100%",
// direction: Vertical,
// panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Directories))],
// )
// ), // ),
( (
name: "Search (6)", name: "Search (6)",
pane: Split( pane: Pane(Search),
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Search))],
)
), ),
// ( // (
// name: "Visualizer (8)", // name: "Visualizer (8)",
// pane: Split( // pane: Pane(Cava),
// size: "100%",
// direction: Vertical,
// panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Cava))],
// )
// ), // ),
], ],
@@ -331,6 +287,8 @@ in {
#![enable(unwrap_variant_newtypes)] #![enable(unwrap_variant_newtypes)]
( (
default_album_art_path: None, default_album_art_path: None,
show_song_table_header: true,
draw_borders: true,
format_tag_separator: " | ", format_tag_separator: " | ",
browser_column_widths: [20, 38, 42], browser_column_widths: [20, 38, 42],
modal_backdrop: false, modal_backdrop: false,
@@ -437,8 +395,6 @@ in {
), ),
( (
pane: Pane(Tabs), pane: Pane(Tabs),
borders: "ALL",
border_symbols: Rounded,
size: "3", size: "3",
), ),
( (
+24 -27
View File
@@ -15,44 +15,41 @@ in {
enable = true; enable = true;
enableDefaultConfig = false; enableDefaultConfig = false;
settings = { matchBlocks = {
"*" = { "*" = {
ForwardAgent = false; forwardAgent = false;
AddKeysToAgent = addKeysToAgent = "no";
if pkgs.stdenv.hostPlatform.isLinux compression = true;
then "no" serverAliveInterval = 0;
else "yes"; # Don't have keychain on darwin serverAliveCountMax = 3;
Compression = true; hashKnownHosts = false;
ServerAliveInterval = 0; userKnownHostsFile = "~/.ssh/known_hosts";
ServerAliveCountMax = 3; controlMaster = "no";
HashKnownHosts = false; controlPath = "~/.ssh/master-%r@%n:%p";
UserKnownHostsFile = "~/.ssh/known_hosts"; controlPersist = "no";
ControlMaster = "no";
ControlPath = "~/.ssh/master-%r@%n:%p";
ControlPersist = "no";
}; };
"nixinator" = { "nixinator" = {
Port = 5432; port = 5432;
User = "christoph"; user = "christoph";
HostName = "vps.chriphost.de"; hostname = "vps.chriphost.de";
}; };
"servenix" = { "servenix" = {
User = "christoph"; user = "christoph";
HostName = "local.chriphost.de"; hostname = "local.chriphost.de";
}; };
"thinknix" = { "thinknix" = {
User = "christoph"; user = "christoph";
HostName = "think.chriphost.de"; hostname = "think.chriphost.de";
}; };
"vps" = { "vps" = {
User = "root"; user = "root";
HostName = "vps.chriphost.de"; hostname = "vps.chriphost.de";
}; };
"mars" = { "mars" = {
User = "smchurla"; user = "smchurla";
HostName = "mars.cs.tu-dortmund.de"; hostname = "mars.cs.tu-dortmund.de";
ServerAliveInterval = 60; serverAliveInterval = 60;
LocalForward = [ localForwards = [
{ {
# Resultbrowser # Resultbrowser
bind.port = 22941; bind.port = 22941;
-1
View File
@@ -26,7 +26,6 @@ in {
signCommits = true; signCommits = true;
}; };
jellyfin-tui.enable = true;
kitty.enable = true; kitty.enable = true;
lazygit.enable = true; lazygit.enable = true;
-89
View File
@@ -1,89 +0,0 @@
# TODO: Expose some settings
{
config,
nixosConfig,
lib,
mylib,
pkgs,
...
}:
with lib;
with mylib.modules; let
cfg = config.homemodules.vscode;
in {
options.homemodules.vscode = import ./options.nix {inherit lib mylib;};
config = mkIf cfg.enable {
programs.vscode = {
enable = true;
package = pkgs.vscode;
mutableExtensionsDir = false;
profiles.default = {
enableUpdateCheck = false;
enableExtensionUpdateCheck = false;
enableMcpIntegration = true;
extensions = with pkgs.vscode-extensions; [
# Theme
catppuccin.catppuccin-vsc
catppuccin.catppuccin-vsc-icons
vscode-icons-team.vscode-icons
# General
vscodevim.vim
christian-kohler.path-intellisense
ryu1kn.partial-diff
redhat.vscode-yaml
ms-vscode-remote.remote-ssh
ms-vscode-remote.remote-ssh-edit
ms-vscode.remote-explorer
anthropic.claude-code
# Python
ms-python.python
ms-python.vscode-pylance
ms-python.black-formatter
# C/C++
ms-vscode.cpptools
# llvm-vs-code-extensions.vscode-clangd
ms-vscode.cmake-tools
ms-vscode.makefile-tools
# llvm-org.lldb-vscode
vadimcn.vscode-lldb
# "13xforever".language-x86-64-assembly
# Latex
# james-yu.latex-workshop
# valentjn.vscode-ltex
];
keybindings = [];
globalSnippets = {};
languageSnippets = {};
userMcp = {};
userSettings = {
"editor.fontFamily" = config.homemodules.color.font;
"editor.fontSize" = 14;
"editor.smoothScrolling" = true;
"editor.cursorSmoothCaretAnimation" = "on";
"workbench.enableExperiments" = false;
"workbench.list.smoothScrolling" = true;
"workbench.colorTheme" = "Catppuccin Mocha";
"workbench.iconTheme" = "catppuccin-mocha";
"remote.SSH.configFile" = "~/.ssh/custom-config";
"workbench.welcomePage.walkthroughs.openOnInstall" = false;
"security.workspace.trust.enabled" = false;
"chat.disableAIFeatures" = false;
# C++
# "C_Cpp.intelliSenseEngine" = "disabled"; # IntelliSense conflics with Clangd
};
userTasks = {};
};
};
};
}
+2 -23
View File
@@ -23,7 +23,7 @@ in {
fixed-center = true; fixed-center = true;
output = waybar.monitors; output = waybar.monitors;
modules-left = ["custom/launcher" "niri/workspaces" "niri/window" "hyprland/workspaces" "hyprland/window"]; # "user" modules-left = ["custom/launcher" "niri/workspaces" "niri/window"]; # "user"
modules-center = ["mpris"]; # "systemd-failed-units" modules-center = ["mpris"]; # "systemd-failed-units"
modules-right = ["privacy" "pulseaudio" "network" "disk" "cpu" "memory" "clock" "tray"]; modules-right = ["privacy" "pulseaudio" "network" "disk" "cpu" "memory" "clock" "tray"];
@@ -58,27 +58,6 @@ in {
icon-size = 22; icon-size = 22;
}; };
"hyprland/workspaces" = {
all-outputs = false;
format = "{icon}";
format-icons = {
default = "";
focused = "";
active = "";
};
persistent-workspaces = {
DP-1 = [1 2 3 4 5 6 7 8 9];
DP-2 = [0];
};
};
"hyprland/window" = {
format = "{title}";
separate-outputs = false;
icon = true;
icon-size = 22;
};
mpris = { mpris = {
format = "<span>󰎇</span> {dynamic}"; format = "<span>󰎇</span> {dynamic}";
format-paused = "<span>{status_icon}</span> <i>{dynamic}</i>"; format-paused = "<span>{status_icon}</span> <i>{dynamic}</i>";
@@ -200,7 +179,7 @@ in {
border-width: ${border-width}; border-width: ${border-width};
border-radius: ${border-radius}; border-radius: ${border-radius};
border-color: #${color.hex.accent}; border-color: #${color.hex.accent};
background-color: rgba(${color.rgbS.mantle}, 0.7); background-color: rgba(${color.rgbS.mantle}, 1.0);
} }
tooltip { tooltip {
+57 -180
View File
@@ -17,19 +17,7 @@ in {
shellWrapperName = "y"; shellWrapperName = "y";
plugins = { plugins = {
inherit inherit (pkgs.yaziPlugins) chmod diff full-border git lazygit mount ouch rsync starship sudo; # smart-paste
(pkgs.yaziPlugins)
chmod
diff
full-border
git
lazygit
mount
ouch
rsync
starship
sudo
; # smart-paste
}; };
initLua = '' initLua = ''
@@ -65,10 +53,9 @@ in {
''; '';
# https://yazi-rs.github.io/docs/configuration/yazi # https://yazi-rs.github.io/docs/configuration/yazi
# %sN: The N-th selected file (1...n) # "$n": The n-th selected file (1...n)
# %s: All selected files # "$@": All selected files
# %h: The hovered file (shell keybindings) # "$0": The hovered file
# File placeholders are shell-escaped by Yazi; do not quote them.
settings = { settings = {
mgr = { mgr = {
show_hidden = false; show_hidden = false;
@@ -81,43 +68,27 @@ in {
opener = { opener = {
play = [ play = [
{ {
run = ''mpv %s''; run = ''mpv "$@"'';
orphan = true; orphan = true;
desc = "Play selection with mpv"; desc = "Play selection";
}
{
run = ''vlc %s'';
orphan = true;
desc = "Play selection with vlc";
} }
]; ];
edit = [ edit = [
{ {
run = ''$EDITOR %s''; run = ''$EDITOR "$@"'';
block = true; block = true;
desc = "Edit selection"; desc = "Edit selection";
} }
]; ];
open = [ open = [
{ {
run = ''xdg-open %s1''; run = ''xdg-open "$@"'';
orphan = true; desc = "Open selection";
desc = "Open first selected file with xdg-open";
}
{
run = ''imv %s'';
orphan = true;
desc = "Open selection with imv";
}
{
run = ''junction %s'';
orphan = true;
desc = "Open selection with junction";
} }
]; ];
extract = [ extract = [
{ {
run = ''ouch decompress -y %s''; run = ''ouch decompress -y "$@"'';
desc = "Extract selection"; desc = "Extract selection";
} }
]; ];
@@ -130,13 +101,13 @@ in {
plugin.prepend_fetchers = [ plugin.prepend_fetchers = [
{ {
group = "git"; id = "git";
url = "*"; name = "*";
run = "git"; run = "git";
} }
{ {
group = "git"; id = "git";
url = "*/"; name = "*/";
run = "git"; run = "git";
} }
]; ];
@@ -186,67 +157,43 @@ in {
mgr.prepend_keymap = [ mgr.prepend_keymap = [
{ {
on = [ on = ["<C-p>" "m"];
"<C-p>"
"m"
];
run = "plugin mount"; run = "plugin mount";
desc = "Manage device mounts"; desc = "Manage device mounts";
} }
{ {
on = [ on = ["<C-p>" "c"];
"<C-p>"
"c"
];
run = "plugin chmod"; run = "plugin chmod";
desc = "Chmod selection"; desc = "Chmod selection";
} }
{ {
on = [ on = ["<C-p>" "g"];
"<C-p>"
"g"
];
run = "plugin lazygit"; run = "plugin lazygit";
desc = "Run LazyGit"; desc = "Run LazyGit";
} }
{ {
on = [ on = ["<C-p>" "a"];
"<C-p>" run = "plugin ouch";
"a"
];
run = "plugin ouch 7z";
desc = "Add selection to archive"; desc = "Add selection to archive";
} }
{ {
on = [ on = ["<C-p>" "d"];
"<C-p>" run = ''shell -- ripdrag -a -n "$@"'';
"d"
];
run = ''shell --orphan -- ripdrag -a -n %s'';
desc = "Drag & drop selection"; desc = "Drag & drop selection";
} }
{ {
on = [ on = ["<C-p>" "D"];
"<C-p>"
"D"
];
run = "plugin diff"; run = "plugin diff";
desc = "Diff the selected with the hovered file"; desc = "Diff the selected with the hovered file";
} }
{ {
on = [ on = ["<C-p>" "r"];
"<C-p>"
"r"
];
run = "plugin rsync"; run = "plugin rsync";
desc = "Copy files using rsync"; desc = "Copy files using rsync";
} }
{ {
on = [ on = ["<C-p>" "w"];
"<C-p>" run = ''wl-copy < "$0"'';
"w"
];
run = ''shell -- wl-copy < %h'';
desc = "Copy hovered file contents using wl-copy"; desc = "Copy hovered file contents using wl-copy";
} }
@@ -257,10 +204,7 @@ in {
} }
{ {
on = "y"; on = "y";
run = [ run = [''shell -- for path in "$@"; do echo "file://$path"; done | wl-copy -t text/uri-list'' "yank"];
''shell -- for path in %s; do echo "file://$path"; done | wl-copy -t text/uri-list''
"yank"
];
desc = "Copy files to system clipboard on yank"; desc = "Copy files to system clipboard on yank";
} }
# { # {
@@ -273,20 +217,13 @@ in {
run = "remove --permanently"; run = "remove --permanently";
desc = "Delete selection"; desc = "Delete selection";
} }
{
on = ["g" "m"];
run = ''cd ~/Notes/TU/MastersThesis'';
desc = "Go to MastersThesis";
}
]; ];
}; };
# https://github.com/catppuccin/yazi/blob/main/themes/mocha/catppuccin-mocha-lavender.toml # https://github.com/catppuccin/yazi/blob/main/themes/mocha/catppuccin-mocha-lavender.toml
theme = { theme = {
mgr = { mgr = {
cwd = { cwd = {fg = color.hexS.teal;};
fg = color.hexS.teal;
};
hovered = { hovered = {
fg = color.hexS.accentText; fg = color.hexS.accentText;
@@ -343,9 +280,7 @@ in {
}; };
border_symbol = ""; border_symbol = "";
border_style = { border_style = {fg = color.hexS.overlay0;};
fg = color.hexS.overlay0;
};
}; };
tabs = { tabs = {
@@ -414,104 +349,58 @@ in {
bg = color.hexS.surface0; bg = color.hexS.surface0;
}; };
perm_type = { perm_type = {fg = color.hexS.blue;};
fg = color.hexS.blue; perm_read = {fg = color.hexS.yellow;};
}; perm_write = {fg = color.hexS.red;};
perm_read = { perm_exec = {fg = color.hexS.green;};
fg = color.hexS.yellow; perm_sep = {fg = color.hexS.overlay0;};
};
perm_write = {
fg = color.hexS.red;
};
perm_exec = {
fg = color.hexS.green;
};
perm_sep = {
fg = color.hexS.overlay0;
};
}; };
input = { input = {
border = { border = {fg = color.hexS.accentDim;};
fg = color.hexS.accentDim;
};
title = {}; title = {};
value = {}; value = {};
selected = { selected = {reversed = true;};
reversed = true;
};
}; };
pick = { pick = {
border = { border = {fg = color.hexS.accentDim;};
fg = color.hexS.accentDim; active = {fg = color.hexS.accentHl;};
};
active = {
fg = color.hexS.accentHl;
};
inactive = {}; inactive = {};
}; };
confirm = { confirm = {
border = { border = {fg = color.hexS.accentDim;};
fg = color.hexS.accentDim; title = {fg = color.hexS.accentDim;};
};
title = {
fg = color.hexS.accentDim;
};
content = {}; content = {};
list = {}; list = {};
btn_yes = { btn_yes = {reversed = true;};
reversed = true;
};
btn_no = {}; btn_no = {};
}; };
cmp = { cmp = {
border = { border = {fg = color.hexS.accentDim;};
fg = color.hexS.accentDim;
};
}; };
tasks = { tasks = {
border = { border = {fg = color.hexS.accentDim;};
fg = color.hexS.accentDim;
};
title = {}; title = {};
hovered = { hovered = {underline = true;};
underline = true;
};
}; };
which = { which = {
cand = { cand = {fg = color.hexS.accent;};
fg = color.hexS.accent; desc = {fg = color.hexS.accentHl;};
}; mask = {bg = color.hexS.surface0;};
desc = { rest = {fg = color.hexS.surface0;};
fg = color.hexS.accentHl;
};
mask = {
bg = color.hexS.surface0;
};
rest = {
fg = color.hexS.surface0;
};
separator = " "; separator = " ";
separator_style = { separator_style = {fg = color.hexS.text;};
fg = color.hexS.text;
};
}; };
help = { help = {
on = { on = {fg = color.hexS.accent;};
fg = color.hexS.accent; run = {fg = color.hexS.accentHl;};
}; desc = {fg = color.hexS.text;};
run = {
fg = color.hexS.accentHl;
};
desc = {
fg = color.hexS.text;
};
hovered = { hovered = {
fg = color.hexS.accentText; # TODO: This is not applied fg = color.hexS.accentText; # TODO: This is not applied
@@ -526,31 +415,19 @@ in {
}; };
notify = { notify = {
title_info = { title_info = {fg = color.hexS.teal;};
fg = color.hexS.teal; title_warn = {fg = color.hexS.yellow;};
}; title_error = {fg = color.hexS.red;};
title_warn = {
fg = color.hexS.yellow;
};
title_error = {
fg = color.hexS.red;
};
}; };
spot = { spot = {
border = { border = {fg = color.hexS.lavender;};
fg = color.hexS.lavender; title = {fg = color.hexS.lavender;};
};
title = {
fg = color.hexS.lavender;
};
tbl_cell = { tbl_cell = {
fg = color.hexS.lavender; fg = color.hexS.lavender;
reversed = true; reversed = true;
}; };
tbl_col = { tbl_col = {bold = true;};
bold = true;
};
}; };
# Default rules good enough # Default rules good enough
-199
View File
@@ -1,199 +0,0 @@
{
config,
nixosConfig,
lib,
mylib,
pkgs,
...
}: let
inherit (config.homemodules) zed color;
in {
options.homemodules.zed = import ./options.nix {inherit lib mylib;};
config = lib.mkIf zed.enable {
programs.zed-editor = {
enable = true;
package = pkgs.zed-editor;
enableMcpIntegration = true;
mutableUserKeymaps = false;
mutableUserSettings = false;
mutableUserTasks = false;
mutableUserDebug = false;
extensions = [
"catppuccin"
"catppuccin-icons"
"comment"
"git-firefly"
"nix"
"perl"
"fish"
"lua"
"toml"
"csharp"
"java"
"latex"
"typst"
"haskell"
"glsl"
"mermaid"
"clojure"
"verilog"
"qml"
"plantuml"
"graphviz"
"dockerfile"
"docker-compose"
"html"
"xml"
"scss"
"rainbow-csv"
"sql"
"svelte"
"svelte-mcp"
"jinja2"
"just"
"make"
"neocmake"
"assembly"
"wat"
"linkerscript"
"r"
];
themes = {};
userDebug = [];
# TODO: Add neovim keymaps
userKeymaps = [
{
context = "Workspace";
bindings = {
"ctrl-/" = "terminal_panel::Toggle";
};
}
{
context = "Editor";
unbind = {
"ctrl-/" = [
"editor::ToggleComments"
{
advance_downwards = false;
}
];
};
}
{
context = "(vim_mode == normal || vim_mode == visual) && !menu";
bindings = {
"ctrl-c" = "editor::ToggleComments";
};
}
];
userSettings = {
buffer_font_family = config.homemodules.color.font;
terminal.font_family = config.homemodules.color.font;
theme = "Catppuccin Mocha";
icon_theme = "Catppuccin Mocha";
ui_font_size = 16;
buffer_font_size = 14;
project_panel.dock = "left";
outline_panel.dock = "left";
collaboration_panel.dock = "left";
git_panel = {
dock = "left";
tree_view = true;
};
# TODO: Doesn't work, although perlnavigator advertises Perl::Tidy autoformatting...
languages = {
Perl = {
formatter = "language_server";
};
};
auto_signature_help = true;
lsp = {
nil = {
initialization_options = {
formatting = {
# command = null;
command = ["${pkgs.alejandra}/bin/alejandra"];
};
};
};
nixd = {
initialization_options = {
formatting = {
command = ["${pkgs.alejandra}/bin/alejandra"];
};
};
};
# No idea how to configure the formatter
# perlnavigator-server = let
# # TODO: Duplicated in neovim/default.nix. Need Perl module.
# perl = pkgs.perl.withPackages (p:
# with p; [
# PLS
# PerlCritic
# PerlTidy
# NetOpenSSH
# DateTime
# DBI
# DBDMariaDB
# CursesUI
# TextCSV_XS
# ]);
# in {
# initialization_options = {
# "perlnavigator.perlPath" = "${perl}/bin";
# "perlnavigator.includePaths" = ["${perl}/lib/perl5"];
# };
# };
};
disable_ai = false;
agent = {
dock = "right";
sidebar_side = "right";
};
agent_servers = {
claude-acp = {
type = "registry";
};
codex-acp = {
type = "registry";
};
gemini = {
type = "registry";
};
mistral-vibe = {
type = "registry";
};
opencode = {
type = "registry";
};
};
telemetry = {
diagnostics = false;
metrics = false;
};
vim_mode = true;
which_key = {
enabled = true;
delay_ms = 10;
};
};
userTasks = [];
};
};
}
-7
View File
@@ -1,7 +0,0 @@
{
lib,
mylib,
...
}: {
enable = lib.mkEnableOption "Enable zed editor";
}
+10 -34
View File
@@ -9,42 +9,14 @@
mkCommonNixSettings = username: { mkCommonNixSettings = username: {
enable = true; enable = true;
package = pkgs.nixVersions.stable; package = pkgs.nixVersions.stable;
extraOptions = '' extraOptions = ''
experimental-features = nix-command flakes pipe-operators experimental-features = nix-command flakes pipe-operators
''; '';
settings.trusted-users = ["root" username];
settings = rec { gc.automatic = false;
trusted-users = ["root" username]; gc.options = "--delete-older-than 5d";
auto-optimise-store = true; settings.auto-optimise-store = true;
optimise.automatic = true;
download-buffer-size = 524288000; # 500MB
substituters = [
"https://cache.nixos.org"
"https://nix-community.cachix.org"
# "https://app.cachix.org/cache/nixos-rocm"
"https://hyprland.cachix.org"
"https://nix-gaming.cachix.org"
];
trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
# "nixos-rocm.cachix.org-1:VEpsf7pRIijjd8csKjFNBGzkBqOmw8H9PRmgAq14LnE="
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
"nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
];
};
gc = {
automatic = false;
options = "--delete-older-than 5d";
};
optimise = {
automatic = true;
};
registry = lib.mapAttrs' (n: v: lib.nameValuePair n {flake = v;}) inputs; registry = lib.mapAttrs' (n: v: lib.nameValuePair n {flake = v;}) inputs;
nixPath = [ nixPath = [
"nixpkgs=${inputs.nixpkgs.outPath}" "nixpkgs=${inputs.nixpkgs.outPath}"
@@ -77,6 +49,7 @@
# Import the toplevel system configuration module. # Import the toplevel system configuration module.
../system ../system
../system/cachix.nix
# Host specific configuration # Host specific configuration
../system/${hostname} ../system/${hostname}
@@ -150,11 +123,14 @@
# to allow installation of unfree software and my own overlays. # to allow installation of unfree software and my own overlays.
{nixpkgs.pkgs = pkgs;} {nixpkgs.pkgs = pkgs;}
# Import the toplevel system configuration module.
../system/cachix.nix
# Host specific configuration # Host specific configuration
../system/${hostname} ../system/${hostname}
# Import all of my custom system modules # Import all of my custom system modules
../system/systemmodules/darwin.nix # ../system/systemmodules # TODO:
] ]
extraModules extraModules
+63 -148
View File
@@ -3,164 +3,79 @@
pkgs, pkgs,
lib, lib,
... ...
}: { }: rec {
# Receives attrs like: # Receives attrs like:
# { # {
# "Poweroff" = "poweroff"; # "Poweroff" = "poweroff";
# "Reload Hyprland" = "hyprctl reload"; # "Reload Hyprland" = "hyprctl reload";
# } # }
# mkSimpleMenu = let mkSimpleMenu = let
# # Makes a string like ''"Poweroff" "Reload Hyprland"'' # Makes a string like ''"Poweroff" "Reload Hyprland"''
# unpack-options = attrs: "\"${lib.concatStringsSep "\" \"" (builtins.attrNames attrs)}\""; unpack-options = attrs: "\"${lib.concatStringsSep "\" \"" (builtins.attrNames attrs)}\"";
#
# mkCase = option: action: "else if test \"${option}\" = $OPTION\n set ACTION \"${action}\"";
#
# cases = attrs:
# attrs
# |> builtins.mapAttrs mkCase
# |> builtins.attrValues
# |> builtins.concatStringsSep "\n";
# in
# {
# prompt,
# attrs,
# command ? ''rofi -dmenu -i'',
# }:
# pkgs.writeScriptBin "rofi-menu-${prompt}" ''
# #! ${pkgs.fish}/bin/fish
#
# # OPTIONS contains all possible values Rofi will display
# set OPTIONS ${unpack-options attrs}
#
# # We choose a single OPTION using Rofi
# set OPTION (echo -e (string join "\n" $OPTIONS) | ${command} -p "${prompt}")
#
# # Check if the chosen OPTION is a valid choice from OPTIONS
# if not contains $OPTION $OPTIONS
# exit
# end
#
# # Set a command to execute based on the chosen OPTION
# if false
# exit # Easier to generate with this
# ${cases attrs}
# else
# exit
# end
#
# # Execute the command
# eval $ACTION
# '';
# Rofi/Dmenu menu generator. mkCase = option: action: "else if test \"${option}\" = $OPTION\n set ACTION \"${action}\"";
#
# Each element in `layers` is one of:
# - attrset { "Label" = "value"; } # static options: selected value → $OPTIONn
# - string "shell-cmd" # dynamic options from command: selected text → $OPTIONn
# # may reference $OPTION0, $OPTION1, ... from earlier layers
#
# The "command" is the last action, it can reference $OPTION0, $OPTION1, ...
# If no "command" is given and the last layer is a static attrset, its selected value is evaluated directly.
#
# The "prompts" list are optional per-layer prompt strings (falls back to "prompt" if not provided).
#
# vpn.fish equivalent:
# mkMenu {
# prompt = "vpn";
# layers = [
# "cat /etc/rofi-vpns"
# { "start" = "start"; "stop" = "stop"; "status" = "status"; }
# ];
# command = "systemctl $OPTION1 $OPTION0.service";
# }
#
# lectures.fish equivalent:
# mkMenu {
# prompt = "lecture";
# layers = [
# "eza -1 -D ~/Notes/TU"
# "eza -1 ~/Notes/TU/$OPTION0/Lecture | grep '.pdf'"
# ];
# command = "xdg-open ~/Notes/TU/$OPTION0/Lecture/$OPTION1";
# }
mkMenu = {
prompt,
layers,
prompts ? [],
command ? null,
rofiCmd ? "rofi -dmenu -i",
}: let
isStaticLayer = layer: builtins.isAttrs layer && !(layer ? options);
isDynamicLayer = layer: builtins.isString layer;
escStr = s: builtins.replaceStrings [''"'' "\\"] [''\"'' "\\\\"] s; cases = attrs:
attrs
layerPrompt = i: |> builtins.mapAttrs mkCase
if i < builtins.length prompts |> builtins.attrValues
then lib.elemAt prompts i |> builtins.concatStringsSep "\n";
else prompt;
# Static layer: attrset of label -> value
# Displays labels in rofi; maps selected label to its value -> $OPTIONi
mkStaticLayer = i: attrs: let
lp = layerPrompt i;
labels = builtins.attrNames attrs;
optsStr = "\"${lib.concatStringsSep "\" \"" (map escStr labels)}\"";
mkCase = label: value: "else if test \"${escStr label}\" = $_LABEL${toString i}\n set OPTION${toString i} \"${escStr value}\"";
casesStr =
builtins.concatStringsSep "\n"
(builtins.attrValues (builtins.mapAttrs mkCase attrs));
in {
script = ''
set _OPTS${toString i} ${optsStr}
set _LABEL${toString i} (echo -e (string join "\n" $_OPTS${toString i}) | ${rofiCmd} -p "${lp}")
if not contains $_LABEL${toString i} $_OPTS${toString i}
exit
end
if false
exit
${casesStr}
else
exit
end
'';
};
# Dynamic layer: shell command string whose output is piped to rofi
# Selected text -> $OPTIONi; may reference earlier $OPTIONn variables
mkDynamicLayer = i: cmd: let
lp = layerPrompt i;
in {
script = ''
set OPTION${toString i} (${cmd} | ${rofiCmd} -p "${lp}")
if test -z $OPTION${toString i}
exit
end
'';
};
mkLayer = i: layer:
if isStaticLayer layer
then mkStaticLayer i layer
else if isDynamicLayer layer
then mkDynamicLayer i layer
else throw "mkMenu: layer ${toString i} has invalid type";
layerResults = lib.imap0 mkLayer layers; # Map with 0-based index
layerScripts = map (r: r.script) layerResults;
lastLayer = lib.last layers;
finalCmd =
if command != null
then command
else if isStaticLayer lastLayer
then "$OPTION${toString (builtins.length layers - 1)}"
else throw "mkMenu: 'command' must be set when the last layer is not a static attrset";
in in
{
prompt,
attrs,
command ? ''rofi -dmenu -p " ${prompt} " -i'',
}:
pkgs.writeScriptBin "rofi-menu-${prompt}" '' pkgs.writeScriptBin "rofi-menu-${prompt}" ''
#! ${pkgs.fish}/bin/fish #! ${pkgs.fish}/bin/fish
${lib.concatStringsSep "\n" layerScripts} # OPTIONS contains all possible values Rofi will display
eval "${finalCmd}" set OPTIONS ${unpack-options attrs}
# We choose a single OPTION using Rofi
set OPTION (echo -e (string join "\n" $OPTIONS) | ${command})
# Check if the chosen OPTION is a valid choice from OPTIONS
if not contains $OPTION $OPTIONS
exit
end
# Set a command to execute based on the chosen OPTION
if false
exit # Easier to generate with this
${cases attrs}
else
exit
end
# Execute the command
eval $ACTION
''; '';
# TODO: I want to generate the containers menu using the actionsA and actionsB attrs:
# - actionsA will be generated from the stuff in oci-containers.containers
# - actionsB will be set statically for start, stop, status
# Receives attrs like:
# {
# optionA = "exa -1 -D ~/Notes/TU";
# optionB = "exa -1 -D ~/Notes/TU/$OPTIONA/Lecture | grep \".pdf\"";
# commandB = "xdg-open ~/Notes/TU/$OPTIONA/Lecture/$OPTIONB";
# }
#
# Keys:
# - optionA, optionB # Command that generates Rofi options:
# exa -1 -D ~/Notes/TU
# cat /etc/rofi-vpns
# - commandA, commandB # Action to execute after sth. was chosen (mutually excl. with command)
# - actionsA, actionsB # Configure actions by lookup (mutually excl. with command):
# actionsB = {"status" = "systemctl status..."}
# - colorA, colorB # Configure highlighting conditions:
# colorA = {"red" = "systemctl ... | grep ..."};
#
# Use $OPTIONA and $OPTIONB to use the options chosen by option<A/B>-command and rofi
# Use $EVALA and $EVALB to use the outputs generated by command<A/B>
mkMenu = let
in
prompt: attrs: "";
} }
+31 -37
View File
@@ -29,36 +29,36 @@
# Remove this after jetbrains.jdk builds again (nixpkgs issue 425328) # Remove this after jetbrains.jdk builds again (nixpkgs issue 425328)
# jetbrains.rider = pkgs-stable.jetbrains.rider; # jetbrains.rider = pkgs-stable.jetbrains.rider;
# jetbrains = jetbrains =
# prev.jetbrains prev.jetbrains
# // { // {
# clion = prev.jetbrains.clion.overrideAttrs (oldAttrs: rec { clion = prev.jetbrains.clion.overrideAttrs (oldAttrs: rec {
# version = "261.22158.47"; # March 6, 2026 version = "261.22158.47"; # March 6, 2026
#
# src = prev.fetchurl { src = prev.fetchurl {
# url = "https://download-cdn.jetbrains.com/cpp/CLion-${version}.tar.gz"; url = "https://download-cdn.jetbrains.com/cpp/CLion-${version}.tar.gz";
#
# # hash = "sha256-h6tnemVnV1YEsvIndwrq2sMsRZYuvTWMU5oqj/hkjdY="; # 261.21849.6 # hash = "sha256-h6tnemVnV1YEsvIndwrq2sMsRZYuvTWMU5oqj/hkjdY="; # 261.21849.6
# hash = "sha256-FUHNRioJvjwOWN+FkXEr3+NWR+QVxaZUOkJ0egQkcCQ="; # 261.22158.47 hash = "sha256-FUHNRioJvjwOWN+FkXEr3+NWR+QVxaZUOkJ0egQkcCQ="; # 261.22158.47
# }; };
#
# # autoPatchelfIgnoreMissingDeps = [ # autoPatchelfIgnoreMissingDeps = [
# # "libcrypto.so.1.1" # "libcrypto.so.1.1"
# # "libssl.so.1.1" # "libssl.so.1.1"
# # ]; # ];
#
# postFixup = '' postFixup = ''
# # Patch python3.12 shared libs that the upstream glob (python3.8) misses # Patch python3.12 shared libs that the upstream glob (python3.8) misses
# find $out -path '*/python3.*/lib-dynload/*.so' -exec patchelf \ find $out -path '*/python3.*/lib-dynload/*.so' -exec patchelf \
# --replace-needed libssl.so.1.1 libssl.so \ --replace-needed libssl.so.1.1 libssl.so \
# --replace-needed libcrypto.so.1.1 libcrypto.so \ --replace-needed libcrypto.so.1.1 libcrypto.so \
# --replace-needed libcrypt.so.1 libcrypt.so \ --replace-needed libcrypt.so.1 libcrypt.so \
# {} + {} +
#
# ${oldAttrs.postFixup or ""} ${oldAttrs.postFixup or ""}
# ''; '';
# }); });
# }; };
# Now in Nixpkgs # Now in Nixpkgs
# neovide = prev.neovide.overrideAttrs (finalAttrs: prevAttrs: { # neovide = prev.neovide.overrideAttrs (finalAttrs: prevAttrs: {
@@ -94,10 +94,4 @@
}; };
in in
# Composes a list of overlays and returns a single overlay function that combines them. # Composes a list of overlays and returns a single overlay function that combines them.
nixpkgs.lib.composeManyExtensions [ nixpkgs.lib.composeManyExtensions [additions modifications]
additions
modifications
# This is already a complete overlay with final: prev:, so it must be composed directly
(import ./latexminted.nix)
]
-67
View File
@@ -1,67 +0,0 @@
# Workaround for a broken `minted` in nixpkgs.
#
# The TeX Live snapshot in nixpkgs (2026-03-01) predates minted 3.8.0
# (2026-03-04) and still ships 3.7.0 together with a bundled `latexminted`
# 0.6.0 that does not run. Two independent replacements are needed:
#
# - the run container: minted.sty from the upstream 3.8.0 release, which
# requires `latexminted` >= 0.7.0;
# - the bin container: `pkgs.latexminted` (0.7.1), which works.
#
# The LaTeX package and the Python executable are versioned separately, hence
# the two unrelated version numbers.
#
# Delete this file once nixpkgs ships minted >= 3.8.0.
final: prev: let
version = "3.8.0";
# Byte-identical to the CTAN 3.8.0 release, but pinned and already unpacked
# (CTAN only ships minted.dtx, which would have to be run through docstrip).
src = prev.fetchFromGitHub {
owner = "gpoore";
repo = "minted";
rev = "631f7e8e93f37d4f6e7767ff45692d53e7c7360d"; # "[latex] minted v3.8.0"
hash = "sha256-xUWScWRR62ikRxxz/YEauWLirvhsQPCcyE1O6cpWZRw=";
};
minted = prev.texlive.pkgs.minted;
# texlive.withPackages reads pname/tlType/tlDeps/... off the containers, so
# reuse the original metadata instead of reconstructing it.
container = name: container: script:
prev.runCommand "minted-${version}${name}" {
inherit (container) meta;
passthru =
container.passthru
// {
inherit version;
};
}
script;
in {
texlive =
prev.texlive
// {
pkgs =
prev.texlive.pkgs
// {
minted =
minted
// {
tex = container "-tex" minted.tex ''
install -Dm444 -t "$out"/tex/latex/minted \
${src}/latex/minted/minted.sty \
${src}/latex/minted/minted1.sty \
${src}/latex/minted/minted2.sty
'';
# A bare symlink is enough: texlive.withPackages resolves and wraps
# everything under bin/ itself.
out = container "" minted.out ''
mkdir -p "$out"/bin
ln -s ${prev.lib.getExe prev.latexminted} "$out"/bin/latexminted
'';
};
};
};
}
+16
View File
@@ -0,0 +1,16 @@
# WARN: this file will get overwritten by $ cachix use <name>
{
pkgs,
lib,
...
}: let
folder = ./cachix;
toImport = name: value: folder + ("/" + name);
filterCaches = key: value: value == "regular" && lib.hasSuffix ".nix" key;
imports =
lib.mapAttrsToList toImport
(lib.filterAttrs filterCaches (builtins.readDir folder));
in {
inherit imports;
nix.settings.substituters = ["https://cache.nixos.org/"];
}
+14
View File
@@ -0,0 +1,14 @@
{
nix.settings = {
substituters = [
"https://nix-community.cachix.org"
# "https://app.cachix.org/cache/nixos-rocm"
# "https://ai.cachix.org"
];
trusted-public-keys = [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
# "nixos-rocm.cachix.org-1:VEpsf7pRIijjd8csKjFNBGzkBqOmw8H9PRmgAq14LnE="
# "ai.cachix.org-1:N9dzRK+alWwoKXQlnn0H6aUx0lU/mspIoz8hMvGvbbc="
];
};
}
+3 -26
View File
@@ -10,19 +10,6 @@
hostname, hostname,
... ...
}: { }: {
systemmodules = {
sops-nix.bootSecrets.${username} = [
"user-password"
];
sops-nix.secrets.${username} = [
"ssh-private-key"
"nix-github-token"
"docker-password"
"jellyfin-password"
];
};
nix = mylib.nixos.mkCommonNixSettings username; nix = mylib.nixos.mkCommonNixSettings username;
networking = { networking = {
@@ -88,13 +75,10 @@
}; };
users.users.${username} = { users.users.${username} = {
name = "${username}";
description = "Christoph";
uid = 501;
gid = 20;
createHome = false;
home = "/Users/${username}";
isHidden = false; isHidden = false;
description = "Christoph";
home = "/Users/${username}";
createHome = false;
# NOTE: Not set if the user already exists on darwin, so use chsh for the root user # NOTE: Not set if the user already exists on darwin, so use chsh for the root user
shell = pkgs.fish; shell = pkgs.fish;
@@ -141,10 +125,6 @@
upgrade = true; upgrade = true;
}; };
# taps = [
# "homebrew-zathura/zathura"
# ];
brews = []; brews = [];
casks = [ casks = [
@@ -155,9 +135,6 @@
"obsidian" "obsidian"
"protonvpn" "protonvpn"
"signal" "signal"
# "zathura"
# "zathura-pdf-mupdf"
"zotero"
]; ];
}; };
+28 -32
View File
@@ -91,7 +91,6 @@ with mylib.networking; {
"ssh-private-key" "ssh-private-key"
"nix-github-token" "nix-github-token"
"docker-password" "docker-password"
"jellyfin-password"
]; ];
}; };
@@ -144,7 +143,7 @@ with mylib.networking; {
documentation = { documentation = {
# NOTE: Disable this while configuring stuff, it's slow # NOTE: Disable this while configuring stuff, it's slow
enable = false; enable = true;
man.enable = config.documentation.enable; man.enable = config.documentation.enable;
man.cache.enable = true; # Slow but needed for neovim man picker man.cache.enable = true; # Slow but needed for neovim man picker
info.enable = config.documentation.enable; info.enable = config.documentation.enable;
@@ -235,7 +234,6 @@ with mylib.networking; {
description = "Christoph"; description = "Christoph";
group = "users"; group = "users";
uid = 1000; uid = 1000;
home = "/home/${username}";
extraGroups = [ extraGroups = [
"networkmanager" "networkmanager"
"wheel" "wheel"
@@ -337,8 +335,7 @@ with mylib.networking; {
niri = { niri = {
enable = !headless; enable = !headless;
package = pkgs.niri; package = pkgs.niri-unstable; # TODO: Can remove this again once niri-flake is updated for 25.11
# package = pkgs.niri-unstable; # TODO: Can remove this again once niri-flake is updated for 25.11
}; };
ssh.startAgent = true; # Use gnupg ssh.startAgent = true; # Use gnupg
@@ -394,9 +391,9 @@ with mylib.networking; {
}; };
# Trims the journal if too large # Trims the journal if too large
journald.settings.Journal = { journald.extraConfig = ''
SystemMaxUse = "50M"; SystemMaxUse=50M
}; '';
acpid.enable = true; acpid.enable = true;
dbus.enable = true; dbus.enable = true;
@@ -418,30 +415,29 @@ with mylib.networking; {
systemd = { systemd = {
# TODO: Technically this should be a user service if it runs as ${username}? # TODO: Technically this should be a user service if it runs as ${username}?
timers."refresh-nps-cache" = {
wantedBy = ["timers.target"];
timerConfig = {
OnCalendar = "weekly"; # or however often you'd like
Persistent = true;
Unit = "refresh-nps-cache.service";
};
};
# timers."refresh-nps-cache" = { services."refresh-nps-cache" = {
# wantedBy = ["timers.target"]; # Make sure `nix` and `nix-env` are findable by systemd.services.
# timerConfig = { path = ["/run/current-system/sw/"];
# OnCalendar = "weekly"; # or however often you'd like after = ["network.target"];
# Persistent = true; serviceConfig = {
# Unit = "refresh-nps-cache.service"; Type = "oneshot";
# }; User = "${username}";
# }; };
script = ''
# services."refresh-nps-cache" = { set -eu
# # Make sure `nix` and `nix-env` are findable by systemd.services. echo "Start refreshing nps cache..."
# path = ["/run/current-system/sw/"]; ${inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/nps -dddd -e -r
# after = ["network.target"]; echo "... finished nps cache with exit code $?."
# serviceConfig = { '';
# Type = "oneshot"; };
# User = "${username}";
# };
# script = ''
# set -eu
# echo "Start refreshing nps cache..."
# ${inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default}/bin/nps -dddd -e -r
# echo "... finished nps cache with exit code $?."
# '';
# };
}; };
} }
+66 -99
View File
@@ -12,6 +12,7 @@
./disks.nix ./disks.nix
# General services # General services
../services/comfyui.nix
../services/fileflows-node.nix ../services/fileflows-node.nix
]; ];
@@ -123,6 +124,7 @@
# 31431 # Parsec # 31431 # Parsec
5173 # SvelteKit 5173 # SvelteKit
8090 # PocketBase 8090 # PocketBase
8188 # ComfyUI
]; ];
allowedUDPPorts = [ allowedUDPPorts = [
@@ -133,14 +135,13 @@
# 31431 # Parsec # 31431 # Parsec
5173 # SvelteKit 5173 # SvelteKit
8090 # PocketBase 8090 # PocketBase
8188 # ComfyUI
]; ];
}; };
sops-nix.secrets.${username} = [ sops-nix.secrets.${username} = [
"makemkv-app-key" "makemkv-app-key"
"restic-repo-key" "restic-repo-key"
"context7-api-key"
"obsidian-rest-api-key"
]; ];
}; };
@@ -157,7 +158,7 @@
}; };
boot = { boot = {
kernelPackages = pkgs.linuxPackages_zen; # kernelPackages = pkgs.linuxPackages_zen;
# kernelPackages = pkgs.linuxPackages_latest; # kernelPackages = pkgs.linuxPackages_latest;
# Why do I need to know if something fails during boot??? # Why do I need to know if something fails during boot???
@@ -192,53 +193,7 @@
# }; # };
}; };
environment.systemPackages = with pkgs; [ # environment.systemPackages = with pkgs; [];
spice
spice-gtk
];
stylix = {
enable = true;
autoEnable = false;
base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-mocha.yaml";
# TODO: Duplicated from fonts module (set this inside fonts module?)
fonts = {
serif = {
package = pkgs.noto-fonts-cjk-serif;
name = "Noto Serif CJK SC";
};
sansSerif = {
package = pkgs.noto-fonts-cjk-sans;
name = "Noto Sans CJK SC";
};
monospace = {
package = pkgs.monolisa;
name = "MonoLisa Alt Script";
};
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
};
targets = {};
};
virtualisation = {
libvirtd = {
enable = true;
qemu = {
package = pkgs.qemu_kvm;
# ovmf.enable = true; # deprecated
swtpm.enable = true;
runAsRoot = true;
};
};
spiceUSBRedirection.enable = true;
};
networking.firewall.trustedInterfaces = ["virbr0"]; # libvirt
programs = { programs = {
ausweisapp = { ausweisapp = {
@@ -246,77 +201,89 @@
openFirewall = true; # Directly set port in firewall openFirewall = true; # Directly set port in firewall
}; };
# TODO: Doesn't work with steam flatpak
# gamescope = {
# enable = true;
# enableWsi = true;
# };
ghidra = { ghidra = {
enable = true; enable = true;
gdb = true; gdb = true;
}; };
steam.platformOptimizations.enable = true; # From nix-gaming module
virt-manager.enable = true;
}; };
services = { services = {
# desktopManager.plasma6.enable = true;
# displayManager.gdm.enable = true; # Somehow, Plasma's own manager didn't work
btrfs.autoScrub = { btrfs.autoScrub = {
enable = true; enable = true;
interval = "weekly"; interval = "weekly";
fileSystems = ["/"]; fileSystems = ["/"];
}; };
# Temporarily ban IPs for SSH after failed login attempts
fail2ban = {
enable = true;
};
greetd = {
enable = false;
restart = false;
useTextGreeter = true;
settings = {
terminal.vt = 1;
default_session = {
# command = "${pkgs.tuigreet}/bin/tuigreet --time --cmd $SHELL";
command = "${pkgs.tuigreet}/bin/tuigreet --time --cmd niri-session";
user = "greeter";
};
};
};
kmscon = { kmscon = {
enable = false; enable = false;
hwRender = true;
useXkbConfig = true; useXkbConfig = true;
# autologinUser = username; # autologinUser = username;
config = let fonts = [
color = config.home-manager.users.${username}.homemodules.color; {
in { name = "MonoLisa Alt Script";
# term=xterm-256color package = pkgs.monolisa;
}
hwaccel = true; ];
font-name = color.font;
font-size = 14;
mode = "3440x1440";
palette = "custom";
palette-black = "0,0,0";
pallette-white = "255,255,255";
palette-red = color.rgbS.red;
palette-light-red = color.rgbS.red;
palette-green = color.rgbS.green;
palette-light-green = color.rgbS.green;
palette-yellow = color.rgbS.yellow;
palette-light-yellow = color.rgbS.yellow;
palette-blue = color.rgbS.blue;
palette-light-blue = color.rgbS.blue;
palette-magenta = color.rgbS.pink;
palette-light-magenta = color.rgbS.pink;
palette-cyan = color.rgbS.teal;
palette-light-cyan = color.rgbS.teal;
palette-foreground = color.rgbS.text;
palette-background = "0,0,0";
};
# NOTE: Do NOT use multline strings here! # NOTE: Do NOT use multline strings here!
# This will create a linebreak in the systemd service and break login! # This will create a linebreak in the systemd service and break login!
extraOptions = ""; extraOptions = "";
extraConfig = let
color = config.home-manager.users.${username}.homemodules.color;
in ''
# term=xterm-256color
font-size=14
mode=3440x1440
palette=custom
palette-black=0,0,0
pallette-white=255,255,255
palette-red=${color.rgbS.red}
palette-light-red=${color.rgbS.red}
palette-green=${color.rgbS.green}
palette-light-green=${color.rgbS.green}
palette-yellow=${color.rgbS.yellow}
palette-light-yellow=${color.rgbS.yellow}
palette-blue=${color.rgbS.blue}
palette-light-blue=${color.rgbS.blue}
palette-magenta=${color.rgbS.pink}
palette-light-magenta=${color.rgbS.pink}
palette-cyan=${color.rgbS.teal}
palette-light-cyan=${color.rgbS.teal}
palette-foreground=${color.rgbS.text}
palette-background=0,0,0
'';
}; };
openssh = { openssh = {
+95 -96
View File
@@ -82,8 +82,7 @@
}; };
"swap" = { "swap" = {
mountpoint = "/swap"; mountpoint = "/swap";
# Configured in hardware-configuration.nix swap.swapfile.size = "16G";
# swap.swapfile.size = "64G";
}; };
}; };
}; };
@@ -93,101 +92,101 @@
}; };
}; };
# games = { games = {
# type = "disk"; type = "disk";
# device = "/dev/disk/by-id/nvme-WD_BLACK_SN850X_2000GB_231623802252"; device = "/dev/disk/by-id/nvme-WD_BLACK_SN850X_2000GB_231623802252";
# content = { content = {
# type = "gpt"; type = "gpt";
# partitions = { partitions = {
# luks = { luks = {
# label = "LUKS_GAMES"; label = "LUKS_GAMES";
# size = "100%"; size = "100%";
# content = { content = {
# type = "luks"; type = "luks";
# name = "crypted_games"; name = "crypted_games";
#
# extraOpenArgs = [
# "--perf-no_read_workqueue"
# "--perf-no_write_workqueue"
# ];
#
# settings = {
# allowDiscards = true;
# crypttabExtraOpts = ["fido2-device=auto" "token-timeout=10" "tries=5"];
#
# # Disable for interactive password entry
# # This is contained on the main disk, so by unlocking the main disk with the password,
# # the second disk can unlock automatically
# keyFile = "/persist/home/christoph/.secrets/luks.keyfile";
# fallbackToPassword = false;
# };
#
# content = {
# type = "btrfs";
# extraArgs = ["-L" "GAMES" "-f"];
# subvolumes = {
# "data" = {
# mountpoint = "/home/christoph/Games";
# mountOptions = [
# "compress=zstd"
# "noatime"
# ];
# };
# };
# };
# };
# };
# };
# };
# };
# ssd = { extraOpenArgs = [
# type = "disk"; "--perf-no_read_workqueue"
# device = "/dev/disk/by-id/nvme-eui.00253857019ebd67"; "--perf-no_write_workqueue"
# content = { ];
# type = "gpt";
# partitions = { settings = {
# luks = { allowDiscards = true;
# label = "LUKS_SSD"; crypttabExtraOpts = ["fido2-device=auto" "token-timeout=10" "tries=5"];
# size = "100%";
# content = { # Disable for interactive password entry
# type = "luks"; # This is contained on the main disk, so by unlocking the main disk with the password,
# name = "crypted_ssd"; # the second disk can unlock automatically
# keyFile = "/persist/home/christoph/.secrets/luks.keyfile";
# extraOpenArgs = [ fallbackToPassword = false;
# "--perf-no_read_workqueue" };
# "--perf-no_write_workqueue"
# ]; content = {
# type = "btrfs";
# settings = { extraArgs = ["-L" "GAMES" "-f"];
# allowDiscards = true; subvolumes = {
# crypttabExtraOpts = ["fido2-device=auto" "token-timeout=10" "tries=5"]; "data" = {
# mountpoint = "/home/christoph/Games";
# # Disable for interactive password entry mountOptions = [
# # This is contained on the main disk, so by unlocking the main disk with the password, "compress=zstd"
# # the second disk can unlock automatically "noatime"
# keyFile = "/persist/home/christoph/.secrets/luks.keyfile"; ];
# fallbackToPassword = false; };
# }; };
# };
# content = { };
# type = "btrfs"; };
# extraArgs = ["-L" "SSD" "-f"]; };
# subvolumes = { };
# "data" = { };
# mountpoint = "/home/christoph/SSD";
# mountOptions = [ ssd = {
# "compress=zstd" type = "disk";
# "noatime" device = "/dev/disk/by-id/nvme-eui.00253857019ebd67";
# ]; content = {
# }; type = "gpt";
# }; partitions = {
# }; luks = {
# }; label = "LUKS_SSD";
# }; size = "100%";
# }; content = {
# }; type = "luks";
# }; name = "crypted_ssd";
extraOpenArgs = [
"--perf-no_read_workqueue"
"--perf-no_write_workqueue"
];
settings = {
allowDiscards = true;
crypttabExtraOpts = ["fido2-device=auto" "token-timeout=10" "tries=5"];
# Disable for interactive password entry
# This is contained on the main disk, so by unlocking the main disk with the password,
# the second disk can unlock automatically
keyFile = "/persist/home/christoph/.secrets/luks.keyfile";
fallbackToPassword = false;
};
content = {
type = "btrfs";
extraArgs = ["-L" "SSD" "-f"];
subvolumes = {
"data" = {
mountpoint = "/home/christoph/SSD";
mountOptions = [
"compress=zstd"
"noatime"
];
};
};
};
};
};
};
};
};
}; };
}; };
+8 -6
View File
@@ -121,13 +121,18 @@
fsType = "nfs"; fsType = "nfs";
options = ["defaults" "rw" "noatime" "_netdev" "bg" "hard"]; options = ["defaults" "rw" "noatime" "_netdev" "bg" "hard"];
}; };
"/media/Box" = {
device = "192.168.86.20:/mnt/Seagate4TB/Box";
fsType = "nfs";
options = ["defaults" "rw" "relatime" "_netdev" "bg" "hard"];
};
}; };
swapDevices = [ swapDevices = [
{ {
device = "/swap/swapfile"; device = "/var/swap";
size = 1024 * 64; # Without hibernation 4.0 GB to 0.5 x RAM size = 1024 * 16; # Without hibernation 4.0 GB to 0.5 x RAM
randomEncryption.enable = false; # The disk is already encrypted. Useless and might lead to system freeze.
} }
]; ];
@@ -160,9 +165,6 @@
# https://discourse.nixos.org/t/nvidia-open-breaks-hardware-acceleration/58770/3 # https://discourse.nixos.org/t/nvidia-open-breaks-hardware-acceleration/58770/3
nvidia-vaapi-driver # Experimental, doesn't work with chromium nvidia-vaapi-driver # Experimental, doesn't work with chromium
# Hdr in games with DXVK_HDR=1 ENABLE_HDR_WSI=1
vulkan-hdr-layer-kwin6
]; ];
}; };
+5 -11
View File
@@ -19,12 +19,12 @@
../services/formula10.nix ../services/formula10.nix
../services/formula11.nix ../services/formula11.nix
../services/formula12.nix ../services/formula12.nix
# ../services/statespaces.nix ../services/statespaces.nix
# General services # General services
../services/arcane-agent.nix
../services/authelia.nix ../services/authelia.nix
../services/bazarr.nix ../services/bazarr.nix
../services/box.nix
../services/fileflows.nix ../services/fileflows.nix
../services/gitea.nix ../services/gitea.nix
../services/immich.nix ../services/immich.nix
@@ -32,12 +32,11 @@
../services/kiwix.nix ../services/kiwix.nix
../services/kopia.nix ../services/kopia.nix
../services/nextcloud.nix ../services/nextcloud.nix
../services/ntfy.nix
../services/nginx-proxy-manager.nix ../services/nginx-proxy-manager.nix
../services/paperless.nix ../services/paperless.nix
# ../services/plex.nix # Their monetization strategy is absolutely atrocious # ../services/plex.nix # Their monetization strategy is absolutely atrocious
# ../services/portainer-agent.nix ../services/portainer-agent.nix
# ../services/pulse-agent-servenix.nix ../services/pulse-agent-servenix.nix
../services/prowlarr.nix ../services/prowlarr.nix
../services/radarr.nix ../services/radarr.nix
../services/sabnzbd-movies.nix ../services/sabnzbd-movies.nix
@@ -45,7 +44,7 @@
../services/sonarr.nix ../services/sonarr.nix
../services/teamspeak.nix ../services/teamspeak.nix
../services/tinymediamanager.nix ../services/tinymediamanager.nix
# ../services/whats-up-docker.nix ../services/whats-up-docker.nix
]; ];
systemmodules = { systemmodules = {
@@ -85,7 +84,6 @@
443 # HTTPS (Nginx Proxy Manager) 443 # HTTPS (Nginx Proxy Manager)
3000 # Gitea (runner needs to reach local gitea instance) 3000 # Gitea (runner needs to reach local gitea instance)
3553 # Arcane
30033 # Teamspeak 30033 # Teamspeak
10080 # Teamspeak 10080 # Teamspeak
@@ -98,7 +96,6 @@
443 # HTTPS (Nginx Proxy Manager) 443 # HTTPS (Nginx Proxy Manager)
3000 # Gitea (runner needs to reach local gitea instance) 3000 # Gitea (runner needs to reach local gitea instance)
3553 # Arcane
5520 # HyTale 5520 # HyTale
@@ -113,9 +110,6 @@
"kopia-server-password" "kopia-server-password"
"kopia-user-password" "kopia-user-password"
"paperless-nextcloud-sync-password" "paperless-nextcloud-sync-password"
"ntfy-auth-users"
"ntfy-auth-tokens"
"arcane-agent-key"
]; ];
}; };
+7 -1
View File
@@ -69,6 +69,12 @@
fsType = "nfs"; fsType = "nfs";
options = ["defaults" "rw" "relatime" "_netdev" "bg" "hard"]; options = ["defaults" "rw" "relatime" "_netdev" "bg" "hard"];
}; };
"/media/Box" = {
device = "192.168.86.20:/mnt/Seagate4TB/Box";
fsType = "nfs";
options = ["defaults" "rw" "relatime" "_netdev" "bg" "hard"];
};
}; };
swapDevices = [ swapDevices = [
@@ -86,7 +92,7 @@
nvidia-container-toolkit.enable = true; nvidia-container-toolkit.enable = true;
nvidia = { nvidia = {
package = config.boot.kernelPackages.nvidiaPackages.legacy_580; package = config.boot.kernelPackages.nvidiaPackages.stable;
modesetting.enable = false; modesetting.enable = false;
open = false; # GTX 1070 is too old for open drivers open = false; # GTX 1070 is too old for open drivers
-56
View File
@@ -1,56 +0,0 @@
{
mylib,
config,
lib,
pkgs,
...
}: let
arcaneVersion = "v2.3.0";
in {
# If we need to pass secrets to containers we can't use plain env variables.
sops.templates."arcane-agent_secrets.env".content = ''
AGENT_TOKEN=${config.sops.placeholder.arcane-agent-key}
'';
virtualisation.oci-containers.containers = {
arcane-agent = {
image = "ghcr.io/getarcaneapp/arcane-headless:${arcaneVersion}";
autoStart = true;
login = mylib.containers.mkDockerLogin config;
dependsOn = [];
ports = [
"3553:3553"
];
volumes = [
"/var/run/docker.sock:/var/run/docker.sock"
"arcane-agent_data:/app/data"
"/media/synology-syncthing:/backups"
];
environment = {
MANAGER_API_URL = "https://arcane.think.chriphost.de";
AGENT_MODE = "true";
EDGE_TRANSPORT = "poll";
PUID = "1000";
PGID = "1000";
TZ = "Europe/Berlin";
};
environmentFiles = [
config.sops.templates."arcane-agent_secrets.env".path
];
extraOptions = [
# "--privileged"
# "--device=nvidia.com/gpu=all"
"--net=behind-nginx"
];
};
};
}
-55
View File
@@ -1,55 +0,0 @@
{
mylib,
config,
lib,
pkgs,
...
}: let
arcaneVersion = "v2.3.0";
in {
# If we need to pass secrets to containers we can't use plain env variables.
sops.templates."arcane_secrets.env".content = ''
ENCRYPTION_KEY=${config.sops.placeholder.arcane-encryption-key}
JWT_SECRET=${config.sops.placeholder.arcane-jwt-secret}
'';
virtualisation.oci-containers.containers = {
arcane = {
image = "ghcr.io/getarcaneapp/manager:${arcaneVersion}";
autoStart = true;
login = mylib.containers.mkDockerLogin config;
dependsOn = [];
ports = [
# "3552:3552"
];
volumes = [
"/var/run/docker.sock:/var/run/docker.sock"
"arcane_data:/app/data"
"/media/synology-syncthing:/backups"
];
environment = {
APP_URL = "https://arcane.think.chriphost.de";
PUID = "1000";
PGID = "1000";
TZ = "Europe/Berlin";
};
environmentFiles = [
config.sops.templates."arcane_secrets.env".path
];
extraOptions = [
# "--privileged"
# "--device=nvidia.com/gpu=all"
"--net=behind-nginx"
];
};
};
}
+53
View File
@@ -0,0 +1,53 @@
{
mylib,
config,
lib,
pkgs,
...
}: let
boxVersion = "v0.30.1";
in {
virtualisation.oci-containers.containers = {
box = {
image = "stashapp/stash:${boxVersion}";
autoStart = true;
login = mylib.containers.mkDockerLogin config;
dependsOn = [];
ports = [
# "9999:9999"
];
volumes = [
"/etc/localtime:/etc/localtime:ro"
"/media/Box:/data"
"box_config:/root/.stash"
"box_metadata:/metadata"
"box_cache:/cache"
"box_blobs:/blobs"
"box_generated:/generated"
];
environment = {
PUID = "3000";
PGID = "3000";
TZ = "Europe/Berlin";
STASH_STASH = "/data/";
STASH_GENERATED = "/generated/";
STASH_METADATA = "/metadata/";
STASH_CACHE = "/cache/";
};
extraOptions = [
"--privileged"
"--device=nvidia.com/gpu=all"
"--net=behind-nginx"
];
};
};
}
+56
View File
@@ -0,0 +1,56 @@
{
mylib,
config,
lib,
pkgs,
...
}: let
# comfyuiVersion = "cu128-slim-20260316";
comfyuiVersion = "cu128-megapak-20260323";
in {
virtualisation.oci-containers.containers = {
comfyui = {
image = "yanwk/comfyui-boot:${comfyuiVersion}";
autoStart = false;
login = mylib.containers.mkDockerLogin config;
dependsOn = [];
ports = [
"8188:8188"
];
volumes = let
rootDir = "/home/christoph/Games/ComfyUI";
in [
"${rootDir}/storage:/root"
"${rootDir}/storage-models/models:/root/ComfyUI/models"
"${rootDir}/storage-models/hf-hub:/root/.cache/huggingface/hub"
"${rootDir}/storage-models/torch-hub:/root/.cache/torch/hub"
"${rootDir}/storage-user/input:/root/ComfyUI/input"
"${rootDir}/storage-user/output:/root/ComfyUI/output"
"${rootDir}/storage-user/workflows:/root/ComfyUI/user/default/workflows"
];
environment = {
PUID = "1000";
PGID = "1000";
TZ = "Europe/Berlin";
# https://github.com/Comfy-Org/ComfyUI/blob/master/comfy/cli_args.py
# --use-sage-attention # => OOM
# --lowvram
# --disable-pinned-memory
# --cache-none
# CLI_ARGS = "--use-sage-attention";
};
extraOptions = [
"--privileged"
"--device=nvidia.com/gpu=all"
# "--net=behind-nginx"
];
};
};
}
+1 -1
View File
@@ -5,7 +5,7 @@
pkgs, pkgs,
... ...
}: let }: let
fileflowsVersion = "26.06"; fileflowsVersion = "26.01";
in { in {
virtualisation.oci-containers.containers = { virtualisation.oci-containers.containers = {
fileflows-node = { fileflows-node = {
+1 -1
View File
@@ -5,7 +5,7 @@
pkgs, pkgs,
... ...
}: let }: let
version = "26.06"; version = "26.01";
in { in {
virtualisation.oci-containers.containers = { virtualisation.oci-containers.containers = {
fileflows = { fileflows = {
+2 -2
View File
@@ -5,8 +5,8 @@
pkgs, pkgs,
... ...
}: let }: let
giteaVersion = "1.27.0"; giteaVersion = "1.24.2";
runnerVersion = "0.6.1"; runnerVersion = "0.2.12";
in { in {
users = { users = {
groups.git = {}; groups.git = {};
+1 -1
View File
@@ -7,7 +7,7 @@
}: let }: let
vectorchordVersion = "0.4.2"; vectorchordVersion = "0.4.2";
pgvectorsVersion = "0.2.0"; pgvectorsVersion = "0.2.0";
immichVersion = "3.2.0-cuda"; immichVersion = "2.5.2";
in { in {
virtualisation.oci-containers.containers = { virtualisation.oci-containers.containers = {
immich-database = { immich-database = {
+1 -1
View File
@@ -5,7 +5,7 @@
pkgs, pkgs,
... ...
}: let }: let
jellyfinVersion = "version-12.1ubu2604"; jellyfinVersion = "10.11.2";
in { in {
virtualisation.oci-containers.containers = { virtualisation.oci-containers.containers = {
jellyfin = { jellyfin = {
+2 -1
View File
@@ -18,7 +18,8 @@ in {
]; ];
volumes = [ volumes = [
"/home/christoph/ssd/kiwix:/data" # TODO: Add network location for .zim files
"kiwix_data:/data"
]; ];
environment = { environment = {
+2 -13
View File
@@ -30,24 +30,20 @@ in {
volumes = let volumes = let
# TODO: Setup on ThinkNix: adguard_config, adguard_work, portainer_config # TODO: Setup on ThinkNix: adguard_config, adguard_work, portainer_config
backup = [ backup = [
"arcane-agent_data"
"authelia_config" "authelia_config"
"bazarr_config" "formula10_cache"
"fileflows_data"
"formula10_data" "formula10_data"
"formula11_pb_data" "formula11_pb_data"
"formula12_pb_data"
"gitea-db_data" "gitea-db_data"
"gitea_data"
"gitea-runner_config" "gitea-runner_config"
"gitea-runner_data" "gitea-runner_data"
"gitea_data"
"heidi_config" "heidi_config"
"immich-database_data" "immich-database_data"
"immich_config" "immich_config"
"immich_data" "immich_data"
"immich_machine-learning" "immich_machine-learning"
"jellyfin_config" "jellyfin_config"
"kopia_config"
"nextcloud-db_data" "nextcloud-db_data"
"nextcloud_data" "nextcloud_data"
"nginx_config" "nginx_config"
@@ -55,13 +51,6 @@ in {
"nginx_snippets" "nginx_snippets"
"paperless-postgres_data" "paperless-postgres_data"
"paperless_data" "paperless_data"
"prowlarr_config"
"radarr_config"
"sabnzbd-movies_config"
"sabnzbd-shows_config"
"sonarr_config"
"teamspeak_data2"
"tinymediamanager_data"
]; ];
mkVolume = name: "${name}:/data/${name}:ro"; mkVolume = name: "${name}:/data/${name}:ro";
+1 -1
View File
@@ -5,7 +5,7 @@
pkgs, pkgs,
... ...
}: let }: let
nextcloudVersion = "33.0.5-apache"; nextcloudVersion = "31.0.6-apache";
in { in {
systemd.services.nextcloud-cron = { systemd.services.nextcloud-cron = {
enable = true; enable = true;
-79
View File
@@ -1,79 +0,0 @@
{
mylib,
config,
lib,
pkgs,
...
}: let
ntfyVersion = "v2.21";
in {
# If we need to pass secrets to containers we can't use plain env variables.
sops.templates."ntfy_secrets.env".content = ''
NTFY_AUTH_USERS=${config.sops.placeholder.ntfy-auth-users}
NTFY_AUTH_TOKENS=${config.sops.placeholder.ntfy-auth-tokens}
'';
virtualisation.oci-containers.containers = {
# NTFY_AUTH_USERS='admin:$2b$10$13iMkFcSNXcb/DKlUSS03OM25saLd8/hDlKkowFtXYctu2fQBoLJK:admin,christoph:$2b$10$8jgrgBltBXj/Qw0BxBWf1eIfH53VV6wTdlJZEqWBIH3htwEP9PKgq:user'
# NTFY_AUTH_TOKENS="christoph:tk_rx8fd6hojuz4ekcb72j7juugkbmga:FAIL*-Notif"
# NTFY_BASE_URL="https://ntfy.vps.chriphost.de"
# NTFY_BEHIND_PROXY="true"
# NTFY_AUTH_FILE="/var/lib/ntfy/auth.db"
# NTFY_AUTH_DEFAULT_ACCESS="deny-all"
# NTFY_ENABLE_LOGIN="true"
# NTFY_REQUIRE_LOGIN="true"
# NTFY_ATTACHMENT_CACHE_DIR="/var/cache/ntfy/attachments"
# NTFY_CACHE_FILE="/var/cache/ntfy/cache.db"
# NTFY_UPSTREAM_BASE_URL="https://ntfy.sh"
# NTFY_AUTH_ACCESS="christoph:*:read-write"
ntfy = {
image = "binwiederhier/ntfy:${ntfyVersion}";
autoStart = true;
login = mylib.containers.mkDockerLogin config;
dependsOn = [];
ports = [
"8042:80"
];
volumes = [
"ntfy_cache:/var/cache/ntfy"
"ntfy_attachments:/var/cache/ntfy/attachments"
"ntfy_lib:/var/lib/ntfy"
"ntfy_etc:/etc/ntfy"
];
cmd = ["serve"];
environment = {
PUID = "1000";
PGID = "1000";
TZ = "Europe/Berlin";
NTFY_BASE_URL = "https://ntfy.vps.chriphost.de";
NTFY_BEHIND_PROXY = "true";
NTFY_AUTH_FILE = "/var/lib/ntfy/auth.db";
NTFY_AUTH_DEFAULT_ACCESS = "deny-all";
NTFY_ENABLE_LOGIN = "true";
NTFY_REQUIRE_LOGIN = "true";
NTFY_ATTACHMENT_CACHE_DIR = "/var/cache/ntfy/attachments";
NTFY_CACHE_FILE = "/var/cache/ntfy/cache.db";
NTFY_UPSTREAM_BASE_URL = "https://ntfy.sh";
NTFY_AUTH_ACCESS = "christoph:*:read-write";
};
environmentFiles = [
config.sops.templates."ntfy_secrets.env".path
];
extraOptions = [
# "--privileged"
# "--device=nvidia.com/gpu=all"
"--net=behind-nginx"
];
};
};
}
+2 -3
View File
@@ -5,7 +5,7 @@
pkgs, pkgs,
... ...
}: let }: let
teamspeakVersion = "6.0.0-beta11"; teamspeakVersion = "v6.0.0-beta7";
in { in {
virtualisation.oci-containers.containers = { virtualisation.oci-containers.containers = {
teamspeak = { teamspeak = {
@@ -24,8 +24,7 @@ in {
]; ];
volumes = [ volumes = [
# "teamspeak_data:/var/tsserver" "teamspeak_data:/var/tsserver"
"teamspeak_data2:/var/tsserver"
]; ];
environment = { environment = {
@@ -42,13 +42,6 @@ in {
boot.lanzaboote = { boot.lanzaboote = {
enable = true; enable = true;
autoGenerateKeys.enable = true;
# WARN: Needs persistent /var/lib/auto-cryptenroll
autoEnrollKeys = {
enable = true;
includeMicrosoftKeys = true;
};
# WARN: Make sure to persist this if using impermanence! # WARN: Make sure to persist this if using impermanence!
pkiBundle = "/var/lib/sbctl"; pkiBundle = "/var/lib/sbctl";
-5
View File
@@ -1,5 +0,0 @@
{...}: {
imports = [
./sops-nix
];
}
+1
View File
@@ -72,6 +72,7 @@ in {
if docker.podman if docker.podman
then "podman" then "podman"
else "docker"; # "docker" or "podman" else "docker"; # "docker" or "podman"
libvirtd.enable = true;
}; };
systemd.services = let systemd.services = let
-1
View File
@@ -30,7 +30,6 @@ in {
# Sans/Serif fonts # Sans/Serif fonts
noto-fonts noto-fonts
noto-fonts-color-emoji noto-fonts-color-emoji
noto-fonts-cjk-serif
noto-fonts-cjk-sans noto-fonts-cjk-sans
lxgw-wenkai lxgw-wenkai
]; ];
+5 -30
View File
@@ -69,14 +69,11 @@ in {
# https://github.com/nix-community/impermanence/issues/253 # https://github.com/nix-community/impermanence/issues/253
(mkRDir "/usr/systemd-placeholder" m755) (mkRDir "/usr/systemd-placeholder" m755)
# TODO: Why does this use the mandb user? (mkDir "mandb" "/var/cache/man" m755)
# (mkDir "mandb" "/var/cache/man" m755)
# (mkRDir "/var/cache/restic-backups-synology" m755) # (mkRDir "/var/cache/restic-backups-synology" m755)
(mkRDir "/var/db/sudo" m711) (mkRDir "/var/db/sudo" m711)
(mkRDir "/var/lib/auto-cryptenroll" m755) # Lanzaboote
(mkRDir "/var/lib/bluetooth" m755) # m700 (mkRDir "/var/lib/bluetooth" m755) # m700
(mkRDir "/var/lib/btrfs" m755) (mkRDir "/var/lib/btrfs" m755)
(mkRDir "/var/lib/containers" m755) (mkRDir "/var/lib/containers" m755)
@@ -85,7 +82,7 @@ in {
(mkRDir "/var/lib/libvirt" m755) (mkRDir "/var/lib/libvirt" m755)
(mkRDir "/var/lib/NetworkManager" m755) (mkRDir "/var/lib/NetworkManager" m755)
(mkRDir "/var/lib/nixos" m755) (mkRDir "/var/lib/nixos" m755)
(mkRDir "/var/lib/sbctl" m755) # Lanzaboote (mkRDir "/var/lib/sbctl" m755)
(mkRDir "/var/lib/systemd" m755) (mkRDir "/var/lib/systemd" m755)
(mkRDir "/var/tmp" m777) (mkRDir "/var/tmp" m777)
@@ -121,68 +118,49 @@ in {
# The shit some applications add to ~/ without asking # The shit some applications add to ~/ without asking
# (mkUDir ".android" m755) # Unity # (mkUDir ".android" m755) # Unity
(mkUDir ".claude" m755)
(mkUDir ".codex" m755)
# (mkUDir ".comfy" m755) # (mkUDir ".comfy" m755)
(mkUDir ".docker" m755) (mkUDir ".docker" m755)
# (mkUDir ".gradle" m755) # Unity # (mkUDir ".gradle" m755) # Unity
(mkUDir ".java" m755) # JetBrains (mkUDir ".java" m755) # JetBrains
(mkUDir ".lmstudio" m755)
(mkUDir ".MakeMKV" m755) (mkUDir ".MakeMKV" m755)
(mkUDir ".mozilla/firefox" m755) # TODO: Remove this someday (mkUDir ".mozilla/firefox" m755) # TODO: Remove this someday
(mkUDir ".mozilla/native-messaging-hosts" m755) (mkUDir ".mozilla/native-messaging-hosts" m755)
(mkUDir ".nix-package-search" m755) (mkUDir ".nix-package-search" m755)
(mkUDir ".npm" m755) # Contains mcp servers :/
# (mkUDir ".nv" m755) # Unity # (mkUDir ".nv" m755) # Unity
# (mkUDir ".ollama" m755) # (mkUDir ".ollama" m755)
# (mkUDir ".plastic4" m755) # Unity # (mkUDir ".plastic4" m755) # Unity
(mkUDir ".tableplus" m755)
(mkUDir ".tiddl" m755) (mkUDir ".tiddl" m755)
(mkUDir ".var/app" m755) (mkUDir ".var/app" m755)
(mkUDir ".vim/undo" m755) (mkUDir ".vim/undo" m755)
(mkUDir ".vscode" m755)
(mkUDir ".zotero" m755) (mkUDir ".zotero" m755)
# Cache that's actually useful # Cache that's actually useful
(mkUDir ".cache/claude-cli-nodejs" m755)
(mkUDir ".cache/elephant" m755)
(mkUDir ".cache/fish/generated_completions" m755) (mkUDir ".cache/fish/generated_completions" m755)
(mkUDir ".cache/nix" m755)
(mkUDir ".cache/nix-index" m755) (mkUDir ".cache/nix-index" m755)
(mkUDir ".cache/nix-search-tv" m755) (mkUDir ".cache/nix-search-tv" m755)
(mkUDir ".cache/nvim" m755) (mkUDir ".cache/nvim" m755)
(mkUDir ".cache/JetBrains" m755) (mkUDir ".cache/JetBrains" m755)
(mkUDir ".cache/keepassxc" m755)
(mkUDir ".cache/opencode" m755)
(mkUDir ".cache/uv" m755)
# Config # Config
# (mkUDir ".config/.android" m755) # Unity # (mkUDir ".config/.android" m755) # Unity
(mkUDir ".config/ai.opencode.desktop" m755)
# (mkUDir ".config/beekeeper-studio" m755)
(mkUDir ".config/beets" m755) (mkUDir ".config/beets" m755)
(mkUDir ".config/blender" m755) (mkUDir ".config/blender" m755)
(mkUDir ".config/chromium" m755) (mkUDir ".config/chromium" m755) # TODO: Remove this someday
(mkUDir ".config/Claude" m755) # Claude desktop
(mkUDir ".config/Code" m755)
(mkUDir ".config/Codex" m755)
(mkUDir ".config/Ferdium" m755) (mkUDir ".config/Ferdium" m755)
(mkUDir ".config/feishin" m755) (mkUDir ".config/feishin" m755)
(mkUDir ".config/fish/completions" m755) (mkUDir ".config/fish/completions" m755)
(mkUDir ".config/ghidra" m755) (mkUDir ".config/ghidra" m755)
(mkUDir ".config/impermanence" m755) (mkUDir ".config/impermanence" m755)
(mkUDir ".config/jellyfin-mpv-shim" m755) (mkUDir ".config/jellyfin-mpv-shim" m755)
# (mkUDir ".config/jellyfin-tui" m755) # Configured using nix (mkUDir ".config/jellyfin-tui" m755) # TODO: Generate this config file, have to use sops because it includes the password in cleartext
(mkUDir ".config/JetBrains" m755) (mkUDir ".config/JetBrains" m755)
(mkUDir ".config/kdeconnect" m755) (mkUDir ".config/kdeconnect" m755)
(mkUDir ".config/keepassxc" m755) (mkUDir ".config/keepassxc" m755)
(mkUDir ".config/LM Studio" m755)
(mkUDir ".config/Msty" m755) (mkUDir ".config/Msty" m755)
(mkUDir ".config/Nextcloud" m755) (mkUDir ".config/Nextcloud" m755)
# (mkUDir ".config/niri/dms" m755) (mkUDir ".config/niri/dms" m755)
(mkUDir ".config/obsidian" m755) (mkUDir ".config/obsidian" m755)
(mkUDir ".config/obs-studio" m755) (mkUDir ".config/obs-studio" m755)
(mkUDir ".config/opencode" m755)
(mkUDir ".config/Signal" m755) (mkUDir ".config/Signal" m755)
# (mkUDir ".config/singularitygroup-hotreload" m755) # Unity # (mkUDir ".config/singularitygroup-hotreload" m755) # Unity
(mkUDir ".config/TeamSpeak" m755) (mkUDir ".config/TeamSpeak" m755)
@@ -190,7 +168,6 @@ in {
(mkUDir ".config/tidal_dl_ng" m755) (mkUDir ".config/tidal_dl_ng" m755)
# (mkUDir ".config/unity3d" m755) # Unity # (mkUDir ".config/unity3d" m755) # Unity
# (mkUDir ".config/unityhub" m755) # Unity # (mkUDir ".config/unityhub" m755) # Unity
(mkUDir ".config/Vector 35" m755)
(mkUDir ".config/vlc" m755) (mkUDir ".config/vlc" m755)
(mkUDir ".config/Zeal" m755) (mkUDir ".config/Zeal" m755)
(mkUDir ".config/zed" m755) (mkUDir ".config/zed" m755)
@@ -214,7 +191,6 @@ in {
(mkUDir ".local/share/net.lrclib.lrcget" m755) (mkUDir ".local/share/net.lrclib.lrcget" m755)
(mkUDir ".local/share/nix" m755) (mkUDir ".local/share/nix" m755)
(mkUDir ".local/share/nvim" m755) (mkUDir ".local/share/nvim" m755)
(mkUDir ".local/share/opencode" m755)
(mkUDir ".local/share/qutebrowser" m755) (mkUDir ".local/share/qutebrowser" m755)
(mkUDir ".local/share/systemd" m755) (mkUDir ".local/share/systemd" m755)
# (mkUDir ".local/share/unity3d" m755) # Unity # (mkUDir ".local/share/unity3d" m755) # Unity
@@ -227,7 +203,6 @@ in {
(mkUDir ".local/state/lazygit" m755) (mkUDir ".local/state/lazygit" m755)
(mkUDir ".local/state/nix" m755) (mkUDir ".local/state/nix" m755)
(mkUDir ".local/state/nvim" m755) (mkUDir ".local/state/nvim" m755)
(mkUDir ".local/state/opencode" m755)
(mkUDir ".local/state/waypaper" m755) (mkUDir ".local/state/waypaper" m755)
(mkUDir ".local/state/wireplumber" m755) (mkUDir ".local/state/wireplumber" m755)
]; ];
+1 -6
View File
@@ -21,7 +21,7 @@ in {
${mime.defaultTextEditor} = mime.textTypes; ${mime.defaultTextEditor} = mime.textTypes;
${mime.defaultFileBrowser} = ["inode/directory"]; ${mime.defaultFileBrowser} = ["inode/directory"];
${mime.defaultWebBrowser} = mime.webTypes; ${mime.defaultWebBrowser} = mime.webTypes;
${mime.defaultPdfViewer} = ["application/pdf" "application/epub+zip"]; ${mime.defaultPdfViewer} = ["application/pdf"];
${mime.defaultImageViewer} = mime.imageTypes; ${mime.defaultImageViewer} = mime.imageTypes;
# If audio and video player are equal, we assign all types to the audio player, # If audio and video player are equal, we assign all types to the audio player,
@@ -75,11 +75,6 @@ in {
"chromium-browser.desktop" "chromium-browser.desktop"
"com.google.Chrome.desktop" "com.google.Chrome.desktop"
"firefox.desktop" "firefox.desktop"
"org.onlyoffice.desktopeditors.desktop"
"calibre-ebook-edit.desktop"
"calibre-ebook-viewer.desktop"
"calibre-gui.desktop"
"calibre-lrfviewer.desktop"
]; ];
"text/plain" = [ "text/plain" = [
"firefox.desktop" "firefox.desktop"
+3 -9
View File
@@ -26,23 +26,17 @@ in {
defaultSopsFile = ./secrets.yaml; defaultSopsFile = ./secrets.yaml;
age = { age = {
keyFile = lib.mkDefault "${config.users.users.${username}.home}/.secrets/age/age.key"; keyFile = lib.mkDefault "/home/${username}/.secrets/age/age.key";
generateKey = false; generateKey = false;
sshKeyPaths = []; sshKeyPaths = [];
}; };
secrets = let secrets = let
mkSecret = name: { mkSecret = name: {
${name} = lib.mkMerge [ ${name} = {
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
owner = config.users.users.${username}.name; owner = config.users.users.${username}.name;
group = config.users.users.${username}.group; group = config.users.users.${username}.group;
}) };
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
owner = config.users.users.${username}.name;
group = "staff"; # Apparently there's no way to get the primary group?
})
];
}; };
mkBootSecret = name: { mkBootSecret = name: {
+6 -14
View File
@@ -5,34 +5,27 @@ user-password: ENC[AES256_GCM,data:okgvaTTesCDwriI8PxhNdHZF8XgzB4yxapuFl2/CK8x4W
ssh-private-key: ENC[AES256_GCM,data:JrRarfeS3y6b9gxg4Za5GIc5Ci3aGR+OyZxQybj4dcv2mzxXmT/bm7KOwM1zkz1PFl1xW5X82T5jte+XQOKx0+6m4ovjUgUmQUMP4E/yosp8XSdi0+YlUKBEHEJx6HqCZy+v6qx5kfp9JC6fZqCbL1J6FIqWqAoKTFXoiou1YnhmBa2fM17Q++i6TflDWiVrUS7X9xjuZFq1hz1aQXS303uvJEUOEpXdqPyJvUKJWzVsFrAwpa9FG+reO70SSc+1hBbqdw1QjrzNWh3eNnztwZURauJtVFBYUZ5ozHmWBr4aVFjYvqz+t6G1SAunmBRbVqbH4bjBv9jXXjHAB4U0wanvkJN2C+EY1zxwjyx2fWckMdhoLr9gtC1FJKMbV49UFHJ3iXWNczKj1t7LrctehEKXJa0Eb3UogYuaRxbVYbC++kD8LvL4AY8ertgc9/pxQQZmogdINJmIxKN4HTlGbX8kSDLbohZLheOfzZ5ycTlrbOjfJ1EBMLo+mJcMUW0qhFySl1aamPqTeII7lvgTOE3xV/d/9VAQTFKsftWPNkfhAJIym51bYrrMPV8AVeFQnLhSid3d3zK4w20zIQKSYnq9A8zcNhM0keddiv4XC+M=,iv:7HP7VCFpMRZXRD6GD/zFzDSBO02V/DyxKLmuDCLXTLU=,tag:Ugx81JwCP8HmhtflYoevLg==,type:str] ssh-private-key: ENC[AES256_GCM,data:JrRarfeS3y6b9gxg4Za5GIc5Ci3aGR+OyZxQybj4dcv2mzxXmT/bm7KOwM1zkz1PFl1xW5X82T5jte+XQOKx0+6m4ovjUgUmQUMP4E/yosp8XSdi0+YlUKBEHEJx6HqCZy+v6qx5kfp9JC6fZqCbL1J6FIqWqAoKTFXoiou1YnhmBa2fM17Q++i6TflDWiVrUS7X9xjuZFq1hz1aQXS303uvJEUOEpXdqPyJvUKJWzVsFrAwpa9FG+reO70SSc+1hBbqdw1QjrzNWh3eNnztwZURauJtVFBYUZ5ozHmWBr4aVFjYvqz+t6G1SAunmBRbVqbH4bjBv9jXXjHAB4U0wanvkJN2C+EY1zxwjyx2fWckMdhoLr9gtC1FJKMbV49UFHJ3iXWNczKj1t7LrctehEKXJa0Eb3UogYuaRxbVYbC++kD8LvL4AY8ertgc9/pxQQZmogdINJmIxKN4HTlGbX8kSDLbohZLheOfzZ5ycTlrbOjfJ1EBMLo+mJcMUW0qhFySl1aamPqTeII7lvgTOE3xV/d/9VAQTFKsftWPNkfhAJIym51bYrrMPV8AVeFQnLhSid3d3zK4w20zIQKSYnq9A8zcNhM0keddiv4XC+M=,iv:7HP7VCFpMRZXRD6GD/zFzDSBO02V/DyxKLmuDCLXTLU=,tag:Ugx81JwCP8HmhtflYoevLg==,type:str]
nix-github-token: ENC[AES256_GCM,data:AXV0ODLhfa4M6+7clulfIKm0qCOeo3lQ+66iYgoDeR12RxZOV19UtA==,iv:1XECVKyzH3NumKwRSPKNlUwJMLFwptcG8DQ09U4LrGk=,tag:QdtvJNV8BttWjhH4v0RtRQ==,type:str] nix-github-token: ENC[AES256_GCM,data:AXV0ODLhfa4M6+7clulfIKm0qCOeo3lQ+66iYgoDeR12RxZOV19UtA==,iv:1XECVKyzH3NumKwRSPKNlUwJMLFwptcG8DQ09U4LrGk=,tag:QdtvJNV8BttWjhH4v0RtRQ==,type:str]
docker-password: ENC[AES256_GCM,data:mK5YWEQPKWBtVCgRBZvwWTdVAi8MEGbLnLeP7hfDkcc=,iv:Az8+eAK6R6xssmmbhuEsDbLU+ks8lS+qzc4L33WfefA=,tag:NSXvRhbIuRZZqRR28Tu0PQ==,type:str] docker-password: ENC[AES256_GCM,data:mK5YWEQPKWBtVCgRBZvwWTdVAi8MEGbLnLeP7hfDkcc=,iv:Az8+eAK6R6xssmmbhuEsDbLU+ks8lS+qzc4L33WfefA=,tag:NSXvRhbIuRZZqRR28Tu0PQ==,type:str]
jellyfin-password: ENC[AES256_GCM,data:ugfwgpkIiLY0O+m/UGnBB5AFPBkCcai+RQOkxiCSohE=,iv:VP+Jyv2lUIBz1dFow038uN0KT+tQKK9uGr7/T5crlgk=,tag:rPGPpaqZApfHkecLBSs4Yw==,type:str]
# #
#ENC[AES256_GCM,data:y5dlZFhK38dR+Q==,iv:1JYizUeyWeMR4KUblkj7kVSHPCL5l8mFpaQdo774BcM=,tag:kUTnBZb46KYQyi8bgIYSOQ==,type:comment] #ENC[AES256_GCM,data:y5dlZFhK38dR+Q==,iv:1JYizUeyWeMR4KUblkj7kVSHPCL5l8mFpaQdo774BcM=,tag:kUTnBZb46KYQyi8bgIYSOQ==,type:comment]
# #
makemkv-app-key: ENC[AES256_GCM,data:/pTxr4q4ucJLx5VI8ySzOgd4g1s+6lcZNe4crxRmidTYrhJ0I6V3CIhm4wLC105W+Xka6HIZTqPn8SbqcMC4Dt3wSus=,iv:aYsGobD+Vl/VUNAHcAxQb7HEmLT8aXyKNOELgzvKDH4=,tag:xhnVb/ns6VZEnTuoUv9w5A==,type:str] makemkv-app-key: ENC[AES256_GCM,data:/pTxr4q4ucJLx5VI8ySzOgd4g1s+6lcZNe4crxRmidTYrhJ0I6V3CIhm4wLC105W+Xka6HIZTqPn8SbqcMC4Dt3wSus=,iv:aYsGobD+Vl/VUNAHcAxQb7HEmLT8aXyKNOELgzvKDH4=,tag:xhnVb/ns6VZEnTuoUv9w5A==,type:str]
restic-repo-key: ENC[AES256_GCM,data:lSFuhjbhdQq4cabAVFGQ4kuaJxb7EhXgBDlgoEQWJhs=,iv:7IhGDBYEwY1TwLvc/4DOkUBQ3eqSszZcKwnT7Lllfps=,tag:yJVlMi9X0W+Kh3zMkb0QuA==,type:str] restic-repo-key: ENC[AES256_GCM,data:lSFuhjbhdQq4cabAVFGQ4kuaJxb7EhXgBDlgoEQWJhs=,iv:7IhGDBYEwY1TwLvc/4DOkUBQ3eqSszZcKwnT7Lllfps=,tag:yJVlMi9X0W+Kh3zMkb0QuA==,type:str]
context7-api-key: ENC[AES256_GCM,data:lZfrz5pBDybBkswgZM3jKLM9bdXOXeFUI9wFB8BJ5aLYqmf2oRHIJi/85w==,iv:MQYZKsTG++CYfpJret1WSv7+q2ZmONCDl4OwdRo+YUk=,tag:MrWBn3CKDUDZLLIFZWV0tA==,type:str]
obsidian-rest-api-key: ENC[AES256_GCM,data:+CmQAX0AoSmCPMF9QL3NkWVArt7N0Ci9obHKpwQUPolcdsTnAsPMWu6GAWVvqs8Qmjz5Hk3gwM0YP2JdLEF0cw==,iv:U1SsPdiJIT7q+md1Q61Ro530s7vrl+XBgu+6/ffcrEQ=,tag:xrTRPve9DcumQjlr+aKsLg==,type:str]
# #
#ENC[AES256_GCM,data:Raagjz1qPvXC,iv:OSWTKaIlmo1paU2ZZn20XMeZ2gdM52pHmVZ3m2ngCdI=,tag:bPCdvjOFjpxxkrwA7Mhl5Q==,type:comment] #ENC[AES256_GCM,data:Raagjz1qPvXC,iv:OSWTKaIlmo1paU2ZZn20XMeZ2gdM52pHmVZ3m2ngCdI=,tag:bPCdvjOFjpxxkrwA7Mhl5Q==,type:comment]
# #
heidi-discord-token: ENC[AES256_GCM,data:FYvfUn8tG7glqIomSDj9rGyNQjnHSCsD/C3Kk/JR1vm/xkrxzXwP3rpyxAzqRQ7vd+zFBf2BJfV/zMk=,iv:b+aKcu98rxslEGSYf6t/jGwPfS256WQ3B/iuQ4Qeykk=,tag:e48Q0BraIvItyD2WBfbYEA==,type:str] heidi-discord-token: ENC[AES256_GCM,data:FYvfUn8tG7glqIomSDj9rGyNQjnHSCsD/C3Kk/JR1vm/xkrxzXwP3rpyxAzqRQ7vd+zFBf2BJfV/zMk=,iv:b+aKcu98rxslEGSYf6t/jGwPfS256WQ3B/iuQ4Qeykk=,tag:e48Q0BraIvItyD2WBfbYEA==,type:str]
kopia-server-username: ENC[AES256_GCM,data:4onewFkWpi9g,iv:aA4WSS8T6KUcGbAIHDd8BjE0sRK/Qz0j4QvEnKdlt2U=,tag:FQlB0Wx2u8wT3TKIhMAyLg==,type:str] kopia-server-username: ENC[AES256_GCM,data:4onewFkWpi9g,iv:aA4WSS8T6KUcGbAIHDd8BjE0sRK/Qz0j4QvEnKdlt2U=,tag:FQlB0Wx2u8wT3TKIhMAyLg==,type:str]
kopia-server-password: ENC[AES256_GCM,data:6nMnhRA=,iv:Qz9qP+m0obzL+eHFmW1qVmc/0TR4Iw4X1GL4zACOSMk=,tag:v3v+33+g4y6se5q+b4e8mA==,type:str] kopia-server-password: ENC[AES256_GCM,data:6nMnhRA=,iv:Qz9qP+m0obzL+eHFmW1qVmc/0TR4Iw4X1GL4zACOSMk=,tag:v3v+33+g4y6se5q+b4e8mA==,type:str]
kopia-user-password: ENC[AES256_GCM,data:W8BdbqI=,iv:JoH0ig8X+h/+bmQvzWnDo8yu1SZyE8fCwTLyyZHmDAI=,tag:foH5Es/5CBOysD4JjQzDdA==,type:str] kopia-user-password: ENC[AES256_GCM,data:jPWeru4e2w9qzA==,iv:WpZS3Qmx8v12v3q1Lq1YrPnWw7BY0FhxurXYuaOdfwA=,tag:+8bQAnHRh55rUMdyoK6N8w==,type:str]
paperless-nextcloud-sync-password: ENC[AES256_GCM,data:pfLg3OVBqLsM4R7mSgLQEachj9gMkexPjBMSyzU=,iv:XBe1cdwlTjPfQW70NIEjD8CikK58iGErI9ZTlLWtCA4=,tag:qO35GdjljgS3/z5/1fCOFg==,type:str] paperless-nextcloud-sync-password: ENC[AES256_GCM,data:pfLg3OVBqLsM4R7mSgLQEachj9gMkexPjBMSyzU=,iv:XBe1cdwlTjPfQW70NIEjD8CikK58iGErI9ZTlLWtCA4=,tag:qO35GdjljgS3/z5/1fCOFg==,type:str]
ntfy-auth-users: ENC[AES256_GCM,data:IHnJJgUL9RqkEAoJ2Q9Oo0RkfgLXG7vih5NFPrPNBoIzMafdLXxHqNOAd1oRaOUd6AKmWdQ3uKAZINj7oGZEKMsMxUEv1WW6IXUuPnDeJe5EthINWCuaW2Z64PJl+uqgnWr4wDi7QT0zwjb/oL3gYfjH1xtfMadTzkWbmnxQ9jlP/nXe9JR1/oCrHv3dio5uU017cA==,iv:JmWnu25ZB/qqI2RsgHQ0bcat69V7p5MJ6cf5eFcSsns=,tag:6Z2LseCav/qyLh2nn+7uuw==,type:str]
ntfy-auth-tokens: ENC[AES256_GCM,data:C23r9djvEukUgDDloFGm52spwcW1DB5Jcwt9kxghLjL3vNiQ9HzGrvlSl5oEppoNa23BF0+t,iv:O9LepUKGbyXTHMvwn1avdJEhcMgtr2Sb1imIJ8ALMYY=,tag:o3g6f7YZL2VfgfeymzJK1g==,type:str]
arcane-agent-key: ENC[AES256_GCM,data:jbk1yiE1R2teclJc233qVvHOf+fvmQR/trPoVPMmnLz12rPFa/pciwaIne2SjacpJjxzqYDuJJqcwdYtOXAHzLBCXaQ=,iv:tZGQxfaUEccH/n62H5oP8X3K+UWrIvmthiywpSrejkY=,tag:UEGPBox7j2qiF+uyWRTZaw==,type:str]
# #
#ENC[AES256_GCM,data:Gdh/hjCaOuAE,iv:XjPXn3SskpUPUkDIEDl5701/g9QhuS83fACMaoPMiIM=,tag:Q7s8xZG/GsOtQrasekBnkQ==,type:comment] #ENC[AES256_GCM,data:Gdh/hjCaOuAE,iv:XjPXn3SskpUPUkDIEDl5701/g9QhuS83fACMaoPMiIM=,tag:Q7s8xZG/GsOtQrasekBnkQ==,type:comment]
# #
wireguard-vps-private-key: ENC[AES256_GCM,data:B6IWYuzKV9YZ+G9GIjOsXVEVugwMY14PrwmYyHsFAJEb1OJRXMg8+zeFnqs=,iv:2QroGA10UVSmNIBHFSTeCgMBD3VjtiUnng3pkR/mPVQ=,tag:FGlCrmdccgsObyut6E5ggA==,type:str] wireguard-vps-private-key: ENC[AES256_GCM,data:B6IWYuzKV9YZ+G9GIjOsXVEVugwMY14PrwmYyHsFAJEb1OJRXMg8+zeFnqs=,iv:2QroGA10UVSmNIBHFSTeCgMBD3VjtiUnng3pkR/mPVQ=,tag:FGlCrmdccgsObyut6E5ggA==,type:str]
arcane-encryption-key: ENC[AES256_GCM,data:4H2kaQwIV5m0FVv+3IlNaw85V00r8W4SQ5cOSOskljtaUkFUteHzamj9KH7NxdKY+pxFkrvwIOIAhNYQTMRBSQ==,iv:FDx8IYu7B7jENtGnFiS7U7W2pDIwz9ibfuCNL0UBX6c=,tag:WSm/SwCs8sSynXeXi3+muw==,type:str]
arcane-jwt-secret: ENC[AES256_GCM,data:BMC/Hju/FkHxXjdZrVr9xjiqs9Uny/w/k14K+b+DYgPOlPYMH+YSZQ/3/yyw5j52FNcm+lDG2drTaO0NfBKJsQ==,iv:gHU78Fw1L6Igp+Jewq5xqW39tSGvGh/HREcd+HX/nO4=,tag:KTL21t2kKWsB3zm7x+T0SA==,type:str]
sops: sops:
age: age:
- enc: | - recipient: age14ph8vrj657e7s35d60xehzuq46t9zd6pzcm6pw4jragzrvf6xs9s77usnm
enc: |
-----BEGIN AGE ENCRYPTED FILE----- -----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWSVRhVDREMXduZElrRklE YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWSVRhVDREMXduZElrRklE
R2s3Y081TGVTOCtKWVVWN0RLb0ZIT3lmMTNZCjFaNmRqb2hRVXFDSU12dFhDNmJo R2s3Y081TGVTOCtKWVVWN0RLb0ZIT3lmMTNZCjFaNmRqb2hRVXFDSU12dFhDNmJo
@@ -40,8 +33,7 @@ sops:
SURMTmh1TGIrRmtENzc0Sk4rNFJNUE0KOpjN6jkEHO+lvdWdp4P++r9SNSPWaT0h SURMTmh1TGIrRmtENzc0Sk4rNFJNUE0KOpjN6jkEHO+lvdWdp4P++r9SNSPWaT0h
FAbbvZZ/EdIk/njLEcayFN7B4ftTcD/f4XJZiyosilZnIkk76bMOHA== FAbbvZZ/EdIk/njLEcayFN7B4ftTcD/f4XJZiyosilZnIkk76bMOHA==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
recipient: age14ph8vrj657e7s35d60xehzuq46t9zd6pzcm6pw4jragzrvf6xs9s77usnm lastmodified: "2025-07-19T01:29:00Z"
lastmodified: "2026-09-14T21:08:40Z" mac: ENC[AES256_GCM,data:IzLYRuOlkUpry37sw7OB5MglntVflMjCcNiWpi7rvT2suOivLX9IT36qZFfYIbVIFXDmfsi1hsTvsPyekD7vVWQ1vkajAlGQYYTVpnO2cFrK3+TfWCyYjiD01rQBiRikybrR11zWRq6atieurDIxMUMEI7ypiqFOwpYaqSePAFc=,iv:9bc6rc4gjuiJWNjg1g0KfySqxnPjpzmlzDi/R+Iv2g4=,tag:tEwthVZAmdXbwRtoNykGrQ==,type:str]
mac: ENC[AES256_GCM,data:tfkmsJfWYV11ruw8fCUkJ2gWQAvQJ4Gmsz72LnmiCdlvzeo4x9iM268ZJnuaPRuv6BXLp2XGGA4CbqhfZbO6cRxAawVfbxY2IRSo1JWITIY8qxKLb07jDMpQu/JjJz7J5T556UEvOsW6HrK3d0xvNlJ4yQIuVCBjttKTdRu5g9Y=,iv:mV5i0xJGu6fnSNPLm9J3NDDgN+sB6iadue917UjR+oU=,tag:h/vaeQ02wK/qKANerWIywQ==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.13.3 version: 3.10.2
+5 -7
View File
@@ -16,12 +16,11 @@
# General services # General services
../services/adguard.nix ../services/adguard.nix
../services/arcane.nix
../services/nginx-proxy-manager.nix ../services/nginx-proxy-manager.nix
# ../services/portainer.nix ../services/portainer.nix
# ../services/pulse.nix ../services/pulse.nix
# ../services/pulse-agent-thinknix.nix ../services/pulse-agent-thinknix.nix
# ../services/whats-up-docker.nix ../services/whats-up-docker.nix
]; ];
systemmodules = { systemmodules = {
@@ -68,8 +67,7 @@
}; };
sops-nix.secrets.${username} = [ sops-nix.secrets.${username} = [
"arcane-encryption-key" # "wireguard-vps-private-key"
"arcane-jwt-secret"
]; ];
}; };
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

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