---
title: The studio
description: >-
  Browse runs, cells, transcripts and diffs in a local web app, and publish it
  as a static site.
---
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reeval.ai/llms.txt
> Use this file to discover all available pages before exploring further.

The studio is a web app over your history: every run, every eval across runs, and every attempt's transcript, diff, checks and judge input.

```bash
npx reeval studio
```

```text
reeval studio · scratch-guide · evals/.history/
  http://127.0.0.1:4984/?token=…
Ctrl-C to stop.
```

Open the printed URL, or pass `--open` to open the browser for you. New runs appear as they're recorded, and unrecorded runs from `.reeval/runs/` show too, labelled scratch (`--no-scratch` hides them). A run that's still going shows at the top.

## Browse runs

<Image src="/assets/studio/runs.png" alt="The studio's runs list, with commit, branch, pass counts, duration and drift badges" width={800} />

The runs list shows each run's commit, branch, author (or CI), pass counts, tokens and duration. A `drift` badge means a cell's fingerprint changed since the last run that had it: its eval, image, agent CLI or environment.

## Watch a run in progress

<Image src="/assets/studio/live-run.png" alt="A run in progress: Running 2/4, a progress bar, two attempts passed and two still running" width={800} />

Start `reeval run` with the studio open and the run appears at the top of the runs list with a `Running 2/4` badge and a progress bar. Its page lists every planned attempt, filling in with each outcome and duration as it finishes. A finished attempt opens its transcript straight away.

When the record lands, the run's own page replaces the live one. A run that was killed, or stopped answering for 15 seconds, shows as `Stopped`, with what it finished and `reeval run --resume <id>` to continue it.

`--resume` still refuses if that process is alive (a sleeping laptop). A static build never shows runs in progress.

## Read a run

<Image src="/assets/studio/run-cells-lift.png" alt="A run page with a cells table showing the control at 0% and the variant at 100%, with its lift" width={800} />

A run's page is its eval tree, with each cell's pass@1, per-key judge rates
(`login 4/5 · checkout 0/5`), role, lift, effort and token usage. Questions
that share a prefix show the distinctive tail
(`…email sign-in 4/5 · …social sign-in 0/5`) so each rate stays matchable.

Per-key lift shows only when both sides have enough counted attempts; tokens
sum those attempts and stay blank when a harness reports none. A run you've
analysed with `reeval analyze` also has an Analysis tab; see
[Analysis](/guide/analysis).

<Image src="/assets/studio/run-questions.png" alt="An eval's cells, then its questions: win rates within a harness and across harnesses, and a question whose model call failed" width={800} />

An eval with [questions](/guide/questions) lists them under its cells: for one asked of each attempt, the tally of its `choices` and every attempt's answer; for a pairwise one, each side's win rate over the decided votes, within a harness and across harnesses. A failed model call shows its error. Evals without questions show nothing new.

## Follow one eval

<Image src="/assets/studio/eval-history.png" alt="One eval across runs, with pass rates and fingerprint change marks" width={800} />

An eval's page lists it across runs, with a mark where its fingerprint changed. The compare page diffs two runs, as `reeval compare` does; [History](/guide/history) shows both.

## Open an attempt

<Tabs>
  <Tab title="Transcript">
    <Image src="/assets/studio/attempt-transcript.png" alt="An attempt's transcript tab, with the prompt, reasoning and folded tool calls" width={800} />
  </Tab>
  <Tab title="Diff">
    <Image src="/assets/studio/attempt-diff.png" alt="An attempt's diff tab, showing the files the agent changed" width={800} />
  </Tab>
  <Tab title="Checks">
    <Image src="/assets/studio/attempt-checks.png" alt="An attempt's checks tab, with each command, its exit code and output" width={800} />
  </Tab>
  <Tab title="Judge">
    <Image src="/assets/studio/attempt-judge.png" alt="An attempt's judge tab, with the question, score and what the judge saw" width={800} />
  </Tab>
</Tabs>

Each attempt has tabs for its transcript (tool calls folded), its diff, each check's command and output, and each judge call with its input. The State tab shows the environment and [egress](/guide/secrets-and-egress). Attempts with local debug data also get a Debug tab, covered in [Debugging a run](/guide/debugging).

When the record points at a log that is not on disk, the empty state says it was recorded but is missing (often a `*.log` gitignore), not that the run never wrote it.

## It works on a phone

<Image src="/assets/studio/mobile-run.png" alt="The studio's run page on a phone-sized screen" width={320} />

## Keep it private

```bash
npx reeval studio --port 5000 --host 127.0.0.1
```

The studio listens on `127.0.0.1:4984` (or the next free port) and needs the session token in the URL it prints, so other local users and web pages can't read your transcripts. `--no-token` turns the check off, with a warning.

## Publish a static build

```bash
npx reeval studio build --out site
```

```text
built site/: 1 run, 12 files, 673 KB (records, transcripts, diffs, logs and judge inputs)
Serve it from any static host. Anyone who can open it can read every included file.
```

`reeval studio build` writes the same app as a static folder, for GitHub Pages, Netlify, Cloudflare Pages or any static host. It includes recorded runs only (`--scratch` adds the rest), and never debug data.

<Warning>
  A build includes transcripts, diffs and logs. Host it where your repo's readers are, or pass `--no-artifacts` to publish only the records.
</Warning>

## Next

<CardGroup cols={2}>
  <Card title="CI" icon="play" href="/guide/ci">
    Run evals on every pull request.
  </Card>
  <Card title="Nightly matrix and Pages" icon="globe" href="/recipes/nightly-pages">
    Publish the studio from a nightly run.
  </Card>
</CardGroup>
