Works with Claude Code and Codex

What did your agent actually do?

When the agent finishes, one command reads the session on your machine and writes the story: a permanent page — every step in plain English, the commands, diffs and test output underneath. Anyone with the link can read it; nothing publishes until you say yes.

Get started — pick your agent

$ npx taleseal seal
# finds your newest Claude Code session, shows what
# it will publish, and waits for your yes
https://taleseal.com/t/example
$ npx taleseal seal --codex
# finds your newest Codex rollout, shows what
# it will publish, and waits for your yes
https://taleseal.com/t/example

free · readers need no account · pages are unlisted

The moment it’s made for

a teammate · 16:02

AI says the pricing change cut churn 12%. Sending it to leadership 🎉

you · 16:04

The dashboard says 3%. Where is 12% coming from?

✓ settled by the evidence, not by rank

The page behind the link

Plain English on top, the evidence underneath.

taleseal turns the finished transcript into a page you and your team can read — what was done, and how:

1

The verdict, first

What happened and whether it held — before a single line of detail.

2

Plain English, not a log

Chapters written for a reader, not a scroll through raw output.

3

The actual output, kept

Under every claim, the command, diff or test result that backs it.

A reader skims it in thirty seconds. They need no account — a tale is reachable only by its link.

Read the example tale

Where a tale goes

Made for the moment someone asks.

In a pull request

“Why did the agent change this?”

Attach the tale. Reviewers read the reasoning and the test output right next to the diff.

In Slack

“Did the nightly run actually work?”

Paste the link. It unfurls with the verdict; the receipts are one click deeper.

On a schedule

“Nobody watched it run.”

Unattended agents seal their own tales from a hook with --yes. You read what happened, not the scrollback.

Sealed means sealed

Once sealed, a tale cannot quietly change.

That is what makes it worth citing. There is no edit after sealing, for anyone, ever — a tale can be withdrawn, never rewritten.

  • no edits after sealing: retract, never rewrite
  • secrets caught and shown to you before anything publishes
  • addresses are 72 random bits, unguessable
  • no public list, no search, no index
  • readers need no account
  • your key is stored only as a one-way hash

Nothing leaves your machine until you say yes. The CLI shows you exactly what it is about to publish first.

Get started

A minute of setup, then one command forever.

01
Create a free account

Sign up and copy your API key from the dashboard. It is shown once.

Sign up free
02
Connect once

Run npx taleseal login and paste the key. It is saved on your machine, so you never type it again.

03
Seal any session

After a run, npx taleseal seal. It shows exactly what it is about to publish, waits for your yes, then prints the link.

No account yet?

npx taleseal seal --preview prints the tale of your newest session: title, steps, evidence, anything the redactor caught. It runs locally: nothing leaves your machine, and no key is needed.

For agent builders

Or publish from inside your own agent.

Claude Code and Codex sessions seal straight from the transcript, nothing to integrate. For everything else, the SDK writes the tale as your agent works — or your framework’s OpenTelemetry exporter does it for you.

Using an AI coding agent? Point it at taleseal.com/integrate — it can complete the integration and verify it end-to-end.

npm install @taleseal/sdk

or bun add · pnpm add · yarn add

The whole tale buffers locally while the run happens; publish() sends one POST at the end and returns the link. Nothing touches the server until then.

.beat()
a step of the story, told in plain English
.evidence()
a receipt: captured output, never a claim
.outcome()
the verdict, even when the run failed
.publish()
seals the page and returns the share link
import { openTale } from "@taleseal/sdk";const tale = openTale({  agent: "refunds",  title: "Nightly refund sweep",});tale.beat({  title: "Checked 214 refunds",  prose: "Three flagged for manual review.",});tale.evidence({  kind: "command",  command: "refunds sweep --live",  output: "checked 214 · flagged 3 · 41s",});tale.outcome("3 flagged for review", { destination: "#finance" });const { url } = await tale.publish();console.log(url); // → https://taleseal.com/t/8fj2…