Oh My Pi Desktop icon

Windows desktop app · v0.1.0 · MIT

A desktop client for the Oh My Pi coding agent.

omp ships with a terminal TUI and an RPC mode. This is the GUI — an Electron app that drives omp --mode rpc as a child process and renders the whole conversation: streaming markdown, tool-call cards, todos, and sessions.

Requires omp on your PATH. The installer is unsigned in v1 — SmartScreen will warn on first run.

The Oh My Pi Desktop window showing the onboarding screen with a Choose project button

Not a terminal wrapper. No PTY, no ANSI parsing, no screen scraping. It speaks omp's newline-delimited JSON protocol directly — framed, id-correlated, with v2 lossless chunking.

What it does

💬 Streaming chat

Assistant output as GFM markdown with syntax-highlighted code blocks and copy buttons. Deltas batch through requestAnimationFrame, so a fast stream doesn't jank the UI.

🔧 Tool-call cards

Every tool execution becomes an inline card — name, status, collapsible pretty-printed arguments, and the result or error excerpt, in transcript order.

📁 Sessions per project

Pick a project directory and the app groups sessions by the cwd in each session file's header. New, resume, rename, export to HTML.

📜 Incremental history

Most recent page first, then load older through cursor pagination. No monolithic history fetch, however long the session ran.

🎛 Mid-turn control

Abort, steer with an interrupting message, or queue a follow-up for after the turn. Plus model picker, thinking level, and fast mode.

♻️ Survives crashes

If the agent dies you get a banner, and it restarts on the same project and session with history replayed. The transcript is not lost.

How it fits together

Three layers, one responsibility each. The renderer is a pure projection of events — no agent logic, no filesystem access, no Node.

┌─────────────────────────────────────────────────────────┐
│ Renderer (React + Vite, Chromium)                       │
│  Chat transcript · tool-call cards · todos · sessions   │
└───────────────▲─────────────────────────────────────────┘
                │ contextBridge IPC (window.omp, typed)
┌───────────────┴─────────────────────────────────────────┐
│ Electron main (Node)                                    │
│  RPC client (JSONL framing, id correlation, v2 chunks)  │
│  omp process lifecycle · session store · window mgmt    │
└───────────────▲─────────────────────────────────────────┘
                │ stdin/stdout JSONL
┌───────────────┴─────────────────────────────────────────┐
│ omp --mode rpc [--cwd <project>]  (child process)       │
└─────────────────────────────────────────────────────────┘
It never touches your credentials. Auth stays in omp's own store at ~/.omp/agent. The app spawns a process and speaks a protocol to it, nothing more.

Get it running

1

Have omp installed

On your PATH, or at ~/.bun/bin/omp.exe. The app detects both, and offers a manual path if neither is found.

2

Install the app

Download the NSIS installer from releases — or build it yourself:

npm install
npm run dist

Outputs dist/Oh My Pi Desktop Setup 0.1.0.exe and a portable dist/win-unpacked/.

3

Pick a project

On first run, choose a directory. The agent runs there, and the app remembers it.

Development

npm run dev          # electron-vite dev server + app window
npm test             # unit tests against a mock omp process
RUN_E2E=1 npm test   # + integration against the real omp

The unit tests use a mock omp: a Node script emitting canned JSONL — ready frame, v2 negotiation, response correlation, streaming deltas, tool events, and a chunked frame. That covers the protocol without needing a model.