Compare commits

..
211 Commits
Author SHA1 Message Date
christoph ec7247bc77 Modules/Niri: Update walker menus using new mkMenu lib function 2026-03-27 01:18:26 +01:00
christoph e1d041f010 Lib/Rofi: Replace mkSimpleMenu with multi-layer-menu capable mkMenu 2026-03-27 01:18:02 +01:00
christoph 84fec63204 Modules/Impermanence: Remove dms mount 2026-03-27 00:25:45 +01:00
christoph b434aaaccc Modules/JellyfinTUI: Set jellyfin url depending on system (nixos/darwin) 2026-03-26 21:43:41 +01:00
christoph 4639fd8c7e Modules/JellyfinTUI: Generate config in path depending on system (nixos/darwin) 2026-03-26 21:35:53 +01:00
christoph 7f22089765 Modules/Sops: Don't hardcode age keyFile path 2026-03-26 21:24:28 +01:00
christoph 8c53eaf570 Modules/JellyfinTUI: Reference nixos/darwin config depending on system 2026-03-26 21:13:04 +01:00
christoph c9a4b1a428 System/Darwinix: Set sops bootSecrets 2026-03-26 21:03:21 +01:00
christoph 288496afa1 Flake: Import sops module on nix-darwin 2026-03-26 21:02:11 +01:00
christoph 34f61d4f27 Modules/Sops: Update secret definitions for nix-darwin 2026-03-26 21:00:38 +01:00
christoph 77f169fef4 Lib/Nixos: Import compatible systemmodules into darwin system 2026-03-26 20:49:50 +01:00
christoph 8576db096f System/Darwinix: Import sops secrets 2026-03-26 20:46:38 +01:00
christoph d20ce66646 Modules/JellyfinTUI: Include + enable module, disable impermanence 2026-03-26 20:46:30 +01:00
christoph 226b72dccf Config/Navi: Update sops secrets file path 2026-03-26 20:45:44 +01:00
christoph 6147801194 Modules/JellyfinTUI: Init module 2026-03-26 20:38:36 +01:00
christoph a1b8bc9555 System/Nixinator: Enable linux_zen 2026-03-26 20:15:12 +01:00
christoph 83ffca5e21 Modules/Packages: Update protonvpn-gui package name 2026-03-26 20:15:03 +01:00
christoph eb782a67cb Modules/Niri: Update gtk config after HM update 2026-03-26 20:14:47 +01:00
christoph 85a12edbcc Flake: Update lock 2026-03-26 15:22:55 +01:00
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
100 changed files with 2356 additions and 4669 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 |
|-|-|-|-|
| `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 |
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.
## Usage
## NixFlake/home
```bash
# Enter dev shell (provides helper utilities)
nix develop
Contains all the home-manager configurations.
# Rebuild system + user config together
nh os switch
nh os boot
- There is a common configuration for each user: `NixFlake/home/<username>/default.nix`
- There is a configuration for a single system of this user: `NixFlake/home/<username>/<hostname>/default.nix`
- Home-Manager modules are located in `NixFlake/home/homemodules`
# Or with nixos-rebuild
sudo nixos-rebuild switch --flake .#nixinator
```
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.
## 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:
1. **Common Config**: `system/default.nix` (NixOS) / `home/christoph/default.nix` (home-manager)
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).
Contains all overlays, e.g. package version overrides.
The `NixFlake/overlays/default.nix` imports all overlays and all derivations.
It is then imported by the top-level `NixFlake/flake.nix`, to make everything available to the system/home configurations.
+18 -45
View File
@@ -98,65 +98,38 @@ rec {
buildDebug = mkBuildScript "Debug";
buildRelease = mkBuildScript "Release";
# Add project-local fish abbrs here
abbrs = {
# Use this to specify commands that should be ran after entering fish shell
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:
# 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++:
# cmake-debug = "${cmakeDebug}";
# cmake-release = "${cmakeRelease}";
# build-debug = "${buildDebug}";
# build-release = "${buildRelease}";
# abbr -a cmake-debug "${cmakeDebug}"
# abbr -a cmake-release "${cmakeRelease}"
# abbr -a build-debug "${buildDebug}"
# abbr -a build-release "${buildRelease}"
# Clojure:
# clojure-deps = "deps-lock --lein";
# abbr -a clojure-deps "deps-lock --lein"
# Python:
# run = "python ./app/main.py";
# profile = "py-spy record -o profile.svg -- python ./app/main.py && firefox profile.svg";
# 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)}
# abbr -a run "python ./app/main.py"
# abbr -a profile "py-spy record -o profile.svg -- python ./app/main.py && firefox profile.svg"
# abbr -a ptop "py-spy top -- python ./app/main.py"
'';
in
builtins.concatStringsSep "\n" [
# Launch into pure fish shell
''
# Determine the project root, used e.g. in cmake scripts
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}"
exec "$(type -p fish)" -C "source ${initProjectShell} && abbr -a menu '${pkgs.bat}/bin/bat "${initProjectShell}"'"
''
# Qt: Launch into wrapped fish shell (direnv incompatible)
# Qt: Launch into wrapped fish shell
# https://nixos.org/manual/nixpkgs/stable/#sec-language-qt
# ''
# fishdir=$(mktemp -d)
+1 -1
View File
@@ -356,7 +356,7 @@ background_alpha=0.8
################ INTERACTION #################
### Change toggle keybinds for the hud & logging
toggle_hud=Shift_R+F12
# toggle_hud=Shift_R+F12
# toggle_hud_position=Shift_R+F11
# toggle_preset=Shift_R+F10
# toggle_fps_limit=Shift_L+F1
+7 -13
View File
@@ -206,12 +206,12 @@ dos2unix <file>
$ file: eza -1
% unix2dos
# Convert line endings to dos format
Convert line endings to dos format
unix2dos <file>
$ file: eza -1
% tiddl
# Download stuff from tidal
Download stuff from tidal
tiddl download --track-quality max --path ~/Downloads/Beet/Albums --videos none url "<url>"
; ===========================
@@ -308,33 +308,27 @@ mkdir -p "<name>" && cd "<name>" && spotdl --client-id (cat /home/christoph/.sec
% ffmpeg
# 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
% ffmpeg
# 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
% ffmpeg
# 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
% ffmpeg
# 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
% ffmpeg
# Reencode and compress the video using the h265 codec
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>
ffmpeg -i "<input>" -vcodec libx265 -crf <quality> "out_<input>"
$ input: eza -f -1
$ 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 {
display: block !important;
margin-left: auto !important;
margin-right: auto !important;
img[alt*="center"] {
display: block;
margin-left: auto;
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,
}: let
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";
# src = pkgs.fetchPypi {
# pname = "typer";
# version = "0.20.0";
# sha256 = "sha256-Gq9klAMXk+SHb7C6z6apErVRz0PB5jyADfixqGZyDDc=";
# };
# propagatedBuildInputs = with pythonPkgs; [
# typing-extensions
# ];
# });
typer = super.typer.overridePythonAttrs (old: {
version = "0.20.1";
src = pkgs.fetchPypi {
pname = "typer";
version = "0.20.0";
sha256 = "sha256-Gq9klAMXk+SHb7C6z6apErVRz0PB5jyADfixqGZyDDc=";
};
propagatedBuildInputs = with pythonPkgs; [
typing-extensions
];
});
aiofiles = super.aiofiles.overridePythonAttrs (old: {
version = "25.1.0";
@@ -36,12 +34,12 @@
in
pythonPkgs.buildPythonApplication rec {
pname = "tiddl";
version = "3.4.3";
version = "3.2.0";
format = "pyproject";
src = pythonPkgs.fetchPypi {
inherit pname version;
sha256 = "sha256-45KHNS1IP59DsH8i2uQ7sua6T21vW/Yw1PQg55jzLGs=";
sha256 = "sha256-uLkGyIScYPqFgQdPAOYJDJG0jp+nDAwIl2kFkaJZFco=";
};
dontCheckRuntimeDeps = true;
Generated
+234 -1197
View File
File diff suppressed because it is too large Load Diff
+6 -33
View File
@@ -36,7 +36,7 @@
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
# 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";
# Nix User Repository (e.g. Firefox addons)
@@ -47,10 +47,6 @@
nps.url = "github:OleMussmann/nps";
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
nix-alien.url = "github:thiagokokada/nix-alien";
# Don't follow nixpkgs:
@@ -58,16 +54,9 @@
# nix-alien.inputs.nixpkgs.follows = "nixpkgs";
# Niri
# niri.url = "github:sodiboo/niri-flake";
niri.url = "github:epireyn/niri-flake"; # NOTE: Updated fork of sodiboo's
niri.url = "github:sodiboo/niri-flake";
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
elephant.url = "github:abenz1267/elephant";
walker.url = "github:abenz1267/walker";
@@ -75,7 +64,7 @@
# NeoVim <3
nixvim.url = "github:nix-community/nixvim";
# nixvim.inputs.nixpkgs.follows = "nixpkgs";
nixvim.inputs.nixpkgs.follows = "nixpkgs";
# Emacs nightly
# emacs-overlay.url = "github:nix-community/emacs-overlay";
@@ -89,24 +78,10 @@
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
# 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
# musnix.url = "github:musnix/musnix";
# 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-launcher.url = "github:JPyke3/hytale-launcher-nix";
@@ -163,7 +138,7 @@
inputs.nur.overlays.default
inputs.niri.overlays.niri
# inputs.emacs-overlay.overlay
inputs.claude-desktop.overlays.default
# inputs.comfyui-nix.overlays.default
# All my own overlays (derivations + modifications)
(import ./overlays {inherit inputs nixpkgs pkgs-stable;})
@@ -248,7 +223,6 @@
headless = false;
extraModules = [
inputs.sops-nix.darwinModules.sops
inputs.stylix.darwinModules.stylix
];
};
};
@@ -275,9 +249,8 @@
extraModules =
[
inputs.disko.nixosModules.disko
inputs.stylix.nixosModules.stylix
inputs.nix-gaming.nixosModules.platformOptimizations
inputs.codex-desktop-linux.nixosModules.default
# inputs.nixified-ai.nixosModules.comfyui
# inputs.comfyui-nix.nixosModules.default
]
++ commonModules;
};
+2 -191
View File
@@ -54,7 +54,7 @@ in
cursorSize = 24;
cursorPackage = pkgs.bibata-cursors;
iconTheme = "Papirus-Dark";
iconTheme = "Papirus";
iconPackage = pkgs.papirus-icon-theme;
scheme = "catppuccin-mocha";
@@ -77,193 +77,6 @@ in
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;
niri.enable = nixosConfig.programs.niri.enable;
nnn.enable = false; # Use yazi
@@ -323,11 +136,9 @@ in
# Enable wayland
XDG_SESSION_TYPE = "wayland";
# QT_QPA_PLATFORM = "wayland;xcb";
QT_QPA_PLATFORM = "wayland";
NIXOS_OZONE_WL = "1";
# ELECTRON_OZONE_PLATFORM_HINT = "auto";
SDL_VIDEODRIVER = "wayland"; # Leave unset as gamescope uses xwayland
SDL_VIDEODRIVER = "wayland";
# Run SSH_ASKPASS as GUI, not TTY for Obsidian git
SSH_ASKPASS_REQUIRE = "prefer";
+11 -442
View File
@@ -3,7 +3,6 @@
pkgs,
nixosConfig,
config,
hostname,
lib,
mylib,
username,
@@ -18,382 +17,7 @@
# because it forces en-US keyboard layout.
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"];
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
@@ -451,9 +75,9 @@
# jetbrains.idea-ultimate
# jetbrains.webstorm
# jetbrains.rider
zed-editor
vscode
# ghidra # launch with _JAVA_AWT_WM_NONREPARENTING=1 (use programs.ghidra)
# zed-editor # Using module
# vscode # Using module
# Unity Stuff
# unityhub
@@ -472,17 +96,17 @@
makemkv
lrcget
# msty
# jellyfin-media-player # CVE, can't install
jellyfin-desktop
jellyfin-mpv-shim
# tidal-hifi
# tidal-dl-ng # TODO: Borked
# spotdl
tiddl
picard
handbrake
teamspeak6-client
# virt-manager # use system program option
virt-viewer
gnome-boxes # doesn't list VMs imported using virsh
steam-devices-udev-rules
];
@@ -515,51 +139,21 @@
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 = {
flatpak = {
packages = [
"com.valvesoftware.Steam"
"com.valvesoftware.Steam.Utility.steamtinkerlaunch"
"org.freedesktop.Platform.VulkanLayer.gamescope/x86_64/25.08" # TODO: Doesn't work
"org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/25.08"
"org.freedesktop.Platform.VulkanLayer.gamescope/x86_64/24.08"
"org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/24.08"
"io.github.Foldex.AdwSteamGtk"
"com.vysp3r.ProtonPlus"
"com.github.Matoking.protontricks"
# "net.davidotek.pupgui2"
"org.prismlauncher.PrismLauncher"
"com.usebottles.bottles"
"io.github.lawstorant.boxflat"
"org.onlyoffice.desktopeditors"
# "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 = [
"${config.home.homeDirectory}/Games"
# This is Proton-GE installed from flatpak. ProtonUpQT doesn't require it.
"/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"
# This is Proton-GE installed from flatpak. ProtonUpQT doesn't require it.
"/var/lib/flatpak/runtime/com.valvesoftware.Steam.CompatibilityTool.Proton-GE"
];
};
+1 -3
View File
@@ -2,8 +2,6 @@
{pkgs, ...}: {
config = {
homemodules = {
# TODO: Niri config (needs to modularize niri module)
hyprland = {
keyboard = {
layout = "us";
@@ -27,7 +25,7 @@
};
};
waybar.monitors = ["eDP-1"];
waybar.monitor = "eDP-1";
};
home = {
@@ -15,10 +15,10 @@ in {
options.homemodules.helix = import ./options.nix {inherit lib mylib;};
config = mkIf cfg.enable {
# home.sessionVariables = {
# EDITOR = "hx";
# VISUAL = "hx";
# };
home.sessionVariables = {
EDITOR = "hx";
VISUAL = "hx";
};
programs.helix = {
enable = true;
@@ -40,11 +40,11 @@ in {
# https://docs.helix-editor.com/configuration.html
settings = {
theme = "catppuccin_mocha";
theme = "catppuccin_latte";
editor = {
scrolloff = 10;
mouse = true;
middle-click-paste = true;
mouse = false; # Default true
middle-click-paste = false; # Default true
line-number = "relative";
cursorline = true;
color-modes = true;
@@ -5,12 +5,16 @@
hyprland,
}:
builtins.concatLists [
(lib.optionals hyprland.dunst.enable ["dunst"]) # Notifications
(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}"
"hyprsunset --identity"
"waypaper --restore"
"fcitx5"
# 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"
@@ -22,11 +26,6 @@ builtins.concatLists [
# This is used for example when running systemd commands without root.
# "systemctl --user start hyprpolkitagent.service"
# "${pkgs.kdePackages.polkit-kde-agent-1}/libexec/polkit-kde-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"
"${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"
]
]
@@ -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,
color,
}: {
enable = true;
enable = !hyprland.caelestia.enable;
settings = {
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";
dunst.enable = lib.mkEnableOption "Enable Dunst notification daemon";
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";
caelestia.enable = lib.mkEnableOption "Enable Caelestia";
keyboard = {
layout = lib.mkOption {
@@ -137,12 +137,8 @@
hyprland.windowrules
];
render = {
cm_enabled = true;
cm_auto_hdr = true;
};
dwindle = {
pseudotile = true;
preserve_split = true;
};
@@ -241,5 +237,123 @@
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 = {
auto = "yes";
sources = "*"; # sources are queried in this order
sources = "filesystem coverart itunes amazon albumart"; # sources are queried in this order
};
# lyrics = {
-8
View File
@@ -15,9 +15,6 @@
./firefox
./fish
./git
./helix
./hyprland
./hyprpanel
./jellyfin-tui
./kitty
./lazygit
@@ -34,19 +31,14 @@
./ssh
./terminal
./tmux
./vscode
./yazi
./zathura
./zed
# HM modules imported from the flake inputs
inputs.nix-flatpak.homeManagerModules.nix-flatpak
inputs.nixvim.homeModules.nixvim
inputs.textfox.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.noctalia.homeModules.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/.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/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
{
name = "Code";
name = "Coding";
bookmarks = [
(mkBm "C++Ref" "https://en.cppreference.com/w/")
(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")
];
}
# {
# name = "AI";
# bookmarks = [
# (mkBm "Mistral Chat" "https://chat.mistral.ai/chat")
# (mkBm "DeepSeek Chat" "https://chat.deepseek.com/")
# (mkBm "Claude Chat" "https://claude.ai/new")
# (mkBm "ChatGPT" "https://chatgpt.com/")
# (mkBm "DeepWiki" "https://deepwiki.com/")
# "separator"
# (mkBm "Mistral API" "https://console.mistral.ai/usage")
# (mkBm "DeepSeek API" "https://platform.deepseek.com/usage")
# (mkBm "Claude API" "https://console.anthropic.com/usage")
# (mkBm "OpenRouter API" "https://openrouter.ai/activity")
# ];
# }
{
name = "\"AI\"";
bookmarks = [
(mkBm "Mistral Chat" "https://chat.mistral.ai/chat")
(mkBm "DeepSeek Chat" "https://chat.deepseek.com/")
(mkBm "Claude Chat" "https://claude.ai/new")
(mkBm "ChatGPT" "https://chatgpt.com/")
(mkBm "DeepWiki" "https://deepwiki.com/")
"separator"
(mkBm "Mistral API" "https://console.mistral.ai/usage")
(mkBm "DeepSeek API" "https://platform.deepseek.com/usage")
(mkBm "Claude API" "https://console.anthropic.com/usage")
(mkBm "OpenRouter API" "https://openrouter.ai/activity")
];
}
(mkBm "GH" "https://github.com/churl")
(mkBm "GL" "https://gitlab.com/churl")
(mkBm "SO" "https://stackoverflow.com/users/saves/17337508/all")
@@ -103,9 +103,9 @@ in [
(mkBm "Heise" "https://www.heise.de/")
(mkBm "HN" "https://news.ycombinator.com/news")
(mkBm "Reddit" "https://www.reddit.com/user/FightingMushroom/saved/")
# (mkBm "F10" "https://f10.local.chriphost.de/race/Everyone")
(mkBm "F12" "https://f12.local.chriphost.gay/racepicks")
(mkBm "F12PB" "https://f12pb.local.chriphost.de/_/")
(mkBm "F10" "https://f10.local.chriphost.de/race/Everyone")
(mkBm "F11" "https://f11.local.chriphost.de/racepicks")
(mkBm "F11PB" "https://f11pb.local.chriphost.de/_/#/collections?collection=pbc_1736455494&filter=&sort=-%40rowid")
(mkBm "ISBNDB" "https://isbndb.com/")
(mkBm "Music" "https://bandcamp.com/chriphost")
(mkBm "Albums" "https://www.albumoftheyear.org/user/chriphost/list/307966/2025/")
-3
View File
@@ -86,9 +86,6 @@ in {
programs.firefox = {
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
package = pkgs.wrapFirefox pkgs.firefox-unwrapped {
# About policies: https://github.com/mozilla/policy-templates#enterprisepoliciesenabled
+2 -47
View File
@@ -58,7 +58,7 @@ in {
in
lib.mkMerge [
# Darwin exclusive config
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin {
(lib.mkIf pkgs.stdenv.isDarwin {
shellInit = ''
set fish_greeting
yes | fish_config theme save "system-theme"
@@ -81,53 +81,12 @@ in {
})
# Linux exclusive config
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux {
(lib.mkIf pkgs.stdenv.isLinux {
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 = ''
set fish_greeting
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 [
@@ -221,10 +180,6 @@ in {
ns = "nix shell nixpkgs#";
nr = "nix run";
nps = "nps -e";
# Systemctl
st = "sudo systemctl-tui";
sf = "systemctl --failed";
}
# 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
;
};
};
};
}
+4 -4
View File
@@ -10,7 +10,7 @@
inherit (config.homemodules) jellyfin-tui color;
systemConfig =
if pkgs.stdenv.hostPlatform.isLinux
if pkgs.stdenv.isLinux
then nixosConfig
else darwinConfig;
in {
@@ -24,7 +24,7 @@ in {
file = let
jellyfinUrl =
if pkgs.stdenv.hostPlatform.isLinux
if pkgs.stdenv.isLinux
then "https://jellyfin.local.chriphost.de"
else "https://jellyfin.vps.chriphost.de";
@@ -79,10 +79,10 @@ in {
'';
in
lib.mkMerge [
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
(lib.optionalAttrs pkgs.stdenv.isLinux {
".config/jellyfin-tui/config.yaml".text = configFile;
})
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
(lib.optionalAttrs pkgs.stdenv.isDarwin {
"Library/Application Support/jellyfin-tui/config.yaml".text = configFile;
})
];
+3 -10
View File
@@ -26,19 +26,13 @@ in {
"kitty_mod+j" = "next_window";
"kitty_mod+k" = "previous_window";
"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 [
# Linux config
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux {
allow_remote_control = true; # For nnn file preview or nvim scrollback
listen_on = lib.mkDefault "unix:@mykitty"; # This conflicts with direnv-instant
(lib.mkIf pkgs.stdenv.isLinux {
allow_remote_control = "yes"; # For nnn file preview or nvim scrollback
listen_on = "unix:@mykitty";
})
# Common config
@@ -48,7 +42,6 @@ in {
window_padding_width = 10; # Looks stupid with editors if bg doesn't match
# hide_window_decorations = "yes";
enabled_layouts = "grid,vertical,horizontal";
cursor_trail = 3;
tab_bar_min_tabs = 2; # Don't show a single tab
tab_bar_edge = "bottom";
+41 -215
View File
@@ -30,62 +30,54 @@ in {
(lib.optionals (!headless) [
# Language servers
autotools-language-server
basedpyright
clang-tools
clojure-lsp
cmake-language-server
haskell-language-server
jdt-language-server
just-lsp
ltex-ls # TODO: Only enable on-demand
lua-language-server
nil
# perl5Packages.PLS
perlnavigator
# nil
basedpyright
pyrefly
# rPackages.languageserver
ty
rust-analyzer
svelte-language-server
tailwindcss-language-server
tex-fmt
texlab
tinymist
ty
typescript
vscode-langservers-extracted # includes nodejs
autotools-language-server
just-lsp
# Linters
checkstyle # java
clippy # rust
clj-kondo # clojure
eslint_d # javascript
# python313Packages.ruff
# python313Packages.flake8
# python313Packages.pylint
python313Packages.ruff
python313Packages.flake8
python313Packages.pylint
lua54Packages.luacheck
vale # text
# statix # nix (doesn't recognize pipe operator)
# Formatters
air-formatter
cljfmt
python313Packages.black
google-java-format
html-tidy
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
# python313Packages.black
# nodePackages_latest.prettier # Use local install as plugins change per project
rustfmt
stylua
tombi
typstyle
nodejs_latest
uv
mbake
just-formatter
tombi
])
[
@@ -95,54 +87,6 @@ in {
lua54Packages.jsregexp # For tree-sitter
# 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
alejandra # nix
]
@@ -150,8 +94,6 @@ in {
};
programs.nixvim = {
# nixpkgs.pkgs = pkgs;
defaultEditor = true;
enable = true;
enableMan = false; # Nixvim man pages
@@ -159,15 +101,6 @@ in {
viAlias = 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
# colorschemes.catppuccin = {
# enable = true;
@@ -183,7 +116,7 @@ in {
performance.byteCompileLua = {
enable = true;
configs = true;
initLua = true; # When debugging init.lua turn this off
initLua = false; # When debugging init.lua turn this off
nvimRuntime = true;
plugins = true;
};
@@ -226,16 +159,6 @@ in {
# fg = "#${color.hex.dark.text}";
# 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; [];
@@ -253,7 +176,7 @@ in {
# local renderer = require("neo-tree.ui.renderer")
# local state = manager.get_state("filesystem")
# local window_exists = renderer.window_exists(state)
#
# if window_exists then
# require("neo-tree.sources.filesystem.commands").refresh(state)
# end
@@ -329,15 +252,6 @@ in {
require("${name}").setup(opts)
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 {
enable = true;
@@ -387,7 +301,6 @@ in {
light = "latte";
dark = "mocha";
};
term_colors = true;
# https://github.com/catppuccin/nvim/tree/main?tab=readme-ov-file#integrations
default_integrations = true;
integrations = {
@@ -424,7 +337,6 @@ in {
# custom_bg = "crust";
};
notify = true;
terminal = true;
treesitter = true;
ufo = true;
rainbow_delimiters = true;
@@ -436,15 +348,6 @@ in {
};
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 = pkgs.vimPlugins.blink-cmp;
lazy = true;
dependencies = [luasnip];
event = ["InsertEnter"];
config = mkDefaultConfig name;
@@ -514,17 +416,13 @@ in {
};
};
snippets = {
preset = "luasnip";
};
fuzzy = {
frecency.enabled = true;
use_proximity = true;
};
sources = {
default = ["lsp" "path" "snippets" "omni"]; # No "buffer"
default = ["lsp" "path" "snippets"]; # No "buffer"
};
cmdline = {
@@ -625,10 +523,8 @@ in {
make = ["bake"];
markdown = ["prettierd" "prettier"];
nix = ["alejandra"];
perl = ["perltidy"];
python = ["black"];
qml = ["qmlformat"];
r = ["air"];
rust = ["rustfmt"];
svelte = ["prettierd" "prettier"];
toml = ["tombi"];
@@ -964,8 +860,9 @@ in {
dependencies = [_lazydev];
config = let
servers = mylib.generators.toLuaObject [
{name = "autotools-language-server";}
{name = "basedpyright";}
# {name = "pyrefly";} # TODO: Config
# {name = "ty";} # TODO: Config
{
name = "clangd";
extraOptions = {
@@ -1008,15 +905,16 @@ in {
{name = "html";} # vscode-langservers-extracted
{name = "just";}
{name = "lua_ls";}
# {
# name = "ltex";
# extraOptions.settings = {
# ltex = {
# checkFrequency = "save";
# enabled = ["markdown" "org" "tex" "latex" "plaintext"];
# };
# };
# }
{
name = "ltex";
extraOptions.settings = {
ltex = {
checkFrequency = "save";
enabled = ["markdown" "org" "tex" "latex" "plaintext"];
};
};
}
{name = "autotools-language-server";}
# {name = "nil_ls";}
{
name = "nixd";
@@ -1058,8 +956,6 @@ in {
};
};
}
{name = "perlpls";}
{name = "perlnavigator";}
{
name = "qmlls";
extraOptions.cmd = [
@@ -1067,8 +963,6 @@ in {
"-E" # Use QML_IMPORT_PATH env variable
];
}
# {name = "pyrefly";} # TODO: Config
{name = "r_language_server";}
{name = "svelte";}
{name = "tailwindcss";}
{name = "texlab";}
@@ -1080,7 +974,6 @@ in {
semanticTokens = "disable";
};
}
# {name = "ty";} # TODO: Config
# {name = "jdtls";} # Don't set up when using nvim-jdtls
# {name = "rust_analyzer";} # Don't set up when using rustaceanvim
@@ -1158,7 +1051,6 @@ in {
pkg = pkgs.vimPlugins.lualine-nvim;
lazy = true;
event = ["BufReadPost" "BufNewFile"];
# dependencies = [opencode];
config = ''
function(_, opts)
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_x.__raw = ''{}'';
# lualine_x.__raw = ''{ { require("opencode").statusline, }, }'';
lualine_y = ["filetype" "encoding" "fileformat"];
lualine_z.__raw = ''{ { "location", separator = {}, } }'';
};
@@ -1424,19 +1315,19 @@ in {
};
_nui = {
name = "nui.nvim";
name = "nui"; # For noice
pkg = pkgs.vimPlugins.nui-nvim;
lazy = true;
};
noice = rec {
name = "noice.nvim";
name = "noice";
pkg = pkgs.vimPlugins.noice-nvim;
lazy = false;
dependencies = [
_nui
];
config = mkDefaultConfigFor "noice";
config = mkDefaultConfig name;
opts = {
presets = {
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 {
# name = "obsidian";
# pkg = pkgs.vimPlugins.obsidian-nvim;
@@ -1748,7 +1613,7 @@ in {
gitbrowse.enabled = false;
image.enabled = false;
indent.enabled = false;
input.enabled = true;
input.enabled = false;
keymap.enabled = false;
layout.enabled = false;
lazygit.enabled = true;
@@ -1784,20 +1649,6 @@ in {
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;
@@ -1828,7 +1679,6 @@ in {
function(line)
local base = { fg = "#${color.hex.base}", bg = "#${color.hex.base}" }
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 accent = { fg = "#${color.hex.accent}", bg = "#${color.hex.accent}" }
@@ -1854,14 +1704,14 @@ in {
line.sep(sep_start, accent, crust),
tab.number(),
tab.name(),
line.sep(sep_end, crust, mantle),
line.sep(sep_end, crust, base),
hl = hl,
margin = " ",
}
end),
-- Background
hl = mantle,
hl = bg,
}
end
'';
@@ -1869,7 +1719,7 @@ in {
};
_plenary = {
name = "plenary.nvim";
name = "plenary";
pkg = pkgs.vimPlugins.plenary-nvim;
lazy = true;
};
@@ -1970,12 +1820,11 @@ in {
shell = "fish";
direction = "horizontal"; # 'vertical' | 'horizontal' | 'window' | 'float'
auto_scroll = true;
# clear_env = false;
float_opts = {
border = "curved"; # 'single' | 'double' | 'shadow' | 'curved'
width.__raw = "function() return math.floor(vim.o.columns * 0.95) end";
height.__raw = "function() return math.floor(vim.o.lines * 0.85) end";
width = 80;
height = 80;
winblend = 0;
};
};
@@ -2148,40 +1997,18 @@ in {
pkg = pkgs.vimPlugins.vimtex;
init = ''
function()
vim.g.vimtex_mappings_enabled = true
vim.g.vimtex_mappings_enabled = false
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 = {
options = {
"-verbose",
"-shell-escape",
"-file-line-error",
"-synctex=1",
"-interaction=nonstopmode",
"-shell-escape",
},
aux_dir = ".aux",
out_dir = ".out",
}
end
'';
};
@@ -2311,12 +2138,12 @@ in {
};
yazi = rec {
name = "yazi.nvim";
name = "yazi";
pkg = pkgs.vimPlugins.yazi-nvim;
lazy = true;
event = ["VeryLazy"];
dependencies = [_plenary];
config = mkDefaultConfigFor "yazi";
config = mkDefaultConfig name;
opts = {
open_for_directories = true;
highlight_hovered_buffers_in_same_directory = false;
@@ -2378,7 +2205,6 @@ in {
noice # Modern UI overhaul, e.g. floating cmdline
# 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:
persisted # Session management
+2 -20
View File
@@ -60,27 +60,9 @@ end, {
-- Toggle Rmpc
local Terminal = require("toggleterm.terminal").Terminal
local rmpc = Terminal:new({
cmd = "rmpc",
hidden = true,
close_on_exit = true,
auto_scroll = false,
direction = "float",
})
local rmpc =
Terminal:new({ cmd = "rmpc", hidden = true, close_on_exit = true, auto_scroll = false, direction = "float" })
vim.g.toggle_rmpc = function()
rmpc:toggle()
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
-- o.guifont = "JetBrainsMono Nerd Font Mono:h12:Medium"
o.guifont = "MonoLisa Alt Script:h12:Medium"
o.guifont = "MonoLisa Alt:h12:Medium"
else
-- require("notify").notify("Not running in NeoVide")
end
-65
View File
@@ -340,12 +340,6 @@ _: let
action = "<cmd>lua vim.g.toggle_rmpc()<cr>"; # Defined in extraConfigLua.lua
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";
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 = [
{
mode = "n";
@@ -937,12 +879,6 @@ _: let
action = "<cmd>Trouble diagnostics toggle focus=false win.position=bottom<cr>";
options.desc = "Trouble Diagnostics";
}
{
mode = "n";
key = "<leader>tT";
action = "<cmd>ToggleTerm direction=float<cr>";
options.desc = "Floating Terminal";
}
{
mode = "n";
key = "<leader>tD";
@@ -1062,7 +998,6 @@ in
no-leader
leader
leader-opencode
leader-file
leader-help
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 {
-- The first list contains manually expanded snippts
--
@@ -33,7 +18,7 @@ return {
-- \begin{environment}
s(
{ trig = "beg", name = "begin/end", descr = "begin/end environment (generic)" },
"beg",
fmta(
[[
\begin{<>}
@@ -43,28 +28,6 @@ return {
{ 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
}
File diff suppressed because it is too large Load Diff
+14 -55
View File
@@ -13,7 +13,6 @@ in {
options.homemodules.packages = import ./options.nix {inherit lib mylib;};
config = lib.mkIf packages.enable {
# TODO: Add extra packages option and use that from host-specific configs
home.packages = with pkgs;
lib.mkMerge [
# Common packages
@@ -43,9 +42,7 @@ in {
# Nix
nix-search-tv # Search nixpkgs, nur, nixos options and homemanager options
nix-tree # Browse the nix store sorted by size (gdu for closures)
# TODO: Still broken on 2026-09-09
# inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default # Search nixpkgs
inputs.nps.packages.${pkgs.stdenv.hostPlatform.system}.default # Search nixpkgs
# Video/Image/Audio utils
ffmpeg-full # I love ffmpeg (including ffplay)
@@ -78,16 +75,14 @@ in {
(lib.optionals (!headless) [
ripdrag # drag & drop from terminal
# jellyfin-tui # Use module
inputs.masssprings.packages.${stdenv.hostPlatform.system}.default
])
# Linux exclusive packages
(lib.optionals (pkgs.stdenv.hostPlatform.isLinux) [
(lib.optionals (pkgs.stdenv.isLinux) [
pastel # Color tools
nvd # Nix rebuild diff
nurl # Generate nix fetcher sections based on URLs
# python313 # Nicer scripting than bash
python313 # Nicer scripting than bash
lazyjournal # Journalctl viewer
systemctl-tui
restic # Backups
@@ -97,11 +92,6 @@ in {
jujutsu # git-like vcs
lurk # strace analysis
radare2
disktui
lldb
inotify-tools
xdotool
gnome-keyring
# Hardware/Software info
pciutils # lspci
@@ -141,37 +131,34 @@ in {
])
# Linux exclusive packages (!headless)
(lib.optionals (pkgs.stdenv.hostPlatform.isLinux && (!headless)) [
(lib.optionals (pkgs.stdenv.isLinux && (!headless)) [
veracrypt
wl-clipboard
asciicam
# Proton
proton-vpn
protonmail-bridge-gui
# GUI stuff
nautilus # Just in case
signal-desktop
anki
font-manager # Previews fonts, but doesn't set them
nextcloud-client
keepassxc
thunderbird # TODO: Email module
obsidian
zotero
zeal # docs browser
# helvum # unmaintained
crosspipe
vlc
audacity
# ferdium
feishin # electron :(
ferdium
gparted
# feishin # electron :(
playerctl # Media player control
czkawka-full # file deduplicator
binaryninja-free # reverse engineering
tableplus # database explorer
# opencode-desktop
lmstudio # TODO: Ollama
claude-desktop
opencode-desktop
upscayl
calibre
# Office
kdePackages.wacomtablet # For xournalpp/krita
@@ -180,24 +167,11 @@ in {
hunspellDicts.en_US
hunspellDicts.de_DE
# GTK-Apps because I hate nice software
# 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
inputs.masssprings.packages.${stdenv.hostPlatform.system}.default
])
# Darwin exclusive packages
(lib.optionals pkgs.stdenv.hostPlatform.isDarwin [
(lib.optionals pkgs.stdenv.isDarwin [
# Use homebrew instead
# alt-tab-macos
# discord
@@ -205,11 +179,6 @@ in {
# nextcloud-client
# proton-vpn
# iina
# TODO: Update the docs module to be darwinix compatible
# - The filepaths need to be adapted
texliveFull
typst
])
];
@@ -220,19 +189,9 @@ in {
direnv = {
enable = true;
enableFishIntegration = true;
silent = true;
nix-direnv.enable = true;
};
# This replaces the normal direnv.enableFishIntegration.
# direnv-instant = {
# enable = true;
# enableFishIntegration = true;
# enableKittyIntegration = true;
# settings.use_cache = true;
# };
eza = {
enable = true;
enableFishIntegration = config.homemodules.fish.enable;
+13 -57
View File
@@ -47,8 +47,6 @@ in {
wrap_navigation: false,
enable_mouse: true,
enable_config_hot_reload: true,
enable_lyrics_hot_reload: true,
enable_lyrics_index: true,
status_update_interval_ms: 1000,
rewind_to_start_sec: 30,
lyrics_dir: "${config.home.homeDirectory}/Music",
@@ -90,37 +88,24 @@ in {
(
name: "Queue (1)",
pane: Split(
borders: "NONE",
direction: Horizontal,
panes: [
// Left Column (Queue + Cava)
(
size: "70%",
borders: "NONE",
pane: Split(
direction: Vertical,
panes: [
(
size: "75%",
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%",
borders: "ALL",
border_symbols: Rounded,
pane: Pane(Cava),
)
]
@@ -130,19 +115,18 @@ in {
// Right Column (AlbumArt + Lyrics)
(
size: "30%",
borders: "NONE",
pane: Split(
direction: Vertical,
panes: [
(
size: "75%",
borders: "ALL",
border_symbols: Rounded,
pane: Pane(AlbumArt),
),
(
size: "25%",
borders: "ALL",
border_symbols: Rounded,
pane: Pane(Lyrics),
),
]
@@ -153,59 +137,31 @@ in {
),
(
name: "Albums (2)",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Albums))],
)
pane: Pane(Albums),
),
(
name: "Album Artists (3)",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(AlbumArtists))],
)
pane: Pane(AlbumArtists),
),
(
name: "Artists (4)",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Artists))],
)
pane: Pane(Artists),
),
(
name: "Playlists (5)",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Playlists))],
)
pane: Pane(Playlists),
),
// (
// name: "Directories (6)",
// pane: Split(
// size: "100%",
// direction: Vertical,
// panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Directories))],
// )
// pane: Pane(Directories),
// ),
(
name: "Search (6)",
pane: Split(
size: "100%",
direction: Vertical,
panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Search))],
)
pane: Pane(Search),
),
// (
// name: "Visualizer (8)",
// pane: Split(
// size: "100%",
// direction: Vertical,
// panes: [(size: "100%", borders: "ALL", border_symbols: Rounded, pane: Pane(Cava))],
// )
// pane: Pane(Cava),
// ),
],
@@ -331,6 +287,8 @@ in {
#![enable(unwrap_variant_newtypes)]
(
default_album_art_path: None,
show_song_table_header: true,
draw_borders: true,
format_tag_separator: " | ",
browser_column_widths: [20, 38, 42],
modal_backdrop: false,
@@ -437,8 +395,6 @@ in {
),
(
pane: Pane(Tabs),
borders: "ALL",
border_symbols: Rounded,
size: "3",
),
(
+24 -27
View File
@@ -15,44 +15,41 @@ in {
enable = true;
enableDefaultConfig = false;
settings = {
matchBlocks = {
"*" = {
ForwardAgent = false;
AddKeysToAgent =
if pkgs.stdenv.hostPlatform.isLinux
then "no"
else "yes"; # Don't have keychain on darwin
Compression = true;
ServerAliveInterval = 0;
ServerAliveCountMax = 3;
HashKnownHosts = false;
UserKnownHostsFile = "~/.ssh/known_hosts";
ControlMaster = "no";
ControlPath = "~/.ssh/master-%r@%n:%p";
ControlPersist = "no";
forwardAgent = false;
addKeysToAgent = "no";
compression = true;
serverAliveInterval = 0;
serverAliveCountMax = 3;
hashKnownHosts = false;
userKnownHostsFile = "~/.ssh/known_hosts";
controlMaster = "no";
controlPath = "~/.ssh/master-%r@%n:%p";
controlPersist = "no";
};
"nixinator" = {
Port = 5432;
User = "christoph";
HostName = "vps.chriphost.de";
port = 5432;
user = "christoph";
hostname = "vps.chriphost.de";
};
"servenix" = {
User = "christoph";
HostName = "local.chriphost.de";
user = "christoph";
hostname = "local.chriphost.de";
};
"thinknix" = {
User = "christoph";
HostName = "think.chriphost.de";
user = "christoph";
hostname = "think.chriphost.de";
};
"vps" = {
User = "root";
HostName = "vps.chriphost.de";
user = "root";
hostname = "vps.chriphost.de";
};
"mars" = {
User = "smchurla";
HostName = "mars.cs.tu-dortmund.de";
ServerAliveInterval = 60;
LocalForward = [
user = "smchurla";
hostname = "mars.cs.tu-dortmund.de";
serverAliveInterval = 60;
localForwards = [
{
# Resultbrowser
bind.port = 22941;
-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;
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-right = ["privacy" "pulseaudio" "network" "disk" "cpu" "memory" "clock" "tray"];
@@ -58,27 +58,6 @@ in {
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 = {
format = "<span>󰎇</span> {dynamic}";
format-paused = "<span>{status_icon}</span> <i>{dynamic}</i>";
@@ -200,7 +179,7 @@ in {
border-width: ${border-width};
border-radius: ${border-radius};
border-color: #${color.hex.accent};
background-color: rgba(${color.rgbS.mantle}, 0.7);
background-color: rgba(${color.rgbS.mantle}, 1.0);
}
tooltip {
+57 -180
View File
@@ -17,19 +17,7 @@ in {
shellWrapperName = "y";
plugins = {
inherit
(pkgs.yaziPlugins)
chmod
diff
full-border
git
lazygit
mount
ouch
rsync
starship
sudo
; # smart-paste
inherit (pkgs.yaziPlugins) chmod diff full-border git lazygit mount ouch rsync starship sudo; # smart-paste
};
initLua = ''
@@ -65,10 +53,9 @@ in {
'';
# https://yazi-rs.github.io/docs/configuration/yazi
# %sN: The N-th selected file (1...n)
# %s: All selected files
# %h: The hovered file (shell keybindings)
# File placeholders are shell-escaped by Yazi; do not quote them.
# "$n": The n-th selected file (1...n)
# "$@": All selected files
# "$0": The hovered file
settings = {
mgr = {
show_hidden = false;
@@ -81,43 +68,27 @@ in {
opener = {
play = [
{
run = ''mpv %s'';
run = ''mpv "$@"'';
orphan = true;
desc = "Play selection with mpv";
}
{
run = ''vlc %s'';
orphan = true;
desc = "Play selection with vlc";
desc = "Play selection";
}
];
edit = [
{
run = ''$EDITOR %s'';
run = ''$EDITOR "$@"'';
block = true;
desc = "Edit selection";
}
];
open = [
{
run = ''xdg-open %s1'';
orphan = true;
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";
run = ''xdg-open "$@"'';
desc = "Open selection";
}
];
extract = [
{
run = ''ouch decompress -y %s'';
run = ''ouch decompress -y "$@"'';
desc = "Extract selection";
}
];
@@ -130,13 +101,13 @@ in {
plugin.prepend_fetchers = [
{
group = "git";
url = "*";
id = "git";
name = "*";
run = "git";
}
{
group = "git";
url = "*/";
id = "git";
name = "*/";
run = "git";
}
];
@@ -186,67 +157,43 @@ in {
mgr.prepend_keymap = [
{
on = [
"<C-p>"
"m"
];
on = ["<C-p>" "m"];
run = "plugin mount";
desc = "Manage device mounts";
}
{
on = [
"<C-p>"
"c"
];
on = ["<C-p>" "c"];
run = "plugin chmod";
desc = "Chmod selection";
}
{
on = [
"<C-p>"
"g"
];
on = ["<C-p>" "g"];
run = "plugin lazygit";
desc = "Run LazyGit";
}
{
on = [
"<C-p>"
"a"
];
run = "plugin ouch 7z";
on = ["<C-p>" "a"];
run = "plugin ouch";
desc = "Add selection to archive";
}
{
on = [
"<C-p>"
"d"
];
run = ''shell --orphan -- ripdrag -a -n %s'';
on = ["<C-p>" "d"];
run = ''shell -- ripdrag -a -n "$@"'';
desc = "Drag & drop selection";
}
{
on = [
"<C-p>"
"D"
];
on = ["<C-p>" "D"];
run = "plugin diff";
desc = "Diff the selected with the hovered file";
}
{
on = [
"<C-p>"
"r"
];
on = ["<C-p>" "r"];
run = "plugin rsync";
desc = "Copy files using rsync";
}
{
on = [
"<C-p>"
"w"
];
run = ''shell -- wl-copy < %h'';
on = ["<C-p>" "w"];
run = ''wl-copy < "$0"'';
desc = "Copy hovered file contents using wl-copy";
}
@@ -257,10 +204,7 @@ in {
}
{
on = "y";
run = [
''shell -- for path in %s; do echo "file://$path"; done | wl-copy -t text/uri-list''
"yank"
];
run = [''shell -- for path in "$@"; do echo "file://$path"; done | wl-copy -t text/uri-list'' "yank"];
desc = "Copy files to system clipboard on yank";
}
# {
@@ -273,20 +217,13 @@ in {
run = "remove --permanently";
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
theme = {
mgr = {
cwd = {
fg = color.hexS.teal;
};
cwd = {fg = color.hexS.teal;};
hovered = {
fg = color.hexS.accentText;
@@ -343,9 +280,7 @@ in {
};
border_symbol = "";
border_style = {
fg = color.hexS.overlay0;
};
border_style = {fg = color.hexS.overlay0;};
};
tabs = {
@@ -414,104 +349,58 @@ in {
bg = color.hexS.surface0;
};
perm_type = {
fg = color.hexS.blue;
};
perm_read = {
fg = color.hexS.yellow;
};
perm_write = {
fg = color.hexS.red;
};
perm_exec = {
fg = color.hexS.green;
};
perm_sep = {
fg = color.hexS.overlay0;
};
perm_type = {fg = color.hexS.blue;};
perm_read = {fg = color.hexS.yellow;};
perm_write = {fg = color.hexS.red;};
perm_exec = {fg = color.hexS.green;};
perm_sep = {fg = color.hexS.overlay0;};
};
input = {
border = {
fg = color.hexS.accentDim;
};
border = {fg = color.hexS.accentDim;};
title = {};
value = {};
selected = {
reversed = true;
};
selected = {reversed = true;};
};
pick = {
border = {
fg = color.hexS.accentDim;
};
active = {
fg = color.hexS.accentHl;
};
border = {fg = color.hexS.accentDim;};
active = {fg = color.hexS.accentHl;};
inactive = {};
};
confirm = {
border = {
fg = color.hexS.accentDim;
};
title = {
fg = color.hexS.accentDim;
};
border = {fg = color.hexS.accentDim;};
title = {fg = color.hexS.accentDim;};
content = {};
list = {};
btn_yes = {
reversed = true;
};
btn_yes = {reversed = true;};
btn_no = {};
};
cmp = {
border = {
fg = color.hexS.accentDim;
};
border = {fg = color.hexS.accentDim;};
};
tasks = {
border = {
fg = color.hexS.accentDim;
};
border = {fg = color.hexS.accentDim;};
title = {};
hovered = {
underline = true;
};
hovered = {underline = true;};
};
which = {
cand = {
fg = color.hexS.accent;
};
desc = {
fg = color.hexS.accentHl;
};
mask = {
bg = color.hexS.surface0;
};
rest = {
fg = color.hexS.surface0;
};
cand = {fg = color.hexS.accent;};
desc = {fg = color.hexS.accentHl;};
mask = {bg = color.hexS.surface0;};
rest = {fg = color.hexS.surface0;};
separator = " ";
separator_style = {
fg = color.hexS.text;
};
separator_style = {fg = color.hexS.text;};
};
help = {
on = {
fg = color.hexS.accent;
};
run = {
fg = color.hexS.accentHl;
};
desc = {
fg = color.hexS.text;
};
on = {fg = color.hexS.accent;};
run = {fg = color.hexS.accentHl;};
desc = {fg = color.hexS.text;};
hovered = {
fg = color.hexS.accentText; # TODO: This is not applied
@@ -526,31 +415,19 @@ in {
};
notify = {
title_info = {
fg = color.hexS.teal;
};
title_warn = {
fg = color.hexS.yellow;
};
title_error = {
fg = color.hexS.red;
};
title_info = {fg = color.hexS.teal;};
title_warn = {fg = color.hexS.yellow;};
title_error = {fg = color.hexS.red;};
};
spot = {
border = {
fg = color.hexS.lavender;
};
title = {
fg = color.hexS.lavender;
};
border = {fg = color.hexS.lavender;};
title = {fg = color.hexS.lavender;};
tbl_cell = {
fg = color.hexS.lavender;
reversed = true;
};
tbl_col = {
bold = true;
};
tbl_col = {bold = true;};
};
# 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";
}
+9 -33
View File
@@ -9,42 +9,14 @@
mkCommonNixSettings = username: {
enable = true;
package = pkgs.nixVersions.stable;
extraOptions = ''
experimental-features = nix-command flakes pipe-operators
'';
settings = rec {
trusted-users = ["root" username];
auto-optimise-store = 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;
};
settings.trusted-users = ["root" username];
gc.automatic = false;
gc.options = "--delete-older-than 5d";
settings.auto-optimise-store = true;
optimise.automatic = true;
registry = lib.mapAttrs' (n: v: lib.nameValuePair n {flake = v;}) inputs;
nixPath = [
"nixpkgs=${inputs.nixpkgs.outPath}"
@@ -77,6 +49,7 @@
# Import the toplevel system configuration module.
../system
../system/cachix.nix
# Host specific configuration
../system/${hostname}
@@ -150,6 +123,9 @@
# to allow installation of unfree software and my own overlays.
{nixpkgs.pkgs = pkgs;}
# Import the toplevel system configuration module.
../system/cachix.nix
# Host specific configuration
../system/${hostname}
+31 -37
View File
@@ -29,36 +29,36 @@
# Remove this after jetbrains.jdk builds again (nixpkgs issue 425328)
# jetbrains.rider = pkgs-stable.jetbrains.rider;
# jetbrains =
# prev.jetbrains
# // {
# clion = prev.jetbrains.clion.overrideAttrs (oldAttrs: rec {
# version = "261.22158.47"; # March 6, 2026
#
# src = prev.fetchurl {
# url = "https://download-cdn.jetbrains.com/cpp/CLion-${version}.tar.gz";
#
# # hash = "sha256-h6tnemVnV1YEsvIndwrq2sMsRZYuvTWMU5oqj/hkjdY="; # 261.21849.6
# hash = "sha256-FUHNRioJvjwOWN+FkXEr3+NWR+QVxaZUOkJ0egQkcCQ="; # 261.22158.47
# };
#
# # autoPatchelfIgnoreMissingDeps = [
# # "libcrypto.so.1.1"
# # "libssl.so.1.1"
# # ];
#
# postFixup = ''
# # Patch python3.12 shared libs that the upstream glob (python3.8) misses
# find $out -path '*/python3.*/lib-dynload/*.so' -exec patchelf \
# --replace-needed libssl.so.1.1 libssl.so \
# --replace-needed libcrypto.so.1.1 libcrypto.so \
# --replace-needed libcrypt.so.1 libcrypt.so \
# {} +
#
# ${oldAttrs.postFixup or ""}
# '';
# });
# };
jetbrains =
prev.jetbrains
// {
clion = prev.jetbrains.clion.overrideAttrs (oldAttrs: rec {
version = "261.22158.47"; # March 6, 2026
src = prev.fetchurl {
url = "https://download-cdn.jetbrains.com/cpp/CLion-${version}.tar.gz";
# hash = "sha256-h6tnemVnV1YEsvIndwrq2sMsRZYuvTWMU5oqj/hkjdY="; # 261.21849.6
hash = "sha256-FUHNRioJvjwOWN+FkXEr3+NWR+QVxaZUOkJ0egQkcCQ="; # 261.22158.47
};
# autoPatchelfIgnoreMissingDeps = [
# "libcrypto.so.1.1"
# "libssl.so.1.1"
# ];
postFixup = ''
# Patch python3.12 shared libs that the upstream glob (python3.8) misses
find $out -path '*/python3.*/lib-dynload/*.so' -exec patchelf \
--replace-needed libssl.so.1.1 libssl.so \
--replace-needed libcrypto.so.1.1 libcrypto.so \
--replace-needed libcrypt.so.1 libcrypt.so \
{} +
${oldAttrs.postFixup or ""}
'';
});
};
# Now in Nixpkgs
# neovide = prev.neovide.overrideAttrs (finalAttrs: prevAttrs: {
@@ -94,10 +94,4 @@
};
in
# Composes a list of overlays and returns a single overlay function that combines them.
nixpkgs.lib.composeManyExtensions [
additions
modifications
# This is already a complete overlay with final: prev:, so it must be composed directly
(import ./latexminted.nix)
]
nixpkgs.lib.composeManyExtensions [additions modifications]
-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="
];
};
}
-7
View File
@@ -141,10 +141,6 @@
upgrade = true;
};
# taps = [
# "homebrew-zathura/zathura"
# ];
brews = [];
casks = [
@@ -155,9 +151,6 @@
"obsidian"
"protonvpn"
"signal"
# "zathura"
# "zathura-pdf-mupdf"
"zotero"
];
};
+28 -30
View File
@@ -144,7 +144,7 @@ with mylib.networking; {
documentation = {
# NOTE: Disable this while configuring stuff, it's slow
enable = false;
enable = true;
man.enable = config.documentation.enable;
man.cache.enable = true; # Slow but needed for neovim man picker
info.enable = config.documentation.enable;
@@ -337,8 +337,7 @@ with mylib.networking; {
niri = {
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
@@ -394,9 +393,9 @@ with mylib.networking; {
};
# Trims the journal if too large
journald.settings.Journal = {
SystemMaxUse = "50M";
};
journald.extraConfig = ''
SystemMaxUse=50M
'';
acpid.enable = true;
dbus.enable = true;
@@ -418,30 +417,29 @@ with mylib.networking; {
systemd = {
# 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" = {
# wantedBy = ["timers.target"];
# timerConfig = {
# OnCalendar = "weekly"; # or however often you'd like
# Persistent = true;
# Unit = "refresh-nps-cache.service";
# };
# };
# services."refresh-nps-cache" = {
# # Make sure `nix` and `nix-env` are findable by systemd.services.
# path = ["/run/current-system/sw/"];
# after = ["network.target"];
# 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 $?."
# '';
# };
services."refresh-nps-cache" = {
# Make sure `nix` and `nix-env` are findable by systemd.services.
path = ["/run/current-system/sw/"];
after = ["network.target"];
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 $?."
'';
};
};
}
+65 -98
View File
@@ -12,6 +12,7 @@
./disks.nix
# General services
../services/comfyui.nix
../services/fileflows-node.nix
];
@@ -123,6 +124,7 @@
# 31431 # Parsec
5173 # SvelteKit
8090 # PocketBase
8188 # ComfyUI
];
allowedUDPPorts = [
@@ -133,14 +135,13 @@
# 31431 # Parsec
5173 # SvelteKit
8090 # PocketBase
8188 # ComfyUI
];
};
sops-nix.secrets.${username} = [
"makemkv-app-key"
"restic-repo-key"
"context7-api-key"
"obsidian-rest-api-key"
];
};
@@ -192,53 +193,7 @@
# };
};
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
# environment.systemPackages = with pkgs; [];
programs = {
ausweisapp = {
@@ -246,77 +201,89 @@
openFirewall = true; # Directly set port in firewall
};
# TODO: Doesn't work with steam flatpak
# gamescope = {
# enable = true;
# enableWsi = true;
# };
ghidra = {
enable = true;
gdb = true;
};
steam.platformOptimizations.enable = true; # From nix-gaming module
virt-manager.enable = true;
};
services = {
# desktopManager.plasma6.enable = true;
# displayManager.gdm.enable = true; # Somehow, Plasma's own manager didn't work
btrfs.autoScrub = {
enable = true;
interval = "weekly";
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 = {
enable = false;
hwRender = true;
useXkbConfig = true;
# autologinUser = username;
config = let
color = config.home-manager.users.${username}.homemodules.color;
in {
# term=xterm-256color
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";
};
fonts = [
{
name = "MonoLisa Alt Script";
package = pkgs.monolisa;
}
];
# NOTE: Do NOT use multline strings here!
# This will create a linebreak in the systemd service and break login!
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 = {
+95 -96
View File
@@ -82,8 +82,7 @@
};
"swap" = {
mountpoint = "/swap";
# Configured in hardware-configuration.nix
# swap.swapfile.size = "64G";
swap.swapfile.size = "16G";
};
};
};
@@ -93,101 +92,101 @@
};
};
# games = {
# type = "disk";
# device = "/dev/disk/by-id/nvme-WD_BLACK_SN850X_2000GB_231623802252";
# content = {
# type = "gpt";
# partitions = {
# luks = {
# label = "LUKS_GAMES";
# size = "100%";
# content = {
# type = "luks";
# 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"
# ];
# };
# };
# };
# };
# };
# };
# };
# };
games = {
type = "disk";
device = "/dev/disk/by-id/nvme-WD_BLACK_SN850X_2000GB_231623802252";
content = {
type = "gpt";
partitions = {
luks = {
label = "LUKS_GAMES";
size = "100%";
content = {
type = "luks";
name = "crypted_games";
# ssd = {
# type = "disk";
# 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"
# ];
# };
# };
# };
# };
# };
# };
# };
# };
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 = {
type = "disk";
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";
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 = [
{
device = "/swap/swapfile";
size = 1024 * 64; # 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.
device = "/var/swap";
size = 1024 * 16; # Without hibernation 4.0 GB to 0.5 x RAM
}
];
@@ -160,9 +165,6 @@
# https://discourse.nixos.org/t/nvidia-open-breaks-hardware-acceleration/58770/3
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/formula11.nix
../services/formula12.nix
# ../services/statespaces.nix
../services/statespaces.nix
# General services
../services/arcane-agent.nix
../services/authelia.nix
../services/bazarr.nix
../services/box.nix
../services/fileflows.nix
../services/gitea.nix
../services/immich.nix
@@ -32,12 +32,11 @@
../services/kiwix.nix
../services/kopia.nix
../services/nextcloud.nix
../services/ntfy.nix
../services/nginx-proxy-manager.nix
../services/paperless.nix
# ../services/plex.nix # Their monetization strategy is absolutely atrocious
# ../services/portainer-agent.nix
# ../services/pulse-agent-servenix.nix
../services/portainer-agent.nix
../services/pulse-agent-servenix.nix
../services/prowlarr.nix
../services/radarr.nix
../services/sabnzbd-movies.nix
@@ -45,7 +44,7 @@
../services/sonarr.nix
../services/teamspeak.nix
../services/tinymediamanager.nix
# ../services/whats-up-docker.nix
../services/whats-up-docker.nix
];
systemmodules = {
@@ -85,7 +84,6 @@
443 # HTTPS (Nginx Proxy Manager)
3000 # Gitea (runner needs to reach local gitea instance)
3553 # Arcane
30033 # Teamspeak
10080 # Teamspeak
@@ -98,7 +96,6 @@
443 # HTTPS (Nginx Proxy Manager)
3000 # Gitea (runner needs to reach local gitea instance)
3553 # Arcane
5520 # HyTale
@@ -113,9 +110,6 @@
"kopia-server-password"
"kopia-user-password"
"paperless-nextcloud-sync-password"
"ntfy-auth-users"
"ntfy-auth-tokens"
"arcane-agent-key"
];
};
+7 -1
View File
@@ -69,6 +69,12 @@
fsType = "nfs";
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 = [
@@ -86,7 +92,7 @@
nvidia-container-toolkit.enable = true;
nvidia = {
package = config.boot.kernelPackages.nvidiaPackages.legacy_580;
package = config.boot.kernelPackages.nvidiaPackages.stable;
modesetting.enable = false;
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,
...
}: let
fileflowsVersion = "26.06";
fileflowsVersion = "26.01";
in {
virtualisation.oci-containers.containers = {
fileflows-node = {
+1 -1
View File
@@ -5,7 +5,7 @@
pkgs,
...
}: let
version = "26.06";
version = "26.01";
in {
virtualisation.oci-containers.containers = {
fileflows = {
+2 -2
View File
@@ -5,8 +5,8 @@
pkgs,
...
}: let
giteaVersion = "1.27.0";
runnerVersion = "0.6.1";
giteaVersion = "1.24.2";
runnerVersion = "0.2.12";
in {
users = {
groups.git = {};
+1 -1
View File
@@ -7,7 +7,7 @@
}: let
vectorchordVersion = "0.4.2";
pgvectorsVersion = "0.2.0";
immichVersion = "3.2.0-cuda";
immichVersion = "2.5.2";
in {
virtualisation.oci-containers.containers = {
immich-database = {
+1 -1
View File
@@ -5,7 +5,7 @@
pkgs,
...
}: let
jellyfinVersion = "version-12.1ubu2604";
jellyfinVersion = "10.11.2";
in {
virtualisation.oci-containers.containers = {
jellyfin = {
+2 -1
View File
@@ -18,7 +18,8 @@ in {
];
volumes = [
"/home/christoph/ssd/kiwix:/data"
# TODO: Add network location for .zim files
"kiwix_data:/data"
];
environment = {
+2 -13
View File
@@ -30,24 +30,20 @@ in {
volumes = let
# TODO: Setup on ThinkNix: adguard_config, adguard_work, portainer_config
backup = [
"arcane-agent_data"
"authelia_config"
"bazarr_config"
"fileflows_data"
"formula10_cache"
"formula10_data"
"formula11_pb_data"
"formula12_pb_data"
"gitea-db_data"
"gitea_data"
"gitea-runner_config"
"gitea-runner_data"
"gitea_data"
"heidi_config"
"immich-database_data"
"immich_config"
"immich_data"
"immich_machine-learning"
"jellyfin_config"
"kopia_config"
"nextcloud-db_data"
"nextcloud_data"
"nginx_config"
@@ -55,13 +51,6 @@ in {
"nginx_snippets"
"paperless-postgres_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";
+1 -1
View File
@@ -5,7 +5,7 @@
pkgs,
...
}: let
nextcloudVersion = "33.0.5-apache";
nextcloudVersion = "31.0.6-apache";
in {
systemd.services.nextcloud-cron = {
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,
...
}: let
teamspeakVersion = "6.0.0-beta11";
teamspeakVersion = "v6.0.0-beta7";
in {
virtualisation.oci-containers.containers = {
teamspeak = {
@@ -24,8 +24,7 @@ in {
];
volumes = [
# "teamspeak_data:/var/tsserver"
"teamspeak_data2:/var/tsserver"
"teamspeak_data:/var/tsserver"
];
environment = {
@@ -42,13 +42,6 @@ in {
boot.lanzaboote = {
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!
pkiBundle = "/var/lib/sbctl";
+1
View File
@@ -72,6 +72,7 @@ in {
if docker.podman
then "podman"
else "docker"; # "docker" or "podman"
libvirtd.enable = true;
};
systemd.services = let
-1
View File
@@ -30,7 +30,6 @@ in {
# Sans/Serif fonts
noto-fonts
noto-fonts-color-emoji
noto-fonts-cjk-serif
noto-fonts-cjk-sans
lxgw-wenkai
];
+4 -29
View File
@@ -69,14 +69,11 @@ in {
# https://github.com/nix-community/impermanence/issues/253
(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/db/sudo" m711)
(mkRDir "/var/lib/auto-cryptenroll" m755) # Lanzaboote
(mkRDir "/var/lib/bluetooth" m755) # m700
(mkRDir "/var/lib/btrfs" m755)
(mkRDir "/var/lib/containers" m755)
@@ -85,7 +82,7 @@ in {
(mkRDir "/var/lib/libvirt" m755)
(mkRDir "/var/lib/NetworkManager" m755)
(mkRDir "/var/lib/nixos" m755)
(mkRDir "/var/lib/sbctl" m755) # Lanzaboote
(mkRDir "/var/lib/sbctl" m755)
(mkRDir "/var/lib/systemd" m755)
(mkRDir "/var/tmp" m777)
@@ -121,51 +118,34 @@ in {
# The shit some applications add to ~/ without asking
# (mkUDir ".android" m755) # Unity
(mkUDir ".claude" m755)
(mkUDir ".codex" m755)
# (mkUDir ".comfy" m755)
(mkUDir ".docker" m755)
# (mkUDir ".gradle" m755) # Unity
(mkUDir ".java" m755) # JetBrains
(mkUDir ".lmstudio" m755)
(mkUDir ".MakeMKV" m755)
(mkUDir ".mozilla/firefox" m755) # TODO: Remove this someday
(mkUDir ".mozilla/native-messaging-hosts" m755)
(mkUDir ".nix-package-search" m755)
(mkUDir ".npm" m755) # Contains mcp servers :/
# (mkUDir ".nv" m755) # Unity
# (mkUDir ".ollama" m755)
# (mkUDir ".plastic4" m755) # Unity
(mkUDir ".tableplus" m755)
(mkUDir ".tiddl" m755)
(mkUDir ".var/app" m755)
(mkUDir ".vim/undo" m755)
(mkUDir ".vscode" m755)
(mkUDir ".zotero" m755)
# Cache that's actually useful
(mkUDir ".cache/claude-cli-nodejs" m755)
(mkUDir ".cache/elephant" m755)
(mkUDir ".cache/fish/generated_completions" m755)
(mkUDir ".cache/nix" m755)
(mkUDir ".cache/nix-index" m755)
(mkUDir ".cache/nix-search-tv" m755)
(mkUDir ".cache/nvim" m755)
(mkUDir ".cache/JetBrains" m755)
(mkUDir ".cache/keepassxc" m755)
(mkUDir ".cache/opencode" m755)
(mkUDir ".cache/uv" m755)
# Config
# (mkUDir ".config/.android" m755) # Unity
(mkUDir ".config/ai.opencode.desktop" m755)
# (mkUDir ".config/beekeeper-studio" m755)
(mkUDir ".config/beets" m755)
(mkUDir ".config/blender" m755)
(mkUDir ".config/chromium" m755)
(mkUDir ".config/Claude" m755) # Claude desktop
(mkUDir ".config/Code" m755)
(mkUDir ".config/Codex" m755)
(mkUDir ".config/chromium" m755) # TODO: Remove this someday
(mkUDir ".config/Ferdium" m755)
(mkUDir ".config/feishin" m755)
(mkUDir ".config/fish/completions" m755)
@@ -176,13 +156,11 @@ in {
(mkUDir ".config/JetBrains" m755)
(mkUDir ".config/kdeconnect" m755)
(mkUDir ".config/keepassxc" m755)
(mkUDir ".config/LM Studio" m755)
(mkUDir ".config/Msty" m755)
(mkUDir ".config/Nextcloud" m755)
# (mkUDir ".config/niri/dms" m755)
(mkUDir ".config/obsidian" m755)
(mkUDir ".config/obs-studio" m755)
(mkUDir ".config/opencode" m755)
(mkUDir ".config/Signal" m755)
# (mkUDir ".config/singularitygroup-hotreload" m755) # Unity
(mkUDir ".config/TeamSpeak" m755)
@@ -190,7 +168,6 @@ in {
(mkUDir ".config/tidal_dl_ng" m755)
# (mkUDir ".config/unity3d" m755) # Unity
# (mkUDir ".config/unityhub" m755) # Unity
(mkUDir ".config/Vector 35" m755)
(mkUDir ".config/vlc" m755)
(mkUDir ".config/Zeal" m755)
(mkUDir ".config/zed" m755)
@@ -205,7 +182,7 @@ in {
(mkUDir ".local/share/hytale-launcher" m755)
(mkUDir ".local/share/Hytale" m755)
(mkUDir ".local/share/jellyfin-desktop" m755)
(mkUDir ".local/share/jellyfin-tui" m755)
# (mkUDir ".local/share/jellyfin-tui" m755) # Configured using nix
(mkUDir ".local/share/JetBrains" m755) # Unity
(mkUDir ".local/share/keyrings" m755) # m700
(mkUDir ".local/share/IsolatedStorage" m755) # JetBrains license data
@@ -214,7 +191,6 @@ in {
(mkUDir ".local/share/net.lrclib.lrcget" m755)
(mkUDir ".local/share/nix" m755)
(mkUDir ".local/share/nvim" m755)
(mkUDir ".local/share/opencode" m755)
(mkUDir ".local/share/qutebrowser" m755)
(mkUDir ".local/share/systemd" m755)
# (mkUDir ".local/share/unity3d" m755) # Unity
@@ -227,7 +203,6 @@ in {
(mkUDir ".local/state/lazygit" m755)
(mkUDir ".local/state/nix" m755)
(mkUDir ".local/state/nvim" m755)
(mkUDir ".local/state/opencode" m755)
(mkUDir ".local/state/waypaper" m755)
(mkUDir ".local/state/wireplumber" m755)
];
+1 -6
View File
@@ -21,7 +21,7 @@ in {
${mime.defaultTextEditor} = mime.textTypes;
${mime.defaultFileBrowser} = ["inode/directory"];
${mime.defaultWebBrowser} = mime.webTypes;
${mime.defaultPdfViewer} = ["application/pdf" "application/epub+zip"];
${mime.defaultPdfViewer} = ["application/pdf"];
${mime.defaultImageViewer} = mime.imageTypes;
# If audio and video player are equal, we assign all types to the audio player,
@@ -75,11 +75,6 @@ in {
"chromium-browser.desktop"
"com.google.Chrome.desktop"
"firefox.desktop"
"org.onlyoffice.desktopeditors.desktop"
"calibre-ebook-edit.desktop"
"calibre-ebook-viewer.desktop"
"calibre-gui.desktop"
"calibre-lrfviewer.desktop"
];
"text/plain" = [
"firefox.desktop"
+2 -2
View File
@@ -34,11 +34,11 @@ in {
secrets = let
mkSecret = name: {
${name} = lib.mkMerge [
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
(lib.optionalAttrs pkgs.stdenv.isLinux {
owner = config.users.users.${username}.name;
group = config.users.users.${username}.group;
})
(lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
(lib.optionalAttrs pkgs.stdenv.isDarwin {
owner = config.users.users.${username}.name;
group = "staff"; # Apparently there's no way to get the primary group?
})
+6 -13
View File
@@ -11,28 +11,22 @@ jellyfin-password: ENC[AES256_GCM,data:ugfwgpkIiLY0O+m/UGnBB5AFPBkCcai+RQOkxiCSo
#
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]
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]
#
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-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]
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]
#
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:
age:
- enc: |
- recipient: age14ph8vrj657e7s35d60xehzuq46t9zd6pzcm6pw4jragzrvf6xs9s77usnm
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWSVRhVDREMXduZElrRklE
R2s3Y081TGVTOCtKWVVWN0RLb0ZIT3lmMTNZCjFaNmRqb2hRVXFDSU12dFhDNmJo
@@ -40,8 +34,7 @@ sops:
SURMTmh1TGIrRmtENzc0Sk4rNFJNUE0KOpjN6jkEHO+lvdWdp4P++r9SNSPWaT0h
FAbbvZZ/EdIk/njLEcayFN7B4ftTcD/f4XJZiyosilZnIkk76bMOHA==
-----END AGE ENCRYPTED FILE-----
recipient: age14ph8vrj657e7s35d60xehzuq46t9zd6pzcm6pw4jragzrvf6xs9s77usnm
lastmodified: "2026-09-14T21:08:40Z"
mac: ENC[AES256_GCM,data:tfkmsJfWYV11ruw8fCUkJ2gWQAvQJ4Gmsz72LnmiCdlvzeo4x9iM268ZJnuaPRuv6BXLp2XGGA4CbqhfZbO6cRxAawVfbxY2IRSo1JWITIY8qxKLb07jDMpQu/JjJz7J5T556UEvOsW6HrK3d0xvNlJ4yQIuVCBjttKTdRu5g9Y=,iv:mV5i0xJGu6fnSNPLm9J3NDDgN+sB6iadue917UjR+oU=,tag:h/vaeQ02wK/qKANerWIywQ==,type:str]
lastmodified: "2026-03-26T19:30:04Z"
mac: ENC[AES256_GCM,data:DGsz+TNyYXuX45Go4fkFDoWePhx1KUzq94awp+1bQtmq2MC+bPJrTNqvhBDx/I2OWFUNSh/0lXJVvaz4gfeYT9z8YCniJeb3z53ui7ldFL0BNnA6ua1iIViWbJvYARgWlSiuU7wTsb8om57Kainkpm9C9pp2U+vQqQ4suxLmrko=,iv:sUibX01AHDrscPqz+gIPyJhLRJYkyW4DPcQ3QtUGha0=,tag:8yuSGHMg1Z7kDMo2Bx4QlA==,type:str]
unencrypted_suffix: _unencrypted
version: 3.13.3
version: 3.12.2
+5 -7
View File
@@ -16,12 +16,11 @@
# General services
../services/adguard.nix
../services/arcane.nix
../services/nginx-proxy-manager.nix
# ../services/portainer.nix
# ../services/pulse.nix
# ../services/pulse-agent-thinknix.nix
# ../services/whats-up-docker.nix
../services/portainer.nix
../services/pulse.nix
../services/pulse-agent-thinknix.nix
../services/whats-up-docker.nix
];
systemmodules = {
@@ -68,8 +67,7 @@
};
sops-nix.secrets.${username} = [
"arcane-encryption-key"
"arcane-jwt-secret"
# "wireguard-vps-private-key"
];
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 MiB

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