- Vertical bar on DP-2 with rounded-square pills throughout - Per-monitor workspace groups sorted by screen x position, with Nerd Font icons for named workspaces and apex-neon red active indicator - Bar layout: datetime+weather top, workspaces centered, gamemode+media+notif+system bottom - Popouts anchor to triggering icon (top-right for datetime/weather, bottom-right for media/notif/system) - Lock command switched from hyprlock to swaylock - Hyprland blur/ignore_alpha layerrules for quickshell namespace Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4.1 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
What This Is
A Quickshell (v0.2.x) desktop shell configuration for Hyprland on Arch Linux. It renders a vertical bar on the right edge of the screen with popout panels. Written entirely in QML using Quickshell's extended Qt Quick modules.
Running / Reloading
quickshell # launch (reads shell.qml from ~/.config/quickshell/)
quickshell -c /path/to/dir # launch from a different config dir
Quickshell hot-reloads on file save — no restart needed during development. If the shell crashes or gets stuck, killall quickshell && quickshell & to restart.
Architecture
Entry Point
shell.qml — ShellRoot that instantiates three top-level components:
NotificationDaemon— D-Bus notification serverBar— the main bar + popout overlayOsd— volume/mic OSD overlay
Bar (Bar.qml)
Uses Variants over Quickshell.screens to create per-monitor PanelWindow instances (filtered to Config.monitor). Two window layers:
- Bar window — fixed-width right-anchored panel with pill-shaped widgets
- Popout window — transparent overlay with animated
PopoutSlotcomponents that appear left of the bar
Bar pills (notification, workspaces, weather, datetime, system) toggle popouts via the PopoutState singleton.
Shared Singletons (shared/)
All four are pragma Singleton:
- Config — user settings (monitor=DP-2, weatherLocation=Nospelt, power commands, disk mounts, formats);
.tmplfile driven by chezmoi data - Theme — Apex-neon/aeon colors (replaces Catppuccin), layout constants, typography (GeistMono Nerd Font), animation durations
- PopoutState — which popout is active (
activestring +triggerY), withtoggle()/close() - Time —
SystemClock-backed formatted time strings - Weather — fetches from
wttr.in, parses JSON, exposes current + forecast data
Popout Pattern
Each popout follows the same structure:
- A
BarPillin the bar column (togglesPopoutState) - A
PopoutSlotinBar.qml(handles animation — fade, scale, slide) - A popout component in
bar/popouts/wrapped inPopoutBackground(rounded left, flush right)
Data Fetching
SystemPopout polls system stats via Process + StdioCollector:
- CPU, memory, temperature, GPU (via
scripts/gpu.sh), disk, network, updates - Different refresh intervals: 5s (CPU/mem/temp/GPU), 30s (disk/net), 5min (updates)
Weather uses curl wttr.in with a 30-minute refresh timer.
Quickshell-Specific Patterns
Variants { model: Quickshell.screens }— per-screen window instantiationPanelWindowwithanchors/margins/exclusiveZone— Wayland layer-shell positioningScope— non-visual Quickshell container for grouping logicProcess+StdioCollector { onStreamFinished }— async shell command executionPwObjectTracker— required to track PipeWire default sink/source changesQuickshell.Hyprland— workspace state andHyprland.dispatch()for IPC
Key Dependencies
- Hyprland — compositor (workspace switching, IPC)
- PipeWire — audio control (volume, mute)
- wttr.in — weather data (no API key needed)
- lm_sensors (
sensors) — CPU temperature - Nerd Fonts (GeistMono Nerd Font) — all icons are Unicode Nerd Font glyphs
- hyprlock / hypridle / hyprshutdown — lock, idle, power actions
Conventions
- Icons: Nerd Font Unicode escapes (
"\u{f057e}") — not icon names or image files - Colors: always reference
Shared.Theme.*(apex-neon palette by default; apex-aeon for light mode) - Layout: use
Shared.Theme.*constants for sizing, spacing, radii - Config: user-facing settings go in
Config.qml, not hardcoded in components - Animations: use
Behavior on <prop>withShared.Theme.animFast/animNormal/animSlow - Inline components:
component Foo: ...inside a file for file-local reusable types (seeSystemPopout) - Popout panels consume mouse clicks with a root
MouseAreato prevent click-through closing