Skip to content

Omarchy Quattro - #6231

Closed
dhh wants to merge 2125 commits into
masterfrom
quattro
Closed

dhh wants to merge 2125 commits into
masterfrom
quattro

Conversation

@dhh

@dhh dhh commented Jul 17, 2026 •

Copy link
Copy Markdown
Contributor

Omarchy Quattro: Release Candidate

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 by first Update > Omarchy, then Update > Channel > RC, then Update > Omarchy to Quattro. Just remember to Update > Channel > Stable after the final release!

Or install it fresh on a secondary machine using the ISO: https://iso.omarchy.org/omarchy-4.0.0.rc4-2.iso

Always take a backup of important data!

screenshot-2026-08-13_17-03-14-medium

Headline Features

  • Reimagine the entire desktop shell in Quickshell.
  • Move Omarchy internals from git to system packages for safely separating user modifications.
  • Offer dual-boot installation when free space is available (remember to turn off Bitlocker for Windows!).
  • Setup a machine for a new owner during install, so OEMs and gift givers can prepare a machine for others.
  • Allow for factory reset (Setup > Reset Computer) from new Quattro installs for safe resale/gifting of your machine.
  • Shrink the ISO by over a gigabyte (now under 6GB!).
  • Speed-up installation by +30% (sub-minute installs now possible!).
  • Convert all Hyprland configs to lua for full 0.56 compatibility.
  • Expand theme coloring from base 8 to 24 so btop/nvim/vscode themes can be autogenerated.
  • Use networkmanager for new network panel for greater compatibility.
  • Add nested search to Omarchy menu and merge the launcher into that one unified menu (Super + Space).
  • Add text scaling across the shell, GTK, and terminals in one move via the Display panel.
  • Add speaker tunings for 2026 XPS 14/16 laptops for dramatically better sound.
  • Add menu bar repositioning (top/bottom/left/right) and transparency.
  • Add menu bar panels for Tailscale + Dropbox.
  • Add weather panel with configurable location.
  • Add plugin system and full ecosystem.
  • Add Omawrite, Omacut, and Omacalc as default applications.
  • Add a configurable default coding agent with instant launch shortcuts and crash diagnosis.
  • Add Solitude, Last Horizon, and Lupine as new themes.
  • Add window position saving per workspace for quick layout restoring.
  • Add much-improved 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 (you can also set this via Setup > Menu Bar in the Omarchy menu)
  • Add a bar plugin system: third-party widgets and even whole replacement bars installed straight from git with omarchy plugin add <git-url>, and managed from Setup > Plugins (add, clone, enable, disable, remove) by @ryanrhughes and @dhh
  • Add a native launcher with fuzzy/acronym matching, live app icon indexing, and hidden-entry management — now merged into the Omarchy menu itself, so SUPER + SPACE searches apps and commands from one surface
  • Add a dedicated apps-only menu on SUPER + ALT + SPACE
  • Add a native notification daemon with popups, do-not-disturb, deduping, and a replayable history: SUPER + SHIFT + ALT + , brings back the last ten notifications exactly as they were shown, including the ones do-not-disturb silenced — and popups on screen survive shell restarts (like the one every update performs), so critical alerts always make it across by @ryanrhughes and @dhh
  • Dismiss notification popups with a right-click by @taxin-404
  • Add a native clipboard manager with image previews and sensitive-content exclusion (SUPER + CTRL + V)
  • Add a native emoji picker (SUPER + CTRL + E) replacing Walker picker
  • Add native volume/brightness/media OSDs replacing swayosd
  • 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) replacing bluetui, impala by @dhh and @ryanrhughes
  • 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/Fireworks usage stats and count from all the major harnesses by @ryanrhughes + @dhh
  • Add a Google Meet picture-in-picture widget by @ryanrhughes
  • Offer 12-hour AM/PM clock formats when right-clicking the bar clock by @scottjones
  • Add a battery percentage readout toggle to the power widget on right-click
  • Replace hyprlock with shell-powered password and fingerprint PAM flows, and invite you to enroll a finger on first run when a reader is present — with fingerprint offers on the lock screen, polkit, and sudo gated by lid state
  • Move the Omarchy menu into the shell as a filterable, nested command palette defined in JSONC (extensible via ~/.config/omarchy/extensions/omarchy-menu.jsonc) by @ryanrhughes and @dhh
  • Make the shell event-driven rather than polled: status indicators, monitor and network state, and the background all react to signals now, so an idle desktop stops burning CPU
  • Expose the battery percentage toggle in the Omarchy menu by @bwynnyck
  • Open the bar's right-side panels with SUPER + CTRL + 1 through 9, counted left to right — rearranging the section or adding a widget renumbers them with no binding to rewrite by @dhh
  • Ship the keyboard layout widget on the bar by default: hidden while only one layout is configured, click to cycle, and labeled with the xkb language code (EN, PT, AR) instead of a truncated description by @dhh and @defer
  • Add the Discord community and Herdr's keybindings viewer to the Learn menu by @dhh

Theming & Aesthetics

  • Add a visual theme switcher: a filterable carousel of live theme previews (SUPER + SHIFT + CTRL + SPACE) by @dhh
  • Add a visual background switcher in the same style (SUPER + CTRL + SPACE) by @dhh
  • Add a semantic theme color system with normalized color names by @bjarneo
  • Add generation of neovim, VS Code, and btop configs straight from a theme's expanded colorset, so themes carry fewer hand-maintained files by @bjarneo, @ryanrhughes
  • Add Last Horizon and Solitude themes by @HANCORE-linux
  • Add Lupine theme by @bjarneo
  • Add ~/.config/omarchy/shell.toml as a machine-level override merged over the active theme, so a personal font, spacing, or bar tweak survives theme switching — and it's watched, so edits re-flow the shell live
  • Bring back the classic Omakub background in Tokyo Night for early-Linux-adoption nostalgia
  • Add a Quattro background by @vulturetone plus a new winding-road launch background for Tokyo Night, and retire the backgrounds no longer worth shipping
  • Add a Pi theme based on the system theme by @ryanrhughes
  • Sync the active Omarchy theme to Claude Code by @MoizIbnYousaf
  • Add integrated corner controls (rounded/sharp) applied across Hyprland, notifications, lock screen, and menus by @ryanrhughes and @dhh
  • Add omarchy display text size: one knob, 9–20px, that moves the shell font, GTK's text-scaling-factor, and the terminal point size in lockstep, with a notched slider in the display panel

Apps & Defaults

  • Add Omawrite, a dead-simple Markdown writing app, as the default writing tool replacing Typora (SUPER + SHIFT + W) by @dhh
  • Add Omacut, a dead-simple video length trimmer built on ffmpeg by @dhh
  • Add Omacalc, a dead-simple calculator replacing GNOME Calculator (SUPER + CTRL + Q) by @dhh
  • Add a configurable default coding agent: pick Claude Code, Codex, OpenCode, Pi, Oh My Pi, Gemini, Grok, Copilot, or Crush under Setup > Defaults > Agent, then launch it with SUPER + SHIFT + CTRL + A or the a terminal alias — lazy-installed on first use, opened as its own org.omarchy.agent app, and started in ~/Work when summoned from home so trust actually sticks by @dhh
  • Switch the default terminal to Foot for better resource utilization by @dhh
  • Add a yt-dlp-powered "Download Video" Chromium extension (on any URL with a video press Alt + Shift + D) by @dhh
  • Switch the default image annotator from Satty to Tensaku by @ryanrhughes
  • Add Moonlight client for Sunshine game/desktop streaming as new default by @dhh
  • 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
  • Make WhatsApp Web follow the system light/dark theme, and collapse it to a Signal-style avatar rail in slim windows by @scottjones and @dhh
  • Move Signal, Spotify, and 1Password to on-demand installs and remove Figma + GitHub from the defaults by @dhh
  • Switch to the lighter basic JetBrains Mono Nerd font to save 200mb on install by @dhh
  • Install ChatGPT as a real desktop app under Install > AI, dropping the web app from the defaults so the launcher can't show two identical entries by @dhh
  • Share files and folders over LocalSend through the desktop file chooser, instead of an fzf pick over a find of the whole home directory in a terminal by @dhh

Capture

  • Add relatively sized preview to the live webcam overlay on screen recordings (and offer further tweaks via SUPER + ALT + [ / ]) by @dhh (on request from @jasonfried)
  • Drive the region picker from the keyboard: RETURN captures the highlighted window, CTRL + RETURN the whole display, and TAB and the arrow keys move the selection through the workspace's windows by @jzimdars and @dhh
  • Add QR code capture: select a region and the QR code inside it decodes straight to the clipboard, so an otpauth:// setup code on screen no longer needs a phone. The decoded value never touches disk and is marked sensitive, so clipboard history skips it by @dhh and @Wondertan
  • Handle rotated monitors in the recording region picker.
  • Trash imv deletions and add Ctrl+E to edit in Tensaku 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 by @dhh
  • Add external monitor brightness via DDC/CI: the brightness keys and OSD now control the focused external display, while laptop panels keep using the kernel backlight by @ssupt
  • Add fine (±25px) and coarse (±100px) window resizing tiers by @zaborowskimichal and @dhh
  • Add alternative media next/previous bindings for keyboards with only a play button by @dhh
  • Ship Herdr alongside tmux with matching keybindings, configuration, and hdl/hds/hdlm/hsl development-layout helpers 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
  • Open Herdr with SUPER + CTRL + RETURN and its keybindings viewer with SUPER + CTRL + K, mirroring the tmux pair — plus tmux's tab moves, zoom flag, hostname in the window title, and hidden outer pane frame carried over by @dhh
  • Add laptop clamshell handling with idempotent scale recovery, internal-display toggle, and display mirroring by @dhh
  • Toggle Caps Lock by pressing both Shift keys by @tyvsmith

