Commit Graph
100 Commits
Author SHA1 Message Date
David Heinemeier HanssonandClaude Fable 5 da157fb9c0 Drop Wi-Fi power save toggling in favor of keeping it off
The on-battery toggle bought a fraction of a watt while the radio
idled -- twenty-some minutes across a full discharge in the best case
-- and paid for it with 20-300ms latency spikes on idle links and
outright link drops on Intel BE200/BE211 firmware. NetworkManager can
keep power save off natively with one conf.d line, which replaces the
udev rule, the setter script, and any per-card deny-listing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 10:34:19 -07:00
David Heinemeier HanssonandGitHub 1d4077287b Merge pull request #6353 from zainsyedz/fix-clamshell-internal-monitor-config
Respect internal monitor config in clamshell recovery
2026-07-24 10:31:00 -07:00
David Heinemeier HanssonandGitHub a62e95d2e1 Merge pull request #6367 from khpark43/fix-bar-plugin-json-values
Fix bar plugin JSON value validation
2026-07-24 10:24:34 -07:00
David Heinemeier HanssonandGitHub ea549a74d5 Merge pull request #6364 from scottjones/fix-screensaver-multimonitor
Run the screensaver on every monitor, not just the last one
2026-07-24 09:32:02 -07:00
David Heinemeier HanssonandClaude Fable 5 26630a9796 Check terminal support once and bound the window wait overall
An unsupported terminal notified once per monitor and each monitor
paid a wasted wait; check before the loop instead. The per-read
timeout also let a chatty event stream extend the wait indefinitely,
so spend the 5 seconds against one deadline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 09:31:55 -07:00
David Heinemeier Hansson 5a046035d5 Fix shell restart across dev path changes 2026-07-24 09:31:09 -07:00
David Heinemeier HanssonandGitHub abc9ff03e1 Merge pull request #6366 from scottjones/fix-notification-surface-resize
Fix notification popups stretching/squishing when the count changes
2026-07-24 09:24:51 -07:00
David Heinemeier HanssonandClaude Opus 4.8 b6bd486c39 Bind notification popup mask to the toast column item
Use Region { item: popupColumn } instead of manually mirroring the
column's x/y/width/height. It tracks the item's mapped geometry directly,
so it stays correct without assuming the column shares the window's
coordinate space.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 09:24:30 -07:00
David Heinemeier HanssonandGitHub 4e550b75c2 Merge pull request #6350 from husamemadH/fix-mise-install-wrapper-recursion
Fix infinite loop in omarchy-mise-install wrappers
2026-07-24 09:20:15 -07:00
David Heinemeier HanssonandClaude Fable 5 5c1b31ada9 Regenerate existing mise wrappers via migration
The generator fix only helps fresh installs; existing wrappers in
~/.local/bin keep the recursive exec line until rewritten. Detect the
generated wrapper shape, extract package and bin, and reinstall each
one, which also repairs wrappers users created for their own packages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 09:19:56 -07:00
David Heinemeier HanssonandGitHub bc33381d84 Merge pull request #6348 from InfeCtlll3/agent/scroll-long-tray-menus
Make long tray menus scrollable
2026-07-24 09:09:17 -07:00
David Heinemeier HanssonandClaude Fable 5 332a982a1d Drop source-grep regression assertion
A regex over the QML text breaks on innocent reformatting and passes
even when the scrolling behavior regresses.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 09:09:02 -07:00
David Heinemeier HanssonandGitHub e135508257 Merge pull request #6356 from khpark43/fix-default-browser-xdg-settings
Fix XDG browser defaults when BROWSER is set
2026-07-24 09:01:39 -07:00
David Heinemeier HanssonandClaude Fable 5 e61ff1ef4f Unset BROWSER for xdg-settings reads and don't abort removal on fallback failure
xdg-settings get also consults $BROWSER, so unset it for the getters too.
A failed best-effort fallback default should not abort the browser removal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 09:01:17 -07:00
David Heinemeier HanssonandClaude Fable 5 2c8639ffbd Persist workspace layout toggles across Hyprland reloads
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:03:43 -07:00
David Heinemeier Hansson 202296324a Keep display scaling options consistent 2026-07-23 20:37:25 -07:00
David Heinemeier Hansson f20da3f94a Tmux jumps are not that important 2026-07-23 20:09:50 -07:00
David Heinemeier Hansson 3e664286cc Use upcase consistently for menu tooltips 2026-07-23 20:09:39 -07:00
David Heinemeier HanssonandClaude Fable 5 ffd3c79ab2 Resend pending invitations after restarting the shell
Restarting the shell kills its notification server, and a pending
invitation's notify-send waiter then hangs forever: the dying server
never emits NotificationClosed. So a still-running
omarchy-*-invitation unit means an unanswered invitation — re-run it
once the new shell is up so its toast reappears.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 19:25:11 -07:00
David Heinemeier HanssonandClaude Fable 5 00eae9a5ef Invite fingerprint setup after the first system update
The setup installs packages (libfprint-git, fprintd, usbutils), which
isn't reliable on a fresh install before the databases have been
synced. Defer the invitation with a post-update hook, like Voxtype.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 19:25:06 -07:00
David Heinemeier Hansson 86f616cfb3 Add emoji picker to Trigger menu 2026-07-23 19:23:50 -07:00
David Heinemeier Hansson 9b09a3c142 Clear update inhibitors before reboot prompt 2026-07-23 18:58:55 -07:00
David Heinemeier HanssonandClaude Fable 5 a0e6d65ba8 Keep universal clipboard shortcuts working in terminals
Sending the shortcut through wtype's virtual keyboard let the physically
held SUPER merge into the injected chord, so terminals saw
SUPER+CTRL+Insert instead of CTRL+Insert, and injected CTRL+V could even
trigger the SUPER+CTRL+V clipboard manager bind. Send via send_key_state
with no window target instead: explicit mods go straight to the focused
surface, layer-shell panels included.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XnMDbwJXQA3fvW8o8Pwr97
2026-07-23 18:08:31 -07:00
David Heinemeier Hansson 63955e787f Hide unavailable display scale options 2026-07-23 18:06:19 -07:00
David Heinemeier Hansson 58ec29f20a Move direct boot command to setup 2026-07-23 17:43:36 -07:00
David Heinemeier HanssonandClaude Fable 5 5b130c1063 Make tmux alert parsing and focus more robust
Session names can contain pipes but never colons, so split fields on
colons instead. Remember refreshes that arrive while the indicator is
already polling, and jump to the most recently used tmux client rather
than an arbitrary one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 17:40:47 -07:00
David Heinemeier HanssonandClaude Opus 4.8 a382be2645 Indicate and jump to tmux panes waiting for attention
Show a bar indicator whenever tmux has flagged a window, the same state
that highlights the tab, and jump to it on click or with Super + Ctrl + J.
Tmux hooks push the state to the shell, so nothing polls while no pane is
waiting.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 17:40:47 -07:00
David Heinemeier HanssonandClaude Opus 4.8 98e88723ae Reload tmux config when the server is running
pgrep -x tmux never matched, since the processes are named "tmux: server"
and "tmux: client", so config reloads were silently skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 17:40:47 -07:00
David Heinemeier Hansson 6d7268eb65 Support clipboard shortcuts in shell panels 2026-07-23 17:12:39 -07:00
David Heinemeier Hansson c844277749 Activate dev checkout before updates 2026-07-23 17:05:29 -07:00
David Heinemeier Hansson ed9e68957f Match display scale highlights to clean scales 2026-07-23 16:48:29 -07:00
David Heinemeier Hansson 534746e05b No needless exit wounds 2026-07-23 16:47:20 -07:00
David Heinemeier Hansson 85a8453e20 Stick with one-liners 2026-07-23 16:42:59 -07:00
David Heinemeier Hansson 2d3d1e2a3c Only offer webcam recording when available 2026-07-23 16:33:12 -07:00
David Heinemeier Hansson 7798ed34b1 Keep apps menu alphabetically sorted 2026-07-23 16:32:31 -07:00
David Heinemeier Hansson 5d83402e75 No need to count the displays 2026-07-23 16:19:29 -07:00
David Heinemeier HanssonandClaude Opus 4.8 cb9485f216 Gate sudo fingerprint behind lid state too
Extend the clamshell gate to /etc/pam.d/sudo, not just polkit-1. When the
lid is shut the reader is unreachable, so a terminal sudo would block on
"Place your finger" until pam_fprintd timed out before letting you type the
password. The same pam_exec gate (success=1 skips fingerprint when the lid
is closed) now runs ahead of pam_fprintd in the sudo stack as well.

