◉ A real client, not a web view
Programmatic UIKit on iOS, GTK4 on Linux, AppKit on the Mac — Swift 6 end to end, zero web views. Streaming transcripts with collapsible thinking and tool groups, and syntax-highlighted code with one-tap, byte-exact copy.
∿ Written, not pasted
Text leaves a model in lumps, so every client plays the answer out of a buffer at a reading pace: the reveal counts rendered characters and a shimmer wave rides the newest span. Frames come from the display's own clock — CADisplayLink at up to 120Hz on iPhone, GTK's frame clock on Linux — and nothing ever re-wraps under the reader: a frame changes colours, never layout.
❋ Ultracode wears a rainbow
Push a turn to the deepest reasoning tier and the app says so out loud: the composer's edge burns with the ultracode rainbow, the effort chip names it, and the presence orb wears the same rim while the turn runs. You can read a session's effort from across the room.
⌘ Three desks, one registry
Every capability is a case in a shared parity registry, and each client must answer it in an exhaustive switch — adding a feature to one client refuses to compile until all three have decided what they do about it. Nothing ships to one screen silently.
◈ Three agents, one app
Drive opencode directly, Claude Code through claude-bridge, and Oh My Pi through omp-bridge — two open-source companion servers that turn a terminal agent into structured, streaming, subscription-backed sessions, with push notifications on Claude. Every model Oh My Pi can reach — Ollama Cloud, OpenCode Go, OpenRouter, Anthropic, xAI, DeepSeek — is one picker away, filterable by the subscription that pays for it.
❖ Lock Screen status board
A Live Activity per session shows the phase, elapsed time, and tool counts in real time. Approvals alert you, finished turns linger with the outcome, and updates arrive by push even while the app is suspended.
⊹ Steer without stopping
Queue a follow-up while the agent works, edit it before it lands, stop the turn server-side, fork the conversation, or answer the agent's structured questions with a tap. Subagents open in place; a compaction becomes a seam you can read instead of a wall of summary.
◐ Eight themes, two faces each
One catalog shared by every client, from Suomi's aurora-over-a-frozen-lake to fresh snow by day. Every color is pushed through an OKLab contrast corrector until it clears WCAG on its own canvas — a theme that cannot be made readable fails the build.
⬡ The month has numbers
Every server's transcripts are priced turn by turn and merged into one account: daily bars, the week's rhythm, models, projects, tools, and what caching saved — plus a trophy room that scores the same ledger, and wears it in Game Center on iPhone.
⑂ The repo, read — never operated
Branch, drift, conflicts, staged and changed files, and per-file diffs, read from the machine that has to live with them. A chip in the chat chrome spells the tree out the way a prompt does. Nothing offers to commit from your phone.
↻ Updates are standing facts
Every machine in the picture — this app and each server — reports what it runs and what it could run, and one quiet mark in the chrome stays until the update is taken. A Linux package install checks the project's own release feed and hands over your package manager's command when a newer release exists; a bridge is installed end to end under one press.
✦ One question, from anywhere
On the desktops a global hotkey summons a quick ask over whatever you are doing — no project, no setup. On the phone it lives in the jump list and Control Center. The answer lands in a real conversation you can pick up later.
◦ A cue is a meaning, not an amplitude
Send, step, needs-you, received — each is a composed Core Haptics recipe authored to stay pleasant at the top of the slider: rounded body, soft attack, never an alarm. One intensity dial scales every cue, and a burst of tool calls is felt as progress rather than a rattle.