From c2b343f52252d01f2c8eb06386bb387706a9c1b7 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:19:09 +0100 Subject: [PATCH 01/47] fix(git): aliases setting shouldve been alias --- modules/git.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/git.nix b/modules/git.nix index 1776f43..26dbd7c 100644 --- a/modules/git.nix +++ b/modules/git.nix @@ -26,7 +26,7 @@ with lib; git = { enable = true; settings = { - aliases = { + alias = { fix = "commit --fixup"; pufowile = "push --force-with-lease"; sl = "log --oneline --decorate --graph"; From 2620efb5ea52fb58346c69f6d7ef36b138a0c973 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:19:41 +0100 Subject: [PATCH 02/47] feat(zsh): run artisan OR testbench in docker OR local with a() and p() --- modules/zsh.nix | 56 +++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/modules/zsh.nix b/modules/zsh.nix index 20dffd6..9e05fdf 100644 --- a/modules/zsh.nix +++ b/modules/zsh.nix @@ -41,27 +41,36 @@ with lib; "rm *" ]; }; - initContent = '' - fastfetch + initContent = # sh + '' + fastfetch - function p() { - if [ -f docker-compose.yml ] || [ -f docker-compose.yaml ]; then - if docker ps -f "name=php" -f "publish=80" --format "{{.ID}}" | grep -q .; then - docker compose exec php $@ - return + function a() { + if [ -f artisan ]; then + p php artisan + else + p php ./vendor/bin/testbench + fi + } + + function p() { + if [ -f docker-compose.yml ] || [ -f docker-compose.yaml ]; then + if docker ps -f "name=php" -f "publish=80" --format "{{.ID}}" | grep -q .; then + docker compose exec php $@ + return + fi fi - fi - # TODO: local PHP should probably take precedence when dnsmasq is setup correctly - if command -v php >/dev/null 2>&1; then - $@ - return - fi + # TODO: local PHP should probably take precedence when dnsmasq is setup correctly + if command -v php >/dev/null 2>&1; then + $@ + return + fi - echo "Failed to run $@. Could not find PHP or PHP docker container." - return 1 - } - ''; + echo "Failed to run $@. Could not find PHP or PHP docker container." + return 1 + } + ''; oh-my-zsh = { enable = true; plugins = [ @@ -76,14 +85,15 @@ with lib; ]; theme = "juanghurtado"; }; - profileExtra = mkIf config.home.wayland.enable '' - if uwsm check may-start; then - exec uwsm start default - fi - ''; + profileExtra = + mkIf config.home.wayland.enable # sh + '' + if uwsm check may-start; then + exec uwsm start default + fi + ''; syntaxHighlighting.enable = true; shellAliases = { - a = "p php artisan"; artisan = "a"; cat = "bat --paging=never"; c = "p composer"; From d13bcad3941177da182ef7680c309217c7e015ad Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:19:59 +0100 Subject: [PATCH 03/47] feat(nvim): lint markdown using markdownlint-cli2 as well as vale for prose --- modules/nvim/nvim-lint.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/nvim/nvim-lint.nix b/modules/nvim/nvim-lint.nix index 7d23c74..a6de246 100644 --- a/modules/nvim/nvim-lint.nix +++ b/modules/nvim/nvim-lint.nix @@ -15,6 +15,7 @@ "jsonlint" ]; markdown = [ + "markdownlint-cli2" "vale" ]; php = [ From 4604a683f878a00ea409d3406465e016f0510140 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:20:29 +0100 Subject: [PATCH 04/47] feat(nvim): display diagnostics on virtual line with lsp-lines --- modules/nvim/lsp.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/nvim/lsp.nix b/modules/nvim/lsp.nix index 3de4da7..4588e91 100644 --- a/modules/nvim/lsp.nix +++ b/modules/nvim/lsp.nix @@ -90,6 +90,7 @@ }; }; lspkind.enable = true; # vscode-like pictograms for lsp + lsp-lines.enable = true; # diagnostics in virtual line lsp-signature.enable = true; # method signatures }; }; From c3c266c9fbf6c3794f3adbff613f268a6f53acac Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:19:41 +0100 Subject: [PATCH 05/47] feat(zsh): run artisan OR testbench in docker OR local with a() and p() --- modules/zsh.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/zsh.nix b/modules/zsh.nix index 9e05fdf..aeb50ed 100644 --- a/modules/zsh.nix +++ b/modules/zsh.nix @@ -47,9 +47,9 @@ with lib; function a() { if [ -f artisan ]; then - p php artisan + p php artisan $@ else - p php ./vendor/bin/testbench + p php ./vendor/bin/testbench $@ fi } From 3fd3cb7865324e7667630cfb2bdac8e415906c8c Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Wed, 28 Jan 2026 13:48:04 +0100 Subject: [PATCH 06/47] feat(git): add git filter-repo to simplify history management --- modules/git.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/git.nix b/modules/git.nix index 26dbd7c..94e5947 100644 --- a/modules/git.nix +++ b/modules/git.nix @@ -1,6 +1,7 @@ { config, lib, + pkgs, specialArgs, ... }: @@ -15,6 +16,10 @@ with lib; }; config = mkIf cfg.enable { + home.packages = with pkgs; [ + git-filter-repo + ]; + programs = { gh = { enable = true; From 36f5ae1d027941735e5b4854eac74e00e01e82a6 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Wed, 28 Jan 2026 13:54:37 +0100 Subject: [PATCH 07/47] feat(nvim): formatting sql with sqlruff --- modules/nvim/conform.nix | 3 +++ modules/nvim/lsp.nix | 1 + 2 files changed, 4 insertions(+) diff --git a/modules/nvim/conform.nix b/modules/nvim/conform.nix index 8de5bd2..31f157f 100644 --- a/modules/nvim/conform.nix +++ b/modules/nvim/conform.nix @@ -114,6 +114,9 @@ rust = [ "rustfmt" ]; + sql = [ + "sqruff" + ]; typescript = [ "eslint_d" "prettierd" diff --git a/modules/nvim/lsp.nix b/modules/nvim/lsp.nix index 4588e91..8d9fe3b 100644 --- a/modules/nvim/lsp.nix +++ b/modules/nvim/lsp.nix @@ -31,6 +31,7 @@ installRustc = false; }; superhtml.enable = true; + sqruff.enable = true; tailwindcss.enable = true; ts_ls.enable = true; vue_ls.enable = true; From 86c47cca68b87713ee6487b584d600ff42358dc3 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 29 Jan 2026 14:47:01 +0100 Subject: [PATCH 08/47] refactor(uwsmPrefix): include space in commands instead of variable --- modules/brightnessctl.nix | 4 ++-- modules/hyprland/binds.nix | 12 ++++++------ modules/hyprland/hyprmon.nix | 2 +- modules/hyprland/hyprpicker.nix | 2 +- modules/hyprland/settings.nix | 2 +- modules/playerctl.nix | 10 +++++----- modules/waybar.nix | 6 +++--- modules/wayland.nix | 4 ++-- modules/wlogout.nix | 2 +- modules/yazi.nix | 2 +- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/modules/brightnessctl.nix b/modules/brightnessctl.nix index 2c44e3e..b3d7cbe 100644 --- a/modules/brightnessctl.nix +++ b/modules/brightnessctl.nix @@ -21,8 +21,8 @@ with lib; wayland.windowManager.hyprland.settings = mkIf config.home.hyprland.enable { bindel = [ - ", XF86MonBrightnessDown, exec, ${uwsmPrefix}brightnessctl s 10%-" - ", XF86MonBrightnessUp, exec, ${uwsmPrefix}brightnessctl s 10%+" + ", XF86MonBrightnessDown, exec, ${uwsmPrefix} brightnessctl s 10%-" + ", XF86MonBrightnessUp, exec, ${uwsmPrefix} brightnessctl s 10%+" ]; }; }; diff --git a/modules/hyprland/binds.nix b/modules/hyprland/binds.nix index e18ec13..5b0579f 100644 --- a/modules/hyprland/binds.nix +++ b/modules/hyprland/binds.nix @@ -18,12 +18,12 @@ in "SUPER_ALT_CTRL, S, pass, ^(com\.obsproject\.Studio)$" # Hotkeys - "SUPER, Return, exec, ${uwsmPrefix}alacritty" + "SUPER, Return, exec, ${uwsmPrefix} alacritty" "SUPER, Space, exec, rofi -show-icons -show drun -l 10" "SUPER, V, exec, cliphist list | rofi -dmenu -display-columns 2 | cliphist decode | wl-copy" - "SUPER_ALT, M, exec, ${uwsmPrefix}wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" - "SUPER_ALT, B, exec, ${uwsmPrefix}~/.config/hypr/scripts/bluetooth-toggle.sh" + "SUPER_ALT, M, exec, ${uwsmPrefix} wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + "SUPER_ALT, B, exec, ${uwsmPrefix} ~/.config/hypr/scripts/bluetooth-toggle.sh" # Manipulate windows "SUPER, W, killactive" @@ -97,9 +97,9 @@ in ]; bindel = [ - ", XF86AudioMute, exec, ${uwsmPrefix}wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" - ", XF86AudioLowerVolume, exec, ${uwsmPrefix}wpctl set-volume -l 1.25 @DEFAULT_AUDIO_SINK@ 5%-" - ", XF86AudioRaiseVolume, exec, ${uwsmPrefix}wpctl set-volume -l 1.25 @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioMute, exec, ${uwsmPrefix} wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ", XF86AudioLowerVolume, exec, ${uwsmPrefix} wpctl set-volume -l 1.25 @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioRaiseVolume, exec, ${uwsmPrefix} wpctl set-volume -l 1.25 @DEFAULT_AUDIO_SINK@ 5%+" ]; bindm = [ diff --git a/modules/hyprland/hyprmon.nix b/modules/hyprland/hyprmon.nix index 13e5323..8bee5b7 100644 --- a/modules/hyprland/hyprmon.nix +++ b/modules/hyprland/hyprmon.nix @@ -21,7 +21,7 @@ with lib; wayland.windowManager.hyprland.settings = { bind = [ - "SUPER, P, exec, ${uwsmPrefix}alacritty -e hyprmon" # F4 + "SUPER, P, exec, ${uwsmPrefix} alacritty -e hyprmon" # F4 ]; }; }; diff --git a/modules/hyprland/hyprpicker.nix b/modules/hyprland/hyprpicker.nix index d010bbc..66e8744 100644 --- a/modules/hyprland/hyprpicker.nix +++ b/modules/hyprland/hyprpicker.nix @@ -21,7 +21,7 @@ with lib; wayland.windowManager.hyprland.settings = { bind = [ - "SUPER, D, exec, ${uwsmPrefix}hyprpicker -na" + "SUPER, D, exec, ${uwsmPrefix} hyprpicker -na" ]; }; }; diff --git a/modules/hyprland/settings.nix b/modules/hyprland/settings.nix index 0739836..a1fb775 100644 --- a/modules/hyprland/settings.nix +++ b/modules/hyprland/settings.nix @@ -5,7 +5,7 @@ in { wayland.windowManager.hyprland.settings = { exec-once = [ - "${uwsmPrefix} wl-paste -w cliphist store" # TODO: switch to clipse or stick with rofi and cliphist? + "${uwsmPrefix} wl-paste -w cliphist store" # TODO: switch to clipse or stick with rofi and cliphist? ]; monitor = [ diff --git a/modules/playerctl.nix b/modules/playerctl.nix index 3452e8d..3f3ce67 100644 --- a/modules/playerctl.nix +++ b/modules/playerctl.nix @@ -21,11 +21,11 @@ with lib; wayland.windowManager.hyprland.settings = mkIf config.home.hyprland.enable { bindl = [ - ", XF86AudioPrev, exec, ${uwsmPrefix}playerctl previous" - ", XF86AudioPlay, exec, ${uwsmPrefix}playerctl play-pause" - ", XF86AudioNext, exec, ${uwsmPrefix}playerctl next" - ", XF86AudioMedia, exec, ${uwsmPrefix}playerctl play-pause" - ", XF86AudioStop, exec, ${uwsmPrefix}playerctl stop" + ", XF86AudioPrev, exec, ${uwsmPrefix} playerctl previous" + ", XF86AudioPlay, exec, ${uwsmPrefix} playerctl play-pause" + ", XF86AudioNext, exec, ${uwsmPrefix} playerctl next" + ", XF86AudioMedia, exec, ${uwsmPrefix} playerctl play-pause" + ", XF86AudioStop, exec, ${uwsmPrefix} playerctl stop" ]; }; }; diff --git a/modules/waybar.nix b/modules/waybar.nix index cb14e20..27463c2 100644 --- a/modules/waybar.nix +++ b/modules/waybar.nix @@ -117,7 +117,7 @@ with lib; " " ]; }; - "on-click" = "${uwsmPrefix}pwvucontrol"; + "on-click" = "${uwsmPrefix} pwvucontrol"; }; "network" = { @@ -131,7 +131,7 @@ with lib; "tooltip-format-ethernet" = " {ifname} ({ipaddr}/{cidr})"; "tooltip-format-disconnected" = "Disconnected"; "max-length" = 50; - "on-click" = "${uwsmPrefix}alacritty -e impala"; + "on-click" = "${uwsmPrefix} alacritty -e impala"; }; "bluetooth" = { @@ -142,7 +142,7 @@ with lib; "tooltip-format" = "{device_alias}"; "tooltip-format-connected" = "󰂰 {device_enumerate}"; "tooltip-format-enumerate-connected" = "{device_alias}"; - "on-click" = "${uwsmPrefix}alacritty -e bluetui"; + "on-click" = "${uwsmPrefix} alacritty -e bluetui"; }; "battery" = { diff --git a/modules/wayland.nix b/modules/wayland.nix index 23a9453..003597a 100644 --- a/modules/wayland.nix +++ b/modules/wayland.nix @@ -6,7 +6,7 @@ }: let cfg = config.home.wayland; - uwsmPrefix = "uwsm app -- "; + uwsmPrefix = "uwsm app --"; in with lib; { @@ -14,7 +14,7 @@ with lib; home.wayland = { enable = mkEnableOption "wayland"; uwsm.prefix = mkOption { - default = "${uwsmPrefix}"; + default = "${uwsmPrefix} "; type = with types; str; description = "UWSM prefix"; }; diff --git a/modules/wlogout.nix b/modules/wlogout.nix index cc510d6..d24a6ef 100644 --- a/modules/wlogout.nix +++ b/modules/wlogout.nix @@ -20,7 +20,7 @@ with lib; layout = [ { "label" = "lock"; - "action" = "which hyprlock &>/dev/null && ${uwsmPrefix}hyprlock || loginctl lock-session"; + "action" = "which hyprlock &>/dev/null && ${uwsmPrefix} hyprlock || loginctl lock-session"; "text" = "[L] ock"; "keybind" = "l"; } diff --git a/modules/yazi.nix b/modules/yazi.nix index 616c3c3..395eb89 100644 --- a/modules/yazi.nix +++ b/modules/yazi.nix @@ -66,7 +66,7 @@ with lib; wayland.windowManager.hyprland.settings = mkIf config.home.hyprland.enable { bind = [ - "SUPER, E, exec, ${uwsmPrefix}alacritty -e 'yazi'" + "SUPER, E, exec, ${uwsmPrefix} alacritty -e yazi" ]; }; }; From 1072c7877f10850a1bc81bf7124ba3ccd5befa82 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 29 Jan 2026 14:56:50 +0100 Subject: [PATCH 09/47] refactor(alacritty): extract to dedicated module And keep hyprland binds with the module instead. Alacritty now opens with SUPER A so we can start it without launching Zellij by default (to support attaching to remote sessions without nesting). --- hosts/luna/users/shorty/default.nix | 1 + hosts/mars/users/shorty/default.nix | 1 + hosts/shared/default.nix | 9 -------- modules/alacritty.nix | 32 +++++++++++++++++++++++++++++ modules/hyprland/binds.nix | 1 - 5 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 modules/alacritty.nix diff --git a/hosts/luna/users/shorty/default.nix b/hosts/luna/users/shorty/default.nix index 63b3e30..50b6b08 100644 --- a/hosts/luna/users/shorty/default.nix +++ b/hosts/luna/users/shorty/default.nix @@ -28,6 +28,7 @@ with lib; scanmem ]; + alacritty.enable = true; bluetui.enable = true; brightnessctl.enable = true; dunst.enable = true; diff --git a/hosts/mars/users/shorty/default.nix b/hosts/mars/users/shorty/default.nix index 1f04288..2d7cdb6 100644 --- a/hosts/mars/users/shorty/default.nix +++ b/hosts/mars/users/shorty/default.nix @@ -11,6 +11,7 @@ with lib; nix-prefetch-git ]; + alacritty.enable = true; docker.enable = true; eza.enable = true; feh = { diff --git a/hosts/shared/default.nix b/hosts/shared/default.nix index 9bd2a5a..b0456ee 100644 --- a/hosts/shared/default.nix +++ b/hosts/shared/default.nix @@ -46,13 +46,4 @@ with lib; zip ]; }; - - programs = { - alacritty = { - enable = true; - settings = { - font.offset.y = 8; - }; - }; - }; } diff --git a/modules/alacritty.nix b/modules/alacritty.nix new file mode 100644 index 0000000..56a3b4a --- /dev/null +++ b/modules/alacritty.nix @@ -0,0 +1,32 @@ +{ + config, + lib, + ... +}: +let + cfg = config.home.alacritty; + uwsmPrefix = config.home.wayland.uwsm.prefix; +in +with lib; +{ + options = { + home.alacritty.enable = mkEnableOption "alacritty"; + }; + + config = mkIf cfg.enable { + programs = { + alacritty = { + enable = true; + settings = { + font.offset.y = 8; + }; + }; + }; + + wayland.windowManager.hyprland.settings = mkIf config.home.hyprland.enable { + bind = [ + "SUPER, Return, exec, ${uwsmPrefix} alacritty" + ]; + }; + }; +} diff --git a/modules/hyprland/binds.nix b/modules/hyprland/binds.nix index 5b0579f..271aaa5 100644 --- a/modules/hyprland/binds.nix +++ b/modules/hyprland/binds.nix @@ -18,7 +18,6 @@ in "SUPER_ALT_CTRL, S, pass, ^(com\.obsproject\.Studio)$" # Hotkeys - "SUPER, Return, exec, ${uwsmPrefix} alacritty" "SUPER, Space, exec, rofi -show-icons -show drun -l 10" "SUPER, V, exec, cliphist list | rofi -dmenu -display-columns 2 | cliphist decode | wl-copy" From fd5bea713da6ad06c36f03cf366208d2bf1df4c6 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 29 Jan 2026 14:58:42 +0100 Subject: [PATCH 10/47] refactor(zellij): alacritty automatically launches $SHELL --- modules/zellij.nix | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/zellij.nix b/modules/zellij.nix index 9465798..1ec7587 100644 --- a/modules/zellij.nix +++ b/modules/zellij.nix @@ -14,11 +14,6 @@ with lib; config = mkIf cfg.enable { programs = { - alacritty = mkIf config.programs.alacritty.enable { - settings = { - terminal.shell = "zellij"; - }; - }; zellij = { enable = true; enableZshIntegration = config.programs.zsh.enable; From 939f97e6ea16e4aa38e5d85290971d7a0d5c22fb Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 29 Jan 2026 14:59:29 +0100 Subject: [PATCH 11/47] fix(zellij): use default layout as this displays the keybindings on CTRL B I found myself having to look up keybinds I don't use often by hand too often.. --- modules/zellij.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/zellij.nix b/modules/zellij.nix index 1ec7587..ad89902 100644 --- a/modules/zellij.nix +++ b/modules/zellij.nix @@ -19,7 +19,6 @@ with lib; enableZshIntegration = config.programs.zsh.enable; settings = { show_startup_tips = false; - default_layout = "compact"; # NOTE: https://github.com/zellij-org/zellij/blob/main/zellij-utils/assets/config/default.kdl keybinds = { "normal clear-defaults=true" = { From 0bd4caffbbca4fc2bf7dd450d812f737d3cb6f37 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Fri, 30 Jan 2026 11:19:26 +0100 Subject: [PATCH 12/47] refactor(sops): rekey with proper master key --- .sops.yaml | 2 +- hosts/shared/secrets/openrouter_api_key | 8 ++++---- hosts/shared/secrets/rclone.conf | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.sops.yaml b/.sops.yaml index ee06b0a..897056c 100644 --- a/.sops.yaml +++ b/.sops.yaml @@ -1,5 +1,5 @@ keys: - - &master age1fczq47wpa2wpm9ejy85qw3axw2c9v0f4qrywv5amnuqsjc87ws6qx75pfr + - &master age1hunzh8g6qs0yztln5q4akxvepd667xky4lkff4jga57kzah69ujqvpd7kt - &host_mars age1epkfxmjk0tlne8rmxqq77u06q3lnf5xfjcrwq42nuasswefndyfscw84cy - &user_shorty age1hy523tlslqas8qgs0lxgxanp9gx06fjekn608w4qf66mxkjzmucqh0g6vg creation_rules: diff --git a/hosts/shared/secrets/openrouter_api_key b/hosts/shared/secrets/openrouter_api_key index 8d47fff..853502c 100644 --- a/hosts/shared/secrets/openrouter_api_key +++ b/hosts/shared/secrets/openrouter_api_key @@ -3,16 +3,16 @@ "sops": { "age": [ { - "recipient": "age1fczq47wpa2wpm9ejy85qw3axw2c9v0f4qrywv5amnuqsjc87ws6qx75pfr", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArcnppbEtic29jMWRYWWRk\nSDkrdnd2VUthMlFNOHFTYmFFRjYwTkZLK0UwCkVLdmt3NFFjQVB1U096STd0UmVn\nT2FyNVhlLzdHNG5lMktVTlRNS1FjZU0KLS0tIFE1UU9zNFZlcHVEdTJ0dEdIa3hh\nZHBXS0tPMnBhVnpJQlJaU3lBODR5Uk0KMGRp7RvRgMlARbQJ+R6eGwS0JmpV3lHD\nrroOoBT2iac//VJGRwGBvHy8YIuA02Begu0GDGNjcfO6UPURmsCr+Q==\n-----END AGE ENCRYPTED FILE-----\n" + "recipient": "age1hunzh8g6qs0yztln5q4akxvepd667xky4lkff4jga57kzah69ujqvpd7kt", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRdUxtd0lTcCtYVUwvQzZN\nSndsb0hGN3Jta3V0Rmp2OUk5ZUJHcGRsRG53Cmp0RkJRZytVZjZ3cDR0SFczTGMv\nMzB2b2xsWUxKck1pQUtabmhTNFdEb0UKLS0tIGpGUm54aE1vZWs2UnhENXUyWDgr\nMzdVNjRXYkNRMXJ6VEdEZjNTenJqeEUKc6SG6nMbf9kWOKoTFjkb746pgQMiVXNF\n0SAAMIT9TOnLjsN6J6/e0LFpboxKq/uv0ghfA5CGTQexhwZbFIItAA==\n-----END AGE ENCRYPTED FILE-----\n" }, { "recipient": "age1epkfxmjk0tlne8rmxqq77u06q3lnf5xfjcrwq42nuasswefndyfscw84cy", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIb3lxS0pTMkpQS3QxN3E3\nNXdDZ0lUWkxxVjhNWmUvTW13Q0ZNa0wxaGtvCk1aVkd1VW9UMWFacVRxNWJRMVA1\nZ2pyTEQ2dldkdG9MOUkzakhCYU5yczAKLS0tIGVZRVV4bWpicG9sZ0pZdUF2a3lo\nMkFnS25vRTJPcElkUzEvejdES0l0SU0KK3ajTZTQoOCq9mH9Qw9ojorSMwbZbjgH\nz6VguqunOyaupgk/Bz/E3iuQi7hBIixVOnaNrcDokEs3q3tn8KhzaQ==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIMnpzUjhuemVjbURlQ2k0\naUcxbkRzNVA3SnVVT2ZWbjgzcFpwTDhhb3lrCm9Fa1VtUzQzWEQybXZOOHZpT2Fh\nV2pVWXNUZDdjNzNvSzBBK0U1em56cmMKLS0tIFY3eGNYMnUzWmJGZ0VLeXY3ZEdu\nUUdmVWQwZUFvaWxud0FsWGFncCtPWTgKD32D6fun2Do5cIlJAsZCbQdcahCUaxzi\nyFlJuK1uoVuszANehfXGwNvskPc2IhFDS7HkY4LkyICVwzmDIVO70g==\n-----END AGE ENCRYPTED FILE-----\n" }, { "recipient": "age1hy523tlslqas8qgs0lxgxanp9gx06fjekn608w4qf66mxkjzmucqh0g6vg", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyQVZsTnIrTjNzVmJTYW42\nTFVZbGRwWTA1ZVNaRUx1Q3prZnVIRk80NmpZCmRYa1p1RitJRzd4TjNldHFFVDk5\nUVpkaE00SDcxQW4yUXc0RHVDeWtiSjgKLS0tIHRHMkc2VnFTZThHTGgzdEZ3VTkw\ndFRmNVM1VUZ6U3RRZDlraDNMZXJQVGcKM4mdeIV9PSJO5WemQkkswrW31vIDi1uA\nOMr9xnmLSHACacJjCsiiPISdMZu0qVVNBl/DCoJZVJEi5d6u5I++qw==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWOFZneFdjeklraHlPdVdR\neFltVWh4UVlQTUhTMDVCN3pOVWZqcHk0QndZClJnRnQ0RlR5NUFvUW00R1ZGeGVN\ndVJiTDhKM2grSy9NOFI1bmIrTVFaWVkKLS0tIFFVOXllc3MzanMyeXJmSDdvNVVi\nbzY2SlhOeEhDei8vTjR5UTdCVWpLN00KLBnF2fSnEetO99rz0cwQOMWYg8pFpxHh\nrNES3yMfTBuXUXs+do+U7sOtCVFeVupGiCiFaQksaQ+TcSsHEQ+i2w==\n-----END AGE ENCRYPTED FILE-----\n" } ], "lastmodified": "2025-02-18T10:54:37Z", diff --git a/hosts/shared/secrets/rclone.conf b/hosts/shared/secrets/rclone.conf index 34499ae..065dba7 100644 --- a/hosts/shared/secrets/rclone.conf +++ b/hosts/shared/secrets/rclone.conf @@ -3,16 +3,16 @@ "sops": { "age": [ { - "recipient": "age1fczq47wpa2wpm9ejy85qw3axw2c9v0f4qrywv5amnuqsjc87ws6qx75pfr", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZNWlseGRWcmZiUUVueVpD\nODB0cHRhUnNUR3BFek9VZHZhZnV3MHVmR1RRCmxoVVFFc1AzODVhWlY3SzBvZ3Ay\naUV0dVJ2RDVQaWc4Zlg1enlPbHFLL0UKLS0tIEtoaE45SG9lVlJmWm5lWlM4YVFB\naUZMcTdvbDlHK2RYQWlTNWlkNHZTSm8K15frHfBMPXhiHN9r91d4h6WUJLPrU9+F\nv3NBJ84Dhl/VRRthJyXSg3LTMI9eN5Rq9VtzLO8Ye3GCiSBeyaUH0Q==\n-----END AGE ENCRYPTED FILE-----\n" + "recipient": "age1hunzh8g6qs0yztln5q4akxvepd667xky4lkff4jga57kzah69ujqvpd7kt", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZNmdVL2pUb01VOVFDQ0dp\nZE8vQzEzT2w5S3VNRUtBbithUDdrcGEyaUFBCitiWnZ0RkhYenhzNURuNzJ2N1kx\neXZsK081RzBSbWhZR096NGhFRCtaMk0KLS0tIGFsNnZDVktHYjM5azczM3oyWUdn\nazNZSkJDVTcrK0Z2OUNCMHdRME1BeUkKpI4XhCCX1P/h0dqHi2OYmZA7Zcr/zRpB\nIP97L/OPlQlmfrbsznqNCtwMNYZ7lwv+FJRXU4XohqKgZ5IRrOAg/A==\n-----END AGE ENCRYPTED FILE-----\n" }, { "recipient": "age1epkfxmjk0tlne8rmxqq77u06q3lnf5xfjcrwq42nuasswefndyfscw84cy", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzNFh2WE81eUpmQ0hzaEx1\nczBweXVTTmVUbGdrNzVPeGE3bjREa1RhcjFRCmwwVEI0b0E1alprbTl2eGF0YXFi\ncDNKOVJKOHNCdDR4MzR0cFN4ZXpVYTQKLS0tIGZ2WEFySWV5V0hxdWpaeWJSNlZD\ndmF4Q2lPZjhEYTYvcllTOFpOUDRYcFEK7ZrvxKB41UgH2AafvkRgzOckv809H37g\nKiOknxWOzzngILhp3o1EvWFrE65TH/Rlh8i2f0maqJj9Dw/8UfdGbA==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtaXN1dUVCQ0t5MHM0cG1J\nWWJ0dC9UY0k5VkZzQzhBeHNBS1ErMWdkT21BCmlyTnRJRlpzT25teU4zeW1LZ2g1\nZmpkUEFxa3JTSXUrdlA4MXdNY1hPNEUKLS0tIEZqNW5uQzlUZlB2dnJmdHhENUZU\nT2dKSmdaQmY5RmtBUFMzUHY2RHBabVEKwYvwcsHoTxU5OkBwTBow+VP4Cl/KzWmC\nWLiIeUAx+zfDmpjbsV0JHuw1jlfW4ku1JJ6fCz7LIrUID3dcwU0PvQ==\n-----END AGE ENCRYPTED FILE-----\n" }, { "recipient": "age1hy523tlslqas8qgs0lxgxanp9gx06fjekn608w4qf66mxkjzmucqh0g6vg", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzN3dzeUs3dU9CVUM4b2JH\nNFk2ZGNETWEzTjUzUkgzMmVNUmN1RnFweGpJCi9EZ2w5dnBDV2dyTjcvZy9hdDFq\ncjhtcWJadE1wNEpjdUV0eWVBWkJGZkEKLS0tIHBSZkFSYy9PQ0tPb2RnWFZBTVFh\nYjRva2pEbVRPbEpWSUFNRXoyOEJJNkUKvQ3qJPwW8kmVHsB0am1ZIEYBdweDWlMu\nocLLNOTlL/rlIdTF3Y+h2oUjOzBzSZXKtWq+9QHra5vGwipL1K5zAQ==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0TzJiUzNxYU5udzBHY2Mv\ndWY1NkZHSGZzamtLekhsTm5HRFl4clc0b1dFClpmWi9YYWE4Y21icUJKKzhZY2VS\nalJjeFlkM2pVLzBUQjRUamxYSVg5Y2MKLS0tIDdPMzYzYkNPb3RXck5RNFBORHhM\nbVlDem5OQ1VCNExqTU9BK0RET2I2Z1UKNCt7dPryjelSLobAGgipMuMZExZzkATV\nEjh8FKJ5xSNdDYWHiirY2dI/In8i26WY+3JiobB075V7JQ9I4OLttg==\n-----END AGE ENCRYPTED FILE-----\n" } ], "lastmodified": "2025-02-12T10:44:19Z", From 6709c5dafa5621b758323b68ded3b18ae15bfe66 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Fri, 30 Jan 2026 17:04:56 +0100 Subject: [PATCH 13/47] fixup! feat(firefox): custom search engines for Sonarr and Radarr --- modules/firefox.nix | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/firefox.nix b/modules/firefox.nix index 027ef13..9cd90dd 100644 --- a/modules/firefox.nix +++ b/modules/firefox.nix @@ -97,75 +97,75 @@ with lib; "bing".metaData.hidden = true; "ddg".metaData.alias = "@d"; "google".metaData.alias = "@g"; - "wikipedia (en)".metaData.alias = "@w"; + "wikipedia".metaData.alias = "@w"; - "Arch Linux Wiki" = { + "archlinux" = { urls = [ { template = "https://wiki.archlinux.org/index.php?search={searchTerms}"; } ]; icon = "https://wiki.archlinux.org/favicon.ico"; definedAliases = [ "@a" ]; }; - "Github" = { + "github" = { urls = [ { template = "https://github.com/search?q={searchTerms}"; } ]; icon = "https://github.githubassets.com/favicons/favicon.svg"; definedAliases = [ "@gh" ]; }; - "Reddit" = { + "reddit" = { urls = [ { template = "https://reddit.com/search?q={searchTerms}"; } ]; icon = "https://www.redditstatic.com/shreddit/assets/favicon/192x192.png"; definedAliases = [ "@r" ]; }; - "MyNixOS" = { + "mynixos" = { urls = [ { template = "https://mynixos.com/search?q={searchTerms}"; } ]; icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; definedAliases = [ "@n" ]; }; - "NixOS Wiki" = { + "nixoswiki" = { urls = [ { template = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; } ]; icon = "https://wiki.nixos.org/nixos.png"; definedAliases = [ "@nw" ]; }; - "PHP" = { + "php" = { urls = [ { template = "https://php.net/{searchTerms}"; } ]; icon = "https://www.php.net/favicon-196x196.png?v=2"; definedAliases = [ "@php" ]; }; - "ProtonDB" = { + "protondb" = { urls = [ { template = "https://protondb.com/search?q={searchTerms}"; } ]; icon = "https://protondb.com/sites/protondb/images/favicon-32x32.png"; definedAliases = [ "@p" ]; }; - "YouTube" = { + "youtube" = { urls = [ { template = "https://youtube.com/results?search_query={searchTerms}"; } ]; icon = "https://youtube.com/img/favicon_144.png"; definedAliases = [ "@yt" ]; }; - "YouTube Music" = { + "youtubemusic" = { urls = [ { template = "https://music.youtube.com/search?q={searchTerms}"; } ]; icon = "https://music.youtube.com/img/favicon_144.png"; definedAliases = [ "@ytm" ]; }; - "Rotten Tomatoes" = { + "rottentomatoes" = { urls = [ { template = "https://www.rottentomatoes.com/search?search={searchTerms}"; } ]; icon = "https://editorial.rottentomatoes.com/wp-content/uploads/2022/05/favicon.png?w=32"; definedAliases = [ "@rt" ]; }; - "Sonarr" = { + "sonarr" = { urls = [ { template = "https://sonarr.99linesofcode.nl/add/new?term={searchTerms}"; } ]; icon = "https://sonarr.99linesofcode.nl/Content/Images/Icons/favicon-32x32.png"; definedAliases = [ "@sonarr" ]; }; - "Radarr" = { + "radarr" = { urls = [ { template = "https://radarr.99linesofcode.nl/add/new?term={searchTerms}"; } ]; icon = "https://radarr.99linesofcode.nl/Content/Images/Icons/favicon-32x32.png"; definedAliases = [ "@radarr" ]; From 12b8e33aa00406947351a487fd163d2088a47817 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 3 Feb 2026 13:53:23 +0100 Subject: [PATCH 14/47] fix(mars.shorty): enable styling with stylix --- hosts/mars/users/shorty/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/mars/users/shorty/default.nix b/hosts/mars/users/shorty/default.nix index 2d7cdb6..18b4106 100644 --- a/hosts/mars/users/shorty/default.nix +++ b/hosts/mars/users/shorty/default.nix @@ -24,6 +24,7 @@ with lib; openssh.enable = true; rclone.enable = true; sops.enable = true; + stylix.enable = true; yazi.enable = true; zellij.enable = true; zsh.enable = true; From af6a6c5d901bc5253da2003f5b3030280bab5220 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Fri, 6 Feb 2026 22:32:59 +0000 Subject: [PATCH 15/47] feat(lazysql): TUI client for SQL --- hosts/luna/users/shorty/default.nix | 1 + hosts/mars/users/shorty/default.nix | 1 + modules/lazysql.nix | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 modules/lazysql.nix diff --git a/hosts/luna/users/shorty/default.nix b/hosts/luna/users/shorty/default.nix index 50b6b08..0915d29 100644 --- a/hosts/luna/users/shorty/default.nix +++ b/hosts/luna/users/shorty/default.nix @@ -50,6 +50,7 @@ with lib; hyprland.enable = true; impala.enable = true; lazydocker.enable = true; + lazysql.enable = true; mpv.enable = true; nvim.enable = true; obsidian.enable = true; diff --git a/hosts/mars/users/shorty/default.nix b/hosts/mars/users/shorty/default.nix index 18b4106..80bf61a 100644 --- a/hosts/mars/users/shorty/default.nix +++ b/hosts/mars/users/shorty/default.nix @@ -20,6 +20,7 @@ with lib; }; git.enable = true; lazydocker.enable = true; + lazysql.enable = true; nvim.enable = true; openssh.enable = true; rclone.enable = true; diff --git a/modules/lazysql.nix b/modules/lazysql.nix new file mode 100644 index 0000000..f54d9ad --- /dev/null +++ b/modules/lazysql.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.home.lazysql; +in +with lib; +{ + options = { + home.lazysql.enable = mkEnableOption "lazysql"; + }; + + config = mkIf cfg.enable { + programs.lazysql = { + enable = true; + }; + }; +} From ddbe338df3631ef93c132b2e3f625fe8e94a9745 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Thu, 19 Feb 2026 20:38:55 +0100 Subject: [PATCH 16/47] fix(sops): use age key generated for host by nixos-config --- modules/sops.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/sops.nix b/modules/sops.nix index f73be2e..f873a42 100644 --- a/modules/sops.nix +++ b/modules/sops.nix @@ -3,10 +3,12 @@ inputs, lib, pkgs, + specialArgs, ... }: let cfg = config.home.sops; + inherit (specialArgs) username; in with lib; { @@ -29,6 +31,7 @@ with lib; defaultSopsFile = ../.sops.yaml; age = { generateKey = false; + keyFile = "/home/${username}/.config/sops/age/keys.txt"; sshKeyPaths = [ "${config.home.homeDirectory}/.ssh/id_ed25519" ]; }; }; From c4d0bf088e77ed77426865ec8193e477a10f0972 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:18:04 +0100 Subject: [PATCH 17/47] refactor(rustdesk): install pre build package --- hosts/luna/users/shorty/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/luna/users/shorty/default.nix b/hosts/luna/users/shorty/default.nix index 0915d29..40e8668 100644 --- a/hosts/luna/users/shorty/default.nix +++ b/hosts/luna/users/shorty/default.nix @@ -18,7 +18,7 @@ with lib; insomnia # FOSS alternative to Postman API tester nix-prefetch-git polychromatic - # rustdesk + rustdesk-flutter scrcpy android-tools act # run GitHub Actions locally From 16ea4543a3329fbd4f069124de5cdb2827966a7d Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:18:53 +0100 Subject: [PATCH 18/47] fix(yazi): settings.manager was renamed to settings.mgr --- modules/yazi.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/yazi.nix b/modules/yazi.nix index 395eb89..2463672 100644 --- a/modules/yazi.nix +++ b/modules/yazi.nix @@ -22,7 +22,7 @@ with lib; programs.yazi = { enable = true; settings = { - manager = { + mgr = { linemode = "none"; ratio = [ 1 From 6f29d71b577e4069b2c9c579738612fce9f14df3 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:19:35 +0100 Subject: [PATCH 19/47] fix(yazi): suppress shell wrapper rename warning by being explicit --- modules/yazi.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/yazi.nix b/modules/yazi.nix index 2463672..665a664 100644 --- a/modules/yazi.nix +++ b/modules/yazi.nix @@ -59,6 +59,7 @@ with lib; micro_workers = 5; }; }; + shellWrapperName = "y"; plugins = { # TODO: add ouch.yazi for compressing and decompressing archives }; From 0da7ebc3d5e042ed96e76d0cfec7819e8f75851d Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:20:20 +0100 Subject: [PATCH 20/47] feat(nvim): force mini-icons to use glyphs --- modules/nvim/mini.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/nvim/mini.nix b/modules/nvim/mini.nix index 20e8e22..3ad6d46 100644 --- a/modules/nvim/mini.nix +++ b/modules/nvim/mini.nix @@ -21,7 +21,9 @@ }; }; }; - icons = { }; + icons = { + style = "glyph"; + }; pairs = { modes = { insert = true; From db7b9ec12ea729aa29dcab7dd4510b66e9bc0276 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:55:47 +0100 Subject: [PATCH 21/47] fix(ghidra): now builds correctly again --- hosts/luna/users/shorty/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/luna/users/shorty/default.nix b/hosts/luna/users/shorty/default.nix index 40e8668..01a0c2e 100644 --- a/hosts/luna/users/shorty/default.nix +++ b/hosts/luna/users/shorty/default.nix @@ -24,7 +24,7 @@ with lib; act # run GitHub Actions locally wireshark gdb - # ghidra # FIXME: wouldnt build for 4ebc11dad54b7e5b8a46c6edb2533852e99ec566bbe10836b2d6dba89c9c2e3c + ghidra scanmem ]; From 6cd01fa3c7381feff5a01c27afe9adaa5fd30f79 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:56:22 +0100 Subject: [PATCH 22/47] fix(feh): disable override as imlib2 build argument no longer exists --- modules/feh.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/feh.nix b/modules/feh.nix index d6c49eb..55ca574 100644 --- a/modules/feh.nix +++ b/modules/feh.nix @@ -41,7 +41,6 @@ with lib; config = mkIf cfg.enable { programs.feh = with pkgs; { enable = true; - # package = feh.override { imlib2 = imlib2Full; }; # FIXME: wouldnt build for 4ebc11dad54b7e5b8a46c6edb2533852e99ec566bbe10836b2d6dba89c9c2e3c }; xdg.mimeApps.defaultApplications = mkIf cfg.defaultApplication.enable ( From 3a6224d6333fb7a64cc53012902de4a425817d58 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:57:10 +0100 Subject: [PATCH 23/47] refactor(nvim): disable treesitter-refactor until it has been updated --- modules/nvim/treesitter.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nvim/treesitter.nix b/modules/nvim/treesitter.nix index ee2b76e..7ae1980 100644 --- a/modules/nvim/treesitter.nix +++ b/modules/nvim/treesitter.nix @@ -19,7 +19,7 @@ trim_scope = "outer"; }; }; - # treesitter-refactor.enable = true; # FIXME: wouldnt build for 4ebc11dad54b7e5b8a46c6edb2533852e99ec566bbe10836b2d6dba89c9c2e3c + # treesitter-refactor.enable = true; # FIXME:conflicts with treesitter changes/migration, enable later treesitter-textobjects = { enable = true; settings = { From b7d23766f90d3b85ea84bcaed7c282eda8a92444 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:57:43 +0100 Subject: [PATCH 24/47] fix(freecad): freecad-wayland no longer exists and freecad presently doesn't build --- hosts/luna/users/shorty/default.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hosts/luna/users/shorty/default.nix b/hosts/luna/users/shorty/default.nix index 01a0c2e..8e771f7 100644 --- a/hosts/luna/users/shorty/default.nix +++ b/hosts/luna/users/shorty/default.nix @@ -13,8 +13,7 @@ with lib; bitwarden-cli discord electron - # (freecad.override { withWayland = config.home.wayland.enable; }) - freecad-wayland + # freecad # FIXME: doesn't build with nixpkgs#2fc6539b481e1d2569f25f8799236694180c0993 insomnia # FOSS alternative to Postman API tester nix-prefetch-git polychromatic From 8db600f122788185cb2799e308603118a47035d8 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:59:30 +0100 Subject: [PATCH 25/47] chore: nix flake update 2fc6539b481e1d2569f25f8799236694180c0993 --- flake.lock | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/flake.lock b/flake.lock index cc70b52..e26409b 100644 --- a/flake.lock +++ b/flake.lock @@ -92,11 +92,11 @@ ] }, "locked": { - "lastModified": 1765835352, - "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", + "lastModified": 1769996383, + "narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "a34fae9c08a15ad73f295041fec82323541400a9", + "rev": "57928607ea566b5db3ad13af0e57e921e6b12381", "type": "github" }, "original": { @@ -207,11 +207,11 @@ ] }, "locked": { - "lastModified": 1768240557, - "narHash": "sha256-bVqJ34yMiiUQwYhjliiiN5LBH1Y+UldbIjNTCUtDdwE=", + "lastModified": 1772060133, + "narHash": "sha256-VuyRptb8v1lVGMlLp4/1vRX3Efwec0CN0S6mKmDPzLg=", "owner": "nix-community", "repo": "home-manager", - "rev": "b3f737e70fb9eef1d2308ea6738ffed5ae080f9b", + "rev": "ce9b6e52500a0ea0ec48f0bbf6d7a3e431d9dfa4", "type": "github" }, "original": { @@ -227,11 +227,11 @@ ] }, "locked": { - "lastModified": 1768184343, - "narHash": "sha256-dS+Xr1UQYBn8IUWs2/pme7xwl/CGGtmwCnyyfhOQgtM=", + "lastModified": 1772073742, + "narHash": "sha256-wl7hHR9lC3hDnNecY7LquuApIEyRFTzA9reAoOUqE4c=", "owner": "nix-community", "repo": "nix-vscode-extensions", - "rev": "585d0a79468dfd5a1234b4c867fadc7cf24b6483", + "rev": "13af57106c02b31342f8046860550e526218eaa4", "type": "github" }, "original": { @@ -242,11 +242,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1768127708, - "narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=", + "lastModified": 1771848320, + "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38", + "rev": "2fc6539b481e1d2569f25f8799236694180c0993", "type": "github" }, "original": { @@ -265,11 +265,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1767906546, - "narHash": "sha256-AoSWS8+P+7hQ/jIdv0wBjgH1MvnerdWBFXO4GV3JoQs=", + "lastModified": 1771135771, + "narHash": "sha256-wyvBIhDuyCRyjB3yPg77qoyxrlgQtBR1rVW3c9knV3E=", "owner": "nix-community", "repo": "nixvim", - "rev": "7eb8f36f085b85a2aeff929aff52d0f6aa14e000", + "rev": "ed0424f0b08d303a7348f52f7850ad1b2704f9ba", "type": "github" }, "original": { @@ -286,11 +286,11 @@ ] }, "locked": { - "lastModified": 1768240195, - "narHash": "sha256-tBWjR3zFzc6KftTiITuQ71Y1XylPsqN4XgSfYxtItT0=", + "lastModified": 1772120935, + "narHash": "sha256-0XNEMp/aIxhdC7+cEjqoeVgnbRN30o1RaNCcyLpkoko=", "owner": "nix-community", "repo": "NUR", - "rev": "a1bc4fd38ae4c787e18d20991c472c8f0c556bd9", + "rev": "197e0b37cd38b86556175fa8818f3f57f47632b8", "type": "github" }, "original": { @@ -343,11 +343,11 @@ ] }, "locked": { - "lastModified": 1768104471, - "narHash": "sha256-HdnXWQsA1EI27IJlaENUEEug58trUrh6+MT0cFiDHmY=", + "lastModified": 1772048434, + "narHash": "sha256-/wA0OaH6kZ/pFA+nXR/tvg5oupOmEDmMS5us79JT60o=", "owner": "mic92", "repo": "sops-nix", - "rev": "94f9cbd20f680ebb2ad6cdf39da97cbcfaedf004", + "rev": "334daa7c273dd8bf7a0cd370e4e16022b64e55e9", "type": "github" }, "original": { @@ -377,11 +377,11 @@ "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1768241331, - "narHash": "sha256-li0Z2Tr5qpH+wyuCMpzXSsHYRleaTukcdLTpAsGcVzY=", + "lastModified": 1771787992, + "narHash": "sha256-Vg4bGwwenNYI8p3nJTl9FRyeIyrjATeZrZr+GyUSDrw=", "owner": "danth", "repo": "stylix", - "rev": "a62840a9e95801969a03b91e49c1607b5322224c", + "rev": "30054cca073b49b42a71289edec858f535b27fe9", "type": "github" }, "original": { @@ -524,11 +524,11 @@ ] }, "locked": { - "lastModified": 1753541826, - "narHash": "sha256-foGgZu8+bCNIGeuDqQ84jNbmKZpd+JvnrL2WlyU4tuU=", + "lastModified": 1770124655, + "narHash": "sha256-yHmd2B13EtBUPLJ+x0EaBwNkQr9LTne1arLVxT6hSnY=", "owner": "nix-community", "repo": "nixos-vscode-server", - "rev": "6d5f074e4811d143d44169ba4af09b20ddb6937d", + "rev": "92ce71c3ba5a94f854e02d57b14af4997ab54ef0", "type": "github" }, "original": { From 4d124c86af1fe0d2c25ade880f3bbf96e0bb48e1 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 14:25:15 +0100 Subject: [PATCH 26/47] refactor(nvim): globals in nested attr set --- modules/nvim.nix | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/nvim.nix b/modules/nvim.nix index 6f1ebc4..d51e3d9 100644 --- a/modules/nvim.nix +++ b/modules/nvim.nix @@ -33,8 +33,11 @@ with lib; viAlias = true; vimAlias = true; vimdiffAlias = true; - globals.mapleader = " "; - globals.maplocalleader = "\\"; + + globals = { + mapleader = " "; + maplocalleader = "\\"; + }; opts = { autowrite = true; # write the contents of the file automatically on certain commands From 100cae5bc7d6a0a0ff1a49f012710056c97637f2 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 28 Feb 2026 14:32:23 +0100 Subject: [PATCH 27/47] feat(firefox): enable fake-filler extension --- modules/firefox.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/firefox.nix b/modules/firefox.nix index 9cd90dd..9ed8882 100644 --- a/modules/firefox.nix +++ b/modules/firefox.nix @@ -73,7 +73,7 @@ with lib; extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [ bitwarden darkreader - # fake-filler # TODO: added in a later commit + fake-filler gaoptout ublock-origin sponsorblock From 5b9219a41c3e9cc63684251a60419432b07f5634 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:46:42 +0100 Subject: [PATCH 28/47] refactor: ripgrep ignore searching changelog and flake.lock --- .ignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .ignore diff --git a/.ignore b/.ignore new file mode 100644 index 0000000..6fa596b --- /dev/null +++ b/.ignore @@ -0,0 +1,3 @@ +CHANGELOG.md + +flake.lock From 4e0cd59e499a20d65d481a613c8d0022b857bbf7 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:47:08 +0100 Subject: [PATCH 29/47] feat(nvim): add line length rulers at 80, 120 and 160 characters --- modules/nvim.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/nvim.nix b/modules/nvim.nix index d51e3d9..488af12 100644 --- a/modules/nvim.nix +++ b/modules/nvim.nix @@ -42,6 +42,7 @@ with lib; opts = { autowrite = true; # write the contents of the file automatically on certain commands clipboard = "unnamedplus"; # use system clipboard + colorcolumn = "80,120,160"; # color line length columns completeopt = "menu,menuone,noselect"; confirm = true; # confirm to save changes before exiting modified buffer cursorline = true; # enable highlighting of the current line From 3a6d6319051bb8dd752bb9968d5c4b5fef203507 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:48:16 +0100 Subject: [PATCH 30/47] refactor(nvim): treesitter-refactor is no longer actively maintained. https://github.com/nvim-treesitter/nvim-treesitter-locals is mentioned as a replacement but a nixvim package for this doesn't currently exist. --- modules/nvim/treesitter.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/nvim/treesitter.nix b/modules/nvim/treesitter.nix index 7ae1980..2c6cdd5 100644 --- a/modules/nvim/treesitter.nix +++ b/modules/nvim/treesitter.nix @@ -19,7 +19,6 @@ trim_scope = "outer"; }; }; - # treesitter-refactor.enable = true; # FIXME:conflicts with treesitter changes/migration, enable later treesitter-textobjects = { enable = true; settings = { From 74a93b7f7447c7afe0cd93452cc239e4da108374 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:49:23 +0100 Subject: [PATCH 31/47] feat(nvim): autocompletions for method signature, symbols and treesitter parser --- modules/nvim/cmp.nix | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/nvim/cmp.nix b/modules/nvim/cmp.nix index 58d7aba..739a25b 100644 --- a/modules/nvim/cmp.nix +++ b/modules/nvim/cmp.nix @@ -33,17 +33,18 @@ }; snippet.expand = "luasnip"; sources = [ - { name = "emoji"; } { name = "buffer"; } { name = "cmdline"; } { name = "dap"; } { name = "luasnip"; } { name = "nvim_lsp"; } + { name = "nvim_lsp_document_symbol"; } + { name = "nvim_lsp_signature_help"; } { name = "path"; } + { name = "treesitter"; } ]; }; }; - cmp-nvim-lsp.enable = true; }; }; } From dfac65e919dd4bf687c3abd44e443ba0eb656282 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:50:02 +0100 Subject: [PATCH 32/47] refactor(nvim): use jsonls, ts_ls and yamlls for formatting instead of jq/yq --- modules/nvim/conform.nix | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/nvim/conform.nix b/modules/nvim/conform.nix index 31f157f..d1f4ce7 100644 --- a/modules/nvim/conform.nix +++ b/modules/nvim/conform.nix @@ -86,7 +86,6 @@ "prettier" ]; json = [ - "jq" "eslint_d" "prettierd" "prettier" @@ -128,7 +127,6 @@ "prettier" ]; yaml = [ - "yq" "eslint_d" "prettierd" "prettier" From 2525fd8726791954dbdbe86b8e471ea570e8ae62 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:52:33 +0100 Subject: [PATCH 33/47] feat(nvim): allow aligning code through mini-align --- modules/nvim/mini.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/nvim/mini.nix b/modules/nvim/mini.nix index 3ad6d46..0683b65 100644 --- a/modules/nvim/mini.nix +++ b/modules/nvim/mini.nix @@ -5,6 +5,7 @@ ]; plugins = { + mini-align.enable = true; mini = { enable = true; mockDevIcons = true; From d58b7a6fe5ca0f3c6705d96bd5816960692b9d85 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sat, 14 Mar 2026 23:05:39 +0100 Subject: [PATCH 34/47] feat(nvim): split or join arguments easily using mini-splitjoin --- modules/nvim/mini.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/nvim/mini.nix b/modules/nvim/mini.nix index 0683b65..91de6a3 100644 --- a/modules/nvim/mini.nix +++ b/modules/nvim/mini.nix @@ -6,6 +6,7 @@ plugins = { mini-align.enable = true; + mini-splitjoin.enable = true; mini = { enable = true; mockDevIcons = true; From f1baa4411deeb4153497da1a4969fa7cc46be918 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sun, 15 Mar 2026 00:04:21 +0100 Subject: [PATCH 35/47] feat(nvim): handle linting, formatting and error checking at lsp, nvim-lint or conform level --- modules/nvim/conform.nix | 118 +++++++++++++++++-------------------- modules/nvim/lsp.nix | 2 + modules/nvim/nvim-lint.nix | 17 +++--- 3 files changed, 62 insertions(+), 75 deletions(-) diff --git a/modules/nvim/conform.nix b/modules/nvim/conform.nix index d1f4ce7..7d55896 100644 --- a/modules/nvim/conform.nix +++ b/modules/nvim/conform.nix @@ -45,11 +45,9 @@ "trim_newlines" ]; sh = [ - "shellcheck" "shfmt" ]; bash = [ - "shellcheck" "shellharden" "shfmt" ]; @@ -75,40 +73,47 @@ "prettierd" "prettier" ]; - javascript = [ - "eslint_d" - "prettierd" - "prettier" - ]; - javascriptreact = [ - "eslint_d" - "prettierd" - "prettier" - ]; - json = [ - "eslint_d" - "prettierd" - "prettier" - ]; + javascript = { + __unkeyed-1 = "eslint_d"; + __unkeyed-2 = "prettierd"; + __unkeyed-3 = "prettier"; + stop_after_first = true; + }; + javascriptreact = { + __unkeyed-1 = "eslint_d"; + __unkeyed-2 = "prettierd"; + __unkeyed-3 = "prettier"; + stop_after_first = true; + }; + json = { + __unkeyed-1 = "eslint_d"; + __unkeyed-2 = "prettierd"; + __unkeyed-3 = "prettierd"; + __unkeyed-4 = "jq"; + stop_after_first = true; + }; lua = [ "stylua" ]; - markdown = [ - "markdownlint-cli2" - "eslint_d" - "prettierd" - "prettier" - ]; + markdown = { + __unkeyed-1 = "eslint_d"; + __unkeyed-2 = "prettierd"; + __unkeyed-3 = "prettier"; + stop_after_first = true; + }; nix = [ "nixfmt" ]; - php = [ - "pint" - "php_cs_fixer" - ]; + php = { + __unkeyed-1 = "pint"; + __unkeyed-2 = "php_cs_fixer"; + stop_after_first = true; + }; python = [ - "black" - "isort" + "ruff_format" + ]; + ruby = [ + "rubocop" ]; rust = [ "rustfmt" @@ -116,45 +121,28 @@ sql = [ "sqruff" ]; - typescript = [ - "eslint_d" - "prettierd" - "prettier" - ]; - typescriptreact = [ - "eslint_d" - "prettierd" - "prettier" - ]; - yaml = [ - "eslint_d" - "prettierd" - "prettier" - ]; - }; - - formatters = with pkgs; { - isort = { - command = lib.getExe isort; - }; - jq = { - command = lib.getExe jq; - }; - nixfmt = { - command = lib.getExe nixfmt; + typescript = { + __unkeyed-1 = "eslint_d"; + __unkeyed-2 = "prettierd"; + __unkeyed-3 = "prettier"; + stop_after_first = true; }; - shellcheck = { - command = lib.getExe shellcheck; + typescriptreact = { + __unkeyed-1 = "eslint_d"; + __unkeyed-2 = "prettierd"; + __unkeyed-3 = "prettier"; + stop_after_first = true; }; - shellharden = { - command = lib.getExe shellharden; - }; - shfmt = { - command = lib.getExe shfmt; - }; - stylua = { - command = lib.getExe stylua; + yaml = { + __unkeyed-1 = "eslint_d"; + __unkeyed-2 = "prettierd"; + __unkeyed-3 = "prettierd"; + __unkeyed-4 = "yq"; + stop_after_first = true; }; + }; + + formatters = with pkgs; { squeeze_blanks = { command = lib.getExe' pkgs.coreutils "cat"; }; diff --git a/modules/nvim/lsp.nix b/modules/nvim/lsp.nix index 8d9fe3b..0b8c9a1 100644 --- a/modules/nvim/lsp.nix +++ b/modules/nvim/lsp.nix @@ -10,6 +10,7 @@ inlayHints = true; servers = { bashls.enable = true; + cssls.enable = true; emmet_ls.enable = true; eslint.enable = true; helm_ls.enable = true; @@ -25,6 +26,7 @@ pest_ls.enable = true; pyright.enable = true; ruby_lsp.enable = true; + ruff.enable = true; # python rust_analyzer = { enable = true; installCargo = false; diff --git a/modules/nvim/nvim-lint.nix b/modules/nvim/nvim-lint.nix index a6de246..b5fbc7a 100644 --- a/modules/nvim/nvim-lint.nix +++ b/modules/nvim/nvim-lint.nix @@ -8,12 +8,12 @@ lint = { enable = true; lintersByFt = { + bash = [ + "shellcheck" + ]; dockerfile = [ "hadolint" ]; - json = [ - "jsonlint" - ]; markdown = [ "markdownlint-cli2" "vale" @@ -21,20 +21,17 @@ php = [ "phpstan" ]; - rst = [ - "vale" - ]; ruby = [ - "ruby" + "rubocop" ]; - rust = [ - "rustfmt" + sh = [ + "shellcheck" ]; text = [ "vale" ]; yaml = [ - "yq" + "yamllint" ]; }; }; From dfd2b516be6b82b1f66ef8955c26330fcfba984b Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Sun, 15 Mar 2026 21:26:01 +0100 Subject: [PATCH 36/47] feat(nvim): add dotenv filetype and make sure .env files are detected as much --- modules/nvim.nix | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/nvim.nix b/modules/nvim.nix index 488af12..5121f5b 100644 --- a/modules/nvim.nix +++ b/modules/nvim.nix @@ -29,6 +29,15 @@ with lib; enable = true; defaultEditor = true; extraConfigLuaPre = "if not vim.g.vscode then"; + extraConfigLua = # lua + '' + vim.filetype.add({ + pattern = { + ["%.env%..+"] = "dotenv"; + ["%.env"] = "dotenv"; + } + }) + ''; extraConfigLuaPost = "end"; viAlias = true; vimAlias = true; From ab79b0fc21c58e8b5b4c9793e2fa746cbe582f3d Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 24 Mar 2026 10:18:38 +0100 Subject: [PATCH 37/47] refactor(nvim): default to prettier for formatting html, css, js, ts, blade, vue files Less set up and configuration now that eslint decided to no longer maintain the styling rules (yes ESLint Stylistic is a thing). --- .gitattributes | 2 + modules/nvim/conform.nix | 84 +++++++++++++++++++++------------------- 2 files changed, 46 insertions(+), 40 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..4c1b4c9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto eol=lf +CHANGELOG.md export-ignore diff --git a/modules/nvim/conform.nix b/modules/nvim/conform.nix index 7d55896..5afabad 100644 --- a/modules/nvim/conform.nix +++ b/modules/nvim/conform.nix @@ -51,44 +51,47 @@ "shellharden" "shfmt" ]; - blade = [ - "superhtml" - "blade-formatter" - "eslint_d" - "prettierd" - "prettier" - ]; + blade = { + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; + __unkeyed-4 = "blade-formatter"; + __unkeyed-5 = "superhtml"; + stop_after_first = true; + }; c = [ "clang-format" ]; - css = [ - "stylelint" - "eslint_d" - "prettierd" - "prettier" - ]; - html = [ - "superhtml" - "eslint_d" - "prettierd" - "prettier" - ]; + css = { + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; + __unkeyed-4 = "stylelint"; + stop_after_first = true; + }; + html = { + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; + __unkeyed-4 = "superhtml"; + stop_after_first = true; + }; javascript = { - __unkeyed-1 = "eslint_d"; - __unkeyed-2 = "prettierd"; - __unkeyed-3 = "prettier"; + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; stop_after_first = true; }; javascriptreact = { - __unkeyed-1 = "eslint_d"; - __unkeyed-2 = "prettierd"; - __unkeyed-3 = "prettier"; + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; stop_after_first = true; }; json = { - __unkeyed-1 = "eslint_d"; - __unkeyed-2 = "prettierd"; - __unkeyed-3 = "prettierd"; + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; __unkeyed-4 = "jq"; stop_after_first = true; }; @@ -96,9 +99,10 @@ "stylua" ]; markdown = { - __unkeyed-1 = "eslint_d"; - __unkeyed-2 = "prettierd"; - __unkeyed-3 = "prettier"; + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; + __unkeyed-4 = "markdownlint-cli2"; stop_after_first = true; }; nix = [ @@ -122,21 +126,21 @@ "sqruff" ]; typescript = { - __unkeyed-1 = "eslint_d"; - __unkeyed-2 = "prettierd"; - __unkeyed-3 = "prettier"; + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; stop_after_first = true; }; typescriptreact = { - __unkeyed-1 = "eslint_d"; - __unkeyed-2 = "prettierd"; - __unkeyed-3 = "prettier"; + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; stop_after_first = true; }; yaml = { - __unkeyed-1 = "eslint_d"; - __unkeyed-2 = "prettierd"; - __unkeyed-3 = "prettierd"; + __unkeyed-1 = "prettierd"; + __unkeyed-2 = "prettier"; + __unkeyed-3 = "eslint_d"; __unkeyed-4 = "yq"; stop_after_first = true; }; From 88335d0b5b3db875dbab3e6edae8261b8036a9f4 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 24 Mar 2026 13:13:24 +0100 Subject: [PATCH 38/47] refactor(nvim): clean up language servers Drop eslint, superhtml and pest_ls and pyright Swap nil_ls for nixd --- modules/nvim/lsp.nix | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/modules/nvim/lsp.nix b/modules/nvim/lsp.nix index 0b8c9a1..a134c51 100644 --- a/modules/nvim/lsp.nix +++ b/modules/nvim/lsp.nix @@ -12,7 +12,6 @@ bashls.enable = true; cssls.enable = true; emmet_ls.enable = true; - eslint.enable = true; helm_ls.enable = true; html.enable = true; intelephense = { @@ -22,9 +21,7 @@ jsonls.enable = true; lua_ls.enable = true; marksman.enable = true; - nil_ls.enable = true; - pest_ls.enable = true; - pyright.enable = true; + nixd.enable = true; ruby_lsp.enable = true; ruff.enable = true; # python rust_analyzer = { @@ -32,10 +29,9 @@ installCargo = false; installRustc = false; }; - superhtml.enable = true; - sqruff.enable = true; + sqruff.enable = true; # sql tailwindcss.enable = true; - ts_ls.enable = true; + ts_ls.enable = true; # javascript/typescript vue_ls.enable = true; yamlls.enable = true; }; From 54ad52b8e0ca18ed278e15fcd625fc92713cbdcf Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 24 Mar 2026 13:44:42 +0100 Subject: [PATCH 39/47] feat(nvim): install language servers and linters that should be globally available --- hosts/shared/nix.nix | 2 +- modules/nvim.nix | 14 +++++++++++++- modules/nvim/conform.nix | 4 ---- modules/nvim/nvim-lint.nix | 10 ---------- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/hosts/shared/nix.nix b/hosts/shared/nix.nix index 7d364dd..61771e1 100644 --- a/hosts/shared/nix.nix +++ b/hosts/shared/nix.nix @@ -19,7 +19,7 @@ with lib; home = { packages = with pkgs; [ - nil + nixd nixfmt ]; }; diff --git a/modules/nvim.nix b/modules/nvim.nix index 5121f5b..81569ae 100644 --- a/modules/nvim.nix +++ b/modules/nvim.nix @@ -2,6 +2,7 @@ config, inputs, lib, + pkgs, ... }: let @@ -20,7 +21,18 @@ with lib; # TODO: write autocommand to open helpfiles in vertical split config = mkIf cfg.enable { - home.file."${config.xdg.cacheHome}/nvim/.gitkeep".text = ""; + home = { + file."${config.xdg.cacheHome}/nvim/.gitkeep".text = ""; + packages = with pkgs; [ + hadolint + prettier + shellcheck-minimal + shfmt + vale + valeStyles.alex + valeStyles.proselint + ]; + }; programs = { fd.enable = true; diff --git a/modules/nvim/conform.nix b/modules/nvim/conform.nix index 5afabad..c4b6850 100644 --- a/modules/nvim/conform.nix +++ b/modules/nvim/conform.nix @@ -56,7 +56,6 @@ __unkeyed-2 = "prettier"; __unkeyed-3 = "eslint_d"; __unkeyed-4 = "blade-formatter"; - __unkeyed-5 = "superhtml"; stop_after_first = true; }; c = [ @@ -66,14 +65,12 @@ __unkeyed-1 = "prettierd"; __unkeyed-2 = "prettier"; __unkeyed-3 = "eslint_d"; - __unkeyed-4 = "stylelint"; stop_after_first = true; }; html = { __unkeyed-1 = "prettierd"; __unkeyed-2 = "prettier"; __unkeyed-3 = "eslint_d"; - __unkeyed-4 = "superhtml"; stop_after_first = true; }; javascript = { @@ -102,7 +99,6 @@ __unkeyed-1 = "prettierd"; __unkeyed-2 = "prettier"; __unkeyed-3 = "eslint_d"; - __unkeyed-4 = "markdownlint-cli2"; stop_after_first = true; }; nix = [ diff --git a/modules/nvim/nvim-lint.nix b/modules/nvim/nvim-lint.nix index b5fbc7a..1afa13a 100644 --- a/modules/nvim/nvim-lint.nix +++ b/modules/nvim/nvim-lint.nix @@ -15,24 +15,14 @@ "hadolint" ]; markdown = [ - "markdownlint-cli2" "vale" ]; - php = [ - "phpstan" - ]; - ruby = [ - "rubocop" - ]; sh = [ "shellcheck" ]; text = [ "vale" ]; - yaml = [ - "yamllint" - ]; }; }; }; From bc91a14f507d7a6082e469b09b90bbb6e8590ed2 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 24 Mar 2026 17:40:48 +0100 Subject: [PATCH 40/47] feat(github): let dependabot automatically update git submodules --- .github/dependabot.yaml | 14 ++++++++++++++ .github/workflows/automatic-updates.yaml | 7 +++++++ .github/workflows/changelog.yaml | 3 --- 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 .github/dependabot.yaml create mode 100644 .github/workflows/automatic-updates.yaml diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000..79e380c --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,14 @@ +version: 2 + +updates: + - package-ecosystem: gitsubmodule + directory: / + schedule: + interval: daily + time: 06:00 + assignees: + - 99linesofcode + commit-message: + prefix: fix + prefix-development: chore + include: scope diff --git a/.github/workflows/automatic-updates.yaml b/.github/workflows/automatic-updates.yaml new file mode 100644 index 0000000..6001aff --- /dev/null +++ b/.github/workflows/automatic-updates.yaml @@ -0,0 +1,7 @@ +name: automatic updates + +on: pull_request + +jobs: + automatic-updates: + uses: 99linesofcode/.github/.github/workflows/automatic-updates.yaml@main diff --git a/.github/workflows/changelog.yaml b/.github/workflows/changelog.yaml index 14df506..fe83930 100644 --- a/.github/workflows/changelog.yaml +++ b/.github/workflows/changelog.yaml @@ -1,8 +1,5 @@ name: changelog -permissions: - contents: write - on: push: branches: From 8537da7722c0385f0128b831d0357313b4f150e9 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 24 Mar 2026 18:25:34 +0100 Subject: [PATCH 41/47] fix(telescope.nvim): search hidden files and directories unless [.gitignore|.ignore]d --- .ignore | 2 ++ modules/nvim/telescope.nix | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/.ignore b/.ignore index 6fa596b..baec21e 100644 --- a/.ignore +++ b/.ignore @@ -1,3 +1,5 @@ +.git/ + CHANGELOG.md flake.lock diff --git a/modules/nvim/telescope.nix b/modules/nvim/telescope.nix index e4c6c53..eb92d68 100644 --- a/modules/nvim/telescope.nix +++ b/modules/nvim/telescope.nix @@ -37,8 +37,16 @@ }; settings = { defaults = { + file_ignore_patterns = [ + "%.git/" + ]; sorting_strategy = "ascending"; }; + pickers = { + find_files = { + hidden = true; + }; + }; }; keymaps = { "/" = { From a1443623bdfb202119ea6fc247fcaa0095faf09b Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 24 Mar 2026 20:48:18 +0100 Subject: [PATCH 42/47] fix(conform.nvim): don't squeeze or trim, it'll be handled by editorconfig/formatters --- modules/nvim/conform.nix | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/nvim/conform.nix b/modules/nvim/conform.nix index c4b6850..c03e989 100644 --- a/modules/nvim/conform.nix +++ b/modules/nvim/conform.nix @@ -39,11 +39,6 @@ ''; formatters_by_ft = { - "_" = [ - "squeeze_blanks" - "trim_whitespace" - "trim_newlines" - ]; sh = [ "shfmt" ]; @@ -143,9 +138,6 @@ }; formatters = with pkgs; { - squeeze_blanks = { - command = lib.getExe' pkgs.coreutils "cat"; - }; yq = { command = lib.getExe yq-go; }; From 5c88bb7cbffcd9c418c0ef8f281161328fa510e9 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 24 Mar 2026 21:00:43 +0100 Subject: [PATCH 43/47] chore: formatting --- .editorconfig | 7 +++++-- .prettierrc | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .prettierrc diff --git a/.editorconfig b/.editorconfig index 6422feb..876ec2a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,10 +4,13 @@ root = true [*] charset = utf-8 end_of_line = lf -insert_final_newline = true -indent_size = 2 +indent_size = 4 indent_style = space +insert_final_newline = true trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..90efb55 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "semi": true, + "singleQuote": true, + "trailingComma": "all", + "plugins": [], + "overrides": [] +} From 801cbc6914b02f6d762e348f954a06e1e0a45788 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Tue, 24 Mar 2026 21:01:31 +0100 Subject: [PATCH 44/47] fix(nvim): settings entries were renamed to snake_case instead of camelCase --- modules/nvim/cmp.nix | 4 ++-- modules/nvim/neo-tree.nix | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/modules/nvim/cmp.nix b/modules/nvim/cmp.nix index 739a25b..5c2a76d 100644 --- a/modules/nvim/cmp.nix +++ b/modules/nvim/cmp.nix @@ -28,8 +28,8 @@ }; performance = { debounce = 60; - fetchingTimeout = 200; - maxViewEntries = 30; + fetching_timeout = 200; + max_view_entries = 30; }; snippet.expand = "luasnip"; sources = [ diff --git a/modules/nvim/neo-tree.nix b/modules/nvim/neo-tree.nix index 5fb2937..cc31c9d 100644 --- a/modules/nvim/neo-tree.nix +++ b/modules/nvim/neo-tree.nix @@ -15,16 +15,16 @@ plugins.neo-tree = { enable = true; settings = { - closeIfLastWindow = true; - defaultComponentConfigs = { + close_if_last_window = true; + default_component_configs = { indent = { - withExpanders = true; - expanderCollapsed = "󰅂"; - expanderExpanded = "󰅀"; - expanderHighlight = "NeoTreeExpander"; + with_expanders = true; + expander_collapsed = "󰅂"; + expander_expanded = "󰅀"; + expander_highlight = "NeoTreeExpander"; }; - gitStatus = { + git_status = { symbols = { added = " "; conflict = "󰩌 "; @@ -39,14 +39,21 @@ }; }; filesystem = { - bindToCwd = false; + bind_to_cwd = false; follow_current_file = { enabled = true; + leave_dirs_open = true; }; filtered_items = { hide_dotfiles = false; hide_gitignored = false; + hide_ignored = false; + ignore_files = [ + ".ignore" + ".rignore" + ]; }; + hijack_netrw_behavior = "open_default"; }; sources = [ "filesystem" From 5957713fd172f5b290b46104faf056fdbe14834b Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Wed, 25 Mar 2026 10:35:48 +0100 Subject: [PATCH 45/47] feat(act): run GitHub Actions from your local dev machine --- hosts/luna/users/shorty/default.nix | 1 - modules/git.nix | 47 ++++++++++++++++++----------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/hosts/luna/users/shorty/default.nix b/hosts/luna/users/shorty/default.nix index 8e771f7..3624581 100644 --- a/hosts/luna/users/shorty/default.nix +++ b/hosts/luna/users/shorty/default.nix @@ -20,7 +20,6 @@ with lib; rustdesk-flutter scrcpy android-tools - act # run GitHub Actions locally wireshark gdb ghidra diff --git a/modules/git.nix b/modules/git.nix index 94e5947..0fae090 100644 --- a/modules/git.nix +++ b/modules/git.nix @@ -16,9 +16,19 @@ with lib; }; config = mkIf cfg.enable { - home.packages = with pkgs; [ - git-filter-repo - ]; + home = { + packages = with pkgs; [ + act # run GitHub Actions locally + git-filter-repo + ]; + + file = { + ".actrc".text = # sh + '' + --container-options -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent + ''; + }; + }; programs = { gh = { @@ -77,22 +87,23 @@ with lib; }; }; zsh = mkIf config.programs.zsh.enable { - initContent = '' - # automatically prune branches both local and remote - function gpb() { - git checkout "$(git_main_branch)" - git fetch - git remote prune origin - git branch --merged | grep -vE "$(git_main_branch)|$(git_develop_branch)" | xargs -r git branch -d - } + initContent = # sh + '' + # automatically prune branches both local and remote + function gpb() { + git checkout "$(git_main_branch)" + git fetch + git remote prune origin + git branch --merged | grep -vE "$(git_main_branch)|$(git_develop_branch)" | xargs -r git branch -d + } - # git remove submodule - function grms() { - git rm $PWD/$1 - rm -rf $PWD/.git/modules/$1 - git config --remove-section submodule.$1 - } - ''; + # git remove submodule + function grms() { + git rm $PWD/$1 + rm -rf $PWD/.git/modules/$1 + git config --remove-section submodule.$1 + } + ''; shellAliases = { gl = "git sla"; gfix = "git fix"; From fed58f6bf50644b99d5e6c31111b6edc37f122c7 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Wed, 25 Mar 2026 12:28:44 +0100 Subject: [PATCH 46/47] fix(telescope.nvim): live_grep hidden files --- modules/nvim/telescope.nix | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/nvim/telescope.nix b/modules/nvim/telescope.nix index eb92d68..c244896 100644 --- a/modules/nvim/telescope.nix +++ b/modules/nvim/telescope.nix @@ -41,6 +41,17 @@ "%.git/" ]; sorting_strategy = "ascending"; + vimgrep_arguments = [ + "rg" + "--color=never" + "--no-heading" + "--with-filename" + "--line-number" + "--column" + "--smart-case" + "--hidden" + "--glob=!.git/" + ]; }; pickers = { find_files = { From fc503500951c8c7ee775f0c3d6fec22ec101d304 Mon Sep 17 00:00:00 2001 From: Jordy Schreuders <3071062+99linesofcode@users.noreply.github.com> Date: Wed, 25 Mar 2026 13:39:51 +0100 Subject: [PATCH 47/47] fix(dependabot): time should be of type string instead of int --- .github/.github/dependabot.yaml | 14 ++++++++++++++ .../workflows/automatic-submodule-updates.yaml | 7 +++++++ .github/.github/workflows/changelog.yaml | 10 ++++++++++ .github/dependabot.yaml | 2 +- 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 .github/.github/dependabot.yaml create mode 100644 .github/.github/workflows/automatic-submodule-updates.yaml create mode 100644 .github/.github/workflows/changelog.yaml diff --git a/.github/.github/dependabot.yaml b/.github/.github/dependabot.yaml new file mode 100644 index 0000000..7a580d4 --- /dev/null +++ b/.github/.github/dependabot.yaml @@ -0,0 +1,14 @@ +version: 2 + +updates: + - package-ecosystem: gitsubmodule + directory: / + schedule: + interval: daily + time: '06:00' + assignees: + - 99linesofcode + commit-message: + prefix: fix + prefix-development: chore + include: scope diff --git a/.github/.github/workflows/automatic-submodule-updates.yaml b/.github/.github/workflows/automatic-submodule-updates.yaml new file mode 100644 index 0000000..cadbdc3 --- /dev/null +++ b/.github/.github/workflows/automatic-submodule-updates.yaml @@ -0,0 +1,7 @@ +name: Automatic submodule updates + +on: pull_request + +jobs: + update: + uses: 99linesofcode/.github/.github/workflows/automatic-submodule-updates.yaml@main diff --git a/.github/.github/workflows/changelog.yaml b/.github/.github/workflows/changelog.yaml new file mode 100644 index 0000000..7d22116 --- /dev/null +++ b/.github/.github/workflows/changelog.yaml @@ -0,0 +1,10 @@ +name: Generate Changelog and Release + +on: + push: + branches: + - main + +jobs: + deploy: + uses: 99linesofcode/.github/.github/workflows/changelog.yaml@main diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index 79e380c..7a580d4 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -5,7 +5,7 @@ updates: directory: / schedule: interval: daily - time: 06:00 + time: '06:00' assignees: - 99linesofcode commit-message: