Skip to content

Sync upstream quattro through #18951 - #133

Merged
mark-groves merged 16 commits into
quattrofrom
cursor/upstream-changes-pr-6f64
Nov 15, 2026
Merged

mark-groves merged 16 commits into
quattrofrom
cursor/upstream-changes-pr-6f64

Conversation

@cursor

@cursor cursor Bot commented Nov 14, 2026

Copy link
Copy Markdown

What changes

Upstream quattro moved past omacom#18831 (6baca275b), which is what #132 merged. Sixteen commits replayed onto current quattro, through 6f646bc9d (ASUS Vivobook S 16 unlock prompt, omacom#18951). No merge commits. Nothing skipped. One conflict, in the agents panel. Fork delta vs 6f646bc9d is 253 paths, the same set as quattro vs 6baca275b. On the 195 paths upstream did not touch, the added and removed lines are unchanged. A three-way merge of the 58 paths both sides changed matches this branch, except the agents panel, resolved below. Face, Grok Bot, Cursor, linux / linux-headers, and the dropped translation-sync workflow stay.

  • First boot can carry an OEM's name and agreement (Show an OEM's branding and agreement in first-boot setup omacom/omarchy#18841). An OEM that prepares machines with the Omarchy ISO can leave a bundle in /etc/omarchy/oem. install/provisioning/oem.sh reads it for owner setup: the OEM's logo, tagline, and colour stand in for Omarchy's on the greeter, and again above the agreement, which is the last question, after the review and before anything is created. Declining leaves the machine as it left the factory and offers to shut down, with going back in focus. Accepting records the OEM, the text's hash, the account, and the time in /var/lib/omarchy/oem/eula-accepted.json. The agreement is one screen: the text in a frame that scrolls, with the question and buttons under it. console-font.py draws the logo's braille patterns into glyphs the screen does not otherwise use, and setup sets that font only while a branded screen is up. A console that cannot be given the dots shows Omarchy's logo. The logo's colour goes in the palette's bright red slot, so the buttons and marks keep their own colours. A colour that is not #RRGGBB is ignored. The re-key journal test stubs the new agreement step so it does not loop.
  • A fresh link no longer flashes "limited" (Wait out NetworkManager's passing Limited state on connect omacom/omarchy#18869). NetworkManager reports every new link as Limited until its first connectivity probe answers. The panel and bar were painting the red warning for that moment. Limited counts as an outage only once it has held; until then the state stays unknown. The wait starts over after a warning has already shown.
  • Slack theme sync is gone (Remove Slack theme sync omacom/omarchy#18788). Slack 4.53 refuses the debugging pipe the themed launcher started it with, so themed Slack no longer opened. This returns existing installs to Slack's own launcher. Migration 1794642577 drops the themed launcher, the theme template, and the sync scripts. Install > Service > Slack, the package, stays.
  • The Yoga Slim 7x stays asleep in deep suspend with the lid open (Keep the Yoga Slim 7x asleep in deep suspend with the lid open omacom/omarchy#18835). On a Qualcomm Yoga Slim 7x (83ED), a system-sleep hook keeps that suspend from waking itself. Setup installs it, and migration 1794609353 installs it on an existing machine that does not have it yet. Other machines are untouched.
  • The Surface Laptop 8's second USB-C port gets its USB4 firmware (Copy the Surface Laptop 8's second USB4 router image on existing installs omacom/omarchy#18782). linux-omarchy now runs USB4 on that port, and the port's router takes an image of its own. Migration 1794594909 copies it on a Surface Laptop 8 (microsoft,surface-laptop-8-13p8 or microsoft,surface-laptop-8-15) whose support package is 1-7 or newer, then rebuilds the boot image and asks for a reboot. An older package leaves the migration pending. A machine whose Windows USB4 driver cannot be read is told how to copy the image later, and the other migrations continue.
  • Activity Monitor opens btop from the launcher (Add Activity Monitor to the app launcher for btop omacom/omarchy#18764). New installs get a launcher that opens btop the same way Super+Shift+T does, with a themed icon drawn like btop's own panels.
  • A first local model is set up in the agents panel (Set up a first local model entirely in the agents panel omacom/omarchy#18907). Download and Add another › Local AI no longer open a terminal. A detached setup that is missing Podman installs it through pkexec, and the panel runs the setup itself: an Installing line until the download takes over, the reason if it fails, and the offer again if the password dialog is dismissed. A second model chosen while the first is still installing Podman waits on a line of its own and starts once the first hands off. Delete on a setup the panel still owns forgets a failure, drops one waiting, and leaves the one installing packages alone. Podman and crun join the base install, about 26 MiB on the ISO. The NVIDIA container toolkit is installed with the NVIDIA driver, including the N1x package set, so a local model can reach the GPU. linux and linux-headers stay in the other-packages list beside it. The panel conflict kept shownProviders, so paused collectors and a duplicate unified pool stay hidden, and the new delete path uses that index.
  • Herdr, Agent, and ChatGPT join the launcher, and a dock click can be told how to answer (Add Herdr, Agent and ChatGPT to the launcher, and let apps pick how a dock click answers omacom/omarchy#18909). Herdr opens under org.omarchy.herdr, so the dock matches its window, and the launcher and Super+Ctrl+Return focus the open window instead of attaching another terminal. Agent runs omarchy-agent --pick, like Super+Shift+Ctrl+A, and claims org.omarchy.agent. ChatGPT opens chatgpt.com, like Super+Shift+A, with OpenAI's knot on its own. X-Omarchy-Dock-Click=new opens a new window on every click, which Terminal and Agent ask for, and =workspace brings back a window only from the workspace in front. A minimized window of those apps comes back before a new one opens. The scan that read hidden entries now also reads this key, and is desktop-entries.sh. Terminal, Herdr, and Agent share cliamp's terminal window; ChatGPT's knot stands alone.
  • Closing the update's terminal ends it at the prompt (End omarchy update when its terminal closes at a prompt omacom/omarchy#16045). omarchy update keeps an untrapped shell as the PTY session leader, so a hangup reaches the foreground prompt instead of waiting on the update's signal traps. The logger restores the caller's SHELL inside that command, so hooks and package builds keep their environment, and the update's exit status is preserved. The update lock records the acquiring PID for the message a second update prints. The flock still decides the hold; a rejected contender leaves that PID in place, and a stale PID does not block the next acquisition. Grok Bot and Cursor still follow AUR and share the update's authorization, and the boot check stays the last sudo-capable step.
  • Snapdragon X2 Plus machines use Kalambo's device trees (Pick the Kalambo device trees on Snapdragon X2 Plus laptops omacom/omarchy#18944). Kalambo (X2P-42-100) trees are named kalambo-* and their root names only qcom,kalambo. The UKI's tree list and the Glymur display setup for disk unlock now include them.
  • The disk unlock prompt shows on the Acer Aspire 16 AI A16-11M (Show the disk unlock prompt on the Acer Aspire 16 AI A16-11M omacom/omarchy#18743). The display driver binds only once every output's chain has loaded, which was happening from the real root, so the screen stayed black at the prompt. Setup loads the panel, USB-C DisplayPort, retimer, HDMI bridge, IPC router, and PD mapper in the initramfs, plus the Adreno X1-45 microcode. The Aspire 14 AI shares the tree's outputs and is left out until it has been tried. Migration 1794526429 applies it on an existing Aspire 16 AI.
  • The disk unlock prompt shows on the ASUS Vivobook S 16 S3607QA (Show the disk unlock prompt on the ASUS Vivobook S 16 S3607QA omacom/omarchy#18951). Same black screen: the display chain loads from the real root. Setup loads the panel, USB-C DisplayPort, retimer, and HDMI bridge with the IPC router and PD mapper in the initramfs. Migration 1794695964 applies it on an existing Vivobook S 16.
  • Translations through Update translations omacom/omarchy#18919 (Update translations omacom/omarchy#18860, Update translations omacom/omarchy#18910, Update translations omacom/omarchy#18914, Update translations omacom/omarchy#18919), including the new first-boot, local-model, and launcher strings. The English catalog still has the fork's face strings, Grok Bot strings, and AUR-held strings. agents.helpStartToSeeLimits and the power-profile menu strings stay out of the catalogs.

Verification

  • Cherry-pick of the sixteen commits from 2c8d93be0 through 6f646bc9d applied onto quattro 1141aef53. shell/plugins/agents/Panel.qml conflicted and was resolved as above. git diff --name-only of HEAD vs upstream 6f646bc9d is 253 paths, the same set as quattro vs 6baca275b. On the paths upstream did not touch, the added and removed line counts match. The 58 paths both sides changed three-way merge to this branch, apart from the agents panel index. linux and linux-headers are still in the other-packages list. Face, Grok Bot, and Cursor are still in the menu. The translation-sync workflow is still absent. cursor-agent is still out of the mise tool list. Power profiles still write through busctl.
  • ./test/cli passed (133).
  • ./test/shell was not run as a whole. The files this sync covers passed: agents-panel-test.sh (113, including the in-panel setup, the queue, and a dismissed password), dock-test.sh (48, including new, workspace, and minimized dock clicks), desktop-entries-test.sh (2), i18n-test.sh (401, one structural skip), nvidia-install-packages-test.sh (4), network-captive-portal-test.sh (74), theme-staging-test.sh (8), launcher-remove-test.sh (5), yoga-slim7x-hardware-test.sh (2), hardware-quirks-test.sh (6), snapdragon-hardware-test.sh (3), luks-rekey-journal-test.sh (27). provision-owner-keyboard-test.sh passed (33, one skip) once this machine's kbd-model-map had a ge row bound over it. The host map is 72 lines and has no ge row, so the first run stopped on "the Georgian layout (ge) gets an XKB layout" before the OEM cases. The skip is no readable VT, so the console-font size choice was not built.
  • network-panel-runtime-test.sh skipped: no Wayland compositor, so the Limited wait was not drawn.
  • update-hangup-test.sh stopped on "close-terminal: gum survived terminal loss". Closing a PTY master in this sandbox leaves both a bare gum confirm and script running sleep alive, so the hangup the test is watching for is not delivered here.
  • update-lock-test.sh stopped on "first omarchy-update reached snapshot under lock". /run/user/1000 does not exist here, which is where that test puts the lock. The new PID checks sit after that and did not run.
  • This checkout has no Omarchy session, so the OEM screens, the Wi-Fi warning, the agents panel, the dock, and the unlock prompt were not checked on a machine. No other sync was open.

Screenshots

No visible change: this checkout has no Omarchy session, so nothing was drawn here. The OEM greeter and agreement, the Wi-Fi warning, the agents panel's Installing line, and the new launcher icons are visible on a machine; the tests above cover the behavior that can run here.

Open in Web View Automation 

spencerbull and others added 16 commits November 14, 2026 23:05
* Show an OEM's branding and agreement in first-boot setup

An OEM that prepares machines with the Omarchy ISO had no way to put its name on first-boot setup or to have the owner accept its terms. The ISO can now leave a bundle in /etc/omarchy/oem (omarchy-iso-make --oem-config in omarchy-iso), and install/provisioning/oem.sh reads it for omarchy-provision-owner: the OEM's logo, tagline and colour stand in for Omarchy's on the greeter, and under that logo again its agreement is the last question, asked after the review and before anything is created, so a machine whose owner declines is still as it left the factory. The steps of the form between the two stay under Omarchy's logo.

The agreement is one screen: the text in a frame that scrolls, with gum confirm's question and buttons under it. gum has no widget that scrolls text above a question, so oem.sh draws this one and reads its keys itself. bash's read turns the console's signals back on, so Ctrl+C arrives there as SIGINT; it is trapped for as long as the agreement's screens are up and answered as the form's usual signal status. Declining offers to shut down with going back in focus. Accepting records the OEM, the text's hash, the account and the time in /var/lib/omarchy/oem/eula-accepted.json.

A logo may be drawn in braille dots, which Terminus has none of. console-font.py takes the logo and the text shown with it and draws the patterns the logo uses into glyphs neither needs, and setup sets that font while a branded screen is up and the form's own again after it. The screen is cleared before either change, since the console draws what is on it from whichever font is set, and a console that cannot be given the dots shows Omarchy's logo.

The logo's colour goes in the palette's bright red slot, which setup draws nothing else in, so the buttons and marks keep their own colours whatever the OEM picks. The logo reaches gum after an option terminator, since art may open with dashes.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Codex XHigh <noreply@openai.com>

* Stub the agreement in the re-key journal test

luks-rekey-journal-test.sh lifts run_setup and run_provisioning out of omarchy-provision-owner and stubs the steps around the re-key. With no stub for the new agreement step, run_setup took the missing eula_form for an owner going back, returned to the keyboard step and came round again for ever, which is the test check running out its 1500 seconds. eula_form is stubbed with the other forms and record_eula with the other account steps.

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

---------

Co-authored-by: Claude Fable 5.2 <noreply@anthropic.com>
Co-authored-by: Codex XHigh <noreply@openai.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
)

* Wait out NetworkManager's passing Limited state on connect

Every fresh link is reported as Limited until NetworkManager's first
connectivity probe answers, so switching networks flashed the red
limited internet access warning in the panel and bar for a moment.

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

* Check the Limited wait restarts after a warning has shown

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

---------

Co-authored-by: Claude Fable 5.2 <noreply@anthropic.com>
* Give themed Slack a profile of its own

Slack 4.53 refuses a debugging pipe on its default profile, so the themed
launcher's Slack exited before opening a window.

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

* Revert "Give themed Slack a profile of its own"

This reverts commit 54be7a5.

* Remove Slack theme sync

Slack 4.53 refuses the debugging pipe the theme launcher starts it with, so
themed Slack no longer opens. This reverts omacom#17113 and returns existing
installs to Slack's own launcher.

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

---------

Co-authored-by: Claude Fable 5.2 <noreply@anthropic.com>
New installs get an Activity Monitor launcher that opens btop the same way Super + Shift + T does, with a themed icon drawn like btop's own panels.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Set up a first local model entirely in the agents panel

The panel's Download and Add another › Local AI no longer open a terminal.
A detached setup missing Podman installs it through pkexec, and the panel
runs the setup itself, showing an Installing line until the download takes
over, the reason if it fails, and the offer again if the password dialog
is dismissed.

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

* Queue a second local setup and keep Delete off one starting

Choosing another model in Add another › Local AI while one setup was still
installing Podman did nothing. It now waits on a line of its own and starts
once the first hands off to the background; a failed or declined first
setup drops it too. Delete on a setup the panel owns no longer offers to
delete weights: it forgets a failure, drops one waiting, and leaves the one
starting alone.

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

* Ship Podman and the NVIDIA container toolkit in the install (omacom#18908)

* Ship Podman in the base install

Local models run in Podman, so a fresh install has it ready instead of
asking for a password on the first model setup. It's about 26 MiB on the
ISO with crun and its dependencies. Machines installed without it still get
it on first setup.

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

* Install the NVIDIA container toolkit with the NVIDIA driver

Local models reach the GPU through the CDI spec the toolkit writes, so an
NVIDIA machine now gets it alongside its driver instead of behind a password
prompt on the first model setup. The ISO's offline mirror and the N1x
package set carry it.

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

* Drop the toolkit comment from the N1x package list

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

* Stop saying Podman comes on first model setup

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

---------

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>
… dock click answers (omacom#18909)

* Add Herdr to the app launcher, focusing its window when it's open

Herdr now opens under its own app id, org.omarchy.herdr, so the dock matches its window to the launcher, and both the launcher and Super + Ctrl + Return focus the open Herdr window instead of attaching another terminal. The icon is the ram from Herdr's logo, drawn in the theme's colors.

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

* Add Agent to the app launcher

It runs omarchy-agent --pick, like Super + Shift + Ctrl + A, and claims the org.omarchy.agent windows in the dock. The icon is a terminal window with sparks, drawn in the theme's colors.

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

* Bring the ChatGPT web app back to the app launcher

It opens chatgpt.com like Super + Shift + A, with OpenAI's knot drawn in the theme's colors.

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

* Let desktop entries pick how a dock click answers

X-Omarchy-Dock-Click=new opens a new window on every click, as Terminal and Agent now ask for, and =workspace brings back a window only from the workspace in front of the user. Quickshell doesn't parse custom keys, so the scan that already read hidden entries reads this one too, and becomes desktop-entries.sh.

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

* Draw ChatGPT's knot on its own, without a terminal tile

It's a web app, not a TUI, so it stands alone like the Browser's globe.

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

* Bring a minimized window back before a dock click opens a new one

With X-Omarchy-Dock-Click set to new or workspace, a minimized Terminal, Agent or Files window had no way back, since the dock is the only way to restore one.

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

* Draw the Agent icon as the agents panel's robot

The same robot-excited mark the agents panel uses, from Material Design Icons, in the theme's colors.

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

* Put the Agent robot on a terminal tile, as Herdr's ram

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

* Draw Terminal, Herdr and Agent in cliamp's terminal window

Every terminal icon now shares one window, 360 by 328 with a 22 radius, as cliamp, disktree and Activity Monitor already did.

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>
* End omarchy update when its terminal closes at a prompt

* Record the update lock acquiring PID for diagnostics

---------

Co-authored-by: Tobi Lutke <tobi@shopify.com>
)

Kalambo (X2P-42-100) trees are named kalambo-* and their root names only qcom,kalambo, so the UKI's tree list and the Glymur display setup for disk unlock both missed them.
…#18951)

Its display driver binds only once every output's chain has loaded, which happens from the real root, so the screen stayed black at the unlock prompt. Load the panel, USB-C DisplayPort, retimer and HDMI bridge drivers with the IPC router and PD mapper in the initramfs, as for the Aspire 16 AI.
@mark-groves
mark-groves merged commit 2e5cc94 into quattro Nov 15, 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.

7 participants