I would like Omarchy's Image Picker to expose a small, generic control and state interface for external input devices and automation.
I have a working prototype on a 2016 T1 MacBook Pro where the Touch Bar becomes a theme carousel while Omarchy's theme picker is open:
The prototype currently achieves this with a user-owned clone of omarchy.image-picker and a DFR-specific IPC/file bridge. It works, but that bridge is deliberately not suitable for upstream: it contains Touch Bar-specific target names, runtime filenames, and theme-path detection.
Rather than upstreaming that hardware-specific bridge, I would like to contribute a generic Image Picker contract that other integrations can reuse.
https://github.com/user-attachments/assets/d52129d8-e14c-4bd0-a21a-db726e2be9c0
The existing image-selector IPC target could expose methods along these lines:
omarchy-shell image-selector state omarchy-shell image-selector setCursor <path-or-name> omarchy-shell image-selector apply
Example state response:
{
"opened": true,
"context": "theme",
"cursorPath": "/home/user/.cache/omarchy/theme-selector/previews/kanagawa.png",
"cursorName": "kanagawa"
}
Suggested behavior:
state reports whether the picker is open and which item currently owns the cursor.setCursor performs an exact match against the currently loaded rows, moves the cursor, and does not apply or close the picker.apply reuses the existing applySelected() flow.closed result.unknown and leave the current cursor unchanged.An optional semantic context could be carried by the picker request, for example:
omarchy-menu-images --context theme ... omarchy-menu-images --context background ...
This avoids external consumers identifying the picker type from cache-directory names. Third-party callers could use their own context values.
If the preferred architecture is to keep control on the plugin instead of extending the direct target, the same interface could be exposed through the existing plugin dispatcher:
omarchy-shell shell call omarchy.image-picker state "" omarchy-shell shell call omarchy.image-picker setCursor "kanagawa" omarchy-shell shell call omarchy.image-picker apply ""
I am happy to follow whichever IPC surface best fits the shell architecture.
For external hardware, page-to-device updates should not require continuously launching polling processes. The local prototype atomically publishes the current cursor into $XDG_RUNTIME_DIR and the hardware daemon watches it.
For an upstream implementation, possible generic options are:
state first and let consumers poll it while the picker is open.$XDG_RUNTIME_DIR/omarchy/image-selector-state.json, which consumers can watch with inotify.I would appreciate guidance on which option maintainers prefer. The control methods are useful independently of the notification mechanism, so this could also be split into two small changes.
The Touch Bar is the first tested consumer, but the interface would also support:
The Image Picker already has the necessary internal state and operations: opened, selectedIndex, currentPath(), select(), and applySelected(). This proposal would expose a narrow, validated surface around those existing behaviors rather than introduce a second selection model.
This suggestion is only about the generic Omarchy Image Picker interface.
It would not add any of the following to the Omarchy repository:
The hardware implementation would remain in its own GPL-licensed project. A future optional Omarchy installer integration could be discussed separately after packaging and broader hardware testing.
The current local prototype has been tested with all 22 themes exposed by the Omarchy theme picker. The picker and Touch Bar use the same ordered theme set.
Verified interactions:
A short demo recording and a public prototype branch can follow after the
hardware changes are split and the proposed upstream direction is confirmed.
omarchy.image-picker?image-selector target or use shell call omarchy.image-picker ...?state acceptable for the first PR, or would a generic runtime state file/event mechanism be preferred?context field in the same PR or as a separate follow-up?If the direction sounds reasonable, I can prepare a focused PR with documentation, shell tests, and visual verification, without including any Touch Bar-specific code.
Boyd Vintage Apples Edited
We should discuss this!
In my opinion, Apple's touchbar's binding of the Touch Bar to app-drive experiences is actually a negative, to a positive.
One of the core usecases I see for the Touch Bar today is as an "agent monitor" status bar for developers. This would require the touchbar contents to remain constant regardless of what is being displayed on screen on order to be maximally useful.
I'm working on a package that supports Touch ID and the Touch Bar on T1 macs. The Touch Bar support stops at "allowing users to render arbitrary graphics onto the bar" rather than being opinionated about what is shown and why. It will ship with a basic Apple-like hardware control theme + fn key F keys support but the intent will be for users (and their agents) to override it for whatever they want.
So with that in mind, if a user wants an experience like — this where the Touch Bar reflects whatever app is focused — rather than a global always-on state (such as an agent monitor)... Then we should find a way to support both!
Open to suggestions here. I think what you're showing is really cool. But if I wanted my "agent monitor" to be the thing I was seeing and then something else caused it to be a preview of my spaces instead, I'd be confused.
I think my question boils down to: How can we allow for a variety of Touch Bar experiences without tying the Touch Bar to what's being actively shown on screen?
Xudong Guo External contributor
What I’m building is essentially functionality that has long been available on the MacBook Touch Bar: distinct Touch‑Bar UI for different applications as you switch between them. For instance, a video‑editing app would show a video timeline on the Touch Bar.
That said, very few applications have actually implemented this capability. Fortunately, Omarchy is here.
My proposal is to ship built‑in default Touch‑Bar interactions for Omarchy’s native features — this would be really cool. Users will be able to disable these default behaviors in settings and take full control to customize the Touch‑Bar experience however they prefer.
Boyd Vintage Apples
That sounds great. So long as we're not repeating Apple's sins of forcing the Touch Bar experience to be more "Actions for the focused app" instead of "A HUD you can persist however you please" I'm on board! 😄