HTML report per run

Every successful peepshow extract writes a self-contained report.html + manifest.json next to the frames, plus a one-line append to a global ndjson run history. The report bundles frames grid, transcript, sink fan-out, and LLM analysis into a single file that opens offline. The agent that consumed the frames pipes its synthesis back via peepshow report annotate so the next viewer sees the analysis without re-running the model.

report.html · LLM analysis · close the loop

What ships per run

What the report contains

Flag reference

Closing the loop — LLM analysis

When peepshow runs inside an LLM workflow (Claude Code · Cursor · Windsurf · Cline · Codex · Gemini), the LLM is the consumer that understands the frames. Pipe its analysis back so report.html captures the synthesis for whoever opens it next:

echo '{
  "summary": "<2-4 sentences describing the timeline>",
  "perFrame": [{"idx": 0, "text": "<frame 1 caption>"}],
  "provider": "claude-code",
  "model": "claude-opus-4-7"
}' | peepshow report annotate "<outputDir>"

<outputDir> is the JSON payload's outputDir field. The annotate subcommand merges into manifest.analysis atomically (tmp + rename) and re-renders report.html. Every supported agent has the annotate instruction wired in — see the per-tool rule files in the repo.

Inspect runs

peepshow runs list                  # newest-first table
peepshow runs show <runId>          # dump that run's manifest.json
peepshow runs prune                 # drop entries whose outputDir is gone
peepshow runs clear                 # truncate the index file
peepshow report <run-dir>           # re-render report.html
peepshow report annotate <dir>      # attach LLM analysis (above)

User preferences (peepshow config)

Per-machine prefs live at ~/.peepshow/config.json (override via PEEPSHOW_CONFIG_FILE). First time peepshow runs in a TTY a one-line hint suggests peepshow config init — a quick wizard that sets:

peepshow config init                  # interactive wizard
peepshow config list                  # JSON dump
peepshow config get report.browser    # print one value
peepshow config set report.browser chrome
peepshow config set report.autoOpen true
peepshow config export ~/peepshow-prefs.json   # back up
peepshow config import ~/peepshow-prefs.json   # restore on a new machine
peepshow config reset                 # delete the config file

Env vars override the saved prefs at run time:

What's next — phase 2

peepshow serve will spawn a local HTTP server that indexes ~/.peepshow/runs/index.ndjson for a homepage of every run, serves per-run detail pages reusing the report shell, and exposes a sink-management GUI. The ndjson + manifest format stays the source of truth — phase 2 is a UI on top, not a rewrite.