repo → release video

Release notes nobody reads,
replaced by 36 seconds of data.

Every figure on screen traces to git, the GitHub releases API, or a facts.json your own CI wrote. Nothing is typed by hand.

dogwatch  478fcbb..5143aeb real render
1280×72036s30fps913 KB no audio track
what this render readdogwatch
5

commits, 1 contributor

git log
29

files changed, +383 / −62

git diff
243/246

tests passing

facts.json

no release, no tag

no data
the command
$ galley render --repo dogwatch \
    --from 478fcbb --to 5143aeb \
    --facts facts.json

That fourth cell is the interesting one. dogwatch has no GitHub release and no git tag for this range, so the title card says so on screen rather than guessing a date — the degrade-honestly path, exercised for real.

frames from that file

Four beats, and where each number came from.

Title card reading RELEASE, dogwatch, 5143aeb, with a line stating no GitHub release and no git tag named 5143aeb
00:01 · titleSays “no data” out loud instead of inventing a release date.
Commit flow card reading 5 commits from 1 contributor, James Santos, listing five real commit subjects
00:14 · commit flowFive real subjects, read straight out of git log.
Card reading 243 of 246 tests passed from a CI artifact and 29 files changed from git
00:23 · the real numbersEach figure carries its own source label on screen.
Closing card showing the repository URL, labelled as coming from the git remote
00:31 · get itThe remote URL, taken from the remote.

Same pipeline, a second repo: tiltmeter’s poster (10218a4..db770ef, 423/423 tests, 44 files changed) hits the same “no data” beat — both repos dogfood without tagging releases.

provenance

Three sources. Every one of them labelled on screen.

  1. 01
    git git log · git diff --shortstat

    Commit count, authors, sampled messages, files-changed stats.

    always available no network
  2. 02
    github gh api repos/{owner}/{repo}/releases

    Release title, date, notes. Falls back to git tag metadata, then to an explicit “no data” beat — never to a guess.

    needs network optional
  3. 03
    facts.json galley facts init

    Test counts, coverage, up to two custom facts — written by the target repo’s own CI. Invalid files are rejected outright, never partially rendered.

    schema-checked your CI writes it
What galley cannot know

It reports exactly what git reports: a squash-merge policy, a rewritten history or a shallow clone changes the numbers, and galley has no way to tell. It validates that facts.json matches its schema; it cannot verify that the numbers inside are true.

The full list →

quickstart

Four commands.

# build once
$ npm install && npm run build

# a video from a real release range
$ node dist/cli/index.js render --repo /path/to/repo --from v1.0.0 --to v1.1.0 --out release.mp4

# same data, one still frame
$ node dist/cli/index.js poster --repo /path/to/repo --from v1.0.0 --to v1.1.0 --out release.png

# prints the CI step that generates facts.json from a real test run
$ node dist/cli/index.js facts init

Optional on render and poster: --brand brand.json, --facts facts.json, --reduced-motion (render only — a poster is always the static variant). Full surface in SPEC.md.