Skip to content

Quattro#6231

Draft
dhh wants to merge 1145 commits into
masterfrom
quattro
Draft

Quattro#6231
dhh wants to merge 1145 commits into
masterfrom
quattro

Conversation

@dhh

@dhh dhh commented Jul 17, 2026

Copy link
Copy Markdown
Member

Quattro Alpha

Omarchy 4 aka Quattro is the biggest release since the project started. The entire desktop shell has been reimagined in Quickshell: the bar, launcher, menus, notifications, on-screen displays, control panels, lock screen, and polkit agent now all live inside a single long-running shell process with a plugin architecture. That means Waybar, Walker, Mako, SwayOSD, hyprlock, hypridle, swaybg, and polkit-gnome are all gone, replaced by one coherent, fully-themed, IPC-scriptable shell.

You can upgrade an existing Omarchy installation to Quattro with the following command:

curl -fsSL https://omarchy.org/upgrade-to-quattro-dev | bash

This will put you on the alpha development version. So not something that's recommended for production systems. Ensure you have a good backup first!

Headline Features

  • Reimagine the entire desktop shell in Quickshell.
  • Move Omarchy internals from git to system packages.
  • Offer dual-boot installation when free space is available.
  • Shrink both the ISO (-1.2GB!) and memory footprint.
  • Convert all Hyprland configs to lua for full 0.55+ compatibility.
  • Expand theme coloring from base 8 to 24.
  • Use networkmanager for new network panel for greater compatibility.
  • Add nested search to Omarchy menu.
  • Add menu bar repositioning (top/bottom/left/right) and transparency.
  • Add menu bar panels for Tailscale + Dropbox.
  • Add weather panel with configurable location.
  • Add multiple users on a single installation.
  • Add Omawrite and Omacut as default applications.
  • Add Solitude and Last Horizon as new themes.
  • Add window position saving per workspace for quick layout restoring.
  • Add much-improve clamshell operations for laptops used with external monitors.

The Shell

  • Rewrite the entire desktop shell in Quickshell — bar, launcher, menus, notifications, OSDs, panels, lock screen, and polkit agent as plugins in one process by @dhh and @ryanrhughes
  • Add a new modular bar with interactive widgets: workspaces, active window, clock (click for ISO week format), weather, media (MPRIS), system tray, battery, keyboard layout, microphone, update indicator, and manual-state indicators (DND, night light, stay awake, screen recording, dictation, reminders)
  • Move the bar by dragging it to any screen edge — a ghost slab previews the target edge while you drag — and double-click empty bar space to toggle transparency (SUPER + SHIFT + CTRL + arrows works too)
  • Add a bar plugin system: third-party widgets and even whole replacement bars installed straight from git with omarchy plugin add <git-url> (landing disabled for code review first) by @ryanrhughes
  • Add a native launcher with fuzzy/acronym matching, live app icon indexing, and hidden-entry management (SUPER + SPACE)
  • Add a native notification daemon with popups, a history center with pending/past tabs (SUPER + SHIFT + ALT + ,), do-not-disturb, deduping, and replay of recent history after restarts
  • Add a native clipboard manager with image previews and sensitive-content exclusion (SUPER + CTRL + V)
  • Add a native emoji picker (SUPER + CTRL + E) and native volume/brightness/media OSDs
  • Add control panels for Audio (SUPER + CTRL + A), Bluetooth (SUPER + CTRL + B), Network (SUPER + CTRL + W), Display (SUPER + CTRL + D), and Power (SUPER + CTRL + P)
  • Add optional service widgets with full panels for Tailscale (connection control, exit-node picker with Mullvad nodes grouped by country) and Dropbox (login, storage, recent files) by @ryanrhughes and @dhh
  • Add a model-usage bar widget showing Claude Code/Codex usage stats, optionally synced across machines by @ryanrhughes
  • Add a Google Meet picture-in-picture widget by @ryanrhughes
  • Replace hyprlock with shell-powered password and fingerprint PAM flows.
  • Move the Omarchy menu into the shell as a filterable, nested command palette defined in JSONC (extensible via ~/.config/omarchy/extensions/omarchy-menu.jsonc)

