about summary refs log tree commit diff stats
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--modules/by-name/ad/adb/module.nix9
-rw-r--r--modules/by-name/ag/age/module.nix25
-rw-r--r--modules/by-name/at/atuin/atuin.zsh137
-rw-r--r--modules/by-name/at/atuin/module.nix35
-rw-r--r--modules/by-name/at/atuin/secrets/encryption_key.age.license9
-rw-r--r--modules/by-name/ba/backup/module.nix212
-rw-r--r--modules/by-name/ba/backup/secrets/local/repository_password.age20
-rw-r--r--modules/by-name/ba/backup/secrets/storagebox/repository_password.age14
-rw-r--r--modules/by-name/ba/backup/secrets/storagebox/ssh_key.age22
-rw-r--r--modules/by-name/bl/bluetooth/module.nix9
-rw-r--r--modules/by-name/bo/boot/boot_pictures/gnu.png.license9
-rw-r--r--modules/by-name/bo/boot/boot_pictures/gnulin_emb_1.png.license9
-rw-r--r--modules/by-name/bo/boot/boot_pictures/gnulin_emb_2.png.license9
-rw-r--r--modules/by-name/bo/boot/iso_entry/archlive_iso.nix9
-rw-r--r--modules/by-name/bo/boot/iso_entry/signing_key.nix9
-rw-r--r--modules/by-name/bo/boot/module.nix14
-rw-r--r--modules/by-name/ca/cargo/module.nix27
-rw-r--r--modules/by-name/cl/cleanup/module.nix9
-rw-r--r--modules/by-name/dc/dconf/module.nix9
-rw-r--r--modules/by-name/di/direnv/module.nix30
-rw-r--r--modules/by-name/di/disks/fstrim.nix9
-rw-r--r--modules/by-name/di/disks/hibernate.nix9
-rw-r--r--modules/by-name/di/disks/module.nix14
-rw-r--r--modules/by-name/do/documentation/module.nix9
-rw-r--r--modules/by-name/fi/firefox/extensions.json (renamed from modules/home.legacy/conf/firefox/config/extensions/extensions.json)30
-rw-r--r--modules/by-name/fi/firefox/extensions.json.license9
-rw-r--r--modules/by-name/fi/firefox/module.nix248
-rw-r--r--modules/by-name/fi/firefox/profile.nix189
-rw-r--r--modules/by-name/fi/firefox/search_engines/default.nix (renamed from modules/home.legacy/conf/firefox/config/search/engines/default.nix)65
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/arch_linux.svg (renamed from modules/home.legacy/conf/firefox/config/search/engines/logos/arch_linux.svg)0
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/arch_linux.svg.license9
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/brave.svg (renamed from modules/home.legacy/conf/firefox/config/search/engines/logos/brave.svg)0
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/brave.svg.license9
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/google_scholar.ico (renamed from modules/home.legacy/conf/firefox/config/search/engines/logos/google_scholar.ico)bin3871 -> 3871 bytes
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/google_scholar.ico.license9
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/rust_std.svg (renamed from modules/home.legacy/conf/firefox/config/search/engines/logos/rust_std.svg)0
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/rust_std.svg.license9
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/rust_tokio.png (renamed from modules/home.legacy/conf/firefox/config/search/engines/logos/rust_tokio.png)bin3551 -> 3551 bytes
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/rust_tokio.png.license9
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/wikipedia.svg (renamed from modules/home.legacy/conf/firefox/config/search/engines/logos/wikipedia.svg)0
-rw-r--r--modules/by-name/fi/firefox/search_engines/logos/wikipedia.svg.license9
-rwxr-xr-xmodules/by-name/fi/firefox/update_extensions.sh22
-rw-r--r--modules/by-name/fi/firefox/userChrome.css (renamed from modules/home.legacy/conf/firefox/config/chrome/userChrome.css)12
-rw-r--r--modules/by-name/fo/fonts/emoji_font.xml13
-rw-r--r--modules/by-name/fo/fonts/module.nix9
-rw-r--r--modules/by-name/fw/fwupd/module.nix9
-rw-r--r--modules/by-name/gi/git/aliases.nix9
-rw-r--r--modules/by-name/gi/git/git_ignore.git.license9
-rw-r--r--modules/by-name/gi/git/git_template.git.license9
-rw-r--r--modules/by-name/gi/git/module.nix9
-rw-r--r--modules/by-name/gp/gpg/keys/key_1.asc (renamed from modules/home.legacy/conf/gpg/keys/key_1.asc)10
-rw-r--r--modules/by-name/gp/gpg/keys/key_2.asc (renamed from modules/home.legacy/conf/gpg/keys/key_2.asc)10
-rw-r--r--modules/by-name/gp/gpg/module.nix90
-rw-r--r--modules/by-name/ha/hardware/module.nix9
-rw-r--r--modules/by-name/ho/home-manager/module.nix45
-rw-r--r--modules/by-name/i3/i3bar-river/module.nix197
-rw-r--r--modules/by-name/i3/i3status-rust/module.nix152
-rwxr-xr-xmodules/by-name/i3/i3status-rust/scripts/mpd_song_name.sh32
-rw-r--r--modules/by-name/im/impermanence/module.nix17
-rw-r--r--modules/by-name/im/imv/module.nix9
-rw-r--r--modules/by-name/is/issue_file/module.nix9
-rw-r--r--modules/by-name/la/laptop/module.nix9
-rw-r--r--modules/by-name/le/less/command.less.license9
-rw-r--r--modules/by-name/le/less/env.less.license9
-rw-r--r--modules/by-name/le/less/line-edit.less.license9
-rw-r--r--modules/by-name/le/less/module.nix9
-rw-r--r--modules/by-name/lf/lf/colors5
-rw-r--r--modules/by-name/lf/lf/colors.license9
-rwxr-xr-xmodules/by-name/lf/lf/commands/base.sh88
-rw-r--r--modules/by-name/lf/lf/commands/default.nix266
-rwxr-xr-xmodules/by-name/lf/lf/commands/run.sh40
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/archive.sh77
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/archive_compress.sh73
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/archive_decompress.sh33
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/broot_jump.sh25
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/cd_project_root.sh29
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/chmod.sh24
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/clear_trash.sh8
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/cow_cp.sh10
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/dl_file.sh43
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/dragon.sh17
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/dragon_individual.sh17
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/dragon_stay.sh17
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/execute.sh13
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/follow_link.sh21
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/fzf_jump.sh24
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/go_project_root.sh22
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/mk_directory.sh (renamed from modules/by-name/lf/lf/commands/scripts/mk_dir.sh)15
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/mk_file.sh15
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/mk_file_and_edit.sh33
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/mk_link.sh (renamed from modules/by-name/lf/lf/commands/scripts/mk_ln.sh)26
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/mk_scr_default.sh38
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/mk_script.sh (renamed from modules/by-name/lf/lf/commands/scripts/mk_scr_temp.sh)27
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/restore_trash.sh16
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/set_clipboard_path.sh17
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/set_wall_paper.sh19
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/set_wallpaper.sh29
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/stripspace.sh44
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/trash.sh34
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/trash_clear.sh19
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/trash_restore.sh27
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/unarchive.sh36
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/view_file.sh15
-rw-r--r--modules/by-name/lf/lf/ctpv/default.nix50
-rw-r--r--modules/by-name/lf/lf/ctpv/helpers.sh12
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/any.sh21
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/archive/atool.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/archive/default.nix11
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/dll/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/dll/dll.sh17
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/epub/default.nix19
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/epub/epub.sh17
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix10
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/pdf/pdf.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/pgp/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/pgp/pgp.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/sqlite/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/sqlite/sqlite.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/torrent.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/x-pem-file/default.nix20
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/x-pem-file/pem.sh18
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/audio/audio.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/audio/default.nix10
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/default.nix18
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/font/default.nix10
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/font/font.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/image/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/image/image.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/image/svg+xml/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/image/svg+xml/svg.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/image/x-xcf/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/image/x-xcf/xcf.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/inode/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/inode/ls.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/inode/symlink.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/libreoffice.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/remove_default_previews.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/bat.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/diff/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/diff/delta.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/glow.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/html/default.nix13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/html/elinks.sh18
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/json/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/json/jq.sh13
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/video/default.nix9
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/video/video.sh13
-rw-r--r--modules/by-name/lf/lf/icons.license9
-rw-r--r--modules/by-name/lf/lf/keybindings/default.nix36
-rw-r--r--modules/by-name/lf/lf/module.nix18
-rw-r--r--modules/by-name/lf/lf/wrappers/default.nix4
-rw-r--r--modules/by-name/lf/lf/wrappers/ll/default.nix18
-rwxr-xr-xmodules/by-name/lf/lf/wrappers/ll/ll.sh29
-rw-r--r--modules/by-name/lf/lf/wrappers/lm/default.nix18
-rwxr-xr-xmodules/by-name/lf/lf/wrappers/lm/lm.sh28
-rw-r--r--modules/by-name/li/libvirtd/module.nix13
-rw-r--r--modules/by-name/lo/locale/keymaps/dvorak_modified.xkb.license9
-rw-r--r--modules/by-name/lo/locale/keymaps/us_modified.xkb9
-rw-r--r--modules/by-name/lo/locale/module.nix14
-rw-r--r--modules/by-name/ma/mako/module.nix81
-rw-r--r--modules/by-name/mp/mpd/module.nix9
-rw-r--r--modules/by-name/mp/mpd/mpc.nix14
-rw-r--r--modules/by-name/mp/mpd/mpdconf.example.license9
-rw-r--r--modules/by-name/mp/mpv/module.nix54
-rw-r--r--modules/by-name/ne/networking/module.nix9
-rw-r--r--modules/by-name/ni/nix-index/command_not_found.sh (renamed from modules/by-name/zs/zsh/config/command_not_found/command_not_found.sh)12
-rw-r--r--modules/by-name/ni/nix-index/module.nix44
-rw-r--r--modules/by-name/ni/nix/module.nix24
-rw-r--r--modules/by-name/ni/nixos-shell/module.nix128
-rwxr-xr-xmodules/by-name/ni/nixos-shell/nixos-shell.sh60
-rw-r--r--modules/by-name/ni/nixos-shell/shell_setup.nix191
-rw-r--r--modules/by-name/ni/nixpkgs/config.nix19
-rw-r--r--modules/by-name/ni/nixpkgs/module.nix44
-rw-r--r--modules/by-name/nv/nvim/autocmds/default.nix9
-rw-r--r--modules/by-name/nv/nvim/clipboard/default.nix9
-rw-r--r--modules/by-name/nv/nvim/mappings/default.nix37
-rw-r--r--modules/by-name/nv/nvim/module.nix17
-rw-r--r--modules/by-name/nv/nvim/options/default.nix10
-rw-r--r--modules/by-name/nv/nvim/plgs/colorscheme/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/colorscheme/lua/mk_todos_readable.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/colorscheme/lua/nightfox.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/comment-nvim/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/debugprint/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/femaco/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix12
-rw-r--r--modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/goto-preview/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/goto-preview/lua/goto-preview.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/harpoon/default.nix125
-rw-r--r--modules/by-name/nv/nvim/plgs/leap/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lf-nvim/default.nix17
-rw-r--r--modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/keymaps/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/bashls.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/ccls.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/ltex.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/lua-ls.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/nil-ls.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/pylyzer.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/rust-analyzer.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/texlab.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/lspkind/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/ltex_extra/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/ltex_extra/lua/ltex_extra.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/lualine/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/default.nix86
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/lua/luasnip.lua7
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/all.lua211
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/html/html.lua102
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua28
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/tex/greek.lua37
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/snippets/all.lua338
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/snippets/tex/delimiter.lua41
-rw-r--r--modules/by-name/nv/nvim/plgs/luasnip/snippets/tex/greek.lua49
-rw-r--r--modules/by-name/nv/nvim/plgs/neorg/default.nix15
-rw-r--r--modules/by-name/nv/nvim/plgs/neorg/key_mappings.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/nvim-cmp/default.nix122
-rw-r--r--modules/by-name/nv/nvim/plgs/nvim-lint/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/nvim-lint/lua/nvim-lint.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/raw_plugins/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/defaults/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/default.nix62
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/tex.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/extensions/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/extensions/frecency/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/extensions/fzy-native/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua10
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/extensions/symbols/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/telescope/keymaps/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/todo-comments/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/treesitter/default.nix23
-rw-r--r--modules/by-name/nv/nvim/plgs/vim-tex/default.nix9
-rw-r--r--modules/by-name/nv/nvim/plgs/which-key/default.nix9
-rw-r--r--modules/by-name/ol/ollama/module.nix19
-rw-r--r--modules/by-name/op/openssh/module.nix9
-rw-r--r--modules/by-name/pi/printing/module.nix9
-rw-r--r--modules/by-name/po/polkit/module.nix9
-rw-r--r--modules/by-name/po/postgresql/module.nix9
-rw-r--r--modules/by-name/po/power/module.nix9
-rwxr-xr-xmodules/by-name/ri/river/init_base.sh32
-rw-r--r--modules/by-name/ri/river/module.nix212
-rw-r--r--modules/by-name/ri/river/river-start/package.nix23
-rwxr-xr-xmodules/by-name/ri/river/river-start/river-start.sh20
-rw-r--r--modules/by-name/sc/scanning/module.nix9
-rw-r--r--modules/by-name/se/serverphone/certificates/ca.crt.license9
-rw-r--r--modules/by-name/se/serverphone/certificates/server.crt.license9
-rw-r--r--modules/by-name/se/serverphone/module.currently_ignored.nix24
-rw-r--r--modules/by-name/se/serverphone/private_keys/ca.key.license9
-rw-r--r--modules/by-name/se/serverphone/private_keys/server.key.license9
-rw-r--r--modules/by-name/sn/snapper/module.nix9
-rw-r--r--modules/by-name/so/sound/module.nix11
-rw-r--r--modules/by-name/ss/ssh/module.nix55
-rw-r--r--modules/by-name/st/steam/module.nix25
-rw-r--r--modules/by-name/sw/swaylock/images/GTDcanonical.png (renamed from modules/home.legacy/conf/swaylock/GTDcanonical.png)bin34659 -> 34659 bytes
-rw-r--r--modules/by-name/sw/swaylock/images/GTDcanonical.png.license9
-rw-r--r--modules/by-name/sw/swaylock/images/commands.jpg (renamed from modules/home.legacy/conf/swaylock/commands.jpg)bin629695 -> 629695 bytes
-rw-r--r--modules/by-name/sw/swaylock/images/commands.jpg.license9
-rw-r--r--modules/by-name/sw/swaylock/images/duwon-lee-tempano-port.jpgbin0 -> 671125 bytes
-rw-r--r--modules/by-name/sw/swaylock/images/duwon-lee-tempano-port.jpg.license9
-rw-r--r--modules/by-name/sw/swaylock/images/gnu.png (renamed from modules/home.legacy/conf/swaylock/gnu.png)bin327518 -> 327518 bytes
-rw-r--r--modules/by-name/sw/swaylock/images/gnu.png.license9
-rw-r--r--modules/by-name/sw/swaylock/module.nix36
-rw-r--r--modules/by-name/sy/system_diff/module.nix9
-rw-r--r--modules/by-name/ta/taskwarrior/module.nix189
-rw-r--r--modules/by-name/ta/taskwarrior/nord.theme (renamed from modules/home.legacy/conf/taskwarrior/nord.theme)0
-rw-r--r--modules/by-name/ta/taskwarrior/nord.theme.license9
-rw-r--r--modules/by-name/ta/taskwarrior/secrets/ca.cert161
-rw-r--r--modules/by-name/ta/taskwarrior/secrets/credentials15
-rw-r--r--modules/by-name/ta/taskwarrior/secrets/private.key449
-rw-r--r--modules/by-name/ta/taskwarrior/secrets/public.cert83
-rw-r--r--modules/by-name/ta/taskwarrior/secrets/sync_server_encryption_key.age41
-rw-r--r--modules/by-name/ti/timewarrior/module.nix97
-rw-r--r--modules/by-name/ti/timewarrior/nord.theme (renamed from modules/home.legacy/conf/timewarrior/nord.theme)0
-rw-r--r--modules/by-name/ti/timewarrior/nord.theme.license9
-rwxr-xr-xmodules/by-name/ti/timewarrior/taskwarrior_hooks/on-modify.track-timewarrior.py109
-rwxr-xr-xmodules/by-name/ti/timewarrior/taskwarrior_hooks/on-modify.track-total-active-time.py (renamed from modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py)52
-rw-r--r--modules/by-name/ts/tskm/module.nix136
-rwxr-xr-xmodules/by-name/ts/tskm/taskwarrior_hooks/enforce-projects.sh22
-rw-r--r--modules/by-name/un/unison/module.nix12
-rw-r--r--modules/by-name/un/unison/shellScript.nix38
-rw-r--r--modules/by-name/us/users/module.nix59
-rw-r--r--modules/by-name/ve/version/module.nix9
-rw-r--r--modules/by-name/wa/water-reminder/module.nix66
-rw-r--r--modules/by-name/wa/waydroid/module.nix9
-rw-r--r--modules/by-name/xd/xdg/module.nix150
-rwxr-xr-xmodules/by-name/xd/xdg/scripts/lf-wrapper.sh50
-rwxr-xr-xmodules/by-name/xd/xdg/scripts/lf_wrapper.sh79
-rwxr-xr-xmodules/by-name/xd/xdg/scripts/ranger_wrapper.sh68
-rwxr-xr-xmodules/by-name/xd/xdg/scripts/url-handler.sh29
-rw-r--r--modules/by-name/ya/yambar/config/config.yml10
-rw-r--r--modules/by-name/ya/yambar/module.nix19
-rwxr-xr-xmodules/by-name/ya/yambar/scripts/disk.sh10
-rwxr-xr-xmodules/by-name/ya/yambar/scripts/mpd_song_name.sh10
-rwxr-xr-xmodules/by-name/ya/yambar/scripts/network.sh10
-rwxr-xr-xmodules/by-name/ya/yambar/scripts/sound-volume.sh10
-rw-r--r--modules/by-name/ya/yambar/settings/default.nix9
-rw-r--r--modules/by-name/yt/yt/config.toml10
-rw-r--r--modules/by-name/yt/yt/input.conf4
-rw-r--r--modules/by-name/yt/yt/input.conf.license9
-rw-r--r--modules/by-name/yt/yt/module.nix9
-rw-r--r--modules/by-name/yt/yt/mpv.conf1
-rw-r--r--modules/by-name/yt/yt/mpv.conf.license9
-rw-r--r--modules/by-name/za/zathura/module.nix9
-rw-r--r--modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh11
-rw-r--r--modules/by-name/zs/zsh/config/custom_cursor.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/edit_command_line.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps/.safe.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps/command.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps/emacs.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps/isearch.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps/vicmd.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps/viins.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps/viopp.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps/visual.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps_end.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/keymaps_start.zsh10
-rw-r--r--modules/by-name/zs/zsh/config/zsh-init.zsh10
-rw-r--r--modules/by-name/zs/zsh/module.nix214
-rw-r--r--modules/by-name/zs/zsh/plugins/zsh-history-substring-search.zsh45
-rw-r--r--modules/common/abstract-nord.png (renamed from modules/home.legacy/files/wallpaper/abstract-nord.png)bin140219 -> 140219 bytes
-rw-r--r--modules/common/abstract-nord.png.license9
-rw-r--r--modules/common/default.nix298
-rw-r--r--modules/common/hooks/default.nix17
-rwxr-xr-xmodules/common/hooks/scripts/sync-git-repo.sh23
-rw-r--r--modules/common/nixos_shell_configuration.nix66
-rw-r--r--modules/common/projects.json132
-rw-r--r--modules/common/projects.json.license9
-rw-r--r--modules/default.nix21
-rw-r--r--modules/home.legacy/conf/alacritty/default.nix9
-rw-r--r--modules/home.legacy/conf/alacritty/toml/bell.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/colorscheme.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/cursor.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/env.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/font.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/general.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/hints.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/mouse.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/scrolling.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/selection.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/toml/window.toml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/base.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/bell.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/colors.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/colorscheme.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/cursor.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/debug.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/env.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/font.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/hints.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/key_bindings.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/mouse.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/scrolling.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/selection.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/shell.yml10
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/window.yml10
-rw-r--r--modules/home.legacy/conf/beets/default.nix28
-rw-r--r--modules/home.legacy/conf/beets/plugins.nix11
-rw-r--r--modules/home.legacy/conf/beets/plugins/badfiles/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/default.nix11
-rw-r--r--modules/home.legacy/conf/beets/plugins/duplicates/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/fuzzy/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/ihate/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/inline/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/lastgenre/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/lyrics/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/play/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/replaygain/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/plugins/xtractor/default.nix9
-rw-r--r--modules/home.legacy/conf/beets/replace_override.yaml10
-rw-r--r--modules/home.legacy/conf/btop/default.nix11
-rw-r--r--modules/home.legacy/conf/dconf/default.nix9
-rw-r--r--modules/home.legacy/conf/default.nix21
-rw-r--r--modules/home.legacy/conf/direnv/default.nix6
-rw-r--r--modules/home.legacy/conf/firefox/config/bookmarks/default.nix31
-rw-r--r--modules/home.legacy/conf/firefox/config/bookmarks/lib.nix49
-rw-r--r--modules/home.legacy/conf/firefox/config/extensions/native_messaging_hosts/default.nix15
-rw-r--r--modules/home.legacy/conf/firefox/config/policies/default.nix146
-rw-r--r--modules/home.legacy/conf/firefox/config/prefs/default.nix21
-rw-r--r--modules/home.legacy/conf/firefox/config/prefs/override.js202
-rw-r--r--modules/home.legacy/conf/firefox/default.nix133
-rw-r--r--modules/home.legacy/conf/firefox/package.nix30
-rw-r--r--modules/home.legacy/conf/firefox/scripts/default.nix29
-rwxr-xr-xmodules/home.legacy/conf/firefox/scripts/extract_cookies.sh77
-rwxr-xr-xmodules/home.legacy/conf/firefox/scripts/unzip_mozlz4.py45
-rwxr-xr-xmodules/home.legacy/conf/firefox/scripts/update_extensions.sh18
-rw-r--r--modules/home.legacy/conf/gammastep/default.nix9
-rw-r--r--modules/home.legacy/conf/gpg/default.nix67
-rw-r--r--modules/home.legacy/conf/gtk/default.nix11
-rw-r--r--modules/home.legacy/conf/himalaya/default.nix9
-rw-r--r--modules/home.legacy/conf/hyfetch/default.nix9
-rw-r--r--modules/home.legacy/conf/iamb/config.json.license9
-rw-r--r--modules/home.legacy/conf/iamb/default.nix9
-rw-r--r--modules/home.legacy/conf/keepassxc/default.nix15
-rw-r--r--modules/home.legacy/conf/keepassxc/keepassxc.ini10
-rw-r--r--modules/home.legacy/conf/latexindent/default.nix15
-rw-r--r--modules/home.legacy/conf/latexindent/indentconfig.yaml10
-rw-r--r--modules/home.legacy/conf/latexindent/mysettings.yaml10
-rw-r--r--modules/home.legacy/conf/mail/accounts/benedikt.nix13
-rw-r--r--modules/home.legacy/conf/mail/accounts/soispha.nix13
-rw-r--r--modules/home.legacy/conf/mail/default.nix47
-rw-r--r--modules/home.legacy/conf/mako/default.nix44
-rw-r--r--modules/home.legacy/conf/mbsync/default.nix26
-rw-r--r--modules/home.legacy/conf/mpv/default.nix10
-rw-r--r--modules/home.legacy/conf/mumble/Mumble.conf.license9
-rw-r--r--modules/home.legacy/conf/mumble/default.nix9
-rw-r--r--modules/home.legacy/conf/neomutt/default.nix14
-rw-r--r--modules/home.legacy/conf/nix-index/default.nix14
-rw-r--r--modules/home.legacy/conf/npm/.npmrc10
-rw-r--r--modules/home.legacy/conf/npm/default.nix15
-rw-r--r--modules/home.legacy/conf/prusa_slicer/default.nix9
-rw-r--r--modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini10
-rw-r--r--modules/home.legacy/conf/python/default.nix9
-rw-r--r--modules/home.legacy/conf/python/pythonrc.py10
-rw-r--r--modules/home.legacy/conf/rclone/default.nix15
-rw-r--r--modules/home.legacy/conf/rclone/rclone.conf.license9
-rw-r--r--modules/home.legacy/conf/rofi/default.nix9
-rw-r--r--modules/home.legacy/conf/rofi/nord-twoLines.rasi.license9
-rw-r--r--modules/home.legacy/conf/ssh/default.nix16
-rw-r--r--modules/home.legacy/conf/starship/default.nix34
-rw-r--r--modules/home.legacy/conf/swayidle/config.license9
-rw-r--r--modules/home.legacy/conf/swayidle/default.nix16
-rw-r--r--modules/home.legacy/conf/swaylock/default.nix10
-rw-r--r--modules/home.legacy/conf/taskwarrior/default.nix125
-rw-r--r--modules/home.legacy/conf/taskwarrior/firefox/default.nix32
-rw-r--r--modules/home.legacy/conf/taskwarrior/hooks/default.nix114
-rwxr-xr-xmodules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh41
-rwxr-xr-xmodules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh42
-rwxr-xr-xmodules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh43
-rwxr-xr-xmodules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py94
-rw-r--r--modules/home.legacy/conf/taskwarrior/projects/default.nix123
-rw-r--r--modules/home.legacy/conf/timewarrior/default.nix22
-rw-r--r--modules/home.legacy/conf/tridactyl/config.vim10
-rw-r--r--modules/home.legacy/conf/tridactyl/default.nix9
-rw-r--r--modules/home.legacy/conf/xdg/default.nix63
-rwxr-xr-xmodules/home.legacy/conf/xdg/url_handler.sh18
-rw-r--r--modules/home.legacy/conf/xdg/xdg_vars.nix29
-rw-r--r--modules/home.legacy/conf/ytcc/default.nix11
-rw-r--r--modules/home.legacy/conf/ytcc/ytcc.conf37
-rw-r--r--modules/home.legacy/default.nix27
-rw-r--r--modules/home.legacy/files/default.nix10
-rw-r--r--modules/home.legacy/files/manifest_json/default.nix9
-rw-r--r--modules/home.legacy/files/manifest_json/profile/manifest.json.license9
-rw-r--r--modules/home.legacy/files/wallpaper/default.nix14
-rw-r--r--modules/home.legacy/pkgs/default.nix102
-rw-r--r--modules/home.legacy/wms/default.nix7
-rw-r--r--modules/home.legacy/wms/plasma/default.nix5
-rw-r--r--modules/home.legacy/wms/river/default.nix91
-rwxr-xr-xmodules/home.legacy/wms/river/init.sh80
-rw-r--r--modules/home.legacy/wms/river/res/keys.ron58
-rw-r--r--modules/home.legacy/wms/river/res/moonlander.ron66
-rw-r--r--modules/home.legacy/wms/sway/default.nix16
470 files changed, 8491 insertions, 4950 deletions
diff --git a/modules/by-name/ad/adb/module.nix b/modules/by-name/ad/adb/module.nix
index ec5d4be6..71bd3c9b 100644
--- a/modules/by-name/ad/adb/module.nix
+++ b/modules/by-name/ad/adb/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
diff --git a/modules/by-name/ag/age/module.nix b/modules/by-name/ag/age/module.nix
new file mode 100644
index 00000000..9a498ab6
--- /dev/null
+++ b/modules/by-name/ag/age/module.nix
@@ -0,0 +1,25 @@
+{
+  config,
+  lib,
+  modules,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.age;
+in {
+  options.soispha.age = {
+    enable = lib.mkEnableOption "secret management with age";
+  };
+
+  imports = [
+    modules.agenix.nixosModules.default
+  ];
+
+  config = lib.mkIf cfg.enable {
+    age = {
+      # TODO(@bpeetz): Set once <https://github.com/ryantm/agenix/pull/317/files> is merged. <2025-05-16>
+      # enable = true;
+      ageBin = lib.getExe pkgs.rage;
+    };
+  };
+}
diff --git a/modules/by-name/at/atuin/atuin.zsh b/modules/by-name/at/atuin/atuin.zsh
new file mode 100644
index 00000000..72dd7fa0
--- /dev/null
+++ b/modules/by-name/at/atuin/atuin.zsh
@@ -0,0 +1,137 @@
+#! /usr/bin/env zsh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck disable=SC2034,SC2153,SC2086,SC2155
+
+# Above line is because shellcheck doesn't support zsh, per
+# https://github.com/koalaman/shellcheck/wiki/SC1071, and the ignore: param in
+# ludeeus/action-shellcheck only supports _directories_, not _files_. So
+# instead, we manually add any error the shellcheck step finds in the file to
+# the above line ...
+
+if ! [[ $options[zle] = on ]]; then
+    return 0
+fi
+
+# Source this in your ~/.zshrc
+autoload -U add-zsh-hook
+
+zmodload zsh/datetime 2>/dev/null
+
+# If zsh-autosuggestions is installed, configure it to use Atuin's search. If
+# you'd like to override this, then add your config after the $(atuin init zsh)
+# in your .zshrc
+_zsh_autosuggest_strategy_atuin() {
+    suggestion=$(ATUIN_QUERY="$1" atuin search --cmd-only --limit 1 --search-mode prefix)
+}
+
+if [ -n "${ZSH_AUTOSUGGEST_STRATEGY:-}" ]; then
+    ZSH_AUTOSUGGEST_STRATEGY=("atuin" "${ZSH_AUTOSUGGEST_STRATEGY[@]}")
+else
+    ZSH_AUTOSUGGEST_STRATEGY=("atuin")
+fi
+
+export ATUIN_SESSION=$(atuin uuid)
+ATUIN_HISTORY_ID=""
+
+_atuin_preexec() {
+    local id
+    id=$(atuin history start -- "$1")
+    export ATUIN_HISTORY_ID="$id"
+    __atuin_preexec_time=${EPOCHREALTIME-}
+}
+
+_atuin_precmd() {
+    local EXIT="$?" __atuin_precmd_time=${EPOCHREALTIME-}
+
+    [[ -z "${ATUIN_HISTORY_ID:-}" ]] && return
+
+    local duration=""
+    if [[ -n $__atuin_preexec_time && -n $__atuin_precmd_time ]]; then
+        printf -v duration %.0f $(((__atuin_precmd_time - __atuin_preexec_time) * 1000000000))
+    fi
+
+    (ATUIN_LOG=error atuin history end --exit $EXIT ${duration:+--duration=$duration} -- $ATUIN_HISTORY_ID &) >/dev/null 2>&1
+    export ATUIN_HISTORY_ID=""
+}
+
+_atuin_search() {
+    emulate -L zsh
+    zle -I
+
+    # swap stderr and stdout, so that the tui stuff works
+    # TODO: not this
+    local output
+    # shellcheck disable=SC2048
+    output=$(ATUIN_SHELL_ZSH=t ATUIN_LOG=error ATUIN_QUERY=$BUFFER atuin search $* -i 3>&1 1>&2 2>&3)
+
+    zle reset-prompt
+
+    if [[ -n $output ]]; then
+        RBUFFER=""
+        LBUFFER=$output
+
+        if [[ $LBUFFER == __atuin_accept__:* ]]
+        then
+            LBUFFER=${LBUFFER#__atuin_accept__:}
+            zle accept-line
+        fi
+    fi
+}
+_atuin_search_vicmd() {
+    _atuin_search --keymap-mode=vim-normal
+}
+_atuin_search_viins() {
+    _atuin_search --keymap-mode=vim-insert
+}
+
+_atuin_up_search() {
+    # Only trigger if the buffer is a single line
+    if [[ ! $BUFFER == *$'\n'* ]]; then
+        _atuin_search --shell-up-key-binding "$@"
+    else
+        zle up-line
+    fi
+}
+_atuin_up_search_vicmd() {
+    _atuin_up_search --keymap-mode=vim-normal
+}
+_atuin_up_search_viins() {
+    _atuin_up_search --keymap-mode=vim-insert
+}
+
+add-zsh-hook preexec _atuin_preexec
+add-zsh-hook precmd _atuin_precmd
+
+zle -N atuin-search _atuin_search
+zle -N atuin-search-vicmd _atuin_search_vicmd
+zle -N atuin-search-viins _atuin_search_viins
+zle -N atuin-up-search _atuin_up_search
+zle -N atuin-up-search-vicmd _atuin_up_search_vicmd
+zle -N atuin-up-search-viins _atuin_up_search_viins
+
+# These are compatibility widget names for "atuin <= 17.2.1" users.
+zle -N _atuin_search_widget _atuin_search
+zle -N _atuin_up_search_widget _atuin_up_search
+
+bindkey -M emacs '^r' atuin-search
+bindkey -M viins '^r' atuin-search-viins
+bindkey -M vicmd '/' atuin-search
+bindkey -M emacs '^[[A' atuin-up-search
+bindkey -M vicmd '^[[A' atuin-up-search-vicmd
+bindkey -M viins '^[[A' atuin-up-search-viins
+bindkey -M emacs '^[OA' atuin-up-search
+bindkey -M vicmd '^[OA' atuin-up-search-vicmd
+bindkey -M viins '^[OA' atuin-up-search-viins
+bindkey -M vicmd 'k' atuin-up-search-vicmd
+
+# vim: ft=zsh
diff --git a/modules/by-name/at/atuin/module.nix b/modules/by-name/at/atuin/module.nix
index 604ee4ef..700f50fb 100644
--- a/modules/by-name/at/atuin/module.nix
+++ b/modules/by-name/at/atuin/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -8,28 +17,40 @@
 in {
   options.soispha.programs.atuin = {
     enable = lib.mkEnableOption "atuin";
+
+    enableAge = lib.mkEnableOption "atuin with age keys";
   };
 
   config = lib.mkIf cfg.enable {
-    age.secrets.atuin_encryption_key = {
+    age.secrets.atuin_encryption_key = lib.mkIf cfg.enableAge {
       file = ./secrets/encryption_key.age;
       mode = "700";
       owner = "soispha";
       group = "users";
     };
 
+    soispha.programs.zsh.integrations.atuin = ./atuin.zsh;
+
     home-manager.users.soispha = {
       programs.atuin = {
         enable = true;
         package = pkgs.atuin-dvorak;
-        enableZshIntegration = config.soispha.programs.zsh.enable;
+
+        # We can do this on our own.
+        enableZshIntegration = false;
         settings = {
-          key_path = "${config.age.secrets.atuin_encryption_key.path}";
+          key_path = lib.mkMerge [
+            (lib.mkIf cfg.enableAge "${config.age.secrets.atuin_encryption_key.path}")
+            (lib.mkIf (!cfg.enableAge)
+              "${config.home-manager.users.soispha.xdg.dataHome}/atuin/atuin_secret_key.key")
+          ];
 
-          # TODO: Setup a self-hosted sync server. <2024-10-18>
-          session_path = "";
-          auto_sync = false;
-          sync_address = "";
+          sync = lib.mkIf cfg.enableAge {
+            # The v2 sync API
+            records = true;
+          };
+          auto_sync = lib.mkIf cfg.enableAge true;
+          sync_address = lib.mkIf cfg.enableAge "https://atuin-sync.vhack.eu";
 
           # Use the rather reasonable syntax of `skim` to search.
           search_mode = "skim";
diff --git a/modules/by-name/at/atuin/secrets/encryption_key.age.license b/modules/by-name/at/atuin/secrets/encryption_key.age.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/at/atuin/secrets/encryption_key.age.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/ba/backup/module.nix b/modules/by-name/ba/backup/module.nix
index 92700bf2..d0805092 100644
--- a/modules/by-name/ba/backup/module.nix
+++ b/modules/by-name/ba/backup/module.nix
@@ -1,51 +1,207 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
-  pkgs,
   config,
+  pkgs,
   ...
 }: let
-  backup-script = pkgs.writeShellScriptBin "backsnap" ''
-    set -xeu;
-
-    ${pkgs.util-linux}/bin/mount --mkdir "/dev/disk/by-uuid/${cfg.backupDiskUuid}" "/run/media/${cfg.backupDiskUuid}";
-    ${pkgs.snap-sync-forked}/bin/snap-sync-forked --UUID "${cfg.backupDiskUuid}" --noconfirm;
-    ${pkgs.util-linux}/bin/umount "/run/media/${cfg.backupDiskUuid}";
-  '';
-
   cfg = config.soispha.services.backup;
+
+  snapshotDir = "/srv/last_snapshot";
 in {
   options.soispha.services.backup = {
-    enable = lib.mkEnableOption "backups with my forked snap-sync";
-    backupDiskUuid = lib.mkOption {
-      type = lib.types.str;
-      example = lib.literalExpression "d1d20ae7-3d8a-44da-86da-677dbbb10c89";
-      description = "The UUID of the backup disk";
+    storagebox = {
+      enable = lib.mkEnableOption "remote backups";
+      user = lib.mkOption {
+        type = lib.types.str;
+        description = "The storagebox-user to use";
+        example = "u384702-sub2";
+      };
+
+      sshKey = lib.mkOption {
+        type = lib.types.path;
+        description = "The age-encrypted ssh-key, passed to agenix";
+        default = ./secrets/storagebox/ssh_key.age;
+      };
+
+      repositoryPassword = lib.mkOption {
+        type = lib.types.path;
+        description = "The age-encrypted restic password, passed to agenix";
+        default = ./secrets/storagebox/repository_password.age;
+      };
+    };
+
+    local = {
+      enable = lib.mkEnableOption "local backups";
+
+      repositoryPassword = lib.mkOption {
+        type = lib.types.path;
+        description = "The age-encrypted restic password, passed to agenix";
+        default = ./secrets/local/repository_password.age;
+      };
+
+      backupMountPoint = lib.mkOption {
+        type = lib.types.path;
+        description = "The path where to expect the mounted backup disk";
+        default = "/mnt/backup";
+      };
     };
   };
 
-  config = lib.mkIf cfg.enable {
-    systemd = {
-      services.backup = {
-        wantedBy = lib.mkForce [];
-        unitConfig = {
-          Description = "Backup the last snapshots of the persitent-storage subvolume.";
-        };
+  config = {
+    age.secrets = {
+      resticStorageboxSshKey = lib.mkIf cfg.storagebox.enable {
+        file = cfg.storagebox.sshKey;
+        mode = "0700";
+        owner = "root";
+        group = "root";
+      };
+      resticStorageboxRepositoryPassword = lib.mkIf cfg.storagebox.enable {
+        file = cfg.storagebox.repositoryPassword;
+        mode = "0700";
+        owner = "root";
+        group = "root";
+      };
+      resticLocalRepositoryPassword = lib.mkIf cfg.local.enable {
+        file = cfg.local.repositoryPassword;
+        mode = "0700";
+        owner = "root";
+        group = "root";
+      };
+    };
+
+    soispha.programs.ssh = lib.mkIf cfg.storagebox.enable {
+      enable = true;
+      rootKnownHosts = {
+        "[u459143-sub1.your-storagebox.de]:23" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIICf9svRenC/PLKIL9nk6K/pxQgoiFC41wTNvoIncOxs";
+      };
+    };
+
+    systemd.services = {
+      prepare-backup = {
+        requires = [];
+        after = [];
+
+        description = "Prepare a backup by snapshotting the system.";
+
         serviceConfig = {
+          ExecStart = lib.getExe (pkgs.writeShellApplication {
+            name = "prepareBackup";
+            text = ''
+              set -x
+
+              [ -d "${snapshotDir}" ] && btrfs subvolume delete "${snapshotDir}"
+
+              # -r := Make the snapshot read-only
+              btrfs subvolume snapshot -r /srv "${snapshotDir}";
+            '';
+
+            inheritPath = false;
+            runtimeInputs = [
+              pkgs.btrfs-progs
+            ];
+          });
+
           Type = "oneshot";
-          ExecStart = "${backup-script}/bin/backsnap";
+
+          User = "root";
+          Group = "root";
+
+          # TODO: Hardening <2025-05-04>
         };
       };
 
-      timers.backup = {
-        wantedBy = ["timers.target"];
-        unitConfig = {
-          Description = "Backup 15min after boot and every 8 hours";
+      restic-backups-storagebox = lib.mkIf cfg.storagebox.enable {
+        requires = ["prepare-backup.service"];
+        after = ["prepare-backup.service"];
+      };
+
+      restic-backups-local = lib.mkIf cfg.local.enable {
+        requires = ["prepare-backup.service"];
+        after = ["prepare-backup.service"];
+
+        serviceConfig = {
+          ConditionPathIsDirectory = "${cfg.local.backupMountPoint}";
         };
+      };
+    };
+
+    services.restic.backups = let
+      homeDir = "${snapshotDir}/home";
+
+      paths = [
+        snapshotDir
+      ];
+      exclude = [
+        "${homeDir}/soispha/.cache"
+      ];
+      extraBackupArgs = [
+        "--verbose=2"
+      ];
+    in {
+      local = lib.mkIf cfg.local.enable {
+        inhibitsSleep = true;
+        initialize = true;
+
+        inherit paths exclude extraBackupArgs;
+
+        passwordFile = config.age.secrets.resticLocalRepositoryPassword.path;
+
+        repository = "${cfg.local.backupMountPoint}/restic-backup-data/";
+
+        # Start on demand.
+        timerConfig = null;
+      };
+
+      storagebox = lib.mkIf cfg.storagebox.enable {
+        inhibitsSleep = true;
+        initialize = true;
+
+        inherit paths exclude extraBackupArgs;
+
+        passwordFile = config.age.secrets.resticStorageboxRepositoryPassword.path;
+        extraOptions = [
+          "rclone.program='ssh -p 23 ${cfg.storagebox.user}@${cfg.storagebox.user}.your-storagebox.de -i ${config.age.secrets.resticStorageboxSshKey.path} command_forced_on_remote'"
+        ];
+
+        # This setting is normally passed to rclone, but we force
+        # the command on the remote.
+        # As such, the value does not matter and must only be parseable by restic.
+        repository = "rclone: ";
+
         timerConfig = {
-          OnBootSec = "15min";
-          OnUnitActiveSec = "8h";
+          Requires = "network-online.target";
+          OnActiveSec = "30m";
+          OnUnitInactiveSec = "2h";
+          Persistent = true;
         };
       };
+
+      # This is only for listing, pruning and such stuff.
+      storagebox-admin = lib.mkIf cfg.storagebox.enable {
+        inhibitsSleep = false;
+        initialize = false;
+
+        passwordFile = config.age.secrets.resticStorageboxRepositoryPassword.path;
+        extraOptions = [
+          "rclone.program='ssh -p 23 ${cfg.storagebox.user}@${cfg.storagebox.user}.your-storagebox.de command_forced_on_remote'"
+        ];
+
+        # This setting is normally passed to rclone, but we force
+        # the command on the remote.
+        # As such, the value does not matter and must only be parseable by restic.
+        repository = "rclone: ";
+
+        timerConfig = null;
+      };
     };
   };
 }
diff --git a/modules/by-name/ba/backup/secrets/local/repository_password.age b/modules/by-name/ba/backup/secrets/local/repository_password.age
new file mode 100644
index 00000000..b1508e49
--- /dev/null
+++ b/modules/by-name/ba/backup/secrets/local/repository_password.age
@@ -0,0 +1,20 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqVCtBZzNBWFlxQnhlb3c2
+NG0xMjV3V2hQUWhNb01ROGpFbzM0c3NjRWlvCjRqMTdxNlNsY1lDM2VCUGRjcldZ
+SUhScGRSejY3TFlwVjlweTRERkU4ZTQKLT4gc3NoLWVkMjU1MTkgelpFb25nIGtj
+cVN4RzFseTJCVXhOc0tEWi96ckpGQjhNdUZrb1FVWnJ6TU1vSHZCMUkKc1JwM2Ir
+TzNzZEV5VEE4QUp4cDdTNWZvTFlZR0tUbUFZTnNEZE1McnhISQotPiBzc2gtZWQy
+NTUxOSA3SGZGVXcgYVQzRHdaa1NYUUpLODUyL0orV3d4Z1o1V2hhekZXVWFzNW50
+enhSYnlWbwpzbnZwK1dSczJ5SGZsRjNyRWZraUcreWlBakZOZkVyZ01CWml5V0E4
+TzY4Ci0+ICpMUC1ncmVhc2UgV0IKUTZVMzR1QTVGdWRyNWprVVpjaWhCTTFSRzY3
+bHVtdHpJQXlWQVFHZ3FzbkZncHRsQnJIaHlEekl5ZE15Sko0YQpSVEUKLS0tIGFy
+N1Y2OUREY1NOL2xPODd4Y3Y4Wk83NFJ5ZVBpNnJYelo3RmZPL1V4Q28KcA+6qt2d
+LrL0FS279XL1uqSeXiDdBBBh5i951dRx9ML33g7IoQxaGqSWU0yP/y7fcSp3B/rT
+/alQGRL/uYnCS2z8zCngr2YCQBXAI8bOgf+th7fzc15FXNB14WMGvrCVRB8Rr6JZ
+itTxcAebY192xeINJG269iL6Ef0YrmZLUufKQ9lcVob/G32tG0vxSbSBBx3asf7y
+toiNdlXpxJPrIpFx5mc3dnkaXCTSRuXjiAqnncW/HNxovCI90sY3dyL+XRC8iEOD
+sql7C7jUUvLubptk1gGW5pHmGvqeCLr+fJ6XrVqXE5VxOSbzvSUsdS84WOBInLiO
+V36aUtthEzdRXd81P/n7U26O93GWpIwzctu0WwSHHHsPKhxqFY4RuWa3mO4Zk6fu
+O6fsYnpAqYiCUd/k2zKrDtLosTnwuwc7Vm1glm4DEEtvteVibw47SR1LLfUds5XL
+j1OR7Z6/ljIEKPjE1a81pQjYRfHDUtceXUvrlL6iCID30zU=
+-----END AGE ENCRYPTED FILE-----
diff --git a/modules/by-name/ba/backup/secrets/storagebox/repository_password.age b/modules/by-name/ba/backup/secrets/storagebox/repository_password.age
new file mode 100644
index 00000000..a2aa984a
--- /dev/null
+++ b/modules/by-name/ba/backup/secrets/storagebox/repository_password.age
@@ -0,0 +1,14 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzbnJ5Z3NXRFRtdEdCNk1z
+NG9Cb2FUTEZ2U2hTdUptWGpneHd2RGxGQlY0ClhqcHlMSUZlLzBPZko4a2hKdnE1
+Q1hnc3ErWlJiSk1HVXFLcSswQlV0WTAKLT4gc3NoLWVkMjU1MTkgelpFb25nIG5I
+cFpMY21ZdU9TUHY5VksraG1xeFByQlM1WE1INEk0SWFJQzIvSXhZbXMKSWxiNlIr
+NjZ6bEgySUJGdnpoZTY2MmxxajJMaUVTM3RkTmhpdkxaRnNCQQotPiBzc2gtZWQy
+NTUxOSA3SGZGVXcgRGtLMHFORm9mUDUwZnBXM0djcFlxTExJbWVDeDJmbVVSRi9l
+QTFmekpROApZY3Z0Zlc1SUdCcllKQ01ZNmdFQkI3UnViVGxzNTJNUkhqc2hOejY3
+MndrCi0+IG1Hbi1ncmVhc2UgUDJJdgpGUmVHa1NPWGtzUmZmMXM3eWkxVnJkek1h
+MUxZeS9qMlArendXZ1ltdFgvMTBabTlPM2hzSjhuVXBQNktHKzc1ClF6bjZob09B
+Ci0tLSB3dEZpbnpVR0pPdGpFVmNyM0JzUGl6eGcreXpkTG9xQUc5S09ndUthaEpR
+CuHgXCIq/AUCuIQWepBRapAab6zczOwxEBpDv5R2kw2mw34UVRLuFs7hB1cHE79y
+7Fc=
+-----END AGE ENCRYPTED FILE-----
diff --git a/modules/by-name/ba/backup/secrets/storagebox/ssh_key.age b/modules/by-name/ba/backup/secrets/storagebox/ssh_key.age
new file mode 100644
index 00000000..a7f30c7c
--- /dev/null
+++ b/modules/by-name/ba/backup/secrets/storagebox/ssh_key.age
@@ -0,0 +1,22 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJOTFaQVpnQ2VJN1pJbmdu
+STF2UTF1Y3lyU2p3OUJlcWRFWlg3Mm9vSEFFCjg4RklaZ0hqdWdZSlJ0dGx0ckJN
+eHE4R1QyTEJEVkZudnVQV2VpblBYTW8KLT4gc3NoLWVkMjU1MTkgelpFb25nIDR0
+Z2RwTXJGV1VYT2Y1OUcxbXpnOGNEbG9BWmFxeWUzZ1huNW1YQk5BM3cKK1hLNnYx
+VnNvRDZWM3Y4VUpCQTRtbHJOcDJLdTBOUXJ1ak52Mkp3TE9OcwotPiBzc2gtZWQy
+NTUxOSA3SGZGVXcgSHFSOXM1Vm1lY0ErRkZobndEU0xvQjVXbnhDbUlGNmE2dStY
+SEFqSk9TMAo2VU5UbW9rc29kendvcHNuU3hFQ2lBQWNjRUxUSE10RmtjbkdwWGlv
+cTRVCi0+IDwtZ3JlYXNlIHNPT3N1IHNkZzcoQzUgLUM3Ml1Tcgorb3FQcWlDSkJQ
+L1g4WisydkYxdnJMeDNISVVDTGlZdmUyRkV0TkFUdW4ycXZBSlF3UWM2R3FTYjRs
+ckEyaTg2ClVrbwotLS0gdHF5Q3BqV3h2TzEySCs4OFNIYmx1U0hsTWo1RDlTV3VC
+T1RmelZaWXh4YwoeRkYbirDGX9aZj6OVxZ8sVsm2Sz23ikcBhAdTIXKErM7eQcdp
+Y2nA5kUebPVznbSq/XSQNbqvCfSv9wVVTZWww7AqkrltjFS8yxQVMKB37IfnJsZI
+92OCjJKArxAbvS7ERKY51Cf9oY/VqGk5WqxExH5ZvdbL144UI8JzrxhDopVXBWNd
+fCrHirRAdlu3wgVILXV3vk1kmE69sspuV4cer5f/kOBKT1w09s2NFFHH4TO3cLTJ
+Obgi/HWYHBjqGSgwd4bDtNOW2UDE1LN3YeUhloutWhuX8yt+NFzZJtl+CBrRqLKA
+0CK+ZPKPWWKYPCNlzKT4vDF9BZeyCfoEj9dTXvxrNPEB6YYi16aQ8DhI8wxADl41
+ShrULlEmB8rfz7V+8TFmERKISBRSSH0p+XJi8e2DWh2dSco16rizmbFFNDdcYiGT
+WWbXYCFNzj+kNFI/vEtt9dEWmfXlgg01khnyoOuRLedtoCDSuF+8z7YYy6oYt/2h
+gmf4NHOUgyxK56c17JMQ3xT97d2odgqmwB+YZQ13IJCjt3M3pmSssD4sTgmA5alH
+vtUlci6dZdO801h5vOesbAJplXCEyw==
+-----END AGE ENCRYPTED FILE-----
diff --git a/modules/by-name/bl/bluetooth/module.nix b/modules/by-name/bl/bluetooth/module.nix
index 486f6e6f..7750e70d 100644
--- a/modules/by-name/bl/bluetooth/module.nix
+++ b/modules/by-name/bl/bluetooth/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/bo/boot/boot_pictures/gnu.png.license b/modules/by-name/bo/boot/boot_pictures/gnu.png.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/bo/boot/boot_pictures/gnu.png.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/bo/boot/boot_pictures/gnulin_emb_1.png.license b/modules/by-name/bo/boot/boot_pictures/gnulin_emb_1.png.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/bo/boot/boot_pictures/gnulin_emb_1.png.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/bo/boot/boot_pictures/gnulin_emb_2.png.license b/modules/by-name/bo/boot/boot_pictures/gnulin_emb_2.png.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/bo/boot/boot_pictures/gnulin_emb_2.png.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/bo/boot/iso_entry/archlive_iso.nix b/modules/by-name/bo/boot/iso_entry/archlive_iso.nix
index d19a4a87..d0ae8457 100644
--- a/modules/by-name/bo/boot/iso_entry/archlive_iso.nix
+++ b/modules/by-name/bo/boot/iso_entry/archlive_iso.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs ? (builtins.getFlake "nixpkgs").legacyPackages."x86_64-linux"}: let
   signing_key = import ./signing_key.nix {inherit pkgs;};
 
diff --git a/modules/by-name/bo/boot/iso_entry/signing_key.nix b/modules/by-name/bo/boot/iso_entry/signing_key.nix
index 788447be..d9268d75 100644
--- a/modules/by-name/bo/boot/iso_entry/signing_key.nix
+++ b/modules/by-name/bo/boot/iso_entry/signing_key.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs ? (builtins.getFlake "nixpkgs").legacyPackages."x86_64-linux"}:
 pkgs.stdenv.mkDerivation {
   name = "archlinux_signing_keys";
diff --git a/modules/by-name/bo/boot/module.nix b/modules/by-name/bo/boot/module.nix
index 8b71ce65..404352ac 100644
--- a/modules/by-name/bo/boot/module.nix
+++ b/modules/by-name/bo/boot/module.nix
@@ -1,7 +1,17 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
   pkgs,
+  modules,
   ...
 }: let
   cfg = config.soispha.boot;
@@ -12,6 +22,10 @@ in {
     # enableIsoEntry = lib.mkEnableOption "an tails iso boot entry";
   };
 
+  imports = [
+    modules.lanzaboote.nixosModules.lanzaboote
+  ];
+
   config = lib.mkIf cfg.enable (
     # let
     # cfg = config.boot.loader.systemd-boot;
diff --git a/modules/by-name/ca/cargo/module.nix b/modules/by-name/ca/cargo/module.nix
new file mode 100644
index 00000000..980ebcba
--- /dev/null
+++ b/modules/by-name/ca/cargo/module.nix
@@ -0,0 +1,27 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.programs.cargo;
+in {
+  options.soispha.programs.cargo = {
+    enable = lib.mkEnableOption "cargo";
+  };
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      home.sessionVariables = {
+        CARGO_HOME = "${config.home-manager.users.soispha.xdg.dataHome}/cargo";
+      };
+    };
+  };
+}
diff --git a/modules/by-name/cl/cleanup/module.nix b/modules/by-name/cl/cleanup/module.nix
index f8307b73..98c699eb 100644
--- a/modules/by-name/cl/cleanup/module.nix
+++ b/modules/by-name/cl/cleanup/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/dc/dconf/module.nix b/modules/by-name/dc/dconf/module.nix
index e4a1c7a9..ec055a6f 100644
--- a/modules/by-name/dc/dconf/module.nix
+++ b/modules/by-name/dc/dconf/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   # needed to make home-manager play nice with some apps. See:
   # https://nix-community.github.io/home-manager/index.xhtml#_why_do_i_get_an_error_message_about_literal_ca_desrt_dconf_literal_or_literal_dconf_service_literal
diff --git a/modules/by-name/di/direnv/module.nix b/modules/by-name/di/direnv/module.nix
new file mode 100644
index 00000000..7c81e671
--- /dev/null
+++ b/modules/by-name/di/direnv/module.nix
@@ -0,0 +1,30 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.programs.direnv;
+in {
+  options.soispha.programs.direnv = {
+    enable = lib.mkEnableOption "direnv";
+  };
+
+  config.home-manager.users.soispha.programs.direnv = lib.mkIf cfg.enable {
+    enable = true;
+    nix-direnv.enable = true;
+    config = {
+      warn_timeout = 0;
+      # strict_env = true;
+      # disable_stdin = true;
+    };
+  };
+}
diff --git a/modules/by-name/di/disks/fstrim.nix b/modules/by-name/di/disks/fstrim.nix
index 6daeb65e..0fbb6c83 100644
--- a/modules/by-name/di/disks/fstrim.nix
+++ b/modules/by-name/di/disks/fstrim.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
diff --git a/modules/by-name/di/disks/hibernate.nix b/modules/by-name/di/disks/hibernate.nix
index a50e5b57..e983f9c7 100644
--- a/modules/by-name/di/disks/hibernate.nix
+++ b/modules/by-name/di/disks/hibernate.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs}: {
   services = {
     hibernate-preparation = {
diff --git a/modules/by-name/di/disks/module.nix b/modules/by-name/di/disks/module.nix
index c0e5bcfd..d88fa3df 100644
--- a/modules/by-name/di/disks/module.nix
+++ b/modules/by-name/di/disks/module.nix
@@ -1,7 +1,17 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
   pkgs,
+  modules,
   ...
 }: let
   # FIXME: The iso redeploy requires a bigger efi partition  <2024-05-12>
@@ -37,6 +47,10 @@ in {
     };
   };
 
+  imports = [
+    modules.disko.nixosModules.default
+  ];
+
   config = lib.mkIf cfg.enable {
     systemd = lib.recursiveUpdate (import ./hibernate.nix {inherit pkgs;}) (import ./fstrim.nix {inherit pkgs lib cfg;});
 
diff --git a/modules/by-name/do/documentation/module.nix b/modules/by-name/do/documentation/module.nix
index 4616a991..e4e51409 100644
--- a/modules/by-name/do/documentation/module.nix
+++ b/modules/by-name/do/documentation/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/home.legacy/conf/firefox/config/extensions/extensions.json b/modules/by-name/fi/firefox/extensions.json
index 0c59b2f7..cc098acd 100644
--- a/modules/home.legacy/conf/firefox/config/extensions/extensions.json
+++ b/modules/by-name/fi/firefox/extensions.json
@@ -3,25 +3,25 @@
     "addonId": "addon@darkreader.org",
     "default_area": "navbar",
     "pname": "darkreader",
-    "sha256": "sha256:02c67ce2b3cd96719b5e369b9207ef11ed6c3a79eccb454d1e6ec3e005004e72",
-    "url": "https://addons.mozilla.org/firefox/downloads/file/4405074/darkreader-4.9.99.xpi",
-    "version": "4.9.99"
+    "sha256": "sha256:23c94085063aa6b57fae40ca9111ab049fffca5476c29e9990db3aa1a3fe1f10",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4488139/darkreader-4.9.106.xpi",
+    "version": "4.9.106"
   },
   "keepassxc-browser": {
     "addonId": "keepassxc-browser@keepassxc.org",
     "default_area": "navbar",
     "pname": "keepassxc-browser",
-    "sha256": "sha256:248f90ba6bffc82ef43b97c9e501b0889f70519703f27434e2d920b47f6ead45",
-    "url": "https://addons.mozilla.org/firefox/downloads/file/4395146/keepassxc_browser-1.9.5.xpi",
-    "version": "1.9.5"
+    "sha256": "sha256:7629ee8fe6a8bace5d0f12c3aef41803c2ab01407a22ad8803633992a6c4eda2",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4477789/keepassxc_browser-1.9.8.xpi",
+    "version": "1.9.8"
   },
   "torproject-snowflake": {
     "addonId": "{b11bea1f-a888-4332-8d8a-cec2be7d24b9}",
     "default_area": "navbar",
     "pname": "torproject-snowflake",
-    "sha256": "sha256:4028bad3bef6610a985edda954d5c4f1487480a8f32f230d9edf88d97c8dd88e",
-    "url": "https://addons.mozilla.org/firefox/downloads/file/4379590/torproject_snowflake-0.9.2.xpi",
-    "version": "0.9.2"
+    "sha256": "sha256:615c0d570f41e721a91fc4f334377a61732171b65eb1a4429d78681e85bc8878",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4458115/torproject_snowflake-0.9.3.xpi",
+    "version": "0.9.3"
   },
   "tridactyl-vim": {
     "addonId": "tridactyl.vim@cmcaine.co.uk",
@@ -35,16 +35,16 @@
     "addonId": "uBlock0@raymondhill.net",
     "default_area": "menupanel",
     "pname": "ublock-origin",
-    "sha256": "sha256:ee3a724a46ff32c17d1723077fecc6ede7fdab742154020b51fb6253ddcbba14",
-    "url": "https://addons.mozilla.org/firefox/downloads/file/4391011/ublock_origin-1.61.2.xpi",
-    "version": "1.61.2"
+    "sha256": "sha256:b9e1c868bd1ac1defcabf2e01776d1a90effba34b07fe6a21350d45f022e0e9f",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4492375/ublock_origin-1.64.0.xpi",
+    "version": "1.64.0"
   },
   "vhack-libredirect": {
     "addonId": "vhack-libredirect@addons.vhack.eu",
     "default_area": "navbar",
     "pname": "vhack-libredirect",
-    "sha256": "sha256:2cb6befac6f414e0dd79a11db8905a0d988b98633b74afbe52ffe8006da841f5",
-    "url": "https://addons.mozilla.org/firefox/downloads/file/4351448/vhack_libredirect-2.9.1.xpi",
-    "version": "2.9.1"
+    "sha256": "sha256:08ccfd4b32ba15b357252208da7f383099ed5aefb9e92ffb5b9ae33f9146caf6",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4427811/vhack_libredirect-3.0.2.xpi",
+    "version": "3.0.2"
   }
 }
diff --git a/modules/by-name/fi/firefox/extensions.json.license b/modules/by-name/fi/firefox/extensions.json.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/fi/firefox/extensions.json.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/fi/firefox/module.nix b/modules/by-name/fi/firefox/module.nix
new file mode 100644
index 00000000..b5c1ff9a
--- /dev/null
+++ b/modules/by-name/fi/firefox/module.nix
@@ -0,0 +1,248 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  lib,
+  config,
+  pkgs,
+  modules,
+  ...
+}: let
+  cfg = config.soispha.programs.firefox;
+
+  mkAllowedExtension = extension:
+    lib.attrsets.nameValuePair extension.addonId {
+      installation_mode = "normal_installed";
+      updates_disabled = true;
+      inherit (extension) default_area;
+      install_url = "file://${builtins.fetchurl {
+        inherit
+          (extension)
+          url
+          sha256
+          ;
+      }}";
+    };
+
+  allowedExtensions =
+    builtins.listToAttrs
+    (builtins.map mkAllowedExtension (builtins.attrValues
+        cfg.extensions));
+
+  mkBlockedExtension = id:
+    lib.attrsets.nameValuePair id {
+      install_mode = "blocked";
+    };
+  blockedExtensions = builtins.listToAttrs (builtins.map mkBlockedExtension [
+    # these are the default search engines
+    "addons-search-detection@mozilla.com"
+    "amazon@search.mozilla.org"
+    "bing@search.mozilla.org"
+    "ddg@search.mozilla.org"
+    "google@search.mozilla.org"
+    "wikipedia@search.mozilla.org"
+  ]);
+
+  mkProfile = import ./profile.nix {inherit config pkgs;};
+in {
+  options.soispha.programs.firefox = {
+    enable = lib.mkEnableOption "firefox";
+
+    profiles = lib.mkOption {
+      type = lib.types.attrsOf (lib.types.submodule {
+        options = {
+          id = lib.mkOption {
+            type = lib.types.int;
+            description = "The id of this profile.";
+          };
+          name = lib.mkOption {
+            type = lib.types.str;
+            description = "The name of this profile";
+          };
+        };
+      });
+      description = "A list of profies to create besides the default `default` profile.";
+      default = {};
+      apply = value:
+        lib.attrsets.mapAttrs' (name: value: lib.attrsets.nameValuePair name (mkProfile value))
+        value;
+    };
+
+    extensions = lib.mkOption {
+      type = lib.types.attrsOf (
+        lib.types.submodule {
+          options = {
+            addonId = lib.mkOption {
+              type = lib.types.str;
+              example = "addon@darkreader.org";
+              description = "The addon id of this extension";
+            };
+            default_area = lib.mkOption {
+              type = lib.types.enum ["navbar" "menupanel"];
+              example = "navbar";
+              description = ''
+                Where to put this extension by default.
+                `navbar` means into the top-left bar as icon.
+                `menupanel` means hidden behind a “all extensions” button.
+              '';
+            };
+            pname = lib.mkOption {
+              type = lib.types.str;
+              example = "darkreader";
+              description = "The package name of this extension";
+            };
+            sha256 = lib.mkOption {
+              type = lib.types.str;
+              example = "sha256:f565b2263a71626a0310380915b7aef90be8cc6fe16ea43ac1a0846efedc2e4c";
+              description = "The fetchurl copatible hash of this extension";
+            };
+            url = lib.mkOption {
+              type = lib.types.str;
+              example = "https://addons.mozilla.org/firefox/downloads/file/4439735/darkreader-4.9.103.xpi";
+              description = "The download url of this extension.";
+            };
+            version = lib.mkOption {
+              type = lib.types.str;
+              example = "4.9.103";
+              description = "The version of this extension";
+            };
+          };
+        }
+      );
+
+      default = builtins.fromJSON (builtins.readFile ./extensions.json);
+
+      description = ''
+        A list of the extensions that should be installed.
+        You can use a tool like `generate_extensions` to generate this config.
+      '';
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    programs.firefox = {
+      enable = true;
+      preferencesStatus = "locked";
+
+      languagePacks = ["en-CA" "de" "sv-SE"];
+
+      nativeMessagingHosts.packages = [
+        pkgs.tridactyl-native
+        pkgs.keepassxc
+      ];
+
+      # NOTE: See https://mozilla.github.io/policy-templates for documentation <2023-10-21>
+      policies = {
+        # NixOS manages this already
+        DisableAppUpdate = true;
+
+        DisableFirefoxAccounts = true;
+        DisableFirefoxScreenshots = true;
+
+        # KeepassXC does this for me
+        DisableMasterPasswordCreation = true;
+
+        # I use a self-hosted services for that
+        DisablePocket = true;
+
+        # I don't want to lose my data
+        DisableProfileRefresh = true;
+
+        DisableDeveloperTools = false;
+
+        DisplayBookmarksToolbar = "newtab";
+        DisplayMenuBar = "default-off";
+
+        DNSOverHTTPS = {
+          Enabled = true;
+          Locked = false;
+        };
+        # The concept of a "default browser" does not apply to my NixOS config
+        DontCheckDefaultBrowser = true;
+
+        ExtensionSettings =
+          {
+            "*" = {
+              # Blocking the extension install here, also blocks the 'about:debugging' page
+
+              # blocked_install_message = ''
+              #   You can't install a extension manually,
+              #   please specify it in your NixOS configuration
+              # '';
+              installation_mode = "allowed";
+            };
+          }
+          // allowedExtensions
+          // blockedExtensions;
+        RequestedLocales = config.programs.firefox.languagePacks;
+
+        ExtensionUpdate = false;
+
+        HardwareAcceleration = true;
+
+        # KeepassXC and such things
+        OfferToSaveLogins = false;
+        PasswordManagerEnabled = false;
+
+        PDFjs = {
+          Enabled = true;
+          # Don't honor documents right to be un-copy-able
+          EnablePermissions = false;
+        };
+
+        SearchBar = "unified";
+      };
+
+      # Beware, that we already set them per-profile in the home-manager config.
+      preferences = {};
+    };
+
+    home-manager.users.soispha = {
+      imports = [
+        modules.arkenfox-nixos.hmModules.arkenfox
+      ];
+
+      home.sessionVariables = {
+        # Improve touch input and make scrolling smother
+        MOZ_USE_XINPUT2 = "1";
+
+        # Tell Firefox to use Wayland
+        MOZ_ENABLE_WAYLAND = 1;
+
+        # Tell GTK to use portals
+        GTK_USE_PORTAL = 1;
+
+        BROWSER = "firefox";
+      };
+
+      programs.firefox = {
+        enable = true;
+        arkenfox = {
+          enable = true;
+          version = "133.0";
+        };
+
+        # We use the NixOS module to provide us a package.
+        # HACK: Extract the package from the system-path to get a version for
+        # arkenfox-nixos to compare to. <2025-04-02>
+        package = lib.lists.findSingle (x: builtins.hasAttr "pname" x && x.pname == "firefox") "none" "multiple" config.environment.systemPackages;
+
+        profiles =
+          {
+            default = mkProfile {
+              isDefault = true;
+              id = 0;
+              name = "default";
+            };
+          }
+          // cfg.profiles;
+      };
+    };
+  };
+}
diff --git a/modules/by-name/fi/firefox/profile.nix b/modules/by-name/fi/firefox/profile.nix
new file mode 100644
index 00000000..d82bfafa
--- /dev/null
+++ b/modules/by-name/fi/firefox/profile.nix
@@ -0,0 +1,189 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  pkgs,
+}: preConfig: ({
+    userChrome = ./userChrome.css;
+
+    bookmarks = {
+      force = true;
+      settings = [];
+    };
+
+    search = {
+      default = "brave-search";
+      privateDefault = "brave-search";
+      force = true;
+      engines = import ./search_engines {inherit pkgs;};
+
+      order = [
+        # DEFAULT
+        "brave-search"
+
+        # NIX
+        "nix-packages"
+        "nix-options"
+        "nixpkgs-issues"
+        "homemanager-options"
+        "nixos-wiki"
+        "nixpkgs-pull-request-tracker"
+
+        # RUST
+        "rust-std"
+        "rust-tokio"
+
+        # OTHER
+        "google-scholar"
+        "wikipedia"
+        "arch-wiki"
+      ];
+    };
+
+    settings = {
+      "browser.download.dir" = "${config.home-manager.users.soispha.xdg.userDirs.download}";
+      # "browser.download.useDownloadDir" = true;
+      # "browser.download.folderList" = 2;
+
+      # QoL
+      "general.autoScroll" = false;
+      "browser.tabs.insertAfterCurrent" = true;
+      "browser.tabs.loadInBackground" = true;
+      "browser.ctrlTab.recentlyUsedOrder" = false;
+      "browser.search.widget.inNavBar" = true;
+      "findbar.highlightAll" = true;
+
+      "devtools.toolbox.host" = "right";
+      "devtools.toolsidebar-width.inspector" = 700;
+
+      # Keep translations useful
+      "browser.translations.automaticallyPopup" = true;
+      "browser.translations.neverTranslateLanguages" = "de";
+
+      # Improve Tab UI
+      "browser.tabs.inTitlebar" = 1;
+      "browser.toolbars.bookmarks.visibility" = "never";
+      "browser.places.importBookmarksHTML" = true;
+
+      # Theme
+      "extensions.activeThemeID" = "firefox-alpenglow@mozilla.org";
+      "extensions.extensions.activeThemeID" = "firefox-alpenglow@mozilla.org";
+
+      # disable updates (pretty pointless with nix)
+      "extensions.update.autoUpdateDefault" = false;
+      "extensions.update.enabled" = false;
+      "app.update.channel" = "default";
+      "browser.shell.checkDefaultBrowser" = false;
+
+      # Allow my custom css
+      "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
+    };
+
+    arkenfox = {
+      enable = true;
+      "0000".enable = true;
+      "0100" = {
+        enable = true;
+        "0102"."browser.startup.page".value = 3;
+        "0103"."browser.startup.homepage".value = "file:///home/dt/home.html";
+        "0104"."browser.newtabpage.enabled".value = true;
+      };
+      "0200" = {
+        enable = true;
+      };
+      "0300" = {
+        enable = true;
+      };
+      "0400" = {
+        enable = false;
+      };
+      "0600" = {
+        enable = true;
+      };
+      "0700" = {
+        enable = true;
+        "0710"."network.trr.mode" = {
+          enable = true;
+          value = 3;
+        };
+      };
+      "0800" = {
+        enable = true;
+      };
+      "0900" = {
+        enable = true;
+      };
+      "1000" = {
+        enable = true;
+        "1001"."browser.cache.disk.enable".value = true;
+        "1003"."browser.sessionstore.privacy_level".value = 0;
+      };
+      "1200" = {
+        enable = true;
+        "1241"."security.mixed_content.block_display_content".enable = true;
+      };
+      "1600" = {
+        enable = true;
+      };
+      "1700" = {
+        enable = true;
+      };
+      "2000" = {
+        enable = true;
+      };
+      "2400" = {
+        enable = true;
+      };
+      "2600" = {
+        enable = true;
+        "2603" = {
+          "browser.download.start_downloads_in_tmp_dir".value = false;
+          "browser.helperApps.deleteTempFileOnExit".value = false;
+        };
+        "2615"."permissions.default.shortcuts" = {
+          value = 2;
+          enable = true;
+        };
+      };
+      "2700" = {
+        enable = true;
+      };
+      "2800" = {
+        enable = false;
+        "2810"."privacy.sanitize.sanitizeOnShutdown".value = false;
+      };
+      "4000" = {
+        enable = true;
+      };
+      "4500" = {
+        enable = true;
+      };
+      "5000" = {
+        enable = true;
+        "5003"."signon.rememberSignons" = {
+          enable = true;
+          value = false;
+        };
+      };
+      "6000" = {
+        enable = true;
+      };
+      "7000" = {
+        enable = true;
+      };
+      "8000" = {
+        enable = true;
+      };
+      "9000" = {
+        enable = true;
+      };
+    };
+  }
+  // preConfig)
diff --git a/modules/home.legacy/conf/firefox/config/search/engines/default.nix b/modules/by-name/fi/firefox/search_engines/default.nix
index a47c77df..f36be0a7 100644
--- a/modules/home.legacy/conf/firefox/config/search/engines/default.nix
+++ b/modules/by-name/fi/firefox/search_engines/default.nix
@@ -1,84 +1,113 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   # DEFAULT
-  "Brave Search" = {
+  brave-search = {
+    name = "Brave Search";
     urls = [{template = "https://search.brave.com/search?q={searchTerms}";}];
     icon = ./logos/brave.svg;
     definedAliases = ["@bs"];
   };
 
   # NIX
-  "Nix Packages" = {
+  nix-packages = {
+    name = "Nix packages";
     urls = [{template = "https://search.nixos.org/packages?type=packages&query={searchTerms}";}];
     icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
     definedAliases = ["@np"];
   };
 
-  "NixOS Options" = {
+  nix-functions = {
+    name = "Nix functions";
+    urls = [{template = "https://noogle.dev/q?term={searchTerms}";}];
+    icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+    definedAliases = ["@ng"];
+  };
+
+  nixos-options = {
+    name = "NixOS options";
     urls = [{template = "https://search.nixos.org/options?type=options&query={searchTerms}";}];
     icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
     definedAliases = ["@no"];
   };
-  "HomeManager Options" = {
+  homemanager-options = {
+    name = "Home-Manager options";
     urls = [{template = "https://home-manager-options.extranix.com/?query={searchTerms}&release=master";}];
     icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
     definedAliases = ["@nh"];
   };
 
-  "Nixpkgs issues" = {
+  nixpkgs-issues = {
+    name = "Nixpkgs issues";
     urls = [{template = "https://github.com/NixOS/nixpkgs/issues?q=is%3Aissue+is%3Aopen+{searchTerms}";}];
     icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
     definedAliases = ["@ni"];
   };
-  "Nixpkgs pull requests" = {
+  nixpkgs-pull-requests = {
+    name = "Nixpkgs pull requests";
     urls = [{template = "https://github.com/NixOS/nixpkgs/pulls?q=is%3Apr+is%3Aopen+{searchTerms}";}];
     icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
     definedAliases = ["@nr"];
   };
 
-  "Nixpkgs pull requests tracker" = {
+  nixpkgs-pull-requests-tracker = {
+    name = "Nixpkgs pull requests tracker";
     urls = [{template = "https://nixpk.gs/pr-tracker.html?pr={searchTerms}";}];
     icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
     definedAliases = ["@nt"];
   };
-  "NixOS Wiki" = {
+  nixos-wiki = {
+    name = "NixOS Wiki";
     urls = [{template = "https://wiki.nixos.org/w/index.php?search={searchTerms}";}];
     icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
     definedAliases = ["@nw"];
   };
 
   # RUST
-  "Rust std" = {
+  rust-std = {
+    name = "Rust std";
     urls = [{template = "https://doc.rust-lang.org/std/?search={searchTerms}";}];
     icon = ./logos/rust_std.svg;
     definedAliases = ["@rs"];
   };
-  "Rust tokio" = {
+  rust-tokio = {
+    name = "Rust tokio";
     urls = [{template = "https://docs.rs/tokio/latest/tokio/index.html?search={searchTerms}";}];
     icon = ./logos/rust_tokio.png;
     definedAliases = ["@rt"];
   };
 
   # OTHER
-  "Google Scholar" = {
+  google-scholar = {
+    name = "Google Scholar";
     urls = [{template = "https://scholar.google.com/scholar?hl=en&q={searchTerms}";}];
     icon = ./logos/google_scholar.ico;
     definedAliases = ["@gs"];
   };
-  "Wikipedia" = {
+  wikipedia = {
+    name = "Wikipedia";
     urls = [{template = "https://en.wikipedia.org/wiki/{searchTerms}";}];
     icon = ./logos/wikipedia.svg;
     definedAliases = ["@wp"];
   };
-  "Arch Wiki" = {
+  arch-wiki = {
+    name = "Arch Wiki";
     urls = [{template = "https://wiki.archlinux.org/index.php?search={searchTerms}";}];
     icon = ./logos/arch_linux.svg;
     definedAliases = ["@aw"];
   };
 
-  "Wikipedia (en)".metaData.hidden = true;
-  "DuckDuckGo".metaData.hidden = true;
-  "Bing".metaData.hidden = true;
-  "Google".metaData.hidden = true;
+  "wikipedia".metaData.hidden = true;
+  "ddg".metaData.hidden = true;
+  "bing".metaData.hidden = true;
+  "google".metaData.hidden = true;
   "Amazon.de".metaData.hidden = true;
-  "eBay".metaData.hidden = true;
+  "ebay".metaData.hidden = true;
 }
diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/arch_linux.svg b/modules/by-name/fi/firefox/search_engines/logos/arch_linux.svg
index 949b5c5f..949b5c5f 100644
--- a/modules/home.legacy/conf/firefox/config/search/engines/logos/arch_linux.svg
+++ b/modules/by-name/fi/firefox/search_engines/logos/arch_linux.svg
diff --git a/modules/by-name/fi/firefox/search_engines/logos/arch_linux.svg.license b/modules/by-name/fi/firefox/search_engines/logos/arch_linux.svg.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/fi/firefox/search_engines/logos/arch_linux.svg.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/brave.svg b/modules/by-name/fi/firefox/search_engines/logos/brave.svg
index 09dd2e42..09dd2e42 100644
--- a/modules/home.legacy/conf/firefox/config/search/engines/logos/brave.svg
+++ b/modules/by-name/fi/firefox/search_engines/logos/brave.svg
diff --git a/modules/by-name/fi/firefox/search_engines/logos/brave.svg.license b/modules/by-name/fi/firefox/search_engines/logos/brave.svg.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/fi/firefox/search_engines/logos/brave.svg.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/google_scholar.ico b/modules/by-name/fi/firefox/search_engines/logos/google_scholar.ico
index 85d0c664..85d0c664 100644
--- a/modules/home.legacy/conf/firefox/config/search/engines/logos/google_scholar.ico
+++ b/modules/by-name/fi/firefox/search_engines/logos/google_scholar.ico
Binary files differdiff --git a/modules/by-name/fi/firefox/search_engines/logos/google_scholar.ico.license b/modules/by-name/fi/firefox/search_engines/logos/google_scholar.ico.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/fi/firefox/search_engines/logos/google_scholar.ico.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_std.svg b/modules/by-name/fi/firefox/search_engines/logos/rust_std.svg
index 0091b5a8..0091b5a8 100644
--- a/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_std.svg
+++ b/modules/by-name/fi/firefox/search_engines/logos/rust_std.svg
diff --git a/modules/by-name/fi/firefox/search_engines/logos/rust_std.svg.license b/modules/by-name/fi/firefox/search_engines/logos/rust_std.svg.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/fi/firefox/search_engines/logos/rust_std.svg.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_tokio.png b/modules/by-name/fi/firefox/search_engines/logos/rust_tokio.png
index f1de55ff..f1de55ff 100644
--- a/modules/home.legacy/conf/firefox/config/search/engines/logos/rust_tokio.png
+++ b/modules/by-name/fi/firefox/search_engines/logos/rust_tokio.png
Binary files differdiff --git a/modules/by-name/fi/firefox/search_engines/logos/rust_tokio.png.license b/modules/by-name/fi/firefox/search_engines/logos/rust_tokio.png.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/fi/firefox/search_engines/logos/rust_tokio.png.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/firefox/config/search/engines/logos/wikipedia.svg b/modules/by-name/fi/firefox/search_engines/logos/wikipedia.svg
index dc32f984..dc32f984 100644
--- a/modules/home.legacy/conf/firefox/config/search/engines/logos/wikipedia.svg
+++ b/modules/by-name/fi/firefox/search_engines/logos/wikipedia.svg
diff --git a/modules/by-name/fi/firefox/search_engines/logos/wikipedia.svg.license b/modules/by-name/fi/firefox/search_engines/logos/wikipedia.svg.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/fi/firefox/search_engines/logos/wikipedia.svg.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/fi/firefox/update_extensions.sh b/modules/by-name/fi/firefox/update_extensions.sh
new file mode 100755
index 00000000..588a7530
--- /dev/null
+++ b/modules/by-name/fi/firefox/update_extensions.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# The `generate_extensions` binary is provided in the devshell.
+
+generate_extensions \
+    darkreader:navbar \
+    keepassxc-browser:navbar \
+    vhack-libredirect:navbar \
+    torproject-snowflake:navbar \
+    tridactyl-vim:menupanel \
+    ublock-origin:menupanel \
+    >"$(dirname "$0")"/extensions.json
diff --git a/modules/home.legacy/conf/firefox/config/chrome/userChrome.css b/modules/by-name/fi/firefox/userChrome.css
index 0b3aff77..6e0d705d 100644
--- a/modules/home.legacy/conf/firefox/config/chrome/userChrome.css
+++ b/modules/by-name/fi/firefox/userChrome.css
@@ -1,3 +1,15 @@
+/*
+ * nixos-config - My current NixOS configuration
+ *
+ * Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This file is part of my nixos-config.
+ *
+ * You should have received a copy of the License along with this program.
+ * If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+ */
+
 /* thickness of tab when you have too many open tabs */
 .tabbrowser-tab:not([pinned="true"]) {
   min-width: 10px !important;
diff --git a/modules/by-name/fo/fonts/emoji_font.xml b/modules/by-name/fo/fonts/emoji_font.xml
index f3f6bb3e..8a922f61 100644
--- a/modules/by-name/fo/fonts/emoji_font.xml
+++ b/modules/by-name/fo/fonts/emoji_font.xml
@@ -1,4 +1,17 @@
 <?xml version="1.0"?>
+
+<!--
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+-->
+
 <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
 <fontconfig>
   <alias binding="weak">
diff --git a/modules/by-name/fo/fonts/module.nix b/modules/by-name/fo/fonts/module.nix
index 057c3f36..f8752ae6 100644
--- a/modules/by-name/fo/fonts/module.nix
+++ b/modules/by-name/fo/fonts/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/fw/fwupd/module.nix b/modules/by-name/fw/fwupd/module.nix
index 5ad4f467..0c4a7bf3 100644
--- a/modules/by-name/fw/fwupd/module.nix
+++ b/modules/by-name/fw/fwupd/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/gi/git/aliases.nix b/modules/by-name/gi/git/aliases.nix
index 96456bea..bc30ea40 100644
--- a/modules/by-name/gi/git/aliases.nix
+++ b/modules/by-name/gi/git/aliases.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   defaultBranchName,
diff --git a/modules/by-name/gi/git/git_ignore.git.license b/modules/by-name/gi/git/git_ignore.git.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/gi/git/git_ignore.git.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/gi/git/git_template.git.license b/modules/by-name/gi/git/git_template.git.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/gi/git/git_template.git.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/gi/git/module.nix b/modules/by-name/gi/git/module.nix
index 8e413e8a..a70c38d7 100644
--- a/modules/by-name/gi/git/module.nix
+++ b/modules/by-name/gi/git/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
diff --git a/modules/home.legacy/conf/gpg/keys/key_1.asc b/modules/by-name/gp/gpg/keys/key_1.asc
index 795f82af..f29184d8 100644
--- a/modules/home.legacy/conf/gpg/keys/key_1.asc
+++ b/modules/by-name/gp/gpg/keys/key_1.asc
@@ -1,3 +1,13 @@
+// nixos-config - My current NixOS configuration
+//
+// Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// This file is part of my nixos-config.
+//
+// You should have received a copy of the License along with this program.
+// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 -----BEGIN PGP PUBLIC KEY BLOCK-----
 Comment: 8321 ED3A 8DB9 99A5 1F3B  F80F F268 2914 EA42 DE26
 Comment: Benedikt Peetz <benedikt.peetz@b-peetz.de>
diff --git a/modules/home.legacy/conf/gpg/keys/key_2.asc b/modules/by-name/gp/gpg/keys/key_2.asc
index 47188da7..7433a3f2 100644
--- a/modules/home.legacy/conf/gpg/keys/key_2.asc
+++ b/modules/by-name/gp/gpg/keys/key_2.asc
@@ -1,3 +1,13 @@
+// nixos-config - My current NixOS configuration
+//
+// Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// This file is part of my nixos-config.
+//
+// You should have received a copy of the License along with this program.
+// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 -----BEGIN PGP PUBLIC KEY BLOCK-----
 Comment: 2FEA 7BDB 9171 70A7 B8E7  2001 DF18 78E6 D9C3 B27F
 Comment: Silas <sils@sils.li>
diff --git a/modules/by-name/gp/gpg/module.nix b/modules/by-name/gp/gpg/module.nix
new file mode 100644
index 00000000..89d7b356
--- /dev/null
+++ b/modules/by-name/gp/gpg/module.nix
@@ -0,0 +1,90 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+# TODO: Migrate to squoia-sq <2025-04-25>
+{
+  config,
+  pkgs,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.programs.gpg;
+  homeConfig = config.home-manager.users.soispha;
+in {
+  options.soispha.programs.gpg = {
+    enable = lib.mkEnableOption "gpg";
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      programs.gpg = {
+        enable = true;
+        homedir = "${homeConfig.xdg.dataHome}/gnupg";
+        mutableKeys = true;
+        mutableTrust = true;
+
+        settings = {
+          default-key = "Benedikt Peetz <benedikt.peetz@b-peetz.de>";
+          # TODO: add more
+        };
+
+        publicKeys = [
+          {
+            source = ./keys/key_1.asc;
+            trust = "ultimate";
+          }
+          {
+            source = ./keys/key_2.asc;
+            trust = "full";
+          }
+        ];
+      };
+      services = {
+        gpg-agent = {
+          enable = true;
+          enableZshIntegration = true;
+          enableScDaemon = true; # smartcards and such things
+
+          # Cache the key passwords
+          defaultCacheTtl = 60 * 50;
+          defaultCacheTtlSsh = 60 * 50;
+          maxCacheTtl = 60 * 50;
+          maxCacheTtlSsh = 60 * 50;
+
+          pinentry = {
+            package = pkgs.pinentry-curses;
+            # package = pkgs.pinentry-tty;
+          };
+
+          enableSshSupport = true;
+          sshKeys = let
+            removeSpace = str: builtins.replaceStrings [" "] [""] str;
+          in [
+            (removeSpace "8321 ED3A 8DB9 99A5 1F3B  F80F F268 2914 EA42 DE26")
+          ];
+        };
+      };
+    };
+
+    soispha.programs.zsh.integrations.gpg = ''
+      export GPG_TTY=$(tty)
+
+      # Magic copied from the gpg-agent manual
+      unset SSH_AGENT_PID
+      if [ "''${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
+          export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
+      fi
+
+
+      # Ensure that get gpg agent is started (necessary because ssh does not start it
+      # automatically and has it's tty updated)
+      gpg-connect-agent /bye
+    '';
+  };
+}
diff --git a/modules/by-name/ha/hardware/module.nix b/modules/by-name/ha/hardware/module.nix
index 850416b7..599f5d23 100644
--- a/modules/by-name/ha/hardware/module.nix
+++ b/modules/by-name/ha/hardware/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/ho/home-manager/module.nix b/modules/by-name/ho/home-manager/module.nix
index f5304170..d7eccbd6 100644
--- a/modules/by-name/ho/home-manager/module.nix
+++ b/modules/by-name/ho/home-manager/module.nix
@@ -1,22 +1,17 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
-  pkgsStable,
-  nixpkgs_open_prs,
-  sysLib,
-  # extra information
   system,
-  # bins
-  # TODO: Integrate these <2024-05-22>
-  river_init_lesser,
-  shell_library,
-  qmk_firmware,
-  # external deps
-  user_js,
-  # modules
-  impermanence,
-  nix-index-database,
-  nixVim,
+  modules,
   ...
 }: let
   cfg = config.soispha.home-manager;
@@ -25,6 +20,10 @@ in {
     enable = lib.mkEnableOption "home-manager with custom config.";
   };
 
+  imports = [
+    modules.home-manager.nixosModules.home-manager
+  ];
+
   # TODO: Find a way to throw this error below, when a user `enable`s a home-manager
   # module, but not this module. Without having to plaster all the `home-manager` modules
   # with `assert`s. <2024-10-18>
@@ -33,24 +32,12 @@ in {
     home-manager = {
       useGlobalPkgs = true;
       useUserPackages = true;
+
+      # TODO(@bpeetz): Remove this once the legacy -> by-name migration is done. <2025-05-16>
       users.soispha = import ../../../home.legacy;
       extraSpecialArgs = {
         inherit
-          nixpkgs_open_prs
-          pkgsStable
-          sysLib
-          # extra information
           system
-          # bins
-          river_init_lesser
-          shell_library
-          qmk_firmware
-          # external deps
-          user_js
-          # modules
-          impermanence
-          nixVim
-          nix-index-database
           ;
       };
     };
diff --git a/modules/by-name/i3/i3bar-river/module.nix b/modules/by-name/i3/i3bar-river/module.nix
new file mode 100644
index 00000000..b32ec6a5
--- /dev/null
+++ b/modules/by-name/i3/i3bar-river/module.nix
@@ -0,0 +1,197 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.i3bar-river;
+
+  toColor = color:
+    if builtins.isString color
+    then lib.trivial.fromHexString color
+    else color;
+
+  substractColor = color_a: color_b: let
+    saturatingSub = a: b:
+      if a < b
+      then 0
+      else a - b;
+  in {
+    red = saturatingSub color_a.red color_b.red;
+    green = saturatingSub color_a.green color_b.green;
+    blue = saturatingSub color_a.blue color_b.blue;
+    alpha = saturatingSub color_a.alpha color_b.alpha;
+    inherit (color_a) __toString;
+  };
+
+  colorOption = red: green: blue: alpha:
+    lib.mkOption {
+      type = lib.types.submodule {
+        options = {
+          red = lib.mkOption {
+            type = lib.types.ints.between 0 255;
+            description = "The amount of red in this color";
+            default = toColor red;
+          };
+          green = lib.mkOption {
+            type = lib.types.ints.between 0 255;
+            description = "The amount of green in this color";
+            default = toColor green;
+          };
+          blue = lib.mkOption {
+            type = lib.types.ints.between 0 255;
+            description = "The amount of blue in this color";
+            default = toColor blue;
+          };
+          alpha = lib.mkOption {
+            type = lib.types.ints.between 0 255;
+            description = "The amount of alpha in this color";
+            default = toColor alpha;
+          };
+
+          __toString = lib.mkOption {
+            internal = true;
+
+            default = self: let
+              tH = num: let
+                converted = lib.trivial.toHexString num;
+              in
+                if builtins.stringLength converted == 1
+                then "0${converted}"
+                else assert (builtins.stringLength converted) == 2; converted;
+
+              output = "#${tH self.red}${tH self.green}${tH self.blue}${tH self.alpha}";
+            in
+              output;
+
+            description = "Convert this type to a string before use";
+          };
+        };
+      };
+
+      default = {
+        red = toColor red;
+        green = toColor green;
+        blue = toColor blue;
+        alpha = toColor alpha;
+      };
+
+      description = "The specific color to use for this name.";
+    };
+in {
+  options.soispha.programs.i3bar-river = {
+    enable = lib.mkEnableOption "i3bar-river";
+
+    package = lib.mkPackageOption pkgs "i3bar-river-patched" {};
+
+    colors = {
+      none = colorOption 00 00 00 00;
+
+      white = colorOption "ff" "ff" "ff" "ff";
+
+      blue = colorOption "99" "d1" "db" "ff";
+      green = colorOption "a6" "e3" "a1" "dd";
+      lavendar = colorOption "b4" "be" "fe" "dd";
+      mauve = colorOption "cb" "a6" "f7" "dd";
+      normal = colorOption "c6" "ce" "ef" "ff";
+      peach = colorOption "fa" "b3" "87" "dd";
+      sapphire = colorOption "74" "c7" "ec" "dd";
+      teal = colorOption "94" "e2" "d5" "dd";
+
+      light_gray = colorOption "58" "5b" "70" "ff";
+      gray = colorOption "45" "47" "5a" "ff";
+      dark_gray = colorOption "30" "34" "46" "ff";
+      bright_red = colorOption "e7" "82" "84" "ff";
+
+      vivid_burgundy = colorOption "9f" "1d" "35" "ff";
+
+      unfocused_offset = colorOption "33" "33" "33" "00";
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    soispha.programs.river.init.backgroundStart = [cfg.package];
+
+    home-manager.users.soispha = {
+      programs.i3bar-river = {
+        enable = true;
+        inherit (cfg) package;
+
+        settings = {
+          theme = {
+            palette = {
+              # Colors
+              background = toString cfg.colors.none;
+              color = toString cfg.colors.white; # Only used, if blocks do not specify one
+              separator = toString cfg.colors.vivid_burgundy;
+
+              # Tag is set (but not focused or urgent)
+              tag_fg = toString cfg.colors.white;
+              tag_bg = toString cfg.colors.light_gray;
+
+              tag_urgent_fg = toString cfg.colors.white;
+              tag_urgent_bg = toString cfg.colors.bright_red;
+
+              tag_focused_fg = toString cfg.colors.white;
+              tag_focused_bg = toString cfg.colors.teal;
+
+              tag_inactive_fg = toString cfg.colors.white;
+              tag_inactive_bg = toString cfg.colors.none;
+
+              # Shop options
+              blend = true; # whether tags/blocks colors should blend with bar's background
+              hide_inactive_tags = false;
+              show_layout_name = false;
+              show_mode = true;
+              show_tags = true;
+            };
+
+            unfocused_palette = {
+              hide_inactive_tags = true;
+
+              color = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              separator = toString (substractColor cfg.colors.vivid_burgundy cfg.colors.unfocused_offset);
+
+              tag_fg = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              tag_bg = toString (substractColor cfg.colors.light_gray cfg.colors.unfocused_offset);
+
+              tag_urgent_fg = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              tag_urgent_bg = toString (substractColor cfg.colors.bright_red cfg.colors.unfocused_offset);
+
+              tag_focused_fg = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              tag_focused_bg = toString cfg.colors.vivid_burgundy;
+
+              tag_inactive_fg = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              tag_inactive_bg = toString (substractColor cfg.colors.none cfg.colors.unfocused_offset);
+            };
+          };
+
+          # The font and various sizes
+          font = "SauceCodePro Nerd Font Mono:pixelsize=26";
+          height = 24;
+          margin_top = 10;
+          margin_bottom = 0;
+          margin_left = 0;
+          margin_right = 0;
+          separator_width = 0;
+          tags_r = 10.0;
+          tags_padding = 10.0;
+          tags_margin = 5.0;
+          blocks_r = 6.0;
+          blocks_overlap = 0.0;
+
+          # Misc
+          position = "top"; # either "top" or "bottom"
+          layer = "overlay"; # one of "top", "overlay", "bottom" or "background"
+          invert_touchpad_scrolling = true;
+          start_hidden = false; # whether the bar is initially in the 'hidden' state
+
+          # WM-specific options
+          wm.river = {
+            max_tag = 9; # Show only the first nine tags
+          };
+        };
+      };
+    };
+  };
+}
diff --git a/modules/by-name/i3/i3status-rust/module.nix b/modules/by-name/i3/i3status-rust/module.nix
new file mode 100644
index 00000000..5bd911d8
--- /dev/null
+++ b/modules/by-name/i3/i3status-rust/module.nix
@@ -0,0 +1,152 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.i3status-rust;
+
+  mkScript = name: deps:
+    lib.getExe (pkgs.writeShellApplication {
+      inherit name;
+      text = builtins.readFile ./scripts/${name};
+
+      inheritPath = false;
+      runtimeInputs = deps;
+    });
+in {
+  options.soispha.programs.i3status-rust = {
+    enable = lib.mkEnableOption "i3status-rust";
+
+    package = lib.mkPackageOption pkgs "i3status-rust-patched" {};
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      programs.i3status-rust = {
+        enable = true;
+        inherit (cfg) package;
+
+        bars.default = {
+          settings = {
+            icons = {
+              icons = "material-nf";
+
+              overrides = {
+                cpu = [
+                  "󰍛" # nf-md-memory
+                ];
+                memory_mem = ""; # nf-fa-bars
+              };
+            };
+
+            theme = {
+              theme = "slick";
+
+              overrides = {
+                separator = "native";
+                alternating_tint_bg = "none";
+                alternating_tint_fg = "none";
+              };
+            };
+          };
+
+          blocks = [
+            {
+              block = "time";
+              format = " $timestamp.datetime(format:'%d/%m/%y (%a) %H:%M %:z') ";
+              interval = 60;
+            }
+
+            {
+              # TODO(@bpeetz): Switch to “music” when mpd gets mpris support  <2025-05-20>
+              block = "custom";
+              interval = "once";
+              persistent = true;
+              command = mkScript "mpd_song_name.sh" [pkgs.mpc pkgs.coreutils];
+              hide_when_empty = true;
+              shell = "${lib.getExe pkgs.dash}";
+              format = " $text.str(max_width:60,rot_interval:0.5) ";
+            }
+
+            {
+              block = "sound";
+              driver = "pulseaudio";
+              headphones_indicator = true;
+            }
+
+            # System info
+            {
+              block = "cpu";
+            }
+            {
+              block = "memory";
+              format = " $icon $mem_used_percents {($swap_used_percents.eng(range:1..)) | }";
+            }
+            {
+              block = "amd_gpu";
+              format = "  $icon $utilization (^icon_memory_mem $vram_used_percents) ";
+            }
+
+            {
+              block = "net";
+              format = " ^icon_net_down $speed_down.eng(prefix:Ki) ^icon_net_up $speed_up.eng(prefix:Ki) ";
+            }
+            {
+              block = "privacy";
+              driver = [
+                {name = "v4l";}
+                {name = "pipewire";}
+              ];
+            }
+
+            {
+              block = "disk_space";
+              path = "/srv";
+              info_type = "used";
+              format = " $icon $used.eng(prefix:Gi) ($percentage) ";
+              backend = "btrfs";
+
+              # warn if 80 % is used, alert after 90 % used.
+              warning = 80;
+              alert = 90;
+            }
+            {
+              block = "backlight";
+              missing_format = "";
+            }
+            {
+              block = "battery";
+              missing_format = "";
+            }
+
+            # {
+            #   block = "calendar";
+            #
+            #   source = {
+            #     calendars = ["user/calendar"];
+            #     auth = {
+            #       type = "unauthenticated";
+            #     };
+            #   };
+            # }
+            # {
+            #   block = "focused_window";
+            #   driver = "wlr_toplevel_management";
+            # }
+            # {
+            #   block = "maildir";
+            #   display_type = "new";
+            #   inboxes = ["~/.local/share/maildir/soispha/*"];
+            #   interval = 60;
+            #   threshold_critical = 10;
+            #   threshold_warning = 1;
+            # }
+          ];
+        };
+      };
+
+      programs.i3bar-river.settings.command = "${lib.getExe cfg.package} config-default.toml";
+    };
+  };
+}
diff --git a/modules/by-name/i3/i3status-rust/scripts/mpd_song_name.sh b/modules/by-name/i3/i3status-rust/scripts/mpd_song_name.sh
new file mode 100755
index 00000000..28921520
--- /dev/null
+++ b/modules/by-name/i3/i3status-rust/scripts/mpd_song_name.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env dash
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+while true; do
+    state="$(mpc status '%state%')"
+
+    if [ "$state" = "playing" ]; then
+        song="$(mpc --format '[[%artist% - ]%title%]|[%file%]' current)"
+        progress="$(mpc status "%currenttime%/%totaltime%")"
+
+        echo "$song :: $progress"
+    else
+        # The song has stopped, we are done displaying it.
+        echo ""
+
+        # Wait for a new song. (Or in this case for a new event.)
+        mpc idle
+    fi
+
+    sleep 1
+done
+
+# vim: ft=sh
diff --git a/modules/by-name/im/impermanence/module.nix b/modules/by-name/im/impermanence/module.nix
index 9c289346..4ce86b25 100644
--- a/modules/by-name/im/impermanence/module.nix
+++ b/modules/by-name/im/impermanence/module.nix
@@ -1,6 +1,16 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
+  modules,
   ...
 }: let
   cfg = config.soispha.impermanence;
@@ -23,6 +33,10 @@ in {
     };
   };
 
+  imports = [
+    modules.impermanence.nixosModules.impermanence
+  ];
+
   config = lib.mkIf cfg.enable {
     environment.persistence = {
       "/srv" = {
@@ -39,11 +53,10 @@ in {
             ".local/state/wireplumber"
 
             ".config/Signal"
-            ".config/Element"
             ".config/iamb/profiles"
 
             ".cache"
-            ".mozilla"
+            ".mozilla/firefox"
 
             "media"
             "repos"
diff --git a/modules/by-name/im/imv/module.nix b/modules/by-name/im/imv/module.nix
index 0a324e01..fdf95982 100644
--- a/modules/by-name/im/imv/module.nix
+++ b/modules/by-name/im/imv/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/is/issue_file/module.nix b/modules/by-name/is/issue_file/module.nix
index d8b6faa8..f9a7b58a 100644
--- a/modules/by-name/is/issue_file/module.nix
+++ b/modules/by-name/is/issue_file/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   self,
diff --git a/modules/by-name/la/laptop/module.nix b/modules/by-name/la/laptop/module.nix
index f70230ad..dd8935b9 100644
--- a/modules/by-name/la/laptop/module.nix
+++ b/modules/by-name/la/laptop/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
diff --git a/modules/by-name/le/less/command.less.license b/modules/by-name/le/less/command.less.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/le/less/command.less.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/le/less/env.less.license b/modules/by-name/le/less/env.less.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/le/less/env.less.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/le/less/line-edit.less.license b/modules/by-name/le/less/line-edit.less.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/le/less/line-edit.less.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/le/less/module.nix b/modules/by-name/le/less/module.nix
index f2475b73..0dd45a90 100644
--- a/modules/by-name/le/less/module.nix
+++ b/modules/by-name/le/less/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/lf/lf/colors b/modules/by-name/lf/lf/colors
index 1c2853ec..17201e64 100644
--- a/modules/by-name/lf/lf/colors
+++ b/modules/by-name/lf/lf/colors
@@ -60,11 +60,6 @@ fi      00          # FILE
 # links to hide
 ~/.mozilla       01;08;30
 ~/.ssh           01;08;30
-~/.zshenv        01;08;30
-
-~/.steampid      01;08;30
-~/.steam         01;08;30
-~/.steampath     01;08;30
 
 # archives or compressed (dircolors defaults)
 *.tar   01;31
diff --git a/modules/by-name/lf/lf/colors.license b/modules/by-name/lf/lf/colors.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/lf/lf/colors.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/lf/lf/commands/base.sh b/modules/by-name/lf/lf/commands/base.sh
new file mode 100755
index 00000000..99852c3e
--- /dev/null
+++ b/modules/by-name/lf/lf/commands/base.sh
@@ -0,0 +1,88 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck disable=SC2269
+id="$id"
+
+# Prompt the user for input.
+# This will just _print_ the prompt, you still need to `read -r` the user's answer.
+#
+# # Type
+# prompt :: String
+#
+# # Arguments
+# $1
+# : The prompt to print for the user.
+prompt() {
+    printf "=> %s" "$1"
+}
+
+# Reads its Stdin into a temporary file and returns the path of the temporary file.
+# This is only really useful, if you want to pipe something into an while read loop that
+# should modify global variables. Piping directly into it will not work, because the shell
+# would just run it in a subshell, so you need this workaround.
+#
+# # Type
+# tmp :: <stdin> -> Path
+#
+# # Arguments
+#
+# # Examples
+# while read -r file; do
+#   set -- "$@" "$file"
+# done < "$(echo "$fx" | tmp)"
+tmp() {
+    __base_tmp_temporary_file="$(mktemp --tmpdir="$__base_tmp_temporary_directory")"
+    cat >"$__base_tmp_temporary_file"
+    echo "$__base_tmp_temporary_file"
+}
+__base_tmp_temporary_directory="$(mktemp --directory)"
+trap 'rm --recursive "$__base_tmp_temporary_directory"' EXIT
+
+# Run a lf command on the current lf client
+# All arguments will run in like they were typed directly into lf.
+# # TODO(@bpeetz): Escape the single quotes in the input arguments. <2025-02-02>
+#
+# # Type
+# lf_cmd :: [String]
+#
+# # Arguments
+# $1..$@
+# : The arguments composing the command to run.
+lf_cmd() {
+    arguments=""
+    for arg in "$@"; do
+        if [ -z "$arguments" ]; then
+            arguments="'$arg'"
+        else
+            arguments="$arguments '$arg'"
+        fi
+    done
+
+    lf -remote "send $id $arguments"
+}
+
+# Print an error message and exit with error code 1.
+# The error message will be printed to lf.
+#
+# # Type
+# die :: String
+#
+# # Arguments
+# $1
+# : The error message
+die() {
+    lf_cmd echo "Error: $1"
+    exit 1
+}
+
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/default.nix b/modules/by-name/lf/lf/commands/default.nix
index b3c9acab..f953834b 100644
--- a/modules/by-name/lf/lf/commands/default.nix
+++ b/modules/by-name/lf/lf/commands/default.nix
@@ -1,231 +1,155 @@
-{
-  pkgs,
-  sysLib,
-  shell_library,
-  system,
-  ...
-}: let
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{pkgs, ...}: let
   functionCall = {
     name,
     dependencies,
-    replacementStrings,
-    ...
+    keepPath ? false,
   }:
-    sysLib.writeShellScript {
+    pkgs.writeShellApplication {
       inherit name;
-      src = ./scripts/${name}.sh;
-      keepPath = true;
-      dependencies = dependencies ++ (builtins.attrValues {inherit (pkgs) dash coreutils;});
-      inherit replacementStrings;
+      text = builtins.readFile ./base.sh + builtins.readFile ./scripts/${name}.sh;
+      runtimeInputs = [pkgs.lf pkgs.mktemp pkgs.coreutils] ++ dependencies;
+      inheritPath = keepPath;
     }
     + "/bin/${name}";
 
-  shell = {
-    name,
-    dependencies,
-    replacementStrings ? null,
-    ...
-  }: ''
+  # closes the lf tui
+  shell = args: ''
     ''${{
-      ${functionCall {inherit name dependencies replacementStrings;}}
+      ${functionCall args}
     }}
-  ''; # closes the lf tui
-  pipe = {
-    name,
-    dependencies,
-    replacementStrings ? null,
-    ...
-  }: ''
+  '';
+  # runs the command in the ui/term bar
+  pipe = args: ''
     %{{
-      ${functionCall {inherit name dependencies replacementStrings;}}
+      ${functionCall args}
     }}
-  ''; # runs the command in the ui/term bar
-  async = {
-    name,
-    dependencies,
-    replacementStrings ? null,
-    ...
-  }: ''
+  '';
+  # runs the command in the background
+  async = args: ''
     &{{
-      ${functionCall {inherit name dependencies replacementStrings;}}
+      ${functionCall args}
     }}
-  ''; # runs the command in the background
-  wait = {
-    name,
-    dependencies,
-    replacementStrings ? null,
-    ...
-  }: ''
+  '';
+  # adds a prompt after the command has run
+  wait = args: ''
     !{{
-      ${functionCall {inherit name dependencies replacementStrings;}}
+      ${functionCall args}
     }}
-  ''; # adds a prompt after the command has run
+  '';
 in {
-  archive = shell {
-    name = "archive";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        fzf
-        gnutar
-        xz
-        p7zip
-        zip
-        ;
-    };
-  };
-  broot_jump = shell {
-    name = "broot_jump";
-    dependencies = builtins.attrValues {
-      inherit (pkgs) broot;
-    };
+  archive_compress = shell {
+    name = "archive_compress";
+    dependencies = with pkgs; [
+      fzf
+      gnutar
+      xz
+      p7zip
+      zip
+    ];
+  };
+  archive_decompress = pipe {
+    name = "archive_decompress";
+    dependencies = with pkgs; [
+      gnutar
+      unzip
+      p7zip
+    ];
+  };
+
+  cd_project_root = async {
+    name = "cd_project_root";
+    dependencies = [pkgs.git];
   };
+
   chmod = pipe {
     name = "chmod";
     dependencies = [];
   };
-  clear_trash = shell {
-    name = "clear_trash";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        fzf
-        trashy
-        ;
-    };
-  };
-  dl_file = pipe {
-    name = "dl_file";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        xdragon
-        curl
-        ;
-    };
-  };
+
   dragon = pipe {
     name = "dragon";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        xdragon
-        ;
-    };
+    dependencies = [pkgs.dragon-drop];
   };
   dragon_individual = pipe {
     name = "dragon_individual";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        xdragon
-        ;
-    };
+    dependencies = [pkgs.dragon-drop];
   };
   dragon_stay = pipe {
     name = "dragon_stay";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        xdragon
-        ;
-    };
+    dependencies = [pkgs.dragon-drop];
   };
+
   execute = shell {
     name = "execute";
     dependencies = [];
+    keepPath = true;
   };
   follow_link = pipe {
     name = "follow_link";
-    dependencies = with pkgs; [lf];
-  };
-  fzf_jump = shell {
-    name = "fzf_jump";
-    dependencies = builtins.attrValues {
-      inherit (pkgs) fzf lf gnused;
-    };
+    dependencies = [];
   };
-  mk_dir = pipe {
-    name = "mk_dir";
+
+  mk_directory = pipe {
+    name = "mk_directory";
     dependencies = [];
   };
   mk_file = shell {
     name = "mk_file";
     dependencies = [];
   };
-  mk_file_and_edit = shell {
-    name = "mk_file_and_edit";
+  mk_link = pipe {
+    name = "mk_link";
     dependencies = [];
   };
-  mk_ln = pipe {
-    name = "mk_ln";
+  mk_script = shell {
+    name = "mk_script";
     dependencies = [];
+    keepPath = true;
   };
-  mk_scr_default = shell {
-    name = "mk_scr_default";
-    dependencies = builtins.attrValues {};
-    replacementStrings = {
-      SHELL_LIBRARY_TEMPLATE = "${shell_library.rawTemplate."${system}"}";
-    };
-  };
-  mk_scr_temp = shell {
-    name = "mk_scr_temp";
-    dependencies = builtins.attrValues {};
-    replacementStrings = {
-      SHELL_LIBRARY_TEMPLATE = "${shell_library.rawTemplate."${system}"}";
-      TO_BE_SHELL_LIBRARY_PATH = "%SHELL_LIBRARY_PATH"; # replacement is not recursive
-    };
-  };
-  view_file = async {
-    name = "view_file";
-    dependencies = builtins.attrValues {inherit (pkgs) file;};
-  };
-  go_project_base_directory = async {
-    name = "go_project_root";
-    dependencies = [];
-  };
-  restore_trash = shell {
-    name = "restore_trash";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        fzf
-        trashy
-        ;
-    };
-  };
+
   set_clipboard_path = async {
     name = "set_clipboard_path";
     dependencies = [pkgs.wl-clipboard];
   };
-  set_wall_paper = pipe {
-    name = "set_wall_paper";
-    dependencies = [];
+  set_wallpaper = pipe {
+    name = "set_wallpaper";
+    dependencies = with pkgs; [
+      river # for `riverctl`
+      swaybg
+      procps
+    ];
   };
+
   stripspace = pipe {
     name = "stripspace";
-    dependencies = [];
+    dependencies = [pkgs.gnused];
   };
+
   trash = pipe {
     name = "trash";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        trashy
-        trash-cli
-        findutils
-        ;
-    };
-  };
-  unarchive = pipe {
-    name = "unarchive";
-    dependencies = builtins.attrValues {
-      inherit
-        (pkgs)
-        gnutar
-        unzip
-        p7zip
-        ;
-    };
+    dependencies = [pkgs.trash-cli];
+  };
+  trash_clear = shell {
+    name = "trash_clear";
+    dependencies = with pkgs; [conceal fzf gawk trashy gnused];
+  };
+  trash_restore = shell {
+    name = "trash_restore";
+    dependencies = with pkgs; [conceal fzf gawk trashy gnused];
+  };
+
+  view_file = async {
+    name = "view_file";
+    dependencies = with pkgs; [file];
+    keepPath = true;
   };
 }
diff --git a/modules/by-name/lf/lf/commands/run.sh b/modules/by-name/lf/lf/commands/run.sh
new file mode 100755
index 00000000..06106aed
--- /dev/null
+++ b/modules/by-name/lf/lf/commands/run.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# Run one of the commands for debugging purposes.
+
+[ "$#" -gt 1 ] || {
+    echo "Usage: $0 <script_name> <input_files>.."
+    exit 2
+}
+
+script_name="./scripts/$1"
+shift 1
+
+fx=""
+for arg in "$@"; do
+    if [ -z "$fx" ]; then
+        fx="$arg"
+    else
+        fx="$(printf "%s\n%s" "$fx" "$arg")"
+    fi
+done
+
+export f="$1"
+set --
+
+# shellcheck source=/dev/null
+. ./base.sh
+# shellcheck source=/dev/null
+. "$script_name"
+
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/archive.sh b/modules/by-name/lf/lf/commands/scripts/archive.sh
deleted file mode 100755
index 25f40534..00000000
--- a/modules/by-name/lf/lf/commands/scripts/archive.sh
+++ /dev/null
@@ -1,77 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# Option '-f' disables pathname expansion which can be useful when $f, $fs, and
-# $fx variables contain names with '*' or '?' characters. However, this option
-# is used selectively within individual commands as it can be limiting at
-# times.
-set -f
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-
-archivers="$(tmp echo gzip xz 7z zip)"
-archiver="$(awk '{for (i=1; i<=NF; i++) print $i}' "$archivers" | fzf)"
-
-case "$archiver" in
-"gzip")
-    ext=tar.gz
-    ;;
-"xz")
-    ext=tar.xz
-    ;;
-"7z")
-    ext=7z
-    ;;
-"zip")
-    ext=zip
-    ;;
-esac
-
-prompt "Archive name: "
-name=""
-while [ -z "$name" ] || [ -e "$name" ]; do
-    read -r name_base
-    name="$name_base.$ext"
-    if [ -e "$name" ]; then
-        prompt "Archive already exists, overwrite [y|N]: "
-        read -r ans
-
-        if [ "$ans" = "y" ]; then
-            break
-        else
-            prompt "Archive name: "
-        fi
-    fi
-done
-
-root="$(if [ "$(pwd)" = "/" ]; then pwd; else echo "$(pwd)/"; fi)"
-
-# fx contains all selected file name separated by a newline
-while read -r raw_file; do
-    file="$(echo "$raw_file" | sed "s|$root||")"
-    set -- "$@" "$file"
-done <"$(tmp echo "$fx")"
-
-case "$archiver" in
-"gzip")
-    tar --create --gzip -file="$name" "$@"
-    ;;
-"xz")
-    tar --create --file="$name" "$@"
-    xz --compress -9 --extreme --threads=0 "$name"
-    ;;
-"7z")
-    7z a "$name" "$@"
-    ;;
-"zip")
-    zip --symlinks -9 -r "$name" "$@"
-    ;;
-esac
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/archive_compress.sh b/modules/by-name/lf/lf/commands/scripts/archive_compress.sh
new file mode 100755
index 00000000..b42688bf
--- /dev/null
+++ b/modules/by-name/lf/lf/commands/scripts/archive_compress.sh
@@ -0,0 +1,73 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck shell=sh
+
+# shellcheck disable=SC2269
+f="$f"
+# shellcheck disable=SC2269
+fx="$fx"
+# shellcheck disable=SC2269
+fs="$fs"
+
+archiver="$(printf "%s\n" gzip xz 7z zip | fzf)"
+
+case "$archiver" in
+"gzip")
+    ext=tar.gz
+    ;;
+"xz")
+    ext=tar.xz
+    ;;
+"7z")
+    ext=7z
+    ;;
+"zip")
+    ext=zip
+    ;;
+esac
+
+prompt "Archive name: "
+name=""
+while [ -z "$name" ] || [ -e "$name" ]; do
+    read -r name_base
+    name="$name_base.$ext"
+    if [ -e "$name" ]; then
+        prompt "Archive already exists, overwrite [y|N]: "
+        read -r ans
+
+        if [ "$ans" = "y" ]; then
+            break
+        else
+            prompt "New Archive name: "
+        fi
+    fi
+done
+
+# fx contains all selected file name separated by a newline
+while read -r file; do
+    set -- "$@" "$(realpath --relative-to="$(pwd)" "$file")"
+done <"$(echo "$fx" | tmp)"
+
+case "$archiver" in
+"gzip")
+    tar --create --gzip --file="$name" "$@"
+    ;;
+"xz")
+    tar --create "$@" | xz --compress -9 --format=xz --extreme --threads=0 --stdout >"$name"
+    ;;
+"7z")
+    7z a "$name" "$@"
+    ;;
+"zip")
+    zip --symlinks -9 --recurse-paths "$name" "$@"
+    ;;
+esac
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/archive_decompress.sh b/modules/by-name/lf/lf/commands/scripts/archive_decompress.sh
new file mode 100755
index 00000000..11d634b1
--- /dev/null
+++ b/modules/by-name/lf/lf/commands/scripts/archive_decompress.sh
@@ -0,0 +1,33 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck shell=sh
+
+# shellcheck disable=SC2269
+f="$f"
+# shellcheck disable=SC2269
+fx="$fx"
+# shellcheck disable=SC2269
+fs="$fs"
+# shellcheck disable=SC2269
+id="$id"
+
+echo "$fx" | while read -r file; do
+    case "$file" in
+    *.tar.bz | *.tar.bz2 | *.tbz | *.tbz2) tar --extract --bzip2 --verbose --file="$file" ;;
+    *.tar.gz | *.tgz) tar --extract --gzip --verbose --file="$file" ;;
+    *.tar.xz | *.txz) tar --extract --xz --verbose --file="$file" ;;
+    *.tar*) tar --extract --verbose --file="$file" ;;
+    *.zip) unzip "$file" ;;
+    *.7z) 7z x "$file" ;;
+    *) die "'$file' is not a supported file for unarchiving." ;;
+    esac
+done
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/broot_jump.sh b/modules/by-name/lf/lf/commands/scripts/broot_jump.sh
deleted file mode 100755
index 8f40ba01..00000000
--- a/modules/by-name/lf/lf/commands/scripts/broot_jump.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-tmp=$(mktmp)
-res="$(broot --outcmd "$tmp" && sed 's/cd //' "$tmp")"
-
-if [ -f "$res" ]; then
-    cmd="select"
-elif [ -d "$res" ]; then
-    cmd="cd"
-fi
-
-lf -remote "send '$id' '$cmd' '$res'"
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/cd_project_root.sh b/modules/by-name/lf/lf/commands/scripts/cd_project_root.sh
new file mode 100755
index 00000000..c2de61e6
--- /dev/null
+++ b/modules/by-name/lf/lf/commands/scripts/cd_project_root.sh
@@ -0,0 +1,29 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck shell=sh
+
+# shellcheck disable=SC2269
+f="$f"
+# shellcheck disable=SC2269
+fx="$fx"
+# shellcheck disable=SC2269
+fs="$fs"
+# shellcheck disable=SC2269
+id="$id"
+
+root="$(git rev-parse --show-toplevel)"
+if [ "$root" ]; then
+    lf_cmd cd "$root" || die "Bug: Failed to cd to project root at '$root'"
+else
+    die "Unable to locate base dir"
+fi
+
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/chmod.sh b/modules/by-name/lf/lf/commands/scripts/chmod.sh
index 9859127b..757f3c9c 100755
--- a/modules/by-name/lf/lf/commands/scripts/chmod.sh
+++ b/modules/by-name/lf/lf/commands/scripts/chmod.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -12,13 +19,12 @@ fs="$fs"
 # shellcheck disable=SC2269
 id="$id"
 
-readp "Mode bits: " bits
-# shellcheck disable=SC2269
-bits="$bits"
+prompt "Mode bits: "
+read -r bits
 
-while read -r file; do
+echo "$fx" | while read -r file; do
     chmod "$bits" "$file"
-done <"$(tmp echo "$fx")"
+done
 
-lf -remote 'send reload'
+lf_cmd reload
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/clear_trash.sh b/modules/by-name/lf/lf/commands/scripts/clear_trash.sh
deleted file mode 100755
index 9052bb5f..00000000
--- a/modules/by-name/lf/lf/commands/scripts/clear_trash.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# could also use --force, for instand removal
-trash list | fzf --multi | awk '{print $NF}' | xargs trash empty --match=exact
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/cow_cp.sh b/modules/by-name/lf/lf/commands/scripts/cow_cp.sh
index 98675b9e..dbe00654 100755
--- a/modules/by-name/lf/lf/commands/scripts/cow_cp.sh
+++ b/modules/by-name/lf/lf/commands/scripts/cow_cp.sh
@@ -1,5 +1,15 @@
 #!/usr/bin/env bash
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # shellcheck source=/dev/null
 SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
 
diff --git a/modules/by-name/lf/lf/commands/scripts/dl_file.sh b/modules/by-name/lf/lf/commands/scripts/dl_file.sh
deleted file mode 100755
index c7e3d8b2..00000000
--- a/modules/by-name/lf/lf/commands/scripts/dl_file.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-# Provides the ability to download a file by dropping it into a window
-
-url="$(dragon -t -x)"
-
-if [ -n "$url" ]; then
-    prompt "File Name: "
-    name=""
-    while [ -z "$name" ] || [ -e "$name" ]; do
-        read -r name
-        if [ -e "$name" ]; then
-            prompt "File already exists, overwrite [y|N]: "
-            read -r ans
-
-            if [ "$ans" = "y" ]; then
-                break
-            else
-                prompt "File Name: "
-            fi
-        fi
-    done
-
-    # Download the file with curl
-    if [ -n "$name" ]; then
-        curl -o "$name" "$url" || die "curl failed"
-    fi
-else
-    die "URL is null!"
-fi
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/dragon.sh b/modules/by-name/lf/lf/commands/scripts/dragon.sh
index cf3c3176..a4a52c72 100755
--- a/modules/by-name/lf/lf/commands/scripts/dragon.sh
+++ b/modules/by-name/lf/lf/commands/scripts/dragon.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -14,7 +21,7 @@ id="$id"
 
 while read -r file; do
     set -- "$@" "$file"
-done <"$(tmp echo "$fx")"
+done <"$(echo "$fx" | tmp)"
 
-dragon -a -x "$@"
+dragon-drop --all --and-exit "$@"
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/dragon_individual.sh b/modules/by-name/lf/lf/commands/scripts/dragon_individual.sh
index 2465cdfa..370e9753 100755
--- a/modules/by-name/lf/lf/commands/scripts/dragon_individual.sh
+++ b/modules/by-name/lf/lf/commands/scripts/dragon_individual.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -14,7 +21,7 @@ id="$id"
 
 while read -r file; do
     set -- "$@" "$file"
-done <"$(tmp echo "$fx")"
+done <"$(echo "$fx" | tmp)"
 
-dragon "$@"
+dragon-drop "$@"
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/dragon_stay.sh b/modules/by-name/lf/lf/commands/scripts/dragon_stay.sh
index 066b4c75..86a19370 100755
--- a/modules/by-name/lf/lf/commands/scripts/dragon_stay.sh
+++ b/modules/by-name/lf/lf/commands/scripts/dragon_stay.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -14,7 +21,7 @@ id="$id"
 
 while read -r file; do
     set -- "$@" "$file"
-done <"$(tmp echo "$fx")"
+done <"$(echo "$fx" | tmp)"
 
-dragon -a "$@"
+dragon-drop --all "$@"
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/execute.sh b/modules/by-name/lf/lf/commands/scripts/execute.sh
index aa97fd7f..ce62dfa0 100755
--- a/modules/by-name/lf/lf/commands/scripts/execute.sh
+++ b/modules/by-name/lf/lf/commands/scripts/execute.sh
@@ -1,7 +1,14 @@
-#!/usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
diff --git a/modules/by-name/lf/lf/commands/scripts/follow_link.sh b/modules/by-name/lf/lf/commands/scripts/follow_link.sh
index 80413990..71fa6825 100755
--- a/modules/by-name/lf/lf/commands/scripts/follow_link.sh
+++ b/modules/by-name/lf/lf/commands/scripts/follow_link.sh
@@ -1,7 +1,14 @@
-#!/usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -14,6 +21,12 @@ id="$id"
 
 dir="$(realpath "$f")"
 
-lf -remote "send $id cd \"$dir\""
+if [ -f "$dir" ]; then
+    cmd="select"
+elif [ -d "$dir" ]; then
+    cmd="cd"
+fi
+
+lf_cmd "$cmd" "$dir"
 
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/fzf_jump.sh b/modules/by-name/lf/lf/commands/scripts/fzf_jump.sh
deleted file mode 100755
index ad1633fb..00000000
--- a/modules/by-name/lf/lf/commands/scripts/fzf_jump.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-res="$(fd . --maxdepth 3 | fzf --header='Jump to location')"
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-if [ -f "$res" ]; then
-    cmd="select"
-elif [ -d "$res" ]; then
-    cmd="cd"
-fi
-
-lf -remote "send $id $cmd \"$res\""
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/go_project_root.sh b/modules/by-name/lf/lf/commands/scripts/go_project_root.sh
deleted file mode 100755
index 5f7746d3..00000000
--- a/modules/by-name/lf/lf/commands/scripts/go_project_root.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-flake_base_dir="$(search_flake_base_dir)"
-if [ "$flake_base_dir" ]; then
-    lf -remote "send $id cd $flake_base_dir" || die "Bug: No base dir ($flake_base_dir)"
-else
-    die "Unable to locate base dir"
-fi
-
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/mk_dir.sh b/modules/by-name/lf/lf/commands/scripts/mk_directory.sh
index 150f7eed..f3bd6d29 100755
--- a/modules/by-name/lf/lf/commands/scripts/mk_dir.sh
+++ b/modules/by-name/lf/lf/commands/scripts/mk_directory.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -23,7 +30,7 @@ while [ -z "$name" ] || [ -e "$name" ]; do
         if [ "$ans" = "y" ]; then
             break
         else
-            prompt "Directory Name: "
+            prompt "New Directory Name: "
         fi
     fi
 done
diff --git a/modules/by-name/lf/lf/commands/scripts/mk_file.sh b/modules/by-name/lf/lf/commands/scripts/mk_file.sh
index 41d5cf1a..78271aaa 100755
--- a/modules/by-name/lf/lf/commands/scripts/mk_file.sh
+++ b/modules/by-name/lf/lf/commands/scripts/mk_file.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -23,7 +30,7 @@ while [ -z "$name" ] || [ -e "$name" ]; do
         if [ "$ans" = "y" ]; then
             break
         else
-            prompt "File name: "
+            prompt "New File name: "
         fi
     fi
 done
diff --git a/modules/by-name/lf/lf/commands/scripts/mk_file_and_edit.sh b/modules/by-name/lf/lf/commands/scripts/mk_file_and_edit.sh
deleted file mode 100755
index 19fc51db..00000000
--- a/modules/by-name/lf/lf/commands/scripts/mk_file_and_edit.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-prompt "File name: "
-name=""
-while [ -z "$name" ] || [ -e "$name" ]; do
-    read -r name
-    if [ -e "$name" ]; then
-        prompt "File already exists, overwrite [y|N]: "
-        read -r ans
-
-        if [ "$ans" = "y" ]; then
-            break
-        else
-            prompt "File name: "
-        fi
-    fi
-done
-
-touch "$name"
-"$EDITOR" "$name"
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/mk_ln.sh b/modules/by-name/lf/lf/commands/scripts/mk_link.sh
index 7fab8e22..35f49c38 100755
--- a/modules/by-name/lf/lf/commands/scripts/mk_ln.sh
+++ b/modules/by-name/lf/lf/commands/scripts/mk_link.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -14,20 +21,19 @@ id="$id"
 
 while IFS= read -r i; do
     set -- "$@" "$i"
-done <"$HOME"/.local/share/lf/files
+done <"$HOME/.local/share/lf/files"
 
 mode="$1"
 shift
 
 if [ "$#" -eq 0 ]; then
-    msg "no files to link"
+    lf_cmd echo "No files to link."
     exit 0
 fi
 
 case "$mode" in
 copy)
-    while [ "$#" -gt 0 ]; do
-        file="$1"
+    for file in "$@"; do
         ans="$(basename "$file")"
 
         while [ -e "$ans" ]; do
@@ -36,10 +42,10 @@ copy)
         done
 
         ln --symbolic --relative "$file" "$(pwd)/$ans"
-        shift
     done
     ;;
 esac
-rm ~/.local/share/lf/files
+rm "$HOME/.local/share/lf/files"
 # lf -remote "send clear"
+
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/mk_scr_default.sh b/modules/by-name/lf/lf/commands/scripts/mk_scr_default.sh
deleted file mode 100755
index 47d05080..00000000
--- a/modules/by-name/lf/lf/commands/scripts/mk_scr_default.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-prompt "Script name: "
-name=""
-while [ -z "$name" ] || [ -e "$name" ]; do
-    read -r name_base
-    name="$name_base.sh"
-    if [ -e "$name" ]; then
-        prompt "Script already exists, overwrite [y|N]: "
-        read -r ans
-
-        if [ "$ans" = "y" ]; then
-            break
-        else
-            prompt "Script Name: "
-        fi
-    fi
-done
-
-script="$(pwd)"/"$name"
-
-cat "%SHELL_LIBRARY_TEMPLATE" >"$script"
-chmod +x "$script"
-"$VISUAL" "$script"
-
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/mk_scr_temp.sh b/modules/by-name/lf/lf/commands/scripts/mk_script.sh
index 512b5d0b..a708825d 100755
--- a/modules/by-name/lf/lf/commands/scripts/mk_scr_temp.sh
+++ b/modules/by-name/lf/lf/commands/scripts/mk_script.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -23,15 +30,21 @@ while [ -z "$name" ] || [ -e "$name" ]; do
         if [ "$ans" = "y" ]; then
             break
         else
-            prompt "Script Name: "
+            prompt "New Script Name: "
         fi
     fi
 done
 
-script="$(pwd)"/"$name"
+script="$(pwd)/$name"
+
+cat <<SCRIPT >"$script"
+#! /usr/bin/env sh
+
+
+
+# vim: ft=sh
+SCRIPT
 
-sed 's|%TO_BE_SHELL_LIBRARY_PATH|%SHELL_LIBRARY_PATH|' "%SHELL_LIBRARY_TEMPLATE" >"$script"
-sed -i 's|dash|sh|' "$script"
 chmod +x "$script"
 "$VISUAL" "$script"
 
diff --git a/modules/by-name/lf/lf/commands/scripts/restore_trash.sh b/modules/by-name/lf/lf/commands/scripts/restore_trash.sh
deleted file mode 100755
index b4ef492f..00000000
--- a/modules/by-name/lf/lf/commands/scripts/restore_trash.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-trash list | fzf --multi | awk '{print $NF}' | xargs trash restore --match=exact
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/set_clipboard_path.sh b/modules/by-name/lf/lf/commands/scripts/set_clipboard_path.sh
index ff5f3c01..f4cb5115 100755
--- a/modules/by-name/lf/lf/commands/scripts/set_clipboard_path.sh
+++ b/modules/by-name/lf/lf/commands/scripts/set_clipboard_path.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -17,10 +24,10 @@ if [ -n "$fx" ]; then
 elif [ -n "$f" ]; then
     echo "$f" | wl-copy --trim-newline
 else
-    lf -remote "send $id echo 'No file selected.'"
+    lf_cmd echo "No file selected."
     exit 1
 fi
 
-lf -remote "send $id echo 'Path copied'"
+lf_cmd echo "Path copied to clipboard."
 
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/set_wall_paper.sh b/modules/by-name/lf/lf/commands/scripts/set_wall_paper.sh
deleted file mode 100755
index 2e607d33..00000000
--- a/modules/by-name/lf/lf/commands/scripts/set_wall_paper.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-die "No yet implemented" # TODO: do what the 'die' says
-#sed -i "s,export AWMWALLPAPER='.*',export AWMWALLPAPER='${f}'," ${ZDOTDIR}/.zshenv
-#nohub swaybg -i "$f"
-#feh --bg-max --no-fehbg "$f"
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/set_wallpaper.sh b/modules/by-name/lf/lf/commands/scripts/set_wallpaper.sh
new file mode 100755
index 00000000..6311031e
--- /dev/null
+++ b/modules/by-name/lf/lf/commands/scripts/set_wallpaper.sh
@@ -0,0 +1,29 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck shell=sh
+
+# shellcheck disable=SC2269
+f="$f"
+# shellcheck disable=SC2269
+fx="$fx"
+# shellcheck disable=SC2269
+fs="$fs"
+# shellcheck disable=SC2269
+id="$id"
+
+# Kill all previous instances
+pkill swaybg
+
+# We cannot control the available commands for river.
+# Thus we ensure that it can correctly start `swaybg`
+swaybg="$(command -v swaybg)"
+riverctl spawn "$swaybg --image \"$f\"" && lf_cmd echo "Temporary background image set."
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/stripspace.sh b/modules/by-name/lf/lf/commands/scripts/stripspace.sh
index 33b1cbcf..9253b6de 100755
--- a/modules/by-name/lf/lf/commands/scripts/stripspace.sh
+++ b/modules/by-name/lf/lf/commands/scripts/stripspace.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -12,29 +19,14 @@ fs="$fs"
 # shellcheck disable=SC2269
 id="$id"
 
-files=$(mktmp)
-echo "$fx" >"$files"
+echo "$fx" | while read -r file; do
+    dirty_name=$(basename "$file")
+    clean_name=$(echo "$dirty_name" | sed 's/[[:blank:]]\+/_/g' | sed 's/\(.*\)/\L\1/')
 
-awk_source=$(mktmp)
-cat <<OFT >"$awk_source"
-BEGIN {FS=" "}
-{for (i=1; i != NF + 1; i++)
-    if (i == NF) {
-        parts[i]=tolower(\$i);
-    } else {
-        parts[i]=tolower(\$i"_");
-    }
-}
-END {for (i in parts) printf parts[i]}
-OFT
+    [ -e "$clean_name" ] && die "file '$clean_name' already exists!"
+    mv "$dirty_name" "$clean_name" || die "Move failed"
 
-while read -r file; do
-    dirty_name=$(mktmp)
-    basename "$file" >"$dirty_name"
-    clean_name=$(awk -f "$awk_source" "$dirty_name")
-
-    [ -e "$clean_name" ] && die "file \"$clean_name\" already exists!"
-    mv "$(cat "$dirty_name")" "$clean_name" || die "Move failed"
-    lf -remote 'send reload'
-done <"$files"
+    lf_cmd reload
+    lf_cmd select "$clean_name"
+done
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/trash.sh b/modules/by-name/lf/lf/commands/scripts/trash.sh
index f4878c49..68b36774 100755
--- a/modules/by-name/lf/lf/commands/scripts/trash.sh
+++ b/modules/by-name/lf/lf/commands/scripts/trash.sh
@@ -1,7 +1,14 @@
-#! /usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -12,26 +19,9 @@ fs="$fs"
 # shellcheck disable=SC2269
 id="$id"
 
-trash_output=$(mktmp)
-expected_error_output=$(mktmp)
-
 while read -r file; do
     set -- "$@" "$file"
-done <"$(tmp echo "$fx")"
-
-# TODO: why are we using trashy at all, when trash-cli can do everything?
-#
-# try trashy first, through nix because both trashy and trash-cli provide a trash command, which conflicts
-nix run nixpkgs#trashy -- put "$@" 2>"$trash_output"
-
-# FIXME: Find a way, that does not depend on parsing an error message <2023-08-29>
-cat <<EOF >"$expected_error_output"
-error: Error during a \`trash\` operation: Unknown { description: "Path: '\"/.Trash-1000\"'. Message: Permission denied (os error 13)" }
-EOF
+done <"$(echo "$fx" | tmp)"
 
-if [ "$(cat "$expected_error_output")" = "$(cat "$trash_output")" ]; then
-    warning "Deleting with trash-cli to the /.Trash folder"
-    # this file could not be trashed because it is on the tempfs volume, trash-cli can do this this
-    trash-put "$@"
-fi
+trash-put -- "$@"
 # vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/trash_clear.sh b/modules/by-name/lf/lf/commands/scripts/trash_clear.sh
new file mode 100755
index 00000000..597995f9
--- /dev/null
+++ b/modules/by-name/lf/lf/commands/scripts/trash_clear.sh
@@ -0,0 +1,19 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck shell=sh
+
+while IFS="$(printf '\n')" read -r file; do
+    set -- "$@" "$(pwd)/$file"
+done <"$(conceal list | fzf --multi --ansi | awk '{$1="";$2=""; print $0}' | sed 's/^\s*//' | tmp)"
+
+[ "$#" -ne 0 ] && trash empty --match=exact "$@"
+
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/trash_restore.sh b/modules/by-name/lf/lf/commands/scripts/trash_restore.sh
new file mode 100755
index 00000000..7b078c26
--- /dev/null
+++ b/modules/by-name/lf/lf/commands/scripts/trash_restore.sh
@@ -0,0 +1,27 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck shell=sh
+
+# shellcheck disable=SC2269
+f="$f"
+# shellcheck disable=SC2269
+fx="$fx"
+# shellcheck disable=SC2269
+fs="$fs"
+# shellcheck disable=SC2269
+id="$id"
+
+while IFS="$(printf '\n')" read -r file; do
+    set -- "$@" "$(pwd)/$file"
+done <"$(conceal list | fzf --multi --ansi | awk '{$1="";$2=""; print $0}' | sed 's/^\s*//' | tmp)"
+
+[ "$#" -ne 0 ] && trash restore --match=exact "$@"
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/unarchive.sh b/modules/by-name/lf/lf/commands/scripts/unarchive.sh
deleted file mode 100755
index d4835f6b..00000000
--- a/modules/by-name/lf/lf/commands/scripts/unarchive.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-fx="$fx"
-# shellcheck disable=SC2269
-fs="$fs"
-# shellcheck disable=SC2269
-id="$id"
-
-# extract the current file with the right command
-# (xkcd link: https://xkcd.com/1168/)
-set -f
-
-unarchive() {
-    case "$1" in
-    *.tar.bz | *.tar.bz2 | *.tbz | *.tbz2) tar xjvf "$1" ;;
-    *.tar.gz | *.tgz) tar xzvf "$1" ;;
-    *.tar.xz | *.txz) tar xJvf "$1" ;;
-    *.zip) unzip "$1" ;;
-    *.rar)
-        die "rar is a unfree format!"
-        ;;
-    *.7z) 7z x "$1" ;;
-    *) die "Unsupported format" ;;
-    esac
-}
-
-while read -r file; do
-    unarchive "$file"
-done <"$fx"
-# vim: ft=sh
diff --git a/modules/by-name/lf/lf/commands/scripts/view_file.sh b/modules/by-name/lf/lf/commands/scripts/view_file.sh
index 6258d755..48cdd85e 100755
--- a/modules/by-name/lf/lf/commands/scripts/view_file.sh
+++ b/modules/by-name/lf/lf/commands/scripts/view_file.sh
@@ -1,7 +1,14 @@
-#!/usr/bin/env dash
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# shellcheck shell=sh
 
 # shellcheck disable=SC2269
 f="$f"
@@ -12,7 +19,7 @@ fs="$fs"
 
 mime_type="$(file --mime-type --brief --dereference "$f")"
 case "$mime_type" in
-application/pdf)
+application/pdf | application/epub*)
     "$READER" "$f"
     ;;
 image/*)
diff --git a/modules/by-name/lf/lf/ctpv/default.nix b/modules/by-name/lf/lf/ctpv/default.nix
index 3748eca4..6f9988b9 100644
--- a/modules/by-name/lf/lf/ctpv/default.nix
+++ b/modules/by-name/lf/lf/ctpv/default.nix
@@ -1,5 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
-  sysLib,
   lib,
   config,
   pkgs,
@@ -8,15 +16,15 @@
   functionCall = {
     name,
     dependencies,
-    replacementStrings,
     scriptPath,
-    ...
+    environment,
   }:
-    sysLib.writeShellScript {
+    pkgs.writeShellApplication {
       inherit name;
-      src = scriptPath;
-      keepPath = false;
-      inherit replacementStrings dependencies;
+      text = builtins.readFile ./helpers.sh + builtins.readFile scriptPath;
+      inheritPath = false;
+      runtimeInputs = dependencies;
+      runtimeEnv = environment;
     }
     + "/bin/${name}";
 
@@ -24,8 +32,8 @@
     matches,
     priority,
     dependencies,
-    replacementStrings,
     previewer,
+    environment,
   }: let
     mkMimePath = val: let
       split = lib.strings.splitString "/" val;
@@ -49,7 +57,7 @@
       inherit
         name
         dependencies
-        replacementStrings
+        environment
         ;
       scriptPath = previewer;
     };
@@ -93,6 +101,12 @@
         };
       };
 
+      environment = lib.mkOption {
+        type = lib.types.attrsOf lib.types.str;
+        default = {};
+        description = "Environment variables to set for the script";
+      };
+
       previewer = lib.mkOption {
         type = lib.types.pathInStore;
         description = "The path to the preview script or binary";
@@ -104,13 +118,6 @@
         default = 0;
         description = "The priority to use this previewer.";
       };
-      replacementStrings = lib.mkOption {
-        type = lib.types.attrsOf (lib.types.either lib.types.str lib.types.pathInStore);
-        default = {
-          HELPERS = ./helpers.sh;
-        };
-        description = "Arbitrary strings to replace in the shell script.";
-      };
       dependencies = lib.mkOption {
         type = lib.types.listOf lib.types.package;
         default = [];
@@ -153,17 +160,6 @@ in {
 
     package = lib.mkPackageOption pkgs "ctpv-64-types" {};
 
-    # TODO: This is necessary, as the `./prev` dir is imported separately and as such
-    # cannot access the `./helpers.sh` file in it's parent directory.
-    # This separate import should ideally be removed. <2024-12-15>
-    helpers = lib.mkOption {
-      default = ./helpers.sh;
-      type = lib.types.pathInStore;
-
-      internal = true;
-      readOnly = true;
-    };
-
     previewers = lib.mkOption {
       description = ''
         The previewers to add to the config file.
diff --git a/modules/by-name/lf/lf/ctpv/helpers.sh b/modules/by-name/lf/lf/ctpv/helpers.sh
index 6dc7fee6..71524082 100644
--- a/modules/by-name/lf/lf/ctpv/helpers.sh
+++ b/modules/by-name/lf/lf/ctpv/helpers.sh
@@ -1,5 +1,15 @@
 #! /usr/bin/env dash
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 # shellcheck disable=SC2269
@@ -59,7 +69,7 @@ preview_xxd() {
     # This has been derived mathematically.
     octet_columns=$(((2 * w - 22) / 7))
 
-    if [ -n "$CTPV_LESS_PREVIEWER" ]; then
+    if [ "${CTPV_LESS_PREVIEWER:-unset}" != "-unset" ]; then
         __base_xxd_preview "$1"
     else
         __base_xxd_preview "$1" -len "$((h * octet_columns))"
diff --git a/modules/by-name/lf/lf/ctpv/prev/any.sh b/modules/by-name/lf/lf/ctpv/prev/any.sh
index 38dfd538..01c31e2b 100644
--- a/modules/by-name/lf/lf/ctpv/prev/any.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/any.sh
@@ -1,16 +1,23 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 w="$w"
 # shellcheck disable=SC2269
-e="$e"
+e="${e:-[missing extension]}"
 # shellcheck disable=SC2269
-m="$m"
+m="${m:-[missing mime type]}"
 # shellcheck disable=SC2269
 h="$h"
 
@@ -19,8 +26,6 @@ extension="$e"
 # shellcheck disable=SC2269
 mime="$m"
 
-. %HELPERS
-
 is_not_printable() {
     grep --text --quiet '[^[:print:]]' "$1"
 }
@@ -33,8 +38,8 @@ case "$mime" in
 *)
     echo "(ctpv did not recognize this file, with extension: '$extension' and mime: '$mime')"
 
-    directory_storage="%STORAGE_DIRECTORY/$mime"
-    mkdir --parents "$(dirname "%STORAGE_DIRECTORY/$mime")"
+    directory_storage="$STORAGE_DIRECTORY/$mime"
+    mkdir --parents "$(dirname "$STORAGE_DIRECTORY/$mime")"
 
     printf "%s -- %s\n" "$f" "$extension" >>"$directory_storage"
     ;;
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/archive/atool.sh b/modules/by-name/lf/lf/ctpv/prev/application/archive/atool.sh
index 5f4baac7..2bf8a89f 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/archive/atool.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/application/archive/atool.sh
@@ -1,11 +1,16 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 
-. %HELPERS
-
 atool --list -- "$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/archive/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/archive/default.nix
index 9370bf14..aee5c732 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/archive/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/application/archive/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     atool = {
@@ -64,7 +73,7 @@
         pkgs.atool
 
         # archive tools
-        pkgs.archiver # for arc
+        # pkgs.archiver # for arc # Unmaintained and insecure
         # pkgs.arj # NOTE: Fails to build since: 2024-12-28
         pkgs.cpio
         pkgs.dpkg
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/dll/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/dll/default.nix
index 00c7e389..121f419d 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/dll/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/application/dll/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     dll = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/dll/dll.sh b/modules/by-name/lf/lf/ctpv/prev/application/dll/dll.sh
index 678506eb..6ec68d55 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/dll/dll.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/application/dll/dll.sh
@@ -1,19 +1,24 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 w="$w"
 # shellcheck disable=SC2269
-e="$e"
+e="${e:-[missing extension]}"
 # shellcheck disable=SC2269
-m="$m"
+m="${m:-[missing mime type]}"
 # shellcheck disable=SC2269
 h="$h"
 
-. %HELPERS
-
 preview_xxd "$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/epub/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/epub/default.nix
index 40510a78..d28503e2 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/epub/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/application/epub/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     epub = {
@@ -5,11 +14,11 @@
       matches.mime = ["application/epub+zip"];
       matches.extension = ["epub"];
       priority = 1;
-      dependencies = with pkgs; [
-        bk
-        epub-thumbnailer
-        chafa
-        gnused
+      dependencies = [
+        pkgs.bk
+        pkgs.epub-thumbnailer
+        pkgs.chafa
+        pkgs.gnused
       ];
     };
   };
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/epub/epub.sh b/modules/by-name/lf/lf/ctpv/prev/application/epub/epub.sh
index 703e7dad..87c33dff 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/epub/epub.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/application/epub/epub.sh
@@ -1,23 +1,28 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 w="$w"
 # shellcheck disable=SC2269
-e="$e"
+e="${e:-[missing extension]}"
 # shellcheck disable=SC2269
-m="$m"
+m="${m:-[missing mime type]}"
 # shellcheck disable=SC2269
 h="$h"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 epub() {
     epub-thumbnailer "$f" "$cache_f" 20000
 }
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix
index d3061ea8..e30aab3e 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     pdf = {
@@ -8,6 +17,7 @@
         pkgs.poppler_utils # for `pdftoppm`
         pkgs.chafa
         pkgs.gnused
+        pkgs.coreutils
       ];
     };
   };
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/pdf/pdf.sh b/modules/by-name/lf/lf/ctpv/prev/application/pdf/pdf.sh
index 2f807b1a..2c2e5ff9 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/pdf/pdf.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/application/pdf/pdf.sh
@@ -1,15 +1,20 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 pdf() {
     pdftoppm -f 1 -l 1 \
         -scale-to-x 1920 \
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/pgp/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/pgp/default.nix
index 32f42783..c9001176 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/pgp/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/application/pgp/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     pgp = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/pgp/pgp.sh b/modules/by-name/lf/lf/ctpv/prev/application/pgp/pgp.sh
index a4eefd96..cfe359ea 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/pgp/pgp.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/application/pgp/pgp.sh
@@ -1,13 +1,18 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 w="$w"
 
-. %HELPERS
-
 hide_script_env sq inspect --certifications -- "$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/sqlite/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/sqlite/default.nix
index 54b8c29e..ab200dd9 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/sqlite/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/application/sqlite/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     sqlite = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/sqlite/sqlite.sh b/modules/by-name/lf/lf/ctpv/prev/application/sqlite/sqlite.sh
index 07e77a93..2d3a45fe 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/sqlite/sqlite.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/application/sqlite/sqlite.sh
@@ -1,15 +1,20 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 w="$w"
 
-. %HELPERS
-
 echo "SQLite database. Schema:"
 echo
 
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/default.nix
index 504623a0..dfd6911b 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     torrent = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/torrent.sh b/modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/torrent.sh
index 16cfcbcd..38838d2e 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/torrent.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/application/x-bittorrent/torrent.sh
@@ -1,13 +1,18 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 transmission-show -- "$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/x-pem-file/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/x-pem-file/default.nix
new file mode 100644
index 00000000..fb82aa8a
--- /dev/null
+++ b/modules/by-name/lf/lf/ctpv/prev/application/x-pem-file/default.nix
@@ -0,0 +1,20 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{pkgs, ...}: {
+  soispha.programs.lf.ctpv.previewers = {
+    pem = {
+      previewer = ./pem.sh;
+      matches.mime = ["application/x-pem-file"];
+      dependencies = [
+        pkgs.openssl
+      ];
+    };
+  };
+}
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/x-pem-file/pem.sh b/modules/by-name/lf/lf/ctpv/prev/application/x-pem-file/pem.sh
new file mode 100644
index 00000000..2948e25a
--- /dev/null
+++ b/modules/by-name/lf/lf/ctpv/prev/application/x-pem-file/pem.sh
@@ -0,0 +1,18 @@
+#! /usr/bin/env dash
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# shellcheck disable=SC2269
+f="$f"
+# shellcheck disable=SC2269
+cache_f="$cache_f"
+
+openssl x509 -in "$f" -text -noout
diff --git a/modules/by-name/lf/lf/ctpv/prev/audio/audio.sh b/modules/by-name/lf/lf/ctpv/prev/audio/audio.sh
index c5abc646..324a2170 100644
--- a/modules/by-name/lf/lf/ctpv/prev/audio/audio.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/audio/audio.sh
@@ -1,15 +1,20 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 audio() {
     ffmpegthumbnailer -i "$f" -s 0 -q 5 -t 10 -o "$cache_f" 2>/dev/null
 }
diff --git a/modules/by-name/lf/lf/ctpv/prev/audio/default.nix b/modules/by-name/lf/lf/ctpv/prev/audio/default.nix
index 0c60e9d5..7ae5d7fd 100644
--- a/modules/by-name/lf/lf/ctpv/prev/audio/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/audio/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     audio = {
@@ -9,6 +18,7 @@
 
         pkgs.chafa
         pkgs.gnused
+        pkgs.coreutils
       ];
     };
   };
diff --git a/modules/by-name/lf/lf/ctpv/prev/default.nix b/modules/by-name/lf/lf/ctpv/prev/default.nix
index b59430f8..d7e420d0 100644
--- a/modules/by-name/lf/lf/ctpv/prev/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   config,
@@ -10,18 +19,15 @@ in {
       previewer = ./any.sh;
       priority = -1;
       matches.mime = ["*/*"];
-      replacementStrings = {
-        # FIXME: This declaration replaces the default (although it should be merged with
-        # the default value.) There must be a way, so that repeating the default values is
-        # not needed. <2024-12-15>
-        HELPERS = cfg.ctpv.helpers;
-
+      environment = {
         STORAGE_DIRECTORY = "${cfg.ctpv.xdgDataHome}/ctpv/missing_previews";
       };
 
       dependencies = [
         pkgs.tinyxxd # For xxd
         pkgs.bat
+        pkgs.gnugrep
+        pkgs.coreutils
       ];
     };
   };
diff --git a/modules/by-name/lf/lf/ctpv/prev/font/default.nix b/modules/by-name/lf/lf/ctpv/prev/font/default.nix
index 306e7892..76a284f4 100644
--- a/modules/by-name/lf/lf/ctpv/prev/font/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/font/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     font = {
@@ -13,6 +22,7 @@
         pkgs.fontforge # for `fontimage`
         pkgs.chafa
         pkgs.gnused
+        pkgs.coreutils
       ];
     };
   };
diff --git a/modules/by-name/lf/lf/ctpv/prev/font/font.sh b/modules/by-name/lf/lf/ctpv/prev/font/font.sh
index 4065557e..49e12ec7 100644
--- a/modules/by-name/lf/lf/ctpv/prev/font/font.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/font/font.sh
@@ -1,15 +1,20 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 font() {
     fontimage -o "$cache_f.png" "$f" 2>/dev/null &&
         mv -- "$cache_f.png" "$cache_f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/image/default.nix b/modules/by-name/lf/lf/ctpv/prev/image/default.nix
index 87fba00c..79037d5a 100644
--- a/modules/by-name/lf/lf/ctpv/prev/image/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/image/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     image = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/image/image.sh b/modules/by-name/lf/lf/ctpv/prev/image/image.sh
index b5b97668..d021cbf6 100644
--- a/modules/by-name/lf/lf/ctpv/prev/image/image.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/image/image.sh
@@ -1,11 +1,16 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 
-. %HELPERS
-
 send_image "$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/image/svg+xml/default.nix b/modules/by-name/lf/lf/ctpv/prev/image/svg+xml/default.nix
index 90915c84..25bd6f77 100644
--- a/modules/by-name/lf/lf/ctpv/prev/image/svg+xml/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/image/svg+xml/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     svg = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/image/svg+xml/svg.sh b/modules/by-name/lf/lf/ctpv/prev/image/svg+xml/svg.sh
index 04a06f56..b16e4fc5 100644
--- a/modules/by-name/lf/lf/ctpv/prev/image/svg+xml/svg.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/image/svg+xml/svg.sh
@@ -1,15 +1,20 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 svg() {
     magick "$f" "jpg:$cache_f"
 }
diff --git a/modules/by-name/lf/lf/ctpv/prev/image/x-xcf/default.nix b/modules/by-name/lf/lf/ctpv/prev/image/x-xcf/default.nix
index a3394ef4..5af6c501 100644
--- a/modules/by-name/lf/lf/ctpv/prev/image/x-xcf/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/image/x-xcf/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     xcf = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/image/x-xcf/xcf.sh b/modules/by-name/lf/lf/ctpv/prev/image/x-xcf/xcf.sh
index 1603e337..4ad4b34b 100644
--- a/modules/by-name/lf/lf/ctpv/prev/image/x-xcf/xcf.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/image/x-xcf/xcf.sh
@@ -1,15 +1,20 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 xcf() {
     # TODO: Add this (currently it fails, as gimp lacks the `python-fu` evaluator) <2024-11-25>
     true
diff --git a/modules/by-name/lf/lf/ctpv/prev/inode/default.nix b/modules/by-name/lf/lf/ctpv/prev/inode/default.nix
index eaade0f1..fe5ee3e1 100644
--- a/modules/by-name/lf/lf/ctpv/prev/inode/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/inode/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     ls = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/inode/ls.sh b/modules/by-name/lf/lf/ctpv/prev/inode/ls.sh
index f73bd1c2..73e036eb 100644
--- a/modules/by-name/lf/lf/ctpv/prev/inode/ls.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/inode/ls.sh
@@ -1,7 +1,14 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
@@ -10,6 +17,4 @@ cache_d="$cache_d"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 ls --color --group-directories-first -- "$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/inode/symlink.sh b/modules/by-name/lf/lf/ctpv/prev/inode/symlink.sh
index b30957d0..2629f62a 100644
--- a/modules/by-name/lf/lf/ctpv/prev/inode/symlink.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/inode/symlink.sh
@@ -1,13 +1,18 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 
-. %HELPERS
-
 #
 # do nothing because in src/ctpv.c some kind of a "preview"
 # is already printed
diff --git a/modules/by-name/lf/lf/ctpv/prev/libreoffice.sh b/modules/by-name/lf/lf/ctpv/prev/libreoffice.sh
index ec57da0b..ade1038e 100644
--- a/modules/by-name/lf/lf/ctpv/prev/libreoffice.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/libreoffice.sh
@@ -1,7 +1,14 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
@@ -10,8 +17,6 @@ cache_d="$cache_d"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 doc() {
     # File produced by libreoffice
     jpg="$(printf '%s\n' "$f" | sed 's|^.*/||; s|\..*$||')"
diff --git a/modules/by-name/lf/lf/ctpv/prev/remove_default_previews.nix b/modules/by-name/lf/lf/ctpv/prev/remove_default_previews.nix
index 1407386b..6614fa8d 100644
--- a/modules/by-name/lf/lf/ctpv/prev/remove_default_previews.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/remove_default_previews.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   soispha.programs.lf.ctpv.extraConfigPre = ''
     remove any
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/bat.sh b/modules/by-name/lf/lf/ctpv/prev/text/bat.sh
index be952aea..b20e9cea 100644
--- a/modules/by-name/lf/lf/ctpv/prev/text/bat.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/text/bat.sh
@@ -1,13 +1,18 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 w="$w"
 
-. %HELPERS
-
 preview_bat "$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/default.nix b/modules/by-name/lf/lf/ctpv/prev/text/default.nix
index 14e74a4d..edb6e09d 100644
--- a/modules/by-name/lf/lf/ctpv/prev/text/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/text/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     glow = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/diff/default.nix b/modules/by-name/lf/lf/ctpv/prev/text/diff/default.nix
index e0fa15bb..f21acd5e 100644
--- a/modules/by-name/lf/lf/ctpv/prev/text/diff/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/text/diff/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     delta = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/diff/delta.sh b/modules/by-name/lf/lf/ctpv/prev/text/diff/delta.sh
index 6a4e9a4e..d30565df 100644
--- a/modules/by-name/lf/lf/ctpv/prev/text/diff/delta.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/text/diff/delta.sh
@@ -1,11 +1,16 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 
-. %HELPERS
-
 delta <"$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/glow.sh b/modules/by-name/lf/lf/ctpv/prev/text/glow.sh
index 301fe675..2e8d9f58 100644
--- a/modules/by-name/lf/lf/ctpv/prev/text/glow.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/text/glow.sh
@@ -1,15 +1,20 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 w="$w"
 
-. %HELPERS
-
 # Specify the style, to force `glow` to output colors.
 # tracking issue: https://github.com/charmbracelet/glow/issues/654
 # We can't use `hide_script_env` because of some bespoke reason. (It just forces glow to
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/html/default.nix b/modules/by-name/lf/lf/ctpv/prev/text/html/default.nix
deleted file mode 100644
index 2a7a9a9f..00000000
--- a/modules/by-name/lf/lf/ctpv/prev/text/html/default.nix
+++ /dev/null
@@ -1,13 +0,0 @@
-{pkgs, ...}: {
-  # TODO: I might want to use lynx/w3m instead <2024-11-24>
-  soispha.programs.lf.ctpv.previewers = {
-    elinks = {
-      previewer = ./elinks.sh;
-      priority = 1;
-      matches.mime = ["text/html"];
-      dependencies = [
-        pkgs.elinks
-      ];
-    };
-  };
-}
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/html/elinks.sh b/modules/by-name/lf/lf/ctpv/prev/text/html/elinks.sh
deleted file mode 100644
index ca0de22e..00000000
--- a/modules/by-name/lf/lf/ctpv/prev/text/html/elinks.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#! /usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# shellcheck disable=SC2269
-f="$f"
-# shellcheck disable=SC2269
-w="$w"
-
-. %HELPERS
-
-elinks \
-    -dump 1 -dump-width "$w" \
-    -no-references -no-numbering <"$f"
-
-# lynx -dump -nonumbers -nolist -width="$w" -- "$f"
-# w3m -dump "$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/json/default.nix b/modules/by-name/lf/lf/ctpv/prev/text/json/default.nix
index 7e2ef090..9538c365 100644
--- a/modules/by-name/lf/lf/ctpv/prev/text/json/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/text/json/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     jq = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/json/jq.sh b/modules/by-name/lf/lf/ctpv/prev/text/json/jq.sh
index bf807d1d..fa7c47b6 100644
--- a/modules/by-name/lf/lf/ctpv/prev/text/json/jq.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/text/json/jq.sh
@@ -1,11 +1,16 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 
-. %HELPERS
-
 jq --color-output . <"$f"
diff --git a/modules/by-name/lf/lf/ctpv/prev/video/default.nix b/modules/by-name/lf/lf/ctpv/prev/video/default.nix
index f38f61c7..d500fbd9 100644
--- a/modules/by-name/lf/lf/ctpv/prev/video/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/video/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   soispha.programs.lf.ctpv.previewers = {
     video = {
diff --git a/modules/by-name/lf/lf/ctpv/prev/video/video.sh b/modules/by-name/lf/lf/ctpv/prev/video/video.sh
index e42e3612..dac75205 100644
--- a/modules/by-name/lf/lf/ctpv/prev/video/video.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/video/video.sh
@@ -1,15 +1,20 @@
 #! /usr/bin/env dash
 
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # shellcheck disable=SC2269
 f="$f"
 # shellcheck disable=SC2269
 cache_f="$cache_f"
 
-. %HELPERS
-
 video() {
     ffmpegthumbnailer -i "$f" -o "$cache_f" -s 0 -t 50% 2>/dev/null
 }
diff --git a/modules/by-name/lf/lf/icons.license b/modules/by-name/lf/lf/icons.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/lf/lf/icons.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/lf/lf/keybindings/default.nix b/modules/by-name/lf/lf/keybindings/default.nix
index f624719f..d4c2a6a3 100644
--- a/modules/by-name/lf/lf/keybindings/default.nix
+++ b/modules/by-name/lf/lf/keybindings/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   uid,
   downloadDir,
@@ -36,21 +45,18 @@
   cp = "set_clipboard_path";
 
   # Archive Mappings
-  au = "unarchive";
-  aa = "archive";
+  au = "archive_decompress";
+  aa = "archive_compress";
 
   # Trash Mappings
   dd = "trash";
-  jc = "clear_trash";
-  jr = "restore_trash";
+  jc = "trash_clear";
+  jr = "trash_restore";
 
   # Dragon Mapping
   dr = "dragon";
-  ds = "dragon-stay";
-  di = "dragon-individual";
-  #dm = "mvdragon";
-  #dc = "cpdragon";
-  dl = "dlfile";
+  ds = "dragon_stay";
+  di = "dragon_individual";
 
   cs = "stripspace";
 
@@ -68,17 +74,15 @@
   y = "copy";
   "<enter>" = "open";
 
-  mk = "mk_ln";
+  mk = "mk_link";
   mf = "mk_file";
-  me = "mk_file_and_edit";
-  md = "mk_dir";
-  ms = "mk_scr_default";
-  mt = "mk_scr_temp";
+  md = "mk_directory";
+  ms = "mk_script";
 
   ch = "chmod";
-  bg = "set_wall_paper";
+  bg = "set_wallpaper";
   r = ":rename; cmd-end";
-  H = "go_project_base_directory";
+  H = "cd_project_root";
   R = "reload";
   C = "clear";
   U = "unselect";
diff --git a/modules/by-name/lf/lf/module.nix b/modules/by-name/lf/lf/module.nix
index 6dc8e919..ea9970ef 100644
--- a/modules/by-name/lf/lf/module.nix
+++ b/modules/by-name/lf/lf/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   config,
@@ -10,6 +19,8 @@
   commands = import ./commands {inherit pkgs sysLib shell_library system;};
   keybindings = import ./keybindings {inherit (cfg.keymaps) uid downloadDir;};
 
+  packages = import ./wrappers {inherit pkgs;};
+
   cfg = config.soispha.programs.lf;
 in {
   imports = [
@@ -49,6 +60,11 @@ in {
         "lf/colors".source = ./colors;
       };
 
+      programs.zsh.shellAliases = {
+        ll = ". ${lib.getExe packages.ll}";
+        lm = ". ${lib.getExe packages.lm}";
+      };
+
       programs.lf = {
         enable = true;
 
@@ -75,7 +91,7 @@ in {
           icons = true;
           ifs = "\\n"; # internal field separator for shell commands
           #info = "size"; # show the size of a directory
-          shell = "sh";
+          shell = "${lib.getExe pkgs.dash}";
           shellopts = "-eu"; # e: exit on error; u: error for unset variables
         };
         extraConfig = ''
diff --git a/modules/by-name/lf/lf/wrappers/default.nix b/modules/by-name/lf/lf/wrappers/default.nix
new file mode 100644
index 00000000..7257a66e
--- /dev/null
+++ b/modules/by-name/lf/lf/wrappers/default.nix
@@ -0,0 +1,4 @@
+{pkgs}: {
+  ll = pkgs.callPackage ./ll {};
+  lm = pkgs.callPackage ./lm {};
+}
diff --git a/modules/by-name/lf/lf/wrappers/ll/default.nix b/modules/by-name/lf/lf/wrappers/ll/default.nix
new file mode 100644
index 00000000..6e4ee336
--- /dev/null
+++ b/modules/by-name/lf/lf/wrappers/ll/default.nix
@@ -0,0 +1,18 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{writeShellApplication}:
+writeShellApplication {
+  name = "ll";
+  text = builtins.readFile ./ll.sh;
+
+  # This is sourced in the shell
+  inheritPath = true;
+  bashOptions = [];
+}
diff --git a/modules/by-name/lf/lf/wrappers/ll/ll.sh b/modules/by-name/lf/lf/wrappers/ll/ll.sh
new file mode 100755
index 00000000..e012cffa
--- /dev/null
+++ b/modules/by-name/lf/lf/wrappers/ll/ll.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env dash
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+last_directory="$(mktemp)"
+cleanup() {
+    rm "$last_directory"
+}
+trap cleanup EXIT
+
+command lf -last-dir-path="$last_directory" "$@"
+
+dir="$(cat "$last_directory")"
+if cd "$dir"; then
+    [ -d "$XDG_RUNTIME_DIR/ll" ] || mkdir "$XDG_RUNTIME_DIR/ll"
+    echo "$dir" >"$XDG_RUNTIME_DIR/ll/last_directory"
+else
+    die "$dir does not exist!"
+fi
+
+# vim: ft=sh
diff --git a/modules/by-name/lf/lf/wrappers/lm/default.nix b/modules/by-name/lf/lf/wrappers/lm/default.nix
new file mode 100644
index 00000000..42bdc687
--- /dev/null
+++ b/modules/by-name/lf/lf/wrappers/lm/default.nix
@@ -0,0 +1,18 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{writeShellApplication}:
+writeShellApplication {
+  name = "lm";
+  text = builtins.readFile ./lm.sh;
+
+  # This is sourced in the shell
+  inheritPath = true;
+  bashOptions = [];
+}
diff --git a/modules/by-name/lf/lf/wrappers/lm/lm.sh b/modules/by-name/lf/lf/wrappers/lm/lm.sh
new file mode 100755
index 00000000..71213721
--- /dev/null
+++ b/modules/by-name/lf/lf/wrappers/lm/lm.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env dash
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+die() {
+    echo "ERROR: $1"
+    exit 1
+}
+
+msg() {
+    echo "$1"
+}
+
+if [ -f "$XDG_RUNTIME_DIR/ll/last_directory" ]; then
+    last_dir="$(cat "$XDG_RUNTIME_DIR/ll/last_directory")"
+    cd "$last_dir" || die "$last_dir does not exist!"
+else
+    msg "No last directory saved (try using ll instead)."
+fi
+# vim: ft=sh
diff --git a/modules/by-name/li/libvirtd/module.nix b/modules/by-name/li/libvirtd/module.nix
index 5c519550..ba1cc2e1 100644
--- a/modules/by-name/li/libvirtd/module.nix
+++ b/modules/by-name/li/libvirtd/module.nix
@@ -1,4 +1,15 @@
-{pkgs, ...}: {
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{...}: {
+  # FIXME(@bpeetz): Do something with this module. <2025-04-04>
+
   # virtualisation = {
   # spiceUSBRedirection.enable = true; # TODO: this allows usb access to any user, which shouldn't be that bad
   #    cores = 8;
diff --git a/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb.license b/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/lo/locale/keymaps/us_modified.xkb b/modules/by-name/lo/locale/keymaps/us_modified.xkb
deleted file mode 100644
index 6299a5e9..00000000
--- a/modules/by-name/lo/locale/keymaps/us_modified.xkb
+++ /dev/null
@@ -1,9 +0,0 @@
-partial alphanumeric_keys
-xkb_symbols "us-modified" {
-    name[Group1]= "US English with caps lock key as compose key";
-
-
-    include "us(basic)"
-    include "compose(caps)"
-};
-// vim: ft=xkb
diff --git a/modules/by-name/lo/locale/module.nix b/modules/by-name/lo/locale/module.nix
index 10569216..17096731 100644
--- a/modules/by-name/lo/locale/module.nix
+++ b/modules/by-name/lo/locale/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -42,11 +51,6 @@ in {
     };
 
     services.xserver.xkb.extraLayouts = {
-      "us-modified" = {
-        description = "standard us with caps as compose key.";
-        languages = ["eng" "swe" "deu"];
-        symbolsFile = ./keymaps/us_modified.xkb;
-      };
       "dvorak-modified" = {
         description = "standard dvorak english with german and swedish extra chars.";
         languages = ["eng" "swe" "deu"];
diff --git a/modules/by-name/ma/mako/module.nix b/modules/by-name/ma/mako/module.nix
new file mode 100644
index 00000000..1630d2d0
--- /dev/null
+++ b/modules/by-name/ma/mako/module.nix
@@ -0,0 +1,81 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.services.mako;
+
+  iconPath = "${pkgs.gruvbox-dark-icons-gtk.overrideAttrs (prev: final: {
+    # Remove unused dependencies
+    propagatedBuildInputs = [];
+  })}/share/icons/oomox-gruvbox-dark";
+in {
+  options.soispha.services.mako = {
+    enable = lib.mkEnableOption "mako";
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      services.mako = {
+        enable = true;
+
+        # See mako(5)
+        settings = {
+          max-history = 5;
+          sort = "-time";
+
+          background-color = "#2e3440";
+          border-color = "#88c0d0";
+          border-radius = 25;
+          border-size = 2;
+          default-timeout = 5000;
+          font = "Source Code Pro 10";
+          group-by = "body";
+          height = 500;
+          icon-path = iconPath;
+          icons = true;
+          ignore-timeout = false;
+          layer = "overlay";
+          markup = true;
+          max-icon-size = 64;
+          width = 500;
+
+          "urgency=low" = {
+            border-color = "#cccccc";
+          };
+
+          "urgency=normal" = {
+            border-color = "#d08770";
+          };
+
+          "urgency=high" = {
+            border-size = 3;
+            border-color = "#bf616a";
+            default-timeout = 0;
+          };
+
+          "urgency=critical" = {
+            border-size = 4;
+            border-color = "#bf616a";
+            default-timeout = 0;
+          };
+
+          "category=mpd" = {
+            default-timeout = 2000;
+            group-by = "category";
+          };
+        };
+      };
+    };
+  };
+}
diff --git a/modules/by-name/mp/mpd/module.nix b/modules/by-name/mp/mpd/module.nix
index 6f045f9f..b7c7ab5a 100644
--- a/modules/by-name/mp/mpd/module.nix
+++ b/modules/by-name/mp/mpd/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   pkgs,
diff --git a/modules/by-name/mp/mpd/mpc.nix b/modules/by-name/mp/mpd/mpc.nix
index 031465fe..cd4a4ec0 100644
--- a/modules/by-name/mp/mpd/mpc.nix
+++ b/modules/by-name/mp/mpd/mpc.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -5,7 +14,6 @@
   ...
 }: let
   cfg = config.soispha.services.mpd.mpc;
-  parentCfg = config.soispha.services.mpd;
 in {
   options.soispha.services.mpd.mpc = {
     enable = lib.mkEnableOption "mpc with extensions";
@@ -29,9 +37,7 @@ in {
         beets = cfg.beetsPkg;
       })
       # Displays the lyrics of the currently playing song
-      (pkgs.mpp-lyrics.override {
-        mpd_music_dir = parentCfg.directories.music;
-      })
+      pkgs.mpp-lyrics
     ];
   };
 }
diff --git a/modules/by-name/mp/mpd/mpdconf.example.license b/modules/by-name/mp/mpd/mpdconf.example.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/mp/mpd/mpdconf.example.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/mp/mpv/module.nix b/modules/by-name/mp/mpv/module.nix
new file mode 100644
index 00000000..7c8435d5
--- /dev/null
+++ b/modules/by-name/mp/mpv/module.nix
@@ -0,0 +1,54 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.mpv;
+in {
+  options.soispha.programs.mpv = {
+    enable = lib.mkEnableOption "mpv";
+  };
+
+  config.home-manager.users.soispha = lib.mkIf cfg.enable {
+    programs.mpv = {
+      enable = true;
+
+      bindings = {
+        q = "quit 0";
+        "Ctrl+c" = "quit 1";
+        "Shift+q" = "quit-watch-later 1";
+      };
+      config = {
+        osd-bar = true;
+
+        border = false;
+      };
+      scriptOpts = {
+        osc = {
+          scalewindowed = 0.8;
+          hidetimeout = 300;
+        };
+        thumbfast = {
+          hwdec = true;
+          network = false;
+          spawn_first = false;
+          max_height = 250;
+          max_width = 250;
+        };
+      };
+      scripts = with pkgs.mpvScripts; [
+        thumbfast
+      ];
+    };
+  };
+}
diff --git a/modules/by-name/ne/networking/module.nix b/modules/by-name/ne/networking/module.nix
index 8448e9b3..6f8633e8 100644
--- a/modules/by-name/ne/networking/module.nix
+++ b/modules/by-name/ne/networking/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/zs/zsh/config/command_not_found/command_not_found.sh b/modules/by-name/ni/nix-index/command_not_found.sh
index fb21b676..f650cf7b 100644
--- a/modules/by-name/zs/zsh/config/command_not_found/command_not_found.sh
+++ b/modules/by-name/ni/nix-index/command_not_found.sh
@@ -1,5 +1,15 @@
 #!/usr/bin/env dash
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # This was taken from the
 # `${pkgs.nix-index}/etc/profile.d/command-not-found.sh` file on 2024-02-28
 
@@ -48,7 +58,7 @@ EOF
 The program '$cmd' is currently not installed. It is provided by
 several packages. You can run it once with:
 EOF
-        awk --assign=toplevel="$toplevel" 'BEGIN{counter=0} {printf("%3s)", counter); printf("  nix shell %s#%s\n", toplevel, $1); counter+=1}' "$(ptmp "$attrs")"
+        echo "$attrs" | awk --assign=toplevel="$toplevel" 'BEGIN{counter=0} {printf("%3s)", counter); printf("  nix shell %s#%s\n", toplevel, $1); counter+=1}'
         ;;
     esac
 
diff --git a/modules/by-name/ni/nix-index/module.nix b/modules/by-name/ni/nix-index/module.nix
new file mode 100644
index 00000000..06acfc8a
--- /dev/null
+++ b/modules/by-name/ni/nix-index/module.nix
@@ -0,0 +1,44 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  modules,
+  ...
+}: let
+  cfg = config.soispha.programs.nix-index;
+in {
+  options.soispha.programs.nix-index = {
+    enable = lib.mkEnableOption "nix-index";
+  };
+
+  config = lib.mkIf cfg.enable {
+    soispha.programs.zsh.integrations.nix-index = ./command_not_found.sh;
+    home-manager.users.soispha = {
+      imports = [
+        modules.nix-index-database.hmModules.nix-index
+      ];
+
+      programs.nix-index = {
+        enable = true;
+        symlinkToCacheHome = true;
+
+        # Handled by myself (and the script is overridden)
+        enableBashIntegration = false;
+        enableZshIntegration = false;
+        enableFishIntegration = false;
+      };
+
+      programs.nix-index-database = {
+        comma.enable = false;
+      };
+    };
+  };
+}
diff --git a/modules/by-name/ni/nix/module.nix b/modules/by-name/ni/nix/module.nix
index 767ab076..2b91f59b 100644
--- a/modules/by-name/ni/nix/module.nix
+++ b/modules/by-name/ni/nix/module.nix
@@ -1,22 +1,32 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   # flakes
-  nixpkgs_as_input,
-  templates,
   self,
   system,
+  externalDependencies,
   ...
 }: {
+  # TODO(@bpeetz): Modularize <2025-02-08>
+
   nix = {
-    package = pkgs.lix;
+    package = pkgs.lixPackageSets.latest.lix;
 
     # Disable nix channels  (this is a remnant of old days)
     channel.enable = false;
 
     registry = {
-      nixpkgs.flake = nixpkgs_as_input;
+      nixpkgs.flake = self.inputs.nixpkgs;
       n.flake =
-        nixpkgs_as_input
+        self.inputs.nixpkgs
         // {
           # Otherwise nixpkgs's config and overlays are not available:
 
@@ -25,7 +35,7 @@
           legacyPackages."${system}" = pkgs;
         };
 
-      t.flake = templates;
+      t.flake = externalDependencies.templates;
 
       my_flake.flake = self;
       m.flake = self;
@@ -52,7 +62,7 @@
 
       fallback = true; # Build from source, if binary can't be substituted
 
-      keep-failed = true; # keep failed tmp build dirs
+      keep-failed = false; # keep failed tmp build dirs
       pure-eval = true; # restrict file system and network access to hash
 
       sandbox-fallback = false; # Don't disable the sandbox, if the kernel doesn't support it
diff --git a/modules/by-name/ni/nixos-shell/module.nix b/modules/by-name/ni/nixos-shell/module.nix
new file mode 100644
index 00000000..219f080d
--- /dev/null
+++ b/modules/by-name/ni/nixos-shell/module.nix
@@ -0,0 +1,128 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Jörg Thalheim and contributors
+# SPDX-License-Identifier: MIT
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  lib,
+  config,
+  pkgs,
+  self,
+  ...
+}: let
+  cfg = config.soispha.nixos-shell;
+in {
+  options.soispha.nixos-shell = {
+    enable = lib.mkEnableOption "nixos-shell";
+
+    user_name = lib.mkOption {
+      type = lib.types.str;
+      default = "soispha";
+      description = "The user to auto-login into the vm.";
+    };
+
+    configuration = {
+      specialArgs = lib.mkOption {
+        type = lib.types.attrsOf lib.types.anything;
+        default = {};
+        description = ''
+          The arguments to pass to the `specialArgs` attribute set.
+        '';
+      };
+      value = lib.mkOption {
+        type = lib.types.deferredModule;
+        default = {};
+        description = ''
+          Additional NixOS configuration to load into the VM's config.
+        '';
+      };
+    };
+
+    mounts = lib.mkOption {
+      type = lib.types.attrsOf (lib.types.submodule ({config, ...}: {
+        options = {
+          target = lib.mkOption {
+            type = lib.types.path;
+            description = "Target on the guest.";
+          };
+
+          cache_mode = lib.mkOption {
+            type = lib.types.enum ["none" "loose" "fscache" "mmap"];
+            default = "loose"; # bad idea? Well, at least it is fast!1!!
+            description = "9p caching policy";
+          };
+
+          readOnly =
+            (lib.mkEnableOption "mount this disk in read-only mode")
+            // {
+              default = true;
+            };
+
+          tag = lib.mkOption {
+            type = lib.types.str;
+            internal = true;
+          };
+        };
+
+        config.tag = lib.mkDefault (
+          builtins.substring 0 31 ( # tags must be shorter than 32 bytes
+            "a"
+            + # tags must not begin with a digit
+            builtins.hashString "md5" config._module.args.name
+          )
+        );
+      }));
+      default = {};
+      description = ''
+        Extra paths to make available in the vm.
+        These will be mounted ro to their `target.`
+      '';
+    };
+  };
+
+  config = let
+    vmSystem = self.inputs.nixpkgs.lib.nixosSystem {
+      inherit (cfg.configuration) specialArgs;
+
+      modules = [
+        {
+          # TODO(@bpeetz): This should be bumped each release. <2025-05-17>
+          system.stateVersion = "25.05";
+        }
+
+        cfg.configuration.value
+
+        (import ./shell_setup.nix {inherit cfg;})
+      ];
+    };
+
+    nixos-shell = pkgs.writeShellApplication {
+      name = "nixos-shell";
+      text = builtins.readFile ./nixos-shell.sh;
+
+      # We need to keep the PATH, as we otherwise can't pass it along.
+      inheritPath = true;
+
+      runtimeInputs = [
+        vmSystem.config.system.build.vm
+        pkgs.mktemp
+        pkgs.coreutils
+        pkgs.moreutils # for sponge
+      ];
+      runtimeEnv = {
+        HOST_NAME = vmSystem.config.system.name;
+      };
+    };
+  in
+    lib.mkIf cfg.enable {
+      environment.systemPackages = [
+        nixos-shell
+      ];
+
+      system.build.nixos-shell = vmSystem.config.system.build.vm;
+    };
+}
diff --git a/modules/by-name/ni/nixos-shell/nixos-shell.sh b/modules/by-name/ni/nixos-shell/nixos-shell.sh
new file mode 100755
index 00000000..390e60b1
--- /dev/null
+++ b/modules/by-name/ni/nixos-shell/nixos-shell.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env dash
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Jörg Thalheim and contributors
+# SPDX-License-Identifier: MIT
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+SHARED_DIR="$(mktemp --directory)"
+cleanup() {
+    rm --recursive "$SHARED_DIR"
+}
+trap cleanup EXIT
+export SHARED_DIR
+
+TMPDIR="$SHARED_DIR"
+export TMPDIR
+
+cat <<EOF >"$SHARED_DIR/.env_variables"
+{
+    "pwd": "$PWD",
+    "term": "$TERM",
+    "path": "$PATH"
+}
+EOF
+
+mk_tag() {
+    additional_path="$1"
+
+    # tags must be shorter than 32 bytes
+    # and must not begin with a digit.
+    {
+        printf "a"
+        echo "$additional_path" | sha256sum | head -c 30
+    }
+}
+
+for raw_additional_path in "$@"; do
+    additional_path="$(realpath "$raw_additional_path")"
+    tag="$(mk_tag "$additional_path")"
+
+    if [ "$(jq --arg mount "$tag" '.mount.[$mount]' "$SHARED_DIR/.env_variables")" != "null" ]; then
+        echo "Path '$additional_path' alread added."
+        shift 1
+        continue
+    fi
+
+    jq --arg mount "$tag" --arg target "$additional_path" \
+        '. + {mount: {$mount: $target}}' "$SHARED_DIR/.env_variables" | sponge "$SHARED_DIR/.env_variables"
+
+    set -- "$@" -virtfs "local,path=$additional_path,security_model=none,readonly=on,mount_tag=$tag"
+    shift 1
+done
+
+# Do not exec here, as we don't want to lose our cleanup hooks.
+"run-$HOST_NAME-vm" "$@"
diff --git a/modules/by-name/ni/nixos-shell/shell_setup.nix b/modules/by-name/ni/nixos-shell/shell_setup.nix
new file mode 100644
index 00000000..75af0678
--- /dev/null
+++ b/modules/by-name/ni/nixos-shell/shell_setup.nix
@@ -0,0 +1,191 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Jörg Thalheim and contributors
+# SPDX-License-Identifier: MIT
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+# This file contains the code that is used to setup the VM shell.
+{cfg}: {
+  lib,
+  config,
+  pkgs,
+  modulesPath,
+  ...
+}: let
+  mkVMDefault = lib.mkOverride 970;
+
+  env_file = "/tmp/shared/.env_variables";
+in {
+  imports = [
+    (modulesPath + "/profiles/qemu-guest.nix")
+    (modulesPath + "/virtualisation/qemu-vm.nix")
+  ];
+
+  config = {
+    assertions = [
+      {
+        assertion = builtins.elem cfg.user_name (lib.mapAttrsToList (name: value: name) config.users.users);
+        message = ''
+          Your user ${cfg.user_name} is not a recorded user in `config.users.users`.
+          Auto-login will not work.
+        '';
+      }
+    ];
+
+    # Lock root login.
+    users.users.root.hashedPassword = "";
+
+    # Remove unneeded clutter.
+    system.switch.enable = false;
+
+    virtualisation = {
+      # See https://wiki.qemu.org/Documentation/9psetup#Performance_Considerations.
+      # It is effectively a balance between ram and IO speed.
+      msize = let
+        kib = x: x * 1024;
+      in
+        mkVMDefault (kib 512);
+
+      graphics = mkVMDefault false;
+      memorySize = mkVMDefault 1700; # in MB
+      cores = mkVMDefault 16;
+
+      # Do not persist this VM.
+      diskImage = mkVMDefault null;
+
+      fileSystems =
+        lib.mapAttrs'
+        (_: mount: {
+          name = mount.target;
+
+          value = {
+            device = mount.tag;
+            fsType = "9p";
+            options =
+              [
+                "trans=virtio"
+                "version=9p2000.L"
+                "cache=${mount.cache_mode}"
+                "msize=${toString config.virtualisation.msize}"
+              ]
+              ++ lib.optionals mount.readOnly ["ro"];
+          };
+        })
+        cfg.mounts;
+
+      qemu = {
+        consoles = lib.mkIf (!config.virtualisation.graphics) ["tty0" "hvc0"];
+
+        options = let
+          mkMount = options: "-virtfs " + (builtins.concatStringsSep "," options);
+        in
+          lib.optionals (!config.virtualisation.graphics) [
+            "-serial null"
+            "-device virtio-serial"
+            "-chardev stdio,mux=on,id=char0,signal=off"
+            "-mon chardev=char0,mode=readline"
+            "-device virtconsole,chardev=char0,nr=0"
+          ]
+          ++ (lib.mapAttrsToList
+            (hostPath: mount:
+              mkMount [
+                "local"
+                "path=${builtins.toString hostPath}"
+                "security_model=none"
+                "readonly=on"
+                "mount_tag=${mount.tag}"
+              ])
+            cfg.mounts);
+      };
+    };
+
+    services = {
+      getty.helpLine = ''
+        If you are connect via serial console:
+        Type Ctrl-a c to switch to the qemu console
+        and `quit` to stop the VM.
+      '';
+
+      getty.autologinUser = cfg.user_name;
+    };
+
+    system.activationScripts = {
+      mountAdditionalPaths =
+        # bash
+        ''
+          PATH="${pkgs.jq}/bin:${pkgs.util-linux}/bin:$PATH"
+          export PATH
+
+          max_index="$(jq '.mount | keys | length' --raw-output ${env_file})"
+          index=0
+
+          mount --mkdir --type=tmpfs none "/.rw" --options=rw,relatime,mode=0755
+          while [ "$index" -lt "$max_index" ]; do
+            what="$(jq --argjson index "$index" '.mount | keys | map(.)[$index]' --raw-output ${env_file})"
+            where="$(jq --argjson index "$index" '.mount | map(.)[$index]' --raw-output ${env_file})"
+
+            mkdir "/.rw/$what"
+            mount --mkdir "$what" "/.ro/$what" \
+              --type=9p \
+              --options=ro,trans=virtio,version=9p2000.L,msize=${toString config.virtualisation.msize},x-systemd.requires=modprobe@9pnet_virtio.service
+
+            mkdir "/.rw/work-$what"
+            mount --mkdir --type=overlay overlay \
+              --options=rw,relatime,lowerdir="/.ro/$what",upperdir="/.rw/$what",workdir="/.rw/work-$what",uuid=on \
+              "/.ov/$what"
+
+            index="$((index + 1))"
+          done
+        '';
+    };
+
+    systemd.services.mountAdditionalPaths = {
+      after = ["local-fs.target"];
+      wantedBy = ["multi-user.target"];
+      path = [pkgs.jq];
+      script =
+        # bash
+        ''
+          max_index="$(jq '.mount | keys | length' --raw-output ${env_file})"
+          index=0
+
+          while [ "$index" -lt "$max_index" ]; do
+            what="$(jq --argjson index "$index" '.mount | keys | map(.)[$index]' --raw-output ${env_file})"
+            where="$(jq --argjson index "$index" '.mount | map(.)[$index]' --raw-output ${env_file})"
+
+            systemd-mount --type none "/.ov/$what" "$where" --options=bind
+
+            # HACK(@bpeetz): Nearly all of the paths are in $HOME anyways. So simply avoid
+            # the permission issue.
+            # Ideally, we would pass the original owners along with the mount. <2025-05-17>
+            chown --recursive soispha:users "/home/soispha"
+
+            index="$((index + 1))"
+          done
+        '';
+    };
+
+    environment = {
+      systemPackages = [
+        pkgs.jq
+      ];
+
+      sessionVariables = {
+        IN_NIXOS_SHELL = "true";
+      };
+
+      loginShellInit =
+        # bash
+        ''
+          cd "$(jq '.pwd' --raw-output ${env_file})"
+          export TERM="$(jq '.term' --raw-output ${env_file})"
+          export PATH="$(jq '.path' --raw-output ${env_file}):$PATH"
+        '';
+    };
+
+    networking.firewall.enable = mkVMDefault true;
+  };
+}
diff --git a/modules/by-name/ni/nixpkgs/config.nix b/modules/by-name/ni/nixpkgs/config.nix
index 1a24444d..ea8f3c45 100644
--- a/modules/by-name/ni/nixpkgs/config.nix
+++ b/modules/by-name/ni/nixpkgs/config.nix
@@ -1,10 +1,19 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   cfg,
-  myPkgs,
   lib,
+  packageSets,
   ...
 }: let
-  myPkgsOverlay = self: super: myPkgs;
+  myPkgsOverlay = self: super: packageSets.soispha;
 in {
   nixpkgs = {
     hostPlatform = cfg.systemName;
@@ -22,6 +31,12 @@ in {
       allowUnfreePredicate = pkg:
         builtins.elem (lib.getName pkg) [
           "pypemicro" # required by pynitrokey
+
+          # TODO(@bpeetz): Allow moving them to their respective module. <2025-04-25>
+          "steam"
+          "steam-unwrapped"
+          "steam-original"
+          "steam-run"
         ];
     };
   };
diff --git a/modules/by-name/ni/nixpkgs/module.nix b/modules/by-name/ni/nixpkgs/module.nix
index eda3ac89..fcde9505 100644
--- a/modules/by-name/ni/nixpkgs/module.nix
+++ b/modules/by-name/ni/nixpkgs/module.nix
@@ -1,8 +1,18 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
+  packageSets,
   ...
-} @ args: let
+}: let
   cfg = config.soispha.nixpkgs;
 in {
   options.soispha.nixpkgs = {
@@ -13,5 +23,35 @@ in {
       type = lib.types.str;
     };
   };
-  config = lib.mkIf cfg.enable (import ./config.nix (args // {inherit cfg;}));
+  config = let
+    myPkgsOverlay = self: super: packageSets.soispha;
+  in
+    lib.mkIf cfg.enable
+    {
+      nixpkgs = {
+        hostPlatform = cfg.systemName;
+
+        overlays = [
+          myPkgsOverlay
+        ];
+
+        config = {
+          # TODO: this fails because of the root tempsize, which should be increased
+          # contentAddressedByDefault = true;
+
+          hostSystem = cfg.systemName;
+
+          allowUnfreePredicate = pkg:
+            builtins.elem (lib.getName pkg) [
+              "pypemicro" # required by pynitrokey
+
+              # TODO(@bpeetz): Allow moving them to their respective module. <2025-04-25>
+              "steam"
+              "steam-unwrapped"
+              "steam-original"
+              "steam-run"
+            ];
+        };
+      };
+    };
 }
diff --git a/modules/by-name/nv/nvim/autocmds/default.nix b/modules/by-name/nv/nvim/autocmds/default.nix
index 54fd6831..706f1bbd 100644
--- a/modules/by-name/nv/nvim/autocmds/default.nix
+++ b/modules/by-name/nv/nvim/autocmds/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/clipboard/default.nix b/modules/by-name/nv/nvim/clipboard/default.nix
index 4cc3bd8a..f6348e44 100644
--- a/modules/by-name/nv/nvim/clipboard/default.nix
+++ b/modules/by-name/nv/nvim/clipboard/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/mappings/default.nix b/modules/by-name/nv/nvim/mappings/default.nix
index 4b6344c2..4997f66c 100644
--- a/modules/by-name/nv/nvim/mappings/default.nix
+++ b/modules/by-name/nv/nvim/mappings/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -18,34 +27,6 @@ in {
           action = "<cmd>noh<CR><Esc>";
           options.desc = "Disable the search highlighting and send Escape";
         }
-        {
-          key = "hh";
-          mode = ["i"];
-          action.__raw = ''
-            function()
-              local cmp = require('cmp');
-              local luasnip = require('luasnip');
-
-              if cmp.visible() then
-                  cmp.select_next_item()
-              elseif luasnip.expand_or_locally_jumpable() then
-                  luasnip.expand_or_jump()
-              end
-            end
-          '';
-          options.desc = "completion trigger/ forward in completen menu";
-        }
-        {
-          key = "uu";
-          mode = ["i"];
-          action.__raw = ''
-            function()
-              local cmp = require('cmp');
-              cmp.confirm()
-            end
-          '';
-          options.desc = "confirm the selected item";
-        }
 
         {
           key = "<C-Tab>";
diff --git a/modules/by-name/nv/nvim/module.nix b/modules/by-name/nv/nvim/module.nix
index 69e417bb..819646d6 100644
--- a/modules/by-name/nv/nvim/module.nix
+++ b/modules/by-name/nv/nvim/module.nix
@@ -1,7 +1,17 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
   config,
+  modules,
   ...
 }: let
   cfg = config.soispha.programs.nvim;
@@ -24,6 +34,10 @@ in {
 
   config = lib.mkIf cfg.enable {
     home-manager.users.soispha = {
+      imports = [
+        modules.nixvim.homeManagerModules.nixvim
+      ];
+
       home.sessionVariables = {
         EDITOR = "nvim";
         VISUAL = "nvim";
@@ -32,6 +46,9 @@ in {
       programs.nixvim = {
         enable = true;
 
+        # Use my global nixpkgs set, instead of constructing a separate one.
+        nixpkgs.useGlobalPackages = true;
+
         # source: https://www.patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=Neovim
         extraConfigLuaPre = lib.mkBefore ''
           ---------------------------------------------------------------------------
diff --git a/modules/by-name/nv/nvim/options/default.nix b/modules/by-name/nv/nvim/options/default.nix
index be475b13..301f0ac0 100644
--- a/modules/by-name/nv/nvim/options/default.nix
+++ b/modules/by-name/nv/nvim/options/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -23,7 +32,6 @@ in {
 
     confirm = true; # confirm to save changes before closing modified buffer
     colorcolumn = "+1"; # show a +1 before the 'textwidth'
-    completeopt = ["menuone" "noselect"]; # have a better completion experience
 
     # https://www.compart.com/en/unicode/U+XXXX (unicode character code)
     fillchars = {
diff --git a/modules/by-name/nv/nvim/plgs/colorscheme/default.nix b/modules/by-name/nv/nvim/plgs/colorscheme/default.nix
index ebc26826..f8cd5892 100644
--- a/modules/by-name/nv/nvim/plgs/colorscheme/default.nix
+++ b/modules/by-name/nv/nvim/plgs/colorscheme/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/colorscheme/lua/mk_todos_readable.lua b/modules/by-name/nv/nvim/plgs/colorscheme/lua/mk_todos_readable.lua
index d02171b5..44c76084 100644
--- a/modules/by-name/nv/nvim/plgs/colorscheme/lua/mk_todos_readable.lua
+++ b/modules/by-name/nv/nvim/plgs/colorscheme/lua/mk_todos_readable.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 local opts = { bg = "NONE", bold = true }
 
 ---@param hl_group string: The name of the hl group
diff --git a/modules/by-name/nv/nvim/plgs/colorscheme/lua/nightfox.lua b/modules/by-name/nv/nvim/plgs/colorscheme/lua/nightfox.lua
index 4c502153..38f6f0a1 100644
--- a/modules/by-name/nv/nvim/plgs/colorscheme/lua/nightfox.lua
+++ b/modules/by-name/nv/nvim/plgs/colorscheme/lua/nightfox.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 require("nightfox").setup({
   options = {
     -- Compiled file's destination location
diff --git a/modules/by-name/nv/nvim/plgs/comment-nvim/default.nix b/modules/by-name/nv/nvim/plgs/comment-nvim/default.nix
index bd70c5c2..b404843e 100644
--- a/modules/by-name/nv/nvim/plgs/comment-nvim/default.nix
+++ b/modules/by-name/nv/nvim/plgs/comment-nvim/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/debugprint/default.nix b/modules/by-name/nv/nvim/plgs/debugprint/default.nix
index 4a3af1c5..79e557bd 100644
--- a/modules/by-name/nv/nvim/plgs/debugprint/default.nix
+++ b/modules/by-name/nv/nvim/plgs/debugprint/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua b/modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua
index da7e1735..b934d619 100644
--- a/modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua
+++ b/modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 require("debugprint").setup({
   create_keymaps = false,
 })
diff --git a/modules/by-name/nv/nvim/plgs/default.nix b/modules/by-name/nv/nvim/plgs/default.nix
index 991bc315..aaebb3b1 100644
--- a/modules/by-name/nv/nvim/plgs/default.nix
+++ b/modules/by-name/nv/nvim/plgs/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   imports =
     [
diff --git a/modules/by-name/nv/nvim/plgs/femaco/default.nix b/modules/by-name/nv/nvim/plgs/femaco/default.nix
index adf0ba63..a30bb59f 100644
--- a/modules/by-name/nv/nvim/plgs/femaco/default.nix
+++ b/modules/by-name/nv/nvim/plgs/femaco/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua b/modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua
index c113e4c7..1371a825 100644
--- a/modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua
+++ b/modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 local clip_val = require("femaco.utils").clip_val
 require("femaco").setup({
   -- should prepare a new buffer and return the winid
diff --git a/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix b/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix
index c1ace4ac..8d61d859 100644
--- a/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix
+++ b/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
@@ -6,7 +15,8 @@
 }: let
   cfg = config.soispha.programs.nvim;
 in {
-  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
+  # TODO: Get this plugin working again <2025-01-29>
+  home-manager.users.soispha.programs.nixvim = lib.mkIf false {
     # TODO: package flatten-nvim though a module
 
     extraConfigLuaPre = ''
diff --git a/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua b/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua
index 2cdbcdde..0c86cd27 100644
--- a/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua
+++ b/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 ---Types:
 --
 -- Passed to callbacks that handle opening files
diff --git a/modules/by-name/nv/nvim/plgs/goto-preview/default.nix b/modules/by-name/nv/nvim/plgs/goto-preview/default.nix
index 5c56fe8c..93761dfd 100644
--- a/modules/by-name/nv/nvim/plgs/goto-preview/default.nix
+++ b/modules/by-name/nv/nvim/plgs/goto-preview/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/goto-preview/lua/goto-preview.lua b/modules/by-name/nv/nvim/plgs/goto-preview/lua/goto-preview.lua
index 9687a5a0..ad285033 100644
--- a/modules/by-name/nv/nvim/plgs/goto-preview/lua/goto-preview.lua
+++ b/modules/by-name/nv/nvim/plgs/goto-preview/lua/goto-preview.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 require("goto-preview").setup({
   width = 120, -- Width of the floating window
   height = 15, -- Height of the floating window
diff --git a/modules/by-name/nv/nvim/plgs/harpoon/default.nix b/modules/by-name/nv/nvim/plgs/harpoon/default.nix
index 05a40d9f..c85c7c80 100644
--- a/modules/by-name/nv/nvim/plgs/harpoon/default.nix
+++ b/modules/by-name/nv/nvim/plgs/harpoon/default.nix
@@ -1,100 +1,53 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
-  pkgs,
-  config,
   lib,
+  config,
   ...
 }: let
-  numbers = ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"];
-  mkNumberedCommand = {
-    command_template,
-    prefix,
-    number,
-    desc_template,
-  }: {
-    key = "${prefix}${number}";
-    action.__raw = ''
-      function()
-        ${command_template number}
-      end
-    '';
-    options.desc = "${desc_template number}";
-  };
-  mkGotoTerminalCommand = number: let
-    desc_template = number: "Goto terminal number ${number}";
-    command_template = number: ''require("harpoon.term").gotoTerminal(${number})'';
-    prefix = "gt";
-  in
-    mkNumberedCommand {inherit desc_template command_template prefix number;};
-  mkGotoFileCommand = number: let
-    desc_template = number: "Goto Buffer number ${number}";
-    command_template = number: ''require("harpoon.ui").nav_file(${number})'';
-    prefix = "gf";
-  in
-    mkNumberedCommand {inherit desc_template command_template prefix number;};
-
-  gotoTerminalMappings = builtins.map mkGotoTerminalCommand numbers;
-  gotoFileMappings = builtins.map mkGotoFileCommand numbers;
   cfg = config.soispha.programs.nvim;
 in {
   home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    plugins.harpoon = {
-      enable = true;
-      package = pkgs.vimPlugins.harpoon;
-      enableTelescope = true;
-      # menu.width = "vim.api.nvim_win_get_width(0) - 4"; # TODO: integrate that
-      keymaps = {
-        tmuxGotoTerminal = null; # TODO:
-      };
-    };
+    plugins.harpoon.enable = true;
+
     keymaps =
-      [
-        {
-          key = "-";
-          action.__raw = ''
+      lib.mapAttrsToList
+      (key: action: {
+        mode = "n";
+        inherit key;
+        action.__raw = builtins.elemAt action 0;
+        options.silent = true;
+        options.desc = builtins.elemAt action 1;
+      })
+      {
+        # add current file
+        "<leader><leader>" = [
+          # lua
+          ''
             function()
-              require("harpoon.ui").nav_next()
-             end
-          '';
-          options.desc = "go to the next marked file";
-        }
-        {
-          key = "_";
-          action.__raw = ''
-            function()
-              require("harpoon.ui").nav_prev()
-             end
-          '';
-          options.desc = "go to the previous marked file";
-        }
-        {
-          key = "<leader><leader>";
-          action.__raw = ''
-            function()
-              require("harpoon.mark").add_file()
-            end
-          '';
-          options.desc = "add a mark to the open file in harpoon.";
-        }
-        {
-          key = "gqc";
-          action.__raw = ''
-            function()
-              require("harpoon.cmd-ui").toggle_quick_menu()
+              require("harpoon"):list():add()
             end
-          '';
-          options.desc = "toggle the harpoon command quick menu to see all commands.";
-        }
-        {
-          key = "<leader>q";
-          action.__raw = ''
+          ''
+          "Add a mark to the open file in harpoon."
+        ];
+
+        # open menu
+        "<leader>q" = [
+          # lua
+          ''
             function()
-              require("harpoon.ui").toggle_quick_menu()
+                require("harpoon").ui:toggle_quick_menu(require("harpoon"):list())
             end
-          '';
-          options.desc = "toggle the harpoon normal quick menu to see all marks.";
-        }
-      ]
-      ++ gotoFileMappings
-      ++ gotoTerminalMappings;
+          ''
+          "Toggle the harpoon normal quick menu to see all marks."
+        ];
+      };
   };
 }
diff --git a/modules/by-name/nv/nvim/plgs/leap/default.nix b/modules/by-name/nv/nvim/plgs/leap/default.nix
index 57e78879..e5c42d2f 100644
--- a/modules/by-name/nv/nvim/plgs/leap/default.nix
+++ b/modules/by-name/nv/nvim/plgs/leap/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lf-nvim/default.nix b/modules/by-name/nv/nvim/plgs/lf-nvim/default.nix
index 5e2836b0..3a1c6bf9 100644
--- a/modules/by-name/nv/nvim/plgs/lf-nvim/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lf-nvim/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
@@ -6,16 +15,14 @@
 }: let
   cfg = config.soispha.programs.nvim;
 in {
+  # TODO: package lf-nvim though a module
+  # TODO: change the nvim path, when I change the path with lf
   home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    # TODO: package lf-nvim though a module
-    # FIXME: change the nvim path, when I change the path with lf
     extraConfigLuaPost = ''
       ${lib.strings.fileContents ./lua/lf-nvim.lua}
     '';
     extraPlugins = [
-      pkgs.vimExtraPlugins.lf-nvim
-
-      pkgs.vimPlugins.toggleterm-nvim # required by lf-nvim
+      pkgs.vimPlugins.lf-nvim
     ];
   };
 }
diff --git a/modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua b/modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua
index 1eadf375..8c40ab50 100644
--- a/modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua
+++ b/modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 local fn = vim.fn
 
 -- Defaults
diff --git a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix
index 1a2fb6eb..85458310 100644
--- a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua
index 5a2cff26..2886d821 100644
--- a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua
+++ b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 --- @type table<string, any>
 require("lsp-progress").setup({
   -- Spinning icons.
diff --git a/modules/by-name/nv/nvim/plgs/lsp/default.nix b/modules/by-name/nv/nvim/plgs/lsp/default.nix
index d97f2f0a..27a6f909 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/keymaps/default.nix b/modules/by-name/nv/nvim/plgs/lsp/keymaps/default.nix
index 903e8c17..7cc9f6d5 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/keymaps/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/keymaps/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/default.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/default.nix
index 605046d4..8ff130fe 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   imports = [
     # ./servers/pylyzer.nix
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/bashls.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/bashls.nix
index 5a37e133..8d2b0d03 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/bashls.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/bashls.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ccls.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ccls.nix
index 9f3195fa..eed7f349 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ccls.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ccls.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ltex.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ltex.nix
index 03b7d4c1..e55cf377 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ltex.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ltex.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/lua-ls.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/lua-ls.nix
index 39e4b989..9350cd37 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/lua-ls.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/lua-ls.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/nil-ls.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/nil-ls.nix
index 94ca99ce..3b7e2523 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/nil-ls.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/nil-ls.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix
index 94f7b067..fba1113f 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/pylyzer.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/pylyzer.nix
index 3ac66102..47e8de7a 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/pylyzer.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/pylyzer.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix
index 48a3a71c..82d3b5a9 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix
index 57cb8366..4f9834ee 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/rust-analyzer.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/rust-analyzer.nix
index 093f5250..fd344c50 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/rust-analyzer.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/rust-analyzer.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/texlab.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/texlab.nix
index 1fe3c764..5f001177 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/texlab.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/texlab.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/lspkind/default.nix b/modules/by-name/nv/nvim/plgs/lspkind/default.nix
index 078d607d..6e966ad1 100644
--- a/modules/by-name/nv/nvim/plgs/lspkind/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lspkind/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/ltex_extra/default.nix b/modules/by-name/nv/nvim/plgs/ltex_extra/default.nix
index c37a7591..a01d5653 100644
--- a/modules/by-name/nv/nvim/plgs/ltex_extra/default.nix
+++ b/modules/by-name/nv/nvim/plgs/ltex_extra/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/ltex_extra/lua/ltex_extra.lua b/modules/by-name/nv/nvim/plgs/ltex_extra/lua/ltex_extra.lua
index d532428a..883b22c4 100644
--- a/modules/by-name/nv/nvim/plgs/ltex_extra/lua/ltex_extra.lua
+++ b/modules/by-name/nv/nvim/plgs/ltex_extra/lua/ltex_extra.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 require("ltex_extra").setup({
   -- table <string> : languages for witch dictionaries will be loaded, e.g. { "es-AR", "en-US" }
   -- https://valentjn.github.io/ltex/supported-languages.html#natural-languages
diff --git a/modules/by-name/nv/nvim/plgs/lualine/default.nix b/modules/by-name/nv/nvim/plgs/lualine/default.nix
index 2f3bb552..7a69519b 100644
--- a/modules/by-name/nv/nvim/plgs/lualine/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lualine/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/default.nix b/modules/by-name/nv/nvim/plgs/luasnip/default.nix
index f67c9899..222b5070 100644
--- a/modules/by-name/nv/nvim/plgs/luasnip/default.nix
+++ b/modules/by-name/nv/nvim/plgs/luasnip/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
@@ -7,14 +16,81 @@
   cfg = config.soispha.programs.nvim;
 in {
   home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
+    keymaps = [
+      {
+        key = "<C-K>";
+        mode = ["i"];
+        action.__raw = ''
+          function()
+            require('luasnip').expand()
+          end
+        '';
+        options = {
+          # silent = true;
+          desc = "Expand the snippet";
+        };
+      }
+      {
+        key = "<C-L>";
+        mode = ["i" "s"];
+        action.__raw = ''
+          function()
+            require('luasnip').jump(1)
+          end
+        '';
+        options = {
+          # silent = true;
+          desc = "Jump forward in snippet insert nodes";
+        };
+      }
+      {
+        key = "<C-J>";
+        mode = ["i" "s"];
+        action.__raw = ''
+          function()
+            require('luasnip').jump(-1)
+          end
+        '';
+        options = {
+          # silent = true;
+          desc = "Jump backwards in snippet insert nodes";
+        };
+      }
+      {
+        key = "<C-E>";
+        mode = ["i" "s"];
+        action.__raw = ''
+          function()
+            if require('luasnip').choice_active() then
+              require('luasnip').change_choice(1)
+            end
+          end
+        '';
+        options = {
+          # silent = true;
+          desc = "Cycle through the snippets choice nodes";
+        };
+      }
+    ];
     plugins.luasnip = {
       enable = true;
+
+      settings = {
+        # Enable auto triggered snippets.
+        enable_autosnippets = true;
+
+        # Use Tab to trigger visual selection.
+        store_selection_keys = "<Tab>";
+      };
+
+      fromLua = [
+        {
+          paths = ./snippets;
+          lazyLoad = true;
+        }
+      ];
     };
-    extraConfigLuaPost = ''
-      ${lib.strings.fileContents ./lua/luasnip.lua};
-      require("luasnip.loaders.from_lua").load({paths = "${./lua/snippets}"});
-      require("luasnip.loaders.from_lua").lazy_load({paths = "${./lua/snippets}"});
-    '';
+
     extraPlugins = [
       # needed for the todo-comments snippets
       pkgs.vimPlugins.comment-nvim
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/lua/luasnip.lua b/modules/by-name/nv/nvim/plgs/luasnip/lua/luasnip.lua
deleted file mode 100644
index a05fa57f..00000000
--- a/modules/by-name/nv/nvim/plgs/luasnip/lua/luasnip.lua
+++ /dev/null
@@ -1,7 +0,0 @@
-require("luasnip").config.set_config({
-  -- Enable auto triggered snippets
-  enable_autosnippets = true,
-
-  -- Use Tab (or some other key if you prefer) to trigger visual selection
-  store_selection_keys = "<Tab>",
-})
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/all.lua b/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/all.lua
deleted file mode 100644
index 2b923f20..00000000
--- a/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/all.lua
+++ /dev/null
@@ -1,211 +0,0 @@
-local ls = require("luasnip")
--- auto_pairs  {{{
-local get_visual = function(args, parent)
-  if #parent.snippet.env.SELECT_RAW > 0 then
-    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
-  else
-    return sn(nil, i(1, ""))
-  end
-end
-local function char_count_same(c1, c2)
-  local line = vim.api.nvim_get_current_line()
-  -- '%'-escape chars to force explicit match (gsub accepts patterns).
-  -- second return value is number of substitutions.
-  local _, ct1 = string.gsub(line, "%" .. c1, "")
-  local _, ct2 = string.gsub(line, "%" .. c2, "")
-  return ct1 == ct2
-end
-
-local function even_count(c, ...)
-  local line = vim.api.nvim_get_current_line()
-  local _, ct = string.gsub(line, c, "")
-  return ct % 2 == 0
-end
-
--- This makes creation of pair-type snippets easier.
-local function pair(pair_begin, pair_end, file_types, condition_function)
-  -- FIXME(@Soispha): This only works if file_types == nil, otherwise the snippet does not expand.
-  -- It would be nice, if it would support both an empty array (`{}`) and nil <2023-08-27>
-  -- file_types = file_types or {};
-
-  return s(
-    { trig = pair_begin, wordTrig = false, snippetType = "autosnippet" },
-    { t({ pair_begin }), d(1, get_visual), t({ pair_end }) },
-    {
-      condition = function()
-        local filetype_check = true
-        if file_types ~= nil then filetype_check = file_types[vim.bo.filetype] or false end
-        return (not condition_function(pair_begin, pair_end)) and filetype_check
-      end,
-    }
-  )
-end
-
-local auto_pairs = {
-  pair("(", ")", nil, char_count_same),
-  pair("{", "}", nil, char_count_same),
-  pair("[", "]", nil, char_count_same),
-  pair("<", ">", { ["rust"] = true, ["tex"] = true }, char_count_same),
-  pair("'", "'", nil, even_count),
-  pair("\"", "\"", nil, even_count),
-  pair("`", "`", nil, even_count),
-}
-
-ls.add_snippets("all", auto_pairs, { type = "snippets", key = "auto_pairs" })
--- }}}
-
--- todo_comments {{{
-local calculate_comment_string = require("Comment.ft").calculate
-local utils = require("Comment.utils")
-
-local read_git_config = function(config_value)
-  local command = string.format("git config \"%s\"", config_value)
-  local handle = io.popen(command)
-  if handle == nil then return error(string.format("Failed to call `%s`.", command)) end
-  local result = handle:read("*a")
-  handle:close()
-  -- stripped = string.gsub(str, '%s+', '')
-  return string.gsub(result, "\n", "")
-end
-
-local name_to_handle = function(name)
-  -- from: https://stackoverflow.com/a/7615129
-  local split = function(inputstr, sep)
-    local t = {}
-    for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do
-      table.insert(t, str)
-    end
-    return t
-  end
-
-  local parts = split(name, "%s")
-
-  local output_name = ""
-  if #parts > 2 then
-    for _, val in ipairs(parts) do
-      output_name = string.format("%s%s", output_name, val:sub(1, 1))
-    end
-  elseif #parts == 2 then
-    output_name = string.format("%s%s", parts[1]:sub(1, 1), parts[2])
-  elseif #parts == 1 then
-    output_name = parts[1]
-  else
-    -- parts is 0
-    output_name = "<NoName>"
-  end
-  return string.format("@%s", output_name:lower())
-end
-
-_G.luasnip = {}
-_G.luasnip.vars = {
-  username = function() return name_to_handle(read_git_config("user.name")) end,
-  email = function() return read_git_config("user.email") end,
-}
-
---- Get the comment string {beg,end} table
----@param ctype integer 1 for `line`-comment and 2 for `block`-comment
----@return table comment_strings {begcstring, endcstring}
-local get_cstring = function(ctype)
-  -- use the `Comments.nvim` API to fetch the comment string for the region (eq. '--%s' or '--[[%s]]' for `lua`)
-  local cstring = calculate_comment_string({ ctype = ctype, range = utils.get_region() }) or vim.bo.commentstring
-  -- as we want only the strings themselves and not strings ready for using `format` we want to split the left and right side
-  local left, right = utils.unwrap_cstr(cstring)
-  -- create a `{left, right}` table for it
-  return { left, right }
-end
-
---- Options for marks to be used in a TODO comment
----@return table,table: The first table contains a node for the date, the second for the signature
-local marks = {
-  signature = function() return t("(" .. _G.luasnip.vars:username() .. ")"), t("") end,
-  date_signature = function() return t("<" .. os.date("%Y-%m-%d") .. ">"), t("(" .. _G.luasnip.vars:username() .. ")") end,
-  date = function() return t("<" .. os.date("%Y-%m-%d") .. ">"), t("") end,
-  empty = function() return t(""), t("") end,
-}
-
----@param alias string
----@param opts table
----@param mark_function function: This function should return two nodes
----@return table: Returns the comment node
-local todo_snippet_nodes = function(alias, opts, mark_function)
-  local date_node, signature_node = mark_function()
-  -- format them into the actual snippet
-  local comment_node = fmta("<> <><>: <> <> <>", {
-    f(function()
-      return get_cstring(opts.ctype)[1] -- get <comment-string[1]>
-    end),
-    t(alias), -- [name-of-comment]
-    signature_node,
-    i(0), -- {comment-text}
-    date_node,
-    f(function()
-      return get_cstring(opts.ctype)[2] -- get <comment-string[2]>
-    end),
-  })
-  return comment_node
-end
-
---- Generate a TODO comment snippet with an automatic description and docstring
----@param context table merged with the generated context table `trig` must be specified
----@param alias string of aliases for the todo comment (ex.: {FIX, ISSUE, FIXIT, BUG})
----@param opts table merged with the snippet opts table
----@param mark_function function: The function used to get the marks
-local todo_snippet = function(context, alias, opts, mark_function)
-  opts = opts or {}
-  context = context or {}
-  if not context.trig then
-    return error("context doesn't include a `trig` key which is mandatory", 2) -- all we need from the context is the trigger
-  end
-  opts.ctype = opts.ctype or 1 -- comment type can be passed in the `opts` table, but if it is not, we have to ensure, it is defined
-  local alias_string = alias -- `choice_node` documentation
-  context.name = context.name or (alias_string .. " comment") -- generate the `name` of the snippet if not defined
-  context.dscr = context.dscr or (alias_string .. " comment with a signature-mark") -- generate the `dscr` if not defined
-  context.docstring = context.docstring or (" {1:" .. alias_string .. "}: {3} <{2:mark}>{0} ") -- generate the `docstring` if not defined
-  local comment_node = todo_snippet_nodes(alias, opts, mark_function)
-  return s(context, comment_node, opts) -- the final todo-snippet constructed from our parameters
-end
-
----@param context table: The luasnip context
----@param opts table: The luasnip opts table, needs to have a ctype set
----@param aliases string: All aliases for a name
----@param marks table: Possible marks to account in snipped generation
----@return table: All possible snippets build from the marks
-local process_marks = function(context, aliases, opts, marks)
-  local output = {}
-  for mark_name, mark_function in pairs(marks) do
-    local contex_trig_local = context.trig
-    context.trig = context.trig .. "-" .. mark_name
-    output[#output + 1] = todo_snippet(context, aliases, opts, mark_function)
-    context.trig = contex_trig_local
-  end
-  return output
-end
-
-local todo_snippet_specs = {
-  { { trig = "todo" }, { "TODO" }, { ctype = 1 } },
-  { { trig = "fix" }, { "FIXME", "ISSUE" }, { ctype = 1 } },
-  { { trig = "hack" }, { "HACK" }, { ctype = 1 } },
-  { { trig = "warn" }, { "WARNING" }, { ctype = 1 } },
-  { { trig = "perf" }, { "PERFORMANCE", "OPTIMIZE" }, { ctype = 1 } },
-  { { trig = "note" }, { "NOTE", "INFO" }, { ctype = 1 } },
-
-  -- NOTE: Block commented todo-comments
-  { { trig = "todob" }, { "TODO" }, { ctype = 2 } },
-  { { trig = "fixb" }, { "FIXME", "ISSUE" }, { ctype = 2 } },
-  { { trig = "hackb" }, { "HACK" }, { ctype = 2 } },
-  { { trig = "warnb" }, { "WARNING" }, { ctype = 2 } },
-  { { trig = "perfb" }, { "PERF", "PERFORMANCE", "OPTIM", "OPTIMIZE" }, { ctype = 2 } },
-  { { trig = "noteb" }, { "NOTE", "INFO" }, { ctype = 2 } },
-}
-
-local todo_comment_snippets = {}
-for _, v in ipairs(todo_snippet_specs) do
-  local snippets = process_marks(v[1], v[2][1], v[3], marks)
-  for _, value in pairs(snippets) do
-    table.insert(todo_comment_snippets, value)
-  end
-end
-
-ls.add_snippets("all", todo_comment_snippets, { type = "snippets", key = "todo_comments" })
-
--- }}}
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/html/html.lua b/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/html/html.lua
deleted file mode 100644
index 568c97ec..00000000
--- a/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/html/html.lua
+++ /dev/null
@@ -1,102 +0,0 @@
-local get_visual = function(args, parent)
-  if #parent.snippet.env.SELECT_RAW > 0 then
-    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
-  else
-    return sn(nil, i(1))
-  end
-end
-
-local line_begin = require("luasnip.extras.expand_conditions").line_begin
-
-return {
-  -- HEADER
-  s(
-    {
-      trig = "h([123456])",
-      regTrig = true,
-      wordTrig = false,
-      snippetType = "autosnippet",
-    },
-    fmt(
-      [[
-          <h{}>{}</h{}>
-        ]],
-      {
-        f(function(_, snip) return snip.captures[1] end),
-        d(1, get_visual),
-        f(function(_, snip) return snip.captures[1] end),
-      }
-    ),
-    { condition = line_begin }
-  ), -- PARAGRAPH
-  s(
-    { trig = "pp", snippetType = "autosnippet" },
-    fmt(
-      [[
-          <p>{}</p>
-        ]],
-      { d(1, get_visual) }
-    ),
-    { condition = line_begin }
-  ), -- UNORDERED LIST
-  s(
-    { trig = "itt", snippetType = "autosnippet" },
-    fmt(
-      [[
-          <ul>
-            <li>{}</li>{}
-          </ul>
-        ]],
-      { i(1), i(0) }
-    ),
-    { condition = line_begin }
-  ), -- LIST ITEM
-  s(
-    { trig = "ii", snippetType = "autosnippet" },
-    fmt(
-      [[
-            <li>{}</li>
-        ]],
-      { d(1, get_visual) }
-    ),
-    { condition = line_begin }
-  ),
-  -- DOCUMENT TEMPLATE
-  s(
-    { trig = "base" },
-    fmt(
-      [[
-        <!doctype HTML>
-        <html lang="en">
-        <head>
-          <meta charset="UTF-8">
-          <title>{}</title>
-        </head>
-        <body>
-          {}
-        </body>
-        </html>
-        ]],
-      { i(1, "FooBar"), i(0) }
-    ),
-    { condition = line_begin }
-  ), -- ANCHOR TAG
-  s(
-    {
-      trig = "([^%l])aa",
-      regTrig = true,
-      wordTrig = false,
-      snippetType = "autosnippet",
-    },
-    fmt(
-      [[
-          {}<a href="{}">{}</a>
-        ]],
-      {
-        f(function(_, snip) return snip.captures[1] end),
-        i(1),
-        d(2, get_visual),
-      }
-    )
-  ),
-}
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua b/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua
deleted file mode 100644
index ef453973..00000000
--- a/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/tex/delimiter.lua
+++ /dev/null
@@ -1,28 +0,0 @@
-local get_visual = function(args, parent)
-  if #parent.snippet.env.SELECT_RAW > 0 then
-    return sn(nil, i(1, parent.snippet.env.SELECT_RAW))
-  else
-    return sn(nil, i(1, ""))
-  end
-end
-
-local translation_table = { ["("] = ")", ["{"] = "}", ["["] = "]" }
-
--- Return snippet tables
-return {
-  -- LEFT/RIGHT ALL BRACES
-  s(
-    {
-      trig = "([^%a])l([%(%[%{])",
-      regTrig = true,
-      wordTrig = false,
-      snippetType = "autosnippet",
-    },
-    fmta("<>\\left<><>\\right<>", {
-      f(function(_, snip) return snip.captures[1] end),
-      f(function(_, snip) return snip.captures[2] end),
-      d(1, get_visual),
-      f(function(_, snip) return translation_table[snip.captures[2]] end),
-    })
-  ),
-}
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/tex/greek.lua b/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/tex/greek.lua
deleted file mode 100644
index ebf4f9d7..00000000
--- a/modules/by-name/nv/nvim/plgs/luasnip/lua/snippets/tex/greek.lua
+++ /dev/null
@@ -1,37 +0,0 @@
--- Return snippet tables
-return {
-  s({ trig = ";a", snippetType = "autosnippet" }, { t("\\alpha") }),
-  s({ trig = ";b", snippetType = "autosnippet" }, { t("\\beta") }),
-  s({ trig = ";g", snippetType = "autosnippet" }, { t("\\gamma") }),
-  s({ trig = ";G", snippetType = "autosnippet" }, { t("\\Gamma") }),
-  s({ trig = ";d", snippetType = "autosnippet" }, { t("\\delta") }),
-  s({ trig = ";D", snippetType = "autosnippet" }, { t("\\Delta") }),
-  s({ trig = ";e", snippetType = "autosnippet" }, { t("\\epsilon") }),
-  s({ trig = ";ve", snippetType = "autosnippet" }, { t("\\varepsilon") }),
-  s({ trig = ";z", snippetType = "autosnippet" }, { t("\\zeta") }),
-  s({ trig = ";h", snippetType = "autosnippet" }, { t("\\eta") }),
-  s({ trig = ";o", snippetType = "autosnippet" }, { t("\\theta") }),
-  s({ trig = ";vo", snippetType = "autosnippet" }, { t("\\vartheta") }),
-  s({ trig = ";O", snippetType = "autosnippet" }, { t("\\Theta") }),
-  s({ trig = ";k", snippetType = "autosnippet" }, { t("\\kappa") }),
-  s({ trig = ";l", snippetType = "autosnippet" }, { t("\\lambda") }),
-  s({ trig = ";L", snippetType = "autosnippet" }, { t("\\Lambda") }),
-  s({ trig = ";m", snippetType = "autosnippet" }, { t("\\mu") }),
-  s({ trig = ";n", snippetType = "autosnippet" }, { t("\\nu") }),
-  s({ trig = ";x", snippetType = "autosnippet" }, { t("\\xi") }),
-  s({ trig = ";X", snippetType = "autosnippet" }, { t("\\Xi") }),
-  s({ trig = ";i", snippetType = "autosnippet" }, { t("\\pi") }),
-  s({ trig = ";I", snippetType = "autosnippet" }, { t("\\Pi") }),
-  s({ trig = ";r", snippetType = "autosnippet" }, { t("\\rho") }),
-  s({ trig = ";s", snippetType = "autosnippet" }, { t("\\sigma") }),
-  s({ trig = ";S", snippetType = "autosnippet" }, { t("\\Sigma") }),
-  s({ trig = ";t", snippetType = "autosnippet" }, { t("\\tau") }),
-  s({ trig = ";f", snippetType = "autosnippet" }, { t("\\phi") }),
-  s({ trig = ";vf", snippetType = "autosnippet" }, { t("\\varphi") }),
-  s({ trig = ";F", snippetType = "autosnippet" }, { t("\\Phi") }),
-  s({ trig = ";c", snippetType = "autosnippet" }, { t("\\chi") }),
-  s({ trig = ";p", snippetType = "autosnippet" }, { t("\\psi") }),
-  s({ trig = ";P", snippetType = "autosnippet" }, { t("\\Psi") }),
-  s({ trig = ";w", snippetType = "autosnippet" }, { t("\\omega") }),
-  s({ trig = ";W", snippetType = "autosnippet" }, { t("\\Omega") }),
-}
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/snippets/all.lua b/modules/by-name/nv/nvim/plgs/luasnip/snippets/all.lua
new file mode 100644
index 00000000..371f5539
--- /dev/null
+++ b/modules/by-name/nv/nvim/plgs/luasnip/snippets/all.lua
@@ -0,0 +1,338 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+local ls = require("luasnip")
+local fmt = require("luasnip.extras.fmt").fmt
+
+--- Get the comment string {begin,end} table
+---
+---@param comment_type integer 1 for `line`-comment and 2 for `block`-comment
+---@return table comment_strings {["begin"]=begin_comment_string, ["end"]=end_comment_string}
+local get_comment_string = function(comment_type)
+  local calculate_comment_string = require("Comment.ft").calculate
+  local utils = require("Comment.utils")
+
+  -- use the `Comments.nvim` API to fetch the comment string for the region (eq. '--%s' or '--[[%s]]' for `lua`)
+  local cstring =
+    calculate_comment_string({ ctype = comment_type; range = utils.get_region(); })
+
+  if cstring == nil then
+    -- TODO: Use `vim.bo.commentstring` <2025-05-02>
+
+    -- Use some useful default values.
+    return { ["begin"] = "#"; ["end"] = ""; }
+  end
+
+  -- as we want only the strings themselves and not strings ready for using `format` we want to split the left and right side
+  local left, right = utils.unwrap_cstr(cstring)
+
+  -- create a `{left, right}` table for it
+  return { ["begin"] = left; ["end"] = right; }
+end
+
+--- Wraps a table of snippet nodes in two comment function nodes.
+---
+---@param comment_type integer 1 for `line`-comment and 2 for `block`-comment
+---@param nodes table The nodes that should be wrapped
+---@return table wrapped_nodes The now wrapped `nodes` table.
+local wrap_snippet_in_comments = function(comment_type, nodes)
+  local output = {}
+
+  table.insert(output, ls.function_node(function()
+    return get_comment_string(comment_type)["begin"]
+  end))
+
+
+  for _, v in ipairs(nodes) do
+    table.insert(output, v)
+  end
+
+  table.insert(output, ls.function_node(function()
+    return get_comment_string(comment_type)["end"]
+  end))
+
+  return output
+end
+
+-- auto_pairs  {{{
+local get_visual = function(_, parent)
+  if #parent.snippet.env.SELECT_RAW > 0 then
+    return ls.snippet_node(nil, ls.insert_node(1, parent.snippet.env.SELECT_RAW))
+  else
+    return ls.snippet_node(nil, ls.insert_node(1, ""))
+  end
+end
+
+local function char_count_same(c1, c2)
+  local line = vim.api.nvim_get_current_line()
+  -- '%'-escape chars to force explicit match (gsub accepts patterns).
+  -- second return value is number of substitutions.
+  local _, ct1 = string.gsub(line, "%" .. c1, "")
+  local _, ct2 = string.gsub(line, "%" .. c2, "")
+  return ct1 == ct2
+end
+
+local function even_count(c, ...)
+  local line = vim.api.nvim_get_current_line()
+  local _, ct = string.gsub(line, c, "")
+  return ct % 2 == 0
+end
+
+-- This makes creation of pair-type snippets easier.
+local function pair(pair_begin, pair_end, file_types, condition_function)
+  -- FIXME(@Soispha): This only works if file_types == nil, otherwise the snippet does not expand.
+  -- It would be nice, if it would support both an empty array (`{}`) and nil <2023-08-27>
+  -- file_types = file_types or {};
+
+  return ls.snippet(
+    {
+      trig = pair_begin;
+      wordTrig = false;
+      snippetType = "autosnippet";
+    },
+    {
+      ls.text_node({ pair_begin; });
+      ls.dynamic_node(1, get_visual);
+      ls.text_node({ pair_end; });
+    },
+    {
+      condition = function()
+        local filetype_check = true
+
+        if file_types ~= nil then
+          filetype_check = file_types[vim.bo.filetype] or false
+        end
+
+        return (not condition_function(pair_begin, pair_end)) and filetype_check
+      end;
+    }
+  )
+end
+
+local auto_pairs = {
+  pair("(", ")", nil, char_count_same);
+  pair("{", "}", nil, char_count_same);
+  pair("[", "]", nil, char_count_same);
+  pair("<", ">", { ["rust"] = true; ["tex"] = true; }, char_count_same);
+  pair("'", "'", nil, even_count);
+  pair("\"", "\"", nil, even_count);
+  pair("`", "`", nil, even_count);
+}
+
+ls.add_snippets("all", auto_pairs, { type = "snippets"; key = "auto_pairs"; })
+-- }}}
+
+-- todo_comments {{{
+local read_git_config = function(config_value)
+  local command = string.format("git config \"%s\"", config_value)
+
+  local handle = io.popen(command)
+  if handle == nil then
+    return error(string.format("Failed to call `%s`.", command))
+  end
+
+  local result = handle:read("*a")
+  handle:close()
+
+  -- stripped = string.gsub(str, '%s+', '')
+  return string.gsub(result, "\n", "")
+end
+
+--- Create a @handle from a full name.
+---
+--- Example:
+--- “Benedikt Peetz” -> “@bpeetz”
+local handle_from_name = function(name)
+  -- from: https://stackoverflow.com/a/7615129
+  local split = function(inputstr, sep)
+    local t = {}
+    for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do
+      table.insert(t, str)
+    end
+    return t
+  end
+
+  -- Split on spaces
+  local parts = split(name, "%s")
+
+  local output_name = ""
+
+  if #parts > 2 then
+    -- Only use the first chars.
+    --
+    -- Example:
+    -- “Richard Matthew Stallman” -> “rms”
+    for _, val in ipairs(parts) do
+      output_name = string.format("%s%s", output_name, val:sub(1, 1))
+    end
+  elseif #parts == 2 then
+    output_name = string.format("%s%s", parts[1]:sub(1, 1), parts[2])
+  elseif #parts == 1 then
+    output_name = parts[1]
+  elseif #parts == 0 then
+    output_name = "<NoName>"
+  end
+
+  return string.format("@%s", output_name:lower())
+end
+
+--- Generate a comment snippet
+---
+---@param trig string The trigger
+---@param name string name for the comment (ex.: {FIX, ISSUE, FIXIT, BUG})
+---@param comment_type integer The comment type.
+---@param mark_function function: The function used to get the marks
+local todo_snippet = function(trig, name, comment_type, mark_function)
+  assert(trig, "context doesn't include a `trig` key which is mandatory")
+  assert(comment_type == 1 or comment_type == 2)
+
+  local context = {}
+  context.name = name .. " comment"
+  context.trig = trig
+
+  local date_node, signature_node = mark_function()
+
+  local nodes = fmt("{} {}{}: {} {} {}", wrap_snippet_in_comments(comment_type, {
+    ls.text_node(name);
+    signature_node;
+    ls.insert_node(1, "content");
+    date_node;
+  }))
+
+  return ls.snippet(context, nodes, { ctype = comment_type; })
+end
+
+---@param trigger string: The luasnip trigger
+---@param comment_type integer: The luasnip comment type
+---@param name string: All aliases for a name
+---@return table: All possible snippets build from the marks
+local process_marks = function(trigger, name, comment_type)
+  local username = function()
+    return handle_from_name(read_git_config("user.name"))
+  end
+
+  local marks = {
+    signature = function()
+      return ls.text_node("(" .. username() .. ")"), ls.text_node("")
+    end;
+
+    date_signature = function()
+      return ls.text_node("<" .. os.date("%Y-%m-%d") .. ">"), ls.text_node("(" .. username() .. ")")
+    end;
+
+    date = function()
+      return ls.text_node("<" .. os.date("%Y-%m-%d") .. ">"), ls.text_node("")
+    end;
+
+    empty = function()
+      return ls.text_node(""), ls.text_node("")
+    end;
+  }
+
+  local output = {}
+  for mark_name, mark_function in pairs(marks) do
+    local trig = trigger .. "-" .. mark_name
+
+    output[#output + 1] = todo_snippet(trig, name, comment_type, mark_function)
+  end
+
+  return output
+end
+
+local todo_snippet_specs = {
+  { { trig = "todo"; };  { "TODO"; };                                     { ctype = 1; }; };
+  { { trig = "fix"; };   { "FIXME"; "ISSUE"; };                           { ctype = 1; }; };
+  { { trig = "hack"; };  { "HACK"; };                                     { ctype = 1; }; };
+  { { trig = "warn"; };  { "WARNING"; };                                  { ctype = 1; }; };
+  { { trig = "perf"; };  { "PERFORMANCE"; "OPTIMIZE"; };                  { ctype = 1; }; };
+  { { trig = "note"; };  { "NOTE"; "INFO"; };                             { ctype = 1; }; };
+
+  -- NOTE: Block commented todo-comments
+  { { trig = "todob"; }; { "TODO"; };                                     { ctype = 2; }; };
+  { { trig = "fixb"; };  { "FIXME"; "ISSUE"; };                           { ctype = 2; }; };
+  { { trig = "hackb"; }; { "HACK"; };                                     { ctype = 2; }; };
+  { { trig = "warnb"; }; { "WARNING"; };                                  { ctype = 2; }; };
+  { { trig = "perfb"; }; { "PERF"; "PERFORMANCE"; "OPTIM"; "OPTIMIZE"; }; { ctype = 2; }; };
+  { { trig = "noteb"; }; { "NOTE"; "INFO"; };                             { ctype = 2; }; };
+}
+
+local todo_comment_snippets = {}
+for _, v in ipairs(todo_snippet_specs) do
+  local snippets = process_marks(v[1].trig, v[2][1], v[3].ctype)
+  for _, value in pairs(snippets) do
+    table.insert(todo_comment_snippets, value)
+  end
+end
+
+ls.add_snippets("all", todo_comment_snippets, { type = "snippets"; key = "todo_comments"; })
+-- }}}
+
+-- spdx snippets {{{
+local generate_spdx_snippet = function(comment_type, spdx_license_expr, trigger)
+  assert(trigger, "context doesn't include a `trig` key which is mandatory")
+  assert(comment_type == 1 or comment_type == 2)
+
+  local context = {}
+  context.name = trigger .. " spdx snippet expr"
+  context.trig = trigger
+
+
+  local nodes = {
+    fmt("{} SPDX-SnippetBegin {}", wrap_snippet_in_comments(comment_type, {}));
+
+    fmt("{} SPDX-SnippetCopyrightText: {} {} <{}> {}",
+        wrap_snippet_in_comments(comment_type, {
+          ls.insert_node(1, "year");
+          ls.insert_node(2, "author");
+          ls.insert_node(3, "email");
+        })
+    );
+
+    fmt("{} SPDX-License-Identifier: {} {}", wrap_snippet_in_comments(comment_type, {
+      ls.text_node(spdx_license_expr);
+    }));
+
+    { ls.insert_node(4, "content"); };
+
+    fmt("{} SPDX-SnippetEnd {}", wrap_snippet_in_comments(comment_type, {}));
+
+    { ls.insert_node(0); };
+  }
+
+  local newline_nodes = {}
+  for _, sub_nodes in ipairs(nodes) do
+    for _, node in ipairs(sub_nodes) do
+      table.insert(newline_nodes, node)
+    end
+
+    -- luasnip requires newlines to be encoded like this:
+    table.insert(newline_nodes, ls.text_node({ ""; ""; }))
+  end
+
+  return ls.snippet(context, newline_nodes, { ctype = comment_type; })
+end
+
+local spdx = {
+  { trigger = "spdx-AGPL3+"; license = "AGPL-3.0-or-later"; };
+  { trigger = "spdx-GPL3+";  license = "GPL-3.0-or-later"; };
+  { trigger = "spdx-MIT";    license = "MIT"; };
+}
+
+local spdx_snippets = {}
+for _, value in ipairs(spdx) do
+  local snippet = generate_spdx_snippet(1, value.license, value.trigger)
+  table.insert(spdx_snippets, snippet)
+
+  snippet = generate_spdx_snippet(2, value.license, value.trigger .. "-block")
+  table.insert(spdx_snippets, snippet)
+end
+
+ls.add_snippets("all", spdx_snippets, { type = "snippets"; key = "spdx_snippets"; })
+-- }}}
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/snippets/tex/delimiter.lua b/modules/by-name/nv/nvim/plgs/luasnip/snippets/tex/delimiter.lua
new file mode 100644
index 00000000..bcd128f7
--- /dev/null
+++ b/modules/by-name/nv/nvim/plgs/luasnip/snippets/tex/delimiter.lua
@@ -0,0 +1,41 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+local ls = require("luasnip")
+local fmt = require("luasnip.extras.fmt").fmt
+
+local get_visual = function(_, parent)
+  if #parent.snippet.env.SELECT_RAW > 0 then
+    return ls.snippet_node(nil, ls.insert_node(1, parent.snippet.env.SELECT_RAW))
+  else
+    return ls.snippet_node(nil, ls.insert_node(1, ""))
+  end
+end
+
+local translation_table = { ["("] = ")"; ["{"] = "}"; ["["] = "]"; }
+
+-- Return snippet tables
+return {
+  -- LEFT/RIGHT ALL BRACES
+  ls.snippet(
+    {
+      trig = "([^%a])l([%(%[%{])";
+      regTrig = true;
+      wordTrig = false;
+      snippetType = "autosnippet";
+    },
+    fmt("{}\\left{}{}\\right{}", {
+      ls.function_node(function(_, snip) return snip.captures[1] end);
+      ls.function_node(function(_, snip) return snip.captures[2] end);
+      ls.dynamic_node(1, get_visual);
+      ls.function_node(function(_, snip) return translation_table[snip.captures[2]] end);
+    })
+  );
+}
diff --git a/modules/by-name/nv/nvim/plgs/luasnip/snippets/tex/greek.lua b/modules/by-name/nv/nvim/plgs/luasnip/snippets/tex/greek.lua
new file mode 100644
index 00000000..21aa7414
--- /dev/null
+++ b/modules/by-name/nv/nvim/plgs/luasnip/snippets/tex/greek.lua
@@ -0,0 +1,49 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+local ls = require("luasnip")
+
+-- Return snippet tables
+return {
+  ls.snippet({ trig = ";a"; snippetType = "autosnippet"; }, { ls.text_node("\\alpha"); });
+  ls.snippet({ trig = ";b"; snippetType = "autosnippet"; }, { ls.text_node("\\beta"); });
+  ls.snippet({ trig = ";g"; snippetType = "autosnippet"; }, { ls.text_node("\\gamma"); });
+  ls.snippet({ trig = ";G"; snippetType = "autosnippet"; }, { ls.text_node("\\Gamma"); });
+  ls.snippet({ trig = ";d"; snippetType = "autosnippet"; }, { ls.text_node("\\delta"); });
+  ls.snippet({ trig = ";D"; snippetType = "autosnippet"; }, { ls.text_node("\\Delta"); });
+  ls.snippet({ trig = ";e"; snippetType = "autosnippet"; }, { ls.text_node("\\epsilon"); });
+  ls.snippet({ trig = ";ve"; snippetType = "autosnippet"; }, { ls.text_node("\\varepsilon"); });
+  ls.snippet({ trig = ";z"; snippetType = "autosnippet"; }, { ls.text_node("\\zeta"); });
+  ls.snippet({ trig = ";h"; snippetType = "autosnippet"; }, { ls.text_node("\\eta"); });
+  ls.snippet({ trig = ";o"; snippetType = "autosnippet"; }, { ls.text_node("\\theta"); });
+  ls.snippet({ trig = ";vo"; snippetType = "autosnippet"; }, { ls.text_node("\\vartheta"); });
+  ls.snippet({ trig = ";O"; snippetType = "autosnippet"; }, { ls.text_node("\\Theta"); });
+  ls.snippet({ trig = ";k"; snippetType = "autosnippet"; }, { ls.text_node("\\kappa"); });
+  ls.snippet({ trig = ";l"; snippetType = "autosnippet"; }, { ls.text_node("\\lambda"); });
+  ls.snippet({ trig = ";L"; snippetType = "autosnippet"; }, { ls.text_node("\\Lambda"); });
+  ls.snippet({ trig = ";m"; snippetType = "autosnippet"; }, { ls.text_node("\\mu"); });
+  ls.snippet({ trig = ";n"; snippetType = "autosnippet"; }, { ls.text_node("\\nu"); });
+  ls.snippet({ trig = ";x"; snippetType = "autosnippet"; }, { ls.text_node("\\xi"); });
+  ls.snippet({ trig = ";X"; snippetType = "autosnippet"; }, { ls.text_node("\\Xi"); });
+  ls.snippet({ trig = ";i"; snippetType = "autosnippet"; }, { ls.text_node("\\pi"); });
+  ls.snippet({ trig = ";I"; snippetType = "autosnippet"; }, { ls.text_node("\\Pi"); });
+  ls.snippet({ trig = ";r"; snippetType = "autosnippet"; }, { ls.text_node("\\rho"); });
+  ls.snippet({ trig = ";s"; snippetType = "autosnippet"; }, { ls.text_node("\\sigma"); });
+  ls.snippet({ trig = ";S"; snippetType = "autosnippet"; }, { ls.text_node("\\Sigma"); });
+  ls.snippet({ trig = ";t"; snippetType = "autosnippet"; }, { ls.text_node("\\tau"); });
+  ls.snippet({ trig = ";f"; snippetType = "autosnippet"; }, { ls.text_node("\\phi"); });
+  ls.snippet({ trig = ";vf"; snippetType = "autosnippet"; }, { ls.text_node("\\varphi"); });
+  ls.snippet({ trig = ";F"; snippetType = "autosnippet"; }, { ls.text_node("\\Phi"); });
+  ls.snippet({ trig = ";c"; snippetType = "autosnippet"; }, { ls.text_node("\\chi"); });
+  ls.snippet({ trig = ";p"; snippetType = "autosnippet"; }, { ls.text_node("\\psi"); });
+  ls.snippet({ trig = ";P"; snippetType = "autosnippet"; }, { ls.text_node("\\Psi"); });
+  ls.snippet({ trig = ";w"; snippetType = "autosnippet"; }, { ls.text_node("\\omega"); });
+  ls.snippet({ trig = ";W"; snippetType = "autosnippet"; }, { ls.text_node("\\Omega"); });
+}
diff --git a/modules/by-name/nv/nvim/plgs/neorg/default.nix b/modules/by-name/nv/nvim/plgs/neorg/default.nix
index 03afb16c..ea451d3a 100644
--- a/modules/by-name/nv/nvim/plgs/neorg/default.nix
+++ b/modules/by-name/nv/nvim/plgs/neorg/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -44,11 +53,7 @@ in {
               __empty = null;
             };
             "core.dirman".config = {
-              workspaces = {
-                general = "~/repos/notes/general";
-                journal = "~/repos/notes/journal";
-                projects = "~/repos/notes/projects";
-              };
+              workspaces = { };
             };
             "core.export".config = {
               __empty = null;
diff --git a/modules/by-name/nv/nvim/plgs/neorg/key_mappings.lua b/modules/by-name/nv/nvim/plgs/neorg/key_mappings.lua
index e2ebb653..5391bf0b 100644
--- a/modules/by-name/nv/nvim/plgs/neorg/key_mappings.lua
+++ b/modules/by-name/nv/nvim/plgs/neorg/key_mappings.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 -- Override some of my default key mappings to better integrate into neorg.
 -- They still to the same conceptual thing.
 
diff --git a/modules/by-name/nv/nvim/plgs/nvim-cmp/default.nix b/modules/by-name/nv/nvim/plgs/nvim-cmp/default.nix
index 8d61dbd7..315f3fc7 100644
--- a/modules/by-name/nv/nvim/plgs/nvim-cmp/default.nix
+++ b/modules/by-name/nv/nvim/plgs/nvim-cmp/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -5,49 +14,82 @@
 }: let
   cfg = config.soispha.programs.nvim;
 in {
-  home-manager.users.soispha.programs.nixvim.plugins.cmp = lib.mkIf cfg.enable {
-    /*
-    TODO: integrate this:
-    ```lua
-      enabled = {
-      function()
-          -- disable completion in comments
-          local context = require 'cmp.config.context'
-          -- keep command mode completion enabled when cursor is in a comment
-          -- te
-          if vim.api.nvim_get_mode().mode == 'c' then
-              return true
-          else
-              return not context.in_treesitter_capture("comment")
-                  and not context.in_syntax_group("Comment")
+  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
+    opts.completeopt = [
+      "menu" # Show completions in a menu
+      "menuone" # Also open menu, when only one completion exists
+      "noselect" # Do not pre select one of the completions
+    ];
+
+    keymaps = [
+      {
+        key = "hh";
+        mode = ["i"];
+        action.__raw = ''
+          function()
+            require('cmp').select_next_item()
           end
-      end
-      },
-    ```
-    */
-    enable = true;
-    autoEnableSources = true;
-    settings = {
-      mapping = {
-        # TODO: add support for desc and which key here
-        "<C-d>" = "cmp.mapping.scroll_docs(-4)"; # desc = "Scroll up by four lines"
-        "<C-f>" = "cmp.mapping.scroll_docs(4)"; # desc = "Scroll down by four lines"
-        "HH" = "cmp.mapping.complete()"; # desc = "Confirm snipped"
-      };
+        '';
+        options.desc = "go forward in completion menu";
+      }
+      {
+        key = "uu";
+        mode = ["i"];
+        action.__raw = ''
+          function()
+            require('cmp').confirm()
+          end
+        '';
+        options.desc = "confirm the selected item";
+      }
+
+      {
+        key = "<C-d>";
+        mode = ["i"];
+        action.__raw = ''
+          function()
+            require('cmp').mapping.scroll_docs(-4)
+          end
+        '';
+        options.desc = "Scroll up by four lines";
+      }
+      {
+        key = "<C-f>";
+        mode = ["i"];
+        action.__raw = ''
+          function()
+            require('cmp').mapping.scroll_docs(4)
+          end
+        '';
+        options.desc = "Scroll down by four lines";
+      }
+    ];
+
+    plugins.cmp = {
+      enable = true;
+      autoEnableSources = true;
 
-      snippet.expand = "function(args) require('luasnip').lsp_expand(args.body) end";
+      settings = {
+        mapping = {};
 
-      sources = [
-        {name = "nvim_lsp";}
-        {name = "luasnip";}
-        {name = "path";}
-        {name = "git";} # TODO: I might want to add config to allow all issues/prs <2023-10-16>
-        # {name = "convertionalcommits";} # TODO: Useless without commitlint [https://commitlint.js.org/] <2023-10-16>
-        # {name = "rg";} # TODO: This might really RIP-grep my system <2023-10-16>
-        # {name = "buffer";}
-        # {name = "digraphs";}
-        {name = "calc";}
-      ];
+        snippet.expand.__raw = ''
+          function(args)
+            require('luasnip').lsp_expand(args.body)
+          end
+        '';
+
+        sources = [
+          {name = "nvim_lsp";}
+          {name = "luasnip";}
+          {name = "path";}
+          {name = "git";} # TODO: I might want to add config to allow all issues/prs <2023-10-16>
+          # {name = "convertionalcommits";} # TODO: Useless without commitlint [https://commitlint.js.org/] <2023-10-16>
+          # {name = "rg";} # TODO: This might really RIP-grep my system <2023-10-16>
+          # {name = "buffer";}
+          # {name = "digraphs";}
+          {name = "calc";}
+        ];
+      };
     };
   };
 }
diff --git a/modules/by-name/nv/nvim/plgs/nvim-lint/default.nix b/modules/by-name/nv/nvim/plgs/nvim-lint/default.nix
index ee057a9b..90e81832 100644
--- a/modules/by-name/nv/nvim/plgs/nvim-lint/default.nix
+++ b/modules/by-name/nv/nvim/plgs/nvim-lint/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/nvim-lint/lua/nvim-lint.lua b/modules/by-name/nv/nvim/plgs/nvim-lint/lua/nvim-lint.lua
index 770c3bb5..5b5fd4b8 100644
--- a/modules/by-name/nv/nvim/plgs/nvim-lint/lua/nvim-lint.lua
+++ b/modules/by-name/nv/nvim/plgs/nvim-lint/lua/nvim-lint.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 require("lint").linters_by_ft = {
   -- text
   markdown = {},
diff --git a/modules/by-name/nv/nvim/plgs/raw_plugins/default.nix b/modules/by-name/nv/nvim/plgs/raw_plugins/default.nix
index e5d401a0..c981ee08 100644
--- a/modules/by-name/nv/nvim/plgs/raw_plugins/default.nix
+++ b/modules/by-name/nv/nvim/plgs/raw_plugins/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/telescope/default.nix b/modules/by-name/nv/nvim/plgs/telescope/default.nix
index 193ee1ac..b2c66edc 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/telescope/defaults/default.nix b/modules/by-name/nv/nvim/plgs/telescope/defaults/default.nix
index 11d04304..7cfe9698 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/defaults/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/defaults/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/default.nix b/modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/default.nix
index 818aa18e..693db974 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/default.nix
@@ -1,32 +1,36 @@
-{
-  pkgs,
-  config,
-  lib,
-  ...
-}: let
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{config, ...}: let
   cfg = config.soispha.programs.nvim;
 in {
-  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    extraPlugins = [
-      pkgs.vimExtraPlugins.telescope-bibtex-nvim
-    ];
-
-    # Only activate this in tex files.
-    # TODO: Why? <2024-11-23>
-    extraFiles = {
-      "ftplugin/tex.lua".text = ''
-        ${lib.strings.fileContents ./tex.lua}
-      '';
-    };
-
-    keymaps = [
-      {
-        key = "<space>ib";
-        # This is registered in the ftplugin file, so we set this to null here
-        action = "<Nop>";
-        mode = "n";
-        options.desc = "[i]nsert a [b]atex citation";
-      }
-    ];
-  };
+  # TODO: Re-enable this, once the plugin is merged into nixpkgs <2025-03-29>
+  # home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
+  #   extraPlugins = [
+  #     pkgs.vimExtraPlugins.telescope-bibtex-nvim
+  #   ];
+  #
+  #   # Only activate this in tex files.
+  #   extraFiles = {
+  #     "ftplugin/tex.lua".text = ''
+  #       ${lib.strings.fileContents ./tex.lua}
+  #     '';
+  #   };
+  #
+  #   keymaps = [
+  #     {
+  #       key = "<space>ib";
+  #       # This is registered in the ftplugin file, so we set this to null here
+  #       action = "<Nop>";
+  #       mode = "n";
+  #       options.desc = "[i]nsert a [b]atex citation";
+  #     }
+  #   ];
+  # };
 }
diff --git a/modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/tex.lua b/modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/tex.lua
index 4107a7c5..fbe7c993 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/tex.lua
+++ b/modules/by-name/nv/nvim/plgs/telescope/extensions/bibtex/tex.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 -- local used = false;
 -- vim.keymap.set('n', '<leader>t', function()
 --     used = not used;
diff --git a/modules/by-name/nv/nvim/plgs/telescope/extensions/default.nix b/modules/by-name/nv/nvim/plgs/telescope/extensions/default.nix
index 0b1e033a..0b0ed0f6 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/extensions/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/extensions/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   imports = [
     ./bibtex
diff --git a/modules/by-name/nv/nvim/plgs/telescope/extensions/frecency/default.nix b/modules/by-name/nv/nvim/plgs/telescope/extensions/frecency/default.nix
index f4e3d116..3d5eae99 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/extensions/frecency/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/extensions/frecency/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/telescope/extensions/fzy-native/default.nix b/modules/by-name/nv/nvim/plgs/telescope/extensions/fzy-native/default.nix
index 4194e688..7a2fc164 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/extensions/fzy-native/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/extensions/fzy-native/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/default.nix b/modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/default.nix
index 6153b063..4d91e988 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua b/modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua
index 48a8588d..b6542429 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua
+++ b/modules/by-name/nv/nvim/plgs/telescope/extensions/rooter/lua/rooter.lua
@@ -1,3 +1,13 @@
+-- nixos-config - My current NixOS configuration
+--
+-- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+-- SPDX-License-Identifier: GPL-3.0-or-later
+--
+-- This file is part of my nixos-config.
+--
+-- You should have received a copy of the License along with this program.
+-- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 -- Taken from: https://github.com/desdic/telescope-rooter.nvim/blob/69423216c75a5f1f1477bbf8faf6b0dc8af04099/lua/telescope/_extensions/rooter.lua
 local has_telescope, telescope = pcall(require, "telescope")
 if not has_telescope then
diff --git a/modules/by-name/nv/nvim/plgs/telescope/extensions/symbols/default.nix b/modules/by-name/nv/nvim/plgs/telescope/extensions/symbols/default.nix
index adbb466a..1f82523d 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/extensions/symbols/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/extensions/symbols/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   config,
diff --git a/modules/by-name/nv/nvim/plgs/telescope/keymaps/default.nix b/modules/by-name/nv/nvim/plgs/telescope/keymaps/default.nix
index a474f097..d5cc55f5 100644
--- a/modules/by-name/nv/nvim/plgs/telescope/keymaps/default.nix
+++ b/modules/by-name/nv/nvim/plgs/telescope/keymaps/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/todo-comments/default.nix b/modules/by-name/nv/nvim/plgs/todo-comments/default.nix
index ddbe367d..cd1a7dbf 100644
--- a/modules/by-name/nv/nvim/plgs/todo-comments/default.nix
+++ b/modules/by-name/nv/nvim/plgs/todo-comments/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/treesitter/default.nix b/modules/by-name/nv/nvim/plgs/treesitter/default.nix
index 02088d0a..c8b48cd1 100644
--- a/modules/by-name/nv/nvim/plgs/treesitter/default.nix
+++ b/modules/by-name/nv/nvim/plgs/treesitter/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   pkgs,
@@ -6,15 +15,17 @@
 }: let
   cfg = config.soispha.programs.nvim;
 in {
-  home-manager.users.soispha.  programs.nixvim = lib.mkIf cfg.enable {
+  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
+    # NOTE: These are required to build grammars, but I already use the nix grammars <2024-07-13>
+    dependencies = {
+      tree-sitter.enable = false;
+      nodejs.enable = false;
+      gcc.enable = false;
+    };
+
     plugins.treesitter = {
       enable = true;
 
-      # NOTE: These are required to build grammars, but I already use the nix grammars <2024-07-13>
-      gccPackage = null;
-      nodejsPackage = null;
-      treesitterPackage = null;
-
       # inject nixvim specific highlighting (eg in extraConfigLua).
       nixvimInjections = true;
 
diff --git a/modules/by-name/nv/nvim/plgs/vim-tex/default.nix b/modules/by-name/nv/nvim/plgs/vim-tex/default.nix
index 680f169a..739b69d9 100644
--- a/modules/by-name/nv/nvim/plgs/vim-tex/default.nix
+++ b/modules/by-name/nv/nvim/plgs/vim-tex/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/nv/nvim/plgs/which-key/default.nix b/modules/by-name/nv/nvim/plgs/which-key/default.nix
index 20004bb1..e5bca546 100644
--- a/modules/by-name/nv/nvim/plgs/which-key/default.nix
+++ b/modules/by-name/nv/nvim/plgs/which-key/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/ol/ollama/module.nix b/modules/by-name/ol/ollama/module.nix
index bd0baaa6..f819c035 100644
--- a/modules/by-name/ol/ollama/module.nix
+++ b/modules/by-name/ol/ollama/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -28,6 +37,16 @@ in {
     services.ollama = {
       enable = true;
       acceleration = false;
+
+      # TODO: This could work for GPU acceleration. <2024-12-20>
+      # acceleration = "rocm";
+      # host = "127.0.0.1";
+      # port = 11434;
+      # environmentVariables = {
+      #   HCC_AMDGPU_TARGET = "gfx1032"; # used to be necessary, but doesn't seem to anymore
+      # };
+      #
+      # rocmOverrideGfx = "10.3.2";
     };
   };
 }
diff --git a/modules/by-name/op/openssh/module.nix b/modules/by-name/op/openssh/module.nix
index b733dbe7..97cf7fd7 100644
--- a/modules/by-name/op/openssh/module.nix
+++ b/modules/by-name/op/openssh/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   services.openssh = {
     enable = true;
diff --git a/modules/by-name/pi/printing/module.nix b/modules/by-name/pi/printing/module.nix
index 85d15b16..cfcd2154 100644
--- a/modules/by-name/pi/printing/module.nix
+++ b/modules/by-name/pi/printing/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/po/polkit/module.nix b/modules/by-name/po/polkit/module.nix
index fb13505b..c6d1c750 100644
--- a/modules/by-name/po/polkit/module.nix
+++ b/modules/by-name/po/polkit/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/po/postgresql/module.nix b/modules/by-name/po/postgresql/module.nix
index 62233e96..5cdf6c77 100644
--- a/modules/by-name/po/postgresql/module.nix
+++ b/modules/by-name/po/postgresql/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/po/power/module.nix b/modules/by-name/po/power/module.nix
index 13013879..3489853c 100644
--- a/modules/by-name/po/power/module.nix
+++ b/modules/by-name/po/power/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/ri/river/init_base.sh b/modules/by-name/ri/river/init_base.sh
new file mode 100755
index 00000000..b68d147b
--- /dev/null
+++ b/modules/by-name/ri/river/init_base.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# NOTE: Keep this in sync with the file from `river-start` <2025-02-03>
+RIVER_LOG_FILE="$HOME/.cache/river/log"
+
+err_fail() {
+    if ! "$@"; then
+        output=""
+        for arg in "$@"; do
+            if [ -z "$output" ]; then
+                output="'$arg'"
+            else
+                output="$output '$arg'"
+            fi
+        done
+        printf "%s failed!\n" "$output" >>"$RIVER_LOG_FILE"
+    fi
+}
+exec 1>>"$RIVER_LOG_FILE"
+exec 2>>"$RIVER_LOG_FILE"
+
+# Start of the generated stuff.
diff --git a/modules/by-name/ri/river/module.nix b/modules/by-name/ri/river/module.nix
index a059da4d..38d4bdef 100644
--- a/modules/by-name/ri/river/module.nix
+++ b/modules/by-name/ri/river/module.nix
@@ -1,21 +1,227 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
-  qmk_firmware,
   system,
+  pkgs,
+  externalBinaries,
   ...
 }: let
   cfg = config.soispha.programs.river;
+  esa = lib.strings.escapeShellArg;
+  riverctl = lib.getExe' pkgs.river "riverctl";
+
+  mkOutputFlags = output: flags: let
+    expandedFlags = builtins.concatStringsSep " " (lib.attrsets.mapAttrsToList (flag: value: "--${esa flag} ${esa value}") flags);
+  in ''
+    err_fail ${lib.getExe pkgs.wlr-randr} --output ${esa output} ${expandedFlags}
+  '';
+  screenSetupCode = builtins.concatStringsSep "" (lib.attrsets.mapAttrsToList mkOutputFlags cfg.init.screenSetupCode);
+
+  mkLrProgram = input: let
+    program = builtins.concatStringsSep " " (
+      if lib.isDerivation input
+      then [(lib.getExe input)]
+      else builtins.map esa input
+    );
+  in "err_fail ${program} &";
+  longRunningPrograms = builtins.concatStringsSep "\n" (builtins.map mkLrProgram cfg.init.backgroundStart);
+
+  keymapFormat = pkgs.formats.json {};
+
+  keymappings = ''
+    err_fail ${riverctl} keyboard-layout ${esa cfg.init.mappings.layout}
+    err_fail ${lib.getExe pkgs.river-mk-keymap} ${keymapFormat.generate "keys.json" cfg.init.mappings.keymap}
+  '';
+
+  mkRule = {
+    app-id,
+    title,
+    action,
+  }: ''
+    err_fail ${riverctl} rule-add -app-id ${esa app-id} -title ${esa title} ${esa action}
+  '';
+  ruleSetup = builtins.concatStringsSep "" (builtins.map mkRule cfg.init.rules);
+
+  mkSetting = name: maybe_values: let
+    rawValues =
+      if builtins.isString maybe_values
+      then [maybe_values]
+      else maybe_values;
+    values = builtins.concatStringsSep " " (builtins.map esa rawValues);
+  in ''
+    err_fail ${riverctl} ${esa name} ${values}
+  '';
+  generalSettings =
+    builtins.concatStringsSep "" (lib.attrsets.mapAttrsToList mkSetting
+      cfg.init.generalSettings);
+
+  mkInput = name: arguments:
+    builtins.concatStringsSep "" (builtins.map (argumentLine: mkSetting "input" ([name] ++ argumentLine)) arguments);
+  inputs =
+    builtins.concatStringsSep "" (lib.attrsets.mapAttrsToList mkInput cfg.init.inputs);
 in {
   options.soispha.programs.river = {
     enable = lib.mkEnableOption "river";
+
     unicodeInput = {
       enable = lib.mkEnableOption "udev rules for rawhid based unicode input";
     };
+
+    init = {
+      mappings = {
+        layout = lib.mkOption {
+          type = lib.types.str;
+          description = "The keymap to use";
+          default = "dvorak-modified";
+        };
+
+        keymap = lib.mkOption {
+          type = lib.types.submodule {
+            freeformType = keymapFormat.type;
+
+            options = {};
+          };
+          default = {};
+
+          description = ''
+            Configuration for river-mk-keymap via `keys.json`.
+          '';
+        };
+      };
+
+      rules = lib.mkOption {
+        type = lib.types.listOf (lib.types.attrsOf lib.types.str);
+        default = [];
+
+        example = ''
+          [
+            {
+              app-id = "*";
+              title = "floating please";
+              action = "float";
+            }
+            {
+              app-id = "*";
+              title = "*";
+              action = "ssd";
+            }
+          ]
+        '';
+
+        description = ''
+          Configuration for river's rules.
+        '';
+      };
+
+      generalSettings = lib.mkOption {
+        type = lib.types.attrsOf (lib.types.either (lib.types.listOf lib.types.str) lib.types.str);
+        description = "Simple key value settings.";
+        default = {};
+        example = ''
+          {
+            background-color = "0x002b36";
+            set-repeat = ["50" "300"];
+            hide-cursor = ["when-typing" "enabled"];
+          }
+        '';
+      };
+
+      inputs = lib.mkOption {
+        type = lib.types.attrsOf (lib.types.listOf (lib.types.listOf lib.types.str));
+        description = "Options to set per input device";
+        default = {};
+        example = ''
+          {
+            pointer-1133-49970-Logitech_Gaming_Mouse_G502 = [["pointer-accel" "0"] ["accel-profile" "none"]];
+            pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I = [["pointer-accel" "0"] ["accel-profile" "none"]];
+          }
+        '';
+      };
+
+      backgroundStart = lib.mkOption {
+        type = lib.types.listOf (lib.types.either lib.types.package (lib.types.listOf lib.types.str));
+        description = "List of programs to start in the background";
+        example = ''
+          [
+            pkgs.gammastep
+          ]
+        '';
+      };
+
+      screenSetupCode = lib.mkOption {
+        type = lib.types.attrsOf (lib.types.attrsOf lib.types.str);
+        default = {};
+        description = ''
+          `wlr-randr` flags to set up outputs. The attribute names are the `--output` keys
+          and the attrs are flag value pairs to setup.
+        '';
+        example = ''
+          {
+            "Virtual-1" = {mode = "1920x1080";};
+            "DP-2" = {pos = "2560,0";};
+            "DP-1" = {scale = "1.5"; pos = "0,0";};
+          }
+        '';
+      };
+    };
   };
 
   config = lib.mkIf cfg.enable {
-    # TODO: Migrate the complete river module <2024-12-30>
-    services.udev.packages = lib.mkIf cfg.unicodeInput.enable [qmk_firmware.packages.${system}.qmk_unicode_type];
+    services.udev.packages = lib.mkIf cfg.unicodeInput.enable [externalBinaries.qmk_firmware.packages.${system}.qmk_unicode_type];
+
+    home-manager.users.soispha = {
+      home.sessionVariables = {
+        WM = "river";
+        XDG_CURRENT_DESKTOP = "river";
+        DESKTOP_SESSION = "river";
+
+        # Export Wayland env Vars {{{
+        QT_QPA_PLATFORM = "wayland";
+        QT_QPA_PLATFORMTHEME = "qt5ct"; # needs qt5ct
+        CLUTTER_BACKEND = "wayland";
+        SDL_VIDEODRIVER = "wayland"; # might brake some things
+        # }}}
+      };
+
+      home.packages = [
+        (pkgs.callPackage ./river-start/package.nix {})
+      ];
+
+      xdg.configFile."river/init" = {
+        executable = true;
+        text = let
+          mkHeading = text: other_stuff: ''
+            # ${text}
+            ${other_stuff}
+          '';
+        in
+          builtins.readFile ./init_base.sh
+          +
+          # bash
+          mkHeading "Environment variables" ''
+            err_fail ${riverctl} spawn "${lib.getExe' pkgs.dbus "dbus-update-activation-environment"} --verbose --systemd SEATD_SOCK DISPLAY WAYLAND_DISPLAY DESKTOP_SESSION=river XDG_CURRENT_DESKTOP=river"
+            export XDG_CURRENT_DESKTOP=river DESKTOP_SESSION=river;
+          ''
+          + mkHeading "Key Mappings" keymappings
+          + mkHeading "Rules" ruleSetup
+          + mkHeading "General Settings" generalSettings
+          + mkHeading "Input Section" inputs
+          + mkHeading "Screen setup code" screenSetupCode
+          + mkHeading "Background services" longRunningPrograms
+          + mkHeading "Layout Setup" ''
+            err_fail ${riverctl} default-layout rivertile
+            ${lib.getExe' pkgs.river "rivertile"} -main-ratio 0.5 -view-padding 1 -outer-padding 0
+          '';
+      };
+    };
   };
 }
diff --git a/modules/by-name/ri/river/river-start/package.nix b/modules/by-name/ri/river/river-start/package.nix
new file mode 100644
index 00000000..10957cc0
--- /dev/null
+++ b/modules/by-name/ri/river/river-start/package.nix
@@ -0,0 +1,23 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  writeShellApplication,
+  river,
+}:
+writeShellApplication {
+  name = "river-start";
+  text = builtins.readFile ./river-start.sh;
+  runtimeInputs = [
+    river
+  ];
+  meta = {
+    mainProgram = "river-start";
+  };
+}
diff --git a/modules/by-name/ri/river/river-start/river-start.sh b/modules/by-name/ri/river/river-start/river-start.sh
new file mode 100755
index 00000000..b4c5b0a6
--- /dev/null
+++ b/modules/by-name/ri/river/river-start/river-start.sh
@@ -0,0 +1,20 @@
+#! /usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# NOTE: Keep this in sync with the file from `base_init.sh` <2025-02-03>
+RIVER_LOG_FILE="$HOME/.cache/river/log"
+
+[ -d "$(dirname "$RIVER_LOG_FILE")" ] || mkdir --parents "$(dirname "$RIVER_LOG_FILE")"
+
+exec river -log-level info >"$RIVER_LOG_FILE" 2>&1
+
+# vim: ft=sh
diff --git a/modules/by-name/sc/scanning/module.nix b/modules/by-name/sc/scanning/module.nix
index dda507fa..30e99bd1 100644
--- a/modules/by-name/sc/scanning/module.nix
+++ b/modules/by-name/sc/scanning/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/se/serverphone/certificates/ca.crt.license b/modules/by-name/se/serverphone/certificates/ca.crt.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/se/serverphone/certificates/ca.crt.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/se/serverphone/certificates/server.crt.license b/modules/by-name/se/serverphone/certificates/server.crt.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/se/serverphone/certificates/server.crt.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/se/serverphone/module.currently_ignored.nix b/modules/by-name/se/serverphone/module.currently_ignored.nix
index aaa818c2..f7280bed 100644
--- a/modules/by-name/se/serverphone/module.currently_ignored.nix
+++ b/modules/by-name/se/serverphone/module.currently_ignored.nix
@@ -1,13 +1,33 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   serverphone,
   system,
   lib,
+  modules,
   ...
-}: {
+}: let
+  cfg = config.soispha.serverphone;
+in {
   # FIXME: Reactive this module, when serverphone is working again <2024-05-11>
 
-  config = lib.mkIf config.soispha.secrets.enable {
+  options.soispha.serverphone = {
+    enable = lib.mkEnableOption "serverphone";
+  };
+
+  imports = [
+    modules.serverphone.nixosModules.default
+  ];
+
+  config = lib.mkIf cfg.enable {
     age.secrets = {
       serverphoneCa = {
         file = ./private_keys/ca.key;
diff --git a/modules/by-name/se/serverphone/private_keys/ca.key.license b/modules/by-name/se/serverphone/private_keys/ca.key.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/se/serverphone/private_keys/ca.key.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/se/serverphone/private_keys/server.key.license b/modules/by-name/se/serverphone/private_keys/server.key.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/se/serverphone/private_keys/server.key.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/sn/snapper/module.nix b/modules/by-name/sn/snapper/module.nix
index bf8201a4..c232a177 100644
--- a/modules/by-name/sn/snapper/module.nix
+++ b/modules/by-name/sn/snapper/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/so/sound/module.nix b/modules/by-name/so/sound/module.nix
index f3120a67..622cc01d 100644
--- a/modules/by-name/so/sound/module.nix
+++ b/modules/by-name/so/sound/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
@@ -10,7 +19,7 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
-    hardware.pulseaudio.enable = false;
+    services.pulseaudio.enable = false;
     security.rtkit.enable = true;
 
     services.pipewire = {
diff --git a/modules/by-name/ss/ssh/module.nix b/modules/by-name/ss/ssh/module.nix
new file mode 100644
index 00000000..91cc4aeb
--- /dev/null
+++ b/modules/by-name/ss/ssh/module.nix
@@ -0,0 +1,55 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.ssh;
+in {
+  options.soispha.programs.ssh = {
+    enable = lib.mkEnableOption "ssh config";
+    rootKnownHosts = lib.mkOption {
+      type = lib.types.attrsOf lib.types.str;
+      description = ''
+        An attrset of keys (the domain) and values (the host key.)
+        These are only applied to the root user.
+      '';
+      default = {};
+      apply = value:
+        builtins.concatStringsSep "\n"
+        (lib.attrsets.mapAttrsToList (hostName: hostKey: "${hostName} ${hostKey}") value);
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users = {
+      root.programs.ssh = {
+        enable = true;
+        compression = true;
+        hashKnownHosts = false;
+        serverAliveInterval = 240;
+        userKnownHostsFile = builtins.toString (pkgs.writeTextFile {
+          name = "root-known-hosts";
+          text = cfg.rootKnownHosts;
+        });
+      };
+
+      soispha.programs.ssh = {
+        enable = true;
+        compression = true;
+        hashKnownHosts = false;
+        serverAliveInterval = 240;
+        userKnownHostsFile = "${config.home-manager.users.soispha.xdg.dataHome}/ssh/known_hosts";
+      };
+    };
+  };
+}
diff --git a/modules/by-name/st/steam/module.nix b/modules/by-name/st/steam/module.nix
index 49149cd7..a02b2e4b 100644
--- a/modules/by-name/st/steam/module.nix
+++ b/modules/by-name/st/steam/module.nix
@@ -1,23 +1,42 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
   pkgs,
   ...
 }: let
-  cfg = config.soispha.services.steam;
+  cfg = config.soispha.programs.steam;
 in {
-  options.soispha.services.steam = {
+  options.soispha.programs.steam = {
     enable = lib.mkEnableOption "Steam";
   };
 
   config = lib.mkIf cfg.enable {
+    nixpkgs.config.allowUnfreePredicate = pkg:
+      builtins.elem (lib.getName pkg) [
+        # NOTE: These are not really applied. Look at
+        # <modules/by-name/ni/nixpkgs/config.nix> instead. <2025-04-25>
+        "steam"
+        "steam-unwrapped"
+        "steam-original"
+        "steam-run"
+      ];
+
     programs.steam = {
       enable = true;
     };
 
     environment.systemPackages = [
       # TODO: Why is this package needed? <2024-05-16>
-      pkgs.wineWowPackages.waylandFull
+      # pkgs.wineWowPackages.waylandFull
     ];
   };
 }
diff --git a/modules/home.legacy/conf/swaylock/GTDcanonical.png b/modules/by-name/sw/swaylock/images/GTDcanonical.png
index ef41d79d..ef41d79d 100644
--- a/modules/home.legacy/conf/swaylock/GTDcanonical.png
+++ b/modules/by-name/sw/swaylock/images/GTDcanonical.png
Binary files differdiff --git a/modules/by-name/sw/swaylock/images/GTDcanonical.png.license b/modules/by-name/sw/swaylock/images/GTDcanonical.png.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/sw/swaylock/images/GTDcanonical.png.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/swaylock/commands.jpg b/modules/by-name/sw/swaylock/images/commands.jpg
index 54016503..54016503 100644
--- a/modules/home.legacy/conf/swaylock/commands.jpg
+++ b/modules/by-name/sw/swaylock/images/commands.jpg
Binary files differdiff --git a/modules/by-name/sw/swaylock/images/commands.jpg.license b/modules/by-name/sw/swaylock/images/commands.jpg.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/sw/swaylock/images/commands.jpg.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/sw/swaylock/images/duwon-lee-tempano-port.jpg b/modules/by-name/sw/swaylock/images/duwon-lee-tempano-port.jpg
new file mode 100644
index 00000000..d72f32d1
--- /dev/null
+++ b/modules/by-name/sw/swaylock/images/duwon-lee-tempano-port.jpg
Binary files differdiff --git a/modules/by-name/sw/swaylock/images/duwon-lee-tempano-port.jpg.license b/modules/by-name/sw/swaylock/images/duwon-lee-tempano-port.jpg.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/sw/swaylock/images/duwon-lee-tempano-port.jpg.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/swaylock/gnu.png b/modules/by-name/sw/swaylock/images/gnu.png
index d07dee3e..d07dee3e 100644
--- a/modules/home.legacy/conf/swaylock/gnu.png
+++ b/modules/by-name/sw/swaylock/images/gnu.png
Binary files differdiff --git a/modules/by-name/sw/swaylock/images/gnu.png.license b/modules/by-name/sw/swaylock/images/gnu.png.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/sw/swaylock/images/gnu.png.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/sw/swaylock/module.nix b/modules/by-name/sw/swaylock/module.nix
index 6cbcef28..ab18f41b 100644
--- a/modules/by-name/sw/swaylock/module.nix
+++ b/modules/by-name/sw/swaylock/module.nix
@@ -1,4 +1,34 @@
-{...}: {
-  # otherwise swaylock can't access the user password.
-  security.pam.services.swaylock = {};
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.programs.swaylock;
+in {
+  options.soispha.programs.swaylock = {
+    enable = lib.mkEnableOption "swaylock";
+  };
+
+  config = lib.mkIf cfg.enable {
+    # otherwise swaylock can't access the user password.
+    security.pam.services.swaylock = {};
+
+    home-manager.users.soispha.programs.swaylock = {
+      enable = true;
+      settings = {
+        image = "${./images/duwon-lee-tempano-port.jpg}";
+        scaling = "stretch";
+        color = "000000";
+      };
+    };
+  };
 }
diff --git a/modules/by-name/sy/system_diff/module.nix b/modules/by-name/sy/system_diff/module.nix
index 052ffae2..cc2ec75c 100644
--- a/modules/by-name/sy/system_diff/module.nix
+++ b/modules/by-name/sy/system_diff/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/ta/taskwarrior/module.nix b/modules/by-name/ta/taskwarrior/module.nix
index 0a942820..bb881768 100644
--- a/modules/by-name/ta/taskwarrior/module.nix
+++ b/modules/by-name/ta/taskwarrior/module.nix
@@ -1,44 +1,173 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
+  pkgs,
   ...
 }: let
   cfg = config.soispha.programs.taskwarrior;
+
+  hooksDir =
+    pkgs.runCommandNoCCLocal "mk-taskwarrior-hooks" {}
+    (''
+        mkdir "$out"
+      ''
+      + (builtins.concatStringsSep "\n"
+        (lib.attrsets.mapAttrsToList
+          (name: value: ''
+            ln --symbolic "${lib.getExe value.executable}" "$out/${value.mode}_${name}"
+          '')
+          cfg.hooks)));
+
+  mkHook = mode: deps: path: {
+    inherit mode;
+
+    executable = pkgs.writeShellApplication {
+      name = "add-hook-${builtins.baseNameOf path}";
+      runtimeInputs = [pkgs.taskwarrior3 pkgs.coreutils pkgs.gnugrep] ++ deps;
+      inheritPath = false;
+      text =
+        # bash
+        ''
+          die() {
+            echo "$@">&2
+            exit 1
+          }
+
+          enable_hook_dbg() {
+              # TODO: We should probably be smarter with the debug detection <2025-04-04>
+              if echo "$2" | grep --quiet 'rc.debug.hooks='; then
+                set -x
+                mkdir --parents "$HOME/.cache/task"
+                exec >>"$HOME/.cache/task/hook.log.$1"
+                exec 2>>"$HOME/.cache/task/hook.log.$1"
+              fi
+          }
+
+          addedCall() {
+           ${builtins.readFile path}
+          }
+
+          ${
+            if mode == "on-modify"
+            then "read -r old_task"
+            else "old_task=NULL"
+          }
+          read -r new_task
+          # We don't change the task, thus immediately return the JSON
+          echo "$new_task"
+
+          enable_hook_dbg "$@"
+          addedCall "$new_task" "$old_task"
+
+          exit 0
+        '';
+    };
+  };
 in {
   options.soispha.programs.taskwarrior = {
-    enable = lib.mkEnableOption "taskwarrior-secrets";
+    enable = lib.mkEnableOption "taskwarrior";
+
+    enableAge = lib.mkEnableOption "taskwarrior with age keys";
+
+    includeFiles = lib.mkOption {
+      type = lib.types.attrsOf lib.types.path;
+      description = "Extra files to include in the taskwarrior config";
+      default = {};
+      apply = value:
+        builtins.concatStringsSep "\n"
+        (builtins.map (path: "include ${path}")
+          (builtins.attrValues value));
+    };
+
+    hooks = lib.mkOption {
+      description = "Map hook names to their values";
+      type = lib.types.attrsOf (lib.types.submodule {
+        options = {
+          mode = lib.mkOption {
+            type = lib.types.enum ["on-add" "on-modify"];
+            description = "The type of the hook";
+          };
+          executable = lib.mkOption {
+            type = lib.types.package;
+            description = "The executable to call.";
+          };
+        };
+      });
+    };
   };
 
-  # HACK: Migrating the whole `taskwarrior` setup is right now unrealistic, as the module is
-  # tightly coupled with the `firefox` module, and `neorg` script.
-  # But to work around the  fact that setting the `age` secrets in the legacy module is
-  # impossible, this module was created as work-around until the `taskwarrior` module can
-  # be fully migrated. <2024-10-18>
-  config = lib.mkIf cfg.enable {
-    age.secrets = {
-      taskserverPrivate = {
-        file = ./secrets/private.key;
-        mode = "700";
-        owner = "soispha";
-        group = "users";
-      };
-      taskserverPublic = {
-        file = ./secrets/public.cert;
-        mode = "700";
-        owner = "soispha";
-        group = "users";
-      };
-      taskserverCA = {
-        file = ./secrets/ca.cert;
-        mode = "700";
-        owner = "soispha";
-        group = "users";
+  config = {
+    lib.taskwarrior = {
+      inherit mkHook;
+    };
+
+    age.secrets.taskwarrior_sync_server_encryption_key = lib.mkIf (cfg.enable && cfg.enableAge) {
+      file = ./secrets/sync_server_encryption_key.age;
+      mode = "700";
+      owner = "soispha";
+      group = "users";
+    };
+
+    soispha.programs.taskwarrior.includeFiles.syncServerSecret = lib.mkIf (cfg.enable && cfg.enableAge) config.age.secrets.taskwarrior_sync_server_encryption_key.path;
+
+    home-manager.users.soispha = lib.mkIf cfg.enable {
+      services.taskwarrior-sync = lib.mkIf cfg.enableAge {
+        enable = true;
+        package = pkgs.taskwarrior3;
       };
-      taskserverCredentials = {
-        file = ./secrets/credentials;
-        mode = "700";
-        owner = "soispha";
-        group = "users";
+
+      programs.taskwarrior = {
+        enable = true;
+        colorTheme = ./nord.theme;
+        package = pkgs.taskwarrior3;
+        extraConfig = cfg.includeFiles;
+
+        config = {
+          complete.all.tags = true;
+          list.all = {
+            projects = true;
+            tags = true;
+          };
+
+          news.version = "3.4.1";
+
+          regex = true;
+          weekstart = "Monday";
+
+          uda = {
+            total_active_time = {
+              type = "duration";
+              label = "Total active time";
+            };
+          };
+
+          sync.server = lib.mkIf cfg.enableAge {
+            client_id = "a3619d43-031f-4f85-848f-5512804f9a1d";
+            url = "https://taskchampion.vhack.eu";
+          };
+
+          alias = {
+            mod = "modify";
+          };
+          color = true;
+
+          hooks.location = "${hooksDir}";
+
+          urgency.uda.priority = {
+            H.coefficient = 6.0;
+            M.coefficient = 0;
+            L.coefficient = -1.8;
+          };
+        };
       };
     };
   };
diff --git a/modules/home.legacy/conf/taskwarrior/nord.theme b/modules/by-name/ta/taskwarrior/nord.theme
index 2897418f..2897418f 100644
--- a/modules/home.legacy/conf/taskwarrior/nord.theme
+++ b/modules/by-name/ta/taskwarrior/nord.theme
diff --git a/modules/by-name/ta/taskwarrior/nord.theme.license b/modules/by-name/ta/taskwarrior/nord.theme.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/ta/taskwarrior/nord.theme.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/ta/taskwarrior/secrets/ca.cert b/modules/by-name/ta/taskwarrior/secrets/ca.cert
deleted file mode 100644
index 81528a2a..00000000
--- a/modules/by-name/ta/taskwarrior/secrets/ca.cert
+++ /dev/null
@@ -1,161 +0,0 @@
------BEGIN AGE ENCRYPTED FILE-----
-YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4dVVkOWlYNjJQSFZYbExM
-bENvUTFzbmdPQ0ljR2V1TlJXYUZFVnNMS3owCjNmaE5pNnZqN0FXRUtFQzZYR0xQ
-NWh0L0NLVDlEeWlvdlB1T2dwRmkybXcKLT4gc3NoLWVkMjU1MTkgelpFb25nIHR3
-TmJzS2Q4WDN4KzVkVXgyMzhiYmdId0wwSzJndmZJQUlzYm9MTW5zR3cKRmswT3RN
-QTR2VjYvVXY4TnJCNEVrY0V1c3FEK3hGMkppeWh0bEUzdEdMRQotPiBzc2gtZWQy
-NTUxOSA3SGZGVXcgY2R5WUVpdlJCVjBxR0lTMmFnY0plV0J4NUFWTk1XWnllbjlt
-OS8xS3FIVQo4MytXd054Rm5neTFsREpWTFdJc2xzLzdDckZ5M2tOelNhakMxanlY
-cTQ4Ci0+IE1Dci1ncmVhc2UgfSYwZlg0YlcKQUlENkdEalVMZ0VzTXFlUHB1Yzhr
-VWZwb1FMZFdtbm1HU01VMWtLVnB4MmlyUQotLS0gUTh6RGZ4NVRaQXppQ1ozbmlS
-U1FqSVRDOEQzZDc0NUtyN3JMMmhER1U3TQrE19bvLibjcNcMzhiPZxX9K38Lr4Xo
-TXxkclMNX1EKveHCqG8rzkkquPJar5M5PAo7UL+zXBaB63XCbuscUv1jTiTFYN7V
-hVEAoj1rpcsDslhchpra3TZWuQZuhDJw+2Ig0qaCQWCzqi+e0j6oTAwZWyo3lIB1
-jt1xik+2QAxdMae2i3CBpPdwlyWGN5rpX+CgFQg3SKpOtaE5T924GJTBdm6jSfR6
-91tNoU+8cR82tHlR1NrhoKFPqw4xKZhrIhe+WW5IqK2SB7IRsnS7hiYz+UzDQu/9
-Bvfd2RO07JH1wCphnH7l+YmTVyZSydm1gPzBwGnRtWrxZa4B6xYatTWT8CQZyg0k
-suKe9EVYb6A9+UzrfjwNKIm+1aTyy7NUPTtbJ0Qjn3NoNMZIdONXqPQnT2iSFy4G
-ym4ZvkIRoyjh3dzd3csVvHIAsdWyyUL3uvri+HeHuaTtiSpyUl5hzHnjQyKgubI4
-rIfrSYtqsA76scj8HsMQ9DaQsGnEtIbvUAHemTKKVDnozY1vrO2RNg4CtAyRRfbl
-DnITU9S5V5CzMZdnUnq0qeVyKG/amPnDuEhk/IyaaLOM7T7Zl2PuT6T+Dckmj6GV
-zTOhXEwrvgMhRbeNvLDcNVkYa+BMtY8GVYWMbiEW0jUy75XC5e4TZ5fyI/IZEh5D
-rBqaQszpwskkMstlVzG95XbtjdireJjjau4qaA9aCpSKhOPzreNIQHiBWCBAvmGk
-IWuTKxMlRpCjaG9VKiOlrMrSQNDfOmyv3PascWaLwY1vJKYnkdz8LMlK+JdR4Ft9
-VzpM2emuQj3fzrZQ4W1esha8KwmyluHZJ/lmzXYo1TPvpXmW2yFKzkoT2jX2OvKf
-ly0JQEzy0g6K0FiJWP5t5Ss/jGlvV75ud/sCCISTDoc1NpljHgChEshxXQZgW4Sf
-wHWsMy4c2O/UyyvGGDO/aIGGwjRsTKrQxHyQezkLn5d7sn/RYl19xzSG6N+u0bJi
-l70OAKMldCqWnHTpoFf6EdyxOCQKez/Bi8+RDYDDbQawuyuwWmCopBpsrOHAvsOs
-6zYYnhuMDuU9vicFUjkDxVSQhyQqAeypK7xMowgfC7IbPGUAmX5ygzxtv9cWPFDn
-qwcULgcChTwPRh7NGqaq5QOmU38WdMVrzmZT8lurI1iR56OFHX33G8ZbsO/hSE03
-UAeX4Av09BfsGC7BoHaH0y0eUF4OdLv7LOEPpPN2hLKFqD23qDc1ux2210M1AxH/
-ZKCPEHu+fZU+wCLDGGztSGWzSAudncJfa/xqD7rjS2jtcb26o6B1yi5EJ6RHeh43
-t+hQBEdFm8kixsJu2ByzPhvO+gZg6SJlFIQloD7OKbk1AHYX1jDQB7IWg6CVNRBj
-Z0XgaGnRR4GCD+P0fWLrKuk+v1Bd3sTjZt7MaFxuS0l1ZQobP71Yh5Z8tX4Zy+nl
-ErjiShNTcjsTJO3+bOIdZTJh1h7oVu09hWsN1+HM4HbXVzS2n/gK4KloUK8KFIu1
-5WG7ZtVTK7PDFrIEHxoHFCCCmOTC4GQFEebvuVmc6PADZZVmP71y6mEyLAC4SPC0
-rd96lpkXhJA3nqXwc9okJXyirK1fs2CCCmK0dTxaXl/kuRAb8AQhF+2XCTV/HTYe
-5wlJSm5B0nKFOZ57+qv5T8bAqIazSUCbgOd57olC9UxJY7uPItzgP+RJZQfAFv8e
-n5dgGDsEaV1ZcLGPkfnBSa1jz6Fubf0rWmNvzkzx6gjf6j/jCBAv7O0lxpNKnDRq
-5Zl+d7Ckl/nmcMKyrVYLHFB3Vf1fJhgdenlT7zVr4+ZlpyDut7ETIbIruE7iVjAr
-JjCyfkJzIGfpkjrC5LcbqDWKF0FI2SfWIBIUMWRLLqRFHQM9fgepFsuCWlwUTevl
-J055nmA1tqyVAtMmldOc5MkyZGk1zgp2PHnWBoRS5IcsIynAsUBtbNbldDS3aLdj
-oCgRtQIcqs+zrxkylCjOcuGh9VCOYWXliICrYK9YN2pYXYKJ1fbR2+Nk8VChB6LA
-7HsmuNOE3K/Tj5izxKx60ieZXfZobTdNCVnEvyPIyX/3f96ro2UE4x3ghJ+3LvgQ
-ui+4R1r+USOEUyOaaW1v5TD5VN0G3n4HxAyge36Wgit3NCXi66k2Exy4iFjlxoIq
-b1G4whrmvR/1UsqWDpQ55skcJ2yt7Gsu/mcN2mMEBSlNlXJPBT+L/rX6bYwbe2/K
-s+XkML7VGBgQw1rYoCgZturzMfBispM595yJGa+hhpBBJsHKUF/pWOJk/1Um+8HV
-ILXqhncwpX9xIINyNdswZ4F7ZxYkywnEcgnBPVTWSXvUaOhoqD/w+la+Ifa2NhwG
-UN3Hoesbh0JCcsewhZk4tsVonBNbORe0ow84744HFpq4mGcQWoBDj+crrYjUezw4
-eDJTwvWDPyKB7D700xfPBrpfpNqU62loqJ3QjfsnIgCD0yKbnGASQiw9pfBQQrNJ
-7yoUHG0OjwgdoUSbnemjMaWx/l1r0qg//D0SRlni+UmIKIL53WHhrDFWWndEcEjb
-26b7YNCXmjmdtnV49rW396bxkzAKmXZyf9CT6KZOlMzM7VqUuem7mfJS76B+iL38
-HPSggxQ7bYq134wSDOph0dIUf7rthoSps7KG70zGhyJtFn4erVWAWrw0npDFwSLb
-e237FL1tr2QfgTE189hb0XRSqXKNXx0kg+vNn6YQufkV/sdRKmM/Svk1pzzTgeWZ
-cdJNCRkH/fD7tU1H94CE0eAe9nlTOAj0cS/rG+aRA0K4Un9ChUTALCzNXTih0pm7
-GieyEoZVsWdKtm7Yt3onUcNzaupfGYgvk4csHXoAx+LHtjusOqgEFqt6S9+SUulx
-y+fZ98btapZQ+DJSoz6fIKjey5LCf7UOQ/oUUt6Fz+OPywdfzcDtIH0TWiT+Vf+W
-bob7/suFhQwE2VCqyvxlWVqqVu7jbbIiROQiI7fFpgRzFX/MQJH816E3JRP9qo69
-YAW6wa43L0xcjcczG3SuAjl735h2BK+oTbWXhUMusEGVgp8d8YlyQhX8xrSkNKSj
-w6iLxDMyuPC9d9LjojqyTMo/4rTwl1ATX5FtAWP7eYXbUSw4Rl/M3ClS35nThU4c
-rSe3fWh1Su6IeSK2VMchoKCX6tcrnVFSz499HF+4vG8E1bRpSQbARvgZ+sWqrMs6
-egMoJmn4Fx1x8AKPqISZ/4wwoZA9ysQroVnu1G7lVJa9z14+rznooNfh7lxTyP6m
-NNIkvetycy97qRjUQIjhxe+4XvTEZd/2PexMAaboZrPqwakMAPrDQoyU73r2MxNi
-KiihpE/qzmTOtJ+WVYsuVu0Gf+63nKiGfTPEHpirpxfef3HZeCs4yyqkIPnjNRGU
-OOtiQB9ZcdrkhWHs+cN3tRbC3OoACZ+KVh7hi2RyThMuCl69aCb4zQ8foS+gPUAL
-MJnAy/sg8X5Y/WMcsqN382rbZcL9BEhpRGF8OoAuYGjNLuRCCMrRemzZ9vKozR55
-GIGDiGXppaOSF4/MlYtSvkdXzU/7a41FKmMe8zUPG/XL4kXyFHleJeWVJuxs1b3i
-n5lFt+t/7nkKaZdZI0eBLmJNfs4KA+9QoYbeRV8J5bajgm2BvRtCSdYajhn/f9SI
-a4Vtv0WyU2MIyOE/dYkIUzHnpFjVzytuKFu1V/4uV/SyZ2wOIHYWAKWMvqJp1XJt
-+iNbrU54GTsFkgOzftj+OWMCGDnouIAjIDIqGgX1bBmgEhNnZvQsoeLsnhpaYgWq
-XHV0X/bVa1liXOWQ7C3PWwfPXu9dCUkJVxpHTRZ371Ys4YF4CsuU7fQmkKph8U2l
-DHVIiZhW532zMihmSzpieM2NxHdMn4a427BYr4Omt1xS34c3e2AN/jAoF3gpBLIC
-Mv0f798oXkb81MjcxXsL/f7ADuWSaRGSLSXdRGWDXGvQZd854hDiWB2BkBchJTIT
-zbt8/o+uQ8p1bx5bY5nLEpau9O5METVWkn0eEshFXsL7Wp7/5AByklE1fbtHowhx
-OdPTFGPASom28Qzvxy2ZaOmzCMOobTXaqk3LuBO45RX9erSdo+lvetJKq/dD2l0i
-BtXpiOZUlPVZ8RjVEVSzItOaBrfEa69nUmtGwMYvs4oOMhOqquhLcnyfSs+fb2dh
-7H0uc5ZwJq5pZn2B+ZLQPix5xAiwYdqciSMPhB/XCLFZYIe54xxS4vhWfVF0c7c9
-HWCfGu2fCt8WLleWmAmWe3bXqqc5zxIWiH+KzJO7RmVTbobT4gUtNIoY1j0+y1jX
-SF+yPAtF0Aq48q88nytOAYCE66rLG4KkRBPOra/URZdCv2VPqguvBz07ehJhn9Gb
-TSN19AePr6xTe6OVGh/mC6pSE2DO4NR+Kk7GB3UFXzYpRmOQlAW7dhXxueRp2voq
-ktwsxC0VM05YBhx+/G9iIiONcfyGpbWuTE5ZlTVarPj8NruULjejvuEj0X+x2Dzs
-mhTTuFlowIVP1tnjQwMqf+Lw4Vn2PhVI4fOfok/jgfVK/PG1wXAPUt6Z79K+MDg+
-GHB+sPx5vRzm9aKIdoRpip29g7XlP3p4r4PSjlovmX0sMtDotPkti6frXaMIGaCh
-vsu0Mxs3Wpv5FMoaTsNyUbMWaGzhlnHXttOktKQDwbLoqEMPZUKlEFYH35XejpdY
-jQypXPEO6WY+hzCF1488K30nTC3ccSo9UvGPpCRTx+Lmrj2+mGgyHpa6mgV0XiQB
-nag6lJAt7+PY/Q5kjFhTojIn493+099kmyp3yeoVE5PMslqMliBMPK5Ey3NMkc3n
-/dEVgtPotxkfy6JiJQh2ncjlEILvAr7FnZ5t3w9Oi/Nno3qKYXFQdSYM5wUBDNhK
-XjvMIzieRq4lRQFvACh4iWswqvM+xpDnL4NKrdXP/wF+Ocv0pUUUt93KWEnhPT7Q
-dEZlAIMU9mU0sPFAZ43Y5rqclJvrkbv1ipgNpFjjRX/kgHlFv5fkr9jY0axA9mTY
-88Q/7RYmVZ8urkyDNV+zOCOYrC0WUR0NRFPJtk+btr8b2Ma+Xko6jIeDuNDwfdIz
-cgSuRicyxShZqW+8ZqRW15w6dnLhDwzQ9UGYklor2AsTkQtHWgUyEu/mIrvlHmjR
-L/uj/2btZfOY+1DjGfZegOSLiNJA2B3Y4yXaF29IPmn6WR3ouzk7MN1e+USbNc1P
-aACQlnkZyMc7KDAxOYcmuXUNVziNA10OfKGrF6WtC4V2Ps1K0kD7cxgmnjCVCFuX
-YrJLZDAi+B/SvGZmlOPY6GXhtCehm01Tsk29yyCqh4VHhUc2EQmc2CWyf+d9Civ0
-bD36DHs93U/R1NL+v5RGLxDGgxNySAS3/Vnlm88mFXP2Vm7JeXYfRejrtbCkdcyR
-iQgYabH5cROC/Qo+PdJK9EVZkC88Bw8tV0JqEg5uiKYtrXGy++YrP92ragazxd77
-7hSTDE2BSckATMUWlzCgMXI+DbfaXWwZvMbAa2tInqWvk7NJCkNdJzbly+2R6pHa
-8YpQz01WMFhFKDThe7QGFYxA/fF1fCMJ3aAeYBrIcEZ9LocjTCWLlTBaNkZVzo/g
-Hih5JgPGlQWQ21pTFH03YFmxYz02hxrxEwC50/AFE646JQ/iSYSU7jLDitnhBdMu
-rqgZAVbcH9+TNlwRu+pgrqhLVSy5KyDQLqxkB4oCKQW4R5XvaKBOOBJr44g7RUoG
-kYMjkHKXd7LibkkzlnF5v2tlI3EJ3lEUQCAAhhBEASOkwO9cCHNAxQo5FLRRFZ+8
-xTqKCjqbgeyazyVnruYb3Be8mtrEgdTELbbPciKCmTBmJWi+g+lM9YUhTLrCI6ZD
-JyQSwb4t4eU+eG8RrsA6n3ye9ocZbAfqfb+qrMLfuPVF5wns3UDlkBVvG+Bxm2v6
-PrkBYHu4WYgHgdcoqPxRNWNYugHOOsRqiPJO2RUSmsXGqgwu3NNUW14KcLUS8vv6
-fGmZ2gPz5klbqVAetjZy5y17MPZBH0r2sal/AtSKjqe9lrnQMvlFHCFJg+w6KSyU
-Yeb0Q5vbgoFV4anitJyJFnvZSmOlXAnCOT7olWoO/wv0voMAoLBuGS/Fm2eToBct
-uC54qIZRdSYtzo2aDec9Oz0YOaXbMGHe/vpjA0KwMyICTv4OD8lg9d1pwyLwzH9N
-To3zyIjwoJxT3CRGUSFCfxweehfKhFRz3Bl6gzk2KVfNxbZOPp3HArhobKOwUkTE
-aTUBUFCeRTQs/uSi/0ujFubtj/kQ9hP12X2rtEcC42ot32uoz/I3h2Hu98442nFU
-L/VdzOc4V6hhAhQgGaPuKYOeI1JjHIYoNk2zow4p/A8VNOyZ3uZPlpLtAPFP+Ee7
-WO6l4+V1kllCnqYZBqCuHwx5FbBj/oKmhsYgtL708w6dnIovL0WOPvwyMwshpIyJ
-UYzmW136tO9LWjBDsjkqThFfngy5sq0XuHhm9mSUTRXbA2UK6dnBESBw00ugpM97
-u7BEExL5RZLloEE9SrqfhHxyPdeWSD3Nosq6MQYoXq9/OHxboUc265Ri5N6pGkH6
-JtOLmYr4KDoSxaODlKoGQGVqxjdkGt7pzcb1tQOmdfUUQ2/aMmaSf2Pd8qjWHObR
-X7RA/WAchZih091aQqVQ7NIpjbIbNAeypd5FofFNDaelkRZZSZaAsyt6Tk03LCmq
-7Y9+zJVxqV/QUYLMJdACZbqZOsTayG5lBHEB6ahL2GQyGIpkk54KNbMDzfDIxYY6
-Z8IYKmAsF0FVcTUHRntIw8oSM38x3Gs6KIzpo1ZmZGYTazO1TgyCkDno6nPgohJQ
-PlyvjChulbfQf94sZTGG4IKzJmPh2Rg2EYJ7tJjrKzRZVOfBJc6fzE2FYGwOndvO
-RWNMhoyU5GXVdeACx/tFIp2Iyj8uVPFoHWqerbdBIQKeAmJ/zFCqOndsdmQov4UT
-w6kzs/q9jyjN5T0FTAW/rubdOUatEGjmLosk9rn+5LRHvzk3ilj6RsUj+UOLiHov
-NPAF0qhZaOxX1h/tuRawQwlLFvRAWC4aqjOmvIVAOIfnEU2xNPCMYT6NEpTRW4pZ
-xTbTg530EDwQATKYlTtYZ+SybsayggJKGpJeGCWlypZywCOb9O6hRcD1kD+3e8sB
-pYNtNAlE85izlxHK1VSNycLlvVEIFOzphD210yaW4F40a0MlHINni/EBvgW9ZBxe
-hO8RkCt3oTScuD+psNnEl/BriBD2ozHskQEd5sGZOuZwF4KvlJrtYXcbcMIQmPDB
-Xqy1qxKTa3UaAeNtpMDNwGTbJaCVPNZdafQ2cD0KSqcZcj4Oy0nYUsXxKF/+KZvl
-iZ+4ToEKFMSS4TSS5nowrW6xpMpSU6Rp8i6y7ei4RegpG2ZOstxuyruQlEqlc3+r
-03HJ8rZ98wLTFmPwglXtYgGaoXx7E+ng3G/toIKR+5bdzqY9sExsukGyaX2VA334
-jcJfZJWM4a2ft9HZoBOeGnH4nAIaa5GjHhzzpZEhc3hUkZOBh0RIWxTwutScjg4s
-zXXsh8rGHeNRNDX8Rka/i5blS5qZp1omjbyqF5kqDcojQVpPPTvEB8jaQDzmp4f6
-JfK/W4Qrk+WhDHJrej82XqZ+iW4MVOtloxza08HWfSI727fa+5aSsPJ3vfbWD41V
-Ioc2c1qweXv3r9RIBkll8W7D3b8BaluggcuuVKuGezj5RbAOy9rgm4CHtVtn70QC
-M5Z3rThtDgX7jr+6tNJjU3XgDxuqNwMlLHtIfv+KB0wPVgBKn0lVz6w5yRBDOvom
-Tpc0ub7xkvaCNNvvtrAQ5LLlNZ+4a7DzX5s/ViR2ammy2/jvZf14AH0rBILpZ04J
-YMWc9kFg/cRC8Odh6JyLOct/zj2YBa/J6umhy91/U+BXzCjs8Y0GF1zaaBp59YcI
-PEH7xKeGKL9n64sAWsfkgtYU5zx2yAEOYLk47eithAT0nQKB2Vv2t9LaCfv7V6Wk
-K1aZrWZqVVwhZiKwP9IMmxrCZpVUYWY5qJzgmFIy3Qxu9MjIKsGXIRRoZdQjsOWJ
-6Pz2cuGpOJ3WopqucgImBbSi8tdi1PwjGuid20idU+Z7TfJRncFVnvELiytsi3ex
-zQe8AqigmsATQbYkBAGTs59OqaObgCOTzI+eJEruOpH+wK7jpc5+bUXea0egQPJH
-KXAaqLTbViEl7k+yDT3yt+siQQI049YKx3/EyBSwpmRvazSCIS5TsF40GllPYRmO
-lwlJKnNNjao16utCWhK/r+q7Pa0QislnnjUc80aqeuz2NcUsgrn2qR8d40c767IY
-qwHuwkiO02+c3o6Yn/RvH9x4V8Si98N6cs63Jjc0VFWh2USMx08TwhzlyVMeUc8+
-17FH/knukHfx22edsrAfq1SvzdeAjW1kAjctr0YthWMnY4CU8Li0VTqlsFCTzbOV
-a7SwYg/RW1T1D30A6XL/STLiSZfseQJWRNk55251Culx5LdWM62npvTlhHeg191K
-cwbD0yw1MtedknRcGlCy8NLkM9OuEM1hF/T+O0xhw1hAWhDIWz3JClrn+1HzW4Lz
-V7hKhJK5s57eWtSYV6ybmRVgoVn3Qlxm2Ew/OvCWAEwX0DjJoah35JXaTiZzMCC8
-ZHy4K4/smfNn2d1fZu9AIJxTZLE/VVVsaKRPscs/ceze4N7vPwkf/o4Xn2dFe1ny
-ZSw9n1JxME5rj2Twy20b360wTFrAHgRwC51wStyOfnWK78LWW0+iSBq5ai1IpUKz
-42wN6A8syfYCnGtvl4T3Aw28zaCHk5Gj6zCcyYfxOS1Mzs/yNGcKNaAk1Rog7jpT
-VT5C9llptNEUD9/PwhZlK7Zd4wI3CW+KNaEIYYKkwBO43PF+kTYELFkie7pium7F
-0o5Zp/uzjvYKOF8AuUg0CjC9BgQOaYZhfQ3gDmTFeXex9zP3mScXc0wZo6q045Ho
-UPw6aT/7bvFRXuYFAtDf4QhwRGLjSS6JFMpsSr5FC8xiNw1wk94VFvFhstcvv69N
-k9PVnHFX8katlvqa1CA0JTwjue+x9sTcgIuUG+8Vr6jCuO1fvpFt2TDOB7eesuvE
-nFdSiJugyGDh/7mz4BOG7NOm05oGUJJxAnSzV3B1z4sfyZg8rOVa9Ox5kuF4sQxi
-WR6l+xgEXndzhYKTaRRa5WMOhh6J5ENKZPQY05h1WKdupufzpm/zrzZidt6c9iJ2
-vmmjT+T/ZHF9x8uN6LaV/jBTo7js1HTmqvxpDxwI5OAdkZNAYb8s/5EoJ04Wz05t
-+9iGsxfiRQH1Z1F2fhbH56nrHdgaL15EgQilLqs38FTOvQ0egRwjF7/yVPRGAzSa
-kiBbDWlpxqN+Qu5SDY1Er+P7wURHkgflq6uOlfG5DGTKKPKD9wzP9uVregRlFiY6
-UXKo/7yrYcanmmHtlqCRHVWeXhz19UItPzE9ERXT+GqXjlGlSphAk+OBdrb+/6ND
-6IPmfRcUxznHtSQQkOcZWznXGc3w7ext+dZ2EBzJYsaj609z5HCisBIbtDS+OmfG
-jk+8bKjrFiXBZcARn/MBTycN334vvNiXgq1k5hDwE8mx6/vryADpbBNr+QE3Su3z
-+qF0kDR5FDjzPXk3zh5Oj4nrxWAcgVEWl1vcCvULUC88blyyU4IiffygkZyolCqj
------END AGE ENCRYPTED FILE-----
diff --git a/modules/by-name/ta/taskwarrior/secrets/credentials b/modules/by-name/ta/taskwarrior/secrets/credentials
deleted file mode 100644
index f3aaf502..00000000
--- a/modules/by-name/ta/taskwarrior/secrets/credentials
+++ /dev/null
@@ -1,15 +0,0 @@
------BEGIN AGE ENCRYPTED FILE-----
-YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqdGQ3a0pWb3lvZXFWbTFQ
-UG1JbGREZW9SS3ZuWXJhbTdvTTBqZUdhN0Q0CjF1cnJFM1d2ZFNyRW44Rzlvamlz
-VWQycXhmWnB4L1hiSE5qbFozWFlGMU0KLT4gc3NoLWVkMjU1MTkgelpFb25nIEFk
-bVQ3U3BsU1FkeWxBY0sySTV2UkxocXJpVXMyd1FrMXA3YUR0NWtTR1kKeUtHODVy
-aXE3aXh4WkFmYTJtdlZyZ1A1QlhYZGZuTUYxYVVlblRUV1BqOAotPiBzc2gtZWQy
-NTUxOSA3SGZGVXcgdGR4cFMya3p6TEx5cnhYcWNXR2FlVEk3UTBEcHQ3Y3RmK0lY
-YlpwRXJGcwpwZUVqODB3SUZUdTlQVW4yaWlZaTE0RE9OT1dLanZlSGV6cnlJRElQ
-UjBBCi0+ICFALWdyZWFzZSB0MFU2IDZoIEJPWUZIP1sKN1l2dzdWN1JDbEhEeXBq
-THV0cWJIV1RLalVsVVp3RCtwbk5NS2pnd3kxS1RhNTNaa3pqWXZFVm9FM2N2cFp5
-TQpYR2MKLS0tIEhLQWdwL0VoT1ZGNU5UUWs0SVVqK0ZQTndkTURPb0VtNEtJN3or
-S0Q0K1UKRfhyrcVb0EbsKj9gL5kqaIpfrsWd2cizrVQ67y9ZOwWilWgk/gkoXadf
-q7QeYjnWsHeIVtSZIaHSa8+9pvKAwiYW+B6DjRi7EXkCYz8zGeanMuoKA4by5Q9x
-VMKJlWk7c0WIzSuviw==
------END AGE ENCRYPTED FILE-----
diff --git a/modules/by-name/ta/taskwarrior/secrets/private.key b/modules/by-name/ta/taskwarrior/secrets/private.key
deleted file mode 100644
index 64f925fb..00000000
--- a/modules/by-name/ta/taskwarrior/secrets/private.key
+++ /dev/null
@@ -1,449 +0,0 @@
------BEGIN AGE ENCRYPTED FILE-----
-YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBncVlhL2RhS3JNaWFIKzl5
-VFV2Y3dZRkE2SlFvV25wd2NRU0NVN1Z0T2pBCmpRM2FJSUpPMGpQRE5EZHR5NElu
-UlBLcE9EWVBRSHA4eTRTNHpDaDdIOHMKLT4gc3NoLWVkMjU1MTkgelpFb25nIGlC
-cGR2aytobjcxV0xJMUc4d1VseUN2K3NoMEx4UnIzRGZvOTZoNHJVaGMKYWV3TVAw
-RWJzN3NnOHo3QnZSL3JvbTFxWG9zQmtISzRIMDJXVXg4U1kvZwotPiBzc2gtZWQy
-NTUxOSA3SGZGVXcgV0E4b05Kc3FwRXdFT3Y4c1VmTi83QXFxSXViVVVORTRMMms0
-cVpzMEd6ZwphazBuREVxSWxMcFJUYUplQXFOQkVjM2hUSytMUmN0d1dsM21lOGE1
-SkhNCi0+IE57XS1ncmVhc2UKN0RPSGRMOG5YSUZNblphWXg3MUxyNVVyS2RocnAw
-SFlsbG5PZzlWNndtL016WnFraXhWNHhaV1hwK3F1NCtDVQpSMm5vcjk5M282UUk1
-c1BjMHdCSjlkdmxQM1NKdzFVUG53Ci0tLSBlbE9TSUV2Tmxlc1FhaWZZU0hWQVdX
-SnNnWFUvWEcwSmppdCsvQUxWVGlvCqDjHDzuQfNWNpnVCLFdErXs5Xp1tedq+HIK
-/os5NEoGXikwdJTi0QMbBJwe/jKtf6WNEz/CX/sNCRg2qHGLZFFOuTZ+daIhfx3U
-kO3rA0pZzN1nyVwZhWSs63SOnooAUjfMzIcnDnu0qfGKXUAf1VmKxrqx5r/g4Sk3
-pYj383uWylTkrCo1OA4Hq02ynCosS+rDtyMb+mO8v2MxhG/r5noMO9YbBA7DOKtv
-Rp2Ji8vdrvUnsLMBWBZsdFr0mpg7adoraCRIerpbJAG5LpA3QsHS8rjymn9RDLH3
-CogNs5NcYEjIj2sf+1/pLUqlUb6BEog/4QLD9aRIoQECwNTIMHRtwq09V3YkOEB+
-UXCTnfdDyqj+DlADFfRmu82P32E/VcS9MH0WHSKuVCiNa6Vzljowrt9JUXVxXKbs
-+ae8+qnQA/rOInWMG94ypFBH+fcYuso0rFSLU40MSUZtZmBHa1TYJ0md4U5V7Fnp
-0OpL7PNnoxh1fdlTwDJ7zGOUyijTl15dPbAdzSiqm0mYmXms0BzPkubOMbAsiKmu
-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
-Mfoar9/TM+perLNXW3/cOII8+LiNVz8y+Vc=
------END AGE ENCRYPTED FILE-----
diff --git a/modules/by-name/ta/taskwarrior/secrets/public.cert b/modules/by-name/ta/taskwarrior/secrets/public.cert
deleted file mode 100644
index d20ef291..00000000
--- a/modules/by-name/ta/taskwarrior/secrets/public.cert
+++ /dev/null
@@ -1,83 +0,0 @@
------BEGIN AGE ENCRYPTED FILE-----
-YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkQVJNM1RDMEp0NkM1dzlF
-UE42amNBaERmanAyUDNFSlFlUWszb3hiMWtVCllKSml4QVBGT293U3lmaEo2YVVn
-TGdRcllMOFI5WXJsL3ZvdnpIeS9UZjgKLT4gc3NoLWVkMjU1MTkgelpFb25nIEVE
-WnJYU28wdThLWEJlYlpSeDM5eklZR05aR0dpVnN0QjFCU3hueW9NR0UKSXhlV2oy
-b3BWaDQ0K1R2YVZhbjVjZHkyWTQwNGZ6K09QcHJwcFN2S2doRQotPiBzc2gtZWQy
-NTUxOSA3SGZGVXcgemg3dWV3emhNSjdIOVRqYk1mSHdMUnk4bnpBUWZZTkZlY0tG
-aUVkWUt6bwpDRmhKNlU3NGNCQzdNQmsvUndQQ3c2VHRab0h2NDl6MVdlb1BncnRo
-ME1NCi0+ID0tZ3JlYXNlCk9OOVlwMmlONmN1aUNScmNwT3drVHBUc1dqb0FuNUU3
-UWoxNy9SRUp3NDFXRFh6WE0zdUVJMnVCemVkUmtpamcKd3BEb1VtajcxUQotLS0g
-YVo1S1JLQmQrZkIzMmE1YlFCMGlHNElaSXdCR0VBU3pNYS8xSGtFRlpwWQp2we4U
-b9JZk9snxRROCHh9w0nfIDwqGsR8+mFScXDHZAT5pji2nlJncjOToUUf6kqDY3EH
-+UzfvxUZrzF0LZxhlJEApmeo5ObuexQqtm6M4mg8Sx+3XoTHM/07xWB464eKSyGw
-4xBzR0Lj21XUBdfbM3gBAY2J4kvZwPyD0ygun+x+JesJFWgkezh5Vn/oY7bCtgE5
-VjFKR7+kSltBeK7PiqafiukuF/0KRsTDg02FryCCH4nGcjeZeqhs5k2B/56Mxd89
-MD1K/tw4lkvrZ09gLdCN7bY8d72WMQ+Qbilrf5InJsLaUn3dloeyQgJiR9LUkwP0
-b1jZWsUgWOeHfwKUhFoPW4b8VVT8PV3SaLgeoCtoW3ZME+Yv3T7NJZupq57KGcYo
-XgDl8XOG2GjL2UIqp7i7cQFt8KuZxRs2259e8Jf1shyHr34Qw18UpL01++DkZbS3
-f6SucDAbak57CS+qHxLzTqtZT6kLQhfY3yF8QTXcdVC7hMbGNar8TaqIe6SQ1HCT
-HHFRHZ4hj/VVdVlaOLHBvIokFkZE85tTiyjW/llkyfQWH2z+Dwctou6nUBzPgNNF
-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
-dw==
------END AGE ENCRYPTED FILE-----
diff --git a/modules/by-name/ta/taskwarrior/secrets/sync_server_encryption_key.age b/modules/by-name/ta/taskwarrior/secrets/sync_server_encryption_key.age
new file mode 100644
index 00000000..1e1a252e
--- /dev/null
+++ b/modules/by-name/ta/taskwarrior/secrets/sync_server_encryption_key.age
@@ -0,0 +1,41 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBhUEkzOWlvdU00NnVYcVN1
+TjZMMWUwY3l1c1JEbUFHZFZtcmZ2YWU2VVRnCjYzS3ZrNC9Nc2J2d1Nxc0FtbHM1
+WGJjenE5UFhROGxOdVhka2ZCcm04TUEKLT4gc3NoLWVkMjU1MTkgelpFb25nIEpk
+LysxejJOcnNJNEpxWnQzcEd5YWlhTEUreS90R1hiNlRYNmJQTGRYSE0KeU0yVEZy
+WTcrZVRiUjZyWFdQWTVTak9Ua3dwZ3pKZXBCRHJhMXN1UElXRQotPiBzc2gtZWQy
+NTUxOSA3SGZGVXcgUHlFZnkrd3RuN3ROK1lmdG1hcGJHZmFPMENOTjNMdndsSEJL
+VDRNL0pCdwo0MmZIRTlTeWFNM2Q5NW1ja1hwY0dCOUg5YUhHYzVkWGlta2ZSTWI3
+aHVvCi0+IFkrRC1ncmVhc2UgNGZkCk5KSzd2RjhIaUFnMHFFeVhOcFM3MktEWERI
+cUY1dlY4SDA0Ci0tLSBtSi9zUkdQV0xWMlA4SUtEeGJCeTRGZmFpbC9EMUN3ZVRQ
+YXIzaXNWS3lJCitm6obeMX9iJ9HZ48/kS0qt6PjOI5iWfag3oiBVhUAaab3P42KM
+KS3Vi1nTKXR5FHigy84Z10uV2apxq73g9uwD97IPH7APyeQsibs6q5aJXmntBYLi
+bROu9pSHSYHUrOMHL3hrzs/9bbmS0TXPm1q9ixem2Zm93z96AJQ95IunaeNtA1ya
+UooQ2MtYWtLkbj7Z78PydKzqMYsk1zBehBFfHbdyVenDAoaTXpzhRBCGgRmDvvNA
+vL/7GKOXLg7Djh8DR4sPXYt3d07DXkrFsxF9GgA+dmhCIMmS6KCldyAfRLHQaYjb
+5WQ/Xmx0MpZwdMNF8AWNX7U2/ZlfJwH4zSZ1SMPYgKqbk4FxzktY5BVsGCyq7aqz
+fU8EgoIAU3wio6GLWnvwI6AA0evowooUkHncmBDIFTfNY64wD8KeYyz0EiLOfOLd
+tjnnzzl2u6aWN8nOToRDDTzVIJg3mQNJjgxZF8G7iJh4WtGYyhrldgcefrGfFRP9
+ZoNj5JhWsNA96KrfdFZPTH1RKZsDd631UEpkP5aA3wv1mzK4D+R0tuttc6AD5Gk7
+QlwSz86OUN4hDGbUEGtRt9WBt34VkFLeH4WgPP6trkXGr8gtGHBnxLzl1JgssmC1
+evoz/jHUDT2f3/gFfe6mZFIMgEuibmL18vQ9FUYfZsigMzvkOTnpIbKX8FXm4Hfy
+/4qi8q6rqrwRttDuzX1mK0frqx7MIIUp45UvemfJVN7qDB4IrKBfjw5ICy3gifx3
+7dVgjXBmGAzGkzXk2PtRUscSHW9r21cMICwRsDRM4dawTF1Rk0pkkkureZ0fnLNv
+krhmv5SQEEWILm+hkg2963a4osbeHIMQnRiPd3wgfhTcd0peNq+E+S1+w5/3+R5M
+Cc4JbHbYiHxCcfhFNI5iPkQVm4lMWi53YvPrweLw09+IGpUwTVB4jN3q2qvlCGeF
+7n615QH8xchMxKfB4fwa7uXo5T8phYo31KguPBYX94vJPK/R6mR9WUnq8//+m6VD
+n9SDSrSYUq/ckCbQkPAWnBzwUzm9Ykok9XKPbdMfeeyMc8wQ/FaXNoofvkWiCTDp
+BVYNrlQUnRavmjTW6r8CMz/PIRCk3MzTeMX8nvpxeMALBTJjKGt1ZPaCTiObAcBh
+QDrohH6c/iRQu1ZmaKwtcDfwJKNAnsqnZWWwfFayV/PXvVl5jgwYpwJYbC/Pu7Km
+ssdrpCcW/O48L861lw7wF5f4Fneo/ZbSx0erGTviYqiaoRgLaeEhMBZZFhdENHbS
+MDJ24qu3qHl/h725edpmiAMziD5jeE9oBUvh7JkhVobc87dFpBHC6znseRlIpr+J
+8csSU8mQEAHy7tW9PGK4wZLVGQr9mpADyYgYpow3X6HNuX/DHqzs0GDHanG4uOiF
+vSeW2YADEU7O1focnfFGBhEMzbbNVfSBmvcU0avGa2ZajW1h6S2JpfDPsyQfC6Xr
+4LmRL+myH0V9i72m9kChsDuQPHGRYBW+iQctoYalXzPFrU7Kpl+/yURecV7JI/v5
+ujHtGPgzvfqTEama/PGbjxC0kVQ9TayPB7ymIjjJquBYKTW74S/exvpYbZz8vN1B
+xcwyd7TeMdRYI2nfuI82Q13WoLdLUEW1O5VXPxTm+5pnYbvxfipR4S45+U3tbaaE
+YNy26DiZEKUXdyL5Jd+LlArXJXSLd5lzJXs+h8YeogxjtJ7PMmUqmtUDj6PCDrsF
+54T5sTGjO2w7QSanwsXgALRgBQpvPTniFpFBllSH44Nj9B2LybmbWIyph67FeIeM
+p+YedymnlewwiM2nGcjY/Zs/abdrQwnnKsgkWRGRAHHxhV0pamXfdoZJZEHzebWU
+u5iGa9slaCAJxuLs5DQ940e8VFESEwM+e0AECwRmCf+1YazXemiJ+w==
+-----END AGE ENCRYPTED FILE-----
diff --git a/modules/by-name/ti/timewarrior/module.nix b/modules/by-name/ti/timewarrior/module.nix
new file mode 100644
index 00000000..90a541d8
--- /dev/null
+++ b/modules/by-name/ti/timewarrior/module.nix
@@ -0,0 +1,97 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.timewarrior;
+
+  track_timewarrior = pkgs.stdenv.mkDerivation {
+    name = "track-timewarrior";
+    nativeBuildInputs = [
+      pkgs.makeWrapper
+    ];
+    buildInputs = [
+      pkgs.timewarrior
+      pkgs.taskwarrior3
+      pkgs.python3
+    ];
+    dontUnpack = true;
+    installPhase = ''
+      install -Dm755 ${./taskwarrior_hooks/on-modify.track-timewarrior.py} $out/bin/track-timewarrior
+      wrapProgram $out/bin/track-timewarrior \
+      --set PATH ${lib.makeBinPath [pkgs.taskwarrior3 pkgs.timewarrior]}
+    '';
+
+    meta.mainProgram = "track-timewarrior";
+  };
+  track_total_active_time = pkgs.stdenv.mkDerivation {
+    name = "track-total-active-time";
+    nativeBuildInputs = [
+      pkgs.makeWrapper
+    ];
+    buildInputs = [
+      pkgs.taskwarrior3
+      pkgs.python3
+    ];
+    dontUnpack = true;
+    installPhase = ''
+      install -Dm755 ${./taskwarrior_hooks/on-modify.track-total-active-time.py} $out/bin/track-total-active-time
+      wrapProgram $out/bin/track-total-active-time \
+      --set PATH ${lib.makeBinPath [pkgs.taskwarrior3]}
+    '';
+
+    meta.mainProgram = "track-total-active-time";
+  };
+in {
+  options.soispha.programs.timewarrior = {
+    enable = lib.mkEnableOption "timewarrior";
+  };
+  config = lib.mkIf cfg.enable {
+    soispha.programs.taskwarrior = {
+      hooks = {
+        track-timewarrior = {
+          mode = "on-modify";
+          executable = track_timewarrior;
+        };
+        track-total-active-time = {
+          mode = "on-modify";
+          executable = track_total_active_time;
+        };
+      };
+    };
+
+    home-manager.users.soispha = {
+      home.packages = [
+        pkgs.timewarrior
+      ];
+
+      xdg.configFile."timewarrior/timewarrior.cfg".text = ''
+        # source: https://github.com/arcticicestudio/igloo
+        #+----+
+        #+ UI +
+        #+----+
+        import ${./nord.theme}
+        color = true
+
+        #+---------+
+        #+ Reports +
+        #+---------+
+        define reports:
+          day:
+            lines = 10
+            month = true
+            week = true
+      '';
+    };
+  };
+}
diff --git a/modules/home.legacy/conf/timewarrior/nord.theme b/modules/by-name/ti/timewarrior/nord.theme
index da3c387a..da3c387a 100644
--- a/modules/home.legacy/conf/timewarrior/nord.theme
+++ b/modules/by-name/ti/timewarrior/nord.theme
diff --git a/modules/by-name/ti/timewarrior/nord.theme.license b/modules/by-name/ti/timewarrior/nord.theme.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/ti/timewarrior/nord.theme.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/ti/timewarrior/taskwarrior_hooks/on-modify.track-timewarrior.py b/modules/by-name/ti/timewarrior/taskwarrior_hooks/on-modify.track-timewarrior.py
new file mode 100755
index 00000000..3b42b3f2
--- /dev/null
+++ b/modules/by-name/ti/timewarrior/taskwarrior_hooks/on-modify.track-timewarrior.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python3
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# Copyright 2016 - 2021, 2023, Gothenburg Bit Factory
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+import json
+import subprocess
+import sys
+
+# Hook should extract all the following for use as Timewarrior tags:
+#   UUID
+#   Project
+#   Tags
+#   Description
+#   UDAs
+
+try:
+    input_stream = sys.stdin.buffer
+except AttributeError:
+    input_stream = sys.stdin
+
+
+MAX_ACTIVE = 1
+
+
+def extract_tags_from(json_obj) -> [str]:
+    # Extract attributes for use as tags.
+    tags = [json_obj["description"]]
+
+    if "project" in json_obj:
+        tags.append(json_obj["project"])
+
+    if "tags" in json_obj:
+        if type(json_obj["tags"]) is str:
+            # Usage of tasklib (e.g. in taskpirate) converts the tag list into a string
+            # If this is the case, convert it back into a list first
+            # See https://github.com/tbabej/taskpirate/issues/11
+            tags.extend(json_obj["tags"].split(","))
+        else:
+            tags.extend(json_obj["tags"])
+
+    return tags
+
+
+def extract_annotation_from(json_obj):
+    if "annotations" not in json_obj:
+        return "''"
+
+    return json_obj["annotations"][0]["description"]
+
+
+def main(old, new):
+    start_or_stop = ""
+
+    # Started task.
+    if "start" in new and "start" not in old:
+        # Prevent this task from starting if "task +ACTIVE count" is greater than "MAX_ACTIVE".
+        p = subprocess.Popen(
+            ["task", "+ACTIVE", "status:pending", "count", "rc.verbose:off"],
+            stdout=subprocess.PIPE,
+        )
+        out, err = p.communicate()
+        count = int(out.rstrip())
+        if count >= MAX_ACTIVE:
+            print(
+                f"Only {MAX_ACTIVE} task(s) can be active at a time.",
+            )
+            sys.exit(1)
+        else:
+            start_or_stop = "start"
+
+    # Stopped task.
+    elif ("start" not in new or "end" in new) and "start" in old:
+        start_or_stop = "stop"
+
+    if start_or_stop:
+        tags = extract_tags_from(new)
+
+        subprocess.call(["timew", start_or_stop] + tags + [":yes"])
+
+    # Modifications to task other than start/stop
+    elif "start" in new and "start" in old:
+        old_tags = extract_tags_from(old)
+        new_tags = extract_tags_from(new)
+
+        if old_tags != new_tags:
+            subprocess.call(["timew", "untag", "@1"] + old_tags + [":yes"])
+            subprocess.call(["timew", "tag", "@1"] + new_tags + [":yes"])
+
+        old_annotation = extract_annotation_from(old)
+        new_annotation = extract_annotation_from(new)
+
+        if old_annotation != new_annotation:
+            subprocess.call(["timew", "annotate", "@1", new_annotation])
+
+
+if __name__ == "__main__":
+    old = json.loads(input_stream.readline().decode("utf-8", errors="replace"))
+    new = json.loads(input_stream.readline().decode("utf-8", errors="replace"))
+    print(json.dumps(new))
+    main(old, new)
diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py b/modules/by-name/ti/timewarrior/taskwarrior_hooks/on-modify.track-total-active-time.py
index d5b380d0..303a5c57 100755
--- a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-total-active-time.py
+++ b/modules/by-name/ti/timewarrior/taskwarrior_hooks/on-modify.track-total-active-time.py
@@ -1,8 +1,17 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+# nixos-config - My current NixOS configuration
+#
 # Copyright (C) 2016-present Arctic Ice Studio <development@arcticicestudio.com>
 # Copyright (C) 2016-present Sven Greb <development@svengreb.de>
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
 # Project:    igloo
 # Repository: https://github.com/arcticicestudio/igloo
@@ -20,37 +29,24 @@ By default, this plugin allows to have one task active at a time. This can be ch
 ``1``.
 
 Note:
-    This hook requires Python 3 and the `taskw`_ package to be installed which provides the python bindings for Taskwarrior!
-    Also note that this hook is only compatible with Taskwarrior version greater or equal to 2.4!
+    Note that this hook is only compatible with Taskwarrior version greater or equal to 2.4!
 
 This hook is a fork from `kostajh/taskwarrior-time-tracking-hook`_
 
-.. _taskw:
-   https://pypi.python.org/pypi/taskw
 .. _kostajh/taskwarrior-time-tracking-hook:
    https://github.com/kostajh/taskwarrior-time-tracking-hook
 """
 
 import datetime
 import json
-import re
 import sys
 import subprocess
-from taskw import TaskWarrior
 from typing import TypeVar
 
 TIME_FORMAT = "%Y%m%dT%H%M%SZ"
 UDA_KEY = "total_active_time"
 
-w = TaskWarrior(config_filename=sys.argv[4].replace("rc:", ""))
-config = w.load_config(config_filename=sys.argv[4].replace("rc:", ""))
-if "max_active_tasks" in config:
-    MAX_ACTIVE = int(config["max_active_tasks"])
-else:
-    MAX_ACTIVE = 1
-
-"""Compiled regular expression for the duration as ISO-8601 formatted string."""
-ISO8601DURATION = re.compile("P((\d*)Y)?((\d*)M)?((\d*)D)?T((\d*)H)?((\d*)M)?((\d*)S)?")
+MAX_ACTIVE = 1
 
 """The duration type either as integer (in seconds), as ISO-8601 formatted string ("PT1H10M31S") or the seconds suffixed with "seconds"."""
 DurationType = TypeVar("DurationType", str, int)
@@ -63,31 +59,7 @@ def duration_str_to_time_delta(duration_str: DurationType) -> datetime.timedelta
     :return: The duration as timedelta object
     """
     if duration_str.startswith("P"):
-        match = ISO8601DURATION.match(duration_str)
-        if match:
-            year = match.group(2)
-            month = match.group(4)
-            day = match.group(6)
-            hour = match.group(8)
-            minute = match.group(10)
-            second = match.group(12)
-            value = 0
-            if second:
-                value += int(second)
-            if minute:
-                value += int(minute) * 60
-            if hour:
-                value += int(hour) * 3600
-            if day:
-                value += int(day) * 3600 * 24
-            if month:
-                # Assume a month is 30 days for now.
-                value += int(month) * 3600 * 24 * 30
-            if year:
-                # Assume a year is 365 days for now.
-                value += int(year) * 3600 * 24 * 365
-        else:
-            value = int(duration_str)
+        value = datetime.fromisoformat(duration_str)
     elif duration_str.endswith("seconds"):
         value = int(duration_str.rstrip("seconds"))
     else:
diff --git a/modules/by-name/ts/tskm/module.nix b/modules/by-name/ts/tskm/module.nix
new file mode 100644
index 00000000..9bf2b389
--- /dev/null
+++ b/modules/by-name/ts/tskm/module.nix
@@ -0,0 +1,136 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  lib,
+  config,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.tskm;
+
+  allProjectNames = lib.lists.flatten (lib.attrsets.mapAttrsToList mkProject cfg.projects);
+
+  projectList = builtins.concatStringsSep "\n" allProjectNames;
+  mkProject = name: value: let
+    subprojects = lib.attrsets.mapAttrsToList (newName: mkProject "${name}.${newName}") value.subprojects;
+  in
+    [name] ++ subprojects;
+
+  firefoxProfiles = builtins.listToAttrs (lib.imap0 (index: name:
+    lib.attrsets.nameValuePair name {
+      inherit name;
+      # Add one here, so that we can have the default profile at id 0.
+      id = index + 1;
+    })
+  allProjectNames);
+
+  contexts =
+    builtins.concatStringsSep "\n"
+    (lib.lists.flatten
+      (lib.attrsets.mapAttrsToList mkContext cfg.projects));
+  mkContext = name: value: let
+    subprojects =
+      lib.attrsets.mapAttrsToList
+      (newName: newValue: let
+        finalValue =
+          if newValue.prefix == ""
+          then newValue // {inherit (value) prefix;}
+          else newValue;
+      in
+        mkContext "${name}.${newName}" finalValue)
+      value.subprojects;
+    contextName = builtins.replaceStrings ["."] ["_"] name;
+  in
+    [
+      ''
+        context.${contextName}.rc.neorg_path=${value.prefix}/index.norg
+        context.${contextName}.read=project:${name}
+        context.${contextName}.write=project:${name}
+      ''
+    ]
+    ++ subprojects;
+
+  contextsFile =
+    pkgs.writeText "contexts-file" contexts;
+
+  projectType = lib.types.submodule {
+    options = {
+      name = lib.mkOption {
+        type = lib.types.str;
+        example = "timesinks";
+        description = "The name of this project";
+      };
+
+      prefix = lib.mkOption {
+        type = lib.types.str;
+        default = "";
+        example = "programming/zig";
+        description = ''
+          A prefix to append to the project neorg path.
+          This can be used to group similar project's neorg directories together. '
+        '';
+      };
+
+      subprojects = lib.mkOption {
+        type = lib.types.attrsOf projectType;
+        description = ''
+          A list of subprojects.
+          These can also contain subprojects.
+        '';
+        default = {};
+      };
+    };
+  };
+in {
+  options.soispha.programs.tskm = {
+    enable = lib.mkEnableOption "tskm";
+
+    projects = lib.mkOption {
+      type = lib.types.attrsOf projectType;
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    soispha.programs = {
+      firefox.profiles = firefoxProfiles;
+      taskwarrior = {
+        includeFiles = {
+          tskm-contexts = contextsFile;
+        };
+        hooks = {
+          enforce-projects =
+            config.lib.taskwarrior.mkHook "on-add" [
+              pkgs.jq
+              pkgs.gnugrep
+              pkgs.tskm
+            ]
+            ./taskwarrior_hooks/enforce-projects.sh;
+        };
+      };
+    };
+
+    home-manager.users.soispha = {
+      home.sessionVariables = {
+        # TODO: Remove this hard-coded path with a reference. <2025-04-04>
+        "TSKM_PROJECT_FILE" = "/home/soispha/repos/nix/own/config/modules/common/projects.json";
+      };
+
+      programs.nixvim = {
+        plugins.neorg.settings.load."core.dirman".config.workspaces = {
+          tskm = "~/.local/share/tskm/notes";
+        };
+      };
+
+      xdg.configFile."tskm/projects.list" = {
+        text = projectList;
+      };
+    };
+  };
+}
diff --git a/modules/by-name/ts/tskm/taskwarrior_hooks/enforce-projects.sh b/modules/by-name/ts/tskm/taskwarrior_hooks/enforce-projects.sh
new file mode 100755
index 00000000..c3e377c0
--- /dev/null
+++ b/modules/by-name/ts/tskm/taskwarrior_hooks/enforce-projects.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+new_task="$1"
+
+project="$(echo "$new_task" | jq '.project' --raw-output)"
+[ "$project" = "null" ] && die "No project supplied!"
+
+if ! tskm projects list | grep -q "^$project$"; then
+    die "The project '$project' is not (yet) registered, registered projects: $(tskm projects list | tr '\n' ',')"
+fi
+
+# vim: ft=sh
diff --git a/modules/by-name/un/unison/module.nix b/modules/by-name/un/unison/module.nix
index 9de27c0f..8d156b00 100644
--- a/modules/by-name/un/unison/module.nix
+++ b/modules/by-name/un/unison/module.nix
@@ -1,13 +1,21 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   config,
   pkgs,
-  sysLib,
   ...
 }: let
   cfg = config.soispha.services.unison;
 
-  script = import ./shellScript.nix {inherit sysLib lib pkgs cfg;};
+  script = import ./shellScript.nix {inherit lib pkgs cfg;};
 in {
   options.soispha.services.unison = let
     homePath = lib.types.strMatching "^~.*";
diff --git a/modules/by-name/un/unison/shellScript.nix b/modules/by-name/un/unison/shellScript.nix
index 4618ae8e..df373805 100644
--- a/modules/by-name/un/unison/shellScript.nix
+++ b/modules/by-name/un/unison/shellScript.nix
@@ -1,5 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
-  sysLib,
   lib,
   pkgs,
   cfg,
@@ -60,7 +68,7 @@
     lib.strings.concatStringsSep " " [
       "unison"
       "${serialiseArgs cfg.unisonOptions}"
-      "$EXTRA_OPTIONS"
+      "\"$@\""
       "${getIgnored cfg.pathsToIgnore path}"
       "${esa path}"
       (esa "ssh://${cfg.foreign.userName}@${cfg.foreign.address}/${path}")
@@ -68,24 +76,18 @@
 
   script = lib.strings.concatStringsSep "\n" (builtins.map mkScriptLine cfg.pathsToSync);
 in
-  sysLib.writeShellScript {
+  pkgs.writeShellApplication {
     name = "unison-sync";
-    src = builtins.toFile "unison-backup" (''
-        #!/usr/bin/env dash
+    text = script;
 
-        # shellcheck source=/dev/null
-        SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-        export UNISON=${esa cfg.dataDir};
-
-        EXTRA_OPTIONS="$UNISON_EXTRA_OPTIONS $*"
-      ''
-      + script);
+    runtimeEnv = {
+      UNISON = cfg.dataDir;
+    };
 
-    dependencies = with pkgs; [
-      unison
-      openssh # needed to connect to the other server
-      less # needed to show diffs
-      diffutils # needed to compute diffs
+    runtimeInputs = [
+      pkgs.unison
+      pkgs.openssh # needed to connect to the other server
+      pkgs.less # needed to show diffs
+      pkgs.diffutils # needed to compute diffs
     ];
   }
diff --git a/modules/by-name/us/users/module.nix b/modules/by-name/us/users/module.nix
index a44df7e8..555e61f9 100644
--- a/modules/by-name/us/users/module.nix
+++ b/modules/by-name/us/users/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   pkgs,
@@ -8,6 +17,7 @@
 in {
   options.soispha.users = {
     enable = lib.mkEnableOption "user set-up for soispha";
+
     hashedPassword = lib.mkOption {
       type = lib.types.str;
       example = lib.literalExpression "$y$jFT$ONrCqZIJKB7engmfA4orD/$0GO58/wV5wrYWj0cyONhyujZPjFmbT0XKtx2AvXLG0B";
@@ -31,19 +41,42 @@ in {
     users = {
       mutableUsers = false;
 
-      users.soispha = {
-        isNormalUser = true;
-        home = "/home/soispha";
-        createHome = true;
-        shell = pkgs.zsh;
-        initialHashedPassword = cfg.hashedPassword;
-        extraGroups = cfg.groups ++ lib.optional cfg.enableDeprecatedPlugdev "plugdev";
-
-        uid = 1000;
-        openssh.authorizedKeys.keys = [
-          # TODO: This should be parameterized. <2024-05-16>
-          "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIME4ZVa+IoZf6T3U08JG93i6QIAJ4amm7mkBzO14JSkz"
-        ];
+      users = {
+        soispha = {
+          isNormalUser = true;
+          home = "/home/soispha";
+          createHome = true;
+          shell = pkgs.zsh;
+          initialHashedPassword = cfg.hashedPassword;
+          extraGroups = cfg.groups ++ lib.optional cfg.enableDeprecatedPlugdev "plugdev";
+
+          uid = 1000;
+          openssh.authorizedKeys.keys = [
+            # TODO: This should be parameterized. <2024-05-16>
+            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIME4ZVa+IoZf6T3U08JG93i6QIAJ4amm7mkBzO14JSkz"
+          ];
+        };
+
+        root = {
+          hashedPassword = lib.mkForce null; # to lock root
+          openssh.authorizedKeys.keys = lib.mkForce [];
+        };
+      };
+    };
+
+    home-manager.users = {
+      soispha.home = {
+        username = "soispha";
+        homeDirectory = config.users.users.soispha.home;
+        stateVersion = "23.05";
+        enableNixpkgsReleaseCheck = true;
+      };
+
+      root.home = {
+        username = "root";
+        homeDirectory = config.users.users.root.home;
+        stateVersion = "23.05";
+        enableNixpkgsReleaseCheck = true;
       };
     };
   };
diff --git a/modules/by-name/ve/version/module.nix b/modules/by-name/ve/version/module.nix
index 77cada14..fc03b107 100644
--- a/modules/by-name/ve/version/module.nix
+++ b/modules/by-name/ve/version/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/wa/water-reminder/module.nix b/modules/by-name/wa/water-reminder/module.nix
new file mode 100644
index 00000000..76e5aafa
--- /dev/null
+++ b/modules/by-name/wa/water-reminder/module.nix
@@ -0,0 +1,66 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.services.water-reminder;
+in {
+  options.soispha.services.water-reminder = {
+    enable = lib.mkEnableOption "periodic reminder for water intake";
+
+    frequency = lib.mkOption {
+      type = lib.types.str;
+      default = "*-*-* *:00/30:00"; # Every 30 minutes
+      description = ''
+        How often to remind. This value is passed to the systemd
+        timer configuration as the `OnCalendar` option. See
+        {manpage}`systemd.time(7)` for more information about the format.
+      '';
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      systemd.user.services.water-reminder = {
+        Unit = {Description = "Water reminder";};
+        Service = {
+          CPUSchedulingPolicy = "idle";
+          IOSchedulingClass = "idle";
+          ExecStart = lib.getExe (
+            pkgs.writeShellApplication {
+              name = "water-reminder";
+
+              inheritPath = false;
+              runtimeInputs = [pkgs.libnotify];
+
+              text =
+                # bash
+                ''
+                  notify-send 'Seek fluid intake' 'Water intake required' --wait --expire-time=0 --urgency=critical
+                '';
+            }
+          );
+        };
+      };
+
+      systemd.user.timers.water-reminder = {
+        Unit = {Description = "periodic reminder for water intake";};
+        Timer = {
+          Unit = "water-reminder.service";
+          OnCalendar = cfg.frequency;
+        };
+        Install = {WantedBy = ["timers.target"];};
+      };
+    };
+  };
+}
diff --git a/modules/by-name/wa/waydroid/module.nix b/modules/by-name/wa/waydroid/module.nix
index 58bce7d1..a55ccf90 100644
--- a/modules/by-name/wa/waydroid/module.nix
+++ b/modules/by-name/wa/waydroid/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/xd/xdg/module.nix b/modules/by-name/xd/xdg/module.nix
index 5140a832..94c5a975 100644
--- a/modules/by-name/xd/xdg/module.nix
+++ b/modules/by-name/xd/xdg/module.nix
@@ -1,58 +1,128 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
-  nixpkgs_open_prs,
-  sysLib,
-  system,
+  lib,
+  config,
   ...
 }: let
-  pkgs_tfc = nixpkgs_open_prs.nixpkgs-tfc.legacyPackages."${system}";
+  lf-wrapper = pkgs.writeShellApplication {
+    name = "lf-wrapper";
+
+    runtimeInputs = [pkgs.lf pkgs.alacritty];
+    inheritPath = true;
+
+    text = builtins.readFile ./scripts/lf-wrapper.sh;
+  };
+
+  url-handler = pkgs.writeShellApplication {
+    name = "url-handler";
+
+    runtimeInputs = [pkgs.rofi pkgs.libnotify pkgs.zathura pkgs.tskm];
+    inheritPath = false;
+
+    text = builtins.readFile ./scripts/url-handler.sh;
+  };
+
+  tfcConfigFile = (pkgs.formats.ini {}).generate "xdg-desktop-portal-termfilechooser.ini" {
+    filechooser = {
+      default_dir = "/tmp";
+      cmd = "${lib.getExe lf-wrapper}";
+    };
+  };
+
+  cfg = config.soispha.xdg;
 in {
-  services.dbus.enable = true;
-  xdg = {
-    portal = {
-      enable = true;
-      termfilechooser = {
-        enable = true;
-        logLevel = "TRACE";
-        package = pkgs_tfc.xdg-desktop-portal-termfilechooser;
-        settings = {
-          filechooser = {
-            default_dir = "/tmp";
-            cmd = "${sysLib.writeShellScript {
-              src = ./scripts/lf_wrapper.sh;
-              name = "lf_wrapper";
-              keepPath = true;
-              dependencies = with pkgs; [
-                lf
-                alacritty
-                bash
-              ];
-            }}/bin/lf_wrapper";
+  options.soispha.xdg = {
+    enable = lib.mkEnableOption "xdg";
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      xdg = {
+        configFile."xdg-desktop-portal-termfilechooser/config".source = tfcConfigFile;
+
+        desktopEntries = {
+          url-handler = {
+            name = "url-handler";
+            genericName = "Web Browser";
+            exec = "${lib.getExe url-handler} %u";
+            terminal = false;
+            categories = [
+              "Application"
+              "Network"
+              "WebBrowser"
+            ];
+            mimeType = [
+              "text/html"
+              "text/xml"
+              "x-scheme-handler/http"
+              "x-scheme-handler/https"
+              "x-scheme-handler/about"
+              "x-scheme-handler/unknown"
+            ];
           };
         };
       };
-      wlr = {
+    };
+
+    services.dbus.enable = true;
+
+    xdg = {
+      mime = {
         enable = true;
+        defaultApplications = {
+          "application/pdf" = ["url-handler.desktop"];
+          "application/x-pdf" = ["url-handler.desktop"];
+
+          "text/html" = ["url-handler.desktop"];
+          "text/xml" = ["url-handler.desktop"];
+          "x-scheme-handler/http" = ["url-handler.desktop"];
+          "x-scheme-handler/https" = ["url-handler.desktop"];
+          "x-scheme-handler/about" = ["url-handler.desktop"];
+          "x-scheme-handler/unknown" = ["url-handler.desktop"];
+        };
       };
-      config = {
-        common = {
-          # NOTE: The next entry is supposedly needed for gtk based apps <2023-08-31>
-          default = ["wlr" "gtk"];
-          "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
+
+      portal = {
+        enable = true;
+        wlr = {
+          enable = true;
         };
+        config = {
+          common = {
+            # NOTE: The next entry is supposedly needed for gtk based apps <2023-08-31>
+            default = ["wlr" "gtk"];
+            "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
+          };
 
-        # TODO: Also activate, when on another wlr-based compositor <2023-11-25>
-        river = {
-          default = ["wlr" "gtk"];
-          "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
+          # TODO: Also activate, when on another wlr-based compositor <2023-11-25>
+          river = {
+            default = ["wlr" "gtk"];
+            "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
+          };
         };
+
+        extraPortals = [
+          pkgs.xdg-desktop-portal-gtk
+          pkgs.xdg-desktop-portal-wlr
+          pkgs.xdg-desktop-portal-termfilechooser
+        ];
       };
-      extraPortals = [
-        pkgs.xdg-desktop-portal-gtk
-        pkgs.xdg-desktop-portal-wlr
-        pkgs_tfc.xdg-desktop-portal-termfilechooser
+    };
+
+    systemd.user.services.xdg-desktop-portal-termfilechooser = {
+      serviceConfig.ExecStart = [
+        ""
+        "${pkgs.xdg-desktop-portal-termfilechooser}/libexec/xdg-desktop-portal-termfilechooser --loglevel=TRACE"
       ];
     };
   };
-  # TODO: mime = {};
 }
diff --git a/modules/by-name/xd/xdg/scripts/lf-wrapper.sh b/modules/by-name/xd/xdg/scripts/lf-wrapper.sh
new file mode 100755
index 00000000..6a5c5295
--- /dev/null
+++ b/modules/by-name/xd/xdg/scripts/lf-wrapper.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# This wrapper script is invoked by xdg-desktop-portal-termfilechooser.
+#
+# For more information about input/output arguments read `xdg-desktop-portal-termfilechooser(5)`
+
+set -ex
+
+multiple="$1"
+directory="$2"
+save="$3"
+path="$4"
+out="$5"
+
+# echo > /tmp/stdout
+# echo > /tmp/stderr
+#
+# exec 1>> /tmp/stdout
+# exec 2>> /tmp/stderr
+
+if [ "$save" = "1" ]; then
+    # save a file
+    set -- -selection-path="$out" -command='set promptfmt "Select the file to write to %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$path"
+elif [ "$directory" = "1" ]; then
+    # upload files from a directory
+    set -- -last-dir-path="$out" -command='set dironly' -command='set promptfmt "Select directory (quit in dir to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$path"
+elif [ "$multiple" = "1" ]; then
+    # upload multiple files
+    set -- -selection-path="$out" -command='set promptfmt "Select file(s) (open file to select it; <Space> to select multiple) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$path"
+else
+    # upload only 1 file
+    set -- -selection-path="$out" -command='set promptfmt "Select file (open file to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$path"
+fi
+
+alacritty --title 'floating please' -e lf "$@"
+
+# Delete the left recommended file, if we did not actually save anything.
+if [ "$save" = "1" ] && ! [ -s "$out" ]; then
+    rm "$path"
+fi
diff --git a/modules/by-name/xd/xdg/scripts/lf_wrapper.sh b/modules/by-name/xd/xdg/scripts/lf_wrapper.sh
deleted file mode 100755
index 16603fe4..00000000
--- a/modules/by-name/xd/xdg/scripts/lf_wrapper.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# This wrapper script is invoked by xdg-desktop-portal-termfilechooser.
-#
-# Inputs:
-# 1. "1" if multiple files can be chosen, "0" otherwise.
-# 2. "1" if a directory should be chosen, "0" otherwise.
-# 3. "0" if opening files was requested, "1" if writing to a file was
-#    requested. For example, when uploading files in Firefox, this will be "0".
-#    When saving a web page in Firefox, this will be "1".
-# 4. If writing to a file, this is recommended path provided by the caller. For
-#    example, when saving a web page in Firefox, this will be the recommended
-#    path Firefox provided, such as "~/Downloads/webpage_title.html".
-#    Note that if the path already exists, we keep appending "_" to it until we
-#    get a path that does not exist.
-# 5. The output path, to which results should be written.
-#
-# Output:
-# The script should print the selected paths to the output path (argument #5),
-# one path per line.
-# If nothing is printed, then the operation is assumed to have been canceled.
-
-multiple="$1"
-directory="$2"
-save="$3"
-recommended_path="$4"
-out="$5"
-
-# echo > /tmp/stdout
-# echo > /tmp/stderr
-#
-# exec 1>> /tmp/stdout
-# exec 2>> /tmp/stderr
-
-cmd="$(command -v lf)"
-termcmd="${TERMINAL:-$(command -v alacritty)}"
-
-if [ "$save" = "1" ]; then
-    set -- -selection-path="$out" -command='set promptfmt "Select the file to write to %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"' "$recommended_path"
-    cat <<EOF >"$recommended_path"
-xdg-desktop-portal-termfilechooser saving files tutorial
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!                 === WARNING! ===                 !!!
-!!! The contents of *whatever* file you open last in !!!
-!!!            lf will be *overwritten*!             !!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-Instructions:
-1) Move this file wherever you want.
-2) Rename the file if needed.
-3) Confirm your selection by opening the file, for
-   example by pressing <Enter>.
-
-Notes:
-1) This file is provided for your convenience. You
-   could delete it and choose another file to overwrite
-   that, for example.
-2) If you quit lf without opening a file, this file
-   will be removed and the save operation aborted.
-EOF
-
-elif [ "$directory" = "1" ]; then
-    set -- -selection-path="$out" -command='set dironly' -command='set promptfmt "Select directory (quit in dir to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"'
-elif [ "$multiple" = "1" ]; then
-    set -- -selection-path="$out" -command='set promptfmt "Select file(s) (open file to select it; <Space> to select multiple) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"'
-else
-    set -- -selection-path="$out" -command='set promptfmt "Select file (open file to select it) %S \033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"'
-fi
-
-"$termcmd" --title 'floating please' -e "$cmd" "$@"
-
-if [ "$save" = "1" ] && [ ! -s "$out" ]; then
-    rm "$recommended_path"
-fi
-# vim: ft=sh
diff --git a/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh b/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh
deleted file mode 100755
index e148bf19..00000000
--- a/modules/by-name/xd/xdg/scripts/ranger_wrapper.sh
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-# This wrapper script is invoked by xdg-desktop-portal-termfilechooser.
-#
-# Inputs:
-# 1. "1" if multiple files can be chosen, "0" otherwise.
-# 2. "1" if a directory should be chosen, "0" otherwise.
-# 3. "0" if opening files was requested, "1" if writing to a file was
-#    requested. For example, when uploading files in Firefox, this will be "0".
-#    When saving a web page in Firefox, this will be "1".
-# 4. If writing to a file, this is recommended path provided by the caller. For
-#    example, when saving a web page in Firefox, this will be the recommended
-#    path Firefox provided, such as "~/Downloads/webpage_title.html".
-#    Note that if the path already exists, we keep appending "_" to it until we
-#    get a path that does not exist.
-# 5. The output path, to which results should be written.
-#
-# Output:
-# The script should print the selected paths to the output path (argument #5),
-# one path per line.
-# If nothing is printed, then the operation is assumed to have been canceled.
-
-multiple="$1"
-directory="$2"
-save="$3"
-path="$4"
-out="$5"
-
-cmd="$(command -v ranger)"
-termcmd="${TERMCMD:-$(command -v kitty)}"
-
-if [ "$save" = "1" ]; then
-    set -- --choosefile="$out" --cmd='echo Select save path (see tutorial in preview pane; try pressing zv or zp if no preview)' "$path"
-    printf '%s' 'xdg-desktop-portal-termfilechooser saving files tutorial
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!                 === WARNING! ===                 !!!
-!!! The contents of *whatever* file you open last in !!!
-!!! ranger will be *overwritten*!                    !!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-Instructions:
-1) Move this file wherever you want.
-2) Rename the file if needed.
-3) Confirm your selection by opening the file, for
-   example by pressing <Enter>.
-
-Notes:
-1) This file is provided for your convenience. You
-   could delete it and choose another file to overwrite
-   that, for example.
-2) If you quit ranger without opening a file, this file
-   will be removed and the save operation aborted.
-' >"$path"
-elif [ "$directory" = "1" ]; then
-    set -- --choosedir="$out" --show-only-dirs --cmd="echo Select directory (quit in dir to select it)"
-elif [ "$multiple" = "1" ]; then
-    set -- --choosefiles="$out" --cmd="echo Select file(s) (open file to select it; <Space> to select multiple)"
-else
-    set -- --choosefile="$out" --cmd="echo Select file (open file to select it)"
-fi
-
-"$termcmd" -- "$cmd" "$@"
-if [ "$save" = "1" ] && [ ! -s "$out" ]; then
-    rm "$path"
-fi
diff --git a/modules/by-name/xd/xdg/scripts/url-handler.sh b/modules/by-name/xd/xdg/scripts/url-handler.sh
new file mode 100755
index 00000000..b3563349
--- /dev/null
+++ b/modules/by-name/xd/xdg/scripts/url-handler.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+project="$({
+    tskm projects list
+    printf "%s\n" nvim zathura
+} | rofi -sep "$(printf "\n")" -dmenu)"
+
+if [ "$project" = "nvim" ]; then
+    "$TERMINAL" -e nvim "$1"
+elif [ "$project" = "zathura" ]; then
+    zathura "$1"
+elif [ "$project" ]; then
+    tskm open project "$project" "$1"
+else
+    notify-send "(URL HANDLER) No project selected"
+    exit 1
+fi
+
+# vim: ft=sh
diff --git a/modules/by-name/ya/yambar/config/config.yml b/modules/by-name/ya/yambar/config/config.yml
index 442135aa..14da18fd 100644
--- a/modules/by-name/ya/yambar/config/config.yml
+++ b/modules/by-name/ya/yambar/config/config.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 ---
 # Config file for yambar
 # Note that this may be version-dependent, this file is written for v1.8.0
diff --git a/modules/by-name/ya/yambar/module.nix b/modules/by-name/ya/yambar/module.nix
index 2d0f1e97..40edf978 100644
--- a/modules/by-name/ya/yambar/module.nix
+++ b/modules/by-name/ya/yambar/module.nix
@@ -1,6 +1,14 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
-  sysLib,
   pkgs,
   lib,
   ...
@@ -12,12 +20,11 @@
     dependencies,
     ...
   }:
-    sysLib.writeShellScript {
+    lib.getExe (pkgs.writeShellApplication {
       inherit name;
-      src = ./scripts/${name}.sh;
-      dependencies = dependencies ++ (builtins.attrValues {inherit (pkgs) dash;});
-    }
-    + "/bin/${name}";
+      text = builtins.readFile ./scripts/${name}.sh;
+      runtimeInputs = dependencies ++ (builtins.attrValues {inherit (pkgs) dash;});
+    });
 
   mkWrapper = bin: cmd:
     pkgs.writeShellScript cmd ''
diff --git a/modules/by-name/ya/yambar/scripts/disk.sh b/modules/by-name/ya/yambar/scripts/disk.sh
index a5547a74..4efe1384 100755
--- a/modules/by-name/ya/yambar/scripts/disk.sh
+++ b/modules/by-name/ya/yambar/scripts/disk.sh
@@ -1,5 +1,15 @@
 #! /usr/bin/env dash
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # shellcheck source=/dev/null
 SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
 
diff --git a/modules/by-name/ya/yambar/scripts/mpd_song_name.sh b/modules/by-name/ya/yambar/scripts/mpd_song_name.sh
index 7d294781..5c288d1a 100755
--- a/modules/by-name/ya/yambar/scripts/mpd_song_name.sh
+++ b/modules/by-name/ya/yambar/scripts/mpd_song_name.sh
@@ -1,5 +1,15 @@
 #!/usr/bin/env dash
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # shellcheck source=/dev/null
 SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
 
diff --git a/modules/by-name/ya/yambar/scripts/network.sh b/modules/by-name/ya/yambar/scripts/network.sh
index adfc93df..d642e6c7 100755
--- a/modules/by-name/ya/yambar/scripts/network.sh
+++ b/modules/by-name/ya/yambar/scripts/network.sh
@@ -1,5 +1,15 @@
 #! /usr/bin/env dash
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # shellcheck source=/dev/null
 SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
 
diff --git a/modules/by-name/ya/yambar/scripts/sound-volume.sh b/modules/by-name/ya/yambar/scripts/sound-volume.sh
index 8a98daf7..9d9f7be8 100755
--- a/modules/by-name/ya/yambar/scripts/sound-volume.sh
+++ b/modules/by-name/ya/yambar/scripts/sound-volume.sh
@@ -1,5 +1,15 @@
 #! /usr/bin/env dash
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # shellcheck source=/dev/null
 SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
 
diff --git a/modules/by-name/ya/yambar/settings/default.nix b/modules/by-name/ya/yambar/settings/default.nix
index 52c3d1f7..ebe17261 100644
--- a/modules/by-name/ya/yambar/settings/default.nix
+++ b/modules/by-name/ya/yambar/settings/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 # TODO: This should not do something depending on whether the host is a laptop or not. It
 # should instead match on monitor-width or scale factor. <2024-11-29>
 {
diff --git a/modules/by-name/yt/yt/config.toml b/modules/by-name/yt/yt/config.toml
index 981481d9..aecb74ba 100644
--- a/modules/by-name/yt/yt/config.toml
+++ b/modules/by-name/yt/yt/config.toml
@@ -1,2 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [download]
 max_cache_size = "5 GiB"
diff --git a/modules/by-name/yt/yt/input.conf b/modules/by-name/yt/yt/input.conf
index 10e453a1..68dad824 100644
--- a/modules/by-name/yt/yt/input.conf
+++ b/modules/by-name/yt/yt/input.conf
@@ -7,8 +7,8 @@ D script-message yt-description-local
 WHEEL_LEFT playlist-prev
 WHEEL_RIGHT playlist-next
 
-q script-message yt-mark-done-and-go-next
-Q script-message yt-mark-watch-later
+q script-message yt-mark-watched
+Q script-message yt-mark-picked
 r script-message yt-check-new-videos
 
 P quit
diff --git a/modules/by-name/yt/yt/input.conf.license b/modules/by-name/yt/yt/input.conf.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/yt/yt/input.conf.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/yt/yt/module.nix b/modules/by-name/yt/yt/module.nix
index b93feeb5..4e7e90fe 100644
--- a/modules/by-name/yt/yt/module.nix
+++ b/modules/by-name/yt/yt/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/yt/yt/mpv.conf b/modules/by-name/yt/yt/mpv.conf
index b6d2501f..52a40823 100644
--- a/modules/by-name/yt/yt/mpv.conf
+++ b/modules/by-name/yt/yt/mpv.conf
@@ -1,2 +1 @@
-speed=2.7
 volume=75
diff --git a/modules/by-name/yt/yt/mpv.conf.license b/modules/by-name/yt/yt/mpv.conf.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/by-name/yt/yt/mpv.conf.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/za/zathura/module.nix b/modules/by-name/za/zathura/module.nix
index 1c55be54..a332e313 100644
--- a/modules/by-name/za/zathura/module.nix
+++ b/modules/by-name/za/zathura/module.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh b/modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh
index 5126845a..a5d71939 100644
--- a/modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh
+++ b/modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh
@@ -1,4 +1,15 @@
 #! /usr/bin/env bash
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 print_message() {
 
     local messages
diff --git a/modules/by-name/zs/zsh/config/custom_cursor.zsh b/modules/by-name/zs/zsh/config/custom_cursor.zsh
index 071bb5fe..aa137173 100644
--- a/modules/by-name/zs/zsh/config/custom_cursor.zsh
+++ b/modules/by-name/zs/zsh/config/custom_cursor.zsh
@@ -1,5 +1,15 @@
 #!/usr/bin/env zsh
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 autoload -U add-zsh-hook
 autoload -U add-zle-hook-widget
 
diff --git a/modules/by-name/zs/zsh/config/edit_command_line.zsh b/modules/by-name/zs/zsh/config/edit_command_line.zsh
index 1d51a4e8..e14da5c6 100644
--- a/modules/by-name/zs/zsh/config/edit_command_line.zsh
+++ b/modules/by-name/zs/zsh/config/edit_command_line.zsh
@@ -1,5 +1,15 @@
 #! /usr/bin/env zsh
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 autoload -Uz edit-command-line
 
 wrapped_edit-command-line() {
diff --git a/modules/by-name/zs/zsh/config/keymaps/.safe.zsh b/modules/by-name/zs/zsh/config/keymaps/.safe.zsh
index ee3bfa32..b37d22f2 100644
--- a/modules/by-name/zs/zsh/config/keymaps/.safe.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps/.safe.zsh
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 bindkey -M .safe "^J" .accept-line
 bindkey -M .safe "^M" .accept-line
 bindkey -R -M .safe "^@"-"^I" .self-insert
diff --git a/modules/by-name/zs/zsh/config/keymaps/command.zsh b/modules/by-name/zs/zsh/config/keymaps/command.zsh
index 81ae6dda..e195ed4c 100644
--- a/modules/by-name/zs/zsh/config/keymaps/command.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps/command.zsh
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Keymap used in the vicmd `execute-named-cmd` mode
 bindkey -N command
 
diff --git a/modules/by-name/zs/zsh/config/keymaps/emacs.zsh b/modules/by-name/zs/zsh/config/keymaps/emacs.zsh
index b789faf5..1cbf77e9 100644
--- a/modules/by-name/zs/zsh/config/keymaps/emacs.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps/emacs.zsh
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 bindkey -N emacs
 
 bindkey -M emacs "^[A" accept-and-hold
diff --git a/modules/by-name/zs/zsh/config/keymaps/isearch.zsh b/modules/by-name/zs/zsh/config/keymaps/isearch.zsh
index db80bae8..d5e68f1b 100644
--- a/modules/by-name/zs/zsh/config/keymaps/isearch.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps/isearch.zsh
@@ -1,2 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Nothing?
 bindkey -N isearch
diff --git a/modules/by-name/zs/zsh/config/keymaps/vicmd.zsh b/modules/by-name/zs/zsh/config/keymaps/vicmd.zsh
index ceb4f348..acf3746d 100644
--- a/modules/by-name/zs/zsh/config/keymaps/vicmd.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps/vicmd.zsh
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 bindkey -N vicmd
 
 # Bind in string to out string
diff --git a/modules/by-name/zs/zsh/config/keymaps/viins.zsh b/modules/by-name/zs/zsh/config/keymaps/viins.zsh
index d215d190..3353956c 100644
--- a/modules/by-name/zs/zsh/config/keymaps/viins.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps/viins.zsh
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 bindkey -N viins
 
 # Completion Debugging
diff --git a/modules/by-name/zs/zsh/config/keymaps/viopp.zsh b/modules/by-name/zs/zsh/config/keymaps/viopp.zsh
index 8b291d00..3dd900f8 100644
--- a/modules/by-name/zs/zsh/config/keymaps/viopp.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps/viopp.zsh
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 bindkey -N viopp
 
 bindkey -M viopp "t" down-line
diff --git a/modules/by-name/zs/zsh/config/keymaps/visual.zsh b/modules/by-name/zs/zsh/config/keymaps/visual.zsh
index c09cd578..73191d94 100644
--- a/modules/by-name/zs/zsh/config/keymaps/visual.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps/visual.zsh
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 bindkey -N visual
 
 bindkey -M visual "^[" deactivate-region
diff --git a/modules/by-name/zs/zsh/config/keymaps_end.zsh b/modules/by-name/zs/zsh/config/keymaps_end.zsh
index 2e973de4..2ce403a5 100644
--- a/modules/by-name/zs/zsh/config/keymaps_end.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps_end.zsh
@@ -1,2 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Use the vi imitation keymap as default
 bindkey -A viins main
diff --git a/modules/by-name/zs/zsh/config/keymaps_start.zsh b/modules/by-name/zs/zsh/config/keymaps_start.zsh
index 2504e799..dfae8dcc 100644
--- a/modules/by-name/zs/zsh/config/keymaps_start.zsh
+++ b/modules/by-name/zs/zsh/config/keymaps_start.zsh
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Delete all default keymaps (with the exception of .safe)
 bindkey -D command emacs isearch main vicmd viins viopp visual
 
diff --git a/modules/by-name/zs/zsh/config/zsh-init.zsh b/modules/by-name/zs/zsh/config/zsh-init.zsh
index aac344dc..740fc44b 100644
--- a/modules/by-name/zs/zsh/config/zsh-init.zsh
+++ b/modules/by-name/zs/zsh/config/zsh-init.zsh
@@ -1,5 +1,15 @@
 #!/usr/bin/env zsh
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Display current tasks
 [ -z "$NVIM" ] && task next
 
diff --git a/modules/by-name/zs/zsh/module.nix b/modules/by-name/zs/zsh/module.nix
index 833da126..bf7e2a71 100644
--- a/modules/by-name/zs/zsh/module.nix
+++ b/modules/by-name/zs/zsh/module.nix
@@ -1,111 +1,143 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
-  shell_library,
   system,
+  pkgs,
   ...
 }: let
   cfg = config.soispha.programs.zsh;
-  homeConfig = config.home-manager.users.soispha;
+
+  zDotDir = ".config/zsh";
 
   sourceFile = path: "source ${path}\n";
+
+  extraFiles = builtins.concatStringsSep "\n" (
+    builtins.map (value:
+      if builtins.isPath value
+      then (sourceFile value)
+      else value) (
+      builtins.attrValues cfg.integrations
+    )
+  );
 in {
   options.soispha.programs.zsh = {
     enable = lib.mkEnableOption "zsh";
-  };
-
-  config.home-manager.users.soispha = lib.mkIf cfg.enable {
-    home.sessionPath = [];
-
-    programs.zsh = {
-      enable = true;
-      enableCompletion = true;
-      autosuggestion = {
-        enable = true;
-        strategy = [];
-      };
-      syntaxHighlighting.enable = true;
 
-      autocd = true;
+    integrations = lib.mkOption {
+      type = lib.types.attrsOf (lib.types.either lib.types.path lib.types.str);
+      example = ''
+        {
+          atuin = ./integrations/atuin.zsh;
+        }
+      '';
+      default = {};
+    };
+  };
 
-      # Must be relative to the users home directory (for whatever reason)
-      # Thus no `${homeConfig.xdg.configHome}`
-      dotDir = ".config/zsh";
+  config = lib.mkIf cfg.enable {
+    environment.variables = {
+      ZDOTDIR = "${config.home-manager.users.soispha.home.homeDirectory}/${zDotDir}";
+    };
 
-      # TODO: Remove the whole history and replace it completely with `atuin` <2024-10-21>
-      history = {
-        path = "/dev/null";
-        # save = 0; # number of lines to save
-        # size = 0; # number of lines to keep
-        # share = false; # share between sessions
-      };
+    home-manager.users.soispha = {
+      home.sessionPath = lib.mkForce [];
 
-      loginExtra =
-        # bash
-        ''
-          setopt AUTO_CD
-          setopt AUTO_PUSHD
-          setopt CHASE_DOTS
-
-          setopt ALWAYS_TO_END
-
-          setopt EXTENDED_HISTORY
-          setopt HIST_ALLOW_CLOBBER
-          setopt HIST_VERIFY
-          setopt HIST_FCNTL_LOCK
-          setopt APPEND_HISTORY
-
-          setopt DVORAK
-          setopt CORRECT
-
-          setopt PROMPT_SUBST
-          setopt TRANSIENT_RPROMPT # maybe?
-
-          setopt COMBINING_CHARS
-          setopt VI
-        '';
-
-      initExtraFirst =
-        sourceFile ./config/zsh-init.zsh
-        + ''
-          SHELL_LIBRARY_VERSION="2.1.2" source ${shell_library.rawLib.${system}}
-        '';
-
-      initExtra = let
-        start = lib.modules.mkBefore (
-          # NOTE: This must be before the insult, as we otherwise override the previous handler <2024-02-28>
-          sourceFile ./config/command_not_found/command_not_found.sh
-          + sourceFile ./config/command_not_found/command_not_found_insult.sh
-          + sourceFile ./config/custom_cursor.zsh
-          + sourceFile ./config/edit_command_line.zsh
-          + sourceFile ./plugins/zsh-history-substring-search.zsh
-        );
-        end = lib.modules.mkAfter (
-          sourceFile ./config/keymaps_start.zsh
-          + sourceFile ./config/keymaps/command.zsh
-          + sourceFile ./config/keymaps/emacs.zsh
-          + sourceFile ./config/keymaps/isearch.zsh
-          + sourceFile ./config/keymaps/vicmd.zsh
-          + sourceFile ./config/keymaps/viins.zsh
-          + sourceFile ./config/keymaps/viopp.zsh
-          + sourceFile ./config/keymaps/visual.zsh
-          + sourceFile ./config/keymaps_end.zsh
-        );
-      in
-        lib.modules.mkMerge
-        [
-          start
-          end
-        ];
-
-      localVariables = {
-        HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND = "bg=cyan,fg=white";
-        HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND = "fg=red,underline,standout,bold";
-      };
+      # This just includes a `source ~/.config/zsh/.zshenv`, because home-manger by-default
+      # can't access the root `/etc/zshenv`. We can and thus, we can remove this file.
+      home.file.".zshenv".enable = false;
 
-      shellAliases = {
-        ll = ". ll";
-        lm = ". lm";
+      programs.zsh = {
+        enable = true;
+        enableCompletion = true;
+        autosuggestion = {
+          enable = true;
+          strategy = [];
+        };
+        syntaxHighlighting.enable = true;
+
+        autocd = true;
+
+        # Must be relative to the users home directory (for whatever reason)
+        # Thus no `${homeConfig.xdg.configHome}`
+        dotDir = zDotDir;
+
+        # TODO: Remove the whole history and replace it completely with `atuin` <2024-10-21>
+        history = {
+          path = "/dev/null";
+          # save = 0; # number of lines to save
+          # size = 0; # number of lines to keep
+          # share = false; # share between sessions
+        };
+
+        loginExtra =
+          # bash
+          ''
+            setopt AUTO_CD
+            setopt AUTO_PUSHD
+            setopt CHASE_DOTS
+
+            setopt ALWAYS_TO_END
+
+            setopt EXTENDED_HISTORY
+            setopt HIST_ALLOW_CLOBBER
+            setopt HIST_VERIFY
+            setopt HIST_FCNTL_LOCK
+            setopt APPEND_HISTORY
+
+            setopt DVORAK
+            setopt CORRECT
+
+            setopt PROMPT_SUBST
+            setopt TRANSIENT_RPROMPT # maybe?
+
+            setopt COMBINING_CHARS
+            setopt VI
+          '';
+
+        initContent = let
+          start = lib.modules.mkBefore (
+            sourceFile ./config/zsh-init.zsh
+            + sourceFile ./config/custom_cursor.zsh
+            + sourceFile ./config/edit_command_line.zsh
+            + sourceFile ./plugins/zsh-history-substring-search.zsh
+          );
+          end = lib.modules.mkAfter (
+            # NOTE(@bpeetz): Put this here, so that command handler in `extraFiles`
+            # are not overriding this. <2025-05-16>
+            sourceFile ./config/command_not_found/command_not_found_insult.sh
+            + sourceFile ./config/keymaps_start.zsh
+            + sourceFile ./config/keymaps/command.zsh
+            + sourceFile ./config/keymaps/emacs.zsh
+            + sourceFile ./config/keymaps/isearch.zsh
+            + sourceFile ./config/keymaps/vicmd.zsh
+            + sourceFile ./config/keymaps/viins.zsh
+            + sourceFile ./config/keymaps/viopp.zsh
+            + sourceFile ./config/keymaps/visual.zsh
+            + sourceFile ./config/keymaps_end.zsh
+          );
+        in
+          lib.modules.mkMerge
+          [
+            start
+
+            extraFiles
+
+            end
+          ];
+
+        localVariables = {
+          HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND = "bg=cyan,fg=white";
+          HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND = "fg=red,underline,standout,bold";
+        };
       };
     };
   };
diff --git a/modules/by-name/zs/zsh/plugins/zsh-history-substring-search.zsh b/modules/by-name/zs/zsh/plugins/zsh-history-substring-search.zsh
index 4314b784..cc2b6e98 100644
--- a/modules/by-name/zs/zsh/plugins/zsh-history-substring-search.zsh
+++ b/modules/by-name/zs/zsh/plugins/zsh-history-substring-search.zsh
@@ -1,46 +1,25 @@
 #!/usr/bin/env zsh
-##############################################################################
-# Original Source before 2024 modifications:
-# https://github.com/zsh-users/zsh-history-substring-search/blob/87ce96b1862928d84b1afe7c173316614b30e301/zsh-history-substring-search.zsh
+
+# nixos-config - My current NixOS configuration
 #
 # Copyright (c) 2009 Peter Stephenson
 # Copyright (c) 2011 Guido van Steen
-# Copyright (c) 2011 Suraj N. Kurapati
 # Copyright (c) 2011 Sorin Ionescu
+# Copyright (c) 2011 Suraj N. Kurapati
 # Copyright (c) 2011 Vincent Guerci
 # Copyright (c) 2016 Geza Lore
 # Copyright (c) 2017 Bengt Brodersen
-# Copyright (c) 2024 Benedikt Peetz
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
+# Copyright (c) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
 #
-#  * Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
+# This file is part of my nixos-config.
 #
-#  * Redistributions in binary form must reproduce the above
-#    copyright notice, this list of conditions and the following
-#    disclaimer in the documentation and/or other materials provided
-#    with the distribution.
-#
-#  * Neither the name of the FIZSH nor the names of its contributors
-#    may be used to endorse or promote products derived from this
-#    software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-##############################################################################
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# Original Source before 2024 modifications:
+# https://github.com/zsh-users/zsh-history-substring-search/blob/87ce96b1862928d84b1afe7c173316614b30e301/zsh-history-substring-search.zsh
 
 #-----------------------------------------------------------------------------
 # declare global configuration variables
diff --git a/modules/home.legacy/files/wallpaper/abstract-nord.png b/modules/common/abstract-nord.png
index 5ef498bf..5ef498bf 100644
--- a/modules/home.legacy/files/wallpaper/abstract-nord.png
+++ b/modules/common/abstract-nord.png
Binary files differdiff --git a/modules/common/abstract-nord.png.license b/modules/common/abstract-nord.png.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/common/abstract-nord.png.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/common/default.nix b/modules/common/default.nix
new file mode 100644
index 00000000..aadb22bd
--- /dev/null
+++ b/modules/common/default.nix
@@ -0,0 +1,298 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+# This file contains common configuration applied to every host.
+# It should only `enable` options defined in the `modules/by-name` directory.
+{
+  config,
+  pkgs,
+  lib,
+  # Needed for nixos-shell
+  libraries,
+  modules,
+  openPRsNixpkgs,
+  packageSets,
+  system,
+  self,
+  externalDependencies,
+  externalBinaries,
+  ...
+}: {
+  soispha = {
+    age.enable = true;
+    boot.enable = true;
+    cleanup.enable = true;
+    documentation.enable = true;
+
+    fonts = {
+      enable = true;
+      enableEmoji = true;
+    };
+
+    hardware = {
+      enable = lib.mkDefault true;
+    };
+    home-manager.enable = true;
+    impermanence = {
+      enable = true;
+
+      directories = [
+        "/etc/nixos"
+        "/var/lib/systemd"
+      ];
+    };
+
+    nixos-shell = {
+      enable = lib.mkDefault true;
+      configuration = {
+        specialArgs = {
+          inherit
+            libraries
+            modules
+            ;
+        };
+        value = lib.mkMerge [
+          {
+            _module.args = {
+              inherit
+                # extra package sources
+                openPRsNixpkgs
+                packageSets
+                # extra information
+                system
+                # nix registry
+                self
+                externalDependencies
+                # bins
+                # TODO: Integrate these into `pkgs/by-name` <2024-05-22>
+                externalBinaries
+                ;
+            };
+          }
+
+          {
+            require = [
+              ./nixos_shell_configuration.nix
+
+              ../../modules
+              ../../modules/common
+            ];
+          }
+        ];
+      };
+      mounts = {};
+    };
+
+    polkit.enable = true;
+    power.enable = true;
+    xdg.enable = true;
+
+    services = {
+      adb = {
+        enable = true;
+        user = "soispha";
+      };
+      backup = {
+        storagebox = {
+          enable = lib.mkDefault true;
+          user = "u459143-sub1";
+        };
+        local = {
+          enable = lib.mkDefault true;
+        };
+      };
+      fwupd.enable = true;
+      mako.enable = true;
+      mpd = {
+        enable = true;
+        directories = let
+          data = "${config.home-manager.users.soispha.xdg.dataHome}/mpd";
+        in {
+          inherit data;
+          playlists = "${data}/playlists";
+          runtime = "/run/user/${builtins.toString config.users.users.soispha.uid}/mpd";
+          music = config.home-manager.users.soispha.programs.beets.settings.directory;
+        };
+        mpc = {
+          enable = true;
+          beetsPkg = config.home-manager.users.soispha.programs.beets.package;
+        };
+      };
+      ollama.enable = false;
+      postgresql.enable = false;
+      printing.enable = true;
+      scanning.enable = true;
+      snapper.enable = true;
+      water-reminder.enable = true;
+      systemDiff.enable = true;
+      unison = {
+        enable = lib.mkDefault true;
+
+        foreign.userName = "soispha";
+        dataDir = "${config.home-manager.users.soispha.xdg.dataHome}/unison";
+        userSourceDir = "/srv/home/soispha";
+        pathsToIgnore = let
+          extractTarget = attr: "~/${attr.target}";
+          homeManagerSymlinks =
+            builtins.map extractTarget
+            (builtins.attrValues
+              config.home-manager.users.soispha.home.file);
+        in
+          [
+            # TODO(@bpeetz): Move these to their respective modules <2025-05-09>
+            # Already synchronized by TaskChampion sync server
+            "~/.local/share/task"
+            # Already synchronized by atuin sync server
+            "~/.local/share/atuin"
+            # Already synchronized by mbsync
+            "~/.local/share/maildir"
+
+            # Should not be synchronized
+            "~/.local/share/unison"
+
+            # These are just to big to be synchronized (# TODO: Work around that <2024-08-31> )
+            "~/media/music"
+            "~/.local/share/Steam"
+          ]
+          ++ homeManagerSymlinks;
+
+        pathsToSync = [
+          "~/.local/state/mpv"
+          "~/.local/state/nvim"
+          "~/.local/share"
+          "~/.local/.Trash-1000"
+
+          "~/.mozilla/firefox"
+
+          "~/media"
+          "~/school"
+          "~/repos"
+        ];
+      };
+    };
+
+    programs = {
+      i3bar-river.enable = true;
+      i3status-rust.enable = true;
+
+      nvim = {
+        enable = true;
+        shell = pkgs.zsh;
+      };
+      atuin = {
+        enable = true;
+        enableAge = lib.mkDefault true;
+      };
+      cargo.enable = true;
+      direnv.enable = true;
+      git.enable = true;
+      imv.enable = true;
+      less.enable = true;
+      lf.enable = true;
+      gpg.enable = true;
+      river = {
+        enable = lib.mkDefault true;
+        init = {
+          rules = [
+            {
+              app-id = "float";
+              title = "*";
+              action = "float";
+            }
+            {
+              app-id = "mpv";
+              title = "*";
+              action = "float";
+            }
+            {
+              app-id = "ModernGL";
+              title = "*";
+              action = "float";
+            }
+            {
+              app-id = "*";
+              title = "Manim Slides";
+              action = "float";
+            }
+            {
+              app-id = "*";
+              title = "floating please";
+              action = "float";
+            }
+
+            {
+              app-id = "*";
+              title = "*";
+              action = "ssd";
+            }
+            # This remove the focus border around Firefox (which is useful because the Firefox is nearly always in its own tag.)
+            {
+              app-id = "firefox";
+              title = "*";
+              action = "csd";
+            }
+          ];
+          generalSettings = {
+            # background
+            background-color = "0x002b36";
+            border-color-focused = "0x93a1a1";
+            border-color-unfocused = "0x586e75";
+
+            # keyboard repeat rate
+            set-repeat = ["50" "300"];
+
+            # Cursor
+            focus-follows-cursor = "normal";
+            # hide-cursor = ["timeout" "2000"];
+            hide-cursor = ["when-typing" "enabled"];
+            set-cursor-warp = "on-output-change";
+            xcursor-theme = ["Nordzy-cursors" "24"];
+          };
+          inputs = {
+            pointer-1133-49970-Logitech_Gaming_Mouse_G502 = [["pointer-accel" "0"] ["accel-profile" "none"]];
+            pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I = [["pointer-accel" "0"] ["accel-profile" "none"]];
+          };
+          backgroundStart = [
+            # TODO(@bpeetz): Move these to systemd units/their own modules <2025-05-18>
+            pkgs.gammastep
+
+            pkgs.mako
+            ["${lib.getExe pkgs.swaybg}" "--image" "${./abstract-nord.png}"]
+            pkgs.swayidle
+            pkgs.alacritty
+          ];
+        };
+      };
+      firefox.enable = true;
+      mpv.enable = true;
+      steam.enable = true;
+      ssh.enable = true;
+      swaylock.enable = true;
+      timewarrior.enable = true;
+      taskwarrior = {
+        enable = true;
+        enableAge = lib.mkDefault true;
+
+        hooks = import ./hooks {inherit pkgs lib config;};
+      };
+      tskm = {
+        enable = true;
+        projects = builtins.fromJSON (builtins.readFile ./projects.json);
+      };
+      nix-index.enable = true;
+      yambar.enable = false;
+      yt.enable = true;
+      zathura.enable = true;
+      zsh.enable = true;
+    };
+
+    sound.enable = true;
+    version.enable = true;
+  };
+}
diff --git a/modules/common/hooks/default.nix b/modules/common/hooks/default.nix
new file mode 100644
index 00000000..5b694039
--- /dev/null
+++ b/modules/common/hooks/default.nix
@@ -0,0 +1,17 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  pkgs,
+  lib,
+  config,
+}: {
+  sync-git-repos = config.lib.taskwarrior.mkHook "on-add" [pkgs.git] ./scripts/sync-git-repo.sh;
+  sync-git-repos-mod = config.lib.taskwarrior.mkHook "on-modify" [pkgs.git] ./scripts/sync-git-repo.sh;
+}
diff --git a/modules/common/hooks/scripts/sync-git-repo.sh b/modules/common/hooks/scripts/sync-git-repo.sh
new file mode 100755
index 00000000..fe0d0085
--- /dev/null
+++ b/modules/common/hooks/scripts/sync-git-repo.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+task_data="$(task _get rc.data.location)"
+[ "$task_data" ] || die "Taskwarrior should have a location set"
+
+cd "$task_data" || die "(BUG?): Your data.location path is not accessable"
+
+[ -d ./.git/ ] || git init
+
+git add .
+git commit --message="chore: Update" --no-gpg-sign
+
+# vim: ft=sh
diff --git a/modules/common/nixos_shell_configuration.nix b/modules/common/nixos_shell_configuration.nix
new file mode 100644
index 00000000..1bec0145
--- /dev/null
+++ b/modules/common/nixos_shell_configuration.nix
@@ -0,0 +1,66 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{...}: {
+  soispha = {
+    networking = {
+      enable = true;
+      hostName = "lahmu";
+      mode = "systemd-networkd";
+    };
+
+    nixos-shell.enable = false;
+
+    nixpkgs = {
+      enable = true;
+      systemName = "x86_64-linux";
+    };
+
+    services = {
+      unison.enable = false;
+      backup = {
+        storagebox.enable = false;
+        local.enable = false;
+      };
+    };
+
+    programs = {
+      river.enable = false;
+
+      # We don't have access to the age secrets.
+      atuin.enableAge = false;
+      taskwarrior.enableAge = false;
+    };
+
+    locale = {
+      enable = true;
+      keyMap = "us";
+    };
+
+    users = {
+      enable = true;
+      enableDeprecatedPlugdev = true;
+
+      # Make logging in impossible.
+      # (This also removes root a obvious access-point from the virtual machine)
+      hashedPassword = "";
+    };
+  };
+
+  soispha = {
+    hardware = {
+      enable = false;
+    };
+
+    disks.enable = false;
+  };
+
+  # We run without state
+  # system.stateVersion = null;
+}
diff --git a/modules/common/projects.json b/modules/common/projects.json
new file mode 100644
index 00000000..48a10f03
--- /dev/null
+++ b/modules/common/projects.json
@@ -0,0 +1,132 @@
+{
+  "3d-printer": {
+    "prefix": "hardware"
+  },
+  "aoc": {
+    "prefix": "programming/advent_of_code"
+  },
+  "book": {
+    "prefix": "book"
+  },
+  "buy": {
+    "prefix": "buy",
+    "subprojects": {
+      "books": {},
+      "pc": {}
+    }
+  },
+  "camera": {
+    "prefix": "programming/zig"
+  },
+  "hardware": {
+    "prefix": "research"
+  },
+  "input": {
+    "prefix": "research",
+    "subprojects": {
+      "dotfiles": {},
+      "read-things": {}
+    }
+  },
+  "latex": {
+    "prefix": "programming/latex"
+  },
+  "me": {
+    "subprojects": {
+      "bank": {},
+      "google": {},
+      "health": {},
+      "sweden": {}
+    }
+  },
+  "possible-projects": {
+    "prefix": "research"
+  },
+  "presentation": {
+    "prefix": "research"
+  },
+  "school": {
+    "prefix": "research",
+    "subprojects": {
+      "biologie": {},
+      "chemie": {
+        "subprojects": {
+          "facharbeit": {}
+        }
+      },
+      "deutsch": {},
+      "english": {},
+      "extern": {
+        "subprojects": {
+          "bwinf": {},
+          "dsa": {}
+        }
+      },
+      "geographie": {},
+      "geschichte": {},
+      "infomatik": {},
+      "klausuren": {},
+      "latein": {},
+      "mathematik": {},
+      "musik": {},
+      "philosophie": {},
+      "physik": {},
+      "sozialkunde": {},
+      "sport": {}
+    }
+  },
+  "server": {
+    "prefix": "config",
+    "subprojects": {
+      "b-peetz": {},
+      "blog": {},
+      "ci": {},
+      "email": {},
+      "nix-sync": {},
+      "sudo-less": {}
+    }
+  },
+  "serverphone": {
+    "prefix": "programming/rust"
+  },
+  "smartphone": {
+    "prefix": "hardware",
+    "subprojects": {
+      "airdrop": {},
+      "airplay": {}
+    }
+  },
+  "system": {
+    "prefix": "config",
+    "subprojects": {
+      "backup": {},
+      "bar": {},
+      "email": {},
+      "firefox": {},
+      "gpg": {},
+      "keyboard": {},
+      "laptop": {},
+      "nvim": {},
+      "rss": {},
+      "shell": {},
+      "task": {},
+      "wm": {},
+      "youtube": {}
+    }
+  },
+  "timesinks": {
+    "subprojects": {
+      "games": {},
+      "music": {},
+      "netflix": {},
+      "youtube": {}
+    }
+  },
+  "trinitrix": {
+    "prefix": "programming/rust",
+    "subprojects": {
+      "documentation": {},
+      "testing": {}
+    }
+  }
+}
diff --git a/modules/common/projects.json.license b/modules/common/projects.json.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/common/projects.json.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/default.nix b/modules/default.nix
index 1df511a1..ef885a21 100644
--- a/modules/default.nix
+++ b/modules/default.nix
@@ -1,20 +1,21 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 # NOTE: This file **must** not depend on `pkgs`. This is because `pkgs` is defined in a
 # module imported by it, and thus would require infinite recursion.  <2024-10-18>
-{nixLib, ...}: let
+{libraries, ...}: let
   files =
     builtins.attrValues
-    (nixLib.mkByName {
+    (libraries.extra.mkByName {
       baseDirectory = ./by-name;
       fileName = "module.nix";
       finalizeFunction = name: value: value;
-
-      # TODO: Re-activate, when/if most modules have tests.  <2024-11-23>
-      # coImportsNameFunction = {
-      #   shard,
-      #   name,
-      # }:
-      #   ../tests/by-name + "/${shard}" + "/${name}" + "/test.nix";
-      # coImportsWarnMessageObject = "test";
     });
 in {
   imports = files;
diff --git a/modules/home.legacy/conf/alacritty/default.nix b/modules/home.legacy/conf/alacritty/default.nix
index 87d02959..493c4114 100644
--- a/modules/home.legacy/conf/alacritty/default.nix
+++ b/modules/home.legacy/conf/alacritty/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {lib, ...}: let
   config_file = ''
     ${lib.strings.fileContents ./toml/general.toml}
diff --git a/modules/home.legacy/conf/alacritty/toml/bell.toml b/modules/home.legacy/conf/alacritty/toml/bell.toml
index 912d08e3..821306cc 100644
--- a/modules/home.legacy/conf/alacritty/toml/bell.toml
+++ b/modules/home.legacy/conf/alacritty/toml/bell.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Bell
 #
 # The bell is rung every time the BEL control character is received.
diff --git a/modules/home.legacy/conf/alacritty/toml/colorscheme.toml b/modules/home.legacy/conf/alacritty/toml/colorscheme.toml
index f98a5b91..13c796c9 100644
--- a/modules/home.legacy/conf/alacritty/toml/colorscheme.toml
+++ b/modules/home.legacy/conf/alacritty/toml/colorscheme.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Nightfox Alacritty Colors
 ## name: carbonfox
 ## upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/alacritty.toml
diff --git a/modules/home.legacy/conf/alacritty/toml/cursor.toml b/modules/home.legacy/conf/alacritty/toml/cursor.toml
index d9cb93f4..6e633b5a 100644
--- a/modules/home.legacy/conf/alacritty/toml/cursor.toml
+++ b/modules/home.legacy/conf/alacritty/toml/cursor.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [cursor]
 blink_interval = 750
 blink_timeout = 5
diff --git a/modules/home.legacy/conf/alacritty/toml/env.toml b/modules/home.legacy/conf/alacritty/toml/env.toml
index fdd4e5d1..307f1f1d 100644
--- a/modules/home.legacy/conf/alacritty/toml/env.toml
+++ b/modules/home.legacy/conf/alacritty/toml/env.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [env]
 TERM = "alacritty"
 COLORTERM = "truecolor"
diff --git a/modules/home.legacy/conf/alacritty/toml/font.toml b/modules/home.legacy/conf/alacritty/toml/font.toml
index dd18a6fb..fd8b0b94 100644
--- a/modules/home.legacy/conf/alacritty/toml/font.toml
+++ b/modules/home.legacy/conf/alacritty/toml/font.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [font]
 builtin_box_drawing = true
 size = 12.0
diff --git a/modules/home.legacy/conf/alacritty/toml/general.toml b/modules/home.legacy/conf/alacritty/toml/general.toml
index 4651b51b..588d8ea0 100644
--- a/modules/home.legacy/conf/alacritty/toml/general.toml
+++ b/modules/home.legacy/conf/alacritty/toml/general.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Configuration for Alacritty, the GPU enhanced terminal emulator.
 
 [general]
diff --git a/modules/home.legacy/conf/alacritty/toml/hints.toml b/modules/home.legacy/conf/alacritty/toml/hints.toml
index 31d91a37..da18dc59 100644
--- a/modules/home.legacy/conf/alacritty/toml/hints.toml
+++ b/modules/home.legacy/conf/alacritty/toml/hints.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [hints]
 alphabet = "jfkdls;ahgurieowpq"
 
diff --git a/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml b/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml
index 8e0b1e13..f2a6eb55 100644
--- a/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml
+++ b/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [[keyboard.bindings]]
 action = "Paste"
 key = "P"
diff --git a/modules/home.legacy/conf/alacritty/toml/mouse.toml b/modules/home.legacy/conf/alacritty/toml/mouse.toml
index eba68edf..cbc9cd32 100644
--- a/modules/home.legacy/conf/alacritty/toml/mouse.toml
+++ b/modules/home.legacy/conf/alacritty/toml/mouse.toml
@@ -1,2 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [mouse]
 hide_when_typing = false
diff --git a/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml b/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml
index 1b281748..e566a452 100644
--- a/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml
+++ b/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [[mouse.bindings]]
 action = "Copy"
 mouse = "Middle"
diff --git a/modules/home.legacy/conf/alacritty/toml/scrolling.toml b/modules/home.legacy/conf/alacritty/toml/scrolling.toml
index ed7c22cf..09240872 100644
--- a/modules/home.legacy/conf/alacritty/toml/scrolling.toml
+++ b/modules/home.legacy/conf/alacritty/toml/scrolling.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [scrolling]
 history = 10000
 multiplier = 3
diff --git a/modules/home.legacy/conf/alacritty/toml/selection.toml b/modules/home.legacy/conf/alacritty/toml/selection.toml
index 60ea0495..ebc8c849 100644
--- a/modules/home.legacy/conf/alacritty/toml/selection.toml
+++ b/modules/home.legacy/conf/alacritty/toml/selection.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [selection]
 save_to_clipboard = false
 semantic_escape_chars = ",│`|:\"' ()[]{}<>\t"
diff --git a/modules/home.legacy/conf/alacritty/toml/window.toml b/modules/home.legacy/conf/alacritty/toml/window.toml
index 123b5b7a..edc9cf6e 100644
--- a/modules/home.legacy/conf/alacritty/toml/window.toml
+++ b/modules/home.legacy/conf/alacritty/toml/window.toml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [window]
 decorations = "none"
 decorations_theme_variant = "None"
diff --git a/modules/home.legacy/conf/alacritty/yaml/base.yml b/modules/home.legacy/conf/alacritty/yaml/base.yml
index 0791a60f..637d0d2e 100644
--- a/modules/home.legacy/conf/alacritty/yaml/base.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/base.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 ---
 # Configuration for Alacritty, the GPU enhanced terminal emulator.
 
diff --git a/modules/home.legacy/conf/alacritty/yaml/bell.yml b/modules/home.legacy/conf/alacritty/yaml/bell.yml
index bd071aeb..4331a121 100644
--- a/modules/home.legacy/conf/alacritty/yaml/bell.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/bell.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Bell
 #
 # The bell is rung every time the BEL control character is received.
diff --git a/modules/home.legacy/conf/alacritty/yaml/colors.yml b/modules/home.legacy/conf/alacritty/yaml/colors.yml
index 899c660a..05d2e0e6 100644
--- a/modules/home.legacy/conf/alacritty/yaml/colors.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/colors.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Colors (Tomorrow Night)
 colors:
   # Default colors
diff --git a/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml b/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml
index 4e0abfae..0b07fe80 100644
--- a/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Nightfox Alacritty Colors
 # Style: carbonfox
 # Upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/nightfox_alacritty.yml
diff --git a/modules/home.legacy/conf/alacritty/yaml/cursor.yml b/modules/home.legacy/conf/alacritty/yaml/cursor.yml
index ef700ebc..5a3946f2 100644
--- a/modules/home.legacy/conf/alacritty/yaml/cursor.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/cursor.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 cursor:
   # Cursor style
   style:
diff --git a/modules/home.legacy/conf/alacritty/yaml/debug.yml b/modules/home.legacy/conf/alacritty/yaml/debug.yml
index 2c391da2..e876d801 100644
--- a/modules/home.legacy/conf/alacritty/yaml/debug.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/debug.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 #debug:
   # Display the time it takes to redraw each frame.
   #render_timer: false
diff --git a/modules/home.legacy/conf/alacritty/yaml/env.yml b/modules/home.legacy/conf/alacritty/yaml/env.yml
index ee7528b7..585416a1 100644
--- a/modules/home.legacy/conf/alacritty/yaml/env.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/env.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Any items in the `env` entry below will be added as
 # environment variables. Some entries may override variables
 # set by alacritty itself.
diff --git a/modules/home.legacy/conf/alacritty/yaml/font.yml b/modules/home.legacy/conf/alacritty/yaml/font.yml
index a3fd3b1d..a711f231 100644
--- a/modules/home.legacy/conf/alacritty/yaml/font.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/font.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Font configuration
 font:
   # Normal (roman) font face
diff --git a/modules/home.legacy/conf/alacritty/yaml/hints.yml b/modules/home.legacy/conf/alacritty/yaml/hints.yml
index 8c35548b..b9d75378 100644
--- a/modules/home.legacy/conf/alacritty/yaml/hints.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/hints.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Hints
 #
 # Terminal hints can be used to find text or hyperlink in the visible part of
diff --git a/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml b/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml
index c8be747e..6bf31719 100644
--- a/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Key bindings
 #
 # Key bindings are specified as a list of objects. For example, this is the
diff --git a/modules/home.legacy/conf/alacritty/yaml/mouse.yml b/modules/home.legacy/conf/alacritty/yaml/mouse.yml
index 4bdb408b..c5d2acbb 100644
--- a/modules/home.legacy/conf/alacritty/yaml/mouse.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/mouse.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 mouse:
   # Click settings
   #
diff --git a/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml b/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml
index ab244d21..82e2b92b 100644
--- a/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Mouse bindings
 #
 # Mouse bindings are specified as a list of objects, much like the key
diff --git a/modules/home.legacy/conf/alacritty/yaml/scrolling.yml b/modules/home.legacy/conf/alacritty/yaml/scrolling.yml
index 50365627..0d108f76 100644
--- a/modules/home.legacy/conf/alacritty/yaml/scrolling.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/scrolling.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 scrolling:
   # Maximum number of lines in the scrollback buffer.
   # Specifying '0' will disable scrolling.
diff --git a/modules/home.legacy/conf/alacritty/yaml/selection.yml b/modules/home.legacy/conf/alacritty/yaml/selection.yml
index 5e5bd544..100118fc 100644
--- a/modules/home.legacy/conf/alacritty/yaml/selection.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/selection.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 selection:
   # This string contains all characters that are used as separators for
   # "semantic words" in Alacritty.
diff --git a/modules/home.legacy/conf/alacritty/yaml/shell.yml b/modules/home.legacy/conf/alacritty/yaml/shell.yml
index 04844dd0..4da99581 100644
--- a/modules/home.legacy/conf/alacritty/yaml/shell.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/shell.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # Shell
 #
 # You can set `shell.program` to the path of your favorite shell, e.g.
diff --git a/modules/home.legacy/conf/alacritty/yaml/window.yml b/modules/home.legacy/conf/alacritty/yaml/window.yml
index 7b89b6ed..2d4006ba 100644
--- a/modules/home.legacy/conf/alacritty/yaml/window.yml
+++ b/modules/home.legacy/conf/alacritty/yaml/window.yml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 window:
   # Window dimensions (changes require restart)
   #
diff --git a/modules/home.legacy/conf/beets/default.nix b/modules/home.legacy/conf/beets/default.nix
index 8d6277b7..de05ca24 100644
--- a/modules/home.legacy/conf/beets/default.nix
+++ b/modules/home.legacy/conf/beets/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
@@ -5,6 +14,16 @@
   ...
 }: let
   plugins = import ./plugins.nix {};
+
+  # TODO: Enable xtractor again <2025-03-29>
+  # package = pkgs.beets.override {
+  #   pluginOverrides = {
+  #     xtractor = {
+  #       enable = true;
+  #       propagatedBuildInputs = [pkgs.beetsExtraPlugins.xtractor];
+  #     };
+  #   };
+  package = pkgs.beets;
 in {
   imports = [
     ./plugins
@@ -12,14 +31,7 @@ in {
 
   programs.beets = {
     enable = true;
-    package = pkgs.beets.override {
-      pluginOverrides = {
-        xtractor = {
-          enable = true;
-          propagatedBuildInputs = [pkgs.beetsExtraPlugins.xtractor];
-        };
-      };
-    };
+    inherit package;
 
     settings = {
       library = "${config.xdg.dataHome}/beets/library.db";
diff --git a/modules/home.legacy/conf/beets/plugins.nix b/modules/home.legacy/conf/beets/plugins.nix
index bea2fefe..09eeac5b 100644
--- a/modules/home.legacy/conf/beets/plugins.nix
+++ b/modules/home.legacy/conf/beets/plugins.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}:
 # NOTE: This list is here and not split over the various plugin dirs, as we need a way to
 # specify the order plugins are loaded in. <2024-08-11>
@@ -12,7 +21,7 @@
   "mbsubmit"
 
   # Extract things from the music file
-  "xtractor"
+  # "xtractor"
 
   # Calculate replay gain
   "replaygain"
diff --git a/modules/home.legacy/conf/beets/plugins/badfiles/default.nix b/modules/home.legacy/conf/beets/plugins/badfiles/default.nix
index 33884785..505ecb5b 100644
--- a/modules/home.legacy/conf/beets/plugins/badfiles/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/badfiles/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   pkgs,
diff --git a/modules/home.legacy/conf/beets/plugins/default.nix b/modules/home.legacy/conf/beets/plugins/default.nix
index 3bea5ea8..65cd935c 100644
--- a/modules/home.legacy/conf/beets/plugins/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   imports = [
     ./badfiles
@@ -11,6 +20,6 @@
     ./play
     ./replaygain
     ./smartplaylist
-    ./xtractor
+    # ./xtractor
   ];
 }
diff --git a/modules/home.legacy/conf/beets/plugins/duplicates/default.nix b/modules/home.legacy/conf/beets/plugins/duplicates/default.nix
index c8a6c108..6ab08d55 100644
--- a/modules/home.legacy/conf/beets/plugins/duplicates/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/duplicates/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.beets.settings.duplicates = {
     keys = ["acoustid_fingerprint"];
diff --git a/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix b/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix
index b86b3a20..de37c4e8 100644
--- a/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/fuzzy/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.beets.settings.fuzzy = {
     # The prefix denoting that a search should be run in fuzzy mode
diff --git a/modules/home.legacy/conf/beets/plugins/ihate/default.nix b/modules/home.legacy/conf/beets/plugins/ihate/default.nix
index 145f5f8b..51cb6f11 100644
--- a/modules/home.legacy/conf/beets/plugins/ihate/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/ihate/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.beets.settings.ihate = {
     warn = [
diff --git a/modules/home.legacy/conf/beets/plugins/inline/default.nix b/modules/home.legacy/conf/beets/plugins/inline/default.nix
index 0dda8cfc..b5655028 100644
--- a/modules/home.legacy/conf/beets/plugins/inline/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/inline/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.beets.settings = {
     item_fields = {
diff --git a/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix b/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix
index d10ca49f..4d3dcfb0 100644
--- a/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/lastgenre/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.beets.settings.lastgenre = {
     prefer_specific = false;
diff --git a/modules/home.legacy/conf/beets/plugins/lyrics/default.nix b/modules/home.legacy/conf/beets/plugins/lyrics/default.nix
index 80544aea..4d566f0b 100644
--- a/modules/home.legacy/conf/beets/plugins/lyrics/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/lyrics/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.beets.settings.lyrics = {
     # Always fetch lyrics (and update them, if some were found)
diff --git a/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix b/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix
index b70f1c63..bdcb3721 100644
--- a/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/mbsubmit/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   pkgs,
diff --git a/modules/home.legacy/conf/beets/plugins/play/default.nix b/modules/home.legacy/conf/beets/plugins/play/default.nix
index 635848c0..9d26f16a 100644
--- a/modules/home.legacy/conf/beets/plugins/play/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/play/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   pkgs,
diff --git a/modules/home.legacy/conf/beets/plugins/replaygain/default.nix b/modules/home.legacy/conf/beets/plugins/replaygain/default.nix
index 611f3799..dd176541 100644
--- a/modules/home.legacy/conf/beets/plugins/replaygain/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/replaygain/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.beets.settings = {
     replaygain = {
diff --git a/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix b/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix
index b55c487c..9b52c1ad 100644
--- a/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/smartplaylist/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {config, ...}: {
   programs.beets.settings.smartplaylist = {
     relative_to = config.services.mpd.musicDirectory;
diff --git a/modules/home.legacy/conf/beets/plugins/xtractor/default.nix b/modules/home.legacy/conf/beets/plugins/xtractor/default.nix
index d4582c5f..0a54385e 100644
--- a/modules/home.legacy/conf/beets/plugins/xtractor/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/xtractor/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   pkgs,
diff --git a/modules/home.legacy/conf/beets/replace_override.yaml b/modules/home.legacy/conf/beets/replace_override.yaml
index 23d6ea55..aea5e54a 100644
--- a/modules/home.legacy/conf/beets/replace_override.yaml
+++ b/modules/home.legacy/conf/beets/replace_override.yaml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 ---
 replace:
     '[\\/]': _
diff --git a/modules/home.legacy/conf/btop/default.nix b/modules/home.legacy/conf/btop/default.nix
index 06b56ea7..ee835b65 100644
--- a/modules/home.legacy/conf/btop/default.nix
+++ b/modules/home.legacy/conf/btop/default.nix
@@ -1,4 +1,13 @@
-{config, ...}: {
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{...}: {
   programs.btop = {
     enable = true;
   };
diff --git a/modules/home.legacy/conf/dconf/default.nix b/modules/home.legacy/conf/dconf/default.nix
index dc439e1e..7aaf03a7 100644
--- a/modules/home.legacy/conf/dconf/default.nix
+++ b/modules/home.legacy/conf/dconf/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   # Also see:  https://github.com/gvolpe/dconf2nix
   dconf.settings = {
diff --git a/modules/home.legacy/conf/default.nix b/modules/home.legacy/conf/default.nix
index 328f4dab..622f32d5 100644
--- a/modules/home.legacy/conf/default.nix
+++ b/modules/home.legacy/conf/default.nix
@@ -1,13 +1,19 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   imports = [
     ./alacritty
     ./beets
     ./btop
     ./dconf
-    ./direnv
-    ./firefox
     ./gammastep
-    ./gpg
     ./gtk
     ./himalaya
     ./hyfetch
@@ -15,25 +21,16 @@
     ./keepassxc
     ./latexindent
     ./mail
-    ./mako
     ./mbsync
-    ./mpv
     ./mumble
     ./neomutt
-    ./nix-index
     ./npm
     ./prusa_slicer
     ./python
     ./rclone
     ./rofi
-    ./ssh
     ./starship
     ./swayidle
-    ./swaylock
-    ./taskwarrior
-    ./timewarrior
     ./tridactyl
-    ./xdg
-    ./ytcc
   ];
 }
diff --git a/modules/home.legacy/conf/direnv/default.nix b/modules/home.legacy/conf/direnv/default.nix
deleted file mode 100644
index 3a7b8add..00000000
--- a/modules/home.legacy/conf/direnv/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{...}: {
-  programs.direnv = {
-    enable = true;
-    nix-direnv.enable = true;
-  };
-}
diff --git a/modules/home.legacy/conf/firefox/config/bookmarks/default.nix b/modules/home.legacy/conf/firefox/config/bookmarks/default.nix
deleted file mode 100644
index c612bf4d..00000000
--- a/modules/home.legacy/conf/firefox/config/bookmarks/default.nix
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  lib,
-  pkgs,
-  ...
-}: let
-  bookmarks = [
-    {
-      name = "Feed - Piped";
-      url = "https://piped.video/feed";
-    }
-
-    {
-      name = "DeepL Translate";
-      url = "https://www.deepl.com/translator";
-    }
-
-    {
-      name = "Nix lib";
-      url = "https://teu5us.github.io/nix-lib.html";
-    }
-
-    {
-      name = "Nixpkgs manual";
-      url = "https://ryantm.github.io/nixpkgs/";
-    }
-  ];
-
-  mkBookmarksFile = (import ./lib.nix) {inherit lib pkgs;};
-  bookmarks_file = mkBookmarksFile bookmarks;
-in
-  bookmarks_file
diff --git a/modules/home.legacy/conf/firefox/config/bookmarks/lib.nix b/modules/home.legacy/conf/firefox/config/bookmarks/lib.nix
deleted file mode 100644
index d1d89dd2..00000000
--- a/modules/home.legacy/conf/firefox/config/bookmarks/lib.nix
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-  lib,
-  pkgs,
-}: bookmarks: let
-  indent = level:
-    lib.concatStringsSep "" (map (lib.const "  ") (lib.range 1 level));
-
-  bookmarkToHTML = indentLevel: bookmark: ''
-    ${indent indentLevel}<DT><A HREF="${
-      lib.escapeXML bookmark.url
-    }" ADD_DATE="0" LAST_MODIFIED="0">${lib.escapeXML bookmark.name}</A>'';
-
-  directoryToHTML = indentLevel: directory: ''
-    ${indent indentLevel}<DT>${
-      if directory.toolbar
-      then ''<H3 PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar''
-      else "<H3>${lib.escapeXML directory.name}"
-    }</H3>
-    ${indent indentLevel}<DL><p>
-    ${allItemsToHTML (indentLevel + 1) directory.bookmarks}
-    ${indent indentLevel}</p></DL>'';
-
-  itemToHTMLOrRecurse = indentLevel: item:
-    if item ? "url"
-    then bookmarkToHTML indentLevel item
-    else directoryToHTML indentLevel item;
-
-  allItemsToHTML = indentLevel: bookmarks:
-    lib.concatStringsSep "\n"
-    (map (itemToHTMLOrRecurse indentLevel) bookmarks);
-
-  bookmarkEntries = allItemsToHTML 1 bookmarks;
-in
-  pkgs.writeText "firefox-bookmarks.html" ''
-    <!DOCTYPE NETSCAPE-Bookmark-file-1>
-    <!-- This is an automatically generated file.
-      It will be read and overwritten.
-      DO NOT EDIT! -->
-    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
-    <TITLE>Bookmarks</TITLE>
-    <H1>Bookmarks Menu</H1>
-
-    <DL><p>
-        <DT><H3 ADD_DATE="0" LAST_MODIFIED="0" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar</H3>
-        <DL><p>
-        ${bookmarkEntries}
-        </DL><p>
-    </p></DL>
-  ''
diff --git a/modules/home.legacy/conf/firefox/config/extensions/native_messaging_hosts/default.nix b/modules/home.legacy/conf/firefox/config/extensions/native_messaging_hosts/default.nix
deleted file mode 100644
index 9aaa1682..00000000
--- a/modules/home.legacy/conf/firefox/config/extensions/native_messaging_hosts/default.nix
+++ /dev/null
@@ -1,15 +0,0 @@
-{pkgs, ...}:
-/*
-++ lib.optional (cfg.enableBrowserpass or false) (lib.getBin browserpass)
-++ lib.optional (cfg.enableBukubrow or false) bukubrow
-++ lib.optional (cfg.enableTridactylNative or false) tridactyl-native
-++ lib.optional (cfg.enableGnomeExtensions or false) gnome-browser-connector
-++ lib.optional (cfg.enableUgetIntegrator or false) uget-integrator
-++ lib.optional (cfg.enablePlasmaBrowserIntegration or false) plasma5Packages.plasma-browser-integration
-++ lib.optional (cfg.enableFXCastBridge or false) fx-cast-bridge
-++ lib.optional (cfg.enableKeePassXC or false) keepassxc
-*/
-with pkgs; [
-  tridactyl-native
-  keepassxc
-]
diff --git a/modules/home.legacy/conf/firefox/config/policies/default.nix b/modules/home.legacy/conf/firefox/config/policies/default.nix
deleted file mode 100644
index 02c740f6..00000000
--- a/modules/home.legacy/conf/firefox/config/policies/default.nix
+++ /dev/null
@@ -1,146 +0,0 @@
-{
-  config,
-  extensions,
-  ...
-}: let
-  locals = [
-    "en-CA"
-    "de"
-    "sv-SE"
-  ];
-  mkAllowedExtension = extension: {
-    name = extension.addonId;
-    value = {
-      installation_mode = "normal_installed";
-      updates_disabled = true;
-      inherit (extension) default_area;
-      install_url = "file://${builtins.fetchurl {
-        inherit
-          (extension)
-          url
-          sha256
-          ;
-      }}";
-    };
-  };
-  allowedExtensions =
-    builtins.listToAttrs
-    (builtins.map mkAllowedExtension (builtins.attrValues
-        extensions));
-
-  mkBlockedExtension = id: {
-    name = id;
-    value = {
-      install_mode = "blocked";
-    };
-  };
-  blockedExtensions = builtins.listToAttrs (builtins.map mkBlockedExtension [
-    # these are the default search engines
-    "addons-search-detection@mozilla.com"
-    "amazon@search.mozilla.org"
-    "bing@search.mozilla.org"
-    "ddg@search.mozilla.org"
-    "google@search.mozilla.org"
-    "wikipedia@search.mozilla.org"
-  ]);
-
-  language_packs = builtins.listToAttrs (builtins.map
-    (
-      lang: {
-        name = "langpack-${lang}@firefox.mozilla.org";
-        value = {
-          installation_mode = "normal_installed";
-          updates_disabled = true;
-          install_url = "https://releases.mozilla.org/pub/firefox/releases/${config.soispha.firefox.package_version}/linux-x86_64/xpi/${lang}.xpi";
-        };
-      }
-    )
-    locals);
-in {
-  # NOTE: See https://mozilla.github.io/policy-templates for documentation <2023-10-21>
-  policies = {
-    # NixOS manages this already
-    DisableAppUpdate = true;
-
-    DisableFirefoxAccounts = true;
-    DisableFirefoxScreenshots = true;
-
-    # KeepassXC does this for me
-    DisableMasterPasswordCreation = true;
-
-    # I use a self-hosted services for that
-    DisablePocket = true;
-
-    # I don't want to lose my data
-    DisableProfileRefresh = true;
-
-    DisableDeveloperTools = false;
-
-    DisplayBookmarksToolbar = "newtab";
-    DisplayMenuBar = "default-off";
-
-    DNSOverHTTPS = {
-      Enabled = true;
-      Locked = false;
-    };
-    # The concept of a "default browser" does not apply to my NixOS config
-    DontCheckDefaultBrowser = true;
-
-    EnableTrackingProtection = {
-      Value = true;
-      Locked = false;
-      Cryptomining = true;
-      Fingerprinting = true;
-      EmailTracking = true;
-    };
-
-    EncryptedMediaExtensions = {
-      # I want a _free_ config (and I can always just run another browser)
-      Enabled = false;
-      Locked = true;
-    };
-
-    ExtensionSettings =
-      {
-        "*" = {
-          # Blocking the extension install here, also blocks the 'about:debugging' page
-
-          # blocked_install_message = ''
-          #   You can't install a extension manually,
-          #   please specify it in your NixOS configuration
-          # '';
-          installation_mode = "allowed";
-        };
-      }
-      // allowedExtensions
-      // blockedExtensions
-      // language_packs;
-
-    ExtensionUpdate = false;
-
-    # TODO: Add handlers for the default file types <2023-10-21>
-    # Handlers = {
-    # };
-
-    HardwareAcceleration = true;
-
-    # Blocking the extension install here, also blocks the 'about:debugging' page
-    # InstallAddonsPermission = {
-    #   Allowed = [];
-    #   Default = false;
-    # };
-
-    # KeepassXC and such things
-    OfferToSaveLogins = false;
-    PasswordManagerEnabled = false;
-
-    PDFjs = {
-      Enabled = true;
-      # Don't honor documents right to be un-copy-able
-      EnablePermissions = false;
-    };
-
-    SearchBar = "unified";
-    RequestedLocales = locals;
-  };
-}
diff --git a/modules/home.legacy/conf/firefox/config/prefs/default.nix b/modules/home.legacy/conf/firefox/config/prefs/default.nix
deleted file mode 100644
index 80c6d274..00000000
--- a/modules/home.legacy/conf/firefox/config/prefs/default.nix
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  pkgs,
-  config,
-  user_js,
-  bookmarks,
-  ...
-}: let
-  user_js_override = pkgs.writeText "user.override.js" (builtins.readFile ./override.js);
-in
-  pkgs.runCommand "user.js" {} ''
-    mkdir $out;
-    cat "${user_js}/user.js" > $out/user.js;
-    cat "${user_js_override}" >> $out/user.js;
-
-    cat << EOF >> $out/user.js;
-    // My bookmarks
-    user_pref("browser.bookmarks.file", "${toString bookmarks}");
-    user_pref("browser.startup.homepage", "file:///home/dt/home.html"); // 0103 // TODO: add this from a flake
-    user_pref("browser.download.dir", "${config.xdg.userDirs.download}");
-    EOF
-  ''
diff --git a/modules/home.legacy/conf/firefox/config/prefs/override.js b/modules/home.legacy/conf/firefox/config/prefs/override.js
deleted file mode 100644
index bf874b33..00000000
--- a/modules/home.legacy/conf/firefox/config/prefs/override.js
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
-  0100: STARTUP
-  0200: GEOLOCATION / LANGUAGE / LOCALE
-  0300: QUIETER FOX
-  0400: SAFE BROWSING
-  0600: BLOCK IMPLICIT OUTBOUND
-  0700: DNS / DoH / PROXY / SOCKS / IPv6
-  0800: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS
-  0900: PASSWORDS
-  1000: DISK AVOIDANCE
-  1200: HTTPS (SSL/TLS / OCSP / CERTS / HPKP)
-  1400: FONTS
-  1600: HEADERS / REFERERS
-  1700: CONTAINERS
-  2000: PLUGINS / MEDIA / WEBRTC
-  2400: DOM (DOCUMENT OBJECT MODEL)
-  2600: MISCELLANEOUS
-  2700: ETP (ENHANCED TRACKING PROTECTION)
-  2800: SHUTDOWN & SANITIZING
-  4500: RFP (RESIST FINGERPRINTING)
-  5000: OPTIONAL OPSEC
-  5500: OPTIONAL HARDENING
-  6000: DON'T TOUCH
-  7000: DON'T BOTHER
-  8000: DON'T BOTHER: FINGERPRINTING
-  9000: NON-PROJECT RELATED
-  9999: DEPRECATED / REMOVED / LEGACY / RENAMED
-*/
-
-
-// restore session
-user_pref("browser.startup.page", 3); // 0102
-
-user_pref("browser.newtabpage.enabled", true); // 0104
-
-// disable the geoservice, TODO: don't know if I want this
-//user_pref("geo.provider.use_geoclue", false); // 0202
-
-// TODO: is this something useful?
-user_pref("datareporting.policy.dataSubmissionEnabled", true); // 0330
-
-// enable health reports
-user_pref("datareporting.healthreport.uploadEnabled", true); // 0331
-
-// Do I want to opt-out?
-user_pref("toolkit.telemetry.coverage.opt-out", false); // 0333
-
-// enables studies
-user_pref("app.shield.optoutstudies.enabled", true); // 0340
-
-// I guess that browsing protection is useful
-user_pref("browser.safebrowsing.downloads.remote.enabled", true); // 0403
-
-// TODO: does this (-> set to false) make things slower?
-user_pref("network.prefetch-next", true); // 0601
-
-// enable ipv6 because the rest of the system uses it
-user_pref("network.dns.disableIPv6", false); // 0701
-
-// TRR only
-user_pref("network.trr.mode", 3); // 0710
-
-// I trust my search engine
-user_pref("keyword.enabled", true); // 801
-user_pref("browser.search.suggest.enabled", true); // 0804
-user_pref("browser.urlbar.suggest.searches", true); // 0804
-// TODO: no idea what this does, enabling it
-user_pref("browser.urlbar.showSearchTerms.enabled", true); // 9004
-
-// prefetch urls, if the get auto completed
-user_pref("browser.urlbar.speculativeConnect.enabled", true); // 0805
-
-// Disable autoScrolling (clicking with the mouse wheel)
-user_pref("general.autoScroll", false);
-
-// add new tabs after the current one
-user_pref("browser.tabs.insertAfterCurrent", true);
-
-// TODO: I might want to enable this
-//user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); // 0807
-
-// TODO: enable form and search history?
-//user_pref("browser.formfill.enable", false); // 0810
-
-// disk cache should help performance
-user_pref("browser.cache.disk.enable", true); // 1001
-
-// store extra session data (form content, cookies and POST data) 0: everywhere
-user_pref("browser.sessionstore.privacy_level", 0); // 1003
-
-// Disable unsafe passive content (images) on https sites
-user_pref("security.mixed_content.block_display_content", true); // 1241
-
-// Disable the eme banner
-user_pref("browser.eme.ui.enabled", false); // 2022
-
-// Don't delete my precious temp files
-user_pref("browser.helperApps.deleteTempFileOnExit", false); // 2603
-
-// Download to the download dir
-user_pref("browser.download.useDownloadDir", true); // 2651
-
-// Open the download panel
-user_pref("browser.download.alwaysOpenPanel", true); // 2652
-
-// Block after custom ruleset
-user_pref("browser.contentblocking.category", "custom"); // 2701
-
-// set the custom settings // 7016
-user_pref("network.cookie.cookieBehavior", 1);
-user_pref("network.http.referer.disallowCrossSiteRelaxingDefault", true);
-user_pref("network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation", true);
-user_pref("privacy.partition.network_state.ocsp_cache", true);
-user_pref("privacy.query_stripping.enabled", true);
-user_pref("privacy.trackingprotection.enabled", true);
-user_pref("privacy.trackingprotection.socialtracking.enabled", true);
-user_pref("privacy.trackingprotection.cryptomining.enabled", true);
-user_pref("privacy.trackingprotection.fingerprinting.enabled", true);
-
-
-// I might want to change that, when it hinders session restore
-//user_pref("privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage", false); // 2720
-
-// I like my history very much!
-user_pref("privacy.sanitize.sanitizeOnShutdown", false); // 2810
-
-// The downsides (light theme + potential breakages):
-//user_pref("privacy.resistFingerprinting", true); // 4501
-user_pref("privacy.resistFingerprinting.letterboxing", false); // 4504
-
-// I would like to keep my gl, even in the web
-user_pref("webgl.disabled", false); // 4520
-
-// I like my service workers and am using a service using them.
-user_pref("dom.serviceWorkers.enabled", true); // 7017
-
-// I've got a password manager already
-user_pref("signon.rememberSignons", false); // 5003
-
-// Do not track header
-user_pref("privacy.donottrackheader.enabled", true); // 7015
-
-// Allow my custom css
-user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
-
-// might improve performance TODO:
-user_pref("gfx.webrender.all", true);
-
-// disable updates (pretty pointless with nix)
-user_pref("extensions.update.autoUpdateDefault", false);
-user_pref("extensions.update.enabled", false);
-user_pref("app.update.channel", "default");
-
-user_pref("browser.ctrlTab.recentlyUsedOrder", false);
-
-user_pref("browser.download.useDownloadDir", true);
-user_pref("browser.download.folderList", 2); // TODO:
-user_pref("browser.download.viewableInternally.typeWasRegistered.svg", true);
-user_pref("browser.download.viewableInternally.typeWasRegistered.webp", true);
-user_pref("browser.download.viewableInternally.typeWasRegistered.xml", true);
-
-// TODO: what does this do?
-user_pref("browser.search.widget.inNavBar", true);
-
-user_pref("browser.shell.checkDefaultBrowser", false);
-user_pref("browser.tabs.loadInBackground", true);
-user_pref("browser.urlbar.placeholderName", "Brave");
-
-// Set the tabs and bookmarks
-user_pref("browser.tabs.inTitlebar", 1);
-user_pref("browser.toolbars.bookmarks.visibility", "always");
-user_pref("browser.places.importBookmarksHTML", true);
-
-// Theme
-user_pref("extensions.activeThemeID", "firefox-alpenglow@mozilla.org");
-user_pref("extensions.extensions.activeThemeID", "firefox-alpenglow@mozilla.org");
-
-// highlight all entries when searching
-user_pref("findbar.highlightAll", true);
-
-// Set the default position for the developer toolbox
-user_pref("devtools,toolbox.host", "right");
-user_pref("devtools,toolsidebar-width.inspector", 700);
-
-// Don't bother me with translations
-user_pref("browser.translations.automaticallyPopup", true);
-user_pref("browser.translations.neverTranslateLanguages", "de");
-
-// Put all downloads into the downloads directory
-user_pref("browser.download.start_downloads_in_tmp_dir", false);
-
-// TODO:
-//user_pref("extensions.webcompat.enable_picture_in_picture_overrides", true);
-//user_pref("extensions.webcompat.enable_shims", true);
-//user_pref("extensions.webcompat.perform_injections", true);
-//user_pref("extensions.webcompat.perform_ua_overrides", true);
-
-// onlykey / copied from a yubikey config
-//user_pref("security.webauth.u2f", true);
-//user_pref("security.webauth.webauthn", true);
-//user_pref("security.webauth.webauthn_enable_softtoken", true);
-//user_pref("security.webauth.webauthn_enable_usbtoken", true);
diff --git a/modules/home.legacy/conf/firefox/default.nix b/modules/home.legacy/conf/firefox/default.nix
deleted file mode 100644
index 663c4978..00000000
--- a/modules/home.legacy/conf/firefox/default.nix
+++ /dev/null
@@ -1,133 +0,0 @@
-{
-  config,
-  pkgs,
-  lib,
-  user_js,
-  ...
-}: let
-  extensions =
-    builtins.fromJSON (builtins.readFile ./config/extensions/extensions.json);
-
-  userChrome = builtins.readFile ./config/chrome/userChrome.css;
-  bookmarks = (import ./config/bookmarks/default.nix) {
-    inherit
-      pkgs
-      lib
-      ;
-  };
-  engines = (import ./config/search/engines) {inherit pkgs;};
-
-  native_messaging_hosts = (import ./config/extensions/native_messaging_hosts/default.nix) {inherit pkgs;};
-
-  policies = (import ./config/policies) {inherit config extensions;};
-
-  search = {
-    default = "Brave Search";
-    privateDefault = "Brave Search";
-    force = true;
-    order = [
-      # DEFAULT
-      "Brave Search"
-
-      # NIX
-      "Nix Packages"
-      "Nix Options"
-      "Nixpkgs issues"
-      "Homemanager Options"
-      "NixOS Wiki"
-      "Nixpkgs Pull Request Tracker"
-
-      # RUST
-      "Rust std"
-      "Rust tokio"
-
-      # OTHER
-      "Google Scholar"
-      "Wikipedia"
-      "Arch Wiki"
-    ];
-
-    inherit engines;
-  };
-
-  prefConfig = builtins.readFile "${
-    (import ./config/prefs) {inherit pkgs lib config bookmarks user_js;}
-  }/user.js";
-
-  # Package {{{
-  package = import ./package.nix {
-    inherit config lib pkgs;
-    extraPolicies = policies;
-    extraNativeMessagingHosts = native_messaging_hosts;
-  };
-  # }}}
-
-  # Profiles {{{
-  profiles = {
-    "default" = {
-      inherit search userChrome;
-      isDefault = true;
-      id = 0;
-      name = "default";
-      extraConfig = prefConfig;
-    };
-  };
-
-  taskwarriorProfiles = import ../taskwarrior/firefox {
-    inherit
-      config
-      lib
-      # options
-      prefConfig
-      search
-      userChrome
-      ;
-    profile_size = builtins.length (builtins.attrNames profiles);
-  };
-  # }}}
-in {
-  options.soispha.firefox = {
-    package = lib.mkOption {
-      type = lib.types.package;
-      default = pkgs.firefox;
-      description = "Firefox package to use.";
-      defaultText = lib.literalExpression "pkgs.firefox";
-      relatedPackages = [
-        "firefox"
-        "firefox-beta-bin"
-        "firefox-bin"
-        "firefox-devedition-bin"
-        "firefox-esr"
-      ];
-    };
-    package_version = lib.mkOption {
-      type = lib.types.str;
-      default = pkgs.firefox.version;
-      description = "Firefox version to use";
-    };
-  };
-
-  config = {
-    soispha.firefox.package = package;
-    soispha.firefox.package_version = pkgs.firefox.version;
-    home.sessionVariables = {
-      # improve touch input & make scrolling smother
-      MOZ_USE_XINPUT2 = "1";
-
-      # improve wayland support
-      MOZ_ENABLE_WAYLAND = 1;
-
-      # tell gtk to use portals
-      GTK_USE_PORTAL = 1;
-
-      BROWSER = "firefox";
-    };
-    programs.firefox = {
-      enable = true;
-      inherit (config.soispha.firefox) package;
-      profiles =
-        profiles
-        // taskwarriorProfiles;
-    };
-  };
-}
diff --git a/modules/home.legacy/conf/firefox/package.nix b/modules/home.legacy/conf/firefox/package.nix
deleted file mode 100644
index f7e4319b..00000000
--- a/modules/home.legacy/conf/firefox/package.nix
+++ /dev/null
@@ -1,30 +0,0 @@
-# taken from the NixOS Firefox module: https://github.com/NixOS/nixpkgs/blob/7c9cc5a6e5d38010801741ac830a3f8fd667a7a0/nixos/modules/programs/firefox.nix
-{
-  config,
-  lib,
-  pkgs,
-  # options
-  autoConfig ? "",
-  extraNativeMessagingHosts ? [],
-  wrapperConfig ? {},
-  extraPolicies ? {},
-  base_package ? pkgs.firefox,
-}: let
-  pkg = base_package.override (old: {
-    extraPrefsFiles =
-      (old.extraPrefsFiles or [])
-      ++ [
-        (pkgs.writeText "autoConfig.js" autoConfig)
-      ];
-    nativeMessagingHosts = old.nativeMessagingHosts or [] ++ extraNativeMessagingHosts;
-    cfg = (old.cfg or {}) // wrapperConfig;
-    extraPoliciesFiles =
-      (old.extraPoliciesFiles or [])
-      ++ [
-        (
-          pkgs.writeText "policies.json" (builtins.toJSON extraPolicies)
-        )
-      ];
-  });
-in
-  pkg
diff --git a/modules/home.legacy/conf/firefox/scripts/default.nix b/modules/home.legacy/conf/firefox/scripts/default.nix
deleted file mode 100644
index 1127662b..00000000
--- a/modules/home.legacy/conf/firefox/scripts/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  pkgs,
-  sysLib,
-  ...
-}: let
-  unzip_mozlz4 = pkgs.stdenv.mkDerivation {
-    name = "unzip_mozlz4";
-    propagatedBuildInputs = [
-      (pkgs.python3.withPackages (pythonPackages:
-        with pythonPackages; [
-          lz4
-        ]))
-    ];
-    dontUnpack = true;
-    installPhase = "install -Dm755 ${./unzip_mozlz4.py} $out/bin/unzip_mozlz4";
-  };
-  extract_cookies = sysLib.writeShellScript {
-    name = "extract_cookies";
-    src = ./extract_cookies.sh;
-    dependencies = with pkgs; [
-      bash
-      sqlite
-      mktemp
-      coreutils
-    ];
-  };
-in {
-  inherit unzip_mozlz4 extract_cookies;
-}
diff --git a/modules/home.legacy/conf/firefox/scripts/extract_cookies.sh b/modules/home.legacy/conf/firefox/scripts/extract_cookies.sh
deleted file mode 100755
index e3d50d43..00000000
--- a/modules/home.legacy/conf/firefox/scripts/extract_cookies.sh
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/env bash
-# copied from https://superuser.com/a/1239036
-# extract_cookies.sh:
-#
-# Convert from Firefox's cookies.sqlite format to Netscape cookies,
-# which can then be used by wget and curl. (Why don't wget and curl
-# just use libsqlite if it's installed? Mysteries abound.)
-#
-# Note: This script reads directly from the standard cookie jar file,
-# which means cookies which are kept only in memory ("session cookies")
-# will not be extracted. You will need an extension to do that.
-
-# USAGE:
-#
-# $ extract_cookies.sh > /tmp/cookies.txt
-# or
-# $ extract_cookies.sh ~/.mozilla/firefox/*default*/cookies.sqlite > /tmp/cookies.txt
-
-# USING WITH WGET:
-# $ wget --load-cookies=/tmp/cookies.txt http://example.com
-
-# USING WITH CURL:
-# $ curl --cookie /tmp/cookies.txt http://example.com
-
-# Note: If you do not specify an SQLite filename, this script will
-# intelligently find it for you.
-#
-# A) Usually it will check all profiles under ~/.mozilla/firefox/ and
-# use the cookies.sqlite that was updated most recently.
-#
-# B) If you've redirected stdin (with < or |) , then that will be used.
-
-# HISTORY: I believe this is circa 2010 from:
-# http://slacy.com/blog/2010/02/using-cookies-sqlite-in-wget-or-curl/
-# However, that site is down now.
-
-# Cleaned up by Hackerb9 (2017) to be more robust and require less typing.
-
-cleanup() {
-    rm -f "$TMPFILE"
-    exit 0
-}
-trap cleanup EXIT INT QUIT TERM
-
-if [ "$#" -ge 1 ]; then
-    SQLFILE="$1"
-else
-    SQLFILE="$HOME/.mozilla/firefox/default/cookies.sqlite"
-fi
-
-if ! [ -r "$SQLFILE" ]; then
-    echo "Error. File $SQLFILE is not readable." >&2
-    exit 1
-fi
-
-# We have to copy cookies.sqlite, because FireFox has a lock on it
-TMPFILE=$(mktemp /tmp/cookies.sqlite.XXXXXXXXXX)
-cat "$SQLFILE" >>"$TMPFILE"
-
-# This is the format of the sqlite database:
-# CREATE TABLE moz_cookies (id INTEGER PRIMARY KEY, name TEXT, value TEXT, host TEXT, path TEXT,expiry INTEGER, lastAccessed INTEGER, isSecure INTEGER, isHttpOnly INTEGER);
-
-echo "# Netscape HTTP Cookie File"
-sqlite3 -separator $'\t' "$TMPFILE" <<EOF
-.mode tabs
-.header off
-select host,
-case substr(host,1,1)='.' when 0 then 'FALSE' else 'TRUE' end,
-path,
-case isSecure when 0 then 'FALSE' else 'TRUE' end,
-expiry,
-name,
-value
-from moz_cookies;
-EOF
-
-cleanup
diff --git a/modules/home.legacy/conf/firefox/scripts/unzip_mozlz4.py b/modules/home.legacy/conf/firefox/scripts/unzip_mozlz4.py
deleted file mode 100755
index 71e4e6bc..00000000
--- a/modules/home.legacy/conf/firefox/scripts/unzip_mozlz4.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-# source: https://unix.stackexchange.com/a/497861
-# Command-line tool to decompress mozLz4 files used for example by Firefox to store various kinds of session backup information.
-# Works in both Python 2.7.15 and 3.6.7, as of version 2.1.6 of the LZ4 Python bindings at pypi.org/project/lz4.
-# To use in another script, simply cut and paste the import statement and the mozlz4_to_text() function (lines 8 to 17).
-
-import lz4.block  # pip install lz4 --user
-
-
-def mozlz4_to_text(filepath):
-    # Given the path to a "mozlz4", "jsonlz4", "baklz4" etc. file,
-    # return the uncompressed text.
-    bytestream = open(filepath, "rb")
-    bytestream.read(8)  # skip past the b"mozLz40\0" header
-    valid_bytes = bytestream.read()
-    text = lz4.block.decompress(valid_bytes)
-    return text
-
-
-def main(args):
-    # Given command-line arguments of an input filepath for a ".mozlz4" file
-    # and optionally an output filepath, write the decompressed text to the
-    # output filepath.
-    # Default output filepath is the input filepath minus the last three characters
-    # (e.g. "foo.jsonlz4" becomes "foo.json")
-    filepath_in = args[0]
-    if len(args) < 2:
-        filepath_out = filepath_in[:-3]
-    else:
-        filepath_out = args[1]
-    text = mozlz4_to_text(filepath_in)
-    with open(filepath_out, "wb") as outfile:
-        outfile.write(text)
-    if filepath_out != "/dev/stdout":
-        print("Wrote decompressed text to {}".format(filepath_out))
-
-
-if __name__ == "__main__":
-    import sys
-
-    args = sys.argv[1:]
-    if args and args[0] not in ("--help", "-h"):
-        main(args)
-    else:
-        print("Usage: mozlz4.py <mozlz4 file to read> <location to write>")
diff --git a/modules/home.legacy/conf/firefox/scripts/update_extensions.sh b/modules/home.legacy/conf/firefox/scripts/update_extensions.sh
deleted file mode 100755
index 86bd843c..00000000
--- a/modules/home.legacy/conf/firefox/scripts/update_extensions.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-tmp=$(mktemp)
-cat <<EOF | awk '!/^\s*#/' >"$tmp"
-    darkreader:navbar
-    keepassxc-browser:navbar
-    vhack-libredirect:navbar
-    torproject-snowflake:navbar
-    tridactyl-vim:menupanel
-    ublock-origin:menupanel
-EOF
-
-# The bin is provided in the devshell;
-# The cat execution should be unquoted;
-# shellcheck disable=SC2046
-generate_extensions $(cat "$tmp") >"$(dirname "$0")"/../config/extensions/extensions.json
-
-rm "$tmp"
diff --git a/modules/home.legacy/conf/gammastep/default.nix b/modules/home.legacy/conf/gammastep/default.nix
index 1ae0550b..b4d8bf84 100644
--- a/modules/home.legacy/conf/gammastep/default.nix
+++ b/modules/home.legacy/conf/gammastep/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   nixosConfig,
diff --git a/modules/home.legacy/conf/gpg/default.nix b/modules/home.legacy/conf/gpg/default.nix
deleted file mode 100644
index 1acdf628..00000000
--- a/modules/home.legacy/conf/gpg/default.nix
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-  config,
-  pkgs,
-  lib,
-  ...
-}: {
-  programs.gpg = {
-    enable = true;
-    homedir = "${config.xdg.dataHome}/gnupg";
-    mutableKeys = true;
-    mutableTrust = true;
-
-    settings = {
-      default-key = "Benedikt Peetz <benedikt.peetz@b-peetz.de>";
-      # TODO: add more
-    };
-
-    publicKeys = [
-      {
-        source = ./keys/key_1.asc;
-        trust = "ultimate";
-      }
-      {
-        source = ./keys/key_2.asc;
-        trust = "full";
-      }
-    ];
-  };
-  services = {
-    gpg-agent = {
-      enable = true;
-      enableZshIntegration = true;
-      enableScDaemon = true; # smartcards and such things
-
-      # Cache the key passwords
-      defaultCacheTtl = 60 * 50;
-      defaultCacheTtlSsh = 60 * 50;
-      maxCacheTtl = 60 * 50;
-      maxCacheTtlSsh = 60 * 50;
-
-      pinentryPackage = pkgs.pinentry-curses;
-      # pinentryPackage = pkgs.pinentry-tty;
-
-      enableSshSupport = true;
-      sshKeys = let
-        removeSpace = str: builtins.replaceStrings [" "] [""] str;
-      in [
-        (removeSpace "8321 ED3A 8DB9 99A5 1F3B  F80F F268 2914 EA42 DE26")
-      ];
-    };
-  };
-
-  programs.zsh.initExtraFirst = lib.mkBefore ''
-    export GPG_TTY=$(tty)
-
-    # Magic copied from the gpg-agent manual
-    unset SSH_AGENT_PID
-    if [ "''${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
-        export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
-    fi
-
-
-    # Ensure that get gpg agent is started (necessary because ssh does not start it
-    # automatically and has it's tty updated)
-    gpg-connect-agent /bye
-  '';
-}
diff --git a/modules/home.legacy/conf/gtk/default.nix b/modules/home.legacy/conf/gtk/default.nix
index f5411369..68bef531 100644
--- a/modules/home.legacy/conf/gtk/default.nix
+++ b/modules/home.legacy/conf/gtk/default.nix
@@ -1,8 +1,15 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
-  lib,
   pkgs,
-  stdenv,
   ...
 }: {
   gtk = {
diff --git a/modules/home.legacy/conf/himalaya/default.nix b/modules/home.legacy/conf/himalaya/default.nix
index c072693e..22fbe306 100644
--- a/modules/home.legacy/conf/himalaya/default.nix
+++ b/modules/home.legacy/conf/himalaya/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.himalaya = {
     enable = true;
diff --git a/modules/home.legacy/conf/hyfetch/default.nix b/modules/home.legacy/conf/hyfetch/default.nix
index aec21dbc..bac0731e 100644
--- a/modules/home.legacy/conf/hyfetch/default.nix
+++ b/modules/home.legacy/conf/hyfetch/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   programs.hyfetch = {
     enable = true;
diff --git a/modules/home.legacy/conf/iamb/config.json.license b/modules/home.legacy/conf/iamb/config.json.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/home.legacy/conf/iamb/config.json.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/iamb/default.nix b/modules/home.legacy/conf/iamb/default.nix
index 2a93472c..764e2efc 100644
--- a/modules/home.legacy/conf/iamb/default.nix
+++ b/modules/home.legacy/conf/iamb/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   xdg.configFile."iamb/config.json".source = ./config.json;
 }
diff --git a/modules/home.legacy/conf/keepassxc/default.nix b/modules/home.legacy/conf/keepassxc/default.nix
index 3ac82812..40f61ba0 100644
--- a/modules/home.legacy/conf/keepassxc/default.nix
+++ b/modules/home.legacy/conf/keepassxc/default.nix
@@ -1,7 +1,12 @@
-{
-  config,
-  pkgs,
-  ...
-}: {
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{...}: {
   xdg.configFile."keepassxc/keepassxc.ini".source = ./keepassxc.ini;
 }
diff --git a/modules/home.legacy/conf/keepassxc/keepassxc.ini b/modules/home.legacy/conf/keepassxc/keepassxc.ini
index 288a194b..326f1d99 100644
--- a/modules/home.legacy/conf/keepassxc/keepassxc.ini
+++ b/modules/home.legacy/conf/keepassxc/keepassxc.ini
@@ -1,3 +1,13 @@
+; nixos-config - My current NixOS configuration
+;
+; Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+; SPDX-License-Identifier: GPL-3.0-or-later
+;
+; This file is part of my nixos-config.
+;
+; You should have received a copy of the License along with this program.
+; If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 [General]
 AutoSaveAfterEveryChange=true
 BackupBeforeSave=true
diff --git a/modules/home.legacy/conf/latexindent/default.nix b/modules/home.legacy/conf/latexindent/default.nix
index 0d776e14..aeedd411 100644
--- a/modules/home.legacy/conf/latexindent/default.nix
+++ b/modules/home.legacy/conf/latexindent/default.nix
@@ -1,8 +1,13 @@
-{
-  config,
-  pkgs,
-  ...
-}: {
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{...}: {
   xdg.configFile."latexindent/indentconfig.yaml".source = ./indentconfig.yaml;
   xdg.configFile."latexindent/mysettings.yaml".source = ./mysettings.yaml;
 }
diff --git a/modules/home.legacy/conf/latexindent/indentconfig.yaml b/modules/home.legacy/conf/latexindent/indentconfig.yaml
index d67351f3..6465a17a 100644
--- a/modules/home.legacy/conf/latexindent/indentconfig.yaml
+++ b/modules/home.legacy/conf/latexindent/indentconfig.yaml
@@ -1,2 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 paths:
 - /home/dt/.config/latexindent/mysettings.yaml
diff --git a/modules/home.legacy/conf/latexindent/mysettings.yaml b/modules/home.legacy/conf/latexindent/mysettings.yaml
index 9a0f8b2f..122821da 100644
--- a/modules/home.legacy/conf/latexindent/mysettings.yaml
+++ b/modules/home.legacy/conf/latexindent/mysettings.yaml
@@ -1,3 +1,13 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # defaultSettings.yaml for latexindent.pl, version 3.19.1, 2022-12-04
 #                      a script that aims to
 #                      beautify .tex, .sty, .cls files
diff --git a/modules/home.legacy/conf/mail/accounts/benedikt.nix b/modules/home.legacy/conf/mail/accounts/benedikt.nix
index 87ede61b..e75cb523 100644
--- a/modules/home.legacy/conf/mail/accounts/benedikt.nix
+++ b/modules/home.legacy/conf/mail/accounts/benedikt.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs}: {
   address = "benedikt.peetz@b-peetz.de";
   userName = "benedikt.peetz@b-peetz.de";
@@ -32,11 +41,11 @@
   #   };
   # };
   smtp = {
-    host = "server1.vhack.eu";
+    host = "mail.foss-syndicate.org";
     port = 465;
   };
   imap = {
-    host = "server1.vhack.eu";
+    host = "mail.foss-syndicate.org";
     port = 993;
   };
   jmap = {
diff --git a/modules/home.legacy/conf/mail/accounts/soispha.nix b/modules/home.legacy/conf/mail/accounts/soispha.nix
index 012e84d6..6bcb0da6 100644
--- a/modules/home.legacy/conf/mail/accounts/soispha.nix
+++ b/modules/home.legacy/conf/mail/accounts/soispha.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs}: {
   address = "soispha@vhack.eu";
   userName = "soispha@vhack.eu";
@@ -33,11 +42,11 @@
   #   };
   # };
   smtp = {
-    host = "server1.vhack.eu";
+    host = "mail.foss-syndicate.org";
     port = 465;
   };
   imap = {
-    host = "server1.vhack.eu";
+    host = "mail.foss-syndicate.org";
     port = 993;
   };
   jmap = {
diff --git a/modules/home.legacy/conf/mail/default.nix b/modules/home.legacy/conf/mail/default.nix
index 0ecbe40a..17957c82 100644
--- a/modules/home.legacy/conf/mail/default.nix
+++ b/modules/home.legacy/conf/mail/default.nix
@@ -1,15 +1,62 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   pkgs,
+  lib,
   ...
 }: let
   benedikt = import ./accounts/benedikt.nix {inherit pkgs;};
   soispha = import ./accounts/soispha.nix {inherit pkgs;};
 
   accounts = {inherit soispha benedikt;};
+
+  mkHelper = {
+    userName,
+    passwordCommand,
+    ...
+  }:
+    builtins.toString (pkgs.writeShellScript "git-credential-keepassxc-libsecret"
+      # bash
+      ''
+        [ "$1" = "get" ] || {
+          exit 1
+        }
+        output="$(cat)"
+        if echo "$output" | grep "username=${userName}" -q; then
+          if password="$(${passwordCommand})"; then
+            printf "%s\npassword=%s\n\n" "$output" "$password"
+          else
+            # The password command failed (for whatever reason)
+            exit 1
+          fi
+        else
+          # Not our business.
+          exit 1
+        fi
+      '');
+  accountCredentials =
+    # TODO: This will result in only one of them being defined, as we duplicate the
+    # attribute key <2025-02-03>
+    lib.mapAttrs' (_: value: {
+      name = "credential.smtp://${value.smtp.host}:${builtins.toString value.smtp.port}";
+      value = {
+        "helper" = mkHelper value;
+      };
+    })
+    accounts;
 in {
   accounts.email = {
     maildirBasePath = "${config.xdg.dataHome}/maildir";
     inherit accounts;
   };
+
+  programs.git.extraConfig = accountCredentials;
 }
diff --git a/modules/home.legacy/conf/mako/default.nix b/modules/home.legacy/conf/mako/default.nix
deleted file mode 100644
index 711457f2..00000000
--- a/modules/home.legacy/conf/mako/default.nix
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  config,
-  pkgs,
-  ...
-}: {
-  services.mako = {
-    enable = true;
-    backgroundColor = "#2e3440";
-    borderColor = "#88c0d0";
-    borderRadius = 25;
-    borderSize = 2;
-    defaultTimeout = 5000;
-    font = "Source Code Pro 10";
-    width = 500;
-    height = 500;
-    icons = true;
-    ignoreTimeout = true;
-    layer = "overlay";
-    markup = true; # TODO:
-    maxIconSize = 64;
-    sort = "-time";
-    extraConfig = ''
-      [urgency=low]
-      border-color=#cccccc
-
-      [urgency=normal]
-      border-color=#d08770
-
-      [urgency=high]
-      border-size=3
-      border-color=#bf616a
-      default-timeout=0
-
-      [urgency=critical]
-      border-size=4
-      border-color=#bf616a
-      default-timeout=0
-
-      [category=mpd]
-      default-timeout=2000
-      group-by=category
-    '';
-  };
-}
diff --git a/modules/home.legacy/conf/mbsync/default.nix b/modules/home.legacy/conf/mbsync/default.nix
index ac9808c9..058d576c 100644
--- a/modules/home.legacy/conf/mbsync/default.nix
+++ b/modules/home.legacy/conf/mbsync/default.nix
@@ -1,17 +1,25 @@
-{
-  config,
-  lib,
-  ...
-}: {
-  # TODO: I have no clue if both are needed, but it looks neat, right?
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{lib, ...}: {
+  # This configures the program in itself (i.e., sets-up a config file, etc.)
   programs.mbsync = {
     enable = true;
   };
+
+  # This starts a systemd service to periodically sync mail
   services.mbsync = {
     enable = true;
-    # TODO: enable after isync 1.5 drops
-    #configFile = "${config.xdg.configHome}/mbsync/mbsync.conf";
   };
-  # Disable the timer, and only activate it on neomutt start
+
+  # Disable the timer, and only activate the service when neomutt starts
+  # Otherwise, the password command would prompt me to unlock the keepassxc database every
+  # time.
   systemd.user.timers.mbsync = lib.mkForce {};
 }
diff --git a/modules/home.legacy/conf/mpv/default.nix b/modules/home.legacy/conf/mpv/default.nix
deleted file mode 100644
index 6b252a38..00000000
--- a/modules/home.legacy/conf/mpv/default.nix
+++ /dev/null
@@ -1,10 +0,0 @@
-{...}: {
-  programs.mpv = {
-    enable = true;
-    bindings = {
-      q = "quit 0";
-      "Ctrl+c" = "quit 1";
-      "Shift+q" = "quit-watch-later 1";
-    };
-  };
-}
diff --git a/modules/home.legacy/conf/mumble/Mumble.conf.license b/modules/home.legacy/conf/mumble/Mumble.conf.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/home.legacy/conf/mumble/Mumble.conf.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/mumble/default.nix b/modules/home.legacy/conf/mumble/default.nix
index 6fa524dc..1c1bc64e 100644
--- a/modules/home.legacy/conf/mumble/default.nix
+++ b/modules/home.legacy/conf/mumble/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   xdg.configFile."Mumble/Mumble.conf".source = ./Mumble.conf;
 }
diff --git a/modules/home.legacy/conf/neomutt/default.nix b/modules/home.legacy/conf/neomutt/default.nix
index e4fbcb39..5947e675 100644
--- a/modules/home.legacy/conf/neomutt/default.nix
+++ b/modules/home.legacy/conf/neomutt/default.nix
@@ -1,9 +1,23 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   programs.neomutt = {
     enable = true;
     package = pkgs.writeShellScriptBin "neomutt" ''
+      # Download newest mail
       systemctl --user start mbsync.service;
+
       ${pkgs.neomutt}/bin/neomutt;
+
+      # Upload changed things (e.g., new mail in Sent)
+      systemctl --user start mbsync.service;
     '';
     vimKeys = false; # see the modified ones below
     checkStatsInterval = 60;
diff --git a/modules/home.legacy/conf/nix-index/default.nix b/modules/home.legacy/conf/nix-index/default.nix
deleted file mode 100644
index eb8132d9..00000000
--- a/modules/home.legacy/conf/nix-index/default.nix
+++ /dev/null
@@ -1,14 +0,0 @@
-{...}: {
-  programs.nix-index = {
-    enable = true;
-    symlinkToCacheHome = true;
-
-    # Handled by myself (and the script is overridden)
-    enableBashIntegration = false;
-    enableZshIntegration = false;
-    enableFishIntegration = false;
-  };
-  programs.nix-index-database = {
-    comma.enable = false;
-  };
-}
diff --git a/modules/home.legacy/conf/npm/.npmrc b/modules/home.legacy/conf/npm/.npmrc
index d0d846bd..ef7db71a 100644
--- a/modules/home.legacy/conf/npm/.npmrc
+++ b/modules/home.legacy/conf/npm/.npmrc
@@ -1,3 +1,13 @@
+; nixos-config - My current NixOS configuration
+;
+; Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+; SPDX-License-Identifier: GPL-3.0-or-later
+;
+; This file is part of my nixos-config.
+;
+; You should have received a copy of the License along with this program.
+; If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 scripts-prepend-node-path=true
 node_gyp=
 prefix=${XDG_DATA_HOME}/npm
diff --git a/modules/home.legacy/conf/npm/default.nix b/modules/home.legacy/conf/npm/default.nix
index 7b4bb6a1..6f17277a 100644
--- a/modules/home.legacy/conf/npm/default.nix
+++ b/modules/home.legacy/conf/npm/default.nix
@@ -1,7 +1,12 @@
-{
-  config,
-  pkgs,
-  ...
-}: {
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{...}: {
   xdg.configFile."npm/.npmrc".source = ./.npmrc;
 }
diff --git a/modules/home.legacy/conf/prusa_slicer/default.nix b/modules/home.legacy/conf/prusa_slicer/default.nix
index 9529e13d..923ebbfc 100644
--- a/modules/home.legacy/conf/prusa_slicer/default.nix
+++ b/modules/home.legacy/conf/prusa_slicer/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   xdg.configFile."PrusaSlicer/PrusaSlicer.ini".source = ./prusa_slicer.ini;
 }
diff --git a/modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini b/modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini
index 0416a398..c9b7df5c 100644
--- a/modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini
+++ b/modules/home.legacy/conf/prusa_slicer/prusa_slicer.ini
@@ -1,3 +1,13 @@
+; nixos-config - My current NixOS configuration
+;
+; Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+; SPDX-License-Identifier: GPL-3.0-or-later
+;
+; This file is part of my nixos-config.
+;
+; You should have received a copy of the License along with this program.
+; If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 alert_when_supports_needed = 1
 allow_auto_color_change = 1
 allow_ip_resolve = 1
diff --git a/modules/home.legacy/conf/python/default.nix b/modules/home.legacy/conf/python/default.nix
index 09f5c5ce..12764f9f 100644
--- a/modules/home.legacy/conf/python/default.nix
+++ b/modules/home.legacy/conf/python/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {config, ...}: {
   xdg.configFile."python/pythonrc".source = ./pythonrc.py;
   home.sessionVariables = {
diff --git a/modules/home.legacy/conf/python/pythonrc.py b/modules/home.legacy/conf/python/pythonrc.py
index 466d9788..b733dc48 100644
--- a/modules/home.legacy/conf/python/pythonrc.py
+++ b/modules/home.legacy/conf/python/pythonrc.py
@@ -1,5 +1,15 @@
 #!/usr/bin/env python3
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 
 def is_vanilla() -> bool:
     import sys
diff --git a/modules/home.legacy/conf/rclone/default.nix b/modules/home.legacy/conf/rclone/default.nix
index bd0c1ac2..87de601b 100644
--- a/modules/home.legacy/conf/rclone/default.nix
+++ b/modules/home.legacy/conf/rclone/default.nix
@@ -1,7 +1,12 @@
-{
-  config,
-  pkgs,
-  ...
-}: {
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{...}: {
   xdg.configFile."rclone/rclone.conf".source = ./rclone.conf;
 }
diff --git a/modules/home.legacy/conf/rclone/rclone.conf.license b/modules/home.legacy/conf/rclone/rclone.conf.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/home.legacy/conf/rclone/rclone.conf.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/rofi/default.nix b/modules/home.legacy/conf/rofi/default.nix
index 10363ab5..3de22ea0 100644
--- a/modules/home.legacy/conf/rofi/default.nix
+++ b/modules/home.legacy/conf/rofi/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {pkgs, ...}: {
   programs.rofi = {
     enable = true;
diff --git a/modules/home.legacy/conf/rofi/nord-twoLines.rasi.license b/modules/home.legacy/conf/rofi/nord-twoLines.rasi.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/home.legacy/conf/rofi/nord-twoLines.rasi.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/ssh/default.nix b/modules/home.legacy/conf/ssh/default.nix
deleted file mode 100644
index de9b0d90..00000000
--- a/modules/home.legacy/conf/ssh/default.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{config, ...}: {
-  programs.ssh = {
-    enable = true;
-    compression = true;
-    hashKnownHosts = false;
-    serverAliveInterval = 240;
-    userKnownHostsFile = "${config.xdg.dataHome}/ssh/known_hosts";
-
-    matchBlocks = {
-      "codeberg.org" = {
-        # TODO: Remove this once they fix their ipv6 config
-        addressFamily = "inet";
-      };
-    };
-  };
-}
diff --git a/modules/home.legacy/conf/starship/default.nix b/modules/home.legacy/conf/starship/default.nix
index 5db6eb8b..6a6938f7 100644
--- a/modules/home.legacy/conf/starship/default.nix
+++ b/modules/home.legacy/conf/starship/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   lib,
   nixosConfig,
@@ -7,15 +16,18 @@
   programs.starship = {
     enable = true;
     enableZshIntegration = true;
+
     settings = {
       add_newline = false;
       format = lib.concatStrings [
         "$directory"
         "$username"
+        "\${custom.in_nixos_shell}"
         "$cmd_duration"
         "$status"
         "$character"
       ];
+
       right_format = lib.concatStrings (
         [
           "$git_metrics"
@@ -29,24 +41,30 @@
         nixosConfig.soispha.laptop.enable
         "$battery"
       );
+
       scan_timeout = 20;
+
       character = {
         # success_symbol = "[❯](bold blue)";
         # a = "⬢";
         success_symbol = "[](bold blue)";
         error_symbol = "[](bold red)";
       };
+
       status = {
         disabled = false;
         format = "([($common_meaning )($status)( $signal_name)]($style) )";
       };
+
       time = {
         disabled = false;
         format = "[\\[$time\\]]($style)";
       };
+
       username = {
         format = "as [$user]($style) ";
       };
+
       git_branch = {
         format = "[($symbol$branch(:$remote_branch) )]($style)";
       };
@@ -77,22 +95,28 @@
         tag_symbol = "v";
         format = "[(\\[$tag\\] )]($style)";
       };
+
       directory = {
         truncate_to_repo = true;
         read_only = " 󰌾";
         before_repo_root_style = "black bold dimmed";
       };
+
       cmd_duration = {
         min_time = 2000; # Milliseconds
         style = "bold white";
       };
+
       custom = {
-        # status_output = {
-        #   format = "$output";
-        #   command = "if test $STARSHIP_CMD_STATUS -ne 0; then echo \"bold red\"; else echo \"bold cyan\"; fi";
-        #   shell = [ "${pkgs.dash}" ];
-        # };
+        in_nixos_shell = {
+          symbol = "VM ";
+          style = "bold white";
+          when = ''test "$IN_NIXOS_SHELL" = true '';
+          shell = ["${lib.getExe pkgs.dash}"];
+          description = "Show if a shell is run in a vm";
+        };
       };
+
       battery = {
         # '󰁹 '
         #   '󰂄 '
diff --git a/modules/home.legacy/conf/swayidle/config.license b/modules/home.legacy/conf/swayidle/config.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/home.legacy/conf/swayidle/config.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/conf/swayidle/default.nix b/modules/home.legacy/conf/swayidle/default.nix
index 6b8a7d80..4483c8b9 100644
--- a/modules/home.legacy/conf/swayidle/default.nix
+++ b/modules/home.legacy/conf/swayidle/default.nix
@@ -1,8 +1,14 @@
-{
-  config,
-  pkgs,
-  ...
-}: {
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{...}: {
+  # TODO: This fails to hibernate when the hardware swap was not previously activated. <2025-04-04>
   xdg.configFile."swayidle/config".source = ./config;
 
   #  services.swayidle = {
diff --git a/modules/home.legacy/conf/swaylock/default.nix b/modules/home.legacy/conf/swaylock/default.nix
deleted file mode 100644
index 9e5eabac..00000000
--- a/modules/home.legacy/conf/swaylock/default.nix
+++ /dev/null
@@ -1,10 +0,0 @@
-{...}: {
-  programs.swaylock = {
-    enable = true;
-    settings = {
-      image = "${./GTDcanonical.png}";
-      scaling = "center";
-      color = "000000";
-    };
-  };
-}
diff --git a/modules/home.legacy/conf/taskwarrior/default.nix b/modules/home.legacy/conf/taskwarrior/default.nix
deleted file mode 100644
index d7aec156..00000000
--- a/modules/home.legacy/conf/taskwarrior/default.nix
+++ /dev/null
@@ -1,125 +0,0 @@
-{
-  nixosConfig,
-  lib,
-  config,
-  ...
-}: {
-  imports = [
-    ./hooks
-  ];
-
-  services.taskwarrior-sync = {
-    enable = true;
-  };
-
-  programs.taskwarrior = let
-    projects = import ./projects {};
-
-    mkContext = project:
-      if builtins.hasAttr "subprojects" project
-      then
-        lib.lists.flatten (
-          (builtins.map mkContext (builtins.map (mkProject project) project.subprojects))
-          ++ (mkContext (builtins.removeAttrs project ["subprojects"]))
-        )
-      else [
-        {
-          inherit (project) name;
-          value = let
-            name =
-              if builtins.hasAttr "pname" project
-              then project.pname
-              else project.name;
-          in {
-            read = "project:${name}";
-            write = "project:${name}";
-            rc = {
-              neorg_path =
-                if builtins.hasAttr "neorg_path" project
-                then project.neorg_path
-                else "${project.prefix}/${project.name}/index.norg";
-            };
-          };
-        }
-      ];
-    mkProject = project: subproject: let
-      pname =
-        if builtins.hasAttr "pname" project
-        then project.pname
-        else project.name;
-    in
-      if builtins.isString subproject
-      then {
-        name = "${project.name}_${subproject}";
-        pname = "${pname}.${subproject}";
-        neorg_path =
-          if builtins.hasAttr "neorg_path_prefix" project
-          then "${project.neorg_path_prefix}/${subproject}/index.norg"
-          else "${project.prefix}/${project.name}/${subproject}/index.norg";
-      }
-      else if builtins.isAttrs subproject
-      then let
-        name = builtins.elemAt (builtins.attrNames subproject) 0;
-      in {
-        name = "${project.name}_${name}";
-        pname = "${pname}.${name}";
-        prefix = "${project.prefix}/${project.name}";
-        neorg_path_prefix = "${project.prefix}/${project.name}/${name}";
-        subprojects = builtins.elemAt (builtins.attrValues subproject) 0;
-      }
-      else builtins.throw "Subproject not a string or a attrs: ${subproject}";
-
-    context =
-      builtins.listToAttrs (lib.lists.flatten (builtins.map mkContext projects));
-  in {
-    enable = true;
-    colorTheme = ./nord.theme;
-    extraConfig = ''
-      # This include just contains my taskd user credentials
-      include ${nixosConfig.age.secrets.taskserverCredentials.path}
-    '';
-    config = {
-      news.version = "2.6.0";
-      complete.all.tags = true;
-      list.all = {
-        projects = true;
-        tags = true;
-      };
-      regex = true;
-      weekstart = "Monday";
-      uda = {
-        total_active_time = {
-          type = "duration";
-          label = "Total active time";
-        };
-      };
-      alias = {
-        mod = "modify";
-        n = "execute neorg --task";
-        fstart = "execute neorg fstart";
-      };
-      color = true;
-
-      hooks.location = "${config.xdg.configHome}/task/hooks";
-
-      urgency.uda.priority = {
-        H.coefficient = 6.0;
-        M.coefficient = 0;
-        L.coefficient = -1.8;
-      };
-
-      inherit context;
-
-      taskd = {
-        server = "taskserver.vhack.eu:53589";
-        trust = "strict";
-        ca =
-          nixosConfig.age.secrets.taskserverCA.path;
-        key =
-          nixosConfig.age.secrets.taskserverPrivate.path;
-        certificate =
-          nixosConfig.age.secrets.taskserverPublic.path;
-      };
-    };
-  };
-}
diff --git a/modules/home.legacy/conf/taskwarrior/firefox/default.nix b/modules/home.legacy/conf/taskwarrior/firefox/default.nix
deleted file mode 100644
index fb5daaa8..00000000
--- a/modules/home.legacy/conf/taskwarrior/firefox/default.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  config,
-  lib,
-  # options
-  prefConfig,
-  profile_size,
-  search,
-  userChrome,
-  ...
-}: let
-  inherit (config.soispha.taskwarrior.projects) projects;
-
-  mkFirefoxProfile = {
-    name,
-    id,
-  }: {
-    inherit name;
-    value = {
-      isDefault = false;
-      extraConfig = prefConfig;
-      inherit id name search userChrome;
-    };
-  };
-  projects_id =
-    lib.imap0 (id: project: {
-      name = project;
-      id = id + profile_size;
-    })
-    projects;
-  firefoxProfiles = builtins.listToAttrs (builtins.map mkFirefoxProfile projects_id);
-in
-  firefoxProfiles
diff --git a/modules/home.legacy/conf/taskwarrior/hooks/default.nix b/modules/home.legacy/conf/taskwarrior/hooks/default.nix
deleted file mode 100644
index ef97e1b5..00000000
--- a/modules/home.legacy/conf/taskwarrior/hooks/default.nix
+++ /dev/null
@@ -1,114 +0,0 @@
-{
-  sysLib,
-  pkgs,
-  lib,
-  config,
-  ...
-}: let
-  mkProject = project: subproject:
-    if builtins.isString subproject
-    then {
-      name = "${project.name}.${subproject}";
-      prefix = null;
-    }
-    else let
-      name = builtins.elemAt (builtins.attrNames subproject) 0;
-    in {
-      name = "${project.name}.${name}";
-      subprojects = builtins.elemAt (builtins.attrValues subproject) 0;
-      prefix = null;
-    };
-
-  mkProjectName = project:
-    if builtins.hasAttr "subprojects" project
-    then
-      lib.lists.flatten ([project.name]
-        ++ (builtins.map mkProjectName
-          (builtins.map (mkProject project) project.subprojects)))
-    else [project.name];
-  projects = lib.lists.unique (lib.lists.naturalSort (lib.lists.flatten (builtins.map mkProjectName (import ../projects {}))));
-  projects_newline = builtins.concatStringsSep "\n" projects;
-  projects_comma = builtins.concatStringsSep ", " projects;
-  projects_pipe = builtins.concatStringsSep "|" projects;
-
-  enforce_policies = sysLib.writeShellScript {
-    name = "bin";
-    src = ./scripts/on-add_enforce-policies.sh;
-    dependencies = with pkgs; [dash jq taskwarrior gnused gnugrep];
-    replacementStrings = {
-      PROJECTS_NEWLINE = projects_newline;
-      PROJECTS_COMMA = projects_comma;
-    };
-  };
-  track_timewarrior = pkgs.stdenv.mkDerivation {
-    name = "track_timewarrior.taskwarrior-hook";
-    nativeBuildInputs = [
-      pkgs.makeWrapper
-    ];
-    buildInputs = [
-      pkgs.timewarrior
-      pkgs.taskwarrior
-      # TODO: Use a `taskw` package, that actually supports newer python variants <2024-07-13>
-      (pkgs.python311.withPackages (pythonPackages:
-        with pythonPackages; [
-          taskw
-        ]))
-    ];
-    dontUnpack = true;
-    installPhase = ''
-      install -Dm755 ${./scripts/on-modify_track-timewarrior.py} $out/bin/bin
-      wrapProgram $out/bin/bin \
-      --prefix PATH : ${lib.makeBinPath [pkgs.taskwarrior pkgs.timewarrior]}
-    '';
-  };
-  track_total_active_time = pkgs.stdenv.mkDerivation {
-    name = "track_total_active_time.taskwarrior-hook";
-    nativeBuildInputs = [
-      pkgs.makeWrapper
-    ];
-    buildInputs = [
-      pkgs.taskwarrior
-      # TODO: Use a `taskw` package, that actually supports newer python variants <2024-07-13>
-      (pkgs.python311.withPackages (pythonPackages:
-        with pythonPackages; [
-          taskw
-        ]))
-    ];
-    dontUnpack = true;
-    installPhase = ''
-      install -Dm755 ${./scripts/on-modify_track-total-active-time.py} $out/bin/bin
-      wrapProgram $out/bin/bin \
-      --prefix PATH : ${lib.makeBinPath [pkgs.taskwarrior]}
-    '';
-  };
-
-  mkSyncGitRepo = type: {
-    name = "${hookPath}/${type}_sync-git-repo";
-    value = {
-      source = "${sysLib.writeShellScript {
-        name = "bin";
-        src = ./scripts + "/${type}_sync-git-repo.sh";
-        dependencies = with pkgs; [dash taskwarrior git];
-      }}/bin/bin";
-    };
-  };
-  sync_git_repos =
-    builtins.listToAttrs (builtins.map mkSyncGitRepo ["on-add" "on-modify"]);
-  hookPath = config.programs.taskwarrior.config.hooks.location;
-in {
-  options.soispha.taskwarrior.projects = lib.mkOption {
-    type = lib.types.attrs;
-  };
-  config = {
-    soispha.taskwarrior.projects = {
-      inherit projects_newline projects_comma projects projects_pipe;
-    };
-    home.file =
-      {
-        "${hookPath}/on-add_enforce-policies".source = "${enforce_policies}/bin/bin";
-        "${hookPath}/on-modify_track-timewarrior".source = "${track_timewarrior}/bin/bin";
-        "${hookPath}/on-modify_track-total-active-time".source = "${track_total_active_time}/bin/bin";
-      }
-      // sync_git_repos;
-  };
-}
diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh
deleted file mode 100755
index eaf7f30c..00000000
--- a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_enforce-policies.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# override shell lib output to stdout
-eprint() {
-    # shellcheck disable=SC2317
-    print "$@"
-}
-eprintln() {
-    # shellcheck disable=SC2317
-    println "$@"
-}
-
-enable_hook_dbg() {
-    debug_hooks="$(task _get rc.debug.hooks)"
-    [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable
-}
-
-enforce_project() {
-    project="$(jq '.project' "$(ptmp "$1")")"
-    [ "$project" = "null" ] && die "No project supplied!"
-
-    if grep -q "^$(echo "$project" | sed 's|"\(.*\)"|\1|')\$" "$(ptmp "%PROJECTS_NEWLINE")"; then
-        dbg "project('$project') is a valid part of %PROJECTS_COMMA"
-    else
-        die "The project '$(echo "$project" | sed 's|"||g')' is not registered with the nix config, registered projects: %PROJECTS_COMMA"
-    fi
-}
-
-read -r new_task
-# We don't change the task, thus immediately return the json
-echo "$new_task"
-
-enable_hook_dbg
-enforce_project "$new_task"
-
-exit 0
-
-# vim: ft=sh
diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh
deleted file mode 100755
index dadc96b0..00000000
--- a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-add_sync-git-repo.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# override shell lib output to stdout
-eprint() {
-    # shellcheck disable=SC2317
-    print "$@"
-}
-eprintln() {
-    # shellcheck disable=SC2317
-    println "$@"
-}
-
-enable_hook_dbg() {
-    debug_hooks="$(task _get rc.debug.hooks)"
-    [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable
-}
-
-update_git_repo() {
-    task_data="$(task _get rc.data.location)"
-    [ "$task_data" ] || die "Taskwarrior should have a location set"
-
-    cd "$task_data" || die "(BUG?): Your data.location path is not accessable"
-
-    [ -d ./.git/ ] || git init
-
-    git add .
-    git commit --message="chore: Update" --no-gpg-sign
-}
-
-read -r new_task
-# We don't change the task, thus immediately return the json
-echo "$new_task"
-
-enable_hook_dbg
-update_git_repo
-
-exit 0
-
-# vim: ft=sh
diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh
deleted file mode 100755
index 25813e46..00000000
--- a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_sync-git-repo.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# override shell lib output to stdout
-eprint() {
-    # shellcheck disable=SC2317
-    print "$@"
-}
-eprintln() {
-    # shellcheck disable=SC2317
-    println "$@"
-}
-
-enable_hook_dbg() {
-    debug_hooks="$(task _get rc.debug.hooks)"
-    [ "$debug_hooks" ] && [ "$debug_hooks" -ge 1 ] && dbg_enable
-}
-
-update_git_repo() {
-    task_data="$(task _get rc.data.location)"
-    [ "$task_data" ] || die "Taskwarrior should have a location set"
-
-    cd "$task_data" || die "(BUG?): Your data.location path is not accessable"
-
-    [ -d ./.git/ ] || git init
-
-    git add .
-    git commit --message="chore: Update" --no-gpg-sign
-}
-
-read -r _old_task
-read -r new_task
-# We don't change the task, thus immediately return the json
-echo "$new_task"
-
-enable_hook_dbg
-update_git_repo
-
-exit 0
-
-# vim: ft=sh
diff --git a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py b/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py
deleted file mode 100755
index b482af6a..00000000
--- a/modules/home.legacy/conf/taskwarrior/hooks/scripts/on-modify_track-timewarrior.py
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Copyright (C) 2016-present Arctic Ice Studio <development@arcticicestudio.com>
-# Copyright (C) 2016-present Sven Greb <development@svengreb.de>
-
-# Project:    igloo
-# Repository: https://github.com/arcticicestudio/igloo
-# License:    MIT
-# References:
-#   https://taskwarrior.org/docs
-#   https://taskwarrior.org/docs/timewarrior
-#   timew(1)
-#   task(1)
-
-"""A Taskwarrior hook to track the time of a active task with Taskwarrior.
-
-This hook will extract all of the following for use as Timewarrior tags:
-
-* UUID
-* Project
-* Tags
-* Description
-* UDAs
-
-Note:
-    This hook requires Python 3 and is only compatible with Taskwarrior version greater or equal to 2.4!
-
-This hook is a fork from the `official on-modify.timewarrior hook`_.
-
-.. _`official on-modify.timewarrior hook`:
-   https://github.com/GothenburgBitFactory/timewarrior/blob/dev/ext/on-modify.timewarrior
-"""
-
-import subprocess
-import sys
-from json import loads, dumps
-from os import system
-from sys import stdin
-from taskw import TaskWarrior
-
-# Make no changes to the task, simply observe.
-old = loads(stdin.readline())
-new = loads(stdin.readline())
-print(dumps(new))
-
-
-w = TaskWarrior(config_filename=sys.argv[4].replace("rc:", ""))
-config = w.load_config(config_filename=sys.argv[4].replace("rc:", ""))
-if "max_active_tasks" in config:
-    MAX_ACTIVE = int(config["max_active_tasks"])
-else:
-    MAX_ACTIVE = 1
-
-
-# Extract attributes for use as tags.
-tags = [new["description"]]
-
-if "project" in new:
-    project = new["project"]
-    tags.append(project)
-    if "." in project:
-        tags.extend([tag for tag in project.split(".")])
-
-if "tags" in new:
-    tags.extend(new["tags"])
-
-combined = " ".join(["'%s'" % tag for tag in tags]).encode("utf-8").strip()
-
-# Task has been started.
-if "start" in new and "start" not in old:
-    # Prevent this task from starting if "task +ACTIVE count" is greater than "MAX_ACTIVE".
-    p = subprocess.Popen(
-        ["task", "+ACTIVE", "status:pending", "count", "rc.verbose:off"],
-        stdout=subprocess.PIPE,
-    )
-    out, err = p.communicate()
-    count = int(out.rstrip())
-    if count >= MAX_ACTIVE:
-        print(
-            "Only %d task(s) can be active at a time. "
-            "See 'max_active_tasks' in .taskrc." % MAX_ACTIVE
-        )
-        sys.exit(1)
-
-    system("timew start " + combined.decode() + " :yes")
-
-# Task has been stopped.
-elif "start" not in new and "start" in old:
-    system("timew stop " + combined.decode() + " :yes")
-
-# Any task that is active, with a non-pending status should not be tracked.
-elif "start" in new and new["status"] != "pending":
-    system("timew stop " + combined.decode() + " :yes")
diff --git a/modules/home.legacy/conf/taskwarrior/projects/default.nix b/modules/home.legacy/conf/taskwarrior/projects/default.nix
deleted file mode 100644
index c5c55059..00000000
--- a/modules/home.legacy/conf/taskwarrior/projects/default.nix
+++ /dev/null
@@ -1,123 +0,0 @@
-{}: [
-  {
-    name = "me";
-    prefix = "";
-    subprojects = ["health" "sweden" "bank" "google"];
-  }
-  {
-    name = "timesinks";
-    prefix = "";
-    subprojects = ["youtube" "games" "netflix" "music"];
-  }
-  {
-    name = "input";
-    prefix = "research";
-    subprojects = ["read-things" "dotfiles"];
-  }
-  {
-    name = "book";
-    prefix = "book";
-  }
-  {
-    name = "aoc";
-    prefix = "programming/advent_of_code";
-  }
-  {
-    name = "camera";
-    prefix = "programming/zig";
-    subprojects = [];
-  }
-  {
-    name = "trinitrix";
-    prefix = "programming/rust";
-    subprojects = ["testing" "documentation"];
-  }
-  {
-    name = "serverphone";
-    prefix = "programming/rust";
-  }
-  {
-    name = "latex";
-    prefix = "programming/latex";
-  }
-  {
-    name = "presentation";
-    prefix = "research";
-  }
-  {
-    name = "possible-projects";
-    prefix = "research";
-  }
-  {
-    name = "school";
-    prefix = "research";
-    subprojects = [
-      "biologie"
-      "chemie"
-      "deutsch"
-      "english"
-      "geographie"
-      "geschichte"
-      "infomatik"
-      "klausuren"
-      "latein"
-      "mathematik"
-      "musik"
-      "philosophie"
-      "physik"
-      "sozialkunde"
-      "sport"
-      {extern = ["bwinf" "dsa"];}
-      {chemie = ["facharbeit"];} # TODO: Remove once the ff tabs are cleared <2024-05-10>
-    ];
-  }
-  {
-    name = "hardware";
-    prefix = "research";
-  }
-  {
-    name = "buy";
-    prefix = "buy";
-    subprojects = ["books" "pc"];
-  }
-  {
-    name = "system";
-    prefix = "config";
-    subprojects = [
-      "youtube"
-      "backup"
-      "bar"
-      "email"
-      "firefox"
-      "gpg"
-      "keyboard"
-      "laptop"
-      "nvim"
-      "rss"
-      "shell"
-      "task"
-      "wm"
-    ];
-  }
-  {
-    name = "server";
-    prefix = "config";
-    subprojects = [
-      "b-peetz"
-      "email"
-      "blog"
-      "nix-sync"
-      "sudo-less"
-      "ci"
-    ];
-  }
-  {
-    name = "3d-printer";
-    prefix = "hardware";
-  }
-  {
-    name = "smartphone";
-    prefix = "hardware";
-    subprojects = ["airplay" "airdrop"];
-  }
-]
diff --git a/modules/home.legacy/conf/timewarrior/default.nix b/modules/home.legacy/conf/timewarrior/default.nix
deleted file mode 100644
index bcb627f5..00000000
--- a/modules/home.legacy/conf/timewarrior/default.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{pkgs, ...}: {
-  home.packages = [
-    pkgs.timewarrior
-  ];
-  xdg.configFile."timewarrior/timewarrior.cfg".text = ''
-    # source: https://github.com/arcticicestudio/igloo
-    #+----+
-    #+ UI +
-    #+----+
-    import ${./nord.theme}
-    color = true
-
-    #+---------+
-    #+ Reports +
-    #+---------+
-    define reports:
-      day:
-        lines = 10
-        month = true
-        week = true
-  '';
-}
diff --git a/modules/home.legacy/conf/tridactyl/config.vim b/modules/home.legacy/conf/tridactyl/config.vim
index 84e290cb..aa843bc8 100644
--- a/modules/home.legacy/conf/tridactyl/config.vim
+++ b/modules/home.legacy/conf/tridactyl/config.vim
@@ -1,3 +1,13 @@
+" nixos-config - My current NixOS configuration
+"
+" Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+" SPDX-License-Identifier: GPL-3.0-or-later
+"
+" This file is part of my nixos-config.
+"
+" You should have received a copy of the License along with this program.
+" If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 " vim: filetype=vim
 
 " This wipes all existing settings. This means that if a setting in this file
diff --git a/modules/home.legacy/conf/tridactyl/default.nix b/modules/home.legacy/conf/tridactyl/default.nix
index 23307cfe..de92c665 100644
--- a/modules/home.legacy/conf/tridactyl/default.nix
+++ b/modules/home.legacy/conf/tridactyl/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   xdg.configFile."tridactyl/tridactylrc".source = ./config.vim;
 }
diff --git a/modules/home.legacy/conf/xdg/default.nix b/modules/home.legacy/conf/xdg/default.nix
deleted file mode 100644
index 4099720d..00000000
--- a/modules/home.legacy/conf/xdg/default.nix
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  sysLib,
-  pkgs,
-  config,
-  ...
-}: let
-  url_handler = sysLib.writeShellScript {
-    name = "url_handler";
-    src = ./url_handler.sh;
-    keepPath = true;
-    # Naming dependencies for this will be difficult, as it depend on overridden packages.
-    dependencies = with pkgs; [
-      rofi
-      libnotify
-      zathura
-    ];
-    replacementStrings = {
-      ALL_PROJECTS_PIPE = "${config.soispha.taskwarrior.projects.projects_pipe}";
-    };
-  };
-in {
-  imports = [
-    ./xdg_vars.nix
-  ];
-
-  xdg = {
-    mimeApps = {
-      enable = true;
-      defaultApplications = {
-        "application/pdf" = ["url_handler.desktop"];
-        "application/x-pdf" = ["url_handler.desktop"];
-
-        "text/html" = ["url_handler.desktop"];
-        "text/xml" = ["url_handler.desktop"];
-        "x-scheme-handler/http" = ["url_handler.desktop"];
-        "x-scheme-handler/https" = ["url_handler.desktop"];
-        "x-scheme-handler/about" = ["url_handler.desktop"];
-        "x-scheme-handler/unknown" = ["url_handler.desktop"];
-      };
-    };
-    desktopEntries = {
-      url_handler = {
-        name = "url_handler";
-        genericName = "Web Browser";
-        exec = "${url_handler}/bin/url_handler %u";
-        terminal = false;
-        categories = [
-          "Application"
-          "Network"
-          "WebBrowser"
-        ];
-        mimeType = [
-          "text/html"
-          "text/xml"
-          "x-scheme-handler/http"
-          "x-scheme-handler/https"
-          "x-scheme-handler/about"
-          "x-scheme-handler/unknown"
-        ];
-      };
-    };
-  };
-}
diff --git a/modules/home.legacy/conf/xdg/url_handler.sh b/modules/home.legacy/conf/xdg/url_handler.sh
deleted file mode 100755
index 95eedffb..00000000
--- a/modules/home.legacy/conf/xdg/url_handler.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env dash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-project="$(echo "%ALL_PROJECTS_PIPE|nvim|zathura|" | rofi -sep "|" -dmenu)"
-
-if [ "$project" = "nvim" ]; then
-    "$TERMINAL" -e nvim "$1"
-elif [ "$project" = "zathura" ]; then
-    zathura "$1"
-elif [ "$project" ]; then
-    firefox -P "$project" "$1"
-else
-    notify-send "(URL HANDLER) No project selected" && exit 1
-fi
-
-# vim: ft=sh
diff --git a/modules/home.legacy/conf/xdg/xdg_vars.nix b/modules/home.legacy/conf/xdg/xdg_vars.nix
deleted file mode 100644
index aa2f30d4..00000000
--- a/modules/home.legacy/conf/xdg/xdg_vars.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{config, ...}: let
-  inherit (config.xdg) dataHome;
-in {
-  # FIXME: Move these options in relevant modules, that are connected to their software.
-  #        <2024-10-21>
-
-  # Variables that only have to be set because special applications fail to set reasonable
-  # defaults (mostly understandable because of backwards-compatibility, but yeah)
-  home.sessionVariables = {
-    CARGO_HOME = "${dataHome}/cargo";
-    GRADLE_USER_HOME = "${dataHome}/gradle";
-
-    #_JAVA_OPTIONS = lib.concatStringsSep " " [
-    #        ''-Djava.util.prefs.userRoot="${config.xdg.configHome}/java"''
-    #        ''-Djavafx.cachedir="${config.xdg.cacheHome}/openjfx"''
-    #      ];
-    #GOPATH = "${config.xdg.dataHome}/go";
-    #GTK2_RC_FILES = "${config.xdg.configHome}/gtk-2.0/gtkrc";
-    #RUSTUP_HOME = "${config.xdg.dataHome}/rustup";
-    #NPM_CONFIG_USERCONFIG = "${config.xdg.configHome}/npm/npmrc";
-    #NUGET_PACKAGES = "${config.xdg.cacheHome}/NuGetPackages";
-    #XAUTHORITY = "${config.xdg.stateHome}/Xauthority";
-    #COMPDUMPFILE = "${config.xdg.dataHome}/zsh/.zcompdump}";
-    #IPYTHONDIR = "${config.xdg.configHome}/ipython";
-    #PARALLEL_HOME = "${config.xdg.configHome}/parallel";
-    #STACK_XDG = "1";
-    #WINEPREFIX = "${config.xdg.dataHome}/wine";
-  };
-}
diff --git a/modules/home.legacy/conf/ytcc/default.nix b/modules/home.legacy/conf/ytcc/default.nix
deleted file mode 100644
index 87300ec1..00000000
--- a/modules/home.legacy/conf/ytcc/default.nix
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  config,
-  pkgs,
-  ...
-}: {
-  xdg.configFile."ytcc/ytcc.conf".source = pkgs.substituteAll {
-    src = ./ytcc.conf;
-    download_dir = "${config.xdg.userDirs.download}/ytcc";
-    xdg_data_home = config.xdg.dataHome;
-  };
-}
diff --git a/modules/home.legacy/conf/ytcc/ytcc.conf b/modules/home.legacy/conf/ytcc/ytcc.conf
deleted file mode 100644
index 289843ad..00000000
--- a/modules/home.legacy/conf/ytcc/ytcc.conf
+++ /dev/null
@@ -1,37 +0,0 @@
-[ytcc]
-download_dir = @download_dir@
-mpv_flags = --really-quiet --ytdl --ytdl-format=bestvideo[height<=?1080]+bestaudio/best --speed=2.7
-download_subdirs = true
-order_by = playlists:asc, publish_date:desc
-video_attrs = id, title, publish_date, duration, playlists
-playlist_attrs = name, url, tags, reverse
-db_path = @xdg_data_home@/ytcc/ytcc.db
-date_format = %Y-%m-%d
-max_update_fail = 5
-max_update_backlog = 20
-age_limit = 0
-
-[tui]
-alphabet = sdfervghnuiojkl
-default_action = play_video
-
-[theme]
-prompt_download_audio = 2
-prompt_download_video = 4
-prompt_play_audio = 2
-prompt_play_video = 4
-prompt_mark_watched = 1
-table_alternate_background = 245
-plain_label_text = 244
-
-[youtube_dl]
-format = bestvideo[height<=?1080]+bestaudio/best
-output_template = %(title)s.%(ext)s
-ratelimit = 0
-retries = 0
-subtitles = off
-thumbnail = true
-skip_live_stream = true
-merge_output_format = mkv
-max_duration = 0
-restrict_filenames = false
diff --git a/modules/home.legacy/default.nix b/modules/home.legacy/default.nix
index de6fec25..fd543661 100644
--- a/modules/home.legacy/default.nix
+++ b/modules/home.legacy/default.nix
@@ -1,10 +1,14 @@
-{
-  nixVim,
-  nix-index-database,
-  ...
-}: let
-  username = "soispha";
-  homeDirectory = "/home/${username}";
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{config, ...}: let
+  inherit (config.home) homeDirectory;
 
   # xdg
   configHome = "${homeDirectory}/.config";
@@ -18,20 +22,11 @@ in {
     ./conf
     ./files
     ./pkgs
-    ./wms
-
-    nixVim.homeManagerModules.nixvim
-    nix-index-database.hmModules.nix-index
   ];
 
   # I don't know what this does, but I've seen it a lot online, so it should be good, right?
   programs.home-manager.enable = true;
 
-  home = {
-    inherit username homeDirectory;
-    stateVersion = "23.05";
-    enableNixpkgsReleaseCheck = true;
-  };
   xdg = {
     enable = true;
     inherit configHome dataHome stateHome cacheHome; #binHome; # TODO: add binHome, when the standard is extended
diff --git a/modules/home.legacy/files/default.nix b/modules/home.legacy/files/default.nix
index 16fe9afe..5a04ab7a 100644
--- a/modules/home.legacy/files/default.nix
+++ b/modules/home.legacy/files/default.nix
@@ -1,6 +1,14 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   imports = [
-    ./wallpaper
     ./manifest_json
   ];
 }
diff --git a/modules/home.legacy/files/manifest_json/default.nix b/modules/home.legacy/files/manifest_json/default.nix
index af8d85d2..5b4821ac 100644
--- a/modules/home.legacy/files/manifest_json/default.nix
+++ b/modules/home.legacy/files/manifest_json/default.nix
@@ -1,3 +1,12 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
diff --git a/modules/home.legacy/files/manifest_json/profile/manifest.json.license b/modules/home.legacy/files/manifest_json/profile/manifest.json.license
new file mode 100644
index 00000000..eae6a84c
--- /dev/null
+++ b/modules/home.legacy/files/manifest_json/profile/manifest.json.license
@@ -0,0 +1,9 @@
+nixos-config - My current NixOS configuration
+
+Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+SPDX-License-Identifier: GPL-3.0-or-later
+
+This file is part of my nixos-config.
+
+You should have received a copy of the License along with this program.
+If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/home.legacy/files/wallpaper/default.nix b/modules/home.legacy/files/wallpaper/default.nix
deleted file mode 100644
index 119df225..00000000
--- a/modules/home.legacy/files/wallpaper/default.nix
+++ /dev/null
@@ -1,14 +0,0 @@
-{config, ...}: {
-  home = {
-    sessionVariables = {
-      WALLPAPER = "${config.home.homeDirectory}/media/pictures/wallpaper";
-    };
-
-    file = {
-      wallpaper = {
-        source = ./abstract-nord.png;
-        target = "media/pictures/wallpaper";
-      };
-    };
-  };
-}
diff --git a/modules/home.legacy/pkgs/default.nix b/modules/home.legacy/pkgs/default.nix
index 1a4c4a1b..5ab1e73b 100644
--- a/modules/home.legacy/pkgs/default.nix
+++ b/modules/home.legacy/pkgs/default.nix
@@ -1,51 +1,31 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   pkgs,
   lib,
-  config,
   nixosConfig,
   ...
 }:
-# TODO: Remove this whole file, and move each pkgs to a separate module. <2024-11-16>
+# TODO: Remove this whole file, and move each package to a separate module. <2024-11-16>
 with pkgs; let
   Gui = {
     Terminals = [
-      # foot # wayland native terminal
       alacritty # default terminal
     ];
-    Browsers = [
-      #ungoogled-chromium # web browser (only for web programming)
-      #brave
-    ];
-
-    ImageManipulation = [
-      #krita # new, and better (KDE)
-      #gimp # conservative, and old (GNOME)
-    ];
-
-    Social = [
-      mumble # voice chat software (client)
-      # lutris # multiple game store clients
-
-      # nheko # best matrix client (as of today)
-      # element-desktop  # nheko didn't work
-      signal-desktop # to avoid encryption problems with signal-bridge
-    ];
 
     Misc = [
-      #kalzium # Periodic Table of Elements (`element` is [sort of] better)
       keepassxc # password manager
-      #onlykey # OnlyKey Chrome Desktop App
-      anki-bin # spaced repetition
     ];
   };
 
   TuiCli = {
-    EyeCandy = [
-      #banner # Print large banners to ASCII terminals
-      cmatrix # A curses-based scrolling 'Matrix'-like screen
-      hyfetch # Neofetch with LGBTQ pride flags.
-    ];
-
     Social = [
       iamb # best tui matrix client (as of today)
     ];
@@ -55,16 +35,9 @@ with pkgs; let
     ];
 
     Misc = [
-      android-file-transfer # Android MTP client with minimalistic UI
-      #xdg-ninja # A shell script which checks your $HOME for unwanted files and directories.
-      xdg-utils # open urls and such things
-      yokadi # Command line oriented, sqlite powered, todo list
       killall # kill a application by name
-      snap-sync-forked # A btrfs based backup solution
       bc # Smart calculator
       aumo # Automatic mount
-      nato # Encodes a string in the standardized spelling alphabet
-      virsh-del # Delete a libvirt virtual machine (not really used anymore).
       jq # Json parser
     ];
 
@@ -75,58 +48,30 @@ with pkgs; let
       ];
 
       Firefox = [
-        # `neorg` handles the integration between Firefox profiles and task
+        # `tskm` handles the integration between Firefox profiles and task
         # contexts
-        (neorg.override
-          {
-            defaultNeorgProjectDir = config.programs.nixvim.plugins.neorg.settings.load."core.dirman".config.workspaces.projects;
-            allProjectsNewline = config.soispha.taskwarrior.projects.projects_newline;
-            allProjectsComma = config.soispha.taskwarrior.projects.projects_comma;
-            allProjectsPipe = config.soispha.taskwarrior.projects.projects_pipe;
-            allWorkspaces = config.programs.nixvim.plugins.neorg.settings.load."core.dirman".config.workspaces;
-            xdgConfigHome = config.xdg.configHome;
-            xdgDataHome = config.xdg.dataHome;
-          })
+        pkgs.tskm
       ];
     };
 
     WM = {
-      river = [river]; # A dynamic tiling wayland compositor
-
       CLITools = [
-        lswt # List Wayland toplevels.
         wl-clipboard # Command-line copy/paste utilities.
-        swaylock # My current lockscreen implementation.
-      ];
-
-      Media = [
-        wf-recorder # Screen recorder.
-        libnotify # a command to send a notification.
-        screenshot_persistent # Creates a persisting screenshot.
-        screenshot_temporary # Takes a screenshot and stores it in the clipboard.
       ];
     };
 
     Media = {
       View = [
-        imv # Image viewer
         zathura # PDF viewer
       ];
 
       YouTube = [
-        yti # Wrapper around `yt-dlp`.
         yt # A command line YouTube client
       ];
-
-      Listen = [
-        spodi # Wrapper around `spotdl`.
-        sort_song # Sorts songs in the current directory.
-      ];
     };
 
     Hardware = {
       Storage = [
-        #compsize # Calculate compression ratio of a set of files on Btrfs
         # TODO: smartmontools # Control and monitor S.M.A.R.T. enabled ATA and SCSI Hard Drives
       ];
 
@@ -144,48 +89,31 @@ with pkgs; let
             backlightName = nixosConfig.soispha.laptop.backlight;
           }
         );
-
-      Input = [
-        #piper # GTK application to configure gaming mice
-      ];
     };
 
     SystemUpdate = [
       fupdate # Generic update tool.
-      update-sys # System update tool (meant to slot into `fupdate`).
+      fupdate-sys # System update tool (meant to slot into `fupdate`).
+      fupdate-flake # Nix flake update tool (meant to slot into `fupdate`).
     ];
 
     FileListers = [
       tree # A directory listing program displaying a depth indented list of files
       fd # Simple, fast and user-friendly alternative to find
       ripgrep # A search tool that combines the usability of ag with the raw speed of grep
-      fzf # used to quickly move around with its keybindings
       file # Show information about a file
-      ll # Wrapper around `lf` to automatically change the path
-      lm # Wrapper around `ll` to automatically cd to the last accessed path
-    ];
-
-    Editors = [
-      ed # A POSIX-compliant line-oriented text editor
-      #sed # GNU stream editor
-      vim # The original ex/vi text editor (this is `vim` and not `vi`, as `vi` is unfree)
-      #neovim # Fork of Vim aiming to improve user experience, plugins, and GUIs
     ];
 
     Programming = {
       GeneralTools = [
         stamp # Add a license header to a file
         git # the fast distributed version control system
-        git-absorb # git commit --fixup, but automatic
         git-edit-index # Allows you to edit the indexed version of a file
         git-cm # A wrapper that re-adds the last commit's subject
-        git-cleanup # An automatic merged branch deleter
         glow # Command-line markdown renderer
       ];
     };
   };
-  # TODO: unmaintained, find sth else:
-  # handlr # Powerful alternative to xdg-utils written in Rust
   mapFun = x:
     if builtins.isAttrs x
     then
@@ -194,7 +122,7 @@ with pkgs; let
       else builtins.attrValues x
     else [x];
 in {
-  home.packages =
+  config.home.packages =
     []
     ++ (with builtins;
       concatLists
diff --git a/modules/home.legacy/wms/default.nix b/modules/home.legacy/wms/default.nix
deleted file mode 100644
index 610ea2f4..00000000
--- a/modules/home.legacy/wms/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
-{config, ...}: {
-  imports = [
-    # ./sway
-    ./river
-    # ./plasma
-  ];
-}
diff --git a/modules/home.legacy/wms/plasma/default.nix b/modules/home.legacy/wms/plasma/default.nix
deleted file mode 100644
index f68ee272..00000000
--- a/modules/home.legacy/wms/plasma/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
-{config, ...}: {
-  services.xserver.enable = true;
-  services.xserver.displayManager.sddm.enable = true;
-  services.xserver.desktopManager.plasma5.enable = true;
-}
diff --git a/modules/home.legacy/wms/river/default.nix b/modules/home.legacy/wms/river/default.nix
deleted file mode 100644
index 9463e94e..00000000
--- a/modules/home.legacy/wms/river/default.nix
+++ /dev/null
@@ -1,91 +0,0 @@
-{
-  pkgs,
-  sysLib,
-  river_init_lesser,
-  nixosConfig,
-  system,
-  qmk_firmware,
-  ...
-}: let
-  inherit (nixosConfig.networking) hostName;
-  mappings =
-    if hostName == "tiamat"
-    then ''
-      err_fail riverctl keyboard-layout 'us-modified'
-      err_fail river_init_lesser ~/.config/river/res/moonlander.ron
-    ''
-    else if hostName == "lahmu" || hostName == "apzu" || hostName == "mammun" || hostName == "isimud"
-    then ''
-      err_fail riverctl keyboard-layout 'dvorak-modified'
-      err_fail river_init_lesser ~/.config/river/res/keys.ron
-    ''
-    else builtins.throw "Host not covered in river mappings";
-  screen_setup =
-    if hostName == "lahmu"
-    then ''
-      err_fail wlr-randr --output Virtual-1 --mode 1920x1080
-    ''
-    else if hostName == "tiamat"
-    then ''
-      err_fail wlr-randr --output DP-2 --pos 2560,0
-      err_fail wlr-randr --output DP-1 --scale 1.5 --pos 0,0
-      err_fail gammastep &
-    ''
-    else if hostName == "apzu" || hostName == "mammun" || hostName == "isimud"
-    then ''
-      err_fail gammastep &
-    ''
-    else builtins.throw "Host not covered in river screen setup";
-  env_vars = "XDG_CURRENT_DESKTOP=river DESKTOP_SESSION=river";
-  init_scr = pkgs.substituteAll {
-    src = ./init.sh;
-    inherit mappings screen_setup env_vars;
-  };
-in {
-  home.sessionVariables = {
-    WM = "river";
-    XDG_CURRENT_DESKTOP = "river";
-    DESKTOP_SESSION = "river";
-
-    # Export Wayland env Vars {{{
-    QT_QPA_PLATFORM = "wayland";
-    QT_QPA_PLATFORMTHEME = "qt5ct"; # needs qt5ct
-    CLUTTER_BACKEND = "wayland";
-    SDL_VIDEODRIVER = "wayland"; # might brake some things
-    # }}}
-  };
-
-  xdg.configFile."river/init".source =
-    sysLib.writeShellScript {
-      name = "river_init";
-      src = init_scr;
-      keepPath = true;
-      dependencies = builtins.attrValues {
-        river_init_lesser = river_init_lesser.packages.${system}.default;
-        inherit (qmk_firmware.packages.${system}) qmk_unicode_type;
-
-        inherit
-          (pkgs)
-          dash
-          river
-          glib # gnome lib
-          gammastep
-          wlr-randr
-          yambar
-          mako
-          swaybg
-          swayidle
-          swaylock
-          alacritty
-          ;
-      };
-    }
-    + /bin/river_init;
-
-  # TODO: These mappings should be generated in nix. (Which would allow to replace the
-  # `mpc` pat adding.) <2024-11-16>
-
-  # Needed for the key-mappings.
-  home.packages = [pkgs.mpc];
-  xdg.configFile."river/res".source = ./res;
-}
diff --git a/modules/home.legacy/wms/river/init.sh b/modules/home.legacy/wms/river/init.sh
deleted file mode 100755
index 06a2e2f4..00000000
--- a/modules/home.legacy/wms/river/init.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env bash
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-err_fail() {
-    if ! "$@"; then
-        warning "\"$*\" failed!\n" >>~/river_log
-        # msg "Executing the safe init!"
-        # exec ~/.config/river/res/safe_init.sh
-    fi
-}
-err_fail rm ~/river_log
-exec 1>>"$HOME"/river_log
-exec 2>>"$HOME"/river_log
-
-#trap err_fail ERR
-
-#Setup of environment variables {{{
-err_fail riverctl spawn "exec dbus-update-activation-environment --systemd SEATD_SOCK DISPLAY WAYLAND_DISPLAY DESKTOP_SESSION=river XDG_CURRENT_DESKTOP=river"
-export @env_vars@
-#}}}
-
-# Setup of mappings {{{
-@mappings@
-# }}}
-
-# Setup of Rules {{{
-err_fail riverctl rule-add -app-id float -title '*' float
-err_fail riverctl rule-add -app-id mpv -title '*' float
-err_fail riverctl rule-add -app-id ModernGL -title '*' float
-err_fail riverctl rule-add -app-id '*' -title 'Manim Slides' float
-err_fail riverctl rule-add -app-id '*' -title 'floating please' float
-
-err_fail riverctl rule-add -app-id '*' -title '*' ssd
-err_fail riverctl rule-add -app-id firefox -title '*' csd # This remove the focus border around Firefox (which is useful because the Firefox is nearly always in its own tag.)
-# }}}
-
-# Set riverctl settings {{{
-# background
-err_fail riverctl background-color 0x002b36
-err_fail riverctl border-color-focused 0x93a1a1
-err_fail riverctl border-color-unfocused 0x586e75
-
-# keyboard repeat rate
-err_fail riverctl set-repeat 50 300
-
-# Cursor
-err_fail riverctl focus-follows-cursor normal
-#riverctl hide-cursor timeout 2000
-err_fail riverctl hide-cursor when-typing enabled
-err_fail riverctl set-cursor-warp on-output-change
-err_fail riverctl xcursor-theme Nordzy-cursors 24
-
-err_fail riverctl input pointer-1133-49970-Logitech_Gaming_Mouse_G502 pointer-accel 0
-err_fail riverctl input pointer-1133-49970-Logitech_Gaming_Mouse_G502 accel-profile none
-
-err_fail riverctl input pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I pointer-accel 0
-err_fail riverctl input pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I accel-profile none
-# }}}
-
-# Setup of general apps {{{
-@screen_setup@
-
-err_fail yambar &
-
-err_fail mako &
-err_fail swaybg -i "$WALLPAPER" &
-err_fail swayidle &
-err_fail alacritty &
-# }}}
-
-# Setup of layout [acts as exec!] {{{
-err_fail riverctl default-layout rivertile
-@env_vars@ rivertile -main-ratio 0.5 -view-padding 1 -outer-padding 0
-
-#riverctl default-layout luatile
-#river-luatile
-# }}}
-# vim: ft=sh
diff --git a/modules/home.legacy/wms/river/res/keys.ron b/modules/home.legacy/wms/river/res/keys.ron
deleted file mode 100644
index a2bc0fa1..00000000
--- a/modules/home.legacy/wms/river/res/keys.ron
+++ /dev/null
@@ -1,58 +0,0 @@
-#![enable(implicit_some)]
-RiverctlCommandArray(
-    commands: [
-    // Focus change
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "T",                       mods: "Super",          command: "focus-view",          command_args: "next",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "N",                       mods: "Super",          command: "focus-view",          command_args: "previous",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "T",                       mods: "Super+Control",  command: "focus-output",        command_args: "next",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "N",                       mods: "Super+Control",  command: "focus-output",        command_args: "previous",),
-
-    // Standard program
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "Return",                  mods: "Super",          command: "spawn",               command_args: "alacritty",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "q",                       mods: "Super+Shift",    command: "exit",                command_args: None,),
-
-    // Screenshot
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "Print",                   mods: "None",           command: "spawn",               command_args: "screenshot_persistent",),
-
-    // Audio
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "XF86AudioRaiseVolume",    mods: "None",           command: "spawn",               command_args: "pactl set-sink-volume 1 +5%",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal", "locked"], key: "XF86AudioLowerVolume",    mods: "None",           command: "spawn",               command_args: "pactl set-sink-volume 1 -5%",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal", "locked"], key: "XF86AudioMute",           mods: "None",           command: "spawn",               command_args: "mpc toggle",),
-
-    // Launcher
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "R",                       mods: "Super",          command: "spawn",               command_args: "rofi -show combi -modes combi -combi-modes 'window,drun,run' -show-icons",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "F1",                      mods: "Super",          command: "spawn",               command_args: "neorg dmenu",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "F2",                      mods: "Super",          command: "spawn",               command_args: "keepassxc",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "F3",                      mods: "Super",          command: "spawn",               command_args: "signal-desktop",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "F4",                      mods: "Super",          command: "spawn",               command_args: "steam",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "L",                       mods: "Super",          command: "spawn",               command_args: "lock",),
-
-    // Client
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "f",                       mods: "Super",          command: "toggle-fullscreen",   command_args: None,),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "c",                       mods: "Super+Shift",    command: "close",               command_args: None,),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "space",                   mods: "Super+Control",  command: "toggle-float",        command_args: None,),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "Return",                  mods: "Super+Control",  command: "zoom",                command_args: None,),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "o",                       mods: "Super",          command: "send-to-output",      command_args: "next",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "T",                       mods: "Super+Shift",    command: "swap",                command_args: "next",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "N",                       mods: "Super+Shift",    command: "swap",                command_args: "previous",),
-
-    // Toggle all tags
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "0",                       mods: "Super",          command: "set-focused-tags",    command_args: "4294967295"),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "0",                       mods: "Super+Shift",    command: "set-view-tags",       command_args: "4294967295"),
-
-    // Mouse
-    RiverctlCommand( map_mode: MapMouse,    mode: ["normal"],           key: "BTN_LEFT",                mods: "Super",          command: "move-view",           command_args: None,),
-    RiverctlCommand( map_mode: MapMouse,    mode: ["normal"],           key: "BTN_RIGHT",               mods: "Super",          command: "resize-view",         command_args: None,),
-
-    ],
-    // Set these mappings for the tags 0-8 with key [1-9]
-    tags_number: 9,
-    tag_commands: [
-    RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super",                 command: "set-focused-tags",),
-    RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift",           command: "set-view-tags",),
-    RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Control",         command: "toggle-focused-tags",),
-    RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift+Control",   command: "toggle-view-tags",),
-    ],
-)
-
-// vim: nolinebreak nowrap textwidth=0
diff --git a/modules/home.legacy/wms/river/res/moonlander.ron b/modules/home.legacy/wms/river/res/moonlander.ron
deleted file mode 100644
index 247c1697..00000000
--- a/modules/home.legacy/wms/river/res/moonlander.ron
+++ /dev/null
@@ -1,66 +0,0 @@
-#![enable(implicit_some)]
-RiverctlCommandArray(
-    // TODO: add toggle-focus mapping
-    commands: [
-    // Movement
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "A", mods: "Alt+Control+Super+Shift", command: "exit",                 command_args: None,),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "B", mods: "Alt+Control+Super+Shift", command: "close",                command_args: None,),
-
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "C", mods: "Alt+Control+Super+Shift", command: "focus-view",           command_args: "previous",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "D", mods: "Alt+Control+Super+Shift", command: "focus-view",           command_args: "next",),
-
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "E", mods: "Alt+Control+Super+Shift", command: "swap",                 command_args: "previous",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "F", mods: "Alt+Control+Super+Shift", command: "swap",                 command_args: "next",),
-
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "G", mods: "Alt+Control+Super+Shift", command: "zoom",                 command_args: None,),
-
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "H", mods: "Alt+Control+Super+Shift", command: "toggle-fullscreen",    command_args: None,),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "I", mods: "Alt+Control+Super+Shift", command: "toggle-float",         command_args: None,),
-
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "J", mods: "Alt+Control+Super+Shift", command: "send-to-output",       command_args: "next",),
-
-
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "K", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "alacritty",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "L", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "screenshot_persistent",),
-
-    // Audio
-    // RiverctlCommand( map_mode: Map,         mode: ["normal", "locked"], key: "M", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "video-pause toggle",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal", "locked"], key: "N", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "mpc toggle",),
-
-    // Launcher
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "O", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "rofi -show combi -modes combi -combi-modes 'window,drun,run' -show-icons",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "P", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "neorg dmenu",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "Q", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "keepassxc",),
-    // RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "R", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "nheko",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "S", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "signal-desktop",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "T", mods: "Alt+Control+Super+Shift", command: "spawn",                command_args: "lock",),
-
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "U", mods: "Alt+Control+Super+Shift", command: "focus-output",         command_args: "next",),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "V", mods: "Alt+Control+Super+Shift", command: "focus-previous-tags",  command_args: None,),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "W", mods: "Alt+Control+Super+Shift", command: "send-to-previous-tags",command_args: None,),
-    //RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "X", mods: "Alt+Control+Super+Shift", command: "spawn",               command_args: "bemenu-run",),
-    //RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "Y", mods: "Alt+Control+Super+Shift", command: "spawn",               command_args: "bemenu-run",),
-
-
-    // Toggle all tags
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "0", mods: "Alt+Control+Super+Shift", command: "set-focused-tags",    command_args: "4294967295"),
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "0", mods: "Alt+Control+Shift",       command: "set-view-tags",       command_args: "4294967295"),
-
-    // Support Unicode input
-    RiverctlCommand( map_mode: Map,         mode: ["normal"],           key: "Z", mods: "Alt+Control+Super+Shift", command: "spawn",               command_args: "qmk-unicode-type 106 65377",),
-
-    // Mouse
-    RiverctlCommand( map_mode: MapMouse,    mode: ["normal"],           key: "BTN_LEFT",                mods: "Super",          command: "move-view",           command_args: None,),
-    RiverctlCommand( map_mode: MapMouse,    mode: ["normal"],           key: "BTN_RIGHT",               mods: "Super",          command: "resize-view",         command_args: None,),
-    ],
-
-    // Set these mappings for the tags 0-8 with key [1-9]
-    tags_number: 9,
-    tag_commands: [
-        RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Alt+Control+Super+Shift", command: "set-focused-tags",),
-        RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Alt+Control+Shift",       command: "set-view-tags",),
-        // TODO: RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Control",         command: "toggle-focused-tags",),
-        // TODO: RiverctlTagCommand( map_mode: Map, mode: ["normal"], mods: "Super+Shift+Control",   command: "toggle-view-tags",),
-    ],
-)
-// vim: nolinebreak nowrap textwidth=0
diff --git a/modules/home.legacy/wms/sway/default.nix b/modules/home.legacy/wms/sway/default.nix
deleted file mode 100644
index bb3ddb49..00000000
--- a/modules/home.legacy/wms/sway/default.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-# also requires:
-# security.polkit.enable = true;
-{lib, ...}: {
-  wayland.windowManager.sway = {
-    enable = true;
-    config = {
-      modifier = "Mod4";
-      # Use kitty as default terminal
-      terminal = "kitty";
-      startup = [
-        # Launch Firefox on start
-        {command = "firefox";}
-      ];
-    };
-  };
-}