An undo layer for AI agents

Let agents act.
Keep a
way back.

Synartesis records what your agent changes, keeps the state it replaced, and asks you first when there’s no way back.

npm install -g synartesis
A change, with its way back
report.txt
− North  412,800
+ North  0
  South  288,400

Prior state captured

This change can be put back.

Interactive example
Nothing runs on your disk
Between intent
and consequence
Four ways in

Choose your
path.

The same journal and the same undo underneath all four. Start wherever you already work.

01 / The order matters

Before the write.
A way back.

First, keep the value that is there. Then let the agent change it. When you undo, that captured value is what comes back.

A file, a journal, a way back
01 / Capture

Keep North: 412,800.

02 / Change

The agent writes North: 0.

03 / Put back

Restore North: 412,800.

An illustration, not a live run. The journal keeps the original value before the write. Undo checks for later changes before restoring it; South stays unchanged.
Watch the evidence: twenty real calls against a toy CRM
Terminal recording: reversible CRM calls are taken back, and an invoice email is held for approval.
Real tools. A real journal. A toy CRM.Open recording ↗
02 / The desktop window

A conversation.
A visible way back.

Talk to a model. See every tool call, what it changed, and whether it can be put back. The window and the CLI share the same journal and undo engine.

Download the desktop app

Your model. Including a local one.

Claude, Gemini, Mistral, OpenAI, or a compatible /v1/chat/completions endpoint. Run models locally with Ollama or LM Studio, without paid API calls or sending prompts to a model provider.

Release notes ↗

macOS · Apple silicon & Intel
Windows · Linux

After installing the desktop app, open it with synartesis desktop on any platform.

The builds are unsigned. macOS Gatekeeper and Windows SmartScreen will block or warn on first launch. Read before installing ↗

What is checked before one is built. Every installer is produced by a workflow that first runs the whole gate — build, typecheck, lint and the entire test suite — on the tagged commit, so a binary cannot be attached to a release from code that fails its own suite. The tests run on Linux and macOS across Node 22 and 24. The Windows installer is built and not tested; nothing in CI exercises it, which is worth knowing before you install it.

03 / The contract

Know what can
come back.

You define what each tool does and how to take it back. Synartesis enforces that policy. An unknown tool is treated as irreversible, so it waits for a person.

Four kinds of call. Four different ways through.

Readonly

A lookup, a search, a list. Nothing changes.

Recorded and forwarded.

Reversible

The state before the write is captured and kept.

Prior state restored on undo.

Compensable

A second action offsets the first. It is not an exact rewind.

Offset on undo.

Irreversible

An email sent. A message seen. No honest inverse.

Held for human approval.
Read the four safeguards, in order
  1. Classify. Ask if it cannot be undone.

    Match the tool against your policy. Calls that need approval stop before they reach the system.

  2. Capture before changing anything.

    Read what is about to be overwritten. If capture fails, the write does not silently go through.

  3. Journal, then forward.

    Record the call before sending it. Store its reversing call while the old value is still available.

  4. Check again before putting it back.

    Undo walks newest first and checks for later changes. It stops at a conflict, with the steps already restored left in place.

The refusal is part of the promise

Someone changed it
since? Stop.

Undo re-reads the resource and compares it with the state your run left behind. If somebody has been there since, Synartesis shows the difference and stops on that step.

Resolve the conflict, then undo --replan can continue. Work already put back stays put back.

synartesis undo · excerptdrift detected · exit 1
$ synartesis undo

halt  crm.update_customer
the resource has changed since this run.

− churn risk
+ spoke to her Tuesday

1 removed, 1 added.
RESULT · partial — stopped at the conflict
04 / Under the window

The terminal
is still home.

Run synartesis for the interactive journal. Or use the commands directly, from wherever you work.

synartesis install

Connect the clients already on your machine. Their configs are backed up first.

synartesis status

See which clients are covered, and when calls last came through.

synartesis show --live

Check touched resources against their recorded state, without writing.

synartesis undo

Walk the run backwards, stopping where it cannot safely continue.

Honest limits

Where protection
ends.

Only calls through the proxy

Direct HTTP calls, shell commands, and browser actions outside MCP are invisible to Synartesis. If your agent bypasses the proxy, those changes are not recorded.

Some actions cannot be undone

It cannot un-send an email or undo more than the system underneath allows. Those calls need human approval. A compensating action offsets a change; it does not erase history.

Captures have limits

A resource too large to capture, or one that cannot be read, cannot silently be treated as recoverable. The write is refused or held for approval with the reason shown.

Undo is not all-or-nothing

It walks newest first. If it stops at a conflict, changes already restored stay restored. A call still marked pending has an unknown outcome; the journal does not pretend otherwise.

Three of the four bundled policies are round-tripped. One is not.

filesystem and memory are round-tripped against the real server in the test suite: the change is made, undone, and the result compared — byte-for-byte restoration for files, and for the knowledge graph, what the agent added gone and what was already there untouched. git is round-tripped for the one thing it can do: that server exposes no tool that restores content, so the policy holds a single compensation, and the test proves staging comes back off the index with the working tree untouched, a commit is held, and a branch switch goes through and is reported as something undo cannot take back. It also pins the overreach — this server's reset unstages everything, so undoing the agent's staging unstages a person's too, which is why it is recorded as a compensation and not an undo. github is not tested at all: its tools are checked to exist and nothing has run an undo through them, so treat it as untested and do not rely on it for anything you cannot afford to lose.

A policy saying live is not a promise that undo works

It says the policy has met its server and the tools take the arguments it passes them. Whether it puts anything back is a separate question that only a test against the real server answers. synartesis check says so under the server list rather than letting one word stand for both.

The journal needs looking after

The prior state is what makes undo possible, so the local SQLite journal grows. Pruning old runs removes their recovery data too. Keep it for as long as you need a way back.

ΣΥΝΑΡΤΗΣΙΣ · A fastening together

Keep hold of
the other end.

An agent acts. Synartesis keeps the record.

It is a young project, and a star is most of how anybody finds out it exists. Star it on GitHub ↗

npm install -g synartesis