The archive

What a recorded session contains on disk.

View as MarkdownAsk Claude about this page

An archive root holds the sessions of one site. Every other stage reads from it.

archive/<host>/
├── sessions/
│   └── <timestamp>-<id>/
│       ├── session.json
│       ├── events.jsonl
│       └── graph.json
└── blobs/
    └── <sha256>
File Contents
session.json Site, task, expert, start and end, Chrome version, viewport, locale, timezone
events.jsonl Every event of the session, one JSON object per line, in order
graph.json The session’s graph, built from events.jsonl
blobs/<sha256> Response bodies, snapshots and screenshots, shared across the site’s sessions

The log and the graph

events.jsonl and the blobs are the record. They are append-only, safe across crashes, and the sandbox replays them byte for byte.

graph.json is derived from the log. It is built live while recording and can be rebuilt at any time, so an improved builder re-derives old sessions:

graphdom graph archive/<host>/sessions/*

The graph has typed nodes (action, navigation, state, request, response, value, tab, frame, file, choice, error, annotation) and typed edges between them, such as caused from an action to a request or rendered from a response field to a value on the page.

Every edge carries its evidence. An observed edge comes from something the recorder saw, like a DevTools initiator or a paste event. An inferred edge comes from a heuristic, like a matching value, and carries a confidence. Studio draws the two differently. A rendered edge is one of these: a value in a JSON response that equals a text or a field the next DOM snapshot shows. Studio lists it under the step that sent the request, with the element and the JSON path.

The annotations an engineer adds in Studio are kept in annotations.json beside the log, never in it, so the graph does not have them. Studio links each one to the value it marks the way the builder links the expert’s.

Privacy

A password field’s value is never written. The field is recorded and its value becomes a reference to a secret you supply at run time. Everything else is stored in clear unless you opt in to redaction:

Recorder option Redacts
redact.personal Italian tax codes, IBANs, e-mail addresses and phone numbers, wherever the page shows them
redact.storage Cookie, localStorage, sessionStorage and IndexedDB values. Names and sizes are kept.
redact.otp Fields named like one-time codes, handled as password fields
redact.uploads The contents of picked files. Name, size and type are kept.

These are options of the recorder API. The record and relay commands do not expose them yet.