setup and removal share one gate definition across sudo and polkit; the
migration now gates both stacks on existing installs.

Resolves the clamshell case in #856 and supersedes #6003.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 15:29:22 -07:00
David Heinemeier Hansson 8e549c27d0 Update active dev checkout with system 2026-07-23 15:28:32 -07:00
David Heinemeier Hansson 7a9947a732 Combine the Omarchy menu and the launcher
Now that we can deep search, they don't need to be different
2026-07-23 15:04:22 -07:00
David Heinemeier Hansson 347997871e Defer channel switch reboot until after update 2026-07-23 14:19:24 -07:00
David Heinemeier Hansson b2f1bb6ae3 Merge branch 'fingerprint-first-run-invite' into quattro 2026-07-23 14:11:19 -07:00
David Heinemeier Hansson b6e75d5e48 Language improvements 2026-07-23 14:08:08 -07:00
David Heinemeier HanssonandClaude Opus 4.8 e2bf0daaa8 Invite fingerprint setup on first run when a reader is present
Add a first-run notification, alongside the keybindings/Wi-Fi toasts, that
invites anyone with a fingerprint sensor to enable it. Clicking launches
omarchy-setup-security-fingerprint in a floating terminal.

Detection lives in a new omarchy-hw-fingerprint helper that reads sysfs
(device product descriptor plus a fingerprint-vendor allowlist), so it
works before fprintd/usbutils are installed and without nagging machines
that have no reader. The setup script reuses the same helper as an early
gate, bailing before installing any packages when no reader is found
(replacing the old post-install fprintd-list probe).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 14:05:31 -07:00
David Heinemeier HanssonandClaude Opus 4.8 1fce43e8eb Invite fingerprint setup on first run when a reader is present
Add a first-run notification, alongside the keybindings/Wi-Fi toasts, that
invites anyone with a fingerprint sensor to enable it. Clicking launches
omarchy-setup-security-fingerprint in a floating terminal.

