agents.md

Maritime: setup procedure for AI agents

Maritime is a cloud platform that gives every AI agent its own computer: Agent boxes, Sandboxes (with Swarms) and Computers on demand (Linux and Windows desktops and Android phones). An agent you deploy here, from a template, a GitHub repo or a Docker image, runs in an Agent box: a real Firecracker micro-VM with a disk at /data that survives sleep, restart, and redeploy. It sleeps when idle and wakes in about a second. It costs $1 a month per 2 GB of memory, awake or asleep.

Billing, so you can tell the user what this costs: Plans are Starter $20, Growth $100, Scale $500 and Dedicated $5,000 a month, plus larger contracts with invoicing by a call. The plan fee becomes the same amount of usage credit every month, at the same rates on every plan. Plans differ by how many machines can be awake at once (5, 25, 60 and 500), and on Dedicated the Maritime team also sets up your apps, images and network with you. Machines are billed per second. An agent box, the VM an agent runs in, is $1 a month per 2 GB of memory (4 GB is $2, 8 GB is $4), awake or asleep, with unlimited awake hours and 5 GB of disk included; more disk is $0.08 per GB-month. The others are billed at hourly rates while awake: a sandbox or one sandbox of a swarm is $0.0055 per vCPU-hour plus $0.00275 per GB-hour (the default small size, 2 vCPU and 4 GB, is $0.022 an hour), a Linux desktop $0.12 an hour, a Windows desktop $0.18 and an Android phone $0.15. Asleep, these pay only for their disk, $0.08 per GB-month. Usage past the credit is billed at the same rates on the same invoice. New accounts start with a 7-day free trial: a card is needed to start the first machine and is not charged then, and usage stops at $20. Cancel within the trial and nothing is charged; otherwise $20 is charged on day 7 and becomes that month's credit. Plans include no AI credits.

Step 1: identify yourself and your environment

Note which of these you are, it changes step 3:

Check the environment:

node --version                 # need 18 or later
maritime --version             # absent means install below

Step 2: install the CLI

curl -fsSL https://maritime.sh/install.sh | sh    # no Node needed; checks the download's sha512
# or: npm install -g maritime-cli        # the command is `maritime`
maritime --version

If a flag in this procedure is unknown to the installed CLI, run npm install -g maritime-cli@latest and retry once.

Step 3: onboard (sign in, API key, payment) in one command

maritime onboard --json

It runs only the steps the account still needs, and is safe to run again. It prints one JSON object. Branch on step:

Step 4: the email verification wall

Until the user clicks the link Maritime emailed them, these are refused with HTTP 403 and email_not_verified in the error (exit 4): create, deploy, start, restart, keys create, computer creation. Listing, status, logs, and templates work before verification.

When you see email_not_verified: tell the user to open their inbox and click the link; if it did not arrive, they sign in at https://maritime.sh/login, which offers to resend it. Wait for them to say it is done, then retry the same command. Do not create a second account.

Step 5: learn the contract

maritime guide --json          # every command and flag, from the installed CLI

Rules that apply to every command: pass --json; results are JSON on stdout; errors print Error: ... on stderr with the HTTP status and the API's response body; exit codes are 0 ok, 1 other error, 2 usage, 3 not found, 4 auth, 5 API error, 6 partial failure, 7 rate limited, 10 config. Never guess flags. Full contract: https://maritime.sh/docs/cli/llms.txt

Step 6: deploy

Choose exactly one recipe.

A. The user wants a ready-made agent (no code of their own):

maritime templates --json                                   # ids: openclaw, hermes, zeroclaw, claude_code, codex, dsh
maritime create <name> --template openclaw --json

B. The user has a repo with a Dockerfile at its root (any framework):

maritime create <name> --repo <git url> --json              # builds on Maritime, 1 to 3 minutes

The container must listen on 0.0.0.0:$PORT (injected, never hardcode 8080), answer GET /health with any 2xx, answer POST /chat with JSON {"message": "..."} within 30 seconds, and keep state under /data. If the repo does not meet this, add the smallest server that does before deploying. Contract and examples: https://maritime.sh/docs/frameworks/custom.md

C. The user wants a public web app on its own HTTPS URL:

maritime create <name> --repo <git url> --public --port <port> --json

D. The user's product should give every end user their own agent: stop, and point them at the SDK instead of deploying by hand: https://maritime.sh/docs/build.md

Secrets the agent needs go in after create, never into the repo:

maritime env set <name> KEY=value --reload --json

Scheduled work: timers inside a sleeping VM do not fire. Use maritime triggers create <name> --type cron --cron "<expr>" --json.

Step 7: verify

maritime status <name> --json                               # poll until .status is "active"
maritime chat <name> "hello" --json | jq -r '.response'     # templates and chat-capable containers
maritime logs <name> --json                                 # custom containers: the server is listening

A build failure shows in maritime history <name> --json (buildLog). Fix the Dockerfile and run maritime deploy <name> --json. Do not create a second agent to work around a failed build.

Step 8: leave the repo ready for next time

If you deployed from a repo and .claude/skills/maritime/SKILL.md does not exist, run maritime init --no-create there (it writes the skill and a maritime.json), or fetch https://maritime.sh/SKILL.md into that path. The next agent session in that repo then knows Maritime without reading this page.

Step 9: report

End with exactly this shape, filled in with what actually happened: