Metadata-Version: 2.5
Name: reshoot
Version: 0.3.13
Summary: Agent skills and recording tools for repeatable software demo videos
Project-URL: Homepage, https://github.com/mumit/reshoot
Project-URL: Documentation, https://github.com/mumit/reshoot/tree/main/guide
Project-URL: Changelog, https://github.com/mumit/reshoot/blob/main/CHANGELOG.md
Project-URL: Issues, https://github.com/mumit/reshoot/issues
Author: Mumit Khan
License-Expression: MIT
License-File: LICENSE
Keywords: agent-skills,demo,gif,playwright,readme,screencast,video
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Multimedia :: Video
Classifier: Topic :: Software Development :: Documentation
Requires-Python: >=3.11
Requires-Dist: pillow>=10.1
Requires-Dist: pyobjc-framework-quartz>=10; sys_platform == 'darwin'
Requires-Dist: pyobjc-framework-vision>=10; sys_platform == 'darwin'
Requires-Dist: websockets>=12
Provides-Extra: browser
Requires-Dist: playwright==1.58.0; extra == 'browser'
Provides-Extra: kokoro
Requires-Dist: kokoro==0.9.4; extra == 'kokoro'
Requires-Dist: soundfile<0.14,>=0.13; extra == 'kokoro'
Description-Content-Type: text/markdown

# reshoot

**Demos that stay current.**

Script a task in your app once. reshoot records it as a captioned MP4 and a
README GIF, checks that the result appeared, and keeps the script beside your
code. When the UI changes, run it again.

![The same notes task recorded before and after a UI update, from one reshoot storyboard](https://raw.githubusercontent.com/mumit/reshoot/main/docs/demo/reshoot.gif)

Before and after a UI change, from one storyboard.
[Watch the 21-second social cut](https://github.com/mumit/reshoot/blob/main/docs/demo/reshoot.mp4).

Each run confirms the result appeared, stops on the step whose control no
longer matches, and scans the frames for email addresses, keys and faces.
[Skills](https://github.com/mumit/reshoot/blob/main/skills/README.md) for Claude Code and Codex write the story from your
app, and a GitHub workflow records it again when the app changes.

## Make a demo of your app

Open **Claude Code or Codex** in your app's repository, or in an empty folder
if you only have a running app, and paste:

```text
Make a short demo with reshoot.
Read https://github.com/mumit/reshoot/blob/main/guide/agent-quickstart.md
and follow its setup and creation workflow.

Target: the app in this repository.
Choose one useful task with a clear visible result. Use synthetic demo data.
Produce a short captioned MP4 and a README GIF. Keep the recording source in
demo/ so it can be updated later.

Inspect a preview, then record a fresh final and open both exports for review.
Ask only for permissions or missing details needed to proceed.
```

Change `Target:` to a URL, or a macOS app and its window, if there's no source.
In [trials on new apps](https://github.com/mumit/reshoot/blob/main/docs/validation/2026-10-23-cold-first-demo.md) this took
2 to 5 minutes in Claude Code and 4 to 9 in Codex. Reply "accept" or ask for
changes. reshoot needs no API key: see
[what your agent needs](https://github.com/mumit/reshoot/blob/main/guide/agent-quickstart.md#what-your-agent-needs).

## Or try it on a made-up app

```bash
uv tool install 'reshoot[browser]'
reshoot create        # make the notes demo and open it in the studio
```

It needs [uv](https://docs.astral.sh/uv/), ffmpeg and Chrome or Chromium on
macOS or Linux; see [installation](https://github.com/mumit/reshoot/blob/main/guide/install.md). It records a preview in
about 25 seconds and opens it in [the studio](https://github.com/mumit/reshoot/blob/main/guide/studio.md), a local page
where you change captions, timing, the look and the cut by pointing.
[The tutorial](https://github.com/mumit/reshoot/blob/main/guide/step-by-step.md) walks through it.

To show a task in your own simple web app, start it with demo data and run
`reshoot create http://127.0.0.1:3000/ --directory demo`. See
[show the task](https://github.com/mumit/reshoot/blob/main/guide/your-app.md#show-the-task).

## The story is a file

```toml
[[beat]]
id = "search"
caption = "Find the matching note"
hold = 2.0
[[beat.action]]
type = "type"
target = {css = "#q"}
text = "bike"
[[beat.expect]]
type = "text"
target = {css = "#list li"}
contains = "Pick up the bikes"
```

reshoot types into the real page with a visible cursor, shows the caption, and
holds on the result. When the app renames `#q`, the run stops on that step, and
the studio offers the new control.

## Keep it current

Accept a final once; that writes `demo/accepted/` to commit. After the app
changes:

```bash
reshoot run demo/reshoot.toml
reshoot compare demo/accepted demo/latest --out demo/comparison.json
reshoot accept demo/latest
reshoot export demo/accepted --directory docs/demo --replace
```

Or let [the GitHub workflow](https://github.com/mumit/reshoot/blob/main/guide/ci.md) record the demo when `main` changes
and open a pull request with the new video, GIF and comparison.

## How it differs

Unlike Screen Studio or Loom, you never record the same flow by hand again.
Unlike Playwright video, it adds a cursor, typing, captions, zoom, cuts, a GIF,
result checks and a privacy scan. Unlike Arcade or Supademo, it makes ordinary
MP4 and GIF files locally that CI can refresh. It is
[VHS](https://github.com/charmbracelet/vhs) for web apps and macOS windows, and
uses VHS for terminals.

## What it records

A web app in headless Chrome (the page only, never your desktop), a terminal
with VHS, or one macOS window, with optional voiceover, music and subtitles.
See [platforms](https://github.com/mumit/reshoot/blob/main/guide/README.md#platforms).

## Where next

[The guide](https://github.com/mumit/reshoot/blob/main/guide/README.md) covers [your own web app](https://github.com/mumit/reshoot/blob/main/guide/your-app.md),
[a macOS window](https://github.com/mumit/reshoot/blob/main/guide/macos-window.md), [how the videos look](https://github.com/mumit/reshoot/blob/main/guide/look.md),
[teams](https://github.com/mumit/reshoot/blob/main/guide/publish.md#on-a-team), [CI](https://github.com/mumit/reshoot/blob/main/guide/ci.md), the
[project reference](https://github.com/mumit/reshoot/blob/main/guide/projects.md), [commands](https://github.com/mumit/reshoot/blob/main/guide/commands.md) and
[troubleshooting](https://github.com/mumit/reshoot/blob/main/guide/troubleshooting.md). The
[before-and-after recipe](https://github.com/mumit/reshoot/blob/main/examples/promo/README.md) rebuilds the video above.

## Why reshoot exists

I made the launch video for [photosearch](https://github.com/mumit/photosearch)
this way and pulled the tools into reshoot. The
[original notes recording](https://github.com/mumit/reshoot/blob/main/docs/demo/notes.mp4) and its
[source files](https://github.com/mumit/reshoot/blob/main/examples/notes/) are still here.

[Contributing](https://github.com/mumit/reshoot/blob/main/CONTRIBUTING.md) · [Roadmap](https://github.com/mumit/reshoot/blob/main/ROADMAP.md) · MIT [license](https://github.com/mumit/reshoot/blob/main/LICENSE)
