Your agent works. Until a step flakes.
A demo only has to work once. Real runs have ten steps, flaky tools, and restarts. Tidebase makes every run durable, so the question “is it safe to rerun?” always has an answer.
Tidebase is an open-source checkpoint layer for AI agents: wrap your steps, and failed runs resume from the last safe point — in your own Postgres, without moving execution into a new runtime.
$ docker compose up -d postgres && pnpm dev
A demo only has to work once. Real runs have ten steps, flaky tools, and restarts. Tidebase makes every run durable, so the question “is it safe to rerun?” always has an answer.
A live run, checkpointing each step to Postgres. Kill it mid-flight, re-invoke with the same run id, and completed steps replay in 0ms.
await tide.run('generate-report', { runId }, async (run) => { const plan = await run.step('plan', makePlan) const sources = await run.step('fetch-sources', () => fetchSources(plan)) await run.state.set({ status: 'writing', progress: 0.7 }) const ok = await run.gate('approve-report', { prompt: 'Send the generated report?' }) return run.step('write-report', () => writeReport(sources))}) Create or resume a run, then checkpoint each unit of work. Completed steps return from Postgres on replay.
Push status and progress your product UI can subscribe to, in real time.
Open a durable gate and wait. The run resumes only once a decision exists, and it resolves exactly once.
The last step runs once the gate clears, and its result is checkpointed too.
The run pauses at a durable gate and waits for a decision — in Studio, your own app, or any webhook surface. It resolves exactly once, and every decision is audited.
Every step's state is versioned in Postgres. When a run produces a wrong answer, scrub the timeline to the exact step that poisoned it — no print statements, no rerunning.
run.fanout() runs subagents as child runs, each checkpointed independently. If the parent resumes, existing children are reused — no duplicate subagents, no double spend.
Token and tool spend is attributed per run and per step — without proxying your LLM calls — so a scraping loop gone wrong shows up on a graph, not on an invoice.
The run is the core object. Checkpoints, state and gates are just the start — these services come wired in, so there's no extra infrastructure to build.
Run events stream to any webhook you own — Slack via your bot, an internal tool, or your product — and a pending gate becomes a message your team can approve right there. Decisions happen where people already work, not in yet another dashboard.
Only one worker ever owns a run at a time, and zombie workers are fenced from writing stale results — so a retry can't double-charge a customer or fire the same tool twice.
When a run fails, Tidebase calls a signed endpoint in your app so it can re-invoke the workflow. Every attempt is recorded with its delivery status.
Subagents run as child runs, idempotent by name on resume. State is versioned, so snapshots, time travel, and forks fall out of the same model.
Token spend attributed per run and per step — without proxying your LLM calls — so a runaway agent shows up on a graph before it shows up on the bill.
Every scope an agent asks for is recorded with who approved it and why. Audit metadata only — Tidebase never stores your keys.
Every run is a full trace: step timeline, live state, pending gates, costs, and the event stream. Self-hosted, in your own Postgres, no secret custody.
The docs ship as one file your assistant can read. Open Claude or ChatGPT with it preloaded and have it evaluate Tidebase against your stack — critically.
llms-full.txt · every docs page also serves a raw .md twin
Self-hosted from day one. Point the SDK at Postgres and wrap a workflow.