Desktop + web command center for coding-agent harnesses. Run OpenCode, Claude Code, Codex, and Pi across multiple projects with streaming chat, prompt queue, model switching, voice input, and MCP tools.
Download latest release Β· Why OpenGUI Β· Highlights Β· Build from source Β· Configuration
OpenGUI gives coding-agent users a proper desktop and browser workflow for long sessions. Manage multiple projects visually, run different harnesses from one UI, watch responses stream live, queue prompts while your agent works, and switch models or agents without terminal juggling.
Early but usable. Bug reports and PRs welcome.
1. Download the latest release
(Linux .deb, macOS .dmg, or Windows .exe).
2. Install one supported harness (e.g. OpenCode) on your PATH.
3. Launch OpenGUI, connect a workspace, and start prompting.
That's it. No terminal needed after setup.
Tracked in issue #β¦
OpenGUI is for people who love coding agents but want a stronger workflow than terminal tabs alone:
- π― Multi-harness workspace β run OpenCode, Claude Code, Codex, Pi, and Grok Build in one app instead of juggling separate terminals.
- π Multi-project sessions β keep separate sessions per workspace and switch instantly.
- β‘ Stream responses live β see tokens stream in with real-time usage tracking.
- π₯ Prompt queue β queue prompts while your agent is busy; they auto-dispatch when idle.
- ποΈ Switch providers/models β change backend, model, agent, or variant from the UI.
- π§ MCP tools & skills β configure tools and skills without leaving the app.
- π€ Voice input β use a Whisper-compatible transcription endpoint for speech-to-text.
| Feature | Description | |
|---|---|---|
| ποΈ | Multi-agent workspace | OpenCode, Claude Code, Codex, Pi, Grok Build |
| π | Multi-project workspaces | Parallel coding sessions per project |
| β‘ | Real-time streaming | SSE with live token & context tracking |
| π₯ | Prompt queue | Auto-dispatch when assistant becomes idle |
| ποΈ | Model/backend/agent selection | Switch directly from chat UI |
| β¨οΈ | Slash commands | Built-in commands from the prompt box |
| π¨ | Syntax highlighting | Powered by Shiki |
| π | Dark/light theme | System-aware toggle |
| π₯οΈππ± | Desktop, web & Docker | Electron, browser, or container deployment |
| π§ππͺ | Cross-platform builds | Linux, macOS, Windows |
| Harness | OpenGUI Support |
|---|---|
| OpenCode | β Full |
| Claude Code | β Full |
| Codex | β Full |
| Pi | β Full |
| Grok Build | β Full |
Use one backend or switch between them per workflow.
Grab a prebuilt app from the latest release:
| Platform | Format | Notes |
|---|---|---|
| π§ Linux | .deb |
Debian/Ubuntu-based |
| π macOS | .dmg |
Intel & Apple Silicon |
| πͺ Windows | .exe installer |
Unsigned β see note below |
Windows note: Windows builds are unsigned. SmartScreen will warn on first launch. Click More info β Run anyway.
Backend requirements depend on what you use:
- OpenCode harness β OpenCode CLI installed and on
PATH - Grok Build harness β Grok Build CLI installed (
grokonPATH) and authenticated (grok loginorXAI_API_KEY) - Other harnesses β local CLI and auth for that harness on your machine
Windows prerequisite for OpenCode: OpenCode must be on
PATHor at%USERPROFILE%\.opencode\bin\opencode.exe.
OpenGUI uses Vite+ (vite-plus) as
a dev dependency. After pnpm install, run it as pnpm vp <command>.
No global installs needed β Electron and other deps come from pnpm install.
pnpm installLint, format, typecheck, test, build, and named tasks use Vite+ (vp).
Prefer pnpm vp β¦ or pnpm run <script> when a script exists in package.json.
A global vp on your PATH is optional, not required.
No manual config file needed. Connection settings live in the UI.
| Goal | Command |
|---|---|
| Desktop app (Electron, hot reload) | pnpm run dev |
| Web UI (browser + API) | pnpm run dev:web |
For web dev, open the URL Vite prints in the terminal (default port is often 5173). Browser folder picker uses server paths. To restrict browsable folders:
export OPENGUI_ALLOWED_ROOTS=/path/to/projectsBuild the frontend bundle first, then start:
pnpm run build # or: pnpm vp build
pnpm run start # Electron
pnpm run start:web # browser + backend APIFor internet-facing deploys, keep OpenGUI bound to localhost and put
Apache or another HTTPS reverse proxy in front.
Official image: ghcr.io/akemmanuel/opengui:latest
Docker supports contained mode and host-control mode (uses host CLIs
through nsenter while Docker manages the web server).
See docs/docker.md for details and docs/apache.md for Apache reverse proxy + Basic Auth.
| Platform | Command |
|---|---|
π§ Linux .deb |
pnpm run dist:linux |
π macOS .dmg |
pnpm run dist:mac |
πͺ Windows .exe |
pnpm run dist:win |
Four layers. See CONTEXT.md and
ADR 0005 for details.
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Shell β
β Desktop (Electron) Β· Web Β· Mobile (Capacitor) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β OpenGUI Frontend β
β React UI Β· Workspaces Β· Projects Β· Chat Β· Queue β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β OpenGUI Backend β
β HTTP/SSE Β· Queue dispatch Β· Auth Β· Persistence β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β OpenGUI Runtime β
β Harness Adapters Β· Event normalization Β· SDK β
βββββββββββββββββββββββββββββββββββββββββββββββββββ€
β OpenCode Β· Claude Code Β· Codex Β· Pi Β· Grok β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Key source layout:
| Path | Role |
|---|---|
main.ts |
Desktop Shell (window, IPC, backend sidecar) |
preload.js |
Desktop Shell preload API |
packages/runtime/src/adapters/* |
Harness Adapters (hosted inside Backend via Runtime) |
packages/backend/src/ |
Backend host (SSE, RPC, FS, product API) |
server/web-server.ts |
Thin HTTP listen entry (calls createBackendHost) |
src/ |
Frontend React app |
See docs/architecture.md for contributor architecture notes and the harness addition guide.
OpenGUI stores connection and UI preferences via the app settings interface.
Voice input (speech-to-text) requires a Whisper-compatible transcription
server. Set the endpoint URL in Settings β General β Voice transcription endpoint.
The microphone button only appears when an endpoint is configured.
The server should accept a multipart POST with an audio file field and return
{ text, language, duration_seconds }.
Embed the same in-process harness runtime the app uses β list sessions, stream events, and send prompts on a filesystem directory without HTTP or React.
Quickstart and API contracts: packages/runtime/README.md
pnpm run test:runtime # SDK unit tests
pnpm run test:bridges # Bridge mapping testsContributions are welcome! See CONTRIBUTING.md for guidelines.
- π Found a bug? Open an issue
- π‘ Have an idea? Start a discussion
- π Want to contribute? Open a PR
If you find OpenGUI useful, please give it a star on GitHub β it helps others discover the project.
MIT β see LICENSE for details.
