Client packages are open source under Apache-2.0 

Do you know what your agents are doing?

AER records the tools, programs, hosts, files and models your agents use, and signs each finished session so you can check later that the record has not changed.

Metadata only. Your prompts, completions, tool argument values and file contents are not sent to AER. Each event is reduced to metadata on your machine before it is posted. See what is recorded

Pilot access is reviewed by hand; pricing is custom. Checking a record needs no account.

Install the hooks for Claude Code

export AER_API_KEY=... AER_TENANT_ID=... AER_AGENT_ID=... AER_ENV_ID=...
npx @adastracomputing/aer-hooks install claude-code
nix profile add github:Ad-Astra-Computing/aer#tools
export AER_API_KEY=... AER_TENANT_ID=... AER_AGENT_ID=... AER_ENV_ID=...
aer-hooks install claude-code

The hook records nothing until those variables hold your API key and IDs, which are issued when your pilot access is approved. Other harnesses are under Install.

A recorded run

A real agent session, as AER recorded it

This is the last public run we could reach: an agent making real model calls and real tool calls against a live registry, through the same session, ingest and completion path you would use, recorded on 24 Sep at 16:30 UTC.

LLM ← claude-haiku-4-5-20251001 39 tok
8/8
Time (UTC)EventRecordedNot recorded
16:30:07.188llm.requestedLLM → claude-haiku-4-5-20251001the prompt
16:30:08.649llm.completedLLM ← 66 tokthe completion
16:30:08.649tool.selectedSelect: npm_package_infoargument values
16:30:08.649http.requestedHTTP GET registry.npmjs.orgpath, query, headers, body
16:30:09.712http.completedHTTP 200 registry.npmjs.orgresponse headers and body
16:30:09.712tool.completedDone: npm_package_infothe result
16:30:09.712llm.requestedLLM → claude-haiku-4-5-20251001the prompt
16:30:10.630llm.completedLLM ← claude-haiku-4-5-20251001 39 tokthe completion

Recorded so far

Model
claude-haiku-4-5-20251001
Tool
npm_package_info
Host
registry.npmjs.org
Tokens
1,323 in, 105 out
Est. cost
$0.0018
Status
Signed and anchoredCheck it
Canonical hash
4b6e8b02…42e4ba14
Signing key
a721bb9bd8f31c8e
Public timestamp log
View the Sigstore entry
Works withClaude CodeCodex CLIAntigravityopencodeMCP servers
InstrumentsOpenAI SDKAnthropic SDKVercel AI SDKnode:http(s)fetchchild_process

Install

Install the hooks or the collector

Coding agents are recorded through hooks, one command per harness. A Node agent is recorded by the collector with no change to its source. The client packages need Node 22 or newer. A Python SDK installs the same way: pip install "git+https://github.com/Ad-Astra-Computing/aer.git@sdk-py-v0.1.0#subdirectory=packages/sdk-py".

# configure AER with the standard environment, read by the hook process:
export AER_API_KEY=... AER_TENANT_ID=... AER_AGENT_ID=... AER_ENV_ID=...

npx @adastracomputing/aer-hooks install claude-code
npx @adastracomputing/aer-hooks install codex
npx @adastracomputing/aer-hooks install antigravity
# installed rather than run: the harness calls the hook binary
# itself, so it has to stay on PATH after setup finishes
nix profile add github:Ad-Astra-Computing/aer#tools

export AER_API_KEY=... AER_TENANT_ID=... AER_AGENT_ID=... AER_ENV_ID=...

aer-hooks install claude-code
aer-hooks install codex
aer-hooks install antigravity

The hook reads its key from the environment it runs under, so keep it out of a shell history and set it somewhere only you can read. Codex runs a hook only after you approve it with /hooks. Check what is wired with aer-hooks status.

Import a past Claude Code session

npx @adastracomputing/aer import claude-code \
  ~/.claude/projects/<project>/<session>.jsonl
nix run github:Ad-Astra-Computing/aer#aer -- import claude-code \
  ~/.claude/projects/<project>/<session>.jsonl

The command reads a transcript on your machine and sends only its metadata. The path to the transcript file is required.

The full quickstart walks through setting up your key and checking that recording works.

Privacy

The record holds metadata only

Prompts, completions, file contents, argument values and command lines are not recorded, so a record can be shared without disclosing your code or your conversation with the agent.

Recorded by the collectors and hooksNot recorded
Tool names and the names of their argument keysArgument values and return values
Hosts contactedThe Node collector keeps the host, method and path, with any query string replaced by a marker. The hooks keep only the host and method.Query strings, headers and bodies
Paths of files read or writtenFile contents
Every program a shell command runs, and the hosts it points curl, wget, git, ssh, scp and rsync atThe command line, its flags and arguments
Model names and token countsPrompts and completions

Enforced in the collector and again at ingest. The API discards any field outside a fixed list. An event you build yourself with an SDK or the raw API is otherwise stored as you send it.

Check the client code yourself. The code that decides what leaves your machine is open source, and each npm release carries provenance linking it to the commit it was built from, which npm audit signatures checks. Read the client source

Check it yourself

Verifier output for a signed record and an edited copy

You can check any record with the CLI, in a browser or offline with the verifier library. Below is the verifier's output for the run above as signed, and for a copy with one host name changed.

As signed verifyAerBundle(), fields trimmed

{
  "ok": true,
  "checks": {
    "hash_match": true,
    "signature_valid": true,
    "anchor": { "status": "verified" }
  },
  "reasons": []
}

One host edited verifyAerBundle(), fields trimmed

{
  "ok": false,
  "checks": {
    "hash_match": false
  },
  "reasons": ["hash_mismatch"]
}

The edited bytes no longer match the signed hash. Passing again would need a new signature from AER's key.

Canonical hash4b6e8b0241f59b57bb5d72a72c59c0d4bf3ea61b3159743de8f7db7f42e4ba14
SignaturerlgaDcdpPeWmNyBCw+Fqq8FOdoEn2E4dzX0kuAtdPJH/ET3CbbUUPR6hWFwHyT5fCeXTrBCtNeIk7eOUOwP8CQ==
Signing keya721bb9bd8f31c8e, the public key
Public timestamp logView the Sigstore entry. It holds only the record's hash, signature and the time the log received it, so anyone can see when the record existed without seeing what is in it.

Tamper-evident, not tamper-proof. After signing and anchoring, any modification to the bytes above is detectable by anyone. AER does not claim to stop a malicious operator who strips instrumentation before it runs; for that boundary, protected resources verify a live attestation and deny an unattested caller, covered under For teams.

Evidence, not logs

Independent evidence, not better logs

LangSmith, Langfuse and Arize Phoenix exist to help you understand and improve your own agent: traces, evals, prompt comparison, cost and latency over time. AER exists to prove to someone who was not in the room what an agent did. The two jobs overlap in what they watch, not in what they are for, and a team running agents in production can reasonably want both.

PropertyPlain logsObservability platformAER
Tamper-evident——Ed25519 signed
Your prompts and datain your logstypically uploadednever leave your process
What it is fordebuggingdebugging your agentproving it to a third party
Independently verifiable——SubtleCrypto, CLI, anywhere
Anchored to public log——Sigstore Rekor
Standalone bundle artifact—typically platform-specific exportsingle canonical.json
Baseline-driven detectiongrepeval rules, schema not publishedrules.v1: deterministic and replayable, schema published
Schema is open—varies by platformdocumented + zod-validated

If your main goal is

GoalReach for
Debug a wrong or low-quality answerLangfuse, LangSmith or Phoenix. Tracing and prompt comparison are their job, not AER's.
Track cost and latency across many runsAn observability platform tracks it over time. AER estimates cost once per record, against a versioned price table.
Self-host so nothing leaves your networkLangfuse or Phoenix, which are open source and self-host on their free tiers. LangSmith self-hosts on its enterprise plan.
Prove a record was not modified after the factAER. That is what the signature and the public log are for.
Gate access to a resource on a live attestationAER's admission control.

More controls

Findings, usage policy and cost

Baseline findings

A session that uses a tool or contacts a host outside the baseline you trained raises a finding. Detection uses fixed rules and no language model.

Usage policy per agent

Set allowed models and per-session token and call caps for each agent. The Node collector enforces them in report or block mode.

Estimated cost

Each record estimates the run's cost from its token counts against a versioned price table, so it stays an estimate against list prices, not a bill.

For security and compliance teams

More agents than you can account for

01

The incident review

