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.
commits, 1 contributor
git logfiles changed, +383 / −62
git difftests passing
facts.jsonno release, no tag
no data$ 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.
Four beats, and where each number came from.
git log.
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.
Three sources. Every one of them labelled on screen.
-
01
git
git log · git diff --shortstatCommit count, authors, sampled messages, files-changed stats.
-
02
github
gh api repos/{owner}/{repo}/releasesRelease title, date, notes. Falls back to git tag metadata, then to an explicit “no data” beat — never to a guess.
-
03
facts.json
galley facts initTest counts, coverage, up to two custom facts — written by the target repo’s own CI. Invalid files are rejected outright, never partially rendered.
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.
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.