Open-source, self-hosted Claude Code and opencode client. Agents run in real > tmux on your own Linux box or Mac, and you drive them from desktop, phone or > browser over HTTPS.
12
stars
2,887
commits
JavaScript
primary language
Sep 6, 2026
updated
Run every coding agent you pay for, on your own server.
Manta puts Claude Code, Codex, opencode and Kimi Code on a Linux box or Mac you own — your existing subscriptions, running side by side, reachable from your desktop and your phone. Real tmux underneath. Self-hosted, MIT, no account.
| macOS | Manta-latest.dmg | Apple Silicon, macOS 13 and up. Signed and notarised. |
| Windows | Manta-latest-x64.exe | Windows 10 and 11, 64-bit. |
| iPhone | TestFlight | Native app. Pairs with the six digits the desktop shows. |
Linux desktop (AppImage) is built from source — see Development. The box itself runs on any always-on Linux machine or Apple Silicon Mac.

No terminal, no keys to copy, no tunnel to configure, no ports to forward. The desktop app does the whole install over SSH.
Type the same six digits on your phone to add it too.
Prefer to do it yourself? One command does the same thing:
curl -fsSL https://mantaui.com/install.sh | bash
The installer downloads a checksum-verified, self-contained tarball
(vendored Node runtime, prebuilt native bindings), writes
systemd --user units on Linux or launchd LaunchAgents on macOS,
registers with the push gateway, provisions a Let's Encrypt certificate
on <box_id>.boxes.mantaui.com, and prints the pairing code. Linux
needs tmux and git plus inbound TCP 80 and 443. macOS boxes skip
Caddy and Let's Encrypt and reach you over the tailnet or loopback.
Or hand it to an agent that can reach the box:
Set up a Linux box as a Manta box server.
Fetch https://mantaui.com/llms-install.md and follow it exactly.
Ask me its interview questions before running anything.
A real client, not a status screen. Everything below works the same in the desktop app and in the iPhone app.
box_token bearer
secret, paired via a six-digit, one-time, five-minute code. Desktop app (Electron) iPhone app (native Swift)
│ │
└──────────────── HTTPS ─────────────────┘
│
┌─────────────────────┴──────────────────────┐
│ https://<box_id>.boxes.mantaui.com │ the box serves its
│ Caddy fronts the box's loopback │ own public hostname
│ 127.0.0.1:8787, no relay │ via DNS + LE cert
└─────────────────────┬──────────────────────┘
│
YOUR LINUX BOX (or Mac)
manta-server (:8787) owns tmux, files, config
├── tmux your sessions
└── opencode-serve (:4096) chat mode + agent tools
│
└── HTTPS POST ──▶ gateway.mantaui.com
hosted push fanout:
signs the Apple JWT,
delivers APNs
The server is the box. Sessions, transcripts, uploads, schedules and
secrets all live on your machine in ~/.manta*. The desktop and phone
are thin clients over /rpc plus /events (SSE); the desktop only adds
OS bridges — clipboard, screenshot, file peek.
Auth. Every data route requires Authorization: Bearer <box_token>.
Devices obtain it once via a six-digit, one-time, five-minute pairing
code minted loopback-only on the box (curl -s 127.0.0.1:8787/auth/pair).
Box identity persists in ~/.manta/auth.json; never regenerate it.
Two window types per tmux window: a raw terminal (xterm.js over a WebSocket PTY) or a chat panel (an opencode session). They coexist freely.
Transport: /rpc (JSON over HTTPS) for requests, /events
(Server-Sent Events) for streaming, WebSocket for terminal PTYs. No
long-poll, no relay hop.
State on the box: ~/.manta/ (identity, config, schedules, secrets,
webhooks, VAPID keys, served pages); ~/.manta-uploads/<session>/<batch>/
(attachments, hourly auto-clean); ~/.manta-outbox/ (agent-to-you file
handoffs); ~/.manta-secrets/ (materialised secret files at 0600, used
by reference); ~/.config/opencode/ (opencode config and the Manta
agent tools).
Ports, all loopback on the box: 8787 manta-server, 4096 opencode-serve.
Components: manta-server (src/server/) owns tmux CRUD, the PTY
WebSocket, the opencode proxy, auth, schedules, secrets, webhooks,
serve-page, Web Push and APNs fanout via the gateway. opencode-serve
is the chat backend. Caddy terminates TLS and reverse-proxies
<box_id>.boxes.mantaui.com to 127.0.0.1:8787. The desktop app
(src/main, src/preload, src/renderer) is a thin client plus OS
bridges. The iPhone client is a native SwiftUI app in mobile/native.
manta-gateway (src/gateway/) runs on our infra for push fanout and
DNS automation only.
Installer: a self-contained tarball shipping a vendored Node runtime and
prebuilt production node_modules. The box needs only curl, tar,
sha256sum, tmux and git — no Node preinstall, no compilers, no
package-manager calls. Manage with
systemctl --user {status,restart} manta-server; logs at
journalctl --user -u manta-server -f. Mint a fresh pairing code with
npm run pair from ~/manta; each new code supersedes the last.
Chat sessions get Manta's own opencode tools from docs/opencode-tools/.
The agent calls them like any other tool:
schedule — cron'd prompts into the same session.webhook — external systems wake the session by POST.notify — desktop and phone notifications with cross-device
routing.secrets — reference credentials by name; values never enter the
transcript.peers — see and message sibling agent sessions in the workspace.delegate — background jobs, each in its own worktree and branch.serve-page — publish an HTML page to a public URL.Install or update: copy into ~/.config/opencode/tools/ (real copies,
not symlinks) and restart opencode-serve.
npm install
npm run typecheck
npm test # vitest (renderer) plus node:test (server, gateway, scripts)
npm run dev # main-process and preload changes need a full restart, not HMR
Run the box server straight from the checkout:
git clone git@github.com:antoinedc/MantaUI.git ~/manta
cd ~/manta && npm install
npm run mobile # server on 0.0.0.0:8787
npm run pair # mint a pairing code
Keybindings: ⌘N new project · ⌘T new session · ⌘1..9 jump to nth · ⌥⌘↑/⌥⌘↓ prev/next · ⌘, settings · ⌘C/⌘V copy/paste in terminal · ⌘F search · ⌘K clear scrollback · Shift+Enter newline in the claude TUI.
See AGENTS.md for the full architecture, the transport contract and the release pipeline.
| Manta | Orca | Conductor | Termius + SSH | |
|---|---|---|---|---|
| License | MIT | MIT | Proprietary | Proprietary |
| Agents run on | Your VPS or Mac | Your Mac | Your Mac | Your VPS |
| Mobile parity | Full client | Read-mostly | No phone app | SSH terminal |
| Push routing | Desktop-first with escalation | None | None | None |
| Permissions | Explicit cards | yolo pre-filled | No sandboxing | Manual |
| Schedule, webhook, secrets, peers | Yes | No | No | No |
| Self-hosted | Yes, on your box | Tailscale required | No | N/A |
Where Orca and Conductor genuinely beat Manta: 30-agent fan-out, an embedded browser, a Monaco editor, diff review, cross-platform desktop, and Conductor's PR and merge tail. Full pages: vs Orca · vs Conductor · vs Termius and SSH.
See CONTRIBUTING.md.
See SECURITY.md for vulnerability reports.
MIT. Maintainers: see docs/releasing.md for release procedure, rollback and prod box ops.
JavaScript
45.6%
TypeScript
38.2%
Swift
12.3%
HTML
1.9%
Shell
1.4%
Open-source, self-hosted Claude Code and opencode client. Agents run in real > tmux on your own Linux box or Mac, and you drive them from desktop, phone or > browser over HTTPS.
12
stars
2,887
commits
JavaScript
primary language
Sep 6, 2026
updated
Run every coding agent you pay for, on your own server.
Manta puts Claude Code, Codex, opencode and Kimi Code on a Linux box or Mac you own — your existing subscriptions, running side by side, reachable from your desktop and your phone. Real tmux underneath. Self-hosted, MIT, no account.
| macOS | Manta-latest.dmg | Apple Silicon, macOS 13 and up. Signed and notarised. |
| Windows | Manta-latest-x64.exe | Windows 10 and 11, 64-bit. |
| iPhone | TestFlight | Native app. Pairs with the six digits the desktop shows. |
Linux desktop (AppImage) is built from source — see Development. The box itself runs on any always-on Linux machine or Apple Silicon Mac.

