Add Omarchy-style Hyprland desktop for straylight

Ports the classic dotfiles Omarchy setup to a no-home-manager NixOS
system module (configs/omarchy.nix), scoped to straylight only so the
other desktop hosts keep i3.

- Hyprland (programs.hyprland) becomes the default lightdm session; i3
  stays enabled and selectable as a fallback.
- Omarchy config layout under ~/.config/{hypr,waybar,rofi,wlogout,
  swayosd,alacritty} symlinked from the store; mutable theme/wallpaper
  state in ~/.config/omarchy/current.
- omarchy-dots generates 8 themes (hyprland/hyprlock/waybar/rofi/
  swayosd/wlogout/alacritty/mako colour files) from each theme's
  palette, with wallpapers fetched from the Omarchy v3.8.4 tag.
- Helper scripts: omarchy-theme-set/bg-next/bg-set/apply, omarchy-menu
  (rofi power/theme/background menus), waybar toggle, screenshot, lock.
- Shared desktop modules (desktop.nix / desktop-light.nix) untouched.
This commit is contained in:
2026-10-14 01:18:23 -07:00
parent 93a052eab1
commit 3e564d57db
31 changed files with 1316 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
# Autostart for the Hyprland session (Omarchy v3 autostart, adapted:
# no uwsm, no omarchy-* first-run/hook machinery).
exec-once = hypridle
exec-once = mako
exec-once = swayosd-server
exec-once = clipse -listen
exec-once = swaybg -i ~/.config/omarchy/current/background -m fill
# Waybar honours `omarchy-toggle-waybar` (toggles hyprland layer autostart off)
exec-once = sh -c 'omarchy-waybar-enabled && waybar'
# Slow app launch fix -- set systemd vars
exec-once = dbus-update-activation-environment --systemd --all
+116
View File
@@ -0,0 +1,116 @@
# Keybindings — ported from Omarchy v3 (bindings/tiling-v2, utilities and
# application bindings), with omarchy-* helpers replaced by the small set of
# scripts shipped in ~/.local/share/omarchy/bin. Launcher is rofi (Omarchy
# v3 shipped walker; rofi-wayland is used here per request).
# ---- Applications ----
bindd = SUPER, RETURN, Terminal, exec, alacritty
bindd = SUPER ALT, RETURN, Tmux, exec, alacritty -e tmux new -A -s Work
bindd = SUPER SHIFT, RETURN, Browser, exec, ungoogled-chromium
bindd = SUPER SHIFT, F, File manager, exec, nautilus --new-window
bindd = SUPER, SPACE, Launch apps, exec, rofi -show drun -show-icons
bindd = SUPER CTRL, E, Emoji picker, exec, rofi -show emoji
bindd = SUPER CTRL, C, Capture menu, exec, omarchy-menu capture
bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu
bindd = SUPER, K, Show key bindings, exec, omarchy-menu keybindings
bindd = , XF86Calculator, Calculator, exec, gnome-calculator
# ---- Close / control windows ----
bindd = SUPER, W, Close window, killactive,
bindd = SUPER, BACKSPACE, Close window, killactive,
bindd = SUPER, J, Toggle window split, layoutmsg, togglesplit
bindd = SUPER, P, Pseudo window, pseudo,
bindd = SUPER, T, Toggle floating/tiling, togglefloating,
bindd = SUPER, F, Full screen, fullscreen, 0
bindd = SUPER ALT, F, Full width, fullscreen, 1
bindd = SUPER, Q, Toggle window transparency, exec, hyprctl setprop active opaque toggle
# ---- Focus ----
bindd = SUPER, LEFT, Focus left, movefocus, l
bindd = SUPER, RIGHT, Focus right, movefocus, r
bindd = SUPER, UP, Focus up, movefocus, u
bindd = SUPER, DOWN, Focus down, movefocus, d
bindd = ALT, TAB, Focus next window, cyclenext
bindd = ALT SHIFT, TAB, Focus previous window, cyclenext, prev
# ---- Swap / move windows ----
bindd = SUPER SHIFT, LEFT, Swap window left, swapwindow, l
bindd = SUPER SHIFT, RIGHT, Swap window right, swapwindow, r
bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u
bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d
# ---- Workspaces ----
bindd = SUPER, code:10, Workspace 1, workspace, 1
bindd = SUPER, code:11, Workspace 2, workspace, 2
bindd = SUPER, code:12, Workspace 3, workspace, 3
bindd = SUPER, code:13, Workspace 4, workspace, 4
bindd = SUPER, code:14, Workspace 5, workspace, 5
bindd = SUPER, code:15, Workspace 6, workspace, 6
bindd = SUPER, code:16, Workspace 7, workspace, 7
bindd = SUPER, code:17, Workspace 8, workspace, 8
bindd = SUPER, code:18, Workspace 9, workspace, 9
bindd = SUPER, code:19, Workspace 10, workspace, 10
bindd = SUPER SHIFT, code:10, Move window to workspace 1, movetoworkspace, 1
bindd = SUPER SHIFT, code:11, Move window to workspace 2, movetoworkspace, 2
bindd = SUPER SHIFT, code:12, Move window to workspace 3, movetoworkspace, 3
bindd = SUPER SHIFT, code:13, Move window to workspace 4, movetoworkspace, 4
bindd = SUPER SHIFT, code:14, Move window to workspace 5, movetoworkspace, 5
bindd = SUPER SHIFT, code:15, Move window to workspace 6, movetoworkspace, 6
bindd = SUPER SHIFT, code:16, Move window to workspace 7, movetoworkspace, 7
bindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8
bindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9
bindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10
bindd = SUPER, TAB, Next workspace, workspace, e+1
bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1
bindd = SUPER CTRL, TAB, Former workspace, workspace, previous
bindd = SUPER, mouse_down, Next workspace, workspace, e+1
bindd = SUPER, mouse_up, Previous workspace, workspace, e-1
# ---- Scratchpad ----
bindd = SUPER, S, Toggle scratchpad, togglespecialworkspace, scratchpad
bindd = SUPER ALT, S, Move window to scratchpad, movetoworkspacesilent, special:scratchpad
# ---- Resize ----
bindd = SUPER, code:20, Shrink window width, resizeactive, -100 0
bindd = SUPER, code:21, Expand window width, resizeactive, 100 0
bindd = SUPER SHIFT, code:20, Shrink window height, resizeactive, 0 -100
bindd = SUPER SHIFT, code:21, Expand window height, resizeactive, 0 100
bindmd = SUPER, mouse:272, Move window, movewindow
bindmd = SUPER, mouse:273, Resize window, resizewindow
# ---- Aesthetics ----
bindd = SUPER SHIFT, SPACE, Toggle top bar, exec, omarchy-toggle-waybar
bindd = SUPER CTRL, SPACE, Next background, exec, omarchy-theme-bg-next
bindd = SUPER SHIFT CTRL, SPACE, Theme menu, exec, omarchy-menu theme
# ---- Screenshots / capture ----
bindd = , PRINT, Screenshot region, exec, omarchy-capture-screenshot region
bindd = SHIFT, PRINT, Screenshot window, exec, omarchy-capture-screenshot window
bindd = CTRL, PRINT, Screenshot output, exec, omarchy-capture-screenshot output
bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a
# ---- Clipboard ----
bindd = SUPER CTRL, V, Clipboard history, exec, clipse
# ---- Multimedia / brightness ----
bindl = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindl = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindl = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindl = , XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindl = , XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
bindl = , XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPrev, exec, playerctl previous
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPause, exec, playerctl play-pause
# ---- Session / power ----
bindd = SUPER CTRL, L, Lock system, exec, omarchy-system-lock
bindd = SUPER, ESCAPE, Power menu, exec, omarchy-menu system
bindld = , XF86PowerOff, Power menu, exec, omarchy-menu system
bindd = SUPER SHIFT, ESCAPE, Log out, exit,
bindd = SUPER CTRL, ESCAPE, Reboot, exec, systemctl reboot
bindd = SUPER SHIFT CTRL, ESCAPE, Shut down, exec, systemctl poweroff
+27
View File
@@ -0,0 +1,27 @@
# Environment for Hyprland sessions (Omarchy v3 default/hypr/envs.conf).
# GUM env source dropped (not installed); XCOMPOSEFILE dropped (no ~/.XCompose).
# Cursor size
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
# Force all apps to use Wayland
env = GDK_BACKEND,wayland,x11,*
env = QT_QPA_PLATFORM,wayland;xcb
env = MOZ_ENABLE_WAYLAND,1
env = ELECTRON_OZONE_PLATFORM_HINT,wayland
env = OZONE_PLATFORM,wayland
env = XDG_SESSION_TYPE,wayland
# Allow better support for screen sharing (Google Meet, Discord, etc)
env = XDG_CURRENT_DESKTOP,Hyprland
env = XDG_SESSION_DESKTOP,Hyprland
xwayland {
force_zero_scaling = true
}
# Don't show update on first launch
ecosystem {
no_update_news = true
}
+18
View File
@@ -0,0 +1,18 @@
# hypridle — adapted from Omarchy v3. Locks at 5 min, screen off at ~5.5 min.
general {
lock_cmd = hyprlock
before_sleep_cmd = loginctl lock-session
after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on
inhibit_sleep = 3
}
listener {
timeout = 300
on-timeout = loginctl lock-session
}
listener {
timeout = 330
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on && brightnessctl -r
}
+15
View File
@@ -0,0 +1,15 @@
# Omarchy-style Hyprland configuration (ported to NixOS for straylight).
# Mirrors Omarchy v3 ~/.config/hypr/hyprland.conf: a set of sourced
# fragments plus the active theme's colour overrides.
source = ~/.config/hypr/envs.conf
source = ~/.config/hypr/looknfeel.conf
source = ~/.config/hypr/input.conf
source = ~/.config/hypr/windows.conf
source = ~/.config/hypr/autostart.conf
source = ~/.config/hypr/monitors.conf
source = ~/.config/hypr/bindings.conf
# Active Omarchy theme. Sourced last so its border colours win over the
# defaults in looknfeel.conf. Managed by omarchy-theme-set.
source = ~/.config/omarchy/current/theme/hyprland.conf
+44
View File
@@ -0,0 +1,44 @@
# hyprlock — Omarchy v3 config/hypr/hyprlock.conf.
source = ~/.config/omarchy/current/theme/hyprlock.conf
general {
ignore_empty_input = true
}
background {
monitor =
color = $color
path = ~/.config/omarchy/current/background
blur_passes = 3
}
animations {
enabled = false
}
input-field {
monitor =
size = 650, 100
position = 0, 0
halign = center
valign = center
inner_color = $inner_color
outer_color = $outer_color
outline_thickness = 4
font_family = JetBrainsMono Nerd Font
font_color = $font_color
placeholder_text = Enter Password
check_color = $check_color
fail_text = <i>$FAIL ($ATTEMPTS)</i>
rounding = 0
shadow_passes = 0
fade_on_empty = false
}
auth {
fingerprint:enabled = false
}
+28
View File
@@ -0,0 +1,28 @@
# Input devices. kb_options matches Kyle's existing i3 xkb settings
# (ctrl:swapcaps + right-alt compose) so muscle memory carries over.
input {
kb_layout = us
kb_options = ctrl:swapcaps,compose:ralt
repeat_rate = 40
repeat_delay = 250
numlock_by_default = true
follow_mouse = 1
sensitivity = 0
touchpad {
clickfinger_behavior = true
scroll_factor = 0.4
natural_scroll = false
}
}
# Scroll nicely in the terminal
windowrule = match:class (Alacritty|kitty|foot|com.mitchellh.ghostty), scroll_touchpad 1.5
gestures {
workspace_swipe = false
}
+131
View File
@@ -0,0 +1,131 @@
# Omarchy v3 default/hypr/looknfeel.conf.
# Default border colours here are overridden by the active theme's
# hyprland.conf (sourced last from hyprland.conf).
# Variables
$activeBorderColor = rgba(33ccffee) rgba(00ff99ee) 45deg
$inactiveBorderColor = rgba(595959aa)
general {
gaps_in = 5
gaps_out = 10
border_size = 2
col.active_border = $activeBorderColor
col.inactive_border = $inactiveBorderColor
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
decoration {
rounding = 0
shadow {
enabled = true
range = 2
render_power = 3
color = rgba(1a1a1aee)
}
blur {
enabled = true
size = 2
passes = 2
special = true
brightness = 0.60
contrast = 0.75
}
}
group {
col.border_active = $activeBorderColor
col.border_inactive = $inactiveBorderColor
col.border_locked_active = $activeBorderColor
col.border_locked_inactive = $inactiveBorderColor
groupbar {
font_size = 12
font_family = monospace
font_weight_active = ultraheavy
font_weight_inactive = normal
indicator_height = 0
indicator_gap = 5
height = 22
gaps_in = 5
gaps_out = 0
text_color = rgb(ffffff)
text_color_inactive = rgba(ffffff90)
col.active = rgba(00000040)
col.inactive = rgba(00000020)
gradients = true
gradient_rounding = 0
gradient_round_only_edges = false
}
}
animations {
enabled = yes, please :)
bezier = easeOutQuint,0.23,1,0.32,1
bezier = easeInOutCubic,0.65,0.05,0.36,1
bezier = linear,0,0,1,1
bezier = almostLinear,0.5,0.5,0.75,1.0
bezier = quick,0.15,0,0.1,1
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
animation = windows, 1, 3.79, easeOutQuint
animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1.49, linear, popin 87%
animation = fadeIn, 1, 1.73, almostLinear
animation = fadeOut, 1, 1.46, almostLinear
animation = fade, 1, 3.03, quick
animation = layers, 1, 3.81, easeOutQuint
animation = layersIn, 1, 4, easeOutQuint, fade
animation = layersOut, 1, 1.5, linear, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 0, 0, ease
animation = specialWorkspace, 1, 3, easeOutQuint, slidevert
}
dwindle {
preserve_split = true
force_split = 2
}
scrolling {
column_width = 0.49
}
master {
new_status = master
}
misc {
disable_hyprland_logo = true
disable_splash_rendering = true
disable_scale_notification = true
focus_on_activate = true
anr_missed_pings = 3
on_focus_under_fullscreen = 1
}
cursor {
hide_on_key_press = true
warp_on_change_workspace = 1
}
binds {
hide_special_on_workspace_change = true
}
+10
View File
@@ -0,0 +1,10 @@
# Monitors. Edit with `hyprctl monitors` for current names/resolutions.
# Format: monitor = [port], resolution, position, scale
# Safe default: preferred resolution, auto position, no forced scale.
monitor = , preferred, auto, auto
# Examples (uncomment / adjust as needed):
# monitor = DP-1, 3840x2160@60, auto, 1.5
# monitor = eDP-1, preferred, auto, 1, transform, 1
# monitor = HDMI-A-1, disable
+26
View File
@@ -0,0 +1,26 @@
# Window / layer rules. Omarchy v3 default/hypr/windows.conf with the
# app-specific apps.conf inlined (no separate apps.conf here).
windowrule = suppress_event maximize, match:class .*
# Tag all windows for default opacity (apps can override by clearing the tag)
windowrule = tag +default-opacity, match:class .*
# Float common utility windows
windowrule = float, match:class ^(org.pulseaudio.pavucontrol|blueberry.py|nm-connection-editor|blueman-manager)$
windowrule = float, match:class ^(org.gnome.Calculator|gnome-calculator)$
# Fix some dragging issues with XWayland
windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0
# clipse clipboard manager floats in the middle
windowrule = float, match:class (clipse)
windowrule = size 622 652, match:class (clipse)
windowrule = stay_focused, match:class (clipse)
# Apply default opacity after apps have had a chance to opt out
windowrule = opacity 0.97 0.9, match:tag default-opacity
# Proper background blur for rofi + waybar
layerrule = blur, rofi
layerrule = blur, waybar