Skip to content
Draft

Quattro #6231

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1678 commits
Select commit Hold shift + click to select a range
4a8091c
Give PanelSlider a right-click signal
dhh Jul 28, 2026
cf8102a
Mute both channels from the audio hero, one from each slider
dhh Jul 28, 2026
234ac7b
Bring back clipboard watchers that die
dhh Jul 28, 2026
9b693cc
Refresh the look and layout of the model-usage plugin
dhh Jul 28, 2026
24dc914
Recover model-usage limits from a boot-time probe failure
dhh Jul 28, 2026
38c1352
Fix t2 module
ryanrhughes Jul 29, 2026
6675f6b
Fix asymmetric rounded shell borders
OldJobobo Jul 29, 2026
79a75d7
Skip Bluetooth startup delay when already powered
yuters Jul 29, 2026
9174fbf
Recognize the omarchy-dev package in omarchy-version
dhh Jul 29, 2026
00376ec
Merge pull request #6422 from OldJobobo/fix/quickshell-asymmetric-bor…
ryanrhughes Jul 29, 2026
e3ff2b8
Better comments
dhh Jul 29, 2026
9939a00
Guard the Bluetooth power check and cover it
dhh Jul 29, 2026
6895136
Merge pull request #6428 from yuters/agent/speed-up-bluetooth-pairing
dhh Jul 29, 2026
fae4a9e
Drop the Qt5 stack (#6431)
dhh Jul 29, 2026
a439069
Let a ListView own the bluetooth device list
dhh Jul 29, 2026
63e57e1
Let a stray both-Shifts Caps Lock clear itself
dhh Jul 29, 2026
39936d2
Ship the model usage widget in the default bar
dhh Jul 29, 2026
1045975
Stop section headers rendering clipped at the top of a list
heyssh Jul 29, 2026
e39a275
Drop Kvantum
dhh Jul 29, 2026
6593403
fix: fall back to XDG MIME browser handler (#6424)
ShiroKSH Jul 29, 2026
09b955d
Manage plugins from Setup > Plugins (#6420)
dhh Jul 29, 2026
2093d1c
Show OSD and sync touchpad steps when scrolling bar widgets (audio, m…
heyssh Jul 29, 2026
bf4aac9
Warn when disk space is low before updating in Quattro (#6432)
ericvrp Jul 29, 2026
fa6b5fc
Fix silent launch failure for apps whose desktop id ends in .desktop …
glafeara Jul 29, 2026
3521299
feat(notifications): add right-click to dismiss popup (#6400)
taxin-404 Jul 29, 2026
fb564e3
Fix DaVinci Resolve window behavior
dhh Jul 30, 2026
f8835df
Plugin cloning via menu (#6433)
dhh Jul 30, 2026
4d05d39
Fix model usage token counting
dhh Jul 30, 2026
559ab04
Add .claude/CLAUDE.md so Claude Code loads AGENTS.md (#6434)
jeremy Jul 30, 2026
eb0f41c
Disable Windows VM restart at boot
dhh Jul 30, 2026
19a6eed
Add metadata for package conflict helper
dhh Jul 30, 2026
3304b79
Simplify model usage panel metrics
dhh Jul 30, 2026
57ea0b4
Simplify bar plugin management (#6435)
dhh Jul 30, 2026
695614c
Preserve Plymouth theme directory permissions
dhh Jul 30, 2026
8554801
Split update coordination helpers
dhh Jul 30, 2026
e47d895
Release sleep inhibitor after locking (#6436)
dhh Jul 30, 2026
14f1bb6
Add a Wi-Fi band toggle to the network panel (#6437)
dhh Jul 30, 2026
283276b
Fix #6440
dhh Jul 30, 2026
b64f5e5
Fix non-ASCII SSID characters in connected network display
richardlences Jul 30, 2026
e872d3c
Correct three AGENTS.md claims against the repo
jeremy Jul 31, 2026
a737ec4
Describe what omarchy-refresh-config validates, not what it doesn't
jeremy Jul 31, 2026
5844e02
Merge pull request #6459 from basecamp/agents-md-corrections
ryanrhughes Jul 31, 2026
1ea910f
Let systemd-oomd kill a runaway app instead of losing the session (#6…
dhh Jul 31, 2026
a79d1dc
Add Wi-Fi QR sharing to network panel (#6463)
tobi Jul 31, 2026
15cecc9
Rank apps matching a whole word of the query above exact menu entries
dhh Aug 1, 2026
bac31ff
Decode escaped SSIDs after status parsing
dhh Aug 1, 2026
a734713
Keep control escapes safe in SSID labels
dhh Aug 1, 2026
ad9fdc3
Merge pull request #6446 from richardlences/fix-non-ascii-ssid
dhh Aug 1, 2026
1960d18
Make menu overflow visible with a half-row peek and edge fades
dhh Aug 1, 2026
d47b4b0
Collapse WhatsApp Web to a Signal-style avatar rail in slim windows (…
dhh Aug 1, 2026
fa95901
Quantize GTK text scaling to whole point sizes to stop menu clipping
dhh Aug 1, 2026
3cb3861
Dismiss bar panels when clicking on another monitor (#6487)
husamemadH Aug 1, 2026
1914498
Sync Omarchy themes to Claude Code (#6480)
MoizIbnYousaf Aug 1, 2026
2050f28
Hot-reload every installed plugin, not just local clones
dhh Aug 1, 2026
1bc8910
Prefix plugin clones with the username so shared clones don't collide
dhh Aug 1, 2026
2374052
Make WhatsApp Web follow your Omarchy light/dark theme (#6484)
scottjones Aug 1, 2026
6642757
Revert WhatsApp theme bridge
dhh Aug 1, 2026
3d59f91
Make WhatsApp follow the system theme
dhh Aug 1, 2026
3ffd9cd
Add battery percentage toggle to power widget
dhh Aug 1, 2026
fa3d28c
Stop long fastfetch values from wrapping over the About logo (#6491)
28allday Aug 1, 2026
c0d4037
Support external monitor brightness in Quattro (#6490)
ssupt Aug 1, 2026
1f10c78
Patch settings-only bar config changes in place instead of rebuilding…
dhh Aug 1, 2026
7020a6e
Span the power widget's open-panel mark across the percentage block
dhh Aug 1, 2026
0af39c5
Expose the battery percentage toggle through omarchy.power IPC
dhh Aug 1, 2026
2cff67f
Fix sleep lock session environment race (#6493)
dhh Aug 1, 2026
f54edbe
Expose the shell's remaining UI-only toggles over IPC
dhh Aug 1, 2026
84e87ce
Add oh-my-pi (omp) as a lazy-installed mise tool
dhh Aug 2, 2026
87940c3
Pick branding images with the portal file chooser
dhh Aug 2, 2026
5b69af6
Fix background cycling for glob characters
dhh Aug 2, 2026
a0e2501
Add configurable default coding agent
dhh Aug 2, 2026
a9b84ce
Refine default agent menu
dhh Aug 2, 2026
6009e8a
Sort default agents alphabetically
dhh Aug 2, 2026
1f88193
Switch to Omacalc
dhh Aug 2, 2026
7b4fb0a
Fix default agent setup edge cases
dhh Aug 2, 2026
9ca5f63
Speed up mouse scrolling in foot
dhh Aug 2, 2026
abe5b1f
Silence jq noise when the reload guard probes dead Hyprland instances
dhh Aug 2, 2026
c2889be
Add Setup > Network menu with DNS, QR Code, and Speed Test (#6499)
dhh Aug 2, 2026
12af188
We don't need rust any longer
dhh Aug 2, 2026
7e9cc15
Retry failed weather fetches so the bar icon can't stay stuck
dhh Aug 3, 2026
929eca3
Add a Super + Shift + = hotkey for calculator
dhh Aug 3, 2026
72ffd58
Offer AM/PM clock formats when right-clicking the bar clock (#6536)
scottjones Aug 3, 2026
c992cdf
Restart the shell unconditionally after every update
dhh Aug 3, 2026
ce93c31
Merge branch 'quattro' into add-default-agent
dhh Aug 4, 2026
5ea4fb5
Add default agent shortcuts
dhh Aug 4, 2026
2324851
Fall back to OpenCode in agent launcher
dhh Aug 4, 2026
a7cc924
Show agent installation progress in a terminal
dhh Aug 4, 2026
f293e9d
Open agents after setting the default
dhh Aug 4, 2026
884ee69
Use official agent marks in default menu
dhh Aug 4, 2026
3636c76
Rely on the session PATH for agent launches
dhh Aug 4, 2026
fe55ac2
Merge pull request #6498 from basecamp/add-default-agent
dhh Aug 4, 2026
40f92ea
Launch apps in their own scope instead of the compositor's cgroup (#6…
defer Aug 4, 2026
fd02c26
Matching browser icons
dhh Aug 4, 2026
caeffdc
fix: add bg/fg aliases for theme color resolution (#6546)
lukewalker2010 Aug 4, 2026
b538dd5
Persist integer GDK_SCALE when monitor scale is fractional
dhh Aug 4, 2026
2daeaa7
Remap bar and background surfaces when their monitor moves
dhh Aug 5, 2026
65541c7
Remove obsolete weather status poller (#6555)
khpark43 Aug 5, 2026
e464ae1
No more OSD
dhh Aug 5, 2026
75538f5
Headline Process and Hardware update submenus with Restart
dhh Aug 5, 2026
5d13b53
Pin network overlay text to a fixed light palette so every theme stay…
heyssh Aug 5, 2026
81778ea
Cap the menu height at the starting menu's height
dhh Aug 5, 2026
b92510f
Bind Super + Alt + Space to the apps menu
dhh Aug 5, 2026
0a9cd98
Offer style installs only under Install > Style
dhh Aug 5, 2026
633f20f
Move Plugins under Defaults and Direct Boot to the end of Setup
dhh Aug 5, 2026
4c4e170
Explain what the update means
dhh Aug 5, 2026
0269fe0
Route menu ids ahead of app keyword aliases (#6563)
dhh Aug 5, 2026
d9bc38a
Apply the terminal tag to Omarchy's own terminal windows (#6561)
dhh Aug 5, 2026
fd1034f
Ship NordVPN directly from OPR
dhh Aug 5, 2026
11a6ae2
Move calculator to Super + Ctrl + Q to avoid conflict with resizing
dhh Aug 6, 2026
4519451
Nostalgia for early Linux adoption
dhh Aug 6, 2026
dd2f434
Extract the speed test into its own omarchy.speedtest panel plugin
dhh Aug 7, 2026
25a74f4
Stop Tuxedo backlight fix from aborting setup (#6583)
dhh Aug 7, 2026
9cb3640
Fix T2 Mac suspend and fan defaults (#6562)
dhh Aug 7, 2026
bc75b03
Show plugin ids as subtext in the plugin picker menus
dhh Aug 7, 2026
c2d8122
Split task-specific agent guidance into agents/ guides
dhh Aug 7, 2026
474d9dd
Move agent guides into agents/skills/
dhh Aug 7, 2026
018f881
Extract the Wi-Fi QR share card into its own omarchy.wifiqr panel plu…
dhh Aug 7, 2026
6ee243c
Split the end-user omarchy skill into topic guides (#6602)
dhh Aug 7, 2026
3d033d1
Stop the menu from opening on the previous evaluation's answers (#6601)
dhh Aug 7, 2026
48d77b5
Persist on-screen notification popups across shell restarts (#6600)
dhh Aug 7, 2026
c3bd4a8
Fix unbound XKBLAYOUT under set -u in the keyboard-layout migration (…
acidkill Aug 7, 2026
bb8d2f2
Split agent usage into data files and rename the plugin to omarchy.ag…
dhh Aug 7, 2026
66b1015
Keep the agent mark fallback from stranding on a missing -light twin
dhh Aug 7, 2026
d2b090f
Isolate XDG dirs in shell tests that launch quickshell with a fake HOME
dhh Aug 7, 2026
f490b69
Reopen the wifi passphrase prompt after a wrong saved password (#6584)
DataDave-Dev Aug 7, 2026
96bbe53
Fix panel delegate segfault and the network panel's open stall (#6605)
dhh Aug 7, 2026
9d5c6e2
Keep root= in the kernel cmdline when upgrading to Quattro (#6579)
tmn73 Aug 7, 2026
3bfea9b
Fail loudly when a pre-update snapshot isn't actually created (#6580)
nille Aug 7, 2026
b16ac48
Add commented-out debug symbol repositories to the edge pacman config…
flavorjones Aug 7, 2026
2521b11
Add a disk speed test under a new Trigger > Tests menu (#6607)
dhh Aug 7, 2026
667d2d2
Open panel hotkeys on the focused monitor (#6613)
dhh Aug 7, 2026
b85ae70
Stop pipefail from turning grep -q SIGPIPE exits into false negatives…
dhh Aug 7, 2026
77cf58c
Add Fireworks balance usage panel (#6488)
dhh Aug 7, 2026
f76d058
Force a database refresh before installing keyrings during the Quattr…
dhh Aug 7, 2026
0b24b84
Scope BROWSER to interactive shells so xdg-settings can change the de…
dhh Aug 7, 2026
007d6fc
Use the gmux backlight instead of the Touch Bar on T2 Macs (#6597)
dhh Aug 7, 2026
2b9e272
Run every test file instead of stopping at the first failure (#6622)
scottjones Aug 8, 2026
5e5a6e8
stop omarchy-mise-install from overwriting symlink targets (#6619)
JustMrMendez Aug 8, 2026
318bf2c
Keep the Quattro upgrade from aborting silently into an unsafe state …
dhh Aug 8, 2026
81ecac4
Fix WhatsApp Slim migration targeting brave-origin-beta instead of br…
akashgagda Aug 8, 2026
47fa3ce
Match style from other updates
dhh Aug 8, 2026
76dc120
Fit the About window to its rendered content (#6627)
dhh Aug 8, 2026
0f1e0ce
Remove the omarchy-update-perform compatibility wrapper
dhh Aug 8, 2026
a858803
Make this note of where they're usable
dhh Aug 8, 2026
412f6ac
Don't need the extra CR
dhh Aug 8, 2026
48c17bb
mise already gives the CR needed
dhh Aug 8, 2026
a3aa3c9
Nicer with an extra CR here
dhh Aug 8, 2026
366b789
Revert "Nicer with an extra CR here"
dhh Aug 8, 2026
76117fb
Take mise tool updates without waiting out the release cooldown
dhh Aug 8, 2026
ab367b9
Stop mise wrappers from waiting out the release cooldown
dhh Aug 8, 2026
b925431
Give SSH commands the user-level tool paths (#6632)
dhh Aug 8, 2026
99293aa
Place the Tailscale bar widget on the right
dhh Aug 8, 2026
5a58f79
Keep clicking a notification working after a shell restart (#6636)
dhh Aug 9, 2026
4d29cbb
Use shared speed test dial scale
dhh Aug 8, 2026
a0dbd90
Add battery percentage menu entry (#6640)
bwynnyck Aug 9, 2026
3aa7c1e
Rename menu
dhh Aug 9, 2026
1ded25f
Make a dead lock client diagnosable and recoverable (#6630)
dhh Aug 9, 2026
f8c235a
Read /boot as root when looking for the Omarchy UKI (#6653)
dhh Aug 9, 2026
e4d85bd
Keep concurrent usage collectors off one shared temp file (#6654)
dhh Aug 9, 2026
8be0ca9
Expect Tailscale on the right in the bar defaults test
dhh Aug 9, 2026
2a0c737
Claude collector: attribute pi usage by provider, not api prefix (#6655)
dalmasluca Aug 9, 2026
0795ede
Fix invisible Helix cursorline, ruler, and picker highlights (#6638)
lukehsiao Aug 9, 2026
19572a1
Skip compositor tests without recording a failure
dhh Aug 9, 2026
dd61d4a
Ship herdr alongside tmux (#6406)
dhh Aug 9, 2026
c4dda58
Stop the clipboard picker freezing on huge pastes (#6568)
markbus-ai Aug 9, 2026
e4a8e01
Tag foot's other app-id as a terminal
dhh Aug 9, 2026
ba7925a
Carry tmux's tab moves, zoom flag, and hostname into herdr
dhh Aug 9, 2026
f511cf8
Hide herdr's outer pane frame like tmux
dhh Aug 9, 2026
9d61915
Fix KeyboardLayout plugin label permanently displaying ENG on some sy…
artfwo Aug 9, 2026
6ddc395
Clean up the terminal and reconnect when SSH connections drop (#6661)
dhh Aug 9, 2026
e1d0c4e
Ship the keyboard layout widget on the bar and make clicking it work …
dhh Aug 9, 2026
9b03f15
Detect Elan match-on-chip fingerprint readers again (#6578)
meirdick Aug 9, 2026
6fa4f78
Add deferred first-boot provisioning and factory reset (#6621)
dhh Aug 9, 2026
0a83590
Show install-style progress through first-boot account setup (#6631)
dhh Aug 9, 2026
c7c897c
Follow herdr's new tab bar status config (#6674)
dhh Aug 10, 2026
7644b56
Extract the setup form shared with the ISO installer (#6669)
dhh Aug 10, 2026
4e31b61
Swap terminaltexteffects for ttfx (#6670)
dhh Aug 10, 2026
4564c24
Cover the shared setup form's cancel contract
dhh Aug 10, 2026
f228c4d
Stop checking for commands the package set guarantees
dhh Aug 10, 2026
dc1224c
Stop the sleep lock budget assertion from flaking
dhh Aug 10, 2026
4cc1493
Use sudo for terminal update inhibition
dhh Aug 10, 2026
354c2f0
Wait for the terminal resize before the first screensaver effect
dhh Aug 10, 2026
7633d8d
Keep the bar mapped while hidden so revealing it is instant (#6677)
vivek7405 Aug 10, 2026
6d7826d
Give non-login shells the system locale
dhh Aug 10, 2026
2d44ad5
End deferred first boot on the finished progress bar
dhh Aug 10, 2026
9f13bfc
Center the timezone picker in first-boot setup
dhh Aug 10, 2026
0b670cd
Title herdr's terminal window like tmux did
dhh Aug 10, 2026
4ab51df
Require a factory snapshot to reset a computer (#6680)
dhh Aug 10, 2026
932efbd
Center the first-boot setup screen and fix its greeter animation
dhh Aug 10, 2026
507059e
Open Herdr with SUPER + CTRL + RETURN
dhh Aug 10, 2026
03b825f
Show Herdr keybindings with SUPER + CTRL + K
dhh Aug 10, 2026
366c708
Keyboard window capture in the region picker: Return, Tab, arrows (#6…
jzimdars Aug 10, 2026
199bd01
Reach every window the region picker can highlight
dhh Aug 10, 2026
567e24c
Hold the indicator peek open while the pointer is on the bar (#6663)
scottjones Aug 10, 2026
c53190b
Remember Bluetooth on/off through the rfkill soft block (#6682)
dhh Aug 10, 2026
e4604fb
Generate image picker thumbnails with libvips in parallel (#6686)
dhh Aug 10, 2026
5649740
Build the menu IPC payload with jq instead of perl
dhh Aug 10, 2026
8bc8540
List Herdr right below Tmux in the keybindings menu
dhh Aug 10, 2026
186668a
Apply the Broadcom Wi-Fi quirk to Macs without a T2 (#6652)
cupatea Aug 10, 2026
477284f
Hide install-time setup plumbing from the command listing
dhh Aug 10, 2026
536fcd5
Move install-time plumbing out of the setup namespace
dhh Aug 10, 2026
0d45f09
Note that fully hidden groups stay out of GROUP_DESCRIPTIONS
dhh Aug 10, 2026
3d1914a
Let bar put place a widget on a bar it does not recognize (#6687)
dhh Aug 11, 2026
1e7bb66
Recover a session lock stranded by a dead shell (#6692)
dhh Aug 11, 2026
383addc
Rearrange keybindings presentation
dhh Aug 11, 2026
23d85a9
Open the keybindings menu on first login
dhh Aug 11, 2026
f97ba73
Wait for a connection before prompting to update
dhh Aug 11, 2026
2b38f75
Show the per-model weekly limit Claude's usage endpoint reports (#6691)
GebaRoanoke Aug 11, 2026
9ea9f80
Missed the glyph
dhh Aug 11, 2026
0ad64a5
Fix command injection in theme install, drop tzupdate NOPASSWD (#6694)
KazeTachinuu Aug 11, 2026
efe8053
Title a model-scoped limit the way the flat ones title themselves
dhh Aug 11, 2026
5edc349
Bind SUPER + CTRL + a number to the bar's right panels (#6702)
dhh Aug 11, 2026
66f3155
Label the keyboard widget with the xkb language code (#6699)
defer Aug 11, 2026
9f0c4b9
Ensure we don't register duplicate bindings
dhh Aug 11, 2026
3b08a85
Recover monitors Hyprland brought up with no mode (#6701)
dhh Aug 11, 2026
4d0531f
Add QR code capture (#6705)
dhh Aug 11, 2026
27d1b6b
Resolve omarchy_monitor_scale variable reference in clamshell recover…
s-gato Aug 11, 2026
77bf2ef
Share files and folders with the desktop file chooser (#6707)
dhh Aug 11, 2026
1c9dfc5
Greet the first login with a keybindings toast again
dhh Aug 11, 2026
5817feb
Mute all audio on right-click (#6708)
kevinmcconnell Aug 11, 2026
05bb82b
Add checkout bin to sudoers path
ryanrhughes Aug 11, 2026
5b2c02d
Fix unclickable tray submenus by drilling down inside the popup (#6703)
acidkill Aug 11, 2026
41818ec
Start the agent in ~/Work when launched from home
dhh Aug 11, 2026
f4b832e
fix(monitor): fix display mirroring recovery and UI state (#6457)
setiapam Aug 11, 2026
0820484
Detect NVIDIA GPUs without waking them (#6712)
dhh Aug 11, 2026
912a4ad
Better order
dhh Aug 11, 2026
7d08473
Add Herdr keybindings to the Learn menu
dhh Aug 11, 2026
64e20f8
Let the menu fill 70% of the screen
dhh Aug 11, 2026
96a50cf
Add the Discord community to the Learn menu
dhh Aug 11, 2026
1bb6600
Repair theme symlinks the state-move migration left dangling (#6717)
shrijit37 Aug 11, 2026
b99fd91
Simplify the Quattro upgrade, and stop it leaving an error bar behind…
dhh Aug 11, 2026
1e3c43a
Assert the focused monitor the panel actually reports
dhh Aug 11, 2026
3888dca
Stop script hanging up the inhibitor before it starts
dhh Aug 11, 2026
4727bad
Stop the update-lock stub racing the holder it spawns
dhh Aug 11, 2026
2fa490d
Rebuild boot images the Plymouth migration left stale
dhh Aug 12, 2026
d6b21f8
Launch the default coding agent without permission prompts (#6729)
dhh Aug 12, 2026
ab57ad6
Make notification history the last ten notifications on disk
dhh Aug 12, 2026
cd84583
Show a notification the sender updated, instead of the version it rep…
dhh Aug 12, 2026
fd23ca0
Prune the package cache before updating (#6734)
dhh Aug 12, 2026
9b8bf1d
Fix two races in the notification popup and history handling (#6735)
dhh Aug 12, 2026
21b610a
Need an extra CR for presentation
dhh Aug 12, 2026
3da9eaf
Add quattro background by vulturetone
dhh Aug 12, 2026
0fcdd71
Drop backgrounds no longer worthy
dhh Aug 12, 2026
5c74f82
Ask for the keyboard layout only when the answer can change (#6727)
markbus-ai Aug 12, 2026
a9c159a
Restore FPC fingerprint detection in Quattro (#6737)
Vtorrealba Aug 12, 2026
970ec26
Don't let a usbfs claim count as a kernel driver (#6744)
dhh Aug 12, 2026
106320a
Install ChatGPT as a desktop app under Install > AI (#6747)
dhh Aug 12, 2026
0900855
Stop hot-reloading the shell when a package upgrade rewrites it (#6751)
dhh Aug 12, 2026
0fa3170
Skip shell tests when the compositor can't be reached (#6749)
dhh Aug 12, 2026
66e3f47
Follow the keyboard being typed on in the layout widget (#6740)
KazeTachinuu Aug 12, 2026
b97a148
Treat the guard test's socket fixture as optional (#6755)
dhh Aug 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

# Python bytecode (orchestrator)
__pycache__/
*.pyc
11 changes: 11 additions & 0 deletions .luarc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"workspace": {
"library": [
"/usr/share/hypr/stubs"
],
"checkThirdParty": false
},
"diagnostics": {
"globals": ["hl"]
}
}
128 changes: 58 additions & 70 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
# Task Guides

Deeper instructions for specific kinds of work live in `agents/skills/`. Read the
matching guide before starting:

- [`agents/skills/command-metadata.md`](agents/skills/command-metadata.md) - adding or changing commands in `bin/`
- [`agents/skills/install-scripts.md`](agents/skills/install-scripts.md) - working under `install/` or on system/user setup commands
- [`agents/skills/shell-dev.md`](agents/skills/shell-dev.md) - editing the Quickshell desktop under `shell/`
- [`agents/skills/acceptance-tests.md`](agents/skills/acceptance-tests.md) - writing or running graphical acceptance tests under `test/acceptance.d/`
- [`agents/skills/visual-verification.md`](agents/skills/visual-verification.md) - verifying any change with a visual effect in the running UI
- [`docs/migrations.md`](docs/migrations.md) - creating or changing migrations under `migrations/`

# Style

- Two spaces for indentation, no tabs
Expand All @@ -12,7 +24,9 @@

All commands start with `omarchy-`. Prefixes indicate purpose.

The authoritative command group list lives in `bin/omarchy` in `GROUP_DESCRIPTIONS`. Keep `GROUP_DESCRIPTIONS` updated when adding a new command prefix.
The authoritative list of user-facing command groups lives in `bin/omarchy` in `GROUP_DESCRIPTIONS`. Keep `GROUP_DESCRIPTIONS` updated when adding a new command prefix users are meant to browse to.

A group whose commands are all `# omarchy:hidden=true` gets no entry. That table drives the top-level group listing on its own, so an entry there advertises the group even when every command in it is hidden. `apply-` and `provision-` are deliberately absent for that reason; both still route, and `omarchy <group>` still prints a group header without one.

Common prefixes include:

Expand All @@ -29,103 +43,77 @@ Common prefixes include:
- `theme-` - theme management
- `update-` - update components

Other current prefixes include:

- `ac-`, `audio-`, `battery-`, `branch-`, `brightness-`, `channel-`, `config-`, `debug-`, `dev-`, `drive-`, `first-`, `font-`, `haptic-`, `hibernation-`, `hook-`, `hyprland-`, `menu-`, `migrate-`, `notification-`, `npx-`, `plymouth-`, `powerprofiles-`, `reinstall-`, `remove-`, `screensaver-`, `show-`, `snapshot-`, `state-`, `sudo-`, `swayosd-`, `system-`, `transcode-`, `tui-`, `tz-`, `upload-`, `version-`, `voxtype-`, `webapp-`, `wifi-`, `windows-`

# Command Metadata

Commands in `bin/` can declare CLI metadata in comments near the top of the file. `bin/omarchy` scans the first 80 lines, and tests expect command metadata to remain valid.
Do not maintain a second exhaustive prefix list here. Consult
`GROUP_DESCRIPTIONS` when selecting or checking a command group so this
guidance does not drift from the router.

Supported metadata keys:
# Runtime Environment

- `# omarchy:summary=...` - short help text
- `# omarchy:group=...` - command group when it differs from the filename-derived prefix
- `# omarchy:name=...` - command name within the group
- `# omarchy:args=...` - usage arguments
- `# omarchy:examples=...` - examples separated with ` | `
- `# omarchy:alias=...` / `# omarchy:aliases=...` - alternate routes
- `# omarchy:hidden=true` - hide from default command listings
- `# omarchy:requires-sudo=true` - mark commands that require sudo
- `$OMARCHY_PATH` is set at the top level by the uwsm session environment and is always available to Omarchy runtime code.
- Commands in `bin/` and Quickshell QML should rely on `$OMARCHY_PATH` / `Quickshell.env("OMARCHY_PATH")`; do not derive fallback paths from `HOME`, `Quickshell.shellDir`, or re-export/default `OMARCHY_PATH` manually.

Prefer explicit metadata for user-facing commands. Keep routes consistent with the filename unless there is a deliberate alias or compatibility route.
# Privileged Commands

Example:
- Follow the "Privilege Escalation" section of `default/agents/skills/omarchy/SKILL.md`. It draws the
`sudo`/`pkexec` line by whether the caller has a terminal to enter a password in, and the repo's
own scripts follow it.

```bash
# omarchy:summary=Take a screenshot
# omarchy:group=capture
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
# omarchy:aliases=omarchy screenshot
```

# Install Scripts

Install entry points (`install.sh`, `boot.sh`) use `#!/bin/bash`. Many scripts under `install/` are sourced via `run_logged` and intentionally do not have shebangs.
# Git

Install stage files follow this pattern:

- `install/*/all.sh` lists scripts in execution order
- leaf scripts are sourced by `run_logged $OMARCHY_INSTALL/path/to/script.sh`
- avoid `exit` in sourced install scripts unless intentionally aborting the install
- use `$OMARCHY_INSTALL` and `$OMARCHY_PATH` instead of hard-coded Omarchy paths
- keep hardware-specific logic under `install/config/hardware/`
- prefer helper commands for package and command checks where available

Raw `command -v`, `pacman`, and `pacman-key` are acceptable in bootstrap/preflight/package-helper contexts where the helper commands may not be available yet or where direct package-manager behavior is the point of the script.
- Commits should be atomic: include only one coherent change or fix, and do not mix unrelated work.
- Commit messages should be succinct and describe the change being made.

# Helper Commands

Use these instead of raw shell commands:

- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands
- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages
- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages (don't use these if you can just use `omarchy-pkg-add`/`omarchy-pkg-drop`)
- `omarchy-pkg-add` - install packages (handles both pacman and AUR)
- `omarchy-pkg-drop` - remove packages; use this instead of raw `pacman -R*`
- `omarchy-notification-send` - send desktop notifications; do not call `notify-send` directly
- `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands)

Exceptions are allowed for bootstrap, preflight, migration, and package-helper scripts where the helper may not be available yet, where the helper itself is being implemented, or where direct package-manager behavior is required.
Commands installed by Omarchy's default package set are runtime invariants. Invoke them directly; do not add defensive `omarchy-cmd-present` / `omarchy-cmd-missing` checks around them. Use command-presence helpers only for genuinely optional dependencies or code that can run before the default package set is installed.

# Config Structure
Exceptions are allowed for migration and package-helper scripts where the helper may not be available yet, where the helper itself is being implemented, or where direct package-manager behavior is required.

- `config/` - default configs copied to `~/.config/`
- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors
- `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15)
# Menu

# Visual Changes
- The menu definition lives in `default/omarchy/omarchy-menu.jsonc`.
- Do not add `aliases` to new menu entries. Aliases are reserved for
established alternate names users already type, kept for compatibility.

When making visual changes, such as Waybar styles or desktop appearance, always take and analyze a screenshot after applying the change to verify the result. Use `omarchy capture screenshot fullscreen save` for fullscreen screenshots.
# Config Structure

# Refresh Pattern
- `config/` - default configs copied to `~/.config/`
- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors
- `themes/*/colors.toml` - theme color definitions (accent, background, foreground, red/green/yellow/blue/magenta/cyan and bright_* variants)

To copy a default config to user config with automatic backup:
# Tests

```bash
omarchy-refresh-config hypr/hyprlock.conf
```
Run focused automated tests for the area you changed. Current test entry points:

This copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hypr/hyprlock.conf`.
- `./test/all` - aggregate runner for CLI and shell tests; it intentionally does not run graphical acceptance tests
- `./test/cli` - CLI routing, command metadata, theme helpers, and safe dispatch coverage
- `./test/shell` - all Omarchy shell tests under `test/shell.d/`

# Migrations
New Omarchy shell tests should live in `test/shell.d/*-test.sh` so `./test/shell` picks them up automatically. Source `test/shell.d/base-test.sh` for shared root-path discovery, assertions, and Node test helpers.

To create a new migration, run `omarchy-dev-add-migration --no-edit`. This creates a migration file named after the unix timestamp of the last commit.
The graphical acceptance suite runs in a disposable VM, not in the active
development session; see [`agents/skills/acceptance-tests.md`](agents/skills/acceptance-tests.md).

New migration format:
- File permissions must be `0644` (`-rw-r--r--`); migrations are sourced, not executed directly
- No shebang line
- Start with an `echo` describing what the migration does
- Use `$OMARCHY_PATH` to reference the omarchy directory
- Prefer helper commands such as `omarchy-cmd-present`, `omarchy-cmd-missing`, `omarchy-pkg-present`, and `omarchy-pkg-missing`
Visual changes must be verified in the running UI in addition to automated
tests; follow [`agents/skills/visual-verification.md`](agents/skills/visual-verification.md).

Some older migrations predate these rules. Do not copy older migrations that start with shebangs, omit the leading `echo`, or hard-code `~/.local/share/omarchy`.
# Refresh Pattern

Migrations may use raw `pacman`, `command -v`, or direct config edits when needed for historical compatibility or one-off repair work.
To copy a default config to user config with automatic backup:

Example:
```bash
echo "Disable fingerprint in hyprlock if fingerprint auth is not configured"

if omarchy-cmd-missing fprintd-list || ! fprintd-list "$USER" 2>/dev/null | grep -q "finger"; then
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
fi
omarchy-refresh-config hypr/hyprland.lua
```

This copies `$OMARCHY_PATH/config/hypr/hyprland.lua` to `~/.config/hypr/hyprland.lua`. The argument
is interpolated into both paths and only checked with `[[ -e ]]`, so pass a plain relative path: a
name containing `..` resolves and copies, landing outside `~/.config` rather than being rejected.
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@AGENTS.md
46 changes: 46 additions & 0 deletions agents/skills/acceptance-tests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Acceptance Tests

Read this before writing or running the graphical acceptance suite under
`test/acceptance.d/`.

The graphical acceptance suite lives in `test/acceptance` with test files under
`test/acceptance.d/*-test.sh`. It exercises a real installed Omarchy desktop,
including session health, shell surfaces, panels, keyboard navigation,
representative applications, and system setup. Source
`test/acceptance.d/base-test.sh` for the shared helpers.

Run acceptance tests in a disposable VM through the sibling `omarchy-iso`
repository, not in the active development session. The suite opens and closes
applications and temporarily changes desktop configuration.

For acceptance-test-only changes, reuse an installed base and sync the suite:

```bash
cd ../omarchy-iso
./bin/omarchy-iso-test release/<iso>.iso --reuse-base --sync-omarchy ../omarchy --no-preview
```

Use `--sync-all ../omarchy` instead of `--sync-omarchy ../omarchy` when the
acceptance run must exercise local `bin/`, `config/`, or `shell/` source too.
Changes to package manifests, installation, finalization, or shipped defaults
require a fresh ISO built from the local checkouts and a run without
`--reuse-base`:

```bash
cd ../omarchy-iso
./bin/omarchy-iso-make --no-boot-offer --local-source ../omarchy ../omarchy-pkgs
./bin/omarchy-iso-test release/<generated-iso>.iso --no-preview
```

Keep unrelated acceptance workflows in separate test files. The runner records
a failed file and continues with the remaining files, which preserves as much
diagnostic coverage as possible. Restore modified user state with traps, close
anything the test opens, and capture every visually distinct state (including
entered input where relevant) as `success-<step>.png`; failure helpers capture
`failure-<step>.png`. The ISO harness collects the screenshots and logs under
its timestamped `test-runs/` directory and opens the screenshots after the run
unless `--no-preview` is passed.

The ISO harness exercises compositor-level shortcuts with QMP virtual keyboard
input. In-guest `wtype` is suitable for typing into focused controls, but it
does not reliably prove that a global Hyprland keybinding works.
31 changes: 31 additions & 0 deletions agents/skills/command-metadata.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Command Metadata

Read this before adding or changing commands in `bin/`.

Commands in `bin/` can declare CLI metadata in comments near the top of the
file. `bin/omarchy` scans the first 80 lines, and tests expect command metadata
to remain valid.

Supported metadata keys:

- `# omarchy:group=...` - override the command group inferred from the filename
- `# omarchy:name=...` - override the command name inferred from the filename
- `# omarchy:summary=...` - short help text
- `# omarchy:args=...` - usage arguments
- `# omarchy:examples=...` - examples separated with ` | `
- `# omarchy:alias=...` / `# omarchy:aliases=...` - alternate routes
- `# omarchy:hidden=true` - hide from default command listings
- `# omarchy:requires-sudo=true` - mark commands that require sudo

Only use `omarchy:examples` where there are args that need explaining.

Prefer explicit metadata for user-facing commands. Keep routes consistent with
the filename unless there is a deliberate alias or compatibility route.

Example:

```bash
# omarchy:summary=Take a screenshot
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
```
19 changes: 19 additions & 0 deletions agents/skills/install-scripts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Install Scripts

Read this before working under `install/` or on the system/user setup commands.

The ISO owns installation orchestration. This repo ships target-side setup
commands and reusable setup leaves:

- `bin/omarchy-apply-system` runs root-owned system setup during ISO finalization.
- `bin/omarchy-apply-hardware` runs idempotent hardware-specific setup and is called by `omarchy-apply-system`.
- `bin/omarchy-finalize-user` runs the per-user runtime finalization (skill symlinks, xdg-user-dirs, mime defaults, `install/user/all.sh`). Shipped user defaults are seeded by `/etc/skel` from `omarchy-settings`, not by this command. `bin/omarchy-reinstall-configs` is the explicit destructive resync of those defaults into an existing user's `$HOME`.
- leaf scripts under `install/` are sourced by `run_logged $OMARCHY_INSTALL/path/to/script.sh` and intentionally do not have shebangs.
- avoid `exit` in sourced setup scripts unless intentionally aborting setup.
- use `$OMARCHY_INSTALL` and `$OMARCHY_PATH` instead of hard-coded Omarchy paths.
- keep root-scoped hardware setup under `install/hardware/` and orchestrate it through `install/hardware/all.sh`.
- keep every per-user setup leaf under `install/user/` (including `install/user/hardware/` and `install/user/first-run/`) so it is clear what must run for each user.
- prefer helper commands for package and command checks where available.

Raw `command -v`, `pacman`, and `pacman-key` are acceptable in package-helper
contexts where direct package-manager behavior is the point of the script.
49 changes: 49 additions & 0 deletions agents/skills/shell-dev.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Omarchy Shell Development

Read this before editing the Quickshell desktop under `shell/`.

The Quickshell desktop runs as a single long-running process out of
`shell/`. Hyprland autostart launches it directly with `quickshell -n -p`;
do not start additional standalone Quickshell instances for individual
components.

Run `omarchy-restart-shell` after making changes to QML files.

## Plugin contract

- First-party plugins live directly under `shell/plugins/` or one category
level deeper, such as `shell/plugins/panels/weather/`. First-party bar-only
widgets may use adjacent `*.manifest.json` files. Third-party plugins live
at `~/.config/omarchy/plugins/<id>/` with a `manifest.json` at the root.
- Every plugin manifest declares `schemaVersion`, `id`, `name`, `version`,
`kinds`, and `entryPoints`. See
[`docs/omarchy-shell.md`](../../docs/omarchy-shell.md) and
`shell/services/PluginRegistry.qml` for the current contract; fields such as
`activation` are optional.
- Entry-point QML files are `Item`s (not `ShellRoot`), and accept the
shell-injected properties `omarchyPath`, `shell`, `manifest`, and
`pluginRegistry` / `barWidgetRegistry` as appropriate.
- Panel / overlay / menu plugins must expose `open(payloadJson)` and
`close()` lifecycle methods for `shell summon` and `shell hide`.

## IPC

- `bin/omarchy-shell` is the canonical IPC entry point. It forwards to
the running shell and does not start it. Prefer it over re-implementing
direct Quickshell socket calls in every CLI.
- The `shell` IPC target exposes lifecycle and configuration methods including
`ping`, `summon`, `hide`, `toggle`, `call`, `rescanPlugins`, `reloadConfig`,
`setPluginEnabled`, and `listPlugins`. `shell.qml` also registers
`image-selector`, which drives the `omarchy.image-picker` panel.
- Individual plugins register their own IPC targets, named for the plugin rather
than for where they appear: the background switcher registers `background`, and
bar widgets register one target each — `omarchy.indicators`,
`omarchy.system-update`, `omarchy.clock`. There is no `bar` target.

## Editing widget files with glyphs

Widget files in `shell/plugins/bar/widgets/` contain Nerd Font glyphs as raw
unicode characters. Agent file-editing tools can strip multi-byte codepoints
in some positions — do **not** rewrite widget files wholesale through those
tools. For glyph fixes, make a targeted edit with the surrounding context, or
use a Python script that inserts codepoints via `chr(0xXXXXX)`.
Loading