No terminal, no keys to copy, no tunnel to configure, no ports to forward. The desktop app does the whole install over SSH.
Type the same six digits on your phone to add it too.
Prefer to do it yourself? One command does the same thing:
curl -fsSL https://mantaui.com/install.sh | bash
The installer downloads a checksum-verified, self-contained tarball
(vendored Node runtime, prebuilt native bindings), writes
systemd --user units on Linux or launchd LaunchAgents on macOS,
registers with the push gateway, provisions a Let's Encrypt certificate
on <box_id>.boxes.mantaui.com, and prints the pairing code. Linux
needs tmux and git plus inbound TCP 80 and 443. macOS boxes skip
Caddy and Let's Encrypt and reach you over the tailnet or loopback.
Or hand it to an agent that can reach the box:
Set up a Linux box as a Manta box server.
Fetch https://mantaui.com/llms-install.md and follow it exactly.
Ask me its interview questions before running anything.
A real client, not a status screen. Everything below works the same in the desktop app and in the iPhone app.
box_token bearer
secret, paired via a six-digit, one-time, five-minute code. Desktop app (Electron) iPhone app (native Swift)
│ │
└──────────────── HTTPS ─────────────────┘
│
┌─────────────────────┴──────────────────────┐
│ https://<box_id>.boxes.mantaui.com │ the box serves its
│ Caddy fronts the box's loopback │ own public hostname
│ 127.0.0.1:8787, no relay │ via DNS + LE cert
└─────────────────────┬──────────────────────┘
│
YOUR LINUX BOX (or Mac)
manta-server (:8787) owns tmux, files, config
├── tmux your sessions
└── opencode-serve (:4096) chat mode + agent tools
│
└── HTTPS POST ──▶ gateway.mantaui.com
hosted push fanout:
signs the Apple JWT,
delivers APNs
The server is the box. Sessions, transcripts, uploads, schedules and
secrets all live on your machine in ~/.manta*. The desktop and phone
are thin clients over /rpc plus /events (SSE); the desktop only adds
OS bridges — clipboard, screenshot, file peek.
Auth. Every data route requires Authorization: Bearer <box_token>.
Devices obtain it once via a six-digit, one-time, five-minute pairing
code minted loopback-only on the box (curl -s 127.0.0.1:8787/auth/pair).
Box identity persists in ~/.manta/auth.json; never regenerate it.
Two window types per tmux window: a raw terminal (xterm.js over a WebSocket PTY) or a chat panel (an opencode session). They coexist freely.
Transport: /rpc (JSON over HTTPS) for requests, /events
(Server-Sent Events) for streaming, WebSocket for terminal PTYs. No
long-poll, no relay hop.
State on the box: ~/.manta/ (identity, config, schedules, secrets,
webhooks, VAPID keys, served pages); ~/.manta-uploads/<session>/<batch>/
(attachments, hourly auto-clean); ~/.manta-outbox/ (agent-to-you file
handoffs); ~/.manta-secrets/ (materialised secret files at 0600, used
by reference); ~/.config/opencode/ (opencode config and the Manta
agent tools).
Ports, all loopback on the box: 8787 manta-server, 4096 opencode-serve.
Components: manta-server (src/server/) owns tmux CRUD, the PTY
WebSocket, the opencode proxy, auth, schedules, secrets, webhooks,
serve-page, Web Push and APNs fanout via the gateway. opencode-serve
is the chat backend. Caddy terminates TLS and reverse-proxies
<box_id>.boxes.mantaui.com to 127.0.0.1:8787. The desktop app
(src/main, src/preload, src/renderer) is a thin client plus OS
bridges. The iPhone client is a native SwiftUI app in mobile/native.
manta-gateway (src/gateway/) runs on our infra for push fanout and
DNS automation only.
Installer: a self-contained tarball shipping a vendored Node runtime and
prebuilt production node_modules. The box needs only curl, tar,
sha256sum, tmux and git — no Node preinstall, no compilers, no
package-manager calls. Manage with
systemctl --user {status,restart} manta-server; logs at
journalctl --user -u manta-server -f. Mint a fresh pairing code with
npm run pair from ~/manta; each new code supersedes the last.
Chat sessions get Manta's own opencode tools from docs/opencode-tools/.
The agent calls them like any other tool:
schedule — cron'd prompts into the same session.webhook — external systems wake the session by POST.notify — desktop and phone notifications with cross-device
routing.secrets — reference credentials by name; values never enter the
transcript.peers — see and message sibling agent sessions in the workspace.delegate — background jobs, each in its own worktree and branch.serve-page — publish an HTML page to a public URL.Install or update: copy into ~/.config/opencode/tools/ (real copies,
not symlinks) and restart opencode-serve.
npm install
npm run typecheck
npm test # vitest (renderer) plus node:test (server, gateway, scripts)
npm run dev # main-process and preload changes need a full restart, not HMR
Run the box server straight from the checkout:
git clone git@github.com:antoinedc/MantaUI.git ~/manta
cd ~/manta && npm install
npm run mobile # server on 0.0.0.0:8787
npm run pair # mint a pairing code
Keybindings: ⌘N new project · ⌘T new session · ⌘1..9 jump to nth · ⌥⌘↑/⌥⌘↓ prev/next · ⌘, settings · ⌘C/⌘V copy/paste in terminal · ⌘F search · ⌘K clear scrollback · Shift+Enter newline in the claude TUI.
See AGENTS.md for the full architecture, the transport contract and the release pipeline.
| Manta | Orca | Conductor | Termius + SSH | |
|---|---|---|---|---|
| License | MIT | MIT | Proprietary | Proprietary |
| Agents run on | Your VPS or Mac | Your Mac | Your Mac | Your VPS |
| Mobile parity | Full client | Read-mostly | No phone app | SSH terminal |
| Push routing | Desktop-first with escalation | None | None | None |
| Permissions | Explicit cards | yolo pre-filled | No sandboxing | Manual |
| Schedule, webhook, secrets, peers | Yes | No | No | No |
| Self-hosted | Yes, on your box | Tailscale required | No | N/A |
Where Orca and Conductor genuinely beat Manta: 30-agent fan-out, an embedded browser, a Monaco editor, diff review, cross-platform desktop, and Conductor's PR and merge tail. Full pages: vs Orca · vs Conductor · vs Termius and SSH.
See CONTRIBUTING.md.
See SECURITY.md for vulnerability reports.
MIT. Maintainers: see docs/releasing.md for release procedure, rollback and prod box ops.
JavaScript
45.6%
TypeScript
38.2%
Swift
12.3%
HTML
1.9%
Shell
1.4%