Skip to content

Sync upstream quattro through #18378 - #129

Merged
mark-groves merged 37 commits into
quattrofrom
cursor/upstream-changes-pr-f428
Nov 11, 2026
Merged

mark-groves merged 37 commits into
quattrofrom
cursor/upstream-changes-pr-f428

Conversation

@cursor

@cursor cursor Bot commented Nov 10, 2026

Copy link
Copy Markdown

What changes

Upstream quattro moved past omacom#18309 (c40eca98b), which is what #120 merged. Thirty-seven commits replayed onto current quattro, through f428bb4fe (merge of omacom#18378). No merge commits. One upstream commit was empty once the earlier deletion was in place, so it was not replayed: 991e73851 only put plans/remote.md back the way Moonlight had found it, and "Remove the remote plan" had already deleted that file. Upstream's tip does not have it either. Two conflicts, both kept the fork's behavior and took the upstream change. Fork delta vs f428bb4fe is the same 256 paths as quattro vs c40eca98b. On the 199 paths upstream did not touch, the added and removed lines are unchanged. Face, Grok Bot, Cursor, linux / linux-headers, and the dropped Claude and translation-sync workflows stay.

  • Files replaces Nautilus (Replace Nautilus with Files omacom/omarchy#18378). The file manager is now Files (folio). New installs get it, and migration 1794330979 installs it on existing machines, rewrites org.gnome.Nautilus.desktop to folio.desktop in ~/.config/mimeapps.list (following a symlink), retargets a dock pin from org.gnome.Nautilus to folio, and drops Nautilus, nautilus-python, nautilus-dropbox, and Sushi.
  • New installs edit in Plain (Start new installs with Plain as the default editor omacom/omarchy#18398). Setup > Default > Editor offers Plain, and text files open there. Existing installs keep Neovim: migration 1794341736 saves nvim when no editor was chosen, and writes Neovim as the default for text types the user has not already set, including a choice that lives only in ~/.local/share/applications/mimeapps.list. Without a display, Plain falls back to vi, which every install already has. Vim was added for that fallback and then removed again.
  • Moonlight is no longer on every install (Move Moonlight from a default install to Install > Gaming omacom/omarchy#18397). It leaves the base package set. Existing installs keep it, and there is no migration. Install > Gaming and Remove > Gaming offer it. The window rule stays for anyone who installs it.
  • Qt apps theme through qtengine (Use qtengine for qt theming omacom/omarchy#18325). qtengine replaces the GTK platform theme, so Qt apps use less RAM and take Omarchy's colors. Migration 1792902457 installs it, seeds ~/.config/qtengine/config.json only when the user has none, and the theme templates gain qtengine.colors.
  • The agents panel's starters follow a running local model (Open the agents panel's starters on a running local model omacom/omarchy#18357). Theme, plugin, and app starters open on a local model that is up, through the same --prefer-local path as the Quake console, and on the default agent otherwise. Shift-click or Shift+Return keeps the default agent. The tooltip names the local model, and names the default agent while Shift is held.
  • A local model that failed links to its logs. A stopped model with an error shows a Show logs link, by mouse or keyboard, opening omarchy-agent-local logs <recipe> in a floating terminal. That includes the other half's log when the model is paired across two Sparks.
  • A cabled DGX Spark is offered at the top of the agents panel. When omarchy-local-ai's status says another Spark answers on the ConnectX-7 cable before link setup, the panel shows it the way it shows a recommended model. The button opens link setup in a terminal, which asks for the other machine's password once. The offer stays above the rest of the page.
  • Identical notifications collapse into one card again (Collapse identical notifications arriving together into one card again omacom/omarchy#18349). A web app open in several tabs was firing one toast per tab. A new notification that repeats a live card word for word within two seconds takes over that card's slot: one card, one history entry, and the superseded copy is closed at its sender. Same means the same app, source, headline, text, click command, and buttons. The picture is not compared, because Chromium hands each copy its own temporary file. The same words after the window are a second message, and a card on its way out is not brought back by a copy of itself. Unnamed toasts keep their own decks, and different buttons stay on their own cards.
  • Omarchy notifications show the sender's glyph. omarchy-notification-send names its app omarchy-action, and that name was resolving to the Omarchy logo ahead of the glyph, so a reminder showed the logo instead of its finger. Anonymous senders name no app, so their name is no longer looked up.
  • Dropbox shows sync progress. The panel reports transfer speed and progress, refreshes correctly when a status poll is already running, and leaves Dropbox's staging cache and internal metadata out of recent files and usage scans. Ordinary hidden files stay.
  • Gliff can share 1Password. While Gliff is connected, screen-sharing protection is lifted for every window, so 1Password can be shared. The capture override survives the remote service being replaced.
  • The ASUS ProArt PZ13 gets speakers and microphones (Support the ASUS ProArt PZ13's speakers and microphones omacom/omarchy#17970). The HT5306QA (Snapdragon X Plus) has no sound card without a board-named topology that linux-firmware does not carry. Setup and migration 1794017822 install asus-proart-pz13-audio. A later user's migration finds the package already installed and does not ask for another reboot.
  • The ASUS Vivobook S 15 shows the disk unlock prompt (Show the disk unlock prompt on the ASUS Vivobook S 15 omacom/omarchy#17352). The S5507QA (Snapdragon X Elite) left the panel black at unlock because the display driver waited for the USB-C DisplayPort chain, which loads only after unlock. The display, panel, USB-C chain, and Adreno microcode now load in the initramfs, as on the Yoga Slim 7x and Surface Pro 11. Migration 1793620666 applies that to existing S 15 installs and rebuilds the boot image once. The X Plus model shares the family name, uses another device tree, and is left alone.
  • A Snapdragon UKI takes linux-omarchy's own device trees (Take linux-omarchy's device trees before another linux-omarchy kernel's omacom/omarchy#18317). The trees came from the first /boot/dtbs/linux-omarchy*/qcom folder, and linux-omarchy-<name> sorts before linux-omarchy. With a second kernel installed, every boot image got that kernel's trees. linux-omarchy's folder is now named ahead of the pattern, including where the Surface Pro 11 finds its tree.
  • An autostarted herdr server starts in its own session. The server is launched with its own session id so it is not tied to the session that started it.
  • The remote-desktop plan is gone. Gliff shipped as Omarchy's remote desktop, so plans/remote.md is removed. A short-lived rewrite of that plan landed and was deleted in the same import.
  • Translations through Update translations omacom/omarchy#18403, including the new Plain, Files, Moonlight, Dropbox, and agents-panel strings.

The agents panel conflict kept the fork's shownProviders list (hidden providers stay hidden) and took upstream's Shift modifier on starters and the Show logs row. The logs row indexes shownProviders, matching the rest of that loop.

Verification

  • Cherry-pick of the 37 commits from 13f4592d2 through 11be9726f applied onto quattro 57af365e4. shell/plugins/agents/Panel.qml conflicted twice and was resolved as above. plans/remote.md was already deleted when Moonlight's edit and its revert arrived; the revert was empty and was skipped. git diff --name-only of HEAD vs upstream f428bb4fe is the same 256 paths as quattro vs c40eca98b. On the 199 paths upstream did not touch, the added and removed line counts match. The other 57 paths are a clean three-way merge of the fork delta with upstream, apart from the Panel.qml resolution. linux and linux-headers are still in the other-packages list. Face, Grok Bot, and Cursor are still in the menu. The Claude workflows and the translation-sync workflow are still absent.
  • bash test/shell.d/agents-panel-test.sh passed, including local-model offers, hidden offers, and the panel's sign-in and limit-window helpers.
  • bash test/shell.d/default-agent-test.sh passed, including --prefer-local opening the running local model and the usual agent otherwise.
  • bash test/shell.d/default-apps-test.sh passed, including editor defaults installing missing editors and selecting an editor that is already installed.
  • bash test/shell.d/command-operand-boundaries-test.sh passed, including launch-editor defaulting to Plain, running it inline for $EDITOR, and using vi without a display.
  • bash test/shell.d/dropbox-test.sh passed, including transfer progress, a queued refresh, and excluding internal metadata and cache while retaining ordinary hidden files.
  • bash test/shell.d/notifications-test.sh passed, including the notification policies (duplicate collapse, and the omarchy-action glyph no longer resolving to the Omarchy logo).
  • bash test/shell.d/hardware-quirks-test.sh passed (6), including the Vivobook S 15 writing its initramfs drop-in on that DMI name and the ProArt PZ13 installing asus-proart-pz13-audio only on that machine.
  • bash test/shell.d/snapdragon-hardware-test.sh passed (3). bash test/shell.d/surface-pro-11-hardware-test.sh passed.
  • Could not run remote-session-service-test.sh (it needs quickshell and grim) or boot a Vivobook S 15, a ProArt PZ13, or a cabled DGX Spark, so the unlock prompt, the PZ13 audio, and the Spark offer were not checked on hardware. No other sync was open.

Screenshots

No visible change: this checkout has no Omarchy session, so nothing was drawn here. Files replacing Nautilus, Plain as the editor, the agents panel, Dropbox progress, and notification cards are visible on a machine; the tests above cover the behavior that can run here.

Open in Web View Automation 

birkskyum and others added 30 commits November 10, 2026 23:02
…'s (omacom#18317)

The Snapdragon UKI's trees come from the first /boot/dtbs/linux-omarchy*/qcom
folder, and linux-omarchy-<name>/qcom sorts before linux-omarchy/qcom. With a
second kernel named after linux-omarchy installed, every boot image got that
kernel's trees. Name linux-omarchy's folder ahead of the pattern, here and
where the Surface Pro 11 finds its tree.
Reduces Qt app ram usage and uses the Omarchy theme's colors
omacom#18349)

* Collapse identical notifications arriving together into one card again

A web app open in several tabs fires one notification per tab for a
single reminder: a HEY calendar reminder arrived from Chromium twice,
12 ms apart, under ids 9 and 10, and stayed on screen as two identical
critical cards.

omacom#13522 collapsed these, but the check went out with the old engine when
the notification engine was replaced (4671ae2), and the new one never
gained it.

A new notification that repeats a live card word for word within two
seconds now takes over that card's slot, the way a replaces_id update
does: one card, one history entry, and the superseded copy is closed at
its sender. Same means the same app, source, headline, text, click
command and buttons. The picture is not compared, since Chromium hands
each copy its own temporary file; the click command is, since every
screenshot toast shares its text but opens a different file. The same
words after the window are a second message, and a card on its way out
is not brought back by a copy of itself.

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

* Keep unnamed toasts in their own decks and different buttons on their own cards

Two regressions in the duplicate collapse, both found in review.

The row was snapshotted before its key was chosen, so an omarchy-action
or notify-send toast, which is grouped by its own key, got the group
"toast:" with no key: unrelated notices fell into one deck, the newest
hiding the rest. The group is rebuilt once the key is known.

The match compared Omarchy's command hints but not the sender's own
actions, so the same words offering Reply and then Join merged, and the
first button was lost with its sender. A copy now has to offer the same
buttons as the card it repeats.

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
* Open the agents panel's starters on a running local model

The theme, plugin and app starters went to the default agent with its own
config, so a pi set to a local provider by hand hit a stale endpoint
instead of the running model's. They now take the local model when one
fit for agent work is up, through the same launch overlay as --local,
and the default agent otherwise.

omarchy-agent gains --prefer-agentic-local: --prefer-local, passing over
recipes the catalog marks agentic: false, since the starters are long
builds a small fast model would fail partway through. The tooltip names
the model a starter will open on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Take any running local model for the starters, as --prefer-local does

A loaded model is the choice; there is no catalog judgement on top of it.
Drops --prefer-agentic-local.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Shift-click or Shift+Return a starter for the default agent instead

With a local model up, holding Shift opens the default agent as before,
and the tooltip says so. PanelKeyCatcher's activateRequested now carries
the held modifiers, as textKey already does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Show the default agent in a starter's tooltip while Shift is held

No standing hint: the tooltip names the local model, and holding Shift
swaps it for the default agent that a Shift-click would open.
PanelKeyCatcher tracks shiftHeld for this.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Mark Groves <mark-groves@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
A local model that stopped with an error now shows a Show logs link under
it, by mouse or keyboard, opening omarchy-agent-local logs <recipe> in a
floating terminal: the error, the setup and model journals and, for a
model paired across two Sparks, the other half's log.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Mark Groves <mark-groves@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
omarchy-notification-send names its app omarchy-action, and the icon
lookup resolved that name to the Omarchy logo, which took the icon slot
ahead of the glyph. Reminders showed the logo instead of their finger.
Anonymous senders name no app, so their name is no longer looked up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A real row carries the app name as its source, so omarchy-action still
reached the icon lookup. Test with Store.snapshot rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Support the ASUS ProArt PZ13's speakers and microphones

The ProArt PZ13 (HT5306QA, Snapdragon X Plus X1P-42-100) has no sound
card without a board-named topology linux-firmware doesn't carry. The
asus-proart-pz13-audio package from omarchy-pkgs builds it, and
alsa-ucm-conf there carries its UCM profile. Install the package on this
laptop at setup, in a migration for existing installs, and list it for
offline installs.

* ProArt PZ13 migration: leave a machine that has the package alone

Migrations run once per user, so a later user's run found the package installed and still asked for a reboot.

---------

Co-authored-by: omarchybot <omarchybot@users.noreply.github.com>
omarchy-local-ai's status.json says when another Spark answers on the
ConnectX-7 cable before link setup (link.state available); the panel
shows it like a recommended model, and its button opens link setup in
a terminal, since that asks for the other machine's password once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
The Vivobook S 15 S5507QA (Snapdragon X Elite) leaves the panel black at the unlock prompt, because the display driver waits for the USB-C DisplayPort chain, which only loads after unlock. Load the display, panel and USB-C chain drivers and the Adreno microcode in the initramfs, as the Yoga Slim 7x and Surface Pro 11 do. A migration applies it to existing S 15 installs and rebuilds the boot image once. The X Plus model shares the family name, uses another device tree and is left alone until someone tests it.

Co-authored-by: omarchybot <omarchybot@users.noreply.github.com>
PanelKeyCatcher's activateRequested now carries the key's modifiers, so the
fixture's bare call threw "Insufficient arguments" and network-panel-runtime-test
failed on quattro and every PR against it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gliff shipped as Omarchy's remote desktop, so the plan to turn Sunshine
and Moonlight into one is superseded. Revision 2 records what Gliff
already covers and narrows the remaining work to discoverability: a
manual chapter, the sshd prerequisite, and the known limits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gliff shipped as Omarchy's remote desktop, so the plan is done.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moonlight is a niche client for streaming from a Sunshine host, so it no
longer earns a spot in every install. Existing installs keep it; there is
no migration, and the preinstall removal no longer treats it as Omarchy's
to uninstall. The window rule stays for anyone who installs it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Mark Groves <mark-groves@users.noreply.github.com>
Now that Moonlight no longer ships by default, put it next to the other
gaming installs, with a matching Remove > Gaming entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
dhh and others added 7 commits November 10, 2026 23:04
New installs edit config and text files in Plain. Existing installs keep
Neovim: a migration saves it as their editor when none was chosen, and
keeps text files opening in it. Neovim stays preinstalled, and $EDITOR
falls back to it without a display.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vim joins the base packages, so an SSH session or a TTY edits in Vim
when Plain can't open a window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every install already has vi, so nothing is added: vim leaves the base
packages again, and vi joins the terminal editors the launcher runs in
place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The migration counts a text type as chosen when the older
~/.local/share/applications/mimeapps.list sets it too, so a Neovim line in
~/.config can't hide that choice. The migration test goes (migrations get
none), only the English catalog gains the Plain menu label, and the
launcher's Plain branch is a full if/else.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mark-groves
mark-groves merged commit c08496a into quattro Nov 11, 2026
5 checks passed
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.

6 participants