Skip to main content

Showboat

PyPI Changelog Tests License

Create executable demo documents that show and prove an agent's work.

Showboat helps agents build markdown documents that mix commentary, executable code blocks, and captured output. These documents serve as both readable documentation and reproducible proof of work. A verifier can re-execute all code blocks and confirm the outputs still match.

Example

Here's an example Showboat demo document that demonstrates shot-scraper. It was created by Claude Code, as shown by this transcript.

Installation

This Go tool can be installed directly from PyPI using pip or uv.

You can run it without installing it first using uvx:

uvx showboat --help

Or install it like this, then run showboat --help:

uv tool install showboat
# or
pip install showboat

You can also install the Go binary directly:

go install github.com/simonw/showboat@latest

Or run it without installation like this:

go run github.com/simonw/showboat@latest --help

Compiled binaries are available on the releases page. On macOS you may need to follow these extra steps to use those.

Help

showboat - Create executable demo documents that show and prove an agent's work.

Showboat helps agents build markdown documents that mix commentary, executable
code blocks, and captured output. These documents serve as both readable
documentation and reproducible proof of work. A verifier can re-execute all
code blocks and confirm the outputs still match.

Usage:
  showboat init <file> <title>             Create a new demo document
  showboat note <file> [text]              Append commentary (text or stdin)
  showboat exec <file> <lang> [code]       Run code and capture output
  showboat image <file> <path>             Copy image into document
  showboat image <file> '![alt](path)'   Copy image with alt text
  showboat pop <file>                      Remove the most recent entry
  showboat verify <file> [--output <new>]  Re-run and diff all code blocks
  showboat extract <file> [--filename <name>]  Emit commands to recreate file

Global Options:
  --workdir <dir>   Set working directory for code execution (default: current)
  --version         Print version and exit
  --help, -h        Show this help message

Exec output:
  The "exec" command prints the captured shell output to stdout and exits with
  the same exit code as the executed command. This lets agents see what happened
  and react to errors. The output is still appended to the document regardless
  of exit code. Use "pop" to remove a failed entry.

    $ showboat exec demo.md bash "echo hello && exit 1"
    hello
    $ echo $?
    1

Image:
  The "image" command accepts a path to an image file or a markdown image
  reference of the form ![alt text](path). The image is copied into the same
  directory as the document with a generated filename and an image reference is
  appended to the markdown. When a markdown reference is provided the alt text
  is preserved; otherwise it is derived from the generated filename.

Pop:
  The "pop" command removes the most recent entry from a document. For an "exec"
  or "image" entry this removes both the code block and its output. For a "note"
  entry it removes the single commentary block. This is useful when a command
  produces an error that shouldn't remain in the document.

Verify:
  Re-runs every code block (skipping image blocks) and compares actual output
  against the recorded output. Prints diffs and exits with code 1 if any output
  has changed; exits 0 if everything matches. Use --output <file> to write an
  updated copy of the document with the new outputs without modifying the
  original.

Extract:
  Parses a document and prints the sequence of showboat CLI commands (one per
  line) that would recreate it from scratch. Output blocks are omitted since
  they are regenerated by "exec". Use --filename <name> to substitute a
  different filename in the emitted commands.

Stdin:
  Commands accept input from stdin when the text/code argument is omitted.
  For example:
    echo "Hello world" | showboat note demo.md
    cat script.sh | showboat exec demo.md bash

Example:
  # Create a demo
  showboat init demo.md "Setting Up a Python Project"

  # Add commentary
  showboat note demo.md "First, let's create a virtual environment."

  # Run a command and capture output (output is printed to stdout)
  showboat exec demo.md bash "python3 -m venv .venv && echo 'Done'"

  # Run Python and capture output
  showboat exec demo.md python "print('Hello from Python')"

  # Oops, wrong command — remove the last entry from the document
  showboat pop demo.md

  # Redo it correctly
  showboat exec demo.md python3 "print('Hello from Python')"

  # Add a screenshot
  showboat image demo.md screenshot.png

  # Add a screenshot with alt text
  showboat image demo.md '![Homepage screenshot](screenshot.png)'

  # Verify the demo still works
  showboat verify demo.md

  # See what commands built the demo
  showboat extract demo.md

