initial config
This commit is contained in:
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
result
|
||||||
|
result-*
|
||||||
|
.direnv/
|
||||||
|
*.qcow2
|
||||||
|
secrets/
|
||||||
|
.DS_Store
|
||||||
67
config/alacritty/alacritty.toml
Normal file
67
config/alacritty/alacritty.toml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# ══════════════════════════════════════════
|
||||||
|
# ALACRITTY CONFIGURATION — Gruvbox Dark
|
||||||
|
# ══════════════════════════════════════════
|
||||||
|
|
||||||
|
[window]
|
||||||
|
padding = { x = 8, y = 8 }
|
||||||
|
decorations = "None"
|
||||||
|
opacity = 0.95
|
||||||
|
dynamic_padding = true
|
||||||
|
startup_mode = "Maximized"
|
||||||
|
|
||||||
|
[font]
|
||||||
|
size = 13.0
|
||||||
|
|
||||||
|
[font.normal]
|
||||||
|
family = "JetBrainsMono Nerd Font"
|
||||||
|
style = "Regular"
|
||||||
|
|
||||||
|
[font.bold]
|
||||||
|
family = "JetBrainsMono Nerd Font"
|
||||||
|
style = "Bold"
|
||||||
|
|
||||||
|
[font.italic]
|
||||||
|
family = "JetBrainsMono Nerd Font"
|
||||||
|
style = "Italic"
|
||||||
|
|
||||||
|
[scrolling]
|
||||||
|
history = 10000
|
||||||
|
multiplier = 3
|
||||||
|
|
||||||
|
[selection]
|
||||||
|
save_to_clipboard = true
|
||||||
|
|
||||||
|
# ── Gruvbox Dark Hard ───────────────────
|
||||||
|
[colors.primary]
|
||||||
|
background = "#1d2021"
|
||||||
|
foreground = "#ebdbb2"
|
||||||
|
|
||||||
|
[colors.cursor]
|
||||||
|
text = "#1d2021"
|
||||||
|
cursor = "#ebdbb2"
|
||||||
|
|
||||||
|
[colors.normal]
|
||||||
|
black = "#282828"
|
||||||
|
red = "#cc241d"
|
||||||
|
green = "#98971a"
|
||||||
|
yellow = "#d79921"
|
||||||
|
blue = "#458588"
|
||||||
|
magenta = "#b16286"
|
||||||
|
cyan = "#689d6a"
|
||||||
|
white = "#a89984"
|
||||||
|
|
||||||
|
[colors.bright]
|
||||||
|
black = "#928374"
|
||||||
|
red = "#fb4934"
|
||||||
|
green = "#b8bb26"
|
||||||
|
yellow = "#fabd2f"
|
||||||
|
blue = "#83a598"
|
||||||
|
magenta = "#d3869b"
|
||||||
|
cyan = "#8ec07c"
|
||||||
|
white = "#ebdbb2"
|
||||||
|
|
||||||
|
# ── Keyboard Bindings ───────────────────
|
||||||
|
[[keyboard.bindings]]
|
||||||
|
key = "N"
|
||||||
|
mods = "Control|Shift"
|
||||||
|
action = "CreateNewWindow"
|
||||||
233
config/hypr/hyprland.conf
Normal file
233
config/hypr/hyprland.conf
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
# ══════════════════════════════════════════
|
||||||
|
# HYPRLAND CONFIGURATION — Omarchy-style
|
||||||
|
# ══════════════════════════════════════════
|
||||||
|
# Keyboard-first. Consistent keybinds. Clean aesthetics.
|
||||||
|
# Super is the main modifier (like omarchy).
|
||||||
|
# ══════════════════════════════════════════
|
||||||
|
|
||||||
|
# ── Monitors ─────────────────────────────
|
||||||
|
# Adjust for your setup. "preferred" auto-detects.
|
||||||
|
monitor = , preferred, auto, 1
|
||||||
|
|
||||||
|
# ── Autostart ────────────────────────────
|
||||||
|
exec-once = waybar
|
||||||
|
exec-once = walker --gapplication-service
|
||||||
|
exec-once = mako
|
||||||
|
exec-once = wl-paste --type text --watch cliphist store
|
||||||
|
exec-once = wl-paste --type image --watch cliphist store
|
||||||
|
exec-once = wl-clip-persist --clipboard regular
|
||||||
|
exec-once = nm-applet --indicator
|
||||||
|
exec-once = blueman-applet
|
||||||
|
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
|
||||||
|
|
||||||
|
# ── General ──────────────────────────────
|
||||||
|
general {
|
||||||
|
gaps_in = 4
|
||||||
|
gaps_out = 8
|
||||||
|
border_size = 2
|
||||||
|
|
||||||
|
# Gruvbox colors
|
||||||
|
col.active_border = rgba(d79921ff) rgba(b8bb26ff) 45deg
|
||||||
|
col.inactive_border = rgba(504945ff)
|
||||||
|
|
||||||
|
layout = dwindle
|
||||||
|
allow_tearing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── Decoration ───────────────────────────
|
||||||
|
decoration {
|
||||||
|
rounding = 8
|
||||||
|
|
||||||
|
blur {
|
||||||
|
enabled = true
|
||||||
|
size = 6
|
||||||
|
passes = 2
|
||||||
|
new_optimizations = true
|
||||||
|
xray = false
|
||||||
|
}
|
||||||
|
|
||||||
|
shadow {
|
||||||
|
enabled = true
|
||||||
|
range = 12
|
||||||
|
render_power = 3
|
||||||
|
color = rgba(1d2021cc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── Animations ───────────────────────────
|
||||||
|
animations {
|
||||||
|
enabled = true
|
||||||
|
bezier = ease, 0.25, 0.1, 0.25, 1
|
||||||
|
bezier = overshot, 0.05, 0.9, 0.1, 1.1
|
||||||
|
|
||||||
|
animation = windows, 1, 4, overshot, slide
|
||||||
|
animation = windowsOut, 1, 4, ease, slide
|
||||||
|
animation = fade, 1, 4, ease
|
||||||
|
animation = workspaces, 1, 4, overshot, slidevert
|
||||||
|
animation = border, 1, 6, ease
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── Layout ───────────────────────────────
|
||||||
|
dwindle {
|
||||||
|
pseudotile = true
|
||||||
|
preserve_split = true
|
||||||
|
force_split = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
master {
|
||||||
|
new_status = master
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── Input ────────────────────────────────
|
||||||
|
input {
|
||||||
|
kb_layout = us
|
||||||
|
kb_options = caps:escape
|
||||||
|
|
||||||
|
follow_mouse = 1
|
||||||
|
sensitivity = 0
|
||||||
|
|
||||||
|
touchpad {
|
||||||
|
natural_scroll = true
|
||||||
|
tap-to-click = true
|
||||||
|
drag_lock = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gestures {
|
||||||
|
workspace_swipe = true
|
||||||
|
workspace_swipe_fingers = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── Misc ─────────────────────────────────
|
||||||
|
misc {
|
||||||
|
disable_hyprland_logo = true
|
||||||
|
disable_splash_rendering = true
|
||||||
|
force_default_wallpaper = 0
|
||||||
|
vfr = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ══════════════════════════════════════════
|
||||||
|
# KEYBINDINGS — Omarchy-inspired
|
||||||
|
# ══════════════════════════════════════════
|
||||||
|
# Super = main modifier
|
||||||
|
# Super + Return = terminal
|
||||||
|
# Super + Space = app launcher
|
||||||
|
# Super + Shift + Return = browser
|
||||||
|
# Super + Q = close window
|
||||||
|
# Super + K = show all keybinds (via walker)
|
||||||
|
# ══════════════════════════════════════════
|
||||||
|
|
||||||
|
$mod = SUPER
|
||||||
|
|
||||||
|
# ── Core ─────────────────────────────────
|
||||||
|
bind = $mod, Return, exec, alacritty
|
||||||
|
bind = $mod SHIFT, Return, exec, firefox # Change to helium if installed
|
||||||
|
bind = $mod, Space, exec, walker
|
||||||
|
bind = $mod, Q, killactive
|
||||||
|
bind = $mod SHIFT, Q, exit
|
||||||
|
bind = $mod, V, togglefloating
|
||||||
|
bind = $mod, F, fullscreen
|
||||||
|
bind = $mod, P, pseudo # dwindle pseudo-tile
|
||||||
|
bind = $mod, J, togglesplit # dwindle toggle split direction
|
||||||
|
|
||||||
|
# ── Applications ─────────────────────────
|
||||||
|
bind = $mod, E, exec, nautilus # File manager
|
||||||
|
bind = $mod, B, exec, bitwarden # Password manager
|
||||||
|
bind = $mod SHIFT, S, exec, spotify
|
||||||
|
bind = $mod, C, exec, cursor # Cursor IDE
|
||||||
|
bind = $mod SHIFT, C, exec, code # VS Code (antigravity)
|
||||||
|
|
||||||
|
# ── Window Focus (vim keys) ──────────────
|
||||||
|
bind = $mod, h, movefocus, l
|
||||||
|
bind = $mod, l, movefocus, r
|
||||||
|
bind = $mod, k, movefocus, u
|
||||||
|
bind = $mod, j, movefocus, d
|
||||||
|
|
||||||
|
# ── Window Move ──────────────────────────
|
||||||
|
bind = $mod SHIFT, h, movewindow, l
|
||||||
|
bind = $mod SHIFT, l, movewindow, r
|
||||||
|
bind = $mod SHIFT, k, movewindow, u
|
||||||
|
bind = $mod SHIFT, j, movewindow, d
|
||||||
|
|
||||||
|
# ── Window Resize ────────────────────────
|
||||||
|
binde = $mod CTRL, h, resizeactive, -40 0
|
||||||
|
binde = $mod CTRL, l, resizeactive, 40 0
|
||||||
|
binde = $mod CTRL, k, resizeactive, 0 -40
|
||||||
|
binde = $mod CTRL, j, resizeactive, 0 40
|
||||||
|
|
||||||
|
# ── Workspaces ───────────────────────────
|
||||||
|
bind = $mod, 1, workspace, 1
|
||||||
|
bind = $mod, 2, workspace, 2
|
||||||
|
bind = $mod, 3, workspace, 3
|
||||||
|
bind = $mod, 4, workspace, 4
|
||||||
|
bind = $mod, 5, workspace, 5
|
||||||
|
bind = $mod, 6, workspace, 6
|
||||||
|
bind = $mod, 7, workspace, 7
|
||||||
|
bind = $mod, 8, workspace, 8
|
||||||
|
bind = $mod, 9, workspace, 9
|
||||||
|
bind = $mod, 0, workspace, 10
|
||||||
|
|
||||||
|
# Move window to workspace
|
||||||
|
bind = $mod SHIFT, 1, movetoworkspace, 1
|
||||||
|
bind = $mod SHIFT, 2, movetoworkspace, 2
|
||||||
|
bind = $mod SHIFT, 3, movetoworkspace, 3
|
||||||
|
bind = $mod SHIFT, 4, movetoworkspace, 4
|
||||||
|
bind = $mod SHIFT, 5, movetoworkspace, 5
|
||||||
|
bind = $mod SHIFT, 6, movetoworkspace, 6
|
||||||
|
bind = $mod SHIFT, 7, movetoworkspace, 7
|
||||||
|
bind = $mod SHIFT, 8, movetoworkspace, 8
|
||||||
|
bind = $mod SHIFT, 9, movetoworkspace, 9
|
||||||
|
bind = $mod SHIFT, 0, movetoworkspace, 10
|
||||||
|
|
||||||
|
# Workspace navigation
|
||||||
|
bind = $mod, Tab, workspace, e+1
|
||||||
|
bind = $mod SHIFT, Tab, workspace, e-1
|
||||||
|
|
||||||
|
# ── Special Workspace (Scratchpad) ───────
|
||||||
|
bind = $mod, S, togglespecialworkspace, magic
|
||||||
|
bind = $mod SHIFT, S, movetoworkspace, special:magic
|
||||||
|
|
||||||
|
# ── Screenshots ──────────────────────────
|
||||||
|
bind = , Print, exec, grim -g "$(slurp)" - | swappy -f -
|
||||||
|
bind = $mod, Print, exec, grim - | swappy -f -
|
||||||
|
|
||||||
|
# ── Media Keys ───────────────────────────
|
||||||
|
bindel = , XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise
|
||||||
|
bindel = , XF86AudioLowerVolume, exec, swayosd-client --output-volume lower
|
||||||
|
bindl = , XF86AudioMute, exec, swayosd-client --output-volume mute-toggle
|
||||||
|
bindl = , XF86AudioMicMute, exec, swayosd-client --input-volume mute-toggle
|
||||||
|
bindel = , XF86MonBrightnessUp, exec, swayosd-client --brightness raise
|
||||||
|
bindel = , XF86MonBrightnessDown, exec, swayosd-client --brightness lower
|
||||||
|
bindl = , XF86AudioPlay, exec, playerctl play-pause
|
||||||
|
bindl = , XF86AudioNext, exec, playerctl next
|
||||||
|
bindl = , XF86AudioPrev, exec, playerctl previous
|
||||||
|
|
||||||
|
# ── Clipboard History ────────────────────
|
||||||
|
bind = $mod CTRL, V, exec, cliphist list | walker --dmenu | cliphist decode | wl-copy
|
||||||
|
|
||||||
|
# ── Lock Screen ──────────────────────────
|
||||||
|
bind = $mod CTRL, L, exec, hyprlock
|
||||||
|
|
||||||
|
# ── Mouse Bindings ───────────────────────
|
||||||
|
bindm = $mod, mouse:272, movewindow
|
||||||
|
bindm = $mod, mouse:273, resizewindow
|
||||||
|
|
||||||
|
# ── Window Rules ─────────────────────────
|
||||||
|
windowrulev2 = float, class:^(pavucontrol)$
|
||||||
|
windowrulev2 = float, class:^(blueman-manager)$
|
||||||
|
windowrulev2 = float, class:^(nm-connection-editor)$
|
||||||
|
windowrulev2 = float, class:^(bitwarden)$
|
||||||
|
windowrulev2 = float, title:^(Picture-in-Picture)$
|
||||||
|
windowrulev2 = pin, title:^(Picture-in-Picture)$
|
||||||
|
|
||||||
|
# ── Environment Variables ────────────────
|
||||||
|
env = XCURSOR_SIZE, 24
|
||||||
|
env = QT_QPA_PLATFORMTHEME, qt5ct
|
||||||
|
env = QT_QPA_PLATFORM, wayland
|
||||||
|
env = GDK_BACKEND, wayland
|
||||||
|
env = SDL_VIDEODRIVER, wayland
|
||||||
|
env = CLUTTER_BACKEND, wayland
|
||||||
|
env = XDG_CURRENT_DESKTOP, Hyprland
|
||||||
|
env = XDG_SESSION_TYPE, wayland
|
||||||
|
env = XDG_SESSION_DESKTOP, Hyprland
|
||||||
39
config/walker/config.toml
Normal file
39
config/walker/config.toml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# ══════════════════════════════════════════
|
||||||
|
# WALKER CONFIGURATION
|
||||||
|
# ══════════════════════════════════════════
|
||||||
|
# Wayland-native application launcher for Hyprland.
|
||||||
|
# Activated with Super+Space.
|
||||||
|
# ══════════════════════════════════════════
|
||||||
|
|
||||||
|
[search]
|
||||||
|
placeholder = "Search..."
|
||||||
|
delay = 0
|
||||||
|
|
||||||
|
[ui]
|
||||||
|
fullscreen = false
|
||||||
|
ignore_exclusive = false
|
||||||
|
show_initial_entries = true
|
||||||
|
|
||||||
|
[ui.anchors]
|
||||||
|
top = true
|
||||||
|
bottom = false
|
||||||
|
left = true
|
||||||
|
right = true
|
||||||
|
|
||||||
|
# Gruvbox theme
|
||||||
|
[theme.ui.window]
|
||||||
|
box.margin_top = 200
|
||||||
|
box.margin_bottom = 200
|
||||||
|
box.margin_start = 300
|
||||||
|
box.margin_end = 300
|
||||||
|
|
||||||
|
# Modules — which sources to search
|
||||||
|
[modules]
|
||||||
|
applications.weight = 1
|
||||||
|
runner.weight = 5
|
||||||
|
websearch.weight = 10
|
||||||
|
|
||||||
|
# Web search via DuckDuckGo
|
||||||
|
[modules.websearch]
|
||||||
|
prefix = "?"
|
||||||
|
engines = ["duckduckgo"]
|
||||||
115
config/waybar/config.jsonc
Normal file
115
config/waybar/config.jsonc
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
// ══════════════════════════════════════════
|
||||||
|
// WAYBAR CONFIGURATION — Gruvbox Dark
|
||||||
|
// ══════════════════════════════════════════
|
||||||
|
{
|
||||||
|
"layer": "top",
|
||||||
|
"position": "top",
|
||||||
|
"height": 36,
|
||||||
|
"spacing": 4,
|
||||||
|
"margin-top": 4,
|
||||||
|
"margin-left": 8,
|
||||||
|
"margin-right": 8,
|
||||||
|
|
||||||
|
// Module layout
|
||||||
|
"modules-left": [
|
||||||
|
"hyprland/workspaces",
|
||||||
|
"hyprland/window"
|
||||||
|
],
|
||||||
|
"modules-center": [
|
||||||
|
"clock"
|
||||||
|
],
|
||||||
|
"modules-right": [
|
||||||
|
"tray",
|
||||||
|
"pulseaudio",
|
||||||
|
"network",
|
||||||
|
"bluetooth",
|
||||||
|
"battery",
|
||||||
|
"custom/power"
|
||||||
|
],
|
||||||
|
|
||||||
|
// ── Workspaces ────────────────────────
|
||||||
|
"hyprland/workspaces": {
|
||||||
|
"format": "{icon}",
|
||||||
|
"format-icons": {
|
||||||
|
"1": "1",
|
||||||
|
"2": "2",
|
||||||
|
"3": "3",
|
||||||
|
"4": "4",
|
||||||
|
"5": "5",
|
||||||
|
"6": "6",
|
||||||
|
"7": "7",
|
||||||
|
"8": "8",
|
||||||
|
"9": "9",
|
||||||
|
"10": "0"
|
||||||
|
},
|
||||||
|
"on-click": "activate",
|
||||||
|
"sort-by-number": true,
|
||||||
|
"active-only": false
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Window Title ──────────────────────
|
||||||
|
"hyprland/window": {
|
||||||
|
"format": "{}",
|
||||||
|
"max-length": 40,
|
||||||
|
"separate-outputs": true
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Clock ─────────────────────────────
|
||||||
|
"clock": {
|
||||||
|
"format": "{:%H:%M}",
|
||||||
|
"format-alt": "{:%A, %B %d, %Y %H:%M}",
|
||||||
|
"tooltip-format": "<tt><small>{calendar}</small></tt>"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Audio ─────────────────────────────
|
||||||
|
"pulseaudio": {
|
||||||
|
"format": "{icon} {volume}%",
|
||||||
|
"format-muted": " muted",
|
||||||
|
"format-icons": {
|
||||||
|
"default": ["", "", ""]
|
||||||
|
},
|
||||||
|
"on-click": "pavucontrol"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Network ───────────────────────────
|
||||||
|
"network": {
|
||||||
|
"format-wifi": " {signalStrength}%",
|
||||||
|
"format-ethernet": " {ipaddr}",
|
||||||
|
"format-disconnected": " off",
|
||||||
|
"tooltip-format-wifi": "{essid} ({signalStrength}%)\n{ipaddr}",
|
||||||
|
"on-click": "nm-connection-editor"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Bluetooth ─────────────────────────
|
||||||
|
"bluetooth": {
|
||||||
|
"format": " {status}",
|
||||||
|
"format-connected": " {device_alias}",
|
||||||
|
"format-disabled": "",
|
||||||
|
"on-click": "blueman-manager"
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Battery ───────────────────────────
|
||||||
|
"battery": {
|
||||||
|
"states": {
|
||||||
|
"warning": 30,
|
||||||
|
"critical": 15
|
||||||
|
},
|
||||||
|
"format": "{icon} {capacity}%",
|
||||||
|
"format-charging": " {capacity}%",
|
||||||
|
"format-plugged": " {capacity}%",
|
||||||
|
"format-icons": ["", "", "", "", ""]
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── System Tray ───────────────────────
|
||||||
|
"tray": {
|
||||||
|
"icon-size": 16,
|
||||||
|
"spacing": 8
|
||||||
|
},
|
||||||
|
|
||||||
|
// ── Power Button ──────────────────────
|
||||||
|
"custom/power": {
|
||||||
|
"format": "",
|
||||||
|
"on-click": "hyprlock",
|
||||||
|
"tooltip": false
|
||||||
|
}
|
||||||
|
}
|
||||||
150
config/waybar/style.css
Normal file
150
config/waybar/style.css
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
/* ══════════════════════════════════════════
|
||||||
|
* WAYBAR STYLES — Gruvbox Dark
|
||||||
|
* ══════════════════════════════════════════
|
||||||
|
* Gruvbox palette:
|
||||||
|
* bg0_h = #1d2021 (hardest dark)
|
||||||
|
* bg0 = #282828 (dark background)
|
||||||
|
* bg1 = #3c3836
|
||||||
|
* bg2 = #504945
|
||||||
|
* fg = #ebdbb2 (light foreground)
|
||||||
|
* yellow = #d79921
|
||||||
|
* green = #b8bb26
|
||||||
|
* red = #cc241d
|
||||||
|
* aqua = #689d6a
|
||||||
|
* orange = #d65d0e
|
||||||
|
* blue = #458588
|
||||||
|
* ══════════════════════════════════════════ */
|
||||||
|
|
||||||
|
* {
|
||||||
|
font-family: "JetBrainsMono Nerd Font", monospace;
|
||||||
|
font-size: 13px;
|
||||||
|
min-height: 0;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
window#waybar {
|
||||||
|
background: rgba(29, 32, 33, 0.92);
|
||||||
|
color: #ebdbb2;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Module defaults ─────────────────── */
|
||||||
|
#workspaces,
|
||||||
|
#window,
|
||||||
|
#clock,
|
||||||
|
#pulseaudio,
|
||||||
|
#network,
|
||||||
|
#bluetooth,
|
||||||
|
#battery,
|
||||||
|
#tray,
|
||||||
|
#custom-power {
|
||||||
|
padding: 0 10px;
|
||||||
|
margin: 4px 2px;
|
||||||
|
border-radius: 6px;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Workspaces ──────────────────────── */
|
||||||
|
#workspaces button {
|
||||||
|
color: #a89984;
|
||||||
|
padding: 0 6px;
|
||||||
|
margin: 2px;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: transparent;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.active {
|
||||||
|
color: #1d2021;
|
||||||
|
background: #d79921;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button:hover {
|
||||||
|
color: #ebdbb2;
|
||||||
|
background: #504945;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Window Title ────────────────────── */
|
||||||
|
#window {
|
||||||
|
color: #a89984;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Clock ───────────────────────────── */
|
||||||
|
#clock {
|
||||||
|
color: #ebdbb2;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Audio ───────────────────────────── */
|
||||||
|
#pulseaudio {
|
||||||
|
color: #b8bb26;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio.muted {
|
||||||
|
color: #928374;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Network ─────────────────────────── */
|
||||||
|
#network {
|
||||||
|
color: #83a598;
|
||||||
|
}
|
||||||
|
|
||||||
|
#network.disconnected {
|
||||||
|
color: #cc241d;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Bluetooth ───────────────────────── */
|
||||||
|
#bluetooth {
|
||||||
|
color: #458588;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Battery ─────────────────────────── */
|
||||||
|
#battery {
|
||||||
|
color: #b8bb26;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.charging {
|
||||||
|
color: #d79921;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.warning:not(.charging) {
|
||||||
|
color: #d65d0e;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.critical:not(.charging) {
|
||||||
|
color: #cc241d;
|
||||||
|
animation: blink 1s steps(2) infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes blink {
|
||||||
|
to { color: #ebdbb2; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── System Tray ─────────────────────── */
|
||||||
|
#tray > .passive {
|
||||||
|
-gtk-icon-effect: dim;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Power Button ────────────────────── */
|
||||||
|
#custom-power {
|
||||||
|
color: #cc241d;
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-power:hover {
|
||||||
|
color: #fb4934;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Tooltips ────────────────────────── */
|
||||||
|
tooltip {
|
||||||
|
background: #282828;
|
||||||
|
border: 1px solid #504945;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tooltip label {
|
||||||
|
color: #ebdbb2;
|
||||||
|
}
|
||||||
64
flake.nix
Normal file
64
flake.nix
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
description = "Matiss NixOS - Hyprland Workstation";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
# Stable NixOS foundation
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||||
|
|
||||||
|
# Unstable for bleeding-edge packages
|
||||||
|
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
|
||||||
|
# Home Manager (matches system 25.11)
|
||||||
|
home-manager.url = "github:nix-community/home-manager/release-25.11";
|
||||||
|
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
|
# Nixvim (Neovim configuration as Nix)
|
||||||
|
nixvim.url = "github:nix-community/nixvim/nixos-25.11";
|
||||||
|
|
||||||
|
# sops-nix (secrets management)
|
||||||
|
sops-nix.url = "github:mic92/sops-nix";
|
||||||
|
|
||||||
|
# Helium Browser (privacy-first Chromium)
|
||||||
|
helium-browser.url = "github:nicchongwb/helium-browser-nix";
|
||||||
|
helium-browser.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, nixpkgs-unstable, home-manager, nixvim, sops-nix, helium-browser, ... }@inputs:
|
||||||
|
let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
|
||||||
|
# Shared modules for all NixOS hosts
|
||||||
|
sharedModules = [
|
||||||
|
sops-nix.nixosModules.sops
|
||||||
|
|
||||||
|
# Home Manager
|
||||||
|
home-manager.nixosModules.home-manager
|
||||||
|
{
|
||||||
|
home-manager.useGlobalPkgs = true;
|
||||||
|
home-manager.useUserPackages = true;
|
||||||
|
home-manager.extraSpecialArgs = { inherit inputs; };
|
||||||
|
home-manager.backupFileExtension = "backup";
|
||||||
|
home-manager.users.matiss = import ./home.nix;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Overlays
|
||||||
|
({ config, pkgs, ... }: {
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(final: prev: {
|
||||||
|
unstable = import nixpkgs-unstable {
|
||||||
|
localSystem = final.stdenv.hostPlatform;
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
nixosConfigurations.matiss = nixpkgs.lib.nixosSystem {
|
||||||
|
inherit system;
|
||||||
|
specialArgs = { inherit inputs; };
|
||||||
|
modules = [ ./hosts/default/configuration.nix ] ++ sharedModules;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
28
home.nix
Normal file
28
home.nix
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
# Nixvim module
|
||||||
|
inputs.nixvim.homeModules.nixvim
|
||||||
|
|
||||||
|
# User modules
|
||||||
|
./modules/user/packages.nix
|
||||||
|
./modules/user/shell.nix
|
||||||
|
./modules/user/git.nix
|
||||||
|
./modules/user/applications.nix
|
||||||
|
./modules/user/neovim.nix
|
||||||
|
./modules/user/theming.nix
|
||||||
|
./modules/user/dotfiles.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
home.username = "matiss";
|
||||||
|
home.homeDirectory = "/home/matiss";
|
||||||
|
|
||||||
|
home.stateVersion = "25.11";
|
||||||
|
programs.home-manager.enable = true;
|
||||||
|
}
|
||||||
24
hosts/default/configuration.nix
Normal file
24
hosts/default/configuration.nix
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# ==========================================
|
||||||
|
# HOST: matiss (Hyprland Workstation)
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, inputs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
|
||||||
|
# System modules
|
||||||
|
../../modules/system/nix.nix
|
||||||
|
../../modules/system/boot.nix
|
||||||
|
../../modules/system/network.nix
|
||||||
|
../../modules/system/firewall.nix
|
||||||
|
../../modules/system/desktop.nix
|
||||||
|
../../modules/system/hardware.nix
|
||||||
|
../../modules/system/user.nix
|
||||||
|
../../modules/system/fonts.nix
|
||||||
|
../../modules/system/services.nix
|
||||||
|
../../modules/system/vpn.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
networking.hostName = "matiss";
|
||||||
|
}
|
||||||
31
hosts/default/hardware-configuration.nix
Normal file
31
hosts/default/hardware-configuration.nix
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Do not modify this file! It was generated by 'nixos-generate-config'
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "vmd" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/disk/by-uuid/fee68672-3a01-4156-ac68-e035f325a6e6";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/F2AB-5A1A";
|
||||||
|
fsType = "vfat";
|
||||||
|
options = [ "fmask=0022" "dmask=0022" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
||||||
13
modules/system/boot.nix
Normal file
13
modules/system/boot.nix
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# ==========================================
|
||||||
|
# BOOT CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.systemd-boot.configurationLimit = 10;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
|
||||||
|
# Use the latest kernel
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
}
|
||||||
77
modules/system/desktop.nix
Normal file
77
modules/system/desktop.nix
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# ==========================================
|
||||||
|
# DESKTOP ENVIRONMENT — Hyprland + Waybar + Walker
|
||||||
|
# ==========================================
|
||||||
|
# Omarchy-inspired: keyboard-first tiling Wayland compositor
|
||||||
|
# with a clean status bar and fast application launcher.
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Hyprland compositor
|
||||||
|
programs.hyprland = {
|
||||||
|
enable = true;
|
||||||
|
xwayland.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# greetd + tuigreet (minimal TUI login — no bloated DMs)
|
||||||
|
services.greetd = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
default_session = {
|
||||||
|
command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --remember --remember-session --cmd Hyprland";
|
||||||
|
user = "greeter";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Disable other display managers
|
||||||
|
services.xserver.enable = false;
|
||||||
|
|
||||||
|
# Polkit for privilege escalation prompts
|
||||||
|
security.polkit.enable = true;
|
||||||
|
|
||||||
|
# GNOME Keyring for secrets/passwords
|
||||||
|
services.gnome.gnome-keyring.enable = true;
|
||||||
|
security.pam.services.greetd.enableGnomeKeyring = true;
|
||||||
|
|
||||||
|
# Screen locking
|
||||||
|
programs.hyprlock.enable = true;
|
||||||
|
|
||||||
|
# Idle management
|
||||||
|
services.hypridle.enable = true;
|
||||||
|
|
||||||
|
# XDG Desktop Portal (screen sharing, file pickers)
|
||||||
|
xdg.portal = {
|
||||||
|
enable = true;
|
||||||
|
extraPortals = [
|
||||||
|
pkgs.xdg-desktop-portal-hyprland
|
||||||
|
pkgs.xdg-desktop-portal-gtk
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Keyboard — caps lock as escape (omarchy default)
|
||||||
|
services.xserver.xkb = {
|
||||||
|
layout = "us";
|
||||||
|
variant = "";
|
||||||
|
options = "caps:escape";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Desktop packages available system-wide
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
waybar # Status bar
|
||||||
|
walker # Application launcher
|
||||||
|
mako # Notification daemon
|
||||||
|
wl-clipboard # Wayland clipboard
|
||||||
|
cliphist # Clipboard history
|
||||||
|
brightnessctl # Backlight control
|
||||||
|
playerctl # Media key control
|
||||||
|
swayosd # On-screen display for volume/brightness
|
||||||
|
grim # Screenshot
|
||||||
|
slurp # Region selection
|
||||||
|
swappy # Screenshot editor
|
||||||
|
wdisplays # Display configurator
|
||||||
|
networkmanagerapplet # Tray network widget
|
||||||
|
blueman # Bluetooth manager
|
||||||
|
polkit_gnome # Polkit GUI agent
|
||||||
|
];
|
||||||
|
}
|
||||||
13
modules/system/firewall.nix
Normal file
13
modules/system/firewall.nix
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# ==========================================
|
||||||
|
# FIREWALL CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# UFW-style firewall — deny all inbound by default
|
||||||
|
networking.firewall = {
|
||||||
|
enable = true;
|
||||||
|
allowedTCPPorts = [ ];
|
||||||
|
allowedUDPPorts = [ ];
|
||||||
|
};
|
||||||
|
}
|
||||||
24
modules/system/fonts.nix
Normal file
24
modules/system/fonts.nix
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# ==========================================
|
||||||
|
# FONTS CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
# Omarchy default: JetBrainsMono Nerd Font
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
fonts.packages = with pkgs; [
|
||||||
|
nerd-fonts.jetbrains-mono
|
||||||
|
nerd-fonts.fira-code
|
||||||
|
nerd-fonts._0xproto
|
||||||
|
nerd-fonts.droid-sans-mono
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-emoji
|
||||||
|
];
|
||||||
|
|
||||||
|
fonts.fontconfig.defaultFonts = {
|
||||||
|
monospace = [ "JetBrainsMono Nerd Font" "FiraCode Nerd Font" ];
|
||||||
|
sansSerif = [ "Noto Sans" ];
|
||||||
|
serif = [ "Noto Serif" ];
|
||||||
|
emoji = [ "Noto Color Emoji" ];
|
||||||
|
};
|
||||||
|
}
|
||||||
34
modules/system/hardware.nix
Normal file
34
modules/system/hardware.nix
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# ==========================================
|
||||||
|
# HARDWARE & AUDIO CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
hardware.bluetooth.enable = true;
|
||||||
|
hardware.bluetooth.powerOnBoot = true;
|
||||||
|
|
||||||
|
services.printing.enable = true;
|
||||||
|
|
||||||
|
# Audio — PipeWire (replaces PulseAudio)
|
||||||
|
security.rtkit.enable = true;
|
||||||
|
services.pulseaudio.enable = false;
|
||||||
|
services.pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
alsa.support32Bit = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
wireplumber.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# GPU — uncomment the section for your hardware:
|
||||||
|
|
||||||
|
# --- NVIDIA ---
|
||||||
|
# hardware.nvidia.modesetting.enable = true;
|
||||||
|
# services.xserver.videoDrivers = [ "nvidia" ];
|
||||||
|
|
||||||
|
# --- AMD ---
|
||||||
|
# hardware.amdgpu.enable = true;
|
||||||
|
|
||||||
|
# --- Intel (12th Gen i7-12700H) ---
|
||||||
|
hardware.graphics.enable = true;
|
||||||
|
}
|
||||||
27
modules/system/network.nix
Normal file
27
modules/system/network.nix
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# ==========================================
|
||||||
|
# NETWORKING & TIME CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
|
||||||
|
# Disable wait-online to speed up boot
|
||||||
|
systemd.services.NetworkManager-wait-online.enable = false;
|
||||||
|
|
||||||
|
# Set your timezone
|
||||||
|
time.timeZone = "Europe/Riga";
|
||||||
|
|
||||||
|
i18n.defaultLocale = "en_US.UTF-8";
|
||||||
|
i18n.extraLocaleSettings = {
|
||||||
|
LC_ADDRESS = "lv_LV.UTF-8";
|
||||||
|
LC_IDENTIFICATION = "lv_LV.UTF-8";
|
||||||
|
LC_MEASUREMENT = "lv_LV.UTF-8";
|
||||||
|
LC_MONETARY = "lv_LV.UTF-8";
|
||||||
|
LC_NAME = "lv_LV.UTF-8";
|
||||||
|
LC_NUMERIC = "lv_LV.UTF-8";
|
||||||
|
LC_PAPER = "lv_LV.UTF-8";
|
||||||
|
LC_TELEPHONE = "lv_LV.UTF-8";
|
||||||
|
LC_TIME = "lv_LV.UTF-8";
|
||||||
|
};
|
||||||
|
}
|
||||||
23
modules/system/nix.nix
Normal file
23
modules/system/nix.nix
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# ==========================================
|
||||||
|
# NIX CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
nix.settings = {
|
||||||
|
experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
auto-optimise-store = true;
|
||||||
|
max-jobs = "auto";
|
||||||
|
cores = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
nix.gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
options = "--delete-older-than 7d";
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
|
||||||
|
system.stateVersion = "25.11";
|
||||||
|
}
|
||||||
32
modules/system/services.nix
Normal file
32
modules/system/services.nix
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# ==========================================
|
||||||
|
# SYSTEM SERVICES CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Zsh at system level (config lives in home-manager)
|
||||||
|
programs.zsh.enable = true;
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
virtualisation.docker = {
|
||||||
|
enable = true;
|
||||||
|
autoPrune = {
|
||||||
|
enable = true;
|
||||||
|
dates = "weekly";
|
||||||
|
flags = [ "--all" "--volumes" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# nix-ld — run unpatched binaries (Cursor, Codex, etc.)
|
||||||
|
programs.nix-ld.enable = true;
|
||||||
|
programs.nix-ld.libraries = with pkgs; [
|
||||||
|
stdenv.cc.cc
|
||||||
|
zlib
|
||||||
|
fuse3
|
||||||
|
icu
|
||||||
|
nss
|
||||||
|
openssl
|
||||||
|
curl
|
||||||
|
expat
|
||||||
|
];
|
||||||
|
}
|
||||||
21
modules/system/user.nix
Normal file
21
modules/system/user.nix
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# ==========================================
|
||||||
|
# USER CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
users.users.matiss = {
|
||||||
|
isNormalUser = true;
|
||||||
|
description = "Matiss";
|
||||||
|
extraGroups = [ "networkmanager" "wheel" "docker" "video" "render" "input" ];
|
||||||
|
shell = pkgs.zsh;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Core system packages (available to all users)
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
git
|
||||||
|
vim
|
||||||
|
wget
|
||||||
|
curl
|
||||||
|
];
|
||||||
|
}
|
||||||
14
modules/system/vpn.nix
Normal file
14
modules/system/vpn.nix
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# ==========================================
|
||||||
|
# VPN CONFIGURATION — Tailscale
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
services.tailscale = {
|
||||||
|
enable = true;
|
||||||
|
useRoutingFeatures = "client";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Loose rpfilter for Tailscale subnet routing
|
||||||
|
networking.firewall.checkReversePath = "loose";
|
||||||
|
}
|
||||||
30
modules/user/applications.nix
Normal file
30
modules/user/applications.nix
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# ==========================================
|
||||||
|
# APPLICATIONS CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, inputs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# XDG default applications
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"text/html" = "Alacritty.desktop";
|
||||||
|
"x-scheme-handler/http" = "Alacritty.desktop"; # Override with your browser .desktop
|
||||||
|
"x-scheme-handler/https" = "Alacritty.desktop";
|
||||||
|
"text/plain" = "nvim.desktop";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
EDITOR = "nvim";
|
||||||
|
VISUAL = "nvim";
|
||||||
|
BROWSER = "firefox"; # Placeholder — change to helium if installed
|
||||||
|
TERMINAL = "alacritty";
|
||||||
|
|
||||||
|
# Wayland-native rendering for Electron apps
|
||||||
|
NIXOS_OZONE_WL = "1";
|
||||||
|
|
||||||
|
# Fix Java Swing apps on Wayland
|
||||||
|
_JAVA_AWT_WM_NONREPARENTING = "1";
|
||||||
|
};
|
||||||
|
}
|
||||||
19
modules/user/dotfiles.nix
Normal file
19
modules/user/dotfiles.nix
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# ==========================================
|
||||||
|
# DOTFILES — Symlink config files
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Hyprland configuration
|
||||||
|
xdg.configFile."hypr/hyprland.conf".source = ../../config/hypr/hyprland.conf;
|
||||||
|
|
||||||
|
# Waybar
|
||||||
|
xdg.configFile."waybar/config.jsonc".source = ../../config/waybar/config.jsonc;
|
||||||
|
xdg.configFile."waybar/style.css".source = ../../config/waybar/style.css;
|
||||||
|
|
||||||
|
# Walker launcher
|
||||||
|
xdg.configFile."walker/config.toml".source = ../../config/walker/config.toml;
|
||||||
|
|
||||||
|
# Alacritty terminal
|
||||||
|
xdg.configFile."alacritty/alacritty.toml".source = ../../config/alacritty/alacritty.toml;
|
||||||
|
}
|
||||||
39
modules/user/git.nix
Normal file
39
modules/user/git.nix
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# ==========================================
|
||||||
|
# GIT CONFIGURATION
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
user = {
|
||||||
|
name = "Matiss"; # CHANGE ME
|
||||||
|
email = "your-email@users.noreply.github.com"; # CHANGE ME
|
||||||
|
};
|
||||||
|
|
||||||
|
# SSH for GitHub by default
|
||||||
|
url."git@github.com:".insteadOf = "https://github.com/";
|
||||||
|
|
||||||
|
init.defaultBranch = "main";
|
||||||
|
diff.algorithm = "histogram";
|
||||||
|
|
||||||
|
push = {
|
||||||
|
autoSetupRemote = true;
|
||||||
|
default = "current";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# SSH — GitHub key
|
||||||
|
programs.ssh = {
|
||||||
|
enable = true;
|
||||||
|
matchBlocks."github.com" = {
|
||||||
|
identityFile = "/home/matiss/.ssh/id_ed25519"; # CHANGE ME to your key path
|
||||||
|
identitiesOnly = true;
|
||||||
|
};
|
||||||
|
matchBlocks."*" = {
|
||||||
|
setEnv.TERM = "xterm-256color";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
131
modules/user/neovim.nix
Normal file
131
modules/user/neovim.nix
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
# ==========================================
|
||||||
|
# NEOVIM CONFIGURATION (via Nixvim)
|
||||||
|
# ==========================================
|
||||||
|
# Gruvbox theme, LSP, Treesitter, Telescope, file tree.
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.nixvim = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
opts = {
|
||||||
|
number = true;
|
||||||
|
relativenumber = true;
|
||||||
|
shiftwidth = 2;
|
||||||
|
tabstop = 2;
|
||||||
|
expandtab = true;
|
||||||
|
smartindent = true;
|
||||||
|
wrap = false;
|
||||||
|
swapfile = false;
|
||||||
|
backup = false;
|
||||||
|
undofile = true;
|
||||||
|
hlsearch = false;
|
||||||
|
incsearch = true;
|
||||||
|
termguicolors = true;
|
||||||
|
scrolloff = 8;
|
||||||
|
signcolumn = "yes";
|
||||||
|
updatetime = 50;
|
||||||
|
clipboard = "unnamedplus";
|
||||||
|
};
|
||||||
|
|
||||||
|
globals = {
|
||||||
|
mapleader = " ";
|
||||||
|
maplocalleader = " ";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Gruvbox colorscheme — matches omarchy aesthetic
|
||||||
|
colorschemes.gruvbox = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
contrast_dark = "hard";
|
||||||
|
transparent_mode = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Treesitter (syntax highlighting)
|
||||||
|
plugins.treesitter = {
|
||||||
|
enable = true;
|
||||||
|
settings.highlight.enable = true;
|
||||||
|
settings.indent.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Telescope (fuzzy finder)
|
||||||
|
plugins.telescope = {
|
||||||
|
enable = true;
|
||||||
|
keymaps = {
|
||||||
|
"<leader>ff" = { action = "find_files"; options.desc = "Find files"; };
|
||||||
|
"<leader>fg" = { action = "live_grep"; options.desc = "Live grep"; };
|
||||||
|
"<leader>fb" = { action = "buffers"; options.desc = "Buffers"; };
|
||||||
|
"<leader>fh" = { action = "help_tags"; options.desc = "Help tags"; };
|
||||||
|
"<leader>fr" = { action = "oldfiles"; options.desc = "Recent files"; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Neo-tree (file tree)
|
||||||
|
plugins.neo-tree = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# LSP
|
||||||
|
plugins.lsp = {
|
||||||
|
enable = true;
|
||||||
|
servers = {
|
||||||
|
nil_ls.enable = true; # Nix
|
||||||
|
pyright.enable = true; # Python
|
||||||
|
ts_ls.enable = true; # TypeScript/JavaScript
|
||||||
|
bashls.enable = true; # Bash
|
||||||
|
jsonls.enable = true; # JSON
|
||||||
|
yamlls.enable = true; # YAML
|
||||||
|
html.enable = true; # HTML
|
||||||
|
cssls.enable = true; # CSS
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Autocompletion
|
||||||
|
plugins.cmp = {
|
||||||
|
enable = true;
|
||||||
|
autoEnableSources = true;
|
||||||
|
settings = {
|
||||||
|
sources = [
|
||||||
|
{ name = "nvim_lsp"; }
|
||||||
|
{ name = "path"; }
|
||||||
|
{ name = "buffer"; }
|
||||||
|
];
|
||||||
|
mapping = {
|
||||||
|
"<C-n>" = "cmp.mapping.select_next_item()";
|
||||||
|
"<C-p>" = "cmp.mapping.select_prev_item()";
|
||||||
|
"<C-y>" = "cmp.mapping.confirm({ select = true })";
|
||||||
|
"<C-Space>" = "cmp.mapping.complete()";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Status line
|
||||||
|
plugins.lualine = {
|
||||||
|
enable = true;
|
||||||
|
settings.options.theme = "gruvbox";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Autopairs
|
||||||
|
plugins.nvim-autopairs.enable = true;
|
||||||
|
|
||||||
|
# Git signs in the gutter
|
||||||
|
plugins.gitsigns.enable = true;
|
||||||
|
|
||||||
|
# Which-key (show keybindings)
|
||||||
|
plugins.which-key.enable = true;
|
||||||
|
|
||||||
|
# Keymaps
|
||||||
|
keymaps = [
|
||||||
|
{ key = "<leader>e"; action = "<cmd>Neotree toggle<CR>"; options.desc = "Toggle file tree"; }
|
||||||
|
{ key = "<leader>w"; action = "<cmd>w<CR>"; options.desc = "Save"; }
|
||||||
|
{ key = "<leader>q"; action = "<cmd>q<CR>"; options.desc = "Quit"; }
|
||||||
|
# Window navigation
|
||||||
|
{ key = "<C-h>"; action = "<C-w>h"; options.desc = "Move left"; }
|
||||||
|
{ key = "<C-j>"; action = "<C-w>j"; options.desc = "Move down"; }
|
||||||
|
{ key = "<C-k>"; action = "<C-w>k"; options.desc = "Move up"; }
|
||||||
|
{ key = "<C-l>"; action = "<C-w>l"; options.desc = "Move right"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
90
modules/user/packages.nix
Normal file
90
modules/user/packages.nix
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# ==========================================
|
||||||
|
# PACKAGES — User Applications
|
||||||
|
# ==========================================
|
||||||
|
# Spec: Codex, Claude Code, Gemini CLI, Helium, Cursor,
|
||||||
|
# Antigravity, Lazydocker, Git, Gh, Alacritty,
|
||||||
|
# Zoxide, Fzf, Bat, Eza, Fd, Impala, Bun, Nodejs,
|
||||||
|
# Docker, Bitwarden, Beeper, Python, Spotify, Tailscale
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, inputs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# ── AI Coding Tools ──────────────────────────────────
|
||||||
|
unstable.claude-code # Claude Code CLI
|
||||||
|
unstable.antigravity # Antigravity IDE
|
||||||
|
# codex: install via `npm i -g @openai/codex` (not in nixpkgs)
|
||||||
|
# gemini-cli: install via `npm i -g @google/gemini-cli` (not in nixpkgs)
|
||||||
|
|
||||||
|
# ── Terminals & Editors ──────────────────────────────
|
||||||
|
alacritty # GPU-accelerated terminal
|
||||||
|
code-cursor # Cursor IDE
|
||||||
|
|
||||||
|
# ── Browsers ─────────────────────────────────────────
|
||||||
|
# Helium: add inputs.helium-browser flake package here
|
||||||
|
# if the flake builds for your system, uncomment:
|
||||||
|
# inputs.helium-browser.packages.${pkgs.stdenv.hostPlatform.system}.default
|
||||||
|
|
||||||
|
# ── CLI Essentials (omarchy-style) ───────────────────
|
||||||
|
bat # cat with syntax highlighting
|
||||||
|
eza # modern ls
|
||||||
|
fd # modern find
|
||||||
|
fzf # fuzzy finder
|
||||||
|
zoxide # smart cd
|
||||||
|
ripgrep # fast grep
|
||||||
|
lazydocker # Docker TUI
|
||||||
|
impala # TUI WiFi manager
|
||||||
|
yazi # TUI file manager
|
||||||
|
btop # system monitor
|
||||||
|
fastfetch # system info
|
||||||
|
tealdeer # tldr man pages
|
||||||
|
|
||||||
|
# ── Version Control ──────────────────────────────────
|
||||||
|
git
|
||||||
|
gh # GitHub CLI
|
||||||
|
lazygit # Git TUI
|
||||||
|
|
||||||
|
# ── Development Runtimes ─────────────────────────────
|
||||||
|
nodejs
|
||||||
|
bun
|
||||||
|
python3
|
||||||
|
uv # fast Python package manager
|
||||||
|
|
||||||
|
# ── Containers ───────────────────────────────────────
|
||||||
|
docker-compose
|
||||||
|
|
||||||
|
# ── Desktop Apps ─────────────────────────────────────
|
||||||
|
bitwarden # password manager
|
||||||
|
beeper # unified messaging
|
||||||
|
spotify # music
|
||||||
|
|
||||||
|
# ── System Utilities ─────────────────────────────────
|
||||||
|
wget
|
||||||
|
curl
|
||||||
|
unzip
|
||||||
|
wl-clipboard
|
||||||
|
cliphist
|
||||||
|
wl-clip-persist
|
||||||
|
|
||||||
|
# ── Theming Dependencies ─────────────────────────────
|
||||||
|
gnome-themes-extra
|
||||||
|
adwaita-qt
|
||||||
|
adwaita-qt6
|
||||||
|
dconf
|
||||||
|
];
|
||||||
|
|
||||||
|
# ── Post-activation: Install npm-only tools ────────────
|
||||||
|
# Codex and Gemini CLI aren't in nixpkgs; install them
|
||||||
|
# globally via npm after first `nixos-rebuild switch`.
|
||||||
|
home.activation.installNpmTools = config.lib.dag.entryAfter [ "writeBoundary" ] ''
|
||||||
|
export PATH="${pkgs.nodejs}/bin:$PATH"
|
||||||
|
if ! command -v codex &> /dev/null; then
|
||||||
|
echo "Installing @openai/codex via npm..."
|
||||||
|
${pkgs.nodejs}/bin/npm i -g @openai/codex 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
if ! command -v gemini &> /dev/null; then
|
||||||
|
echo "Installing @google/gemini-cli via npm..."
|
||||||
|
${pkgs.nodejs}/bin/npm i -g @google/gemini-cli 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
}
|
||||||
80
modules/user/shell.nix
Normal file
80
modules/user/shell.nix
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# ==========================================
|
||||||
|
# SHELL CONFIGURATION (Zsh)
|
||||||
|
# ==========================================
|
||||||
|
# Omarchy-style: Oh-My-Zsh + modern CLI replacements
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Atuin — searchable shell history
|
||||||
|
programs.atuin = {
|
||||||
|
enable = true;
|
||||||
|
enableZshIntegration = true;
|
||||||
|
settings = {
|
||||||
|
auto_sync = false;
|
||||||
|
search_mode = "fuzzy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Zsh
|
||||||
|
programs.zsh = {
|
||||||
|
enable = true;
|
||||||
|
enableCompletion = true;
|
||||||
|
autosuggestion.enable = true;
|
||||||
|
syntaxHighlighting.enable = true;
|
||||||
|
|
||||||
|
shellAliases = {
|
||||||
|
# Rebuild shortcuts
|
||||||
|
upd = "cd ~/nixos-config && sudo nixos-rebuild switch --flake . && echo 'Done!'";
|
||||||
|
upd-test = "cd ~/nixos-config && sudo nixos-rebuild test --flake .";
|
||||||
|
upd-build = "cd ~/nixos-config && nixos-rebuild dry-build --flake .";
|
||||||
|
|
||||||
|
# Modern replacements
|
||||||
|
ls = "eza --icons";
|
||||||
|
ll = "eza -la --icons";
|
||||||
|
lt = "eza -la --icons --tree --level=2";
|
||||||
|
cat = "bat --style=plain";
|
||||||
|
find = "fd";
|
||||||
|
|
||||||
|
# Clipboard (Wayland)
|
||||||
|
pbcopy = "wl-copy";
|
||||||
|
pbpaste = "wl-paste";
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
lzd = "lazydocker";
|
||||||
|
|
||||||
|
# Git
|
||||||
|
lg = "lazygit";
|
||||||
|
};
|
||||||
|
|
||||||
|
oh-my-zsh = {
|
||||||
|
enable = true;
|
||||||
|
theme = "gnzh";
|
||||||
|
plugins = [
|
||||||
|
"git"
|
||||||
|
"docker"
|
||||||
|
"docker-compose"
|
||||||
|
"eza"
|
||||||
|
"zoxide"
|
||||||
|
"colored-man-pages"
|
||||||
|
"fzf"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
initContent = ''
|
||||||
|
# Force Atuin up-arrow binding
|
||||||
|
bindkey '^[[A' atuin-up-search
|
||||||
|
bindkey '^[OA' atuin-up-search
|
||||||
|
|
||||||
|
# Yazi wrapper — cd on exit
|
||||||
|
function y() {
|
||||||
|
local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd
|
||||||
|
yazi "$@" --cwd-file="$tmp"
|
||||||
|
if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
|
||||||
|
builtin cd -- "$cwd"
|
||||||
|
fi
|
||||||
|
rm -f -- "$tmp"
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
34
modules/user/theming.nix
Normal file
34
modules/user/theming.nix
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# ==========================================
|
||||||
|
# THEMING CONFIGURATION — Gruvbox Dark
|
||||||
|
# ==========================================
|
||||||
|
# Omarchy philosophy: one theme, consistently applied
|
||||||
|
# across all applications and UI components.
|
||||||
|
# ==========================================
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# GTK Dark Mode
|
||||||
|
gtk = {
|
||||||
|
enable = true;
|
||||||
|
theme = {
|
||||||
|
name = "Adwaita-dark";
|
||||||
|
package = pkgs.gnome-themes-extra;
|
||||||
|
};
|
||||||
|
gtk3.extraConfig.gtk-application-prefer-dark-theme = 1;
|
||||||
|
gtk4.extraConfig.gtk-application-prefer-dark-theme = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Qt Dark Mode
|
||||||
|
qt = {
|
||||||
|
enable = true;
|
||||||
|
platformTheme.name = "adwaita";
|
||||||
|
style.name = "adwaita-dark";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Dark mode preference for GNOME/GTK apps
|
||||||
|
dconf.settings = {
|
||||||
|
"org/gnome/desktop/interface" = {
|
||||||
|
color-scheme = "prefer-dark";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user