you@laptop ~ $ cat /etc/motd
shipd — the deploy MCP for coding agents.
One command. Backend, frontend, database. Live.
Your agent writes the app. Then it hits a wall: a host for the frontend,
another for the API, a third for Postgres, env vars pasted across three
dashboards. shipd is one tool your agent calls: it builds the whole app
as one container, attaches Postgres, wires DATABASE_URL, returns a URL.
No email. No dashboard. No devops. Your SSH key is your login.
you@laptop ~ $ curl -fsSL https://shipd.aikaara.com/join | shcopy
→ key SHA256:P4Y2lVtS/FEEnPV7CjqDTq5kdXUYe0FA/bdaDwqM4Sw (~/.ssh/id_ed25519)
→ github you
✔ joined as @you
· deploys: locked until a seat is granted — say hi in chat (below)
akmcp_••••••••••••••••••••••••••••••••••••••••
saved to ~/.shipd/token (0600)
added to claude code: claude mcp list
next: say “deploy this with shipd” to your agent
alpha: 10 seats, given in chat → curl -fsSL https://shipd.aikaara.com/chat | sh
# how join works — read the script, it's 106 lines: shipd.aikaara.com/join
# 1. finds ~/.ssh/id_ed25519 (or SHIPD_KEY=…)
# 2. asks for a nonce, signs it: ssh-keygen -Y sign -n shipd-join
# 3. shipd checks the key is on github.com/<you>.keys → that's your identity
# 4. prints the token once, drops it in ~/.shipd/token, wires claude code
# leaves your machine: github login, PUBLIC key, signature. nothing else.
you@laptop ~/invoice-app $ claude
> deploy this with shipd
⏺ shipd · create_project(name: "invoice-app")
⏺ shipd · provision_database(postgres)
⏺ shipd · deploy(files: 31)
deps · next build · container · DATABASE_URL wired · health 200
✔ live at https://d7-invoice-app.apps.aikaara.com
logs, rollback, export — all from here.
you@laptop ~ $ shipd --why
# deploying today
1. frontend → vercel / netlify. connect repo, pick framework, wait.
2. backend → railway / render / a vps. Dockerfile, port, healthcheck.
3. database → neon / supabase. copy the connection string.
4. env vars → paste secrets into three dashboards. fix CORS. fix API_URL.
5. it breaks → which of the three logs? roll back where?
3 accounts · 3 billing pages · 3 places to look at 2am
# deploying with shipd
deploy one call. frontend + backend, one container.
buildpacks — no Dockerfile.
provision_database postgres attached, DATABASE_URL set.
set_env secrets stored encrypted. never echoed.
get_logs rollback one log. one rollback. same chat.
export repo + compose. run it anywhere.
1 token · 1 URL · your agent does the devops
# "my agent already deploys — it has the vercel mcp, fly, railway"
it does — to three accounts. frontend on vercel, api on railway,
postgres on neon: three tokens in your agent's env, CORS between
your own services, billing in triplicate. shipd is a different
shape, not a fourth dashboard: the whole app as one container,
postgres attached, DATABASE_URL wired, one token. and the exit is
a tool, not a ticket — export → compose, or run the runtime on
your own box: aikaara.com/factory
you@laptop ~ $ man shipd
SHIPD(1) MCP tools SHIPD(1)
NAME
shipd — build and run your agent's app as one isolated container
SYNOPSIS
claude code:
claude mcp add --transport http shipd https://mcp.aikaara.com/sse \
--header "Authorization: Bearer $(cat ~/.shipd/token)"
any mcp client (cursor · windsurf · codex · claude.ai connectors):
{"mcpServers":{"shipd":{"url":"https://mcp.aikaara.com/sse",
"headers":{"Authorization":"Bearer <token>"}}}}
streamable http, bearer token. tested: claude code, claude.ai (oauth).
others should work — if not, report_bug(tool: "connect").
TOOLS
| create_project | from a prompt, a repo URL, a zip, or a prebuilt OCI image. |
| deploy | build + run as a gVisor-isolated container. returns the live URL. |
| provision_database | managed postgres. DATABASE_URL wired into the project env. |
| set_env | secrets, encrypted at rest, never returned. |
| get_logs | build + runtime logs, latest run or by run_id. |
| rollback | previous good deploy, one call. |
| status · list_projects | what's live, where, healthy or not. |
| export | portable repo + compose/helm. no lock-in. |
| report_bug · my_reports | file a bug from inside the agent; last run's error + log tail attached. |
| chat · chat_read | talk to the team from inside the agent. |
RUNTIME
one project ⇒ one gVisor container ⇒ one postgres database.
memory 512 MB · cpu 0.5 · pids 256 · all capabilities dropped
disk container fs, no quota, ephemeral — state lives in postgres
lifecycle always-on (restart unless-stopped). no idle sleep, no cold start.
network inbound https on *.apps.aikaara.com, tls included · websockets yes (traefik)
outbound open, except cloud metadata + private ranges
postgres one shared postgres 16 container (768 MB), one database + role per
project on a persistent volume. no automated backups yet — export.
domains custom domains — not yet.
clients any mcp client over streamable http. tested: claude code, claude.ai
connectors (oauth). cursor / windsurf / codex: untested, should work.
builds block ~1–2 min.
NOTES
apps run on our shared runtime, isolated with gVisor. prototypes and
side projects, not your bank. that is exactly why the alpha exists.
SEE ALSO
join(1), chat(1), team(1), factory(7) — self-host the runtime on your own box.
you@laptop ~ $ shipd alpha
alpha · 10 seats · break it, file it from your agent, build it with us.
ten developers who ship with a coding agent every day, running shipd hard
while it's still soft. no forms. no discord. the loop is the MCP itself.
# you get
+ container deploys + postgres, 200/day (the alpha is the only tier with deploys today)
+ fixes in days, your handle in the changelog
+ a human on the other end of chat, terminal to terminal
# we ask
- deploy something real this week. a side project counts.
- when it breaks: “report it with report_bug”. ten seconds.
- when you wish something existed: kind: idea.
> shipd just failed the deploy — report it with report_bug
⏺ shipd · report_bug(title: "next build OOM on 31-file app", severity: high)
✔ Filed #14 — run #212 error + log tail attached. the team is pinged.
# seats are given in chat. join, then say hi:
you@laptop ~ $ curl -fsSL https://shipd.aikaara.com/chat | shcopy
shipd chat · you are you (dev) · ctrl-c to leave
12:41 you: hi — want a seat. building a postgres-backed invoice tool with claude code.
12:43 team/venkatesh: seat's yours — ★ alpha is live on your token, 200/day. no re-join. break it.
12:43 you: on it
# terminal to terminal. long-poll, no socket, no app. the team runs the same
# script with a team token. your agent can talk too: tools chat / chat_read.
# read it: shipd.aikaara.com/chat
# the other end of chat is a human with push on his phone — every message,
# every report_bug lands there. the team side is a passkey'd pwa at
# mcp.aikaara.com/team; pairing starts from a terminal, obviously.
# replies come in hours, not always minutes — the team sleeps in IST.
you@laptop ~ $ shipd export invoice-app --format compose
✔ ./invoice-app.tar.gz — standard repo + docker-compose.yml + Dockerfile.
standard postgres. standard containers. docker compose up on any box.
or stand up the runtime itself: aikaara.com/factory (curl | sh, obviously)
you@laptop ~ $ cat SECURITY
identity your SSH key + github.com/<you>.keys. join signs a 5-minute, single-use nonce
with ssh-keygen -Y sign. leaves your machine: login, PUBLIC key, signature.
no email, no password, nothing to phish.
token akmcp_… shown once, SHA-256 digest at rest. suspended account ⇒ every
token dead at the MCP. revoke from the dashboard today, `shipd revoke` soon.
isolation your app runs as a gVisor (runsc) container; egress to cloud metadata and
private ranges is blocked at the host. one project ⇒ one container ⇒ one postgres.
secrets set_env values are encrypted at rest and never returned by any tool.
scope every tool resolves projects through YOUR account only — there is no path
to another developer's project, logs, env, or thread.
chat you see your thread. a team account (operator-granted gate) sees threads.
60 msgs/hour/dev. push payloads carry no message text — the phone fetches
over an authenticated session.
team app passkeys (WebAuthn, RP mcp.aikaara.com). pairing sessions live 15 min until a
passkey exists; passkey sessions 30 days, listed + revocable, sign-out-everywhere.
encrypted HttpOnly SameSite=Strict cookie, strict CSP (hash-pinned inline),
no framing, no referrer, same-origin check on every mutation.
abuse per-IP throttles on join/pair/passkey/MCP, IP blocklist, runtime anomaly
auto-kill (CPU/egress), quota per developer, alerts to the operator.
exit export gives you the repo + compose. delete your projects; nothing is kept
that you cannot take with you.
report security@aikaara.com · /.well-known/security.txt · or report_bug(kind: bug, severity: blocker)
you@laptop ~ $ cat colophon
no email. no signup form. no cookies. no analytics. no framework.
one html file, one font, three shell scripts. view-source is the docs. your agent reads /llms.txt.
built by a terminal geek for terminal geeks. — aikaara, 2026
you@laptop ~ $