Networking/Connections

  • Add ping, live up/down stats, speed test, and DNS provider selection to the network panel by @dhh
  • Add Wi-Fi QR sharing to the network panel, so another device can join with a scan by @tobi
  • Add a Wi-Fi band toggle to the network panel by @dhh
  • Add per-device Bluetooth pairing, connection state, and forget/disconnect flows by @ryanrhughes and @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
  • Connect to enterprise (802.1X) Wi-Fi networks from the network panel by @KazeTachinuu
  • Clean up the terminal and reconnect when an SSH connection drops: a remote tmux, herdr, or editor that dies with the link no longer leaves mouse tracking and the alternate screen armed on your local terminal, and an established interactive session comes back on its own. Client keepalives make the drop show up in about 45 seconds instead of whenever TCP gives up 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 keep their wrappers plus omarchy update on current releases instead of waiting out the release cooldown by @dhh
  • Launch apps in their own systemd scopes instead of the compositor's cgroup, and let systemd-oomd take out a runaway app instead of losing the whole session by @defer and @dhh
  • Warn when disk space is low before updating by @ericvrp
  • Add pre-refresh-pacman.d hooks for custom repository support by @tyvsmith
  • Persist Bluetooth power state across reboots, by making an rfkill soft block the state systemd restores at boot rather than forcing the adapter off every time, and carrying existing installs across by @heymaikol and @dhh
  • 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
  • Ship NordVPN directly from the Omarchy package repository by @dhh
  • Add per-laptop speaker tunings: a PipeWire filter chain in front of the internal speaker sink, matched by DMI string, restoring the voicing the vendor's Windows DSP does and Linux doesn't. Shipping for the XPS 14 and 16; adding a machine is two data files and no new code by @dhh and @spencerbull
  • Tune swap on zram instead of leaving it at kernel defaults, so large machines stop reaching for the hibernation swapfile early 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
  • Add a reproducible read/write disk speed test under Trigger > Speed Test, sharing the live dial interface with the network test by @dhh
  • Harden the Quattro upgrade by preserving and verifying boot-critical kernel parameters, forcing a fresh package database before keyring installation, surfacing partial-transition failures, and keeping the NetworkManager/iwd handoff safe — including unmasking a wpa_supplicant left masked from the iwd era by @tmn73 and @dhh
  • Report when an update proceeds without the Snapper snapshot it expected, instead of claiming a snapshot that was never created, by @nille
  • Add deferred first-boot provisioning: an install can finish with no user at all, and the machine's owner picks their keyboard, account, hostname, and timezone on the first boot instead — behind the same logo, progress bar, and rotating tips the ISO installer uses. On an encrypted disk the LUKS volume is re-keyed from the throwaway install passphrase to the owner's password, all-or-nothing, with every other slot killed by @dhh
  • Add Setup > Reset Computer: swap the running root for a fresh clone of the @factory snapshot the ISO takes at install time, scrub machine identity, accounts, and fingerprint enrollments, and hand the machine back in that untouched first-boot state. A machine with no factory snapshot is turned away with an explanation rather than given a partial wipe by @dhh
  • Swap terminaltexteffects for ttfx, a Rust port rendering byte-identical frames as a single dependency-free binary: the screensaver starts in ~1ms instead of ~107ms, holds its frame rate on the heavier effects, and the base image no longer needs Python for it by @dhh
  • Greet the first login with a toast that opens the keybindings menu when clicked, and wait for NetworkManager to actually settle before deciding you have no Wi-Fi or offering an update by @dhh
  • Offer an AI diagnosis when a process crashes: systemd-coredump's journal stream raises a "Process crashed" toast, and clicking it briefs your default agent on the core with a diagnose-crash skill that covers symbolizing the backtrace and — only with your agreement, and after a duplicate search — reporting a confirmed Omarchy bug upstream by @dhh
  • Prune the package cache with paccache -rk2 as the first step of an update, before the snapshot so the space is actually reclaimed, and keeping one spare version so the offline downgrade path survives by @dhh
  • Detect NVIDIA GPUs from sysfs instead of lspci, which resumed a runtime-suspended discrete GPU out of D3cold and spent more than Hyprland's entire 1.5s config-load budget waking it — and classify by device ID, so pre-Maxwell cards stay off a driver that can't drive them and the Maxwell/Pascal parts the name regex missed are picked up by @dhh
  • Simplify the Quattro upgrade: follow the channel the machine is already on instead of dropping rc machines onto stable, leave the Omarchy 3 session running until the reboot that is the real cutover, shim the legacy Hyprland defaults from the on-disk backup rather than a network fetch of master, run the packaged firewall config so upgraded machines get the ufw-docker rules too, and clear the Hyprland error bar the swap used to leave on screen by @dhh

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 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 when changing the drive password by @heymaikol
  • Align snapshot pruning with Snapper's retention (off-by-one) by @Pegorim
  • Force software cursors on nouveau by @stephentaylor-com
  • Keep software-composited cursors out of screenshots by @dhh
  • Fix new terminals not opening in the current directory on Kitty
  • Fix fip and friends misparsing under zsh by @pkwagner
  • Only bind F9 to Voxtype when it's installed by @r3quie
  • Prefer Noto Naskh Arabic over Nastaliq Urdu for Arabic text by @husamemadH
  • Run the screensaver on every monitor, not just the last one, by @scottjones
  • Switch Brave Origin from the beta to the stable release by @virtualabishek
  • Fetch high-res site icons for web apps instead of blurry favicons by @dhh
  • Resend the night light temperature until it sticks on a hyprsunset cold start
  • Fall back to the XDG MIME browser handler when xdg-settings names no browser by @ShiroKSH
  • Fit the About window to its rendered content so long values, custom fonts, and branding cannot wrap over the logo or clip — and open it at the size it last settled on by @28allday and @dhh
  • Fix background cycling for filenames with glob characters
  • Fix suspend and fan defaults on T2 Macs
  • Stop the Tuxedo/Slimbook backlight fix from aborting hardware setup
  • Fix the keyboard-layout migration aborting when vconsole.conf is missing or defines no layout by @acidkill
  • Fix hardware-detection false negatives under pipefail, rerun the T2 defaults migration they skipped, and choose the gmux display backlight instead of the Touch Bar on T2 Macs
  • Find UKIs through a restricted /boot on encrypted installs, fixing direct-boot setup and stale-UKI cleanup
  • Close three code-execution paths a malicious theme could take through install (colors.toml values reaching GNU sed's e flag, an unescaped VS Code theme name, unvalidated keyboard RGB), and drop the unconstrained tzupdate sudoers grant that let any wheel user write a root-owned symlink anywhere by @KazeTachinuu
  • Recover a monitor Hyprland brought up at 0x0 because it was powered off at boot: the connector never drops at DRM level, so powering the screen on fires no event and it stayed black until a reboot by @dhh
  • Apply the Broadcom Wi-Fi quirk to Macs without a T2, gating on the PCI IDs brcmfmac actually binds rather than the T2 bridge, and repair machines installed before it shipped — these fail the WPA four-way handshake against a WPA2/WPA3 transition-mode access point and report the password as wrong by @cupatea
  • Give non-login shells the system locale, so bash started by SSH or herdr's remote bridge stops printing \u escapes instead of characters by @dhh
  • Repair the theme symlinks the state-move migration left dangling with an unexpanded literal ~, which cost btop, Helix, and VS Code their theme while the migration reported success by @shrijit37
  • Rebuild the boot images the Plymouth migration left stale, which kept encrypted machines falling back to an unthemed text LUKS prompt by @dhh
  • Fix --help being ignored for commands that resolve with arguments left over, like omarchy update aur --help by @EFrMG and @dhh
  • Drop the kms hook when the proprietary NVIDIA driver handles early KMS, cutting nouveau and ~100MB of its firmware from every initramfs on NVIDIA-only machines — existing images are rebuilt on upgrade by @matjam
  • Stop hybrid GPU mode queries and the menu's hybrid-GPU gate from hanging on a wedged supergfxd by @yashranaway and @dhh
  • Only offer real video capture devices as webcams, so IPU6 laptops stop opening a black overlay instead of their camera by @yashranaway
  • Treat LVDS and DSI panels as internal displays, so older laptops stop counting their own screen as an external monitor by @yashranaway

Thanks also to @AksharP5, @artfwo, @dalmasluca, @DataDave-Dev, @DiegoMirner, @flavorjones, @franciscoaccabral, @GebaRoanoke, @glafeara, @grantwiley, @heyssh, @JustMrMendez, @kevinmcconnell, @lukehsiao, @lukewalker2010, @markbus-ai, @meirdick, @monorkin, @richardlences, @RushiChaganti, @s-gato, @setiapam, @Vtorrealba, and @vivek7405 for fixes and polish to the new Quattro features during the beta itself.

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 and the menu, together

Walker is gone, and SUPER + SPACE now opens the Omarchy menu itself: a native, filterable command palette living inside the shell. Once the menu could search its own nested entries, there was no reason to keep two palettes with two shortcuts around — so one box now finds your apps and every Omarchy command, with instant response, and it's extensible through a JSONC file if you want to add your own entries.

menu

The app-launching side lost nothing in the merge: 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. And when you want a launcher scoped to just your apps, SUPER + ALT + SPACE opens exactly that.

launcher

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, Wi-Fi QR sharing, 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 put and omarchy bar move, and third-party widgets install straight from git with omarchy plugin add.

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

Pick your coding agent

Omarchy no longer picks a coding agent for you — it asks. Choose Claude Code, Codex, OpenCode, Pi, Oh My Pi, Gemini, Grok, Copilot, or Crush under Setup > Defaults > Agent, and it's lazy-installed the first time you use it. From then on, SUPER + SHIFT + CTRL + A (or just a in any terminal) summons your agent in its own window, started in ~/Work so trust actually sticks. The model-usage bar widget keeps an eye on your Claude and Codex spend, and when a process crashes, one click on the toast briefs your agent on the core dump for a diagnosis.

agent-picker

The new default apps

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

It's joined by Omacut, a dead-simple video trimmer. 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

Omacalc completes the trio: a dead-simple calculator replacing GNOME Calculator, on SUPER + CTRL + Q.

omacalc

And the defaults have been refreshed elsewhere too: Foot is the new default terminal, Tensaku replaces Satty for image annotation, Moonlight ships for Sunshine game/desktop streaming, and dua handles disk usage.

Install it for someone else

An install can now finish with no user at all. Deferred first-boot provisioning means you can set up a machine — for a family member, a colleague, a whole classroom — and hand it over untouched. On the first boot, the owner picks their keyboard, account, hostname, and timezone behind the same logo, progress bar, and rotating tips the ISO installer uses. On an encrypted disk, the LUKS volume is re-keyed from the throwaway install passphrase to the owner's password, all-or-nothing.

image

And when the machine comes back, Setup > Reset Computer hands it over again: the running root is swapped for a fresh clone of the @factory snapshot the ISO takes at install time, with machine identity, accounts, and fingerprint enrollments scrubbed — back to that untouched first-boot state.

This PR description is up to date as of 144f4d1e; next time, review commits after this one.

@dhh
dhh changed the base branch from dev to master July 17, 2026 18:22
Comment thread shell/plugins/panels/tailscale/Model.js Outdated
function isMullvadPeer(peer) {
var hostName = String((peer && peer.HostName) || "").toLowerCase()
var dnsName = cleanDnsName((peer && peer.DNSName) || "").toLowerCase()
return dnsName.indexOf(".mullvad.ts.net") !== -1 || hostName.indexOf(".mullvad.ts.net") !== -1
Comment thread shell/plugins/panels/tailscale/Model.js Outdated
function isMullvadPeer(peer) {
var hostName = String((peer && peer.HostName) || "").toLowerCase()
var dnsName = cleanDnsName((peer && peer.DNSName) || "").toLowerCase()
return dnsName.indexOf(".mullvad.ts.net") !== -1 || hostName.indexOf(".mullvad.ts.net") !== -1
Comment thread shell/plugins/panels/tailscale/Model.js Outdated
var country = sliceTableColumn(line, countryStart, cityStart)
var city = sliceTableColumn(line, cityStart, statusStart)
var status = sliceTableColumn(line, statusStart, -1)
if (host.indexOf(".mullvad.ts.net") === -1) continue
@jheuing

jheuing commented Jul 20, 2026 •

Copy link
Copy Markdown

Great work!!!

SUPER + ALT + [ / ]

Can we have a different key to / as in german / swiss keyboards, this is available via shift. So it would be SUPER+ALT+SHIFT+7. Usually having / and \ are not working keyboard shortcuts and need manual fixing.

@jheuing

jheuing commented Jul 20, 2026

Copy link
Copy Markdown

BTW: I can suggest alternatives and provide an MR if we're open to this change incl. past shortcuts...

@emo333

emo333 commented Jul 20, 2026

Copy link
Copy Markdown

I just YOLO'd my 3.8... Workin like a boss. Nothing but what was expecting and a few pleasant surprises. Much appreciation to all of ya'll who made this happen!

@jzetterman

Copy link
Copy Markdown
Contributor

Running Quattro as my daily driver (upgraded an existing install, large 4K display (LG 48GQ900-B 48” OLED) at scale 1). The unified text-size knob is a great idea, but it hard-links three surfaces that don't always want to move together, and there's no way to express "just the shell" for example.

Concrete case: I wanted the shell components (bar, menus, notifications) larger. Moving the display-panel slider did that, but it also:

  1. Set GTK text-scaling-factor, which inflated every Chromium/Electron app (browser, Discord, Teams). I didn't want those touched.
  2. Silently rewrote my hand-tuned font-size = 16 in ~/.config/ghostty/config down to 11pt (I'd picked the 14px stop). No warning, no backup.

There's also a small legibility trap in the mapping: because of the 12px→9pt anchor, the number you pick is never the number that lands in your terminal — e.g. the slider stop labeled "16" writes 12pt into terminal configs.

The three legs are already independently settable underneath ([font] base-size in ~/.config/omarchy/shell.toml, gsettings, terminal configs), so I got what I wanted manually. But that means the knob is unusable for anyone tuning per-surface, one touch of the slider re-links everything.

Proposal: scope flags on omarchy-display-text-size, something like --shell, --gtk, --terminals, defaulting to all three so the one-knob behavior is unchanged. The panel slider keeps calling it with no flags. Happy to submit this as a follow-up PR if there's interest.

lukehsiao added a commit to lukehsiao/dotfiles that referenced this pull request Jul 22, 2026
Quattro (Omarchy 4) breaks every hook this repo has into Omarchy: the
git checkout at ~/.local/share/omarchy becomes a pacman-owned symlink,
Hyprland config converts from .conf to Lua, Waybar is replaced by a
Quickshell shell configured through shell.json, and generated theme
state moves from ~/.config/omarchy/current to
~/.local/state/omarchy/current. This patch rewrites the overlays
quattro-native. The theme-set and update-perform script overrides
shrink to two hooks (zellij retint on theme-set, rustup/cargo on
post-update) because user themed templates, helix restarts, cwd-aware
terminal launches, mise updates, and persistent workspaces 1-5 are now
stock. The hypr .conf files become Lua unbind/rebind overrides, waybar
becomes a shell.json carrying only the clock format and Berkeley Mono,
and the theme symlinks plus alacritty/ghostty imports re-point at the
new state dir. My themed/*.tpl files survive untouched since upstream
kept legacy colorN aliases.

Do NOT merge or apply this on a machine still running Omarchy 3.x; it
deletes the .conf and waybar files the live session reads. Upgrade day:
run omarchy-upgrade-to-quattro, reboot, merge this bookmark, then
chezmoi apply (accepting the .chezmoiremove deletions), re-run
omarchy-theme-set, and reload Hyprland. Quattro is still alpha, so
re-verify the hook names and shell.json schema against upstream first.

Tested: chezmoi execute-template renders input/monitors for every
dpi/mousedpi branch and luac -p passes on all of them plus bindings.lua
and looknfeel.lua; shell.json validates; chezmoi status shows the
expected adds/deletes. NOT TESTED on a real Quattro install. The
monitor-relative floating window size in looknfeel.lua needs checking
against hl.window_rule serialization on a live system.

Ref: omacom/omarchy#6231
Assisted-by: Claude:claude-fable-5
lukehsiao added a commit to lukehsiao/dotfiles that referenced this pull request Jul 23, 2026
Quattro (Omarchy 4) breaks every hook this repo has into Omarchy: the git
checkout at ~/.local/share/omarchy becomes a pacman-owned symlink, Hyprland
config converts from .conf to Lua, Waybar is replaced by a Quickshell shell,
and generated theme state moves from ~/.config/omarchy/current to
~/.local/state/omarchy/current. This patch rewrites the overlays
quattro-native. The theme-set and update-perform script overrides shrink to
two hooks (zellij retint on theme-set, rustup/cargo on post-update) because
user themed templates, helix restarts, cwd-aware terminal launches, mise
updates, and persistent workspaces 1-5 are now stock. The hypr .conf files
become Lua unbind/rebind overrides, and the theme symlinks plus
alacritty/ghostty imports re-point at the new state dir. My themed/*.tpl files
survive untouched since upstream kept legacy colorN aliases.

The Quickshell bar carries no user config. shell.json's clock keys are gone
(upstream's stock layout and ISO-week clock are fine), and its fontFamily key
never fed the bar anyway: the bar binds font.family to the "monospace" alias,
so Berkeley Mono now lives in ~/.config/fontconfig/fonts.conf, the file
`omarchy font set` owns and the shell, Qt apps, and everything resolving
"monospace" read. Berkeley Mono has no Nerd glyphs, so fonts.conf adds a Nerd
Font to the monospace fallback to keep bar and TUI icons rendering; upstream
needs no such entry because its monospace alias is itself a Nerd Font.

Do NOT merge or apply this on a machine still running Omarchy 3.x; it deletes
the .conf and waybar files the live session reads. Upgrade day: run the
quattro upgrade, reboot, merge this bookmark, then chezmoi apply (accepting the
.chezmoiremove deletions), re-run omarchy-theme-set, and reload Hyprland.
Quattro is still alpha, so re-verify the hook names against upstream first.

Tested: chezmoi execute-template plus luac -p pass on bindings.lua,
looknfeel.lua, and input.lua/monitors.lua rendered across every mousedpi
(high/mid/low) and dpi (retina/mid/low) branch. xmllint validates fonts.conf,
and fc-match against the rendered fonts.conf resolves monospace to Berkeley
Mono Variable and falls back to an installed Nerd Font (JetBrainsMono/Caskaydia)
for glyphs Berkeley lacks. chezmoi status shows the expected fontconfig modify
plus the hypr .conf->.lua swaps. NOT TESTED on a real Quattro install. The
monitor-relative floating window size in looknfeel.lua still needs checking
against hl.window_rule serialization on a live system.

Ref: omacom/omarchy#6231
Assisted-by: Claude:claude-opus-4.8
lukehsiao added a commit to lukehsiao/dotfiles that referenced this pull request Jul 23, 2026
Quattro (Omarchy 4) breaks every hook this repo has into Omarchy:
the git checkout at ~/.local/share/omarchy becomes a pacman-owned
symlink, Hyprland config converts from .conf to Lua, Waybar is
replaced by a Quickshell shell, and generated theme state moves from
~/.config/omarchy/current to ~/.local/state/omarchy/current. This patch
rewrites the overlays quattro-native. The theme-set and update-perform
script overrides shrink to two hooks (zellij retint on theme-set,
rustup/cargo on post-update) because user themed templates, helix
restarts, cwd-aware terminal launches, mise updates, and persistent
workspaces 1-5 are now stock. The hypr .conf files become Lua
unbind/rebind overrides, and the theme symlinks plus alacritty/ghostty
imports re-point at the new state dir. My themed/*.tpl files survive
untouched since upstream kept legacy colorN aliases.

The Quickshell bar carries no user config. shell.json's clock keys are
gone (upstream's stock layout and ISO-week clock are fine), and its
fontFamily key never fed the bar anyway: the bar binds font.family to
the "monospace" fontconfig alias. Berkeley Mono is installed out of
band (it's paid, so unlike my other fonts it isn't committed here),
and the alias is set with `omarchy font set "Berkeley Mono Variable"`,
which rewrites ~/.config/fontconfig/fonts.conf from the current package
default. I don't manage that file in chezmoi for the same reason I
dropped shell.json: omarchy owns and rewrites it, so a committed copy
would both fork an upstream file that still gains fixes (the recent
Arabic Naskh fallback) and fight the next `omarchy font set`.

Do NOT merge or apply this on a machine still running Omarchy 3.x; it
deletes the .conf and waybar files the live session reads. Upgrade day:
run the quattro upgrade, reboot, merge this bookmark, then chezmoi apply
(accepting the .chezmoiremove deletions), re-run omarchy-theme-set, run
`omarchy font set "Berkeley Mono Variable"` to point the monospace alias
(and thus the bar) at Berkeley Mono, and reload Hyprland. Quattro is
still alpha, so re-verify the hook names against upstream first.

Tested: chezmoi execute-template plus luac -p pass on bindings.lua,
looknfeel.lua, and input.lua/monitors.lua rendered across every mousedpi
(high/mid/low) and dpi (retina/mid/low) branch. Confirmed against
upstream Style.qml that the bar's font.family binds to the "monospace"
alias (so shell.json's fontFamily was dead) and that `omarchy font
set` is what writes fonts.conf. chezmoi status shows only the expected
hypr .conf->.lua swaps. NOT TESTED on a real Quattro install. The
monitor-relative floating window size in looknfeel.lua still needs
checking against hl.window_rule serialization on a live system.

Ref: omacom/omarchy#6231
Assisted-by: Claude:claude-opus-4.8
lukehsiao added a commit to lukehsiao/dotfiles that referenced this pull request Jul 25, 2026
Quattro (Omarchy 4) breaks every hook this repo has into Omarchy:
the git checkout at ~/.local/share/omarchy becomes a pacman-owned
symlink, Hyprland config converts from .conf to Lua, Waybar is
replaced by a Quickshell shell, and generated theme state moves from
~/.config/omarchy/current to ~/.local/state/omarchy/current. This patch
rewrites the overlays quattro-native. The theme-set and update-perform
script overrides shrink to two hooks (zellij retint on theme-set,
rustup/cargo on post-update) because user themed templates, helix
restarts, cwd-aware terminal launches, mise updates, and persistent
workspaces 1-5 are now stock. The hypr .conf files become Lua
unbind/rebind overrides, and the theme symlinks plus alacritty/ghostty
imports re-point at the new state dir. My themed/*.tpl files survive
untouched since upstream kept legacy colorN aliases.

The Quickshell bar carries no user config. shell.json's clock keys are
gone (upstream's stock layout and ISO-week clock are fine), and its
fontFamily key never fed the bar anyway: the bar binds font.family to
the "monospace" fontconfig alias. Berkeley Mono is installed out of
band (it's paid, so unlike my other fonts it isn't committed here),
and the alias is set with `omarchy font set "Berkeley Mono Variable"`,
which rewrites ~/.config/fontconfig/fonts.conf from the current package
default. I don't manage that file in chezmoi for the same reason I
dropped shell.json: omarchy owns and rewrites it, so a committed copy
would both fork an upstream file that still gains fixes (the recent
Arabic Naskh fallback) and fight the next `omarchy font set`.

Do NOT merge or apply this on a machine still running Omarchy 3.x; it
deletes the .conf and waybar files the live session reads. Upgrade day:
run the quattro upgrade, reboot, merge this bookmark, then chezmoi apply
(accepting the .chezmoiremove deletions), re-run omarchy-theme-set, run
`omarchy font set "Berkeley Mono Variable"` to point the monospace alias
(and thus the bar) at Berkeley Mono, and reload Hyprland. Quattro is
still alpha, so re-verify the hook names against upstream first.

Tested: chezmoi execute-template plus luac -p pass on bindings.lua,
looknfeel.lua, and input.lua/monitors.lua rendered across every mousedpi
(high/mid/low) and dpi (retina/mid/low) branch. Confirmed against
upstream Style.qml that the bar's font.family binds to the "monospace"
alias (so shell.json's fontFamily was dead) and that `omarchy font
set` is what writes fonts.conf. chezmoi status shows only the expected
hypr .conf->.lua swaps. NOT TESTED on a real Quattro install. The
monitor-relative floating window size in looknfeel.lua still needs
checking against hl.window_rule serialization on a live system.

Ref: omacom/omarchy#6231
Assisted-by: Claude:claude-opus-4.8
lukehsiao added a commit to lukehsiao/dotfiles that referenced this pull request Jul 28, 2026
Quattro (Omarchy 4) breaks every hook this repo has into Omarchy:
the git checkout at ~/.local/share/omarchy becomes a pacman-owned
symlink, Hyprland config converts from .conf to Lua, Waybar is
replaced by a Quickshell shell, and generated theme state moves from
~/.config/omarchy/current to ~/.local/state/omarchy/current. This patch
rewrites the overlays quattro-native. The theme-set and update-perform
script overrides shrink to two hooks (zellij retint on theme-set,
rustup/cargo on post-update) because user themed templates, helix
restarts, cwd-aware terminal launches, mise updates, and persistent
workspaces 1-5 are now stock. The hypr .conf files become Lua
unbind/rebind overrides, and the theme symlinks plus alacritty/ghostty
imports re-point at the new state dir. My themed/*.tpl files survive
untouched since upstream kept legacy colorN aliases.

The Quickshell bar carries no user config. shell.json's clock keys are
gone (upstream's stock layout and ISO-week clock are fine), and its
fontFamily key never fed the bar anyway: the bar binds font.family to
the "monospace" fontconfig alias. Berkeley Mono is installed out of
band (it's paid, so unlike my other fonts it isn't committed here),
and the alias is set with `omarchy font set "Berkeley Mono Variable"`,
which rewrites ~/.config/fontconfig/fonts.conf from the current package
default. I don't manage that file in chezmoi for the same reason I
dropped shell.json: omarchy owns and rewrites it, so a committed copy
would both fork an upstream file that still gains fixes (the recent
Arabic Naskh fallback) and fight the next `omarchy font set`.

Do NOT merge or apply this on a machine still running Omarchy 3.x; it
deletes the .conf and waybar files the live session reads. Upgrade day:
run the quattro upgrade, reboot, merge this bookmark, then chezmoi apply
(accepting the .chezmoiremove deletions), re-run omarchy-theme-set, run
`omarchy font set "Berkeley Mono Variable"` to point the monospace alias
(and thus the bar) at Berkeley Mono, and reload Hyprland. Quattro is
still alpha, so re-verify the hook names against upstream first.

Tested: chezmoi execute-template plus luac -p pass on bindings.lua,
looknfeel.lua, and input.lua/monitors.lua rendered across every mousedpi
(high/mid/low) and dpi (retina/mid/low) branch. Confirmed against
upstream Style.qml that the bar's font.family binds to the "monospace"
alias (so shell.json's fontFamily was dead) and that `omarchy font
set` is what writes fonts.conf. chezmoi status shows only the expected
hypr .conf->.lua swaps. NOT TESTED on a real Quattro install. The
monitor-relative floating window size in looknfeel.lua still needs
checking against hl.window_rule serialization on a live system. Re-checked
the overlay against upstream quattro at f4e8470c3a1b: the theme-set and
post-update hook dirs, the themed template renderer's legacy colorN
aliases, the `o.bind` dispatcher tables, `o.window`, and the
floating-window tag all still behave as this patch assumes, and the
state dir the symlinks point at is unchanged. The uwsm/default override
survives too: quattro moved the file into the package, but
/usr/share/uwsm/env.d/10-omarchy still sources ~/.config/uwsm/default,
and the upgrade keeps hash-mismatched user copies active, so EDITOR
stays helix. Worth knowing for upgrade day: the upgrade's always-copy
list rewrites all four hypr .lua files with quattro skeletons, which is
why chezmoi apply has to run after the upgrade rather than before.

Ref: omacom/omarchy#6231
Assisted-by: Claude:claude-opus-4.8
Assisted-by: Claude:claude-opus-5
lukehsiao added a commit to lukehsiao/dotfiles that referenced this pull request Jul 28, 2026
Quattro (Omarchy 4) breaks every hook this repo has into Omarchy:
the git checkout at ~/.local/share/omarchy becomes a pacman-owned
symlink, Hyprland config converts from .conf to Lua, Waybar is
replaced by a Quickshell shell, and generated theme state moves from
~/.config/omarchy/current to ~/.local/state/omarchy/current. This patch
rewrites the overlays quattro-native. The theme-set and update-perform
script overrides shrink to two hooks (zellij retint on theme-set,
rustup/cargo on post-update) because user themed templates, helix
restarts, cwd-aware terminal launches, mise updates, and persistent
workspaces 1-5 are now stock. The hypr .conf files become Lua
unbind/rebind overrides, and the theme symlinks plus alacritty/ghostty
imports re-point at the new state dir. My themed/*.tpl files survive
untouched since upstream kept legacy colorN aliases.

The Quickshell bar carries no user config. shell.json's clock keys are
gone (upstream's stock layout and ISO-week clock are fine), and its
fontFamily key never fed the bar anyway: the bar binds font.family to
the "monospace" fontconfig alias. Berkeley Mono is installed out of
band (it's paid, so unlike my other fonts it isn't committed here),
and the alias is set with `omarchy font set "Berkeley Mono Variable"`,
which rewrites ~/.config/fontconfig/fonts.conf from the current package
default. I don't manage that file in chezmoi for the same reason I
dropped shell.json: omarchy owns and rewrites it, so a committed copy
would both fork an upstream file that still gains fixes (the recent
Arabic Naskh fallback) and fight the next `omarchy font set`.

Do NOT merge or apply this on a machine still running Omarchy 3.x; it
deletes the .conf and waybar files the live session reads. Upgrade day:
run the quattro upgrade, reboot, merge this bookmark, then chezmoi apply
(accepting the .chezmoiremove deletions), re-run omarchy-theme-set, run
`omarchy font set "Berkeley Mono Variable"` to point the monospace alias
(and thus the bar) at Berkeley Mono, and reload Hyprland. Quattro is
still alpha, so re-verify the hook names against upstream first.

Tested: chezmoi execute-template plus luac -p pass on bindings.lua,
looknfeel.lua, and input.lua/monitors.lua rendered across every mousedpi
(high/mid/low) and dpi (retina/mid/low) branch. Confirmed against
upstream Style.qml that the bar's font.family binds to the "monospace"
alias (so shell.json's fontFamily was dead) and that `omarchy font
set` is what writes fonts.conf. chezmoi status shows only the expected
hypr .conf->.lua swaps. NOT TESTED on a real Quattro install. The monitor-relative
floating size in looknfeel.lua is now verified on Hyprland 0.56.0: a
probe window took 1654x1016 on a 3008x1692 logical monitor, so
monitor_w/monitor_h resolve against logical and not physical pixels,
which is what makes 55%/60% right on a retina display. The percentage
form (size 55% 60%) is not a substitute: hyprctl accepts it and then
silently ignores it, leaving the app's own default. What remains
unproven is only the Lua table to rule-string serialization, and
upstream ships that same shape in webcam-overlay.lua. Re-checked
the overlay against upstream quattro at f4e8470c3a1b: the theme-set and
post-update hook dirs, the themed template renderer's legacy colorN
aliases, the `o.bind` dispatcher tables, `o.window`, and the
floating-window tag all still behave as this patch assumes, and the
state dir the symlinks point at is unchanged. The uwsm/default override
survives too: quattro moved the file into the package, but
/usr/share/uwsm/env.d/10-omarchy still sources ~/.config/uwsm/default,
and the upgrade keeps hash-mismatched user copies active, so EDITOR
stays helix. Worth knowing for upgrade day: the upgrade's always-copy
list rewrites all four hypr .lua files with quattro skeletons, which is
why chezmoi apply has to run after the upgrade rather than before.

Ref: omacom/omarchy#6231
Assisted-by: Claude:claude-opus-4.8
Assisted-by: Claude:claude-opus-5
lukehsiao added a commit to lukehsiao/dotfiles that referenced this pull request Jul 28, 2026
Quattro (Omarchy 4) breaks every hook this repo has into Omarchy:
the git checkout at ~/.local/share/omarchy becomes a pacman-owned
symlink, Hyprland config converts from .conf to Lua, Waybar is
replaced by a Quickshell shell, and generated theme state moves from
~/.config/omarchy/current to ~/.local/state/omarchy/current. This patch
rewrites the overlays quattro-native. The theme-set and update-perform
script overrides shrink to two hooks (zellij retint on theme-set,
rustup/cargo on post-update) because user themed templates, helix
restarts, cwd-aware terminal launches, mise updates, and persistent
workspaces 1-5 are now stock. The hypr .conf files become Lua
unbind/rebind overrides, and the theme symlinks plus alacritty/ghostty
imports re-point at the new state dir. My themed/*.tpl files survive
untouched since upstream kept legacy colorN aliases.

The Quickshell bar carries no user config. shell.json's clock keys are
gone (upstream's stock layout and ISO-week clock are fine), and its
fontFamily key never fed the bar anyway: the bar binds font.family to
the "monospace" fontconfig alias. Berkeley Mono is installed out of
band (it's paid, so unlike my other fonts it isn't committed here),
and the alias is set with `omarchy font set "Berkeley Mono Variable"`,
which rewrites ~/.config/fontconfig/fonts.conf from the current package
default. I don't manage that file in chezmoi for the same reason I
dropped shell.json: omarchy owns and rewrites it, so a committed copy
would both fork an upstream file that still gains fixes (the recent
Arabic Naskh fallback) and fight the next `omarchy font set`.

Do NOT merge or apply this on a machine still running Omarchy 3.x; it
deletes the .conf and waybar files the live session reads. Upgrade day:
run the quattro upgrade, reboot, merge this bookmark, then chezmoi apply
(accepting the .chezmoiremove deletions), re-run omarchy-theme-set, run
`omarchy font set "Berkeley Mono Variable"` to point the monospace alias
(and thus the bar) at Berkeley Mono, and reload Hyprland. Quattro is
still alpha, so re-verify the hook names against upstream first.

Tested: chezmoi execute-template plus luac -p pass on bindings.lua,
looknfeel.lua, and input.lua/monitors.lua rendered across every mousedpi
(high/mid/low) and dpi (retina/mid/low) branch. Confirmed against
upstream Style.qml that the bar's font.family binds to the "monospace"
alias (so shell.json's fontFamily was dead) and that `omarchy font
set` is what writes fonts.conf. chezmoi status shows only the expected
hypr .conf->.lua swaps. NOT TESTED on a real Quattro install. The
monitor-relative floating size in looknfeel.lua is now verified on
Hyprland 0.56.0: a probe window took 1654x1016 on a 3008x1692 logical
monitor, so monitor_w/monitor_h resolve against logical and not physical
pixels, which is what makes 55%/60% right on a retina display. The
percentage form (size 55% 60%) is not a substitute: hyprctl accepts
it and then silently ignores it, leaving the app's own default. What
remains unproven is only the Lua table to rule-string serialization,
and upstream ships that same shape in webcam-overlay.lua. Re-checked
the overlay against upstream quattro at f4e8470c3a1b: the theme-set
and post-update hook dirs, the themed template renderer's legacy
colorN aliases, the `o.bind` dispatcher tables, `o.window`, and
the floating-window tag all still behave as this patch assumes, and
the state dir the symlinks point at is unchanged. The uwsm/default
override survives too: quattro moved the file into the package, but
/usr/share/uwsm/env.d/10-omarchy still sources ~/.config/uwsm/default,
and the upgrade keeps hash-mismatched user copies active, so EDITOR
stays helix. Worth knowing for upgrade day: the upgrade's always-copy
list rewrites all four hypr .lua files with quattro skeletons, which is
why chezmoi apply has to run after the upgrade rather than before.

Ref: omacom/omarchy#6231
Assisted-by: Claude:claude-opus-5
Comment thread default/chromium/extensions/whatsapp-theme/background.js Fixed
nerdislb pushed a commit to nerdislb/nbshell that referenced this pull request Aug 9, 2026
Omarchy 4 "Quattro" (PR omacom/omarchy#6231) baut seine ganze Shell auf
Quickshell um -- also dasselbe Fundament wie hier. Aus der Liste uebernommen,
was fuer einen niri-Laptop Sinn ergibt:

Zwei Loecher zuerst:

* Die Zwischenablage sperrt Passwoerter aus. Wer ein Geheimnis kopiert, haengt
  dem Angebot `x-kde-passwordManagerHint` an; der Wachhund fragt die Typen ab
  und schweigt dann. Vorher lag jedes kopierte Passwort im Klartext in
  clipboard.json -- dauerhaft, waehrend es in der echten Ablage nach Sekunden
  verfaellt.
* Rechteabfragen: polkitd fragt niemanden, es erwartet einen Agenten in der
  Sitzung. Unter niri bringt ihn keiner mit, und man merkt es erst, wenn ein
  Programm scheinbar wortlos scheitert. `nbshell polkit [on]` schaltet einen
  vorhandenen ein, `switch on` nimmt ihn mit, `install.sh` warnt, `setup.sh`
  holt hyprpolkitagent.

Der Starter ist jetzt zugleich Befehlspalette (Services/Commands.qml): Mod+Space
sucht in Anwendungen UND in allem, was die Shell kann; ">" nur Befehle
(Mod+Shift+Space), "!" nur Anwendungen. Was sich nicht zurueckdrehen laesst,
fragt nach -- in einer Suchpalette liegt der Feierabend sonst einen Tippfehler
entfernt. Eigene Eintraege in commands.json, dazu `nbshell befehle|befehl|find`.

Ausserdem:

* Benachrichtigungen ueberleben den Neustart der Shell -- den macht jedes
  install.sh. Der Eintrag ist eine flache Kopie; gesucht wird ueber `key` aus
  Zeit und id, weil der Server nach einem Neustart wieder bei 1 anfaengt.
* Jede Anwendung startet in ihrem eigenen systemd-Scope, damit systemd-oomd den
  Uebeltaeter holt und nicht die Sitzung.
* Rechtsklick auf die Uhr wechselt das Format (auch Kalenderwoche, 12 Stunden);
  isoWeek wandert dafuer in den Kalenderdienst.
* Klick ohne Ziehen heisst "ganzer Bildschirm" im Aufnahme-Regionswaehler.
* Das Mausrad auf der Lautstaerke rechnet mit angleDelta: Rad 5 %, Touchpad 1 %.
* `nbshell plugin add|update|remove` holt fremde Bar-Widgets aus git -- flach
  geklont, geprueft, dann erst verschoben, und mit der Warnung davor, dass ein
  Plugin QML IN der Shell ist.
* `nbshell text <n>` bewegt Shell, GTK und Terminal zusammen. Das Terminal
  rechnet in Punkt: das Verhaeltnis wird einmal gemessen statt stumpf
  umgerechnet, GTK rastet auf eine ganze Punktgroesse ein.
* install.sh holt die Leiste per trap zurueck, wenn es zwischen "gestoppt" und
  "gestartet" abbricht -- etwa an einem SIGPIPE, weil die Ausgabe nach head
  ging.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@DataDave-Dev

Copy link
Copy Markdown
Contributor

Wow, it looks amazing! I can't wait to update my Omarchy!

@Tsurgcom

Copy link
Copy Markdown
Contributor

Looks cool, LGTM! 🚀

@jeffydc

jeffydc commented Aug 13, 2026

Copy link
Copy Markdown

Would it be possible to release Quattro as a standalone package so that I can use it on other Linux distributions? I have my own favorite Linux distribution, but would luv to use Quattro.

@dhh

dhh commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Would it be possible to release Quattro as a standalone package so that I can use it on other Linux distributions? I have my own favorite Linux distribution, but would luv to use Quattro.

No. Everything is tightly integrated.

@smarquez1

Copy link
Copy Markdown

I tested the remote-desktop approach on Omarchy Quattro with an AMD Radeon 780M. The existing Virtual-1 output causes Sunshine to fail with Failed to create buffer from params. A temporary headless output named sunshine is capturable by Sunshine with WLR/Wayland capture and automatic encoder selection, but the current Quattro Hyprland/aquamarine build crashes in Aquamarine::CHeadlessBackend::createOutput after hyprctl -i 0 output create headless sunshine. That crash breaks Quickshell and restarts Hyprland in safe mode. On Quattro, commands need the instance selector (hyprctl -i 0), and the legacy keyword monitor / dispatch moveworkspacetomonitor forms are rejected by the Lua parser. The single systemd Sunshine service and AMD VAAPI encoder are otherwise working.

dhh and others added 28 commits September 13, 2026 08:56
The battery service ran `powerprofilesctl get` every two seconds to keep the
active profile visible to the wallpaper and lock services. That command is a
PyGObject script, so the shell spawned a Python interpreter for it tens of
thousands of times a day. Roughly once a day one of those exits into a CPython
3.14 finalization race (python/cpython#124619): the GLib D-Bus worker thread
calls PyGILState_Ensure after the interpreter is torn down and the process
dies with SIGSEGV, leaving a core dump and a crash notification behind.

Read the ActiveProfile property straight from power-profiles-daemon with
busctl, the same way omarchy-powerprofiles-set already reads UPower. The
output is JSON, so an empty or malformed reply when the daemon is not running
still reads as no active profile, matching the previous behaviour.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gbfh4Mi9dK6SAd1P2xMTi
The theme laid out the logo, password entry and progress bar once, when
the script first ran. Plymouth sizes its window to the largest display
present, so a monitor that comes up after plymouthd starts (a Thunderbolt
display whose DisplayPort tunnel is established about a second after the
kernel's display driver loads, a dock, an MST hub) got the prompt drawn at
the internal panel's coordinates: off-center on the external display and
partly off-screen on the panel. With the lid closed the passphrase box was
effectively invisible.

Move the layout into a function and re-run it from the refresh callback
whenever Window.GetWidth/GetHeight change, which is how Plymouth's script
plugin exposes a display being added or removed. Existing bullets are
repositioned too.

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Upgrading systemd runs its post_upgrade scriptlet mid-transaction, which
reexecs both the system manager and every user manager. When pacman runs
inside a user-session scope (the floating update terminal), that reexec
can SIGKILL it and abandon the transaction halfway, with packages
upgraded but none of the post-transaction hooks run.

Route every Omarchy-owned system mutation through a new hidden
omarchy-update-pacman helper that registers the transaction as a PID 1
scope via systemd-run, keeping it out of the user manager's cgroups.
System scopes survive the system manager's own reexec, and as a bonus the
transaction now also survives its terminal window closing. On unbooted
systems (the installer chroot) the helper runs pacman directly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The floating-terminal presentation wrapper showed the green "Done!"
prompt for every exit code except Ctrl-C, so a failed update or channel
switch closed looking like a success. Pass the command's exit code
through to omarchy-show-done and render a red "Failed (exit code N)!"
prompt when it is non-zero. The pkg install/remove pickers get the same
treatment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
omarchy-channel-set runs under set -e, so a failure after it has begun
mutating the system (dev link, pacman channel, packages) died silently
with the switch half-applied. Trap ERR once the mutation phase starts
and say how to pick the switch back up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The update conflict tests stub sudo and pacman, but omarchy-update-pacman
now puts systemd-run between them, so on a systemd-booted host the tests
would reach for the real system manager. Stub systemd-run to drop the
wrapper's options and run the command, and cover the helper's own
invocation composition in a new test.

Raised by codex review.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015zcqENR1UbhuwC1v5u3Wop
…down

Shield pacman transactions from desktop session teardown
The kernel leaves NVMe on none and everything else on mq-deadline. Neither
bounds latency once the device queue fills, so a large build, copy, or
package upgrade can make the desktop sluggish while reads wait behind a
wall of writes.

Kyber keeps separate read and sync-write queues and throttles the depth it
submits to hit a 2ms read target, which keeps interactive reads flowing
under heavy writes at negligible CPU cost. The trade is a small ceiling on
peak throughput on very fast devices, which matters for a storage server
chasing IOPS but not for a desktop.

Ships as a package-owned udev rule in /etc so it applies at boot and on
hot-plug. Existing installs pick it up at the next boot. zram is left alone
since it has nothing to schedule.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
udev patterns are shell globs, so nvme[0-9]*n[0-9]* also matched every
partition. Partitions have no queue/scheduler, and udev logged a "Could not
chase sysfs attribute" for each one at boot. Restrict the match to
SUBSYSTEM block with DEVTYPE disk, which also keeps mmcblk boot areas and
NVMe multipath nodes out.

Reword the comment: kyber targets a read latency rather than bounding it,
and the kernel's default choice depends on the device rather than being a
fixed NVMe versus everything-else split.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A floating window on the console is not laid out by the gaps, so it no
longer stretches the panel to full width. Moving an app onto or off the
scratchpad and toggling floating now refit too, via
window.move_to_workspace and window.update_rules; both were measured on
Hyprland 0.56.2 to carry the settled count.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012UyVoFTM98Tduoxg7qZax7
Center the Quake console in a 2:1 panel instead of spanning the screen.
Use the kyber I/O scheduler on real disks
1Password 8.12 changed its app id from "1Password" to
"com.onepassword.OnePassword" (its .desktop file now declares that as
StartupWMClass). Our window rule only matched the old name, so the main
window came up tiled and lost the no_screen_share protection.

Match both forms so older installs keep working.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LSFKDatumRZHB8zqk5CP5C
Match 1Password's new window class so it floats again
The repo moved to the omacom org. GitHub redirects the old URLs, but
`omarchy channel set dev` was still cloning from basecamp/omarchy, which
left every dev checkout with a stale origin remote that confuses gh
(pr create fails with "No commits between omacom:quattro and
basecamp:<branch>"). Update the clone URL, the quattro upgrade tarball,
the update-confirm release link, the systemd Documentation link, and
the manual.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LSFKDatumRZHB8zqk5CP5C
Point GitHub URLs at omacom/omarchy instead of basecamp/omarchy
No branch on the repo is protected and there are no rulesets, so the
file never enforced owner review. Its only effect was auto-requesting a
review from the other owner on every PR, which nobody acted on.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Poll the active power profile over D-Bus instead of powerprofilesctl
Migrate Panther Lake systems to the Omarchy PTL kernel
Migrate to linux-omarchy except on T2 Macs
@ryanrhughes
ryanrhughes deleted the branch master September 14, 2026 21:21
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.