Open source · Apache-2.0 · Rust core

Git for agent state.

Fork, rewind and replay your AI agent's state, while emails, payments and API calls never run twice, no matter how many times you retry.

forked.run · session run-42
rewound · anchoredeffect keptmainalternative
Rust core wasm-native SQLite Cloudflare LangGraph Apache-2.0

The problem

Your agent crashed after charging the card.

Retrying is the obvious fix, and the dangerous one. Transcript stores happily let the re-run charge twice and email twice. forked records every side effect by idempotency key inside the commit: the naive full re-run becomes safe, because already-performed steps return their stored result instantly instead of executing again.

Run this example yourself
01-safe-retry.mjs
$ node agent.mjs   # attempt #2, naive full re-run
  ↩ payment.charge   already done, reusing {"txn":"txn_1","amount":184}
  ↩ flight.book      already done, reusing {"pnr":"PNR101"}
  ↩ email.send       already done, reusing {"messageId":"msg_1"}
  ⚡ loyalty.credit   EXECUTED
✓ complete, charges: 1, bookings: 1, emails: 1

EFFECT LOG

Side effects stay done.

Emails, payments and API calls are recorded by idempotency key inside commits. Re-run a crashed agent from the top and the recorded steps return their stored results instead of executing twice. Rewinds never undo an effect.

O(1) FORK

A thousand branches, zero copies.

State is a persistent, structurally shared tree. A fork writes one ref: 1,000 branches in ~1.4 ms, zero bytes of state copied. Explore twenty candidate plans from identical state and keep the winner.

REWIND

Byte-exact time travel.

Move any branch to any commit. Abandoned history stays anchored and auditable.

DIFF

Diff by hash.

Content-addressed subtrees are skipped wholesale, so diffs scale with the change, not the state.

ONE API

Self-hosted ≡ cloud.

Both deployments run the same open dispatcher. Switch with one baseUrl change.

LangGraph

Drop-in checkpointer, real time travel.

@forked-run/langgraph turns LangGraph's time travel into an actual branch rewind, the console shows every fork point your graph ever took.

compile({ checkpointer })

The API

Five calls. That's the whole model.

Sessions, branches, commits, effects. Point the client at your own server or at forked cloud, the API is identical by construction, because both run the same open-source dispatcher.

agent.ts
import { ForkedClient } from "@forked-run/client";

const forked = new ForkedClient({ baseUrl: "https://api.forked.run" });
const session = await forked.createSession();
const main = session.branch();

await main.put({ plan: ["draft", "review", "send"] });

const alt = await main.fork("alternative");  // O(1), nothing copied
await main.checkout(earlier);           // rewind, byte-exact

await session.recordEffect({           // survives every rewind
  key: "send-email:42",
  kind: "email.send",
  result: { messageId: "abc" },
});

Simple pricing

Everything a single developer needs is open source. The cloud sells operations.

Free

$0

  • ✓100k requests / day
  • ✓Unlimited branches & forks
  • ✓Visual branch-tree console
  • ✓No credit card
Start free

Pro

Soon

  • ✓Higher limits & burst tier
  • ✓Long retention & exports
  • ✓Teams
  • ✓Priority support
Join the waitlist

Prefer your own metal? docker run forked-server , same API, forever free.

Stop replaying transcripts.
Start versioning state.