An agent deleted the wrong records at 2 a.m. The postmortem needs to know which tools it called, what it touched and where it sent data. Ordinary logs are scattered and easy to change after the fact. A signed record answers those questions and cannot be quietly edited.

02

The audit request

A customer audit asks you to prove what your agents did with their data. Screenshots of your own dashboard are not proof. AER exports an evidence pack for any run and the customer verifies it themselves.

Whoever holds an AER record checks it against AER's published key and a public log, so a change made after signing is detected. Because a record never held your content, you can share it widely.

Admission control

A protected resource can require a live AER attestation token before it serves a request. An MCP server behind the guard denies any request that does not carry a valid token; a Node agent's own collector enforces the same check in report or block mode. Guide

Pause an agent

An admin can pause one agent. AER then refuses its new sessions, events and tokens until it is resumed.

import { honoMcpGuard } from '@adastracomputing/aer-mcp-guard/hono';

app.use('/mcp', honoMcpGuard({ audience: 'mcp://payments-prod' }));

Evidence pack

Each record downloads as evidence.zip, which can be checked without contacting AER, or as a PDF report.

canonical.jsonThe exact bytes that were signed
public-key.jsonThe signing key
anchor-evidence.jsonLog inclusion proof for offline checking (when the run is anchored)
prov.jsonW3C PROV export
README.mdThe offline verification steps
manifest.jsonSHA-256 of every file

Storage and retention

Location
Cloudflare, isolated per tenant, with the primary database in Eastern North America.
Retention
From 1 to 3650 days, or indefinitely. Records can be public or private.
Not deletable
The public log entry, which holds a hash and a signature, not your data.

Privacy, Security and the Data Processing Agreement have the detail.

Pilot

Pilot access, reviewed by hand

A small group of users is being onboarded by hand. Say which agent you run and what you plan to record, and whether you run agents across a team.

Or write to support@aer.run.

Hosted signing, storage and anchoringCustom pilot pricing
Client packagesApache-2.0
Checking a recordNo account needed
Console sign-inPasskeys or TOTP

Questions

What evaluators ask

What it is

How is this different from observability or logging tools?
Observability and logging give you records you have to trust the vendor about: they live in a system you control, and anyone with access can change them. AER produces a signed record that a third party can verify without trusting you or us. The signature and the public transparency log make it evidence, not a dashboard. AER sits alongside your observability stack; it is the record you hand to someone who will not take your word for it.

What a record proves

What exactly does a signed record prove?
Three things. Integrity: the record was not altered after signing, since any change breaks the canonical hash. Provenance: it was signed under AER's published key, and the transparency log fixes when. Observation: the events in it were captured by the collector during the run. It does not by itself prove the agent could not act outside what was instrumented; see "What won't a signed record tell you?" for what that gap means and where admission control closes it.
What won't a signed record tell you?
A record proves the integrity of what was captured, not that everything the agent did was captured: a collector that never ran, or was removed before the agent acted, produces no record at all, so there is nothing to detect because nothing was emitted. Admission control and attestation close that gap only for resources wired to require a token, not universally.Metadata is not the full story, by design: knowing a tool was called does not say what arguments it passed or what it got back, which is the trade-off bodies-off makes so a record can be shared without exposing your prompts or your data.Trusting a record still means evaluating AER the way you would any vendor you depend on: how the signing key is managed, how long records are retained, how revocation works, how far collector coverage reaches and what happens if AER is unreachable.
Is the record on the demo page a real agent run?
Yes. It is produced on a schedule by an agent that makes real model calls and real tool calls against a live registry, through the same session, ingest and completion path a customer’s agent uses. It is signed and anchored like any other record. The sentence describing the run is assembled from the record itself rather than written by hand, so it cannot drift away from what the record actually shows.
What does AER deliberately not capture?
AER’s collectors record metadata only: model names, token counts, tool names, hosts and process names. They never capture prompts, completions, tool arguments, request or response bodies or headers, and a URL is recorded as its host; the Node collector also keeps the URL path, with any query string replaced by a marker. That boundary is enforced in the collector, on every provider, streaming or not. The API also discards fields it does not recognise at ingest and bounds the size of the fields it keeps. It reduces a url field to its scheme and host and replaces a query string in a redacted path with the same marker, so an event you build yourself with an SDK or the raw API cannot store a query string either. Every other field it keeps is stored as you send it.
Does deviation detection send anything to a language model?
No. A baseline is the set of tools, hosts and tool orderings an agent used across the sessions you trained it on, and a finding is a later session stepping outside that set. Training and detection are deterministic rules over metadata we already hold, they run on our infrastructure, and no model provider is involved at any point. The engine depends on nothing but our own schemas, and a test in the build fails if a dependency is ever added that could reach outside it.
Can I prove a specific prompt or output without revealing it?
Yes. Content commitments put a one-way tag over a prompt or response in the signed record using a key only you hold. Later you can prove a given text matches the tag byte for byte, offline, without AER ever seeing the text.