Theming & Aesthetics

  • Add a visual theme switcher: a filterable carousel of live theme previews (SUPER + SHIFT + CTRL + SPACE)
  • Add a visual background switcher in the same style (SUPER + CTRL + SPACE)
  • Add Last Horizon and Solitude themes by @HANCORE-linux
  • Add a Pi theme based on the system theme by @ryanrhughes
  • Add a semantic theme color system with normalized color names by @bjarneo
  • Add integrated corner controls (rounded/sharp) applied across Hyprland, notifications, lock screen, and menus
  • Add themed Hyprland gradient borders in the new shell by @ryanrhughes
  • Add a generated VS Code theme extension by @ryanrhughes
  • Add Tab/Shift+Tab navigation in the theme and background switchers by @bjarneo

Apps & Defaults

  • Add Omawrite, a dead-simple Markdown writing app, as the default writing tool replacing Typora (SUPER + SHIFT + W)
  • Add Omacut, a dead-simple video length trimmer built on ffmpeg
  • Switch the default terminal to Foot
  • Add a yt-dlp-powered "Download Video" Chromium extension
  • Add Sunshine game streaming (with autostart toggle) and the Moonlight client
  • Add automounting of removable drives via udiskie by @ryanrhughes
  • Add mpv MPRIS support so media keys control mpv by @berenddeboer
  • Use dua for disk usage by @crmne and @dhh
  • Move Signal, Spotify, and 1Password to on-demand installs and remove Figma + GitHub from the defaults.
  • Switch to the lighter basic JetBrains Mono Nerd font

Capture

  • Add relatively sized preview to the live webcam overlay on screen recordings (and offer further tweaks via SUPER + ALT + [ / ].
  • Add full-screen capture with RETURN while the region picker is open.
  • Add optional rsync of screenshots to a remote host (handy for forwarding to remote AI runners) via rsw/lsw/dsw commands.
  • Handle rotated monitors in the recording region picker.
  • Trash imv deletions and add Ctrl+E to edit in Satty by @jondkinney

Controls

  • Convert the Hyprland configuration to Lua: bindings, monitors, and toggles are now expressive Lua (o.bind("SUPER + SHIFT + W", "Omawrite", { launch = "omawrite" })) by @ryanrhughes
  • Add save/restore of window widths per app and workspace on SUPER + ALT + HOME / SUPER + HOME
  • Add fine (±25px) and coarse (±300px) window resizing tiers by @zaborowskimichal and @dhh
  • Add alternative media next/previous bindings for keyboards with only a play button by @dhh
  • Add a tmux keybindings viewer (SUPER + ALT + K) and new-pane/split bindings for tmux, kitty, ghostty, and alacritty by @ryanrhughes, @vtmx, @heymaikol, and @dhh
  • Add laptop clamshell handling with idempotent scale recovery, internal-display toggle, and display mirroring by @dhh

Networking/Connections

  • Add ping, live up/down stats, speed test, and DNS provider selection to the network panel by @dhh
  • Add per-device Bluetooth pairing, connection state, and forget/disconnect flows by @dhh
  • Add audio output/source switching that preserves playback, with recovery when audio services get stuck by @dhh
  • Switch Wi-Fi management to NetworkManager, replacing iwd/impala/bluetui/wiremix with the shell panels by @dhh

System & Upgrade

  • Re-architect Omarchy into proper Arch packages with system files shipped via /etc, so updates flow through pacman by @ryanrhughes
  • Add an ALPM guard that routes system updates through omarchy update (bypassable via OMARCHY_ALLOW_DIRECT_PACMAN=1) by @ryanrhughes
  • Switch privilege escalation to pkexec/polkit with a themed prompt that shows exactly what's being authorized by @dhh
  • Switch lazy-loaded tools (Claude Code, GitHub CLI) from npm to mise, and add a 5-day lag on new npm package installs to dodge zero-day supply-chain exploits (but offer mup alias to get instant updates) by @dhh
  • Add pre-refresh-pacman.d hooks for custom repository support by @tyvsmith
  • Persist Bluetooth power state across reboots by @heymaikol
  • Enable Docker multi-arch builds by default by @axelfontaine
  • Add weather locations that can be pinned to a chosen place instead of following IP geolocation by @dhh
  • Add SSHD setup and removal under Setup/Remove > Security by @dhh
  • Remember explicit power profile choices per power source (AC/battery) across reboots by @dhh
  • Pin Chromium-based browsers to the gnome-libsecret password store, so backend autodetection can't silently log you out of everything by @nt1998

Fixes

  • Fix fontconfig monospace binding overriding app-specific fonts by @Ninso112
  • Fix power profile race on plug/unplug events by @aikazu
  • Fix brightness indicator glitches from hardware key auto-repeat by @mateuszkowalczyk
  • Fix brightness OSD width jitter across percentages by @Pegorim
  • Fix transparent-bar flicker and systray action handling by @kevinmcconnell
  • Fix phantom display scaling by reading the configured scale in clamshell recovery
  • Fix notification expire timeouts being treated as seconds instead of milliseconds
  • Fix new windows — including browser windows and portal file dialogs — opening on the wrong workspace by @scottjones and @dhh
  • Fix the LUKS passphrase prompt ignoring the configured keyboard layout by bundling vconsole.conf in the initramfs (Latin layouts) by @Zeus-Deus
  • Prevent empty disk encryption passwords in the installer by @heymaikol
  • Fix power-profile udev rule wakeup failures from a fixed unit name by @DiegoMirner
  • Prevent the migration notifier from rate-limiting itself into silence by @Pegorim
  • Align snapshot pruning with Snapper's retention (off-by-one) by @Pegorim
  • Wake the internal display only when actually leaving clamshell by @monorkin
  • Force software cursors on nouveau by @stephentaylor-com
  • Install sof-firmware on all Intel SOF audio platforms so more laptops get working sound out of the box
  • Fix monitor scale-down getting stuck at 3x due to floating point drift
  • Keep software-composited cursors out of screenshots
  • Fix new terminals not opening in the current directory on Kitty
  • Fix fip and friends misparsing under zsh by @pkwagner
  • Clear the launcher/menu filter with CTRL + BACKSPACE by @RushiChaganti
  • Only bind F9 to Voxtype when it's installed by @r3quie

Feature presentations

The theme switcher

Switching themes is now a more visual affair: a filterable carousel of live previews for every installed theme, opened with SUPER + SHIFT + CTRL + SPACE or via Style > Theme. You can see the new bar riding on top too.

theme-switcher

The background switcher

Backgrounds get the same treatment on SUPER + CTRL + SPACE: flip through the current theme's backgrounds (plus any you've added) and see exactly what you're picking.

