Axon Cloud

One command. Your agent gets a public URL, an API key, and durable storage. No Dockerfile, no infra config, no container registry.

axon login      # once
axon deploy

First deploy prints:

Deployed: https://agents.axon.run/you/my-agent
API key:  axon_...

Subsequent deploys update the running agent in place.

Before you deploy

Declare every environment variable your agent needs in axon.config.ts:

env: {
    needs: ["GITHUB_TOKEN", "LINEAR_API_KEY"],
}

Then set the values — secrets are encrypted and injected at runtime, never stored in your agent folder:

axon agent env set GITHUB_TOKEN ghp_...
axon agent env set LINEAR_API_KEY lin_api_...

What changes in the cloud

The agent source is identical. The runtime is different:

  • No TUI — your agent is accessed over HTTP via the routes in server/api/
  • Isolated runtime — runs in a container with no access to your local machine
  • Durable datadata/ is backed by cloud storage, persists across restarts and redeploys
  • Email address — every deployed agent gets agent-name@axon.run

Calling your agent

The default POST /api/chat route is built-in:

curl -X POST https://agents.axon.run/you/my-agent/api/chat \
  -H "Authorization: Bearer axon_..." \
  -H "Content-Type: application/json" \
  -d '{ "message": "summarise my open issues" }'

Any route you defined in server/api/ is available at the same base URL.

Managing

axon agent status           # is it running
axon agent logs             # tail live logs
axon agent env list         # list configured keys (values never shown)
axon agent env set KEY val  # set a secret
axon agent keys rotate      # rotate the API key
axon agent undeploy         # tear it down

Runtime config

All deployment config lives in axon.config.ts under deploy and connections.

Scaling

deploy: {
    scaling: {
        min: 0,   // scale to zero when idle (default)
        max: 3,   // max concurrent instances (default)
    },
}

min: 0 means the agent shuts down when idle and cold-starts on the next request. Set min: 1 to keep an instance warm if cold-start latency matters for your use case. max caps concurrent instances — useful for agents that hold external connections or have per-instance rate limits.

System packages

The container runs Alpine Linux with Bun and standard Unix tools. Add extras:

deploy: {
    runtime: {
        packages: ["git", "ripgrep", "ffmpeg"],
    },
}

Packages are installed via apk at build time. Anything available in the Alpine package registry can go here.

Scheduled triggers

Axon provisions Cloud Scheduler jobs for you. Declare schedules in connections:

connections: {
    schedule: [
        {
            name: "daily-digest",
            cron: "0 9 * * *",        // 9am UTC daily
            timezone: "Europe/London",
        },
        {
            name: "hourly-sync",
            cron: "0 * * * *",
        },
    ],
}

Each schedule fires a POST to /_axon/inbox/{name} on your agent. Handle it in server/api/:

// server/api/_axon/inbox/daily-digest.post.ts
export default defineEventHandler(async () => {
    const { stream } = axon.scripts.stream("daily-digest")
    return stream
})

Schedules are created and updated on every axon deploy. Deleting an entry removes the Cloud Scheduler job on next deploy.