/ docs

Get axion running.

Axion is a Swift CLI plus a helper process that talks to the macOS Accessibility tree. You'll need macOS, Swift 5.9+, and to grant accessibility permission.

Install

Build from source — a homebrew tap is on the roadmap.

git clone https://github.com/terryso/axion
cd axion
swift build -c release
cp .build/release/axion /usr/local/bin/

Configure

Interactive setup walks you through provider, API key, and model. doctor validates the environment.

axion setup
axion doctor

Run tasks

The default run command executes live. Reach for --dryrun first when you're poking at a new app.

axion run "Open Calculator and compute 123 + 456"
axion run --dryrun "Open Calculator and compute 123 + 456"
axion run --fast "Open Calculator"
axion run --max-steps 10 "Create a new note in Notes"

Cross-run memory

Memory is on by default. Inspect what Axion has learned, scope it down, or disable it for a single run.

axion memory list
axion memory clear --app com.apple.calculator
axion run --no-memory "Open Calculator"

Skills — record and replay

Record a workflow, compile it, replay it without LLM calls. Skills live in ~/.axion/skills/.

axion record "open_calculator"
# ...perform desktop operations, Ctrl-C to stop
axion skill compile open_calculator
axion skill run open_calculator
axion skill list
axion skill delete open_calculator

HTTP API server

Run Axion as a service. SSE delivers live events per run.

axion server --port 4242 --auth-key mysecret --max-concurrent 3

GET  /v1/health
POST /v1/runs                 {"task": "..."}
GET  /v1/runs/{id}
GET  /v1/runs/{id}/events     # SSE stream

MCP server mode

Expose Axion to any MCP client.

axion mcp

# Claude Code config:
{
  "mcpServers": {
    "axion": {
      "command": "/path/to/axion",
      "args": ["mcp"]
    }
  }
}

config.json

Located at ~/.config/axion/config.json. Priority: defaults → file → env vars → CLI flags.

{
  "provider": "anthropic",
  "apiKey": "sk-...",
  "model": "claude-sonnet-4-20250514",
  "maxSteps": 20,
  "maxBatches": 6,
  "maxReplanRetries": 3,
  "traceEnabled": true
}