One prompt. The checked providers answer together.
Write one prompt, choose the providers, and compare their answers side by side. Disparchy brings local AI CLIs and compatible HTTP endpoints into one focused panel.
Plugin id: dkfiander.disparchy · Install: ~/.config/omarchy/plugins/dkfiander.disparchy/
Repo: DonnieFi/Disparchy · Architecture: docs/architecture.md
You keep one prompt. Each checked provider runs on its own with its own model, and a failure in one column leaves the others running. The Ask screen gives the prompt room, with Clear above Send and Cancel taking Send’s place while a run is active.
| Provider | Talks to | Default |
|---|---|---|
| Claude | claude |
sonnet |
| Codex | codex exec |
CLI default |
| Grok | grok |
CLI default |
| Antigravity | agy |
CLI default |
| Cursor | cursor-agent |
CLI default |
| OpenClaw | gateway on port 18789, or the local node. An API key uses POST /v1/chat/completions |
CLI default, or openclaw/default with a key |
| Hermes | hermes chat --oneshot. An API key uses POST /v1/chat/completions |
Hermes default, or hermes-agent with a key |
| Ollama | http://127.0.0.1:11434 |
URL editable in Setup |
| LM Studio | http://127.0.0.1:1234 |
URL editable in Setup |
The first five providers are shown on the bar by default. Change that in Setup, where providers sit in two columns with status, endpoint, and enable controls. Auto-paste is a Setup preference and starts off. Model lists come from each CLI when you open the panel. Token counts are estimates based on character count divided by four.
The dispatch mark carries the idea in one shape: one prompt opening into three
answer lanes. The bar and panel header use the same mark, recoloured by the
theme. Light and dark SVG/PNG files live in assets/dispatch-mark.
History stores past runs locally. Comparison cards render common Markdown and grow with the answer. When the grid is taller than the screen, the result area scrolls vertically. The screenshot above shows the blank Ask screen; the image below previews the theme-aware dispatch mark.
Plugins run unsandboxed inside your long-lived omarchy-shell process. Only add repos you trust. Read the QML and bin/ before you enable this one (Omarchy shell plugins).
omarchy plugin add https://github.com/DonnieFi/Disparchy.git --enable
omarchy bar move dkfiander.disparchy --section rightFrom a checkout, ./install copies the files the shell loads into ~/.config/omarchy/plugins/dkfiander.disparchy. A symlink is replaced. An existing copy is refreshed. It stages in a new private directory (mktemp -d) beside plugins/ and removes only that directory, so nothing that existed before the run is deleted. Runtime state under $XDG_STATE_HOME/omarchy/dkfiander.disparchy/ is left alone.
./install
omarchy-shell shell rescanPlugins
omarchy plugin enable dkfiander.disparchyAfter installing or updating, run omarchy-restart-shell.
Validate:
omarchy plugin validate .
# or
omarchy plugin validate ~/.config/omarchy/plugins/dkfiander.disparchyOpen:
omarchy-shell shell summon dkfiander.disparchy '{}'QML changes need a shell restart. The runner is a new Python process on each send, so bin/disparchy-run updates without one.
omarchy restart shellA locked session refuses that restart.
Optional key. The plugin does not write this for you. Put it in ~/.config/hypr/bindings.lua. Super+Shift+M is Omarchy's Music key, so Disparchy uses A. If A is already ChatGPT, unbind it first.
hl.unbind("SUPER + SHIFT + A")
o.bind("SUPER + SHIFT + A", "Disparchy", "omarchy-shell shell toggle dkfiander.disparchy '{}'")| Action | How |
|---|---|
| Open or close | Click the dispatch mark, or Super+Shift+A if you added the bind. Esc closes |
| Ask | Type a prompt. Enter or Send compares replies; Shift+Enter adds a line |
| Arm a provider | Check its box. The arrow opens the model list |
| Setup | Setup shows or hides providers on the bar. Click the status word to sign in |
| History | History lists past runs. Back returns to the prompt |
| Auto-paste | Setup → Auto-paste clipboard fills an empty prompt when the panel opens. Off by default |
| Clear | Clear empties the prompt and hides the current answers. Dim when there is nothing to clear |
| Cancel | Cancel shows while a run is in flight. Pending columns become cancelled |
| Read an answer | Markdown formatting is shown in each result card, which grows with the answer. The result area scrolls vertically when the grid is taller than the screen. Copy keeps the original text |
A checkbox arms that provider for the next send. Setup decides whether the provider appears on the row at all. HTTP rows stay available when enabled, even if the server is down.
Status words on a Setup row:
| Word | Meaning |
|---|---|
| install | CLI is not on PATH |
| sign in | CLI is installed and the local probe says signed out |
| open | CLI is ready. Click to launch it |
| gateway | OpenClaw's gateway on 127.0.0.1:18789 answered |
| local node | OpenClaw is installed and the gateway is down |
| reachable | Ollama or LM Studio answered |
| endpoint down | The HTTP URL did not answer |
Sign-in opens a held terminal, xdg-terminal-exec, with that CLI's login command. HTTP rows have no login launch.
The header pill reads Idle, N armed, N running, Setup, or N saved.
The footer reads in N · out N · ≈ N this run · ≈ N saved. Each column ends with ≈ N out.
Bar-widget settings, also stored in shell.json under the widget entry:
| Key | Default | Notes |
|---|---|---|
timeoutSec |
90 |
15–300, per provider |
historyMaxRuns |
50 |
10–200 |
modelClaude |
sonnet |
Used when you have not picked a model |
modelCodex |
empty | Empty means the CLI default |
modelGrok |
empty | Empty means the CLI default |
modelAntigravity |
empty | Empty means the CLI default |
modelCursor |
empty | Empty means the CLI default |
Which providers are on the bar, which models you picked, and whether auto-paste is on, live in selection.json. That file is not in the widget schema.
Runtime state lives under $XDG_STATE_HOME/omarchy/dkfiander.disparchy/. When that variable is unset, the directory is ~/.local/state/omarchy/dkfiander.disparchy/. Nothing here is written into the plugin tree, because the shell watches that tree and reloads on every write. Only bin/disparchy-run reads and writes API keys.
| File | Purpose |
|---|---|
selection.json |
Armed models, enabled providers, HTTP URLs, autoPaste |
auth.json |
API keys for OpenClaw and Hermes. Only the runner reads and writes this file, at mode 0600. It refuses a symlink or a file readable by group or others |
history.json |
Past runs |
prompt.txt |
The prompt file each send reads |
status.json |
Last provider probe. Rewritten by the panel |
omarchy plugin remove dkfiander.disparchyThat disables and removes the installed plugin. Runtime state under ~/.local/state/omarchy/dkfiander.disparchy/ is left alone. Delete that directory if you want a clean slate.
| Need | Required? | Notes |
|---|---|---|
| Omarchy 4 / Quattro + Quickshell | yes | Bar widget host |
| Python 3 | yes | bin/disparchy-run, stdlib only |
wl-paste and wl-copy |
for auto-paste and copy | Text clipboard |
claude, codex, grok, agy, cursor-agent |
optional | Each one you want on the row |
openclaw |
optional | Gateway on port 18789, otherwise the local node |
hermes |
optional | Must already be the real CLI. A stub installer at that name will run on Send |
| Ollama or LM Studio | optional | HTTP. Defaults above |
Missing CLIs show as install. They are not send errors.
Target dkfiander.disparchy.
omarchy-shell shell summon dkfiander.disparchy '{}'
omarchy-shell shell hide dkfiander.disparchy
omarchy-shell dkfiander.disparchy open
omarchy-shell dkfiander.disparchy close
omarchy-shell dkfiander.disparchy toggle
omarchy-shell dkfiander.disparchy setup
omarchy-shell dkfiander.disparchy historyThe panel does not register a second IPC handler. Open, close, show, hide, and toggle are on the bar widget.
prompt.txt ──► disparchy-run --cli … --prompt-file …
│
┌─────────────┼──────────────┐
▼ ▼ ▼
local CLIs HTTP POST OpenClaw
│
▼
one column each
Up to six providers run at once. A seventh waits for a free slot. Cancel stops the queue. Columns already running finish or time out on their own.
The runner never passes --force, --yolo, --always-approve, or --dangerously-skip-permissions. It does not read ~/.grok/auth.json. An OpenClaw or Hermes API key stays in auth.json. The runner finds that file itself and, when a key is saved, puts it on the Authorization header. Setup's key field is write-only: Save runs disparchy-run --set-key <cli> with the text on stdin. copy hands the answer to wl-copy on stdin, not as an argument. The prompt never appears on a command line: Claude, Codex, Cursor, and Antigravity read it from stdin, and Grok, OpenClaw, and Hermes read the prompt file. Codex runs as codex exec --skip-git-repo-check -, because $HOME is not a trusted git directory.
Command lines, the selection file, and the caps are in docs/architecture.md.
Version lives in manifest.json only. Releases bump it, add a CHANGELOG.md entry, and should be tagged vX.Y.Z.
Built for Omarchy / Quickshell. The header, status pill, and tabs follow Lanarchy.
MIT. See LICENSE.