Resulting markdown format:

  # Setting Up a Python Project

  *2026-02-06T15:30:00Z*

  First, let's create a virtual environment.

  ```bash
  python3 -m venv .venv && echo 'Done'
  ```

  ```output
  Done
  ```

  ```python3
  print('Hello from Python')
  ```

  ```output
  Hello from Python
  ```

  ```bash {image}
  screenshot.png
  ```

  ![screenshot](screenshot.png)

  ```bash {image}
  ![Homepage screenshot](screenshot.png)
  ```

  ![Homepage screenshot](screenshot.png)

Example

# Create a demo
showboat init demo.md "Setting Up a Python Project"

# Add commentary
showboat note demo.md "First, let's create a virtual environment."

# Run a command and capture output
showboat exec demo.md bash "python3 -m venv .venv && echo 'Done'"

# Run Python and capture output
showboat exec demo.md python "print('Hello from Python')"

# Add a screenshot
showboat image demo.md screenshot.png

# Add a screenshot with alt text
showboat image demo.md '![Homepage screenshot](screenshot.png)'

This produces a markdown file like:

# Setting Up a Python Project

*2026-02-06T15:30:00Z*

First, let's create a virtual environment.

```bash
python3 -m venv .venv && echo 'Done'
```

```output
Done
```

```python
print('Hello from Python')
```

```output
Hello from Python
```

Verifying

showboat verify re-executes every code block in a document and checks that the outputs still match:

showboat verify demo.md

Extracting

showboat extract emits the sequence of commands that would recreate a document from scratch:

showboat extract demo.md

For the example above this would output:

showboat init demo.md 'Setting Up a Python Project'
showboat note demo.md 'First, let'\''s create a virtual environment.'
showboat exec demo.md bash 'python3 -m venv .venv && echo '\''Done'\'''
showboat exec demo.md python 'print('\''Hello from Python'\'')'

By default the commands reference the original filename. Use --filename to substitute a different filename in the emitted commands:

showboat extract demo.md --filename copy.md

Remote Document Streaming

When the SHOWBOAT_REMOTE_URL environment variable is set, each init, note, exec, image, and pop command will POST its content to the specified URL. This enables real-time streaming of document updates to a remote viewer as the document is built.

Each document created with showboat init receives a UUID that ties all subsequent commands together into a single document stream. The UUID is stored as an HTML comment in the markdown:

<!-- showboat-id: 550e8400-e29b-41d4-a716-446655440000 -->

Configuration

Set the environment variable to your receiver's URL:

export SHOWBOAT_REMOTE_URL=https://www.example.com/showboat

Authentication can be handled by an optional query string argument:

export SHOWBOAT_REMOTE_URL=https://www.example.com/showboat?token=secret-token-here

Remote POST errors are printed as warnings to stderr but never fail the main command. If the URL is unset or empty, no POSTs are made.

POST Body Format

All POSTs use application/x-www-form-urlencoded except image, which uses multipart/form-data. Every POST includes uuid and command fields.

Command Content-Type Form Fields
init application/x-www-form-urlencoded uuid, command=init, title
note application/x-www-form-urlencoded uuid, command=note, markdown
exec application/x-www-form-urlencoded uuid, command=exec, language, input, output
image multipart/form-data uuid, command=image, input, alt, image (file upload)
pop application/x-www-form-urlencoded uuid, command=pop

For exec, language is the interpreter name (e.g. bash, python3), input is the source code, and output is the captured stdout/stderr. For image, the image field is the copied image file. For note, markdown contains the rendered markdown of the commentary block.

Building the Python wheels

The Python wheel versions are built using go-to-wheel:

uvx go-to-wheel . \
  --readme README.md \
  --description "Create executable documents that demonstrate an agent's work" \
  --author 'Simon Willison' \
  --license Apache-2.0 \
  --url https://github.com/simonw/showboat \
  --set-version-var main.version \
  --version 0.1.0

Metadata

