From a0857002d68f3a8ab52364788bc7164fe20ce8fe Mon Sep 17 00:00:00 2001 From: Nate Anderson Date: Thu, 16 Oct 2025 14:51:13 -0600 Subject: [PATCH] Update nate-work config with new dotfiles linking strat --- AGENTS.md | 34 +++ flake.lock | 12 +- frame12/modules/home-manager/home.nix | 6 +- nate-work/dotfiles/kanshi/config | 25 ++ .../hypr/hypridle.conf | 0 nate-work/linked-dotfiles/hypr/hyprland.conf | 196 ++++++++++++++++ .../hypr/nix.png | Bin .../hypr/scripts/music_links.txt | 0 .../hypr/scripts/music_setup.sh | 0 .../hypr/scripts/music_setup_cmd.sh | 0 .../hypr/scripts/screenshot.sh | 0 .../hypr/va_background.png | Bin nate-work/linked-dotfiles/waybar/config | 3 +- nate-work/modules/home-manager/home.nix | 76 +++--- nate-work/modules/hypr/hypr_home.nix | 221 +----------------- shared/dotfiles/swaync/config.json | 5 + shared/dotfiles/swaync/style.css | 2 +- shared/linked-dotfiles/helix/config.toml | 5 +- shared/linked-dotfiles/helix/languages.toml | 16 +- .../themes/catppuccin_macchiato_minimal.toml | 149 ++++++++++++ .../linked-dotfiles/opencode/opencode.jsonc | 16 ++ 21 files changed, 502 insertions(+), 264 deletions(-) create mode 100644 AGENTS.md create mode 100644 nate-work/dotfiles/kanshi/config rename nate-work/{dotfiles => linked-dotfiles}/hypr/hypridle.conf (100%) create mode 100644 nate-work/linked-dotfiles/hypr/hyprland.conf rename nate-work/{dotfiles => linked-dotfiles}/hypr/nix.png (100%) rename nate-work/{dotfiles => linked-dotfiles}/hypr/scripts/music_links.txt (100%) rename nate-work/{dotfiles => linked-dotfiles}/hypr/scripts/music_setup.sh (100%) rename nate-work/{dotfiles => linked-dotfiles}/hypr/scripts/music_setup_cmd.sh (100%) rename nate-work/{dotfiles => linked-dotfiles}/hypr/scripts/screenshot.sh (100%) rename nate-work/{dotfiles => linked-dotfiles}/hypr/va_background.png (100%) create mode 100644 shared/dotfiles/swaync/config.json create mode 100644 shared/linked-dotfiles/helix/themes/catppuccin_macchiato_minimal.toml create mode 100644 shared/linked-dotfiles/opencode/opencode.jsonc diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..989b513 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,34 @@ +# AGENTS.md - NixOS Configuration Repository + +## Build/Test Commands +```bash +# Validate configuration syntax +nix flake check + +# Dry-run build for specific host (test without building) +nix build .#nixosConfigurations..config.system.build.toplevel --dry-run + +# Test configuration without switching +sudo nixos-rebuild test --flake . + +# Apply configuration changes +sudo nixos-rebuild switch --flake .# +``` + +## Code Style Guidelines + +**Language**: Nix expression language + +**Formatting**: Use 2-4 space indentation (varies by file), no tabs except in some user modules + +**Imports**: Always import required modules at top: `{ config, lib, pkgs, ... }:` or with additional args like `inputs, outputs, system, timeZone` + +**Naming**: Use camelCase for options (`userName`, `hostName`, `isDesktopUser`), kebab-case for hostnames, underscores for module names (`main_user`) + +**Module Pattern**: Define options with `lib.mkOption`, use `lib.mkIf` for conditional config, use `lib.mkMerge` for combining attribute sets + +**Error Handling**: Rely on Nix's built-in evaluation errors; use `lib.mkEnableOption` for optional features + +**Types**: Specify types in options: `lib.types.str`, `lib.types.bool`, provide defaults and descriptions for all options + +**Comments**: Minimal comments; prefer self-documenting option descriptions; hardware files auto-generated with warnings at top diff --git a/flake.lock b/flake.lock index 85df383..fd549db 100644 --- a/flake.lock +++ b/flake.lock @@ -98,11 +98,11 @@ }, "nixpkgs-unstable": { "locked": { - "lastModified": 1759831965, - "narHash": "sha256-vgPm2xjOmKdZ0xKA6yLXPJpjOtQPHfaZDRtH+47XEBo=", + "lastModified": 1760524057, + "narHash": "sha256-EVAqOteLBFmd7pKkb0+FIUyzTF61VKi7YmvP1tw4nEw=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c9b6fb798541223bbb396d287d16f43520250518", + "rev": "544961dfcce86422ba200ed9a0b00dd4b1486ec5", "type": "github" }, "original": { @@ -114,11 +114,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1759735786, - "narHash": "sha256-a0+h02lyP2KwSNrZz4wLJTu9ikujNsTWIC874Bv7IJ0=", + "lastModified": 1760423683, + "narHash": "sha256-Tb+NYuJhWZieDZUxN6PgglB16yuqBYQeMJyYBGCXlt8=", "owner": "nixos", "repo": "nixpkgs", - "rev": "20c4598c84a671783f741e02bf05cbfaf4907cff", + "rev": "a493e93b4a259cd9fea8073f89a7ed9b1c5a1da2", "type": "github" }, "original": { diff --git a/frame12/modules/home-manager/home.nix b/frame12/modules/home-manager/home.nix index 75c79b4..979739d 100644 --- a/frame12/modules/home-manager/home.nix +++ b/frame12/modules/home-manager/home.nix @@ -138,7 +138,7 @@ if builtins.pathExists sharedDotfilesPath then builtins.listToAttrs (map (name: { name = "${config.xdg.configHome}/${name}"; - value = { source = sharedDotfilesPath + "/${name}"; }; + value = { source = lib.mkDefault (sharedDotfilesPath + "/${name}"); }; }) (builtins.attrNames (builtins.readDir sharedDotfilesPath))) else {}) # Add local dotfiles, overriding from local over shared @@ -161,8 +161,10 @@ # Active symlinks xdg.configFile = { - "niri".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/frame12/linked-dotfiles/niri"; + # Active linked dotfiles + "niri".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/frame12/linked-dotfiles/niri"; "waybar".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/frame12/linked-dotfiles/waybar"; + # Shared "helix".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/shared/linked-dotfiles/helix"; # Theme configuration diff --git a/nate-work/dotfiles/kanshi/config b/nate-work/dotfiles/kanshi/config new file mode 100644 index 0000000..a19e723 --- /dev/null +++ b/nate-work/dotfiles/kanshi/config @@ -0,0 +1,25 @@ +# Kanshi configuration for nate-work +# Automatic display configuration based on connected monitors + +# Profile: Laptop only (no external monitors) +profile laptop-only { + output eDP-1 mode 2560x1600@165Hz position 0,0 scale 1.00 +} + +# Profile: Laptop + LG ULTRAGEAR+ +profile lg-ultragear { + output "LG Electronics LG ULTRAGEAR+ 406NTJJ6B876" mode 3840x2160@144.05Hz position 0,0 scale 1.00 adaptive_sync on + output eDP-1 disable +} + +# Profile: Laptop + Ultrawide (eDP-2) +profile ultrawide-2 { + output eDP-2 mode 3440x1440@99.98Hz position 0,0 scale 1.00 adaptive_sync on + output eDP-1 disable +} + +# Profile: Laptop + Ultrawide (eDP-3) +profile ultrawide-3 { + output eDP-3 mode 3440x1440@99.98Hz position 0,0 scale 1.00 adaptive_sync on + output eDP-1 disable +} diff --git a/nate-work/dotfiles/hypr/hypridle.conf b/nate-work/linked-dotfiles/hypr/hypridle.conf similarity index 100% rename from nate-work/dotfiles/hypr/hypridle.conf rename to nate-work/linked-dotfiles/hypr/hypridle.conf diff --git a/nate-work/linked-dotfiles/hypr/hyprland.conf b/nate-work/linked-dotfiles/hypr/hyprland.conf new file mode 100644 index 0000000..8be14aa --- /dev/null +++ b/nate-work/linked-dotfiles/hypr/hyprland.conf @@ -0,0 +1,196 @@ +# Hyprland Configuration +# Converted from Nix settings for nate-work + +# Variables +$mod = Super +$terminal = ghostty +$fileManager = nautilus +$menu = nwg-drawer + +# Autostart applications +exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +exec-once = blueman-applet +exec-once = hypridle +exec-once = kanshi +exec-once = lxqt-policykit-agent +exec-once = nm-applet --indicator +exec-once = sleep 5 && syncthingtray --wait +exec-once = swaybg -i ~/.config/hypr/va_background.png +exec-once = swaylock -C ~/.config/swaylock/boot-config +exec-once = swaync +exec-once = waybar +exec-once = firefox --new-tab https://vasion.okta.com --new-tab https://github.com/PrinterLogic --new-tab https://claude.ai +exec-once = flatpak run org.signal.Signal +exec-once = flatpak run com.slack.Slack +exec-once = ghostty +exec-once = keepassxc + +# Input configuration +input { + repeat_rate = 50 + repeat_delay = 350 + follow_mouse = 0 + float_switch_override_focus = 0 + + touchpad { + natural_scroll = true + } +} + +# Animations +bezier = easeout, 0, 0.55, 0.45, 1 +animation = workspaces, 1, 1, easeout + +# Gestures +gesture = 3, horizontal, workspace + +# General layout +general { + gaps_in = 3 + gaps_out = 5 + border_size = 3 + col.active_border = rgba(7e5fddff) rgba(ff5100ff) 60deg +} + +# Decoration +decoration { + rounding = 12 + inactive_opacity = 0.9 + dim_inactive = true + dim_strength = 0.1 + + blur { + enabled = true + passes = 1 + size = 10 + } + + shadow { + enabled = false + } +} + +# Cursor +cursor { + no_hardware_cursors = true +} + +# Misc +misc { + vfr = 0 + force_default_wallpaper = 0 + disable_hyprland_logo = true +} + +# Render +render { + direct_scanout = 0 +} + +# Debug (remove when nvidia damage tracking works) +debug { + damage_tracking = 0 +} + +# OpenGL +opengl { + nvidia_anti_flicker = 0 +} + +# Monitor configuration handled by kanshi + +# Window rules +windowrulev2 = float, class:^(org.keepassxc.KeePassXC)$ +windowrulev2 = workspace special:scratch silent, class:^(org.keepassxc.KeePassXC)$ +windowrulev2 = workspace special:scratch silent, class:^(org.signal.Signal)$ +windowrulev2 = workspace 2 silent, class:^(firefox)$ +windowrulev2 = workspace 3 silent, class:^(com.slack.Slack)$ +windowrulev2 = workspace 4 silent, class:^(zoom)$ +windowrulev2 = fullscreen, class:^(zoom)$, title:^(Meeting)$ +windowrulev2 = float, class:^(zoom)$, title:!^(Meeting)$ + +# Key bindings +bind = $mod, Q, killactive +bind = $mod Shift, Q, exit +bind = $mod, W, exec, firefox +bind = $mod, D, exec, $menu +bind = $mod, T, exec, $fileManager +bind = $mod, code:36, exec, $terminal +bind = $mod, Space, togglefloating +bind = $mod Shift, Space, exec, hyprctl dispatch focuswindow $(if [[ $(hyprctl activewindow -j | jq ."floating") == "true" ]]; then echo "tiled"; else echo "floating"; fi;) +bind = $mod, F, fullscreen, 0 +bind = $mod, Tab, cyclenext +bind = $mod Shift, Tab, swapnext + +# Movement - Arrow keys +bind = $mod, left, movefocus, l +bind = $mod, right, movefocus, r +bind = $mod, up, movefocus, u +bind = $mod, down, movefocus, d +bind = $mod Shift, left, movewindow, l +bind = $mod Shift, right, movewindow, r +bind = $mod Shift, up, movewindow, u +bind = $mod Shift, down, movewindow, d + +# Movement - Colemak-DH +bind = $mod, N, movefocus, l +bind = $mod, O, movefocus, r +bind = $mod, E, movefocus, u +bind = $mod, I, movefocus, d +bind = $mod Shift, N, movewindow, l +bind = $mod Shift, O, movewindow, r +bind = $mod Shift, E, movewindow, u +bind = $mod Shift, I, movewindow, d + +# Special actions +bind = $mod SHIFT, K, exec, hyprctl keyword 'device[at-translated-set-2-keyboard]:enabled' 'false' && notify-send 'Laptop keyboard disabled' -i nix-snowflake +bind = $mod SHIFT, R, exec, hyprctl reload && notify-send 'Hypr Config Reloaded' -i nix-snowflake + +# Workspaces +bind = $mod, minus, togglespecialworkspace, scratch +bind = $mod SHIFT, minus, movetoworkspacesilent, special:scratch +bind = $mod, M, togglespecialworkspace, music +bind = $mod Shift, M, exec, ~/.config/hypr/scripts/music_setup.sh + +# Screenshots +bind = $mod, P, exec, ~/.config/hypr/scripts/screenshot.sh clipboard +bind = $mod SHIFT, P, exec, ~/.config/hypr/scripts/screenshot.sh + +# Color picker +bind = $mod, C, exec, color=$(hyprpicker) && echo $color | wl-copy && notify-send "Copied $color to clipboard" + +# Notification drawer +bind = $mod CONTROL, N, exec, swaync-client -t -sw + +# Workspace bindings (1-9) +bind = $mod, code:10, workspace, 1 +bind = $mod SHIFT, code:10, movetoworkspacesilent, 1 +bind = $mod, code:11, workspace, 2 +bind = $mod SHIFT, code:11, movetoworkspacesilent, 2 +bind = $mod, code:12, workspace, 3 +bind = $mod SHIFT, code:12, movetoworkspacesilent, 3 +bind = $mod, code:13, workspace, 4 +bind = $mod SHIFT, code:13, movetoworkspacesilent, 4 +bind = $mod, code:14, workspace, 5 +bind = $mod SHIFT, code:14, movetoworkspacesilent, 5 +bind = $mod, code:15, workspace, 6 +bind = $mod SHIFT, code:15, movetoworkspacesilent, 6 +bind = $mod, code:16, workspace, 7 +bind = $mod SHIFT, code:16, movetoworkspacesilent, 7 +bind = $mod, code:17, workspace, 8 +bind = $mod SHIFT, code:17, movetoworkspacesilent, 8 +bind = $mod, code:18, workspace, 9 +bind = $mod SHIFT, code:18, movetoworkspacesilent, 9 + +# Mouse bindings +bindm = $mod, mouse:272, movewindow +bindm = $mod, mouse:273, resizewindow + +# Brightness and Volume controls +bindel = , XF86MonBrightnessDown, exec, brightnessctl s 10%- +bindel = , XF86MonBrightnessUp, exec, brightnessctl s 10%+ +bindel = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = , XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle diff --git a/nate-work/dotfiles/hypr/nix.png b/nate-work/linked-dotfiles/hypr/nix.png similarity index 100% rename from nate-work/dotfiles/hypr/nix.png rename to nate-work/linked-dotfiles/hypr/nix.png diff --git a/nate-work/dotfiles/hypr/scripts/music_links.txt b/nate-work/linked-dotfiles/hypr/scripts/music_links.txt similarity index 100% rename from nate-work/dotfiles/hypr/scripts/music_links.txt rename to nate-work/linked-dotfiles/hypr/scripts/music_links.txt diff --git a/nate-work/dotfiles/hypr/scripts/music_setup.sh b/nate-work/linked-dotfiles/hypr/scripts/music_setup.sh similarity index 100% rename from nate-work/dotfiles/hypr/scripts/music_setup.sh rename to nate-work/linked-dotfiles/hypr/scripts/music_setup.sh diff --git a/nate-work/dotfiles/hypr/scripts/music_setup_cmd.sh b/nate-work/linked-dotfiles/hypr/scripts/music_setup_cmd.sh similarity index 100% rename from nate-work/dotfiles/hypr/scripts/music_setup_cmd.sh rename to nate-work/linked-dotfiles/hypr/scripts/music_setup_cmd.sh diff --git a/nate-work/dotfiles/hypr/scripts/screenshot.sh b/nate-work/linked-dotfiles/hypr/scripts/screenshot.sh similarity index 100% rename from nate-work/dotfiles/hypr/scripts/screenshot.sh rename to nate-work/linked-dotfiles/hypr/scripts/screenshot.sh diff --git a/nate-work/dotfiles/hypr/va_background.png b/nate-work/linked-dotfiles/hypr/va_background.png similarity index 100% rename from nate-work/dotfiles/hypr/va_background.png rename to nate-work/linked-dotfiles/hypr/va_background.png diff --git a/nate-work/linked-dotfiles/waybar/config b/nate-work/linked-dotfiles/waybar/config index 5b23d42..cb183fd 100644 --- a/nate-work/linked-dotfiles/waybar/config +++ b/nate-work/linked-dotfiles/waybar/config @@ -1,6 +1,7 @@ // Global { - "layer": "bottom", + // "mode": "hide", + "layer": "top", "position": "top", "margin-top": 3, "margin-left": 3, diff --git a/nate-work/modules/home-manager/home.nix b/nate-work/modules/home-manager/home.nix index 657188d..91d9902 100644 --- a/nate-work/modules/home-manager/home.nix +++ b/nate-work/modules/home-manager/home.nix @@ -1,31 +1,9 @@ -{ inputs, config, pkgs, ... }: +{ inputs, config, pkgs, lib, ... }: let userName = "nate"; fullName = "Nate Anderson"; email = "nate.anderson@vasion.com"; unstable = import inputs.nixpkgs-unstable { system = "x86_64-linux"; config.allowUnfree = true; }; - # oldstable = import inputs.nixpkgs-23 { system = "x86_64-linux"; config.allowUnfree = true; }; - # davinciDesktop = pkgs.makeDesktopItem { - # name = "davinci-resolve-studio"; - # desktopName = "Davinci Resolve Studio"; - # exec = "${oldstable.davinci-resolve-studio}"; - # }; - # overlay-unstable = final: prev: { - # unstable = inputs.nixpkgs-unstable.legacyPackages.x86_64-linux; - # }; - # overlay-oldstable = final: prev: { - # pkgs23 = inputs.nixpkgs-23.legacyPackages.x86_64-linux; - # }; - # overlay-unstable = final: prev: { - # # unstable = inputs.nixpkgs-unstable.legacyPackages.x86_64-linux; - # unstable = import inputs.nixpkgs-unstable { - # system = "x86_64-linux"; - # config = { - # allowUnfreePredicate = (pkg: true); - # allowUnfree = true; - # }; - # }; - # }; in { # nixpkgs.overlays = [ @@ -67,6 +45,7 @@ # Dev Tools # helix + vscode-fhs unstable.distrobox unstable.docker_25 docker-compose @@ -75,20 +54,22 @@ mariadb lsp-ai python3 + nodejs_24 cmake + # AI unstable.claude-code + unstable.opencode # proto protobuf protoc-gen-dart # Go stuff go - delve + unstable.delve gotools go-tools govulncheck unstable.golangci-lint go-swag - delve trivy # clojure @@ -135,12 +116,7 @@ gtop htop neofetch - s-tui - openapi-tui - tasktimer - # Normies unzip - llpp nmap # @@ -149,11 +125,12 @@ imv mpv ffmpeg - tenacity + audacity yt-dlp + simple-scan + # iphone connections libimobiledevice ifuse - simple-scan # # Communication @@ -190,11 +167,6 @@ ]; }; - home.file."${config.xdg.configHome}" = { - source = ../../dotfiles; - recursive = true; - }; - # enable saving ssh secrets (needed for go mod installing private packages) services.gnome-keyring.enable = true; services.gnome-keyring.components = [ "ssh" "secrets" ]; @@ -343,9 +315,37 @@ # cursor defined in hypr-home.nix }; + home.file = lib.mkMerge [ + # Shared dotfiles + (let + sharedDotfilesPath = ../../../shared/dotfiles; + in + if builtins.pathExists sharedDotfilesPath then + builtins.listToAttrs (map (name: { + name = "${config.xdg.configHome}/${name}"; + value = { source = lib.mkDefault (sharedDotfilesPath + "/${name}"); }; + }) (builtins.attrNames (builtins.readDir sharedDotfilesPath))) + else {}) + # Add local dotfiles, overriding from local over shared + (let + localDotfilesPath = ../../dotfiles; + in + if builtins.pathExists localDotfilesPath && builtins.readDir localDotfilesPath != {} then + builtins.listToAttrs (map (name: { + name = "${config.xdg.configHome}/${name}"; + value = { source = localDotfilesPath + "/${name}"; }; + }) (builtins.attrNames (builtins.readDir localDotfilesPath))) + else {}) + ]; + xdg.configFile = { - "helix".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/shared/dotfiles/helix"; + # Active linked dotfiles + "hypr".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/nate-work/linked-dotfiles/hypr"; "waybar".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/nate-work/linked-dotfiles/waybar"; + # Shared + "helix".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/shared/linked-dotfiles/helix"; + + # Theme files "gtk-4.0/assets".source = "${config.gtk.theme.package}/share/themes/${config.gtk.theme.name}/gtk-4.0/assets"; "gtk-4.0/gtk.css".source = "${config.gtk.theme.package}/share/themes/${config.gtk.theme.name}/gtk-4.0/gtk.css"; "gtk-4.0/gtk-dark.css".source = "${config.gtk.theme.package}/share/themes/${config.gtk.theme.name}/gtk-4.0/gtk-dark.css"; diff --git a/nate-work/modules/hypr/hypr_home.nix b/nate-work/modules/hypr/hypr_home.nix index bd7773f..269f4c8 100644 --- a/nate-work/modules/hypr/hypr_home.nix +++ b/nate-work/modules/hypr/hypr_home.nix @@ -12,221 +12,15 @@ }; config = lib.mkIf config.hyprhome.enable { - wayland.windowManager.hyprland.enable = true; # enable Hyprland - # wayland.windowManager.hyprland.package = null; # enable Hyprland - # wayland.windowManager.hyprland.portalPackage = null; # enable Hyprland - wayland.windowManager.hyprland.settings = { - "$mod" = "Super"; - "$terminal" = "ghostty"; - "$fileManager" = "nautilus"; - "$menu" = "nwg-drawer"; - # Autostart - exec-once = - [ - ###Start dbus ### - # Starting it early may help with app launch times - "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" - "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" - # Utils - "blueman-applet" - "hypridle" - "lxqt-policykit-agent" - "nm-applet --indicator" - "sleep 5 && syncthingtray --wait" # sleep added otherwise it would error... - "swaybg -i ~/.config/hypr/va_background.png" - "swaylock -C ~/.config/swaylock/boot-config" - "swaync" - "waybar" - # GUI Applications - "firefox --new-tab https://vasion.okta.com --new-tab https://github.com/PrinterLogic --new-tab https://claude.ai" - "flatpak run org.signal.Signal" - "flatpak run com.slack.Slack" - "ghostty" - "keepassxc" - # set gsettings - # "dconf write /org/gnome/desktop/interface/cursor-theme \"'catppuccin-macchiato-lavender-cursors'\"" - # "dconf write /org/gnome/desktop/interface/cursor-size 24" - # "dconf write /org/gnome/desktop/interface/icon-theme \"'Papirus-Dark'\"" - # "dconf write /org/gnome/desktop/interface/gtk-theme \"'catppuccin-macchiato-lavender-compact+rimless'\"" - # "hyprctl setcursor catppuccin-macchiato-lavender-cursors 24" - ]; - input = { - repeat_rate = 50; - repeat_delay = 350; - touchpad = { - natural_scroll = true; - }; - follow_mouse = 0; # cursor movement will change focus - float_switch_override_focus = 0; - }; - bezier = [ - "easeout, 0, 0.55, 0.45, 1" - ]; - animation = [ - "workspaces, 1, 1, easeout" - ]; - gesture = [ - "3, horizontal, workspace" - ]; - general = { - gaps_in = 3; - gaps_out = 5; - border_size = 3; - "col.active_border" = "rgba(7e5fddff) rgba(ff5100ff) 60deg"; - }; - decoration = { - rounding = 12; - inactive_opacity = 0.9; - dim_inactive = true; - dim_strength = 0.1; - blur = { - enabled = true; - passes = 1; - size = 10; - }; - shadow.enabled = false; - }; - bind = - [ - "$mod, Q, killactive" - "$mod Shift, Q, exit" - "$mod, W, exec, firefox" - "$mod, D, exec, $menu" - "$mod, T, exec, $fileManager" - "$mod, code:36, exec, $terminal" # Enter code - "$mod, Space, togglefloating" - # Toggle floating / tiled focus - "$mod Shift, Space, exec, hyprctl dispatch focuswindow $(if [[ $(hyprctl activewindow -j | jq .\"floating\") == \"true\" ]]; then echo \"tiled\"; else echo \"floating\"; fi;)" - "$mod, F, fullscreen, 0" - "$mod, Tab, cyclenext" - "$mod Shift, Tab, swapnext" - "$mod, left, movefocus, l" - "$mod, right, movefocus, r" - "$mod, up, movefocus, u" - "$mod, down, movefocus, d" - "$mod Shift, left, movewindow, l" - "$mod Shift, right, movewindow, r" - "$mod Shift, up, movewindow, u" - "$mod Shift, down, movewindow, d" - # Colemak-DH binds - "$mod, N, movefocus, l" - "$mod, O, movefocus, r" - "$mod, E, movefocus, u" - "$mod, I, movefocus, d" - "$mod Shift, N, movewindow, l" - "$mod Shift, O, movewindow, r" - "$mod Shift, E, movewindow, u" - "$mod Shift, I, movewindow, d" - # Disabled laptop keyboard - "$mod SHIFT, K, exec, hyprctl keyword 'device[at-translated-set-2-keyboard]:enabled' 'false' && notify-send 'Laptop keyboard disabled' -i nix-snowflake" - # Reload config - "$mod SHIFT, R, exec, hyprctl reload && notify-send 'Hypr Config Reloaded' -i nix-snowflake" - # Scratch pad workspace - "$mod, minus, togglespecialworkspace, scratch" - "$mod SHIFT, minus, movetoworkspacesilent, special:scratch" - # Music workspace - "$mod, M, togglespecialworkspace, music" - # "$mod SHIFT, M, movetoworkspacesilent, special:music" - "$mod Shift, M, exec, ~/.config/hypr/scripts/music_setup.sh" - # "$mod Control_R, M, exec, ~/.config/hypr/scripts/music_setup.sh" - # Screenshots - "$mod, P, exec, ~/.config/hypr/scripts/screenshot.sh clipboard" - "$mod SHIFT, P, exec, ~/.config/hypr/scripts/screenshot.sh" - # Color picker - "$mod, C, exec, color=$(hyprpicker) && echo $color | wl-copy && notify-send \"Copied $color to clipboard\"" - # Toggle notification drawer - "$mod CONTROL, N, exec, swaync-client -t -sw" - ] - ++ ( - # workspaces - # binds $mod + [shift +] {1..9} to [move to] workspace {1..9} - builtins.concatLists (builtins.genList (i: - let ws = i + 1; - in [ - "$mod, code:1${toString i}, workspace, ${toString ws}" - "$mod SHIFT, code:1${toString i}, movetoworkspacesilent, ${toString ws}" - ] - ) - 9) - ); - bindm = [ - "$mod, mouse:272, movewindow" # LMB to move window - "$mod, mouse:273, resizewindow" # RMB to move window - ]; - bindel = [ - # Brightness / Volume Controls - # Chromebook has the printed symbols for these actions, but are really just fn keys - ", XF86MonBrightnessDown, exec, brightnessctl s 10%-" - ", XF86MonBrightnessUp, exec, brightnessctl s 10%+" - ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" - ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" - ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+" - ", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" - ]; - # Lid switch binds - bindl = [ - # trigger when the switch is turning on - ", switch:on:Lid Switch, exec, hyprctl keyword monitor 'eDP-1, disable'" + # Note: We don't use wayland.windowManager.hyprland.enable + # because it generates config files that conflict with our dotfiles. + # Instead, we install hyprland via packages and manage config manually. - # trigger when the switch is turning off - ", switch:off:Lid Switch, exec, hyprctl keyword monitor 'eDP-1, 2560x1600@165, 0x0, 1.00'" - ]; - windowrulev2 = [ - - # float keepass windows, put main window in scratch - "float, class:^(org.keepassxc.KeePassXC)$" - "workspace special:scratch silent, class:^(org.keepassxc.KeePassXC)$" - "workspace special:scratch silent, class:^(org.signal.Signal)$" - - # Firefox to workspace 2 - "workspace 2 silent, class:^(firefox)$" - - # Slack to workspace 3 - "workspace 3 silent, class:^(com.slack.Slack)$" - - # Zoom to workspace 4 - "workspace 4 silent, class:^(zoom)$" - "fullscreen, class:^(zoom)$, title:^(Meeting)$" - # Float all other zoom windows (not meetings) - "float, class:^(zoom)$, title:!^(Meeting)$" - ]; - - monitor = [ - "eDP-1, 2560x1600@165, 0x0, 1.00" - # At home monitor setup, 144 for hdmi bandwidth - "desc:LG Electronics LG ULTRAGEAR+ 406NTJJ6B876, 3840x2160@144, auto, 1, vrr, 1" - # Work monitor over USBC - "eDP-2, 3440x1440@99.98Hz, auto, 1, vrr, 1" - "eDP-3, 3440x1440@99.98Hz, auto, 1, vrr, 1" - # Auto tile new unspecified monitors to the right, in preferred resolution - ", preferred, auto-right, 1" - ]; - cursor = { - no_hardware_cursors = true; - # allow_dumb_copy = true; - }; - misc = { - # Revert to true when nvidia damage tracking works - vfr = 0; - force_default_wallpaper = 0; - disable_hyprland_logo = true; - }; - render = { - direct_scanout = 0; - }; - ## - ## delete when nvidia damage tracking works (debug & opengl) - ## - debug = { - damage_tracking = 0; - }; - opengl = { - nvidia_anti_flicker = 0; - # force_introspection = 2; - }; + # Import systemd variables for hyprland + systemd.user.sessionVariables = { + WAYLAND_DISPLAY = "wayland-1"; + XDG_CURRENT_DESKTOP = "Hyprland"; }; - # import variables - wayland.windowManager.hyprland.systemd.variables = ["--all"]; home.pointerCursor = { gtk.enable = true; @@ -258,6 +52,7 @@ hyprpicker hyprshot hypridle + kanshi # Etc gopsuinfo # For system stats in panel wl-clipboard # System clipboard diff --git a/shared/dotfiles/swaync/config.json b/shared/dotfiles/swaync/config.json new file mode 100644 index 0000000..f7c1eaa --- /dev/null +++ b/shared/dotfiles/swaync/config.json @@ -0,0 +1,5 @@ +{ + "positionX": "center", + "positionY": "top", + "notification-window-width": 800 +} diff --git a/shared/dotfiles/swaync/style.css b/shared/dotfiles/swaync/style.css index 328f344..2cad1ab 100644 --- a/shared/dotfiles/swaync/style.css +++ b/shared/dotfiles/swaync/style.css @@ -1,6 +1,6 @@ * { all: unset; - font-size: 14px; + font-size: 18px; font-family: "Ubuntu Nerd Font"; transition: 200ms; } diff --git a/shared/linked-dotfiles/helix/config.toml b/shared/linked-dotfiles/helix/config.toml index 7922870..9a83fe7 100644 --- a/shared/linked-dotfiles/helix/config.toml +++ b/shared/linked-dotfiles/helix/config.toml @@ -1,5 +1,5 @@ # Theme -theme = "catppuccin_macchiato" +theme = "catppuccin_macchiato_minimal" [keys.normal] @@ -176,7 +176,8 @@ newline = "none" nbsp = "none" [editor.whitespace.characters] -space = "·" +space = " " +# space = "·" tab = "⇀" tabpad = " " diff --git a/shared/linked-dotfiles/helix/languages.toml b/shared/linked-dotfiles/helix/languages.toml index 240f72c..8ed25e3 100644 --- a/shared/linked-dotfiles/helix/languages.toml +++ b/shared/linked-dotfiles/helix/languages.toml @@ -4,7 +4,21 @@ [[language]] name = "go" -language-servers = ["gopls"] + +[language.debugger] +name = "go" +transport = "tcp" +command = "dlv" +args = ["connect"] +port-arg = "127.0.0.1:2345" + +[[language.debugger.templates]] +name = "connect" +request = "launch" +completion = [] +args = {} +# completion = [ {name = "port", default = "2345"} ] +# args = { port = "{0}" } [[language]] name = "markdown" diff --git a/shared/linked-dotfiles/helix/themes/catppuccin_macchiato_minimal.toml b/shared/linked-dotfiles/helix/themes/catppuccin_macchiato_minimal.toml new file mode 100644 index 0000000..c29e118 --- /dev/null +++ b/shared/linked-dotfiles/helix/themes/catppuccin_macchiato_minimal.toml @@ -0,0 +1,149 @@ +# Catppuccin Macchiato Minimal - Judicious Syntax Highlighting +# Uses only 4 colors for syntax: lavender (keywords), green (strings), peach (numbers), mauve (comments) +# Functions and variables remain plain text for reduced visual noise + +"ui.background" = { bg = "base" } +"ui.virtual" = { fg = "surface0" } +"ui.virtual.ruler" = { bg = "surface0" } +"ui.virtual.indent-guide" = { fg = "surface0" } +"ui.virtual.inlay-hint" = { fg = "overlay1", bg = "mantle", modifiers = ["italic"] } +"ui.virtual.jump-label" = { fg = "red", modifiers = ["bold"] } + +"ui.selection" = { bg = "surface1" } +"ui.selection.primary" = { bg = "surface2" } + +"ui.cursor" = { fg = "base", bg = "lavender" } +"ui.cursor.primary" = { fg = "base", bg = "lavender" } +"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] } +"ui.cursorline.primary" = { bg = "surface0" } +"ui.cursorcolumn.primary" = { bg = "surface0" } + +"ui.linenr" = { fg = "surface1" } +"ui.linenr.selected" = { fg = "lavender", modifiers = ["bold"] } + +"ui.statusline" = { fg = "text", bg = "mantle" } +"ui.statusline.inactive" = { fg = "overlay0", bg = "mantle" } +"ui.statusline.normal" = { fg = "base", bg = "lavender", modifiers = ["bold"] } +"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] } +"ui.statusline.select" = { fg = "base", bg = "mauve", modifiers = ["bold"] } + +"ui.bufferline" = { fg = "overlay0", bg = "mantle" } +"ui.bufferline.active" = { fg = "lavender", bg = "base", modifiers = ["bold"] } + +"ui.help" = { fg = "text", bg = "surface0" } +"ui.text" = "text" +"ui.text.focus" = { fg = "text", bg = "surface0" } +"ui.text.inactive" = "overlay1" + +"ui.menu" = { fg = "text", bg = "surface0" } +"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] } +"ui.menu.scroll" = { fg = "overlay0", bg = "surface0" } + +"ui.popup" = { fg = "text", bg = "surface0" } +"ui.window" = { fg = "base" } + +"diagnostic.error" = { underline = { color = "red", style = "curl" } } +"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } } +"diagnostic.info" = { underline = { color = "sky", style = "curl" } } +"diagnostic.hint" = { underline = { color = "teal", style = "curl" } } +"diagnostic.unnecessary" = { modifiers = ["dim"] } +"diagnostic.deprecated" = { modifiers = ["crossed_out"] } + +"error" = "red" +"warning" = "yellow" +"info" = "sky" +"hint" = "teal" + +"diff.plus" = "green" +"diff.minus" = "red" +"diff.delta" = "yellow" + +"markup.heading" = { fg = "lavender", modifiers = ["bold"] } +"markup.list" = "mauve" +"markup.bold" = { modifiers = ["bold"] } +"markup.italic" = { modifiers = ["italic"] } +"markup.strikethrough" = { modifiers = ["crossed_out"] } +"markup.link.url" = { fg = "blue", modifiers = ["underlined"] } +"markup.link.text" = "mauve" +"markup.quote" = "green" +"markup.raw" = "green" + +# Minimal syntax highlighting - only 4 colors used +"comment" = "yellow" # Comments pop + +"keyword" = { fg = "mauve", modifiers = ["italic"] } # Keywords highlighted and italic +"keyword.control" = { fg = "mauve", modifiers = ["italic"] } +"keyword.directive" = { fg = "mauve", modifiers = ["italic"] } +"keyword.function" = { fg = "mauve", modifiers = ["italic"] } +"keyword.operator" = { fg = "mauve", modifiers = ["italic"] } +"keyword.return" = { fg = "mauve", modifiers = ["italic"] } +"keyword.storage" = { fg = "mauve", modifiers = ["italic"] } + +"string" = "green" # Strings highlighted +"string.regexp" = "peach" +"string.special" = "green" + +"constant.numeric" = "peach" # Numbers highlighted +"constant.builtin" = "peach" +"constant.character.escape" = "peach" + +# Everything else remains plain text +"function" = "text" # Functions are plain text +"function.builtin" = "text" +"function.method" = "text" +"function.macro" = "text" + +"variable" = "text" # Variables are plain text +"variable.builtin" = "text" +"variable.parameter" = "text" +"variable.other.member" = "text" + +"type" = "lavender" # Types are slightly highlighted +"type.builtin" = "lavender" + +"constructor" = "text" # Constructors are plain text + +"attribute" = "text" +"label" = "text" +"namespace" = "text" +"tag" = "text" + +# Top-level declarations get keyword color +"function.definition" = { fg = "flamingo", modifiers = ["bold"] } +"type.definition" = { fg = "flamingo", modifiers = ["bold"] } + +# Punctuation is slightly dimmed but still readable +"punctuation" = "subtext0" +"punctuation.bracket" = "subtext0" +"punctuation.delimiter" = "subtext0" +"punctuation.special" = "subtext0" + +"operator" = "subtext0" # Operators slightly dimmed + +[palette] +rosewater = "#f4dbd6" +flamingo = "#f0c6c6" +pink = "#f5bde6" +mauve = "#c6a0f6" +red = "#ed8796" +maroon = "#ee99a0" +peach = "#f5a97f" +yellow = "#eed49f" +green = "#a6da95" +teal = "#8bd5ca" +sky = "#91d7e3" +sapphire = "#7dc4e4" +blue = "#8aadf4" +lavender = "#b7bdf8" +text = "#cad3f5" +subtext1 = "#b8c0e0" +subtext0 = "#a5adcb" +overlay2 = "#939ab7" +overlay1 = "#8087a2" +overlay0 = "#6e738d" +surface2 = "#5b6078" +surface1 = "#494d64" +surface0 = "#363a4f" +base = "#24273a" +mantle = "#1e2030" +crust = "#181926" diff --git a/shared/linked-dotfiles/opencode/opencode.jsonc b/shared/linked-dotfiles/opencode/opencode.jsonc new file mode 100644 index 0000000..b43ce5c --- /dev/null +++ b/shared/linked-dotfiles/opencode/opencode.jsonc @@ -0,0 +1,16 @@ +{ + "$schema": "https://opencode.ai/config.json", + "theme": "catppuccin", + "autoupdate": false, + "model": "claude-sonnet-4-5", + "small_model": "claude-haiku-4-5", + "mcp": { + "context7": { + "type": "remote", + "url": "https://mcp.context7.com/mcp", + "headers": { + "CONTEXT7_API_KEY": "{env:CONTEXT7_API_KEY}" + } + } + } +} \ No newline at end of file