Signup → first verified receipt in under 15 minutes

Paste, don't read.

Two ways in, both free. Run the whole thing on your own machine with no account, or point one base_url at the hosted gateway. Either way your next agent call becomes a signed, verifiable receipt.

Fastest: run it yourself, no account

The full loop — agent traffic → receipts → bundle → VERIFIED — entirely local. Nothing to sign up for, nothing that depends on our uptime.

# Python 3.11+
pipx install swarrm            # or: pip install swarrm
swarrm demo                    # agent traffic → receipts → checkpoint → bundle
swarrm verify demo_out/bundle.json   # → VERIFIED  (the demo then flips a byte → NOT VERIFIED)

swarrm up                      # run the whole dev stack locally (gateway + console)

Prefer zero install? Verify a real bundle in your browser →

Wire it into your agent

Point your existing client at the gateway. The only change is a base_url and your key — get one from Start free, or use your local swarrm up gateway.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.swarrm.ai/v1",   # or http://localhost:8080/v1 (swarrm up)
    api_key="YOUR_SWARRM_KEY",
    default_headers={"x-evd-agent": "my-agent"},
)
resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "hello"}],
)
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.swarrm.ai/v1",   // or http://localhost:8080/v1
  apiKey: process.env.SWARRM_KEY,
  defaultHeaders: { "x-evd-agent": "my-agent" },
});
const resp = await client.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [{ role: "user", content: "hello" }],
});
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    base_url="https://api.swarrm.ai/v1",   # or http://localhost:8080/v1
    api_key="YOUR_SWARRM_KEY",
    model="gpt-4o-mini",
    default_headers={"x-evd-agent": "my-agent"},
)
print(llm.invoke("hello").content)
# Wrap an MCP server; every tools/call becomes a receipt in a local log.
swarrm wrap -- npx -y @modelcontextprotocol/server-everything

# receipts land in ./evd_log.db — check any time:
swarrm verify        # or point your MCP client's command at `swarrm wrap -- <server>`
# Production: the recorder signs inside YOUR network; only hashes egress.
# From the repo (docker compose):
EVD_UPSTREAM_BASE=https://api.openai.com \
EVD_HOSTED_URL=https://api.swarrm.ai \
EVD_API_KEY=YOUR_SWARRM_KEY \
docker compose -f docker-compose.appliance.yml up

"Is it even recording?"

Fail-open means failures are silent by design — right for production, unnerving on day one. So we made it loud on demand: swarrm doctor shows your effective config and, crucially, your last receipt.

$ swarrm doctor
swarrm doctor — profile: dev

[core]
  EVD_TENANT      t_dev          (profile-default)
  EVD_DB          ./evd_log.db   (profile-default)
  ...

Recording health:
  t_dev:  12 receipts, last 3s ago, seq-gaps 0

 profile 'dev' is fully configured.

In the console, your first receipt gets its own moment — “your first verified receipt ✔ — verify it yourself.”

Verify your own first bundle

The point of the whole thing: proof you can hand to someone who doesn't trust you.

swarrm demo                          # produces demo_out/bundle.json
swarrm verify demo_out/bundle.json   # → VERDICT: VERIFIED
# or drop it into the browser verifier — no install, no account:
# https://swarrm.ai/verify.html

If something's off

swarrm: command not found
The install put it somewhere off your PATH. With pipx: pipx ensurepath then restart the shell. In a venv: activate it first (source .venv/bin/activate).
I got NOT VERIFIED right after the demo
That's the demo doing its job — it deliberately tampers a copy. Verify bundle.json (VERIFIED), not bundle_tampered.json (NOT VERIFIED, on purpose).
swarrm doctor shows no receipts
Nothing has flowed through the gateway yet. Make one call (the snippets above), then re-run swarrm doctor — you should see your first receipt with an age of a few seconds.
My agents can't reach the hosted gateway
The hosted service runs on our own hardware and can blink. It never blocks you: fail-open means your traffic keeps flowing and receipts buffer locally. For anything you depend on, run your own gateway with swarrm up — it's the same code.