Skip to content

Develop locally

pal dev boots the local stack and pal agent dev is the inner loop. On every save it re-publishes your agent, fires a smoke run and streams its steps, against the same API, journal and budgets production uses. Edit-to-result takes seconds, and nothing changes when you ship.

  1. Boot the stack. Docker runs Postgres, Redis and MinIO; the API and dashboard run on the host, so you need Go 1.26+ and Node 22+ (Install).

    Terminal window
    pal dev # API :8080, dashboard :3001, WhatsApp bridge :3100 (iMessage bridge on macOS); logs in one terminal
    pal dev --infra-only # just the containers, if you run the API yourself

    pal dev logs [service] tails container logs. pal dev down stops them; --volumes also deletes data. Ports are listed in Install.

  2. Scaffold an agent. Templates: basic (default), research, tool-use, connector, personal, scheduled, approval.

    Terminal window
    pal init my-agent --template research
    • Directorymy-agent/
      • agent.yaml name, model, system prompt, optional workflow
      • … starter code for the template
  3. Start the loop and leave it running while you edit.

    Terminal window
    cd my-agent
    pal agent dev my-agent --input '{"prompt":"hi"}' --eval

    On every change to agent.yaml or any .yaml, .yml, .json, .ts, .tsx, .js, .jsx, .py or .go file, it:

    1. publishes a new agent version,
    2. fires a smoke run with --input,
    3. streams step_started, step_completed, step_failed and confidence_evaluated as a waterfall,
    4. with --eval, runs the agent’s eval suite and prints pass or fail against the baseline.

    Ctrl-C exits. agents and agent are the same command.

  4. Gate it the way CI will.

    Terminal window
    pal test --agent my-agent --suite <your-suite> # non-zero exit on regression
    pal test --agent my-agent --rehearse --window 24h # replay recent real failures

When the loop is green, deploy it.