Repository navigation
Releases: FavioVazquez/showtime
Release list
showtime 0.4.2
showtime 0.4.2: chapter mode for long films, two render failures under load fixed, more browsers without a GPU, sound that stays in sync when you cut a render, your own local voice engines, and help pages for when something goes wrong. Every change, with its reasons and limits, is in CHANGELOG.md under 0.4.2; the README has a short "New in 0.4.2" and What's new one sentence for each.
Render
- Chapter mode.
render --chaptersplans the pieces from your chapters (or the film's acts),--chapter N --job Jrenders one, and--join --job Jjoins them with one soundtrack for the whole video and checks every seam before the file is named final. On one machine a whole render is faster: chapters are for a later fix of one chapter (after a whole render or a join), a long film, or a second machine (not measured) (#22). - Capture lanes keep the video's size under load. Under heavy load a lane could take its screenshots at the browser window's size and the frames were scaled without a word. The renderer now sets the page size again once the page is ready and checks every screenshot's size, retaking a wrong one. With 3 workers on a 6-core Intel Mac with a GPU under load, 7 of 40 renders had a wrong-sized lane before the fix and 0 of 30 after (#49).
- A frame that never comes no longer stalls a render. It is drawn again in a new browser (render) or ends the check with an error naming its step, when the browser reports its processes' work; otherwise the 10-minute cap stays (#24). A WebGL canvas that loses its context on the GPU renders again without the GPU (
--gpu off) instead of shipping white. - More browsers without a GPU.
--workers autouses CPU threads - 2 from 8 threads up (at most 8, within the frame, memory andSHOWTIME_MAX_WORKERSlimits): 6 browsers instead of 3 on an 8-thread machine; with a GPU nothing changes (#41).
Footage and voice
edit renderkeeps the sound in sync with the picture on showtime's own renders; a range could come out up to 21 ms early (#38).- On Windows, several
audio mixruns writing into one folder at once no longer fail with "permission denied". voice script --fit S --estimatesays up front whether the narration can fit, before it synthesizes a line (#28, #45).- Extra local voice engines load by name from
~/.showtime/engines/, anddoctorno longer fails on Kokoro when you chose another engine (#8; proposed and designed by @heavygee, who also wrote a matching PR, #36).
Help
- A first-video guide, troubleshooting by symptom and a glossary;
showtime doctorends with a link to the troubleshooting page when a check fails, and the site's docs start on "Start here".
Issues closed: #8, #13, #14, #21, #22, #23, #24, #26, #27, #28, #29, #30, #31, #32, #33, #34, #35, #38, #39, #40, #41, #42, #43, #44, #45, #46, #47, #48, #49.
Still open: #12 (nightly test_cut_frames on the Intel Mac runner). 0.4.2 ships the fix (a lost WebGL canvas renders again without the GPU); it closes once the nightly passes on the released code.
Testing
- Full suite (every test file) on the release commit: green on Linux x64, Windows, macOS on Apple Silicon and macOS on Intel.
- CI on the release PR: fast suite on Linux, Windows and macOS; end-to-end (install, setup, render, qa, captions, MCP) on Linux ARM, Windows x64, Windows ARM and macOS;
check_release0 errors, 0 warnings; version 0.4.2 in every manifest.
Install or update: in Claude Code, /plugin marketplace add FavioVazquez/showtime then /plugin install showtime@showtime; the README covers other agents. The attached showtime-0.4.2.mcpb is the MCP bundle for desktop clients.
showtime 0.4.1
showtime 0.4.1: faster renders without a GPU, designed cards over a talking head, Claude Design exports to MP4, a long recording to its best clips, seven looks and shutter blur in showtime's own WebGL, a mixer that sounds right on a phone, and a voice-over that is heard back before it ships. Every change, with its reasons and limits, is in CHANGELOG.md under 0.4.1; the README has a short "New in 0.4.1".
Faster, on any machine
- A 30 s launch film went from 42.0 s to 17.6 s (2.4x) on a 64-core Linux machine with no GPU; a 15 s DOM page from 31.8 s to 16.4 s. The encoder runs during the capture, the worker count follows the cores, a finished worker takes over the largest part left, and an unchanged soundtrack is reused.
- Waits scale with the page's measured pace, so heavy pages on a busy machine no longer time out. Every page showtime opens has a deadline and one retry in a new browser, and
checkexits with the step it was stuck at instead of hanging.
New ways to make a video
- Talking-head cards (
cardsin an EDL): titles, lower thirds, quotes, data callouts, lists and side panels timed to the words, captions kept off the face. - A word behind the speaker:
showtime footage cutoutcuts a person out on the CPU (MODNet), and thebehindcard puts a word between the background and the speaker. - A long recording to its best clips:
showtime edit momentsranks whole-sentence moments;showtime edit clipsmakes finished vertical clips. - Claude Design to MP4:
showtime adopt <export.zip>turns a Claude Design HTML export into a finished video, fonts and loop included. - Seven looks in showtime's own WebGL (fluted glass, tilt-shift, liquid metal, mesh gradient, god rays, marble, metaballs) and shutter blur on chosen elements, no GPU needed;
checkprints each look's cost.
Sound and voice you can trust
qahears the mix as a phone speaker does (speaker_loudness), and the mixer is speaker-safe by default.- The voice-over is heard back by the local recognizer: a name, acronym or number said wrong is flagged before it ships; a second recognizer confirms before a FAIL, and a listener can clear a word.
Working with people
- Notes name the elements they point at and can cover a stretch of time;
showtime status <job>says what changed while the agent was away. - HTML exports pack every file they need, carry link previews, and play on servers without Range requests.
Clean installs, docs and examples
- Fixes from fresh macOS, Windows and Ubuntu machines (uv and Node checked first, the Visual C++ runtime named, old ffmpeg refused, a failed loudness read never recorded as 0 LUFS).
- Docs for people: an FAQ, What's new and ten task guides. New examples 23-32, and the 0.4.1 showreel is the site's hero.
- GitHub as the public tracker: issue forms, a code of conduct, and a nightly that reports its own failures.
Issues closed: #15, #16, #17, #18, #19, #20.
Moved to 0.4.2: #12, #13, #14 (nightly runner timeouts on macOS Intel and Windows) and #24 (a render or check can stall under load; seen on the macOS CI runner).
Reviews
Four independent review rounds on the integrated work (correctness, security, docs truth, outputs), each fixed before merge, plus a focused review of the late macOS-runner changes. Clean-machine tests on fresh macOS, Windows and Ubuntu machines.
Testing
- Full suite: 82/82 test files pass on Linux x64 (32 at a time), three times on the final changes.
- CI on the release PR (#11): all checks pass, including the four-platform e2e (macOS arm64, Windows x64 and arm64, Ubuntu arm64). The macOS runner stalled intermittently during the release; re-running the same commit passed, and the cause is tracked in #24.
check_release: 0 errors, 0 warnings; version 0.4.1 in every manifest.
Install or update: in Claude Code, /plugin marketplace add FavioVazquez/showtime then /plugin install showtime@showtime; the README covers other agents. The attached showtime-0.4.1.mcpb is the MCP bundle for desktop clients, and showtime-0.4.1-showreel.mp4 is the 0.4.1 showreel (music: "Supernova" by Scott Buckley, CC BY 4.0).
showtime 0.4.0
showtime 0.4.0: videos that ask, notes on the finished video, a stricter quality gate, and a showreel mode that won its blind rematch. Every change, with its reasons and limits, is in CHANGELOG.md under 0.4.0; the README has a short "New in 0.4.0".
Videos that ask, and notes on the finished video
- Videos that stop and ask. showtime.json
"questions": the HTML export pauses on the question's frame, asks, marks the answer, replies and plays on. The MP4 gets a "pause and think" beat (thequestion-beatcomponent,F.questionBeaton canvas). A question can sit on a narration line, so a re-voice moves it with the line.checknames question problems. - Notes on the finished video.
showtime review open <job>serves a local page over the latest render: pause, click a spot or drag a box, type. The agent reads them withshowtime review notes, fixes, and replies on the same note. - Range links in the HTML player:
video.html#t=10-20plays that part on a loop.
New ways in
showtime pr-video <N | URL>: a pull request becomes a short video for its own description, with a copy under GitHub's 10 MB limit. A public PR works without a GitHub login. Values that look like secrets are masked before anything is written.showtime new <template> <dir> --from-storyboard FILE: a storyboard table from another skill becomes a project.- The showreel tone for "showreel" or "go all out" briefs: 12-14 shots per 15 s, no technique twice, flash words, the name landing late and short.
qajudges density, the ending and repeats. Theshowreeltemplate renders at 16:9, 9:16, 1:1 and 4:5.
A stricter quality gate
- The critic watches as a first-time viewer before it reads the brief. Explainers default to a cold open, a roadmap, bridges and a close that answers the opening.
- Critic findings gate delivery. A Blocker or Should-fix must be fixed or waived with a reason (
showtime review-respond).job note --stage deliveralso refuses when the delivered final's latest qa is a FAIL.deliver exportsanddeliver posterwrite their files but record the delivery only through the same gate. - A hearing pass next to the visual critic. One delivery card with a mandatory
Look:line.
Better-looking by default
- Twelve look signatures for the page templates, picked away from your recent videos.
- Every
<video>is drawn on a canvas in renders: no blank or late first frames after a cut.
Also in this release
- MCP tool schemas checked against the command line, and one dated price table.
- Messages are read before building, and renders clean up after themselves.
Proof
- A behaviour scoreboard anyone can rerun (
claude plugin eval, 14 cases × 3 runs per arm): 35/42 with showtime, 25/42 without (SCOREBOARD.md). - A blind rematch on the round-1 showreel prompt (rounds 5 and 6). 0.4.0 lost round 5. After the density fix, its two takes ranked first and second in round 6, ahead of the plain take that won round 1. There was one voter and the vote was only partly blind.
Fixed before release (found by making the 0.4.0 release video with showtime itself):
- A long single-word choice spilled out of its box in the question beat. The revealed answer's key letter missed contrast on light themes. Labels were too small upright.
- In a pairwise round, the losing version's findings still held the review through the old caption rule.
retime --from-voicedropped the first line's lead-in.job note --stage deliverpassed on a qa FAIL.pr-videorun inside a job folder logged its render into that job.
Testing
- Full suite: 64/64 test files pass on Linux x64 (16 at a time).
check_release: 0 errors.- The showreel template passes
checkwith no warnings at 16:9, 9:16, 1:1 and 4:5. - CI: fast tiers on macOS, Linux and Windows and end-to-end runs on macOS 14, Linux Arm, Windows Server 2025 and Windows 11 on Arm, all green.
The release video (2:00) is attached: showtime-0.4.0-release-video.mp4, made with showtime 0.4.0.
showtime 0.3.5
Fixes found by running showtime in a locked-down agent sandbox (no writable HOME, no local listen(), egress only
through an HTTP proxy, .env files unreadable), plus a Windows race the push CI caught.
- onnxruntime's telemetry was on, while PRIVACY.md says showtime has none. The onnxruntime that Kokoro,
alignment, stem separation, rembg and faster-whisper load on Linux (1.30) carries Microsoft's telemetry client and
starts it at import; where HOME is read-only it logged "Failed to persist telemetry device ID" and wrote a
:memory:.sessession file into the current folder. Every showtime process and its children now get
ORT_DISABLE_TELEMETRY=1(set bystitself and by the launcher, unless already set), and
onnxruntime.disable_telemetry_events()is called before each model loads. PRIVACY.md says which libraries'
telemetry showtime turns off and how. - Site capture turned its private-address guard off for a site whose name did not resolve. 0.3.3 made
hostIsPrivatefail closed, butsite capturestill used it to decide whether a page's assets may come from
private addresses, so a public site that does not resolve locally (the normal case on a proxy-only network) let
them. Only afile:page or a page on a known private host allows that now (privateAssetsAllowedincapture.mjs). - Node downloads ignored HTTPS_PROXY. Node's
fetchandhttp(s).requestuse the proxy variables only with
NODE_USE_ENV_PROXY=1, so on a proxy-only network the Python side downloaded and the Node side (icon fetches, site
capture's assets) did not. When a proxy variable is set, the launcher gives Node childrenNODE_USE_ENV_PROXY=1and
addslocalhost,127.0.0.1,::1toNO_PROXY/no_proxy(keeping your entries), so the preview and studio servers'
local requests stay local. Node reads the flag from 22.21 (24.5 forhttp.request);showtime doctorwarns when a
proxy is set and Node is older. - Voice could not start when both the showtime home and
$TMPDIRhad long paths, and setup still said it was
done. espeak-ng cannot read a data folder whose path is over about 140 bytes, so showtime copies its data to a
short folder first; in sandboxes where the home and$TMPDIRare both long (seen at 175-185 bytes) there was none.
The copy now falls back to/tmp/showtime-espeak-<uid>on macOS and Linux (0700, used only when it is the current
user's own); when even that fails, the hint names the path length and the fix.showtime setupnow runs doctor's
espeak-ng self-test, so it fails instead of reporting success with voice broken. retime --from-voiceleft catalog music at full level under the voice. Placing the voice ducks music that
has no duck, but onlyfile,libandcomposetracks; acatalogtrack (whataudio cut-planwrites) was
skipped. Catalog music now ducks too.voice ipa's "no lexicon.json" hint read as a flagvoice scriptdoes not have. It now says that--project
isvoice ipa's flag and thatvoice scriptreads thelexicon.jsonnext to its script, plus any--lexicon FILE.- Setup and doctor said "
showtimeis not on PATH yet" when it was. A skill's ownbin/showtimeon PATH (a
plugin's or a checkout's) now counts, not only the~/.showtime/bincommand. brand capturetook the wrong lines from a README that starts with HTML. On showtime's own README (no H1) the
title was a shell comment in a code block and the tagline a bare video URL. The title is now the first H1 outside
code (markdown, setext or a multi-line HTML<h1>) and the tagline its lead paragraph, skipping URL-only lines,
images, badges, comments and captions; prompts to type are no longer listed as install commands, and brand.md for an
adopted kit never printsNone.checkreported caption words at their karaoke state. A caption word sampled while its card faded in, or
dimmed before it was spoken, was measured at that opacity (#e9b949 on #17120e came out at 2.98:1 instead of
10.18:1). Caption words are judged at the caption's own opacity, and any text measured at partial opacity is named
with it (#e9b949 at 45% opacity (shows as #765d29) on #17120e). Real low contrast still fails.- An adopted Python render could open on black frames, or show each frame late, on a busy machine. Chrome
puts a paused<video>'s seeked frame on screen through the video's own compositor submission and skips it while
the previous one is still unacknowledged; the frame then goes out only at the next seek, so the capture showed the
frame before (black for the first two frames on the Intel Mac runner).seekedandrequestVideoFrameCallbackboth
fire before that submission, so 0.3.4's wait could not see it. In renders the stage now draws a video's frame on a
<canvas data-st-video="ID">and hides the video (a canvas is captured with the rest of the page), andshowtime adoptwrites its frames page that way (re-adopt, or--refresh, to update an existing one).test_adoptchecks
that every frame of the Python render shows its own time. - A finished background run on Windows could show as "lost", with no id or command. Windows refuses to open a
file another process is replacing, sostatusand the run's supervisor could collide onrun.json; the
supervisor's failed read then rewrote the file with only its new fields. Reads and replaces now retry for up to 2 s,
and a failed read never rewrites the file. - Code-scanning hardening (CodeQL). Found by GitHub's code scanning on a fork of 0.3.4; none was a reported
exploit, all are fixed rather than suppressed. The site's player and previews take only http(s) media and script
URLs fromdata-*attributes (andfile:when the site itself is opened from disk),data-rootmust be a relative
path, and search-result links are escaped. The standalone player detects a doctype with a loop instead of a regex
that backtracked on many--><!--, and escapes attribute values and the stage URL it writes; the studio clamps a
dial's default to a number from 0 to 100; the icon cache builds its CDN URL only from a valid package name and a
pinned version;adoptescapes backslashes in the names it puts into regexes, matches</script >end tags, and
strips--!>from a file name written into an HTML comment. The brand-block pattern matches exactly the<link>
line showtime writes; the Wikimedia rate-limit hint compares the parsed hostname; the caption emoji class and the
motion --whereparser are written without patterns the scanner misreads (same results, checked over every code
point and a set of filters); theciworkflow runs with read-only repository permissions. - MusicGen loads only safetensors, and outside Intel Macs needs torch 2.13+. The optional MusicGen extra now
passesuse_safetensors=True, so it nevertorch.loads a pickle (the pinned model revision ships
model.safetensors). Intel Macs keep torch 2.2.2, the last x86_64 macOS build, whose known flaws are in
torch.loadand in functions MusicGen does not call with outside input; everywhere else the floor is 2.13, the
first release with every published PyTorch security fix. - Tests in a sandbox that refuses
listen()skip instead of failing.tests/_listen.py(LISTEN_BLOCKED,
needs_listen,skip_if_listen_refused(),SHOWTIME_TEST_NO_LISTEN=1to simulate) is used by every test that
serves something; the keelson fixture tests skip when.envfiles are unreadable; test_delight runs alone under-j
(pty devices).
Checked: the full test tier on macOS (Apple Silicon and Intel), Windows and Ubuntu, the end-to-end install-and-render test on four platforms, and CodeQL code scanning (now on for this repository, with Dependabot alerts).
Install or update: /plugin marketplace update showtime in Claude Code, npx -y @faviovazquez/showtime-mcp@0.3.5 for the MCP server, or the attached showtime-0.3.5.mcpb for Claude Desktop.
showtime 0.3.4
- Frame 0 of a page with CSS animations could show where the animation had got to in real time.
The stage paused CSS animations and Web Animations at the first seek, but by then they had been running
since page load, and transform/opacity animations run on the compositor: pausing them there left the
last real-time value on screen until the property changed again, so the first capture had an element a
few pixels along (the css-clock fixture's dot was 12 px out at t=0 on about half the runs, which the
nightly reported asframes differ when reached in another order or after a pause (0s)), and layers
that had been animated on the compositor rasterised differently depending on the frames seeked before
(the Windowsraster noiseverdict). In render modestage.jsnow holds every animation from the
start (animation-play-state: pausedin an adopted style sheet, andElement.animate()returns a
paused animation), so nothing runs before the first seek and a frame depends only on t;
data-st-freeelements are left alone as before. - A seeked
<video>could be captured before its new frame was on screen.seekOnewaited for
seekedand one frame, but the frame reaches the compositor afterseeked, so a slow machine captured
the previous frame: a black frame 0 in an adopted Python render (qafirst_frame_blackon macOS) and
"frames depend on seek order" incheckfor a captured video on Windows. The seek now also waits for
the frame to be presented (requestVideoFrameCallback), or 500 ms afterseekedif it never comes.
Includes everything in 0.3.3 (security fixes and the audio mirror); 0.3.3 was not published to npm or the MCP Registry, so this is the next version there after 0.3.2.
Checked: the full test tier of the affected tests on macOS (Apple Silicon and Intel), Windows and Ubuntu, and the end-to-end install-and-render test on four platforms.
Install or update: /plugin marketplace update showtime in Claude Code, npx -y @faviovazquez/showtime-mcp@0.3.4 for the MCP server, or the attached showtime-0.3.4.mcpb for Claude Desktop.
showtime 0.3.3
Behaviour changes to know about (all deliberate, all security or correctness):
-
A symlink inside a project that points outside it is no longer served by the preview or capture servers
(403, with a message saying to copy the file into the project). showtime never creates such links itself. -
Page capture refuses a host whose name does not resolve, unless an HTTP(S) proxy is configured for it.
-
job note --output: a hand-setfinal=/preview=that is not a video, or an unknownKIND=, is now an
error (usereport=for HTML and PDF deliverables). -
An audio mirror for sandboxes. 0.3.2's model mirror covered models; the hosts real music and sound
effects come from (opengameart.org, scottbuckley.com.au, incompetech.com, archive.org,
upload.wikimedia.org, bigsoundbank.com, kenney.nl) are blocked by the same sandbox proxies, so a video's
soundtrack and sound effects silently went missing instead. The music catalog'sfetch, the audio
library'sdownload(also used by sound-effect packs) now try the primary host, then a
SHOWTIME_AUDIO_MIRROR folder or URL, then the mirror bases inlib/st/mirror.json's newaudioblock
(release assets under theaudio-v1tag of this repository) when the primary refuses; after one refusal
a host's later files go straight to the mirror. Every copy is sha256-verified against the same pin as
the primary, and a mismatch is never kept. The primary hosts' politeness rules (OpenGameArt's 10 s,
Scott Buckley's no-bulk) still apply; a GitHub mirror needs no delay.SHOWTIME_AUDIO_MIRRORhas the
same semantics asSHOWTIME_MODEL_MIRROR(a base URL, a local folder checked before any network,
comma-separated, oroff), and when every source fails the error names the blocked hosts and the mirror
file to provide.scripts/stage_audio_mirror.pydownloads every pinned music track, sound-effect pack
and library file from its primary (Scott Buckley's tracks included, with his permission, staged in bulk
only by this script), verifies size and sha256, writes LICENSES.txt and SHA256SUMS, and prints the
gh release create/gh release uploadcommands; it uploads nothing.showtime doctorreports a
blocked network with a reachable audio mirror as a warning, not a failure. docs/agents.md's Claude app
section and the music guide cover it.
--pinfirst pins the 218 extended-tier library sources that had no size or sha256 yet (the
library's own maintainer pin), so they can be mirrored and verified too. -
A symlink inside a served project could point anywhere on disk.
server.mjs'ssafeJoin/
sendFileandcapture.mjs'sstaticJoin/serveStaticchecked requested paths only as text, so a
symlink inside the served folder (evil -> /etc/passwd) was servable, and a name either server picks
for itself afterwards (a directory'sindex.html, a pretty-URL.html, the SPA fallback,404.html)
was never re-checked at all. Both now resolve the real path and refuse (403) anything outside the
served root, via a sharedrealpathUnderRoothelper in the newscripts/lib/pathguard.mjs. -
The SSRF guard treated "DNS did not resolve" as "safe to fetch."
capture.mjs'shostIsPrivate
returnedfalse(not private) when a lookup failed for any reason, so an unresolvable host passed
the guard instead of being refused.hostPrivacynow distinguishes'private' | 'public' | 'unknown',
andhostIsPrivate/safeDownloadfail closed on'unknown'(reasonunresolved-host) unless a
proxy is configured for that URL (proxyConfiguredFor, honouringHTTP(S)_PROXY/NO_PROXY) --
behind an explicit proxy with no local resolver, a failed lookup says nothing about reachability. -
footage stabilize's deshake fallback used a radius ffmpeg often rejects. ffmpeg'sdeshake
filter requires its search radius to be a multiple of 16; the strength-to-radius formula rounded to
arbitrary integers (17, 33, 49, ...) that fail the whole encode, andrender_edl.py's own fallback
hard-codedrx=24:ry=24, which is not a multiple of 16 either. Both now go through a shared
stabilize.deshake_filter()that snaps the radius to 16, 32 or 48. -
job/ledger.pyhad no "report" output kind. An HTML or PDF deliverable saved with
job note --outputhad nowhere to go: it was either ignored or, worse, could be set as the job's
final/previewby name, whichqa/review-pack/deliverthen fail on as an unreadable video.
Output kinds gain"report"(.html/.htm/.pdf), inferred from the file name or set with
report=path; a hand-setfinal=/preview=that is not a video is now refused with a hint to use
report=instead (a tool's own output,--auto, is logged as a variant rather than refused). An
unknownKIND=(e.g. a typo) is now a clear error instead of being recorded as a literal file name.
Audio mirror release: https://github.com/FavioVazquez/showtime/releases/tag/audio-v1
Install or update: /plugin marketplace update showtime in Claude Code, npx -y @faviovazquez/showtime-mcp@0.3.3 for the MCP server, or the attached showtime-0.3.3.mcpb for Claude Desktop.
showtime 0.3.2
Quality and variety: new videos stop sounding the same, the critic stops passing cheap-looking work, and voices work in sandboxed apps.
- Music that varies. Recently used tracks and composers rank lower, no composer takes over a result list, and
showtime history checkwarns on a repeat. Every film project now gets its own score (key, tempo, progression, motif, instruments) from curated mood tables; before, film-template videos all played the same one. 48 new tracks from 13 artists (297 in all), every licence checked and every file measured. - A model mirror for sandboxes. When Hugging Face or GitHub LFS is blocked (as in the Claude app), setup and first-use downloads come from sha256-verified release assets (
models-v1);SHOWTIME_MODEL_MIRRORadds your own. docs/agents.md has a Claude app section. - The quality floor. The critic answers "would I post this?" (the bar: a stranger would not call it cheap, broken or wrong), and a "no" holds delivery in quality mode; caption should-fixes stay open until fixed or explained; qa warns on player controls in footage, soft footage, stepped caption boxes and big empty borders.
- Devin. The receipt reads Devin's usage (models, tokens, estimated cost, Fusion shares); it flags a lead reviewing its own sidekick as not an independent critic.
- Fixes. No bulk downloads from creators who ask for none (Scott Buckley's tracks always come one at a time); stills and posters match the video's brightness;
review-packworks on silent videos; qa scopes footage edits to their own length;export htmlkeeps per-frame images; chartyMin.
Tested: the fast suite on Linux (53/53 files), a fresh-home setup behind a proxy that blocks Hugging Face, and 8 + 6 real Devin runs. Full notes: CHANGELOG.md.
showtime 0.3.1
A patch for three things found while testing 0.3.0 in the Claude app and in one plugin directory.
- The plugin's end-of-turn hook no longer fails before setup. Installing the plugin and working a few turns before
showtime setupmade the Stop hook (showtime receipt --hook, which keeps a job's token and cost receipt current)
print "needs the showtime environment" and fail at the end of every turn. Before setup there is no job to refresh, so
the hook now exits quietly: from the launcher when the environment is missing, and frombin/showtimewhen there
is no Python yet. A real command run before setup still says what to install. - Setup is the user's call. In a test in the Claude app, the agent judged the one-time setup too big for a
five-second clip and made the video with bare ffmpeg instead. SKILL.md andreferences/onboarding.mdnow say it
plainly: give the size and time and run setup; if the user declines, say what cannot be made without it; never make
the video another way. - SKILL.md's description is one line (it was a folded YAML block, which one directory's importer read as ">").
Update: in Claude Code, /plugin marketplace update showtime; in the Claude app, Customize → Plugins → showtime. Full notes for 0.3.0: v0.3.0.
showtime 0.3.0
showtime 0.3.0 reviews every video before you see it, makes videos less alike, and checks what viewers complain about
most: text that moves too fast, is too small on a phone, or a look every agent video seems to share. It also adds
explainers for repos and papers, a release-video command with a GitHub Action, and a receipt for every job that says what
the video took. Same idea as before: your coding agent directs, your machine renders, nothing is uploaded.
In my blind vote in benchmark round 4, 0.3.0 in lean mode was preferred to 0.2.0 on 4 of 6 tasks and to plain Claude
Code on 7 of 8, and its launch video beat a tool built only for launch videos for the first time in four rounds. The
full review, now the default, came after that round and was not part of it. One author, one run per task: anecdotes, not
a result (report).
A full review by default, lean when you ask
- Quality mode is the default. Every finished video gets looks, qa and a critic round (a reviewer that did not build
it) before delivery.qaanddeliverwarn "review pending" until the critic round has run. - Lean mode is one word away. Say "lean", run
showtime config mode lean, pass--mode lean, or set it through MCP,
for a lighter pass without the critic round. The mode is recorded in the job and in its receipt. showtime lookmakes one 1280 px composite of the key frames and a brief for a disposable reviewer that answers
in text with timestamps. Your agent no longer has to open a stack of full-size images.- Short command output. Without a terminal (agents, pipes, MCP),
check,qa,doctorandrenderprint the
verdict, the findings with their fixes and the paths; the full report is in a file.--verboseprints everything. showtime guide <topic> [section]prints a reference's rules or one section instead of the whole file. Every
reference now opens with an Essentials block.- Check before render.
renderwarns when the project changed since the lastcheck, and after a second full
render it names--from S --to S, which renders only that span and splices it into the full video. showtime job initchecks setup and printssetup: readyor the failures with their fixes.
Better videos
- Variety guard. Each finished job's look (template, theme, palette, type pair, transitions, camera moves, music,
structure, tone) is kept in a history on your machine.showtime checkwarnslook_repeatwhen a project repeats one
of the last five and offers two alternatives.showtime history offturns it off; nothing is uploaded. - Style references.
showtime reference <video>measures a video's cut rhythm, shot lengths, palette, camera moves,
rough type scale and loudness, and writes a brief. The storyboard borrows the grammar, never the words, logos or
shots; the credit is written for you, andshowtime qafails a render that copies the reference's pictures. - Phone check.
showtime checkends withphone check: PASSorFAILwith timestamps: text held long enough to
read (per language), a minimum type size at phone width (16:9 5 pt, 1:1 10, 4:5 11, 9:16 15) and nothing under the
platform's buttons. Inqaa failure is a warning. - Pairwise review. For publish-bound work,
showtime review-pack --against bestsets the new render beside the best
so far as a blind pair, judged twice with the order swapped.showtime review-verdictships the new one only if it
wins both; a tie or a split keeps the older render. Up to three rounds, no scores. - Brand first for launches.
showtime brand capture <repo|url> --job <job>takes the product's palette, fonts, logo,
wordmark, real copy (with file and line) and real UI before the storyboard;showtime new launchapplies it. A launch
with no kit records why, andcheckwarns when the page ignores the kit. The launch workflow now states length
defaults (teaser 10 to 15 s, feature 30 to 40 s, launch 45 to 60 s) and the two-second hook. - Fixes where agents tripped in the 0.2.0 runs: frames of a clip that is not active no longer depend on seek order,
retime --from-voice --totalworks when every scene is narrated, Manim silent films and--mixpaths work,
manim checkruns qa's black-frame and frozen-frame detectors on a draft, font errors name the exact missing
characters and the fix, anddoctorwarns when theshowtimecommand on your path is not your agent's. - Partial renders splice into the full video.
render --from/--to --jobre-renders a span and writes a complete
final; a span file is never the deliverable. The Manim templates pass their own check, and qa no longer reads a dark
design as a black frame. - Math by ear.
voice scriptwarns when a line repeats a word across a sentence break ("One. One plus three" is
heard as "one one plus three"); the voice guide says how to read sums and symbols aloud. - Charts keep their numbers. A bar or point added to a chart grows in with its own label, while the labels already
on screen stay lit and move with their bars (they used to blink out and back). Callouts carry their year or value
("2015: first year above 400 ppm") and move clear of the line's end label.checkwarnschart_labels_hiddenwhen
a page hides chart labels during motion. - Pacing you can feel.
checkwarnsslow_scenewhen a scene holds well past the time its text needs; launch
films warn on still stretches from 3.5 s (they read as a frozen video); qa'sdead_stopflags a fast move that halts
in one frame, andcheck'ssame_frame_entrancethree or more items landing on one frame, each with its fix. Data
films dip between text-heavy scenes instead of blurring them together, andshowtime lookincludes the middle of
the fastest transition, where doubled text hides. - "Make it like this video" lands on the reference's style.
showtime referencenow measures the reference in
frames (every cut, shot lengths, moves and easing, palette roles, margins and type sizes, tempo and every sound hit)
and writes a spec with what to keep and what to change, plus astyle.cssthatshowtime new --joblinks into the
project. The reference's colours carry over unless you have a brand kit or ask otherwise; its words, logos and shots
never do.showtime reference diff <job>checks the render against the reference and names what drifted, by frame.
New kinds of video
- Repo explainers and paper explainers (workflows
repo-explainerandpaper-explainer). A codebase explained in
five parts, with one request traced through real files and lines at a pinned commit; a paper explained with claims
tied to pages, figures shown only when their license allows, and Manim for the math. Every claim has a row pointing at
its source. There is no example in the gallery yet. showtime release-videoturns release notes, a CHANGELOG section or a PR description into a ready-to-render
project with no agent: the notes' own words, holds long enough to read, the people credited.- A GitHub Action (
.github/actions/showtime-video, guide indocs/github-action.md) renders a release or PR video
on the runner, checks it, exports an HTML video and a copy under 10 MB, and uploads them. It needs no API key unless
you choose the mode that runs your own agent. showtime adopt <folder | page | script>takes a video someone already wrote as a function of time (an HTML page
withseek(t), a canvasdraw(t), a CSS-animated page, a Python frame function) and gives it showtime's checks,
sound, captions, qa, HTML export and review without a rewrite. Your original files are never changed.
Honesty
- A receipt for every job.
receipt.md,receipt.jsonand a line inshare.txt: your request as typed, the
assumptions, review rounds, full and partial renders, images made for looking, wall time, and tokens and cost when your
agent's session log is named. Anything unknown says "not reported by this agent"; nothing is estimated. Claude Code
costs are labelled API-equivalent, because a plan does not pay per video; Codex gives tokens only. showtime qare-extracts its contact-sheet frames when the video is newer than them (a re-render to the same
final.mp4used to show the old frames), and a 1:1 or 4:5 master is no longer an aspect warning for X or LinkedIn.SECURITY.mdsays how to report a vulnerability privately.
Upgrading from 0.2.0
- Claude Code:
/plugin marketplace update showtime. Other agents:showtime install --agent <name>again, or pull the
repository. No setup step is needed;showtime job initnow checks setup itself. - New files appear in your job folders (
receipt.md,receipt.json,work/look/) and a line inshare.txtbetween
receipt markers (delete it if you like). - The look history is a file at
~/.showtime/history/looks.jsonon your machine.showtime history offstops it,
showtime history cleardeletes it. - Commands print less when there is no terminal. If you scripted against the old long output, use
--verboseor
SHOWTIME_OUTPUT=full. - Launch jobs now warn (
brand_missing) until they have a brand kit or a recorded reason. - MCP: tool results are capped at 40 lines, and there are new
guideandreceipttools;snaptakeslook: true. - The review mode: 0.3.0 runs the full review by default. To keep 0.2.0's lighter behaviour for drafts, run
showtime config mode lean. - The Claude Desktop bundle
showtime-0.3.0.mcpbis attached to this release; the npm package
@faviovazquez/showtime-mcpis 0.3.0.
Known limits
- Tokens and cost come only from agents that expose a session log we can read (Claude Code and Codex); everything else
says "not reported by this agent". Through MCP there is no session log. - Hosts without a sub-agent tool keep the look composite in the main context; it is...
showtime model mirror (models-v1)
Unmodified third-party model files (see LICENSES.txt) that showtime downloads when Hugging Face or GitHub LFS is blocked. Not a showtime release.