Release files for showboat 0.6.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for showboat 0.6.1
File
showboat-0.6.1-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details
showboat-0.6.1-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
showboat-0.6.1-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
showboat-0.6.1-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details
showboat-0.6.1-py3-none-manylinux_2_17_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
showboat-0.6.1-py3-none-manylinux_2_17_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
showboat-0.6.1-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
showboat-0.6.1-py3-none-macosx_10_9_x86_64.whl Python 3 none macOS 10.9+ x86-64 Details

Total release size: 45.5 MB

Release files / showboat-0.6.1-py3-none-win_arm64.whl

Download URL showboat-0.6.1-py3-none-win_arm64.whl
Size 5.5 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
c643e5a4966a3e407c75261bc9e317022263f18680badf451771ccc10eb4db5c
BLAKE2b-256 checksum
How to use checksums
4f8b136481f82b9d16e5bb1377e1053d7e379b2c3910532cf6b66e9b882c8f6c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

Release files / showboat-0.6.1-py3-none-win_amd64.whl

Download URL showboat-0.6.1-py3-none-win_amd64.whl
Size 6.0 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
44b35a3ad6378e29789c122b2294fea63261275f438257b82cd3f85d6a176099
BLAKE2b-256 checksum
How to use checksums
5ea1d9adbb673a7967533086a9be38932c86eeb0cde9b4b3921974be83577643
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

Release files / showboat-0.6.1-py3-none-musllinux_1_2_x86_64.whl

Download URL showboat-0.6.1-py3-none-musllinux_1_2_x86_64.whl
Size 5.8 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
65fa7b9dee058567f2b599eead526a8d88a9ba07f9f7f06280679c1411dc5ff5
BLAKE2b-256 checksum
How to use checksums
d8a79bca0d1d9391db4174f72e09ffd4502e2c551067c5762264e45668531d6f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

Release files / showboat-0.6.1-py3-none-musllinux_1_2_aarch64.whl

Download URL showboat-0.6.1-py3-none-musllinux_1_2_aarch64.whl
Size 5.5 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
c9e1ca20c715d488cdb8ac91f30d3afce2dcf5ee29a9b84f926a2d7b318b13f1
BLAKE2b-256 checksum
How to use checksums
03833f84668ef5815823bdfe0f64efbe88dee3cd66b30c63964aecb1f4d1084e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

Release files / showboat-0.6.1-py3-none-manylinux_2_17_x86_64.whl

Download URL showboat-0.6.1-py3-none-manylinux_2_17_x86_64.whl
Size 5.8 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
fcd5a51ec15487fb844e3e9288f0a0875ab76910976a51fc1f32941377abed2c
BLAKE2b-256 checksum
How to use checksums
2dec956248aadd22ecc871cb7179d6afaf0712bbf4cbd2116eacb0d822260605
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

Release files / showboat-0.6.1-py3-none-manylinux_2_17_aarch64.whl

Download URL showboat-0.6.1-py3-none-manylinux_2_17_aarch64.whl
Size 5.5 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
591f5297b69db5aa7f1bd9f426bc510506706e2792e85e2f2ce548e1b79bedd5
BLAKE2b-256 checksum
How to use checksums
b0c87c4d4bacedc12e5381249df3da92868d459439a1f6534e912d57d80599e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

Release files / showboat-0.6.1-py3-none-macosx_11_0_arm64.whl

Download URL showboat-0.6.1-py3-none-macosx_11_0_arm64.whl
Size 5.5 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
126c33187d9769453fad5f01a317c82405d1411a15767a19f8c5cc87741c0b46
BLAKE2b-256 checksum
How to use checksums
00c95c22e5d3a12962f7caf7e7b49a9060f700857d8dc339851853bd5bd42aa8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

Release files / showboat-0.6.1-py3-none-macosx_10_9_x86_64.whl

Download URL showboat-0.6.1-py3-none-macosx_10_9_x86_64.whl
Size 5.9 MB
Tags Python 3 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
9f702de4ac839c6b57d7e420e6a347bbeb5aa54f62bfb45e5286f4e71a2e4903
BLAKE2b-256 checksum
How to use checksums
418c5220bc5ddeb4692094024318740e9ae9fac5d78dfd502d046d4294d40104
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

Security for showboat 0.6.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 8 files in this release have been uploaded with provenance metadata.

Select from 8 files

Attestation for showboat-0.6.1-py3-none-win_arm64.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page