Un-ignore mako/config and bring it under dotfiles so the gamemode
do-not-disturb mode syncs across machines. [mode=do-not-disturb]
invisible=1 suppresses popups while retaining notification history.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Hybrid trigger (Feral gamemode hooks + Mod+G toggle), reference-counted
so overlapping sources apply once and revert once. Also removes three
dead VRR window-rules (panel has no VRR support).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Big Picture reuses the existing client window (title change only), so the
open-fullscreen rule never fires on toggle; unused, removing it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add window rules for the Steam client (app-id "steam"): all client
windows float and center, the main library window opens large (75x85%),
and notification toasts sit unobtrusively in the bottom-right without
border or focus-ring. Launched games (steam_app_) are unaffected.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds the hypridle entry to ARCHITECTURE, and folds in the pending
swww->awww wallpaper-tool rename in ARCHITECTURE + README (the repo spawns
awww-daemon, not swww).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drops 'tray' from modules-right and its config block. Network and
bluetooth status remain as their own dedicated modules.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
hypridle pairs with hyprlock, honors idle inhibitors (video/calls no
longer blank or lock the screen), and is config-file driven. Same staging
as before: blank monitors @5m, lock @10m, suspend-then-hibernate @30m.
Locks via 'loginctl lock-session' so the before-sleep lock is deduplicated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Theme centralization:
- theme/colors.json is now the single source of truth for the palette.
- New theme/generate-theme.py renders, at install time, the three derived
artifacts into ~/.config: colors.css (waybar/wofi @import), mako config,
and hyprlock-colors.conf (hyprlang $tn_* variables).
- theme/colors.css removed from the repo (now generated); install.sh calls
the generator instead of the old inline mako snippet.
- hyprlock.conf sources the generated color file and uses $tn_* variables
instead of hardcoded rgba() values.
- Generator covered by theme/test_generate_theme.py.
Bluetooth:
- Added waybar built-in bluetooth module (config.jsonc + style.css), with
bluez/bluez-utils in packages.txt.
Includes design spec and implementation plan under docs/superpowers/.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds /etc/pam.d/greetd to the TARGETS array so re-running
enable-fingerprint.sh extends fprintd auth to the regreet login
screen. Cold-boot timing and silent-touch UX caveats documented
in the spec are accepted as-is — fingerprint failure falls back to
password, no risk of lockout.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hyprlock doesn't poll fprintd by default — pam_authenticate() is
only invoked on password submission. Adding the auth.fingerprint
block tells hyprlock to launch fprintd polling in parallel with the
password input, so touching the reader unlocks immediately without
typing first.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Final-review caveats:
- ARCHITECTURE.md hyprlock section was a generic one-liner inherited
from gtklock; now mentions fprintd integration + GPU + blur.
- hyprlock label blocks didn't set font_family; clock/date now
pinned to JetBrains Mono Nerd Font (same as rest of desktop).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace all gtklock mentions in README, ARCHITECTURE, CLAUDE.md with
hyprlock, and drop the stale gtklock consumer note from theme/colors.css
header comment (hyprlock uses Hyprlang, not CSS imports).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds hyprlock/hyprlock.conf with Tomorrow Night colors, replaces gtklock
with hyprlock in packages.txt, and updates install.sh to symlink
hyprlock.conf into ~/.config/hypr/ instead of the old gtklock symlinks.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Discovered while re-adding network-manager-applet that the
networkmanager daemon was already installed locally but never tracked
in packages.txt. Track it now so a fresh install gets both the daemon
and the applet, making the README's NetworkManager activation step
work end-to-end.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
snixembed registered as the StatusNotifierWatcher but its
RegisterStatusNotifierItem implementation didn't accept SNI publishers
— Telegram, Vesktop, blueman-tray, and a libayatana-appindicator test
script all failed to register, leaving waybar's tray empty.
Removing snixembed lets waybar's tray module register itself as both
host AND watcher (when no other watcher exists). After this change,
all three SNI items registered immediately.
Trade-off: legacy XEmbed-based Wine tray icons no longer bridge to
SNI. The Wine System Tray host window rule is kept (still hides the
empty window off-screen) and the comment updated.
- niri/config.kdl: drop snixembed spawn-at-startup; update Wine rule
- packages.txt: drop snixembed (no longer used)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The niri 'environment' block only affects processes niri spawns
directly. Apps launched via dbus activation or systemd-user (most
.desktop launches go through one of these) get systemd-user's env,
which still has bare 'niri' — set by niri-session BEFORE niri itself
runs.
Adding a one-shot spawn-at-startup that re-imports XDG_CURRENT_DESKTOP
from niri's env into both systemd-user and dbus-activation, after
niri starts. Future dbus-activated apps will see niri:GNOME.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Many tray libraries (Electron's, Qt's StatusNotifier) gate icon
creation on a recognised XDG_CURRENT_DESKTOP value. Bare "niri"
makes them silently skip tray creation. Adding ":GNOME" as a
fallback identifier keeps niri primary while letting apps create
their tray icons.
Vesktop and Telegram are confirmed to want tray icons but were
not creating them; this fix unblocks both.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Both daemons were running but not registering SNI items on niri/Wayland,
leaving the waybar tray slot permanently empty. Network is already
accessible via the waybar network module (left-click → networkmanager_dmenu).
Bluetooth GUI (blueman-manager) is still available on demand; only the
applet is dropped.
Tray module stays configured so Electron apps (Discord/Vesktop, Steam,
etc.) still get a tray slot when they're running.
- niri/config.kdl: drop nm-applet and blueman-applet spawn-at-startup
- packages.txt: drop network-manager-applet (nothing else uses it);
keep blueman package for blueman-manager GUI
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aligns the third sleep path (power menu) with the lid handler and
the swayidle 30-min timer — all three now suspend immediately and
hibernate after HibernateDelaySec (30 min).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Spec said `findmnt -no UUID /` and `resume=UUID=` but the script
correctly uses PARTUUID throughout (matches the system's existing
root=PARTUUID= convention).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>