dánwòdánwò

Core concepts

Flight records

Every run keeps a record of what happened, on the screen and behind it, so you can replay a test without running it again.

A flight record is what danwo keeps of one test run: a video, every step, every call your app made to a provider, every webhook, the database statements, and what each emulator held at the end. You can replay it in the dashboard, read it as a failure page, or hand it to a coding agent.

Where records live

Every danwo test and danwo matrix run writes a folder under .danwo/runs/. Each test, and each matrix trial, gets a folder of its own:

.danwo/runs/20261020-103017-e625/
  report.html
  tests-buy-credits-buys-500-credits-through-stripe-checkout/
    clean/
      record.json
      timeline.jsonl
      screenshots/
      video/
    duplicate-on-webhook-checkout-session-completed/
      …

danwo keeps the latest 50 runs (record.keepRuns) and deletes older ones; see what each run costs on disk.

What a record holds

PartWhat it shows
Stepseach action and check, its time, its replay outcome and model calls
Videothe screen, with every step, call and fault marked on its timeline
Screenshotsthe screen after each step, and at a failure
Provider callsevery request through the proxy, with redacted headers and bodies
Webhooksevery delivery the emulators sent your app, and its answer
Database callsthe statements and commands, when your stores go through a data proxy
Emulator statewhat each emulated service held when the test ended
Consolewhat the page logged, errors first
Integration lintrisky provider usage danwo spotted in the calls

Replay a record

Open the dashboard and click a test:

npx @danwo/cli serve --open

The recording opens with the steps on the left and tabs on the right: Replay, Console, Network, Providers, Emulator state and Effects. In Replay, each step has a Go to button that jumps the video there, and a playhead moves along the provider calls as it plays.

A link to the exact moment works: ?t=12.5 opens the video 12.5 seconds in, and #step-3 where step 3 starts. Copy one into a bug report.

Read it as a failure page

For a failed run, the terminal prints a page per failure:

npx @danwo/cli show --format md

It's the same page the dashboard's Copy prompt to fix copies. Debugging a failure walks through it part by part.

Choose what to keep

By default danwo keeps every run, with video. Change it in the config, or for one run:

OptionValuesDefault
recordalways, on-failure, offalways
videoon, retain-on-failure, offon
npx @danwo/cli test --record on-failure --video retain-on-failure

Secrets are redacted

Records never hold a configured secret. Every value you list under secrets is removed from calls, logs and pages, in every encoding, as are provider keys and tokens. Screenshots mask fields that hold a secret.

Video shows the screen as it was. A field holding a secret shows as dots, but a secret your app prints as text is on screen. For suites that do that, set video: "off".

Next

On this page

Run it on every pull request

A GitHub check and one comment per pull request, with the flight records attached.

Set up CI