Security and data

Where does my data live and how is it handled?
On Cloudflare's platform, isolated per tenant. You control retention and whether records are public or private. We are a data processor for your telemetry and a controller for your account data. The Data Processing Agreement is published in full, EU and UK transfers rely on Standard Contractual Clauses, and every subprocessor is listed on the subprocessors page. The privacy and security pages have the detail.
What if Sigstore Rekor goes down or rewrites history?
Rekor is run by the Linux Foundation's Sigstore project with independent witnesses and a publicly auditable Merkle tree. Anchoring is best-effort at session close: if Rekor is briefly unreachable, the record is signed and flagged unanchored, then anchored once the log is reachable again. Even without Rekor, the Ed25519 signature alone proves the record was emitted by AER's key.

Integration

Does this slow down my agent?
Not in the request path. The SDK batches events in memory and posts them asynchronously. Calls to emit() return as soon as the event is queued; flushing runs every 500ms by default. Signing and anchoring happen at complete() time, server-side, not in your hot path.
What can I instrument?
The Node collector covers the OpenAI, Anthropic and Vercel AI SDKs, raw HTTP, fetch and child processes, and the MCP recorder covers MCP servers. Both need Node 22 or newer. Two SDKs ship today, @adastracomputing/aer-sdk-ts for TypeScript and Node, and aer-sdk for Python. The Python one is installed from the public client repository rather than PyPI, pinned to a release tag rather than the default branch: pip install "git+https://github.com/Ad-Astra-Computing/aer.git@sdk-py-v0.1.0#subdirectory=packages/sdk-py". Any other language can speak the raw HTTP API.
Does it work with Claude Code, Codex CLI or coding agents?
Yes, through hooks rather than the collector, since a coding harness is not a Node process you control. npx @adastracomputing/aer-hooks install claude-code registers with the harness with no change to the harness itself, and codex and antigravity install the same way. Codex will not run a hook until you trust it, so run /hooks there and approve the entry. Antigravity does not fire its tool hooks in print mode, so a headless run there records the shape of the conversation rather than each tool call. opencode runs plugins in process rather than firing shell hooks, so it takes a small plugin file instead of an install command. The hooks record tool names and argument key names, every program a shell command runs, the hosts that curl, wget, git, ssh, scp and rsync are pointed at, the host and method of a web fetch, the paths of files read or written and, for Claude Code, the model and token counts from its transcript. They never record argument values, file contents or the path and query of a URL, and a hook that cannot reach AER never blocks a tool call.
Can I install AER with Nix instead of npm?
Yes. The client packages ship as a Nix flake alongside npm. nix run github:Ad-Astra-Computing/aer#aer -- init instruments a project without installing anything permanently, and nix profile add github:Ad-Astra-Computing/aer#tools puts the CLI, the hook binaries and the MCP recorder on your PATH. Recording a coding harness needs the profile form, because the harness calls the hook binary itself long after the setup command has finished. Every command box on this site offers both forms.
Is AER open source?
Partly, and the split is deliberate. Every client package you install into your own agents and services is Apache-2.0: the collector, the SDKs, the CLI, the verifier and the admission guards. The Node packages are published on npm and the source is at github.com/Ad-Astra-Computing/aer. The hosted service that signs and stores records is not. The part that proves a record is genuine is the open part, so you never have to trust whoever produced the record. The verifier library makes no network calls and needs no account, so a record already issued still verifies even if AER goes away.
How long are records retained?
Until the retention window you set in settings expires, anywhere from 1 to 3650 days, or indefinitely if you set none. The transparency log entry is permanent by design, since Rekor is append-only, but it contains only a hash and a signature, never your data.

Know what your agents are doing. Prove it to anyone who asks.