self-hosted · for solo developers

Vibe coding,
on your terms.

Your coding agent runs on a server you own, not a vendor's cloud. Kartā turns the ChatGPT plan you already pay for into a private agent behind your tailnet. ~$10/mo for the box. Your repos stay on your disk. Every session sandboxed.

Kartā cockpit, mid-session: agent reasoning streams live, PR view one click away

why bother

Three sharp opinions.

The hosted tools (Devin, zo.computer, Cursor's background agents) are real products. Pick one if you want zero setup and someone else minding uptime. Pick Kartā if any of these three matter.

01 · privacy

Your code stays on your disk.

The cockpit answers only on your tailnet, never a public port; service credentials are encrypted at rest. Your repos live on a server you own, never a vendor's database or a sandbox in someone else's data center.

02 · the unlock

You already own the agent.

Kartā runs on the ChatGPT plan you already pay for; every plan now includes Codex, and Plus ($20) is where daily use starts. No second AI subscription, no API bill. The box runs ~$10/mo on an 8 GB VPS (RackNerd, billed yearly; what Kartā itself runs on), from ~€9/mo on Hetzner, or ~$55–70/mo on AWS once its starter credits run out.

03 · ownership

One binary. Zero lock-in.

One command stops everything; your sessions and audit log stay on your disk, yours to walk away with any time. No SaaS contract, no hosted tenant to migrate out of, no "we're sunsetting that feature" email on a Tuesday.

what it does

The actual cockpit, not a feature list.

Every panel earns its pixels. Each one is a reason the hosted tools didn't quite fit.

A session mid-turn: codex's commentary between pills for each thought, command run and image viewed, with a check or an exit code on every command
live worklog

Watch the agent think.

Every command, every file change, every reasoning step, streamed live as the agent works. Each command carries its exit code and opens to its full output. Vibe coding, with receipts.

A hand-drawn sketch on lined paper of a 'stats' screen for hews: stories with hatched bars for points, comment-count bubbles, red-pen notes asking for live HN data and orange for stories under two hours old The stats screen codex built in the hews terminal app, captured by codex itself: live Hacker News stories with blue point bars, comment bubbles, and the one story under two hours old in orange you · a photo codex · its own screenshot
photos & files

Show it, don't describe it.

Attach a photo, a screenshot, a log or a PDF to any message. The agent sees the image and opens the file. Here, a napkin sketch became a working s screen in a real repo, with 8 tests, checked against live Hacker News data. Codex took the screenshot on the right itself to compare with the sketch before it replied.

The Files tab in the Workspace drawer: under Yours, the sketch you sent; under From the agent, the screenshots codex took, each with Open and Attach
files tab

Everything it made, in one place.

The Files tab keeps what you sent and what the agent produced: images it generated, screenshots it took, files it wrote. Open an image full-screen and pinch to zoom, or Attach it straight into your next message.

The PR tab inside a session: PR #94 open, its branch, files and line counts, a pending check, the Squash and merge button and the diff
PRs in-cockpit

Open. Review. Merge.

Click Open PR. The diff, bot reviews, and checks appear in the same page. Click Squash and merge. Done, no tab-hopping to GitHub mid-session. The PR above is the napkin sketch, shipped.

The slash command menu open in the composer: /plan, /review, /refactor, /init, /goal, /compact, /status, /model, /fork, and /help, each with a one-line description, filtering as you type
slash commands

Type /, drive the session.

A filterable command menu, right in the composer. /plan and /review drop in a prompt template; /goal, /compact, /status, and /fork act on the live session. /fork branches it into a parallel session sharing the full history, so you can try another approach without disturbing the original. Nothing fires by accident: a command only applies on Enter or tap, so /review fix the flaky test just sends as a normal message.

The /model picker: switch the model (gpt-6.1-sol, gpt-6-astra, gpt-6.1-terra, gpt-6-sol, gpt-6-luna) and the reasoning effort, from low up to ultra, for the next turn, without leaving the session
model & effort

Switch brains mid-session.

/model swaps the model and reasoning effort for the very next turn: reach for a heavier model on a thorny bug, drop to a faster one for routine edits. Sessions start on gpt-6.1-sol at high effort, with fast and careful profiles one tap away. No context lost, no new session: the whole thread carries across the switch.

The session nav-gutter: a vertical rail of typed, colour-coded dashes down the right edge of a long conversation, magnifying under the cursor with a preview peek card of the target step
jump anywhere

Find your place in a long thread.

Every step gets a typed dash on a rail down the right edge, colour-coded by kind. Hover (or scrub, on mobile) to magnify and preview; click to jump. The rail tracks as you scroll, so a 200-message session is one flick from any point.

your Kartā botprivate chat
the stats screen crashes when HN is down. screenshot attached. fix it?
🪐 Sent with 1 file — I'll reply here with the answer.
the stats screen crashes when HN is down… Fixed. A failed fetch left stories empty and the cursor pointed past it. It's guarded now, with a test; make check passes.
diff+ if not self.stories: + return self.show_offline()
Open in Kartā ↗
nice, open a PR
🪐 Sent to “Sketched the stats view…” — I'll reply here with the answer.
telegram

A conversation, not a pager.

Wire up your own bot and talk to your sessions from Telegram. Reply to an answer, or just type: a plain message goes to the session you last talked to, and the bot tells you which. Send photos, files and voice notes. Answers come back rendered: bold, code blocks, tables as a grid. Give each session its own forum topic, and nothing gets crossed.

Kartā on a phone: the napkin-sketch session with the photo in your message, codex's reply, the workspace bar (files, diff, PR #94) and the composer with attach, dictate and send
phone-first

Drive it from anywhere.

Install it to your home screen and open any session on your phone; the worklog picks up where the agent left off. Snap a photo straight into the composer. Optional push notifications reach your phone without a bot in the middle.

The composer the moment dictation starts: the mic turns red and a waveform band with a timer replaces the toolbar; what you say is transcribed on your server and lands in the box
voice dictation

Speak it, don't type it.

Dictate straight into the composer, or send a voice note through Telegram and it becomes a turn. Attach a recording and the agent gets its transcript. Long prompts are faster spoken, and transcription runs on your own server, not a third-party speech API.

Schedules: three recurring agent tasks (a weekly dependency bump, nightly CI triage, a monthly README check), each with its repo and when it runs next
scheduled runs

Recurring agents, cron-shaped.

"Every Monday, open PRs for any dependency updates." Real agent sessions on cron, with overlap handling baked in, and an optional ping when one fails or finishes.

The Desktop tab: the session's Linux desktop, where codex itself opened a maximized terminal running the hews stats screen it just built, with live Hacker News data
embedded desktop

A real Linux desktop, inside your session.

On an x86 host, open a full Linux desktop right inside any session: watch a long task run, browse in a real Chrome, or poke at the UI the agent just built. The agent can drive it too: it opens apps, runs a TUI, types, and screenshots through a scoped desktop bridge, and never touches the host.

host · per-session sandbox
▸ session starts
↳ docker run --runtime=runsc kartaa-session
✓ fresh container · gVisor kernel intercepts every syscall
▸ rm -rf /home/ubuntu
↳ confined to container · host untouched
▸ cat ../other-session/rollout.jsonl
↳ not mounted · each session sees only its own
▸ git push origin feature-x
✓ routed through bind-mounted token broker
▸ session ends
↳ container destroyed · disk + network state gone
sandboxed by default

Every session, in a fresh sandbox.

Each session runs in its own fresh gVisor-isolated container with hard memory and CPU limits. A user-space kernel intercepts every syscall; one session can't read another's transcript; when the session ends, the container is destroyed. Always on, no toggle. A runaway script can wreck its own checkout, not your host.

The ⌘K command palette: instant full-text matches across every session title and transcript, with snippets in context
instant search

Find any session, fast.

Full-text across every title, every message, every turn, straight from the sidebar or the ⌘K palette. Hit s to focus, type, see snippets with the match in context. It all runs on your box: the index and your transcripts live on your server.

persistent tools & skills

Your daily-driver CLIs, every session.

Declare gh-ghent, shux, ripgrep, or any binary in /settings/tools. Saving one runs the real install and its verify check, shows the version it got, and rebuilds the image new sessions start from. The same page wires up the open agent-skills ecosystem via npx skills add. Once it's built, turn 1 already has your tools.

also in the box

The parts you don't notice.

None of these get a screenshot. All of them are why it feels finished.

~1 s starts

A warm pool keeps sandboxes ready, so a new session is working in about a second, not waiting on a container boot.

one-command upgrades

kartaa-update brings the cockpit, units, configs, the pinned Codex and the sandbox image to the latest release, and rolls the cockpit back if its health check fails.

secrets for sessions

Give the agent the API keys and env vars your project needs. Secrets are masked and write-only; new sessions pick them up.

dashboard

Host health, the scheduler, the warm pool, tokens by model and recent activity, live, with an hour of sparklines.

storage that cleans itself

Build caches are pruned nightly and automatically when the disk runs high; clearing old sessions' attachments is one click.

codex, pinned

Each release pins a Codex version it was tested against and upgrades the host and every sandbox to it, so an upstream release never breaks you mid-week.

how it works · 30-sec version

Five boxes. That's it.

The only public-facing things are GitHub and OpenAI — both of which you already use. Kartā never listens on a public interface. You reach the cockpit over your tailnet, which IS the firewall.

you
browser · phone · Telegram
→
your tailnet
the auth layer
→
your kartā server
any VPS · Hetzner · AWS
→
github
your repos · the bot
+
openai
codex via your ChatGPT plan

three themes, one keystroke

Tuned, not templated.

Three carefully-paired dark palettes. Switch via the dots in the sidebar. Saved per device.

Midnight theme
midnight · default
Ember theme
ember · for late-night vibe
Moss theme
moss · forgiving on the eyes

vs the alternatives

Everyone's solving the same problem.

Different bets on who manages what. An honest, qualitative cut; list prices as of October 2026, and they shift monthly.

Kartā

your ChatGPT plan + ~$10/mo box

  • uses the ChatGPT plan you already pay for
  • code stays on your disk · tailnet-only
  • every session in a fresh gVisor sandbox
  • send photos & files · get the agent's images back
  • real Linux desktop in the cockpit
  • mobile-first · a real conversation over Telegram
  • walk away with one command

Devin

$20–200/mo · hosted

  • zero setup time
  • full VM per session
  • Cognition manages uptime
  • usage beyond the plan is metered
  • teams plan · SSO on enterprise
  • code lives in their cloud

zo.computer

$18–200/mo · hosted computer

  • zero setup time
  • browser-accessible from anywhere
  • they manage uptime
  • AI usage drawn from monthly credits
  • state lives in their cloud

getting started

Two windows. ~30 minutes.

Spend ~10 minutes collecting credentials in your browser, ~20 watching the provisioning ladder run. The TUI walks you through every prereq inline, no separate checklist. On a VPS you already have, it's two commands from your Mac instead. See the full install guide →

  • ⭐Any VPS A bare Ubuntu 24.04 box with 8 GB, e.g. RackNerd. What Kartā itself runs on. Recommended. ~$10/mo
  • Hetzner Cloud Paste an API token; the installer makes the server. from ~€9/mo
  • AWS EC2 Already on AWS? New accounts get up to $200 in credits. $0 → ~$60/mo
~/code · zsh
# 1. download the installer — picks your platform automatically $ open https://kartaa.pages.dev/getting-started/ # 2. mark it runnable, launch — full-screen TUI takes over $ chmod +x ~/Downloads/kartaa-install_* $ ~/Downloads/kartaa-install_* # 3. ~20 min of watching the worklog scroll… ✓ tailscale joined ✓ systemd units enabled ✓ kartaa-doctor: all green # 4. it prints your URL. open it. $ → https://kartaa-<you>.<tailnet>.ts.net/
The agent runs on someone else's GPU. Everything else can run on a server you own.

— that's the whole bet