Update nate-work config with new dotfiles linking strat

This commit is contained in:
Nate Anderson 2025-10-16 14:51:13 -06:00
parent 18afdc0fb6
commit a0857002d6
21 changed files with 502 additions and 264 deletions

34
AGENTS.md Normal file
View File

@ -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.<hostname>.config.system.build.toplevel --dry-run
# Test configuration without switching
sudo nixos-rebuild test --flake .
# Apply configuration changes
sudo nixos-rebuild switch --flake .#<hostname>
```
## 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

12
flake.lock generated
View File

@ -98,11 +98,11 @@
}, },
"nixpkgs-unstable": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1759831965, "lastModified": 1760524057,
"narHash": "sha256-vgPm2xjOmKdZ0xKA6yLXPJpjOtQPHfaZDRtH+47XEBo=", "narHash": "sha256-EVAqOteLBFmd7pKkb0+FIUyzTF61VKi7YmvP1tw4nEw=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "c9b6fb798541223bbb396d287d16f43520250518", "rev": "544961dfcce86422ba200ed9a0b00dd4b1486ec5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -114,11 +114,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1759735786, "lastModified": 1760423683,
"narHash": "sha256-a0+h02lyP2KwSNrZz4wLJTu9ikujNsTWIC874Bv7IJ0=", "narHash": "sha256-Tb+NYuJhWZieDZUxN6PgglB16yuqBYQeMJyYBGCXlt8=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "20c4598c84a671783f741e02bf05cbfaf4907cff", "rev": "a493e93b4a259cd9fea8073f89a7ed9b1c5a1da2",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -138,7 +138,7 @@
if builtins.pathExists sharedDotfilesPath then if builtins.pathExists sharedDotfilesPath then
builtins.listToAttrs (map (name: { builtins.listToAttrs (map (name: {
name = "${config.xdg.configHome}/${name}"; name = "${config.xdg.configHome}/${name}";
value = { source = sharedDotfilesPath + "/${name}"; }; value = { source = lib.mkDefault (sharedDotfilesPath + "/${name}"); };
}) (builtins.attrNames (builtins.readDir sharedDotfilesPath))) }) (builtins.attrNames (builtins.readDir sharedDotfilesPath)))
else {}) else {})
# Add local dotfiles, overriding from local over shared # Add local dotfiles, overriding from local over shared
@ -161,8 +161,10 @@
# Active symlinks # Active symlinks
xdg.configFile = { 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"; "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"; "helix".source = config.lib.file.mkOutOfStoreSymlink "/home/nate/nixos/shared/linked-dotfiles/helix";
# Theme configuration # Theme configuration

View File

@ -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
}

View File

@ -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

View File

Before

Width:  |  Height:  |  Size: 376 KiB

After

Width:  |  Height:  |  Size: 376 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 MiB

After

Width:  |  Height:  |  Size: 2.7 MiB

View File

@ -1,6 +1,7 @@
// Global // Global
{ {
"layer": "bottom", // "mode": "hide",
"layer": "top",
"position": "top", "position": "top",
"margin-top": 3, "margin-top": 3,
"margin-left": 3, "margin-left": 3,

View File

@ -1,31 +1,9 @@
{ inputs, config, pkgs, ... }: { inputs, config, pkgs, lib, ... }:
let let
userName = "nate"; userName = "nate";
fullName = "Nate Anderson"; fullName = "Nate Anderson";
email = "nate.anderson@vasion.com"; email = "nate.anderson@vasion.com";
unstable = import inputs.nixpkgs-unstable { system = "x86_64-linux"; config.allowUnfree = true; }; 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 in
{ {
# nixpkgs.overlays = [ # nixpkgs.overlays = [
@ -67,6 +45,7 @@
# Dev Tools # Dev Tools
# #
helix helix
vscode-fhs
unstable.distrobox unstable.distrobox
unstable.docker_25 unstable.docker_25
docker-compose docker-compose
@ -75,20 +54,22 @@
mariadb mariadb
lsp-ai lsp-ai
python3 python3
nodejs_24
cmake cmake
# AI
unstable.claude-code unstable.claude-code
unstable.opencode
# proto # proto
protobuf protobuf
protoc-gen-dart protoc-gen-dart
# Go stuff # Go stuff
go go
delve unstable.delve
gotools gotools
go-tools go-tools
govulncheck govulncheck
unstable.golangci-lint unstable.golangci-lint
go-swag go-swag
delve
trivy trivy
# clojure # clojure
@ -135,12 +116,7 @@
gtop gtop
htop htop
neofetch neofetch
s-tui
openapi-tui
tasktimer
# Normies
unzip unzip
llpp
nmap nmap
# #
@ -149,11 +125,12 @@
imv imv
mpv mpv
ffmpeg ffmpeg
tenacity audacity
yt-dlp yt-dlp
simple-scan
# iphone connections
libimobiledevice libimobiledevice
ifuse ifuse
simple-scan
# #
# Communication # 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) # enable saving ssh secrets (needed for go mod installing private packages)
services.gnome-keyring.enable = true; services.gnome-keyring.enable = true;
services.gnome-keyring.components = [ "ssh" "secrets" ]; services.gnome-keyring.components = [ "ssh" "secrets" ];
@ -343,9 +315,37 @@
# cursor defined in hypr-home.nix # 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 = { 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"; "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/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.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"; "gtk-4.0/gtk-dark.css".source = "${config.gtk.theme.package}/share/themes/${config.gtk.theme.name}/gtk-4.0/gtk-dark.css";

View File

@ -12,221 +12,15 @@
}; };
config = lib.mkIf config.hyprhome.enable { config = lib.mkIf config.hyprhome.enable {
wayland.windowManager.hyprland.enable = true; # enable Hyprland # Note: We don't use wayland.windowManager.hyprland.enable
# wayland.windowManager.hyprland.package = null; # enable Hyprland # because it generates config files that conflict with our dotfiles.
# wayland.windowManager.hyprland.portalPackage = null; # enable Hyprland # Instead, we install hyprland via packages and manage config manually.
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'"
# trigger when the switch is turning off # Import systemd variables for hyprland
", switch:off:Lid Switch, exec, hyprctl keyword monitor 'eDP-1, 2560x1600@165, 0x0, 1.00'" systemd.user.sessionVariables = {
]; WAYLAND_DISPLAY = "wayland-1";
windowrulev2 = [ XDG_CURRENT_DESKTOP = "Hyprland";
# 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 variables
wayland.windowManager.hyprland.systemd.variables = ["--all"];
home.pointerCursor = { home.pointerCursor = {
gtk.enable = true; gtk.enable = true;
@ -258,6 +52,7 @@
hyprpicker hyprpicker
hyprshot hyprshot
hypridle hypridle
kanshi
# Etc # Etc
gopsuinfo # For system stats in panel gopsuinfo # For system stats in panel
wl-clipboard # System clipboard wl-clipboard # System clipboard

View File

@ -0,0 +1,5 @@
{
"positionX": "center",
"positionY": "top",
"notification-window-width": 800
}

View File

@ -1,6 +1,6 @@
* { * {
all: unset; all: unset;
font-size: 14px; font-size: 18px;
font-family: "Ubuntu Nerd Font"; font-family: "Ubuntu Nerd Font";
transition: 200ms; transition: 200ms;
} }

View File

@ -1,5 +1,5 @@
# Theme # Theme
theme = "catppuccin_macchiato" theme = "catppuccin_macchiato_minimal"
[keys.normal] [keys.normal]
@ -176,7 +176,8 @@ newline = "none"
nbsp = "none" nbsp = "none"
[editor.whitespace.characters] [editor.whitespace.characters]
space = "·" space = " "
# space = "·"
tab = "⇀" tab = "⇀"
tabpad = " " tabpad = " "

View File

@ -4,7 +4,21 @@
[[language]] [[language]]
name = "go" 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]] [[language]]
name = "markdown" name = "markdown"

View File

@ -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"

View File

@ -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}"
}
}
}
}