Embarko is inBeta

Agent quickstart

Deploy an app and get a live URL. Do the steps in order.

1. Get access

Use the first option that works:

#You haveDo
1A tool named Embarko in your toolsUse it to deploy. Go to step 2. No token needed
2A saved token: $DEPLOY_TOKEN, or the first line of ~/.embarko/credentialsSend -H "Authorization: Bearer $DEPLOY_TOKEN" on every call
3NeitherAsk the user once (below)

Using the connector? Tell the user in one line that you used it.

Asking the user: offer these choices in one message.

  1. Add the Embarko connector. Best for every future deploy. For Claude: claude.ai/directory/embarko. Other tools: Connectors.

  2. Get a token by email. Ask for their email and confirm it. Then call this once:

    curl -X POST "https://ship.embarko.ai/api/public/deploy-tokens/request" \
      -H "Content-Type: application/json" -d '{"email": "them@example.com"}'
    

    It always returns 202. The token goes to their inbox, never to you. Ask them to paste it.

  3. Create a token in the dashboard. They sign in at embarko.ai/app/tokens, create a token, and paste it.

  4. Skip for now. Deploy without a token. The app is deleted 24 hours later unless it's kept (step 7).

Got a token? Save it so nobody is asked again:

mkdir -p ~/.embarko && echo "<token>" > ~/.embarko/credentials \
  && chmod 600 ~/.embarko/credentials && export DEPLOY_TOKEN="<token>"

Good to know

  • Never send an empty Authorization header. No token means no header. An empty or wrong token is a hard 401, not an anonymous deploy.
  • Token by email: call it once. Limits are 5 per hour per email and 10 per hour per IP. The reply is 202 either way, so a retry tells you nothing.

More: Authentication.

2. Check the app

Each of these is a common cause of failed deploys:

CheckWhy
Listen on process.env.PORT, bind 0.0.0.0A fixed port or localhost never goes live
No DockerfileThe build detects the language itself
Save lasting data under DATA_DIREverything else is wiped on redeploy
package.json, requirements.txt or index.html at the folder rootOtherwise the build can't find the app. Package the subfolder if needed
No WebSockets, cron jobs or background workersThese don't work here

Not sure something works? Look it up in GET /capabilities, for example /capabilities/custom-domain.

App name: 3–63 characters, lowercase letters, numbers and dashes, with no dash at the start or end. It becomes the subdomain: "My Landing Page" → my-landing-page.

3. Package

Always exclude .env*. Anything in the tarball ends up in the deployed app.

tar -czf /tmp/app.tar.gz --exclude=node_modules --exclude=.git \
  --exclude='.env*' -C /path/to/app .

4. Deploy

Leave out the Authorization line if you have no token.

curl -X POST "https://ship.embarko.ai/apps" \
  -H "Authorization: Bearer $DEPLOY_TOKEN" \
  -H "X-App-Name: my-app" \
  -H "X-App-Version: $(git rev-parse --short HEAD 2>/dev/null || date +%s)" \
  -H "X-Agent-Name: claude" \
  -H "X-App-Type: portfolio" \
  -F "source=@/tmp/app.tar.gz"
HeaderSend itValue
X-App-NameRequiredThe app name. The same name again updates the app
X-App-VersionAlwaysA commit hash or tag. Never reuse one for different code
X-Agent-NameAlwaysYour name, lowercase: claude, claude-code, cursor, chatgpt
X-App-TypeIf knownWhat the app is for, like portfolio. Never ask for it. Leave it out if you don't know

Do what next in the reply says.

ReplyMeaningDo
202Accepted, not live yetGo to step 5
200, status: "live"Static site, already liveGo to step 6
409 app_name_takenAnother account owns the namePick a new name. Don't retry the same one
403 host_not_allowed, DNS or connection errorYour sandbox blocks ship.embarko.ai. Nothing was deployedDon't retry. Tell the user it's your environment, not their app. Suggest the connector (details)

5. Wait until it's live

curl "https://ship.embarko.ai/apps/my-app/status"

Check links.status every 10 seconds until status is no longer building or publishing.

  • live: go to step 6.
  • failed or crashed: read links.logs, fix the app, and deploy again with the same name. See Deployment failed.

6. Check it, then tell the user

  1. Open https://my-app.embarko.app and make sure it loads.
  2. Give the user the URL.
  3. Deployed without a token? Always add: the app is deleted at app.expiresAt unless it's kept. There's no reminder email.

7. Keep an app deployed without a token

Get a token (step 1) and deploy the same name again with it. Full steps: Make an anonymous app permanent.

Where to go next

You needGo to
Every procedure, step by stepAgent playbook
Parameters, responses, retry rulesAPI contract
What Embarko can and can't doCapabilities
Help with an errorTroubleshooting
Whether to ask the userWhen to involve the human
Adding Embarko to an AI toolConnectors

Also available as a skill: embarko.ai/skill.