bg-switcher

The launcher

Walker has been replaced by a native launcher with fuzzy and acronym matching, live icon indexing (freshly-installed apps show up with their icons immediately), and the ability to hide entries you never use. Still on SUPER + SPACE.

launcher

The Omarchy menu

The menu is now a native, filterable command palette living inside the shell. Same SUPER + ALT + SPACE muscle memory, instant response, and extensible through a JSONC file if you want to add your own entries.

menu

Control panels

The bar widgets now open real control panels. Audio (SUPER + CTRL + A) has output/input device switching and volume control:

audio-panel

Network (SUPER + CTRL + W) shows live throughput, ping, packet loss, a one-click speed test, DNS provider selection, and nearby networks:

network-panel

And weather now has a proper forecast panel, which can be pinned to a chosen location instead of following your IP around:

weather-panel

A bar you can grab

There's no settings panel for the bar — you just grab it. Click and hold any empty stretch of bar and drag it toward a screen edge, and a ghost slab previews where it will dock. Drop it on the left or right and it turns into a vertical bar. Double-click empty bar space to toggle transparency. Widgets are added, removed, and rearranged with omarchy bar plugin, and third-party widgets install straight from git.

bar-left

Privilege escalation with context

Omarchy now uses pkexec/polkit for privileged operations, with a themed prompt that tells you exactly what command you're authorizing before you type your password.

polkit

Omawrite

Typora is out, and Omawrite is in. A dead-simple Markdown writing app that opens in a blink, autosaves as you type, and stays out of the way. Bound to SUPER + SHIFT + W. Free software.

omawrite

Omacut

A dead-simple video trimmer to go with it. Drop in a clip — like the screen recordings Omarchy takes — drag the handles on the filmstrip, and export the cut with ffmpeg doing the heavy lifting.

omacut

dhh and others added 30 commits July 18, 2026 21:42
Adapt the fix from PR #6161 to Quattro's per-user hardware setup and add coverage for detection, idempotency, and proprietary-driver handling.
Bundling vconsole.conf makes Plymouth apply the user's layout at the LUKS
prompt, but for layouts whose letter keys aren't Latin (Hebrew, Greek,
Cyrillic, Arabic, ...) that makes the necessarily-Latin passphrase
untypeable and locks the user out of their machine.

mkinitcpio sources its conf.d drop-ins as shell, so omarchy_hooks.conf now
checks XKBLAYOUT at every rebuild and only bundles the file for Latin
layouts; non-Latin layouts keep the US fallback the passphrase was set
under. A migration strips the unconditional line and rebuilds the UKI on
affected installs.

Closes #6229.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Hyprland can report a scale set to 3 as something like 3.0000000000000004.
The previous directional comparison treated that as above the 3 preset, so
Super+Alt+Slash (scale down) would stay at 3 instead of reaching 2.

Snap the reported scale to the nearest preset first, then step up/down.
Add a regression test for the floating-point case.
Explicit profile selections from the power panel or menu are now saved
under an ac/battery key in ~/.local/state/omarchy/powerprofiles and
reapplied on boot and on plug/unplug. Only successful, user-made
selections are persisted, so the performance/balanced defaults still
apply when nothing has been chosen.

All entry points key off the same power signal, UPower's OnBattery:
the shell reads it natively and omarchy-powerprofiles-set autodetect
queries it via busctl. This replaces the sysfs online checks, which
disagreed with the shell on desktops without power_supply entries and
lagged behind plug events on some USB-C laptops.

Plug/unplug switching moves from the udev rule into the shell's battery
service, which already receives UPower's debounced state changes, so
the udev rule and its settle-sleep workaround are gone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Use tmux to list keybindings

* Annotate tmux keybindings

* List unannotated bindings too and let the isolated server exit on its own

list-keys -aN falls back to the raw command when a binding has no note,
so user-added bindings in an existing tmux.conf still show up. Dropping
exit-empty off means the throwaway server exits when the client
disconnects instead of relying solely on the trap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Restore the key translation the awk parser used to do (C-M-S-Left →
CTRL + ALT + SHIFT + LEFT, PPage → PAGE UP, etc) as a display pass over
the tmux list-keys output, along with the PREFIX header line and the
COPY MODE table label.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
omarchy-restart-shell now kills by config dir via quickshell kill and
relaunches with --no-duplicate, polling kill until every instance is
gone since kill returns without waiting and -n silently exits if one
remains. The locked-session refusal reads Hyprland monitor state alone,
which covers a hung shell holding the lock; the redundant shell IPC
probe, availability guards, and omarchy-shell path indirection are gone.

Shell IPC calls now time out (2s default, OMARCHY_SHELL_IPC_TIMEOUT to
override) so probing an unresponsive shell fails fast instead of
hanging the caller.

omarchy-hyprland-launch checks dispatch output for "ok" rather than the
exit code, which is 0 even on Lua errors, so a failed dispatch falls
through to the bash -lc fallback instead of silently launching nothing.

The Quattro upgrade cutover delegates to omarchy-restart-shell instead
of carrying its own copy of the lock check, pkill, and readiness loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The skill still described pre-Quattro .conf files and workflows, sending
agents to inactive config files and stale commands. Now covers the Lua
config layout, o.bind/hl.unbind/hl.monitor forms, .d hook directories
with omarchy hook install, plugin cloning, and corrected command routes.

Distilled from #6310.

