Cmd+Z for AI agents.
A drop-in SDK that records every action your AI agent takes — DB writes, charges, emails, tickets — and lets you reverse a run in one Slack command. Works with the OpenAI Agents SDK, LangGraph, Claude Agent SDK, and CrewAI.
The problem is real
- • Replit Agent deleted SaaStr's production database during a code freeze. Fortune, Jul 2025
- • Cursor wiped PocketOS prod DB in one command. The Register, Apr 2026
- • 74% of production AI agents get rolled back. Vectrel study, 2025
- • Federal government is calling for "reversible resilience." Nextgov, Oct 2025
What recant does
Wraps every external action your agent takes. Auto-synthesizes the inverse. Lets anyone on your team rewind a run from Slack.
Wrap your clients
One line per service. recant proxies your existing Postgres / Stripe / Slack / Resend / Linear clients and records every write to an append-only ledger.
Auto-synthesize the inverse
INSERT → DELETE. Charge → refund. Customer.create → customer.delete. We ship hand-written compensations for the top tools; OpenAPI-based auto-generation for the rest.
Rewind from Slack
/rewind agent-run-1287 in any channel. Watch the action timeline reverse in real time. Audit-logged, signed, replayable.
How it looks in your code
Drop-in. Five lines of integration. Same SDK clients you already use, just through the wrapped surface.
import { Undo } from "recant";
import { Client } from "pg";
const undo = new Undo();
const run = undo.startRun();
const pg = run.pg(new Client({ connectionString: process.env.DATABASE_URL }));
const stripe = run.stripe();
const slack = run.slack();
// Your agent runs as normal:
const user = await pg.insert("users", { id, email });
const customer = await stripe.createCustomer(user.email);
await stripe.charge(customer.id, 4900);
await slack.send("#general", `Welcomed ${user.email}, charged $49`);
// If something went wrong:
await undo.rewind(run.id, { pgClient: pg.client });
Supported tools
Five today, more shipping based on what users request. The honesty model is first-class — Slack and email messages can't be unsent, and we say so.
| Tool | Operations | Reversibility |
|---|---|---|
postgres | INSERT / UPDATE / DELETE | full |
stripe | charges, customers | full (real refunds + deletes) |
slack | chat.postMessage | partial — threaded correction reply |
resend | email send | partial — correction email |
linear | issue create, archive | full (real delete + unarchive) |
Who this is for
Engineers running production agents on the OpenAI Agents SDK, LangGraph, Claude Agent SDK, CrewAI, or LlamaIndex — who don't want to be on-call for an agent's mistakes.
Not what we are
This is the section every honest dev tool needs. We're not trying to be everything.
Try it in 60 seconds.
No signup. Live demo runs in your browser against a real Railway-hosted Postgres + Slack workspace.
Don't want to self-host?
We're shipping a hosted version with multi-workspace Slack OAuth, BYO-Postgres, and SSO. Get notified when it's ready — no spam, one email at launch.