Commit Graph
5562 Commits
Author SHA1 Message Date
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
1c30b83733 fix(clock): display date, week, and year vertically in vertical bar. (#6336)
* fix(clock): display date, week, and year vertically in vertical

* fix vertical date alignment in panel

* Update Clock.qml

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Address review feedback on Clock vertical format

Use the BarWidget-provided `vertical` property instead of repeating the
`bar && bar.vertical` ternary, and clean up stray tab/trailing whitespace.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 15:31:39 -07:00
ssuptandGitHub 3481b5614b Fix pointer navigation in Quattro launcher menus (#6343)
Accumulate sub-threshold movement so slow motion with a flat acceleration profile updates selection. Sample pointer state on row entry and carry pointer intent through subordinate menus while preserving predictable keyboard selection.
2026-07-22 15:27:56 -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
David Heinemeier HanssonandClaude Fable 5 c99c723b67 Show OSD feedback when rebooting or shutting down
Adds named reboot and shutdown OSD icons, and gives the touchscreen
toggle a proper gesture-tap glyph instead of the restart arrow it
was accidentally using.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 18:35:41 -07:00
David Heinemeier HanssonandClaude Fable 5 bf15e896b9 Pin power action timers to 100ms accuracy
Transient systemd timers default to AccuracySec=1min, so the 2s
reboot/shutdown could fire up to a minute late.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 18:35:28 -07:00
David Heinemeier HanssonandClaude Fable 5 ab0f6a8f2c Fast-poll Tailscale and Dropbox at shell startup so icons go live promptly
Both services fire one status poll when the shell starts, but after a fresh
boot that lands before tailscaled has connected or dropboxd has finished its
respawn dance, leaving the bar icons stale for a full 30s/60s refresh
interval. Re-poll every 2s until the service shows up (or ~30s pass), then
hand off to the normal periodic refresh.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 18:35:19 -07:00
David Heinemeier HanssonandClaude Opus 4.8 0f691d60fb Scale the Dell XPS 13 default via display text size
Use omarchy-display-text-size 11 instead of a lone GTK text-scaling-factor,
so the XPS 13 nudge moves shell, GTK, and terminal text together.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 18:08:17 -07:00