Co-Authored-By: ssupt <149246609+ssupt@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Jon Kinney <jonkinney@gmail.com>
Long passwords used to overflow the input field and clip with no
feedback that typing was still registering. Scale the dot size and
letter spacing down as the password grows, like macOS, so every
keystroke stays visible.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…dialogs) (#6317)

Set misc:initial_workspace_tracking = 0 so new windows appear on the currently
active workspace rather than the one their process was first launched on.

Without this, file-picker dialogs drawn by xdg-desktop-portal-gtk (browser
Open/Save, GTK app choosers, etc.) always open on the workspace where the portal
process started at login (typically workspace 1) instead of following the app
that requested them. So a Save dialog triggered from a browser on workspace 2
pops up on workspace 1, out of view.

Trade-off: an app launched on one workspace that switches away before its window
maps will now open on the new active workspace. In practice the dialog-follows-app
behavior is the more intuitive default.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
With initial workspace tracking disabled, windows naturally open on the active workspace. Remove the explicit Hyprland workspace dispatch and let shell actions, shell restarts, and presentation terminals launch directly.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* emoji panel: handle CTRL+BACKSPACE to clear filter

* shell: handle CTRL+BACKSPACE to clear filter in all search overlays

* Indentation fix for pull request finding

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

* menu filters: align keyboard editing with Qt standard shortcuts

* menu filters: extract shared filter-editing helpers

* Potential fix for pull request finding

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

* potential fix for pull request findings

* Only treat filter edit keys as edits when they change the text

Backspace/Ctrl+U on an empty filter no longer calls setFilter(""),
which was resetting the list selection back to the top. This also lets
the menu's empty-filter Backspace fall through to goBack() with any
modifier held, as it did before the Util extraction.

Co-Authored-By: Claude Fable 5 <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 Fable 5 <noreply@anthropic.com>
Chromium-based browsers auto-detect their os_crypt backend at launch. On
Hyprland the xdg-desktop-portal Secret backend has no provider, so the
autodetect can fall back to the 'basic' (v10) store, making previously
v11-encrypted cookies and saved passwords undecryptable — the user is
silently logged out of everything. Pin gnome-libsecret (the stock
omarchy keyring) so the backend is deterministic, matching what we
already do for VSCode.

Migration covers chromium, brave, chrome, and edge flags confs for
existing installs.

Co-authored-by: Niklas Tscheppe <ntscheppe@drgt.net>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ports #6092 from master: the video-app opacity opt-out only matched
Chrome/Chromium on the default profile, so Brave, Edge, and non-default
profiles kept the translucent default-opacity styling.

Co-Authored-By: Zeus-Deus <github.commits@widow.cc>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tuned muted, dark_foreground, and lighter_background to the tiers the
explicit themes used, which also fixes muted falling back to pure white
in the generated terminal configs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Brave now publishes brave-origin-bin on AUR, so use it instead of
brave-origin-beta-bin. The stable wrapper also parses flags files
correctly, so Brave Origin can use the normal chromium flags like
the other Chromium-based browsers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The stable Brave Origin's process is named plain "brave" (the wrapper
execs /opt/brave-origin-bin/brave), so pgrep -x brave-origin never
matches, and pgrep -f brave-origin also matches the installer's own
floating terminal - which made omarchy-install-browser launch a
headless browser and hang on first install.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The colorset is the Monokai Pro Ristretto palette, so the generated
themes keep all the accent colors. Brightened muted to Monokai Pro's
actual comment color, since comments sit on that key.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The lock service arms a 5s blank timer whenever the screen locks, and
input at the lock screen re-arms it. Closing the lid sprays pointer
noise over the lock surface, so the timer was routinely armed right
before suspend, froze mid-countdown, and fired moments after resume --
blanking the freshly woken unlock screen under the user.

Guard the timer with a wall-clock check: if far more time elapsed than
the interval, the countdown slept through a suspend, so take a fresh
run-up instead of blanking. This also blanks the lock screen 5s after
an untouched resume.

Two accomplices made the flash worse and hid the real bug:

- The clamshell watcher's 2s poll fired an unconditional global DPMS
  enable whenever no external monitor was active, relighting any blank
  within 2 seconds (lock-screen blanking never stuck on undocked
  laptops) and racing the resume modeset. Recovery now only wakes
  displays when it actually re-enables one.

- Every keystroke at the lock screen dispatched a redundant DPMS
  enable via omarchy-system-wake, forcing extra modesets in the
  fragile just-resumed DRM state. Brightness "on" now skips the
  dispatch when every active display is already lit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fixing to screenrecording instead screenrecord that works only when
using the alias
Adds shift:both_capslock alongside compose:caps so pressing both Shift
keys together toggles real Caps Lock. Caps Lock alone remains the
Compose key, and single-Shift behavior is unchanged. Provides an escape
hatch when Caps Lock gets stuck on (e.g. after an fcitx5 desync).

Closes #5981

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.