Detection lives in a new omarchy-hw-fingerprint helper that reads sysfs
(device product descriptor plus a fingerprint-vendor allowlist), so it
works before fprintd/usbutils are installed and without nagging machines
that have no reader. The setup script reuses the same helper as an early
gate, bailing before installing any packages when no reader is found
(replacing the old post-install fprintd-list probe).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 14:03:19 -07:00
David Heinemeier Hansson f911851319 Link dev channel to home checkout 2026-07-23 14:01:36 -07:00
David Heinemeier Hansson e68b0f025d Merge branch 'fingerprint-lid-aware' into quattro 2026-07-23 13:52:31 -07:00
David Heinemeier HanssonandClaude Opus 4.8 540e411edf Show fingerprint on lock screen and polkit, gated by lid state
Bring the fingerprint affordance to the Quickshell lock screen and polkit
dialog, matching what hyprlock did on master.

Lock screen: render the md-fingerprint glyph inside the password field's
right edge when a sensor is enrolled, reserving space so long passwords
never run under it.

Polkit dialog: show one method at a time. When a sensor is enrolled and
the reader is reachable, the dialog is just the centered fingerprint icon
(square card); the moment PAM asks for a password it switches to the
password field. Detects pam_fprintd anywhere in the auth stack now that a
gate can precede it.

Lid awareness: a closed lid means the reader is unreachable, so both
surfaces fall back to the password. polkit gets a pam_exec clamshell gate
(auth [success=1 default=ignore] before pam_fprintd) so a shut lid drops
straight to the password prompt instead of blocking on the reader for the
pam_fprintd timeout; the lock screen hides the icon and skips scanning.

The gate points at the fixed /usr/bin path the package always provides so
it survives switching between package installs and dev-link. A migration
adds the gate for existing fingerprint setups.

New helper omarchy-hw-laptop-closed (pure lid state); omarchy-hw-clamshell
now composes it with the external-monitor check.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 13:51:07 -07:00
David Heinemeier HanssonandClaude Fable 5 141432639f Keep the menu anchored to a stable top line and drop its minimum height
The menu card re-centered on every resize, so searching or moving into
a submenu made it jump around. It still opens centered like before, but
the first search keystroke or submenu move freezes the top line where
it sits — from then on the card only grows and shrinks downward.
Closing unfreezes. Also drop the 220px minimum height so the card
always hugs its content instead of leaving a void under short lists.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 13:48:16 -07:00
David Heinemeier Hansson 1b6ab15331 Fix command detection in Hyprland Lua 2026-07-22 21:48:30 -07:00
David Heinemeier HanssonandClaude Fable 5 70f18e9a1c Keep notification QObjects out of the ListModels to stop shell crashes
Model rows stored the live Notification object in a ref role. When the
server destroyed the notification (sender close, DND untrack, dismiss)
the role became a dangling C++ pointer, and the next read segfaulted in
QQmlListModel::data — typically when replaying history over IPC. Track
live notifications in a JS map keyed by originalId instead, cleaned up
on close and untrack, where a stale reference degrades to a catchable
error instead of a crash.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 21:39:15 -07:00
David Heinemeier Hansson fc6168af86 Load Voxtype hotkeys when installed 2026-07-22 21:39:15 -07:00
David Heinemeier Hansson e294d8278f Fix jsonc 2026-07-22 17:43:26 -07:00
David Heinemeier Hansson 9212939038 We dropped keywords 2026-07-22 17:32:47 -07:00
David Heinemeier HanssonandClaude Fable 5 d411c90a2a Restore Unlock screen selection to the Style menu
Bring back per-theme Plymouth unlock theming, dropped when walker +
elephant were removed. Selection now uses the same image carousel as
the theme and background switchers instead of a name list.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 17:32:20 -07:00
David Heinemeier Hansson c544440469 Rename CLI benchmark command 2026-07-22 17:32:01 -07:00
David Heinemeier Hansson 568d7548e0 Included in the skill 2026-07-22 17:32:01 -07:00
David Heinemeier Hansson 35dd454d66 Document acceptance and visual verification 2026-07-22 17:31:14 -07:00
David Heinemeier Hansson 1de4c89030 Expand graphical acceptance coverage 2026-07-22 17:31:14 -07:00
David Heinemeier Hansson 83d20b07d1 Use current .NET runtime package 2026-07-22 17:31:14 -07:00
David Heinemeier Hansson 0daa397061 Remove redundant default command checks 2026-07-22 17:31:14 -07:00
David Heinemeier Hansson 7361b48461 Refresh shell test fixtures 2026-07-22 17:31:14 -07:00
David Heinemeier Hansson 43e95217f2 Reload weather location when opening panel 2026-07-22 17:31:14 -07:00
David Heinemeier Hansson 475211a5d4 Make Copy URL use native clipboard host 2026-07-22 17:25:28 -07:00
David Heinemeier HanssonandClaude Fable 5 6a047462e8 Decode launcher and tray icons at physical resolution
Quickshell's IconImage decodes at logical size, so on HiDPI displays
PNG icons were rendered from a texture at half the needed resolution
and looked blurry next to SVG icons. Use plain Image with sourceSize
scaled by Screen.devicePixelRatio, as the notification widgets
already do.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 17:02:52 -07:00
David Heinemeier HanssonandClaude Fable 5 4c38afeac3 Fetch high-res site icons for web apps instead of low-res favicons
Prefer the site's own apple-touch-icon (typically 180-512px) over
Google's favicon service, which often serves an upscaled 16-32px
favicon. Validate downloads are actual images so an HTML error page
never gets saved as an icon.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 17:02:52 -07:00
David Heinemeier HanssonandClaude Fable 5 f12abbdebb Use sudo for terminal DNS changes and drop needless command checks
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 16:45:17 -07:00
David Heinemeier Hansson fedf12c43c Make transcoded MP4 audio compatible 2026-07-22 16:39:00 -07:00
David Heinemeier Hansson 60a550a646 Add --fit OSD option and use it for system shutdown/reboot/logout 2026-07-22 16:33:54 -07:00
David Heinemeier Hansson 36329cee7a Launch 1Password installer when missing 2026-07-22 16:10:45 -07:00
David Heinemeier Hansson 1e928d58db Remove menu keywords feature 2026-07-22 16:06:55 -07:00
David Heinemeier Hansson 40ede7d0c0 Dev is more dangerous than edge 2026-07-22 15:54:55 -07:00
David Heinemeier Hansson 3177f7fd2c Use Netflix/fast.com endpoints for network speed test 2026-07-22 15:52:58 -07:00
David Heinemeier Hansson c899172c05 Use 'yy instead of yyyy in vertical clock date mode 2026-07-22 15:37:25 -07:00
David Heinemeier Hansson 0fc1884281 Show monitor hero top and hide brightness slider when no backlight 2026-07-22 15:35:07 -07:00
David Heinemeier HanssonandClaude Fable 5 4a02da20d5 Relaunch the shell through Hyprland so restarts match boot conditions
Spawning quickshell directly from omarchy-restart-shell leaked transient
environment variables from the calling terminal, SSH connection, or
development tool into the fresh shell. Dispatch the launch through
Hyprland instead so it inherits the canonical session environment, same
as autostart.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 12:44:09 -07:00
David Heinemeier HanssonandClaude Fable 5 6ff61289fa Show Remove... as the title of all submenus under Remove
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 12:04:25 -07:00
David Heinemeier HanssonandClaude Fable 5 43260b29cd Drop Moonlight from the Remove menu since it ships in the base install
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 18:37:40 -07:00
David Heinemeier HanssonandClaude Fable 5 e747c385b0 Hide Remove menu entries for things that aren't installed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 18:37:40 -07:00
David Heinemeier HanssonandClaude Fable 5 5aa9e4173d Add in-guest acceptance test suite
Runs inside a live Omarchy session (typically a VM installed by
omarchy-iso-test) and verifies the desktop actually works: session
health, application launches by window class, and shell surfaces via
IPC — including typing into the launcher and launching the top hit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 18:36:13 -07:00
David Heinemeier HanssonandClaude Fable 5 c70ae3a405 Group bar position under Style > Menu Bar and add transparency toggle
omarchy bar transparent now accepts toggle, flipping the current value
in one jq update (absent counts as opaque, matching the shell).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 16:47:36 -07:00
David Heinemeier Hansson dc71875ada Better naming and ordering 2026-07-21 16:32:57 -07:00
David Heinemeier HanssonandClaude Fable 5 2bf4f4a9fb Hide menu submenus when none of their children are visible
Static submenus and links now inherit visibility from their descendants,
so hardware sections like Touchpad Haptics disappear on machines without
the hardware instead of opening empty. Laptop Display and Mirror Display
are guarded by omarchy-hw-laptop.

The guard evaluator brace-wraps every when/checked condition before
silencing it, so conditions in the jsonc no longer need their own
>/dev/null plumbing, and parents no longer need to repeat their
children's guards.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 16:30:36 -07:00
David Heinemeier Hansson 9d3cb70ee7 More appropriate placement 2026-07-21 16:06:12 -07:00
David Heinemeier HanssonandClaude Fable 5 3107ec94e9 Resend nightlight temperature until it sticks on hyprsunset cold start
A freshly-started hyprsunset applies its default temperature at the end
of boot, silently overriding a set sent while it was still starting.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 16:01:49 -07:00
David Heinemeier Hansson 15fbc08ec0 Match indicator language 2026-07-21 15:59:40 -07:00
David Heinemeier Hansson d3cce6e68f Make menu left arrow navigate back 2026-07-21 15:45:08 -07:00
David Heinemeier Hansson 0d3cb4bf48 More appropriate placement 2026-07-21 15:41:37 -07:00
David Heinemeier HanssonandClaude Fable 5 afcbcc0e36 Replace shell instances with quickshell's synchronous kill
With quickshell-git, qs kill blocks until the instance has fully
exited, so restarting no longer needs to resolve pids and wait for them
to die. Kill in a loop until none remain - each call takes the oldest,
and duplicates from stale sessions are the reason this script exists.
The timeout bounds a wedged shell that can't process the quit message:
its kill would otherwise report success after Qt's 30s wait gives up,
re-killing the same undead instance forever. The test mock now kills
real processes synchronously to match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:27:12 -07:00
David Heinemeier HanssonandClaude Fable 5 21eacb324a Ship quickshell as quickshell-git for synchronous kill
quickshell 0.3.0's qs kill returns before the instance exits, forcing
restart tooling to babysit pids. Upstream fixed kill to block until the
process is gone, but only on master, so the Omarchy repo now carries
quickshell-git pinned past that fix. New installs get it from the base
packages; existing installs migrate with a single --ask 4 transaction so
the conflicting quickshell package is replaced in place, then restart
the shell after the update to pick up the new binary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:27:12 -07:00
David Heinemeier HanssonandClaude Fable 5 094619fbd5 Target the newest shell instance for IPC calls
qs parses -n before the ipc subcommand as its top-level --no-duplicate
launch flag and silently ignores it, so IPC still went to the oldest
matching instance - exactly the stale one left behind around a restart.
The --newest flag belongs to the ipc subcommand: qs ipc -n. Verified
against two live instances; the test now pins the flag position.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:27:00 -07:00
David Heinemeier HanssonandClaude Fable 5 289e6d12fc Simplify service lookups with optional chaining
The bar-null-shell-null-typeof-function ternary guarded against our own
shell missing a method it always defines. bar?.shell?.firstPartyServiceFor()
handles the only real case, delayed bar injection, in one line. The
typeof checks that probe genuinely third-party plugin objects stay.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:26:30 -07:00
David Heinemeier HanssonandClaude Fable 5 ba91bad3a4 Move Night Light onto a first-party nightlight service
Same treatment as Stay Awake: the indicator polled the toggle CLI over
a Process with a timer to paper over the race after clicking, and the
CLI ended by asking the shell to refresh every indicator over IPC. A new
omarchy.nightlight service owns hyprsunset instead - it probes the
temperature on startup, applies changes itself for in-shell toggles, and
answers on the nightlight IPC target. The indicator becomes a plain
binding. The CLI still drives hyprctl directly so keybindings, the menu,
and ssh work without the shell, but now just nudges the service to
re-probe since hyprsunset has no state file to watch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:26:20 -07:00
David Heinemeier HanssonandClaude Fable 5 61b7cd1c12 Size the indicator tray from block implicit sizes
Deriving the tray's implicit size from childrenRect fed layout results
back into the bindings that produced them, tripping implicitWidth
binding loop warnings. Compute it from the active and inactive blocks'
own implicit sizes instead, and center the loaded blocks rather than
anchor-filling containers that are sized by their content. The contract
test now instantiates the tray to check the collapse/expand cycle and
fails on any implicitWidth binding loop in the log.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:26:10 -07:00
David Heinemeier HanssonandClaude Fable 5 bee9ab476c Bind the Stay Awake indicator to the idle service
The indicator polled omarchy-toggle-idle over a Process and re-ran it on
a timer to toggle, while the CLI called back into the shell over IPC to
apply and refresh the state it had just changed. Now the indicator binds
straight to the idle service's stayAwake property and flips it in
process. The CLI only touches the state file, which the service already
watches, so toggling from keybindings and scripts still reaches the
shell without any reentrant IPC.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 15:25:49 -07:00
David Heinemeier Hansson 51d6d3c291 Fix Voxtype invitation action 2026-07-21 11:22:51 -07:00
David Heinemeier HanssonandClaude Fable 5 0526ebefcc Snap monitor scaling up to the nearest clean scale Hyprland accepts
Hyprland only takes scales where the mode divides into whole logical
pixels (in 1/120 steps), so picking 3x on a 1280x800 QEMU display threw
a red error overlay and silently kept the old scale. Round the request
up to the nearest clean divisor instead, so 3x becomes 3.2x.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:52:32 -07:00
David Heinemeier HanssonandClaude Fable 5 503388b4d6 Retune opacity for Hyprland 0.56's corrected alpha premultiplication
Hyprland 0.56 fixed premultiplication in the color-management shader
(hyprwm/Hyprland#14403), so the same opacity values now render visibly
more transparent than on 0.55. Raise each value to its perceptual
equivalent (a^(1/2.2)) to restore the previous look.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:22:16 -07:00
David Heinemeier HanssonandClaude Fable 5 f4a7b30366 Retune opacity for Hyprland 0.56's corrected alpha premultiplication
Hyprland 0.56 fixed premultiplication in the color-management shader
(hyprwm/Hyprland#14403), so the same opacity values now render visibly
more transparent than on 0.55. Raise each value to its perceptual
equivalent (a^(1/2.2)) to restore the previous look.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 21:15:47 -07:00
David Heinemeier HanssonandClaude Fable 5 994e4dfa7d Parse plain hyprctl binds output to survive Hyprland 0.56's broken JSON
Hyprland 0.56.0 emits invalid JSON from `hyprctl -j binds`: the new
allow_input_capture field was added to the format template at slot 16
but its argument at position 8, shifting every value from
has_description onward and landing unquoted strings in numeric slots.
The jq parse failure emptied the keybindings menu down to the two
static web-app entries — and the empty result got cached under a
stable key, permanently.

Parse the plain-format output instead, which is unaffected (and also
immune to the older quotes-in-args JSON breakage), refuse to cache a
record set with zero dynamic binds, and bump the cache version so
poisoned caches invalidate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 20:42:37 -07:00
David Heinemeier Hansson 79e9f38c0c Go with a consistent Reboot name 2026-07-20 19:10:27 -07:00