The HTML video
curtain-call-sting-player.html is the single-file export, playing right here. Click it, then press ? for the keys, or open it on its own.
A motion pack for showtime's own brand, Curtain Call (assets/brand/): a new 5-second 3D logo sting in
three native layouts (16:9, 1:1, 9:16) with a sound logo, four lower thirds and two transition stingers with
alpha for an editor, plus web versions of the sting. It was made in studio mode: concepts on a local board
first, then a storyboard and animatic sign-off, then the build.
The existing brand sting (assets/brand/motion/sting.mp4) is not replaced. This pack is new work kept in
this folder; adopting it as sting v2 is a separate decision for the brand owner (decision D-006 and D-015).

| file | what it is |
|---|---|
final.mp4 |
the sting, 16:9: 1920x1080, 30 fps, 5.00 s, H.264 + AAC, 2.4 MB |
final-1x1.mp4 |
the sting, 1:1: 1080x1080, 5.00 s, 1.6 MB (rendered through the MCP server, see below) |
final-9x16.mp4 |
the sting, 9:16: 1080x1920, 5.00 s, 2.8 MB |
poster.jpg |
the lockup at 4.6 s (frame 0 of the video is the curtain slit, on purpose) |
pack/lower-thirds/ |
4 lower thirds, 1920x1080, 6.00 s each: lt-bar, lt-card, lt-kicker, lt-pill as VP9 .webm with alpha (60-96 KB), and lt-bar/card/pill.mov as ProRes 4444 with alpha (15-18 MB) |
pack/stingers/ |
2 transition stingers, 1920x1080, 1.00 s, VP9 .webm with alpha: stinger-curtain (CSS curtain sweep), stinger-chromatic (velvet into the lit stage through the WebGL chromatic-split) |
pack/sfx/ |
a whoosh for each stinger (WAV, audio sfx): place it at the stinger's in-point and its hit lands on the cut (0.50 s curtain, 0.45 s chromatic); 1.2 s and 1.1 s long, each with a .sfx.json sidecar |
loops/ |
the sting as a silent web hero loop: sting.loop.webp (960x540, 15 fps, 0.84 MB) and sting.loop.gif fallback (806x454, 10 fps, 4.6 MB) |
html/curtain-call-sting-embed.html |
the sting as one self-contained HTML file for embedding: no controls, autoplays muted, loops (0.96 MB, no network requests) |
html/sting-embed-site/ |
the same embed as a hosting folder (index.html + assets/, 2.9 MB) |
html/curtain-call-sting-player.html |
the sting in the full HTML player (0.85 MB, exported through the MCP server) |
studio-board.html |
the studio board, rev 5, as one self-contained HTML file (3.6 MB): the four concepts with their frames and beds, the storyboard, the animatic, the pack parts, and the decision log D-002..D-017 |
share.txt |
post copy for X/Bluesky, LinkedIn, YouTube and a README |
project/ |
the showtime projects: sting-16x9/ (the master), sting-1x1/, sting-9x16/, lower-thirds/, stingers/, sync-aspects.py, and trimfade.py (caps a whoosh with a fade) |
studio/ |
brief.md, decisions.md, board.json + every revision in boards/, the style-frame compositions in comps/, feedback.json and the simulated reviewer rounds in feedback-sim/ |
crew/ |
the crew hand-offs: creative director (concepts.md/json, the W1 frame project), brand designer (kit, contrast table, extractor diff), sound designer (bed notes and mixes) |
review/ |
FINDINGS.md of the two self-review rounds, and round-3/: before/after sheets for the fixes from the third, separate critic pass |
mcp/ |
the stdio MCP client used for part of the build, the call lists and a transcript summary |
Three ProRes files are over the repository's 20 MB per-video limit and are not in this folder:
lt-kicker.mov (24.8 MB), stinger-curtain.mov (32.4 MB) and stinger-chromatic.mov (26.6 MB). Each is one
command from project/ (about 30-60 s here):
showtime render lower-thirds --page kicker.html --alpha prores --no-audio -o lt-kicker.mov
showtime render stingers --page curtain.html --alpha prores --no-audio -o stinger-curtain.mov
showtime render stingers --page chromatic.html --alpha prores --no-audio -o stinger-chromatic.mov
The request#
Using our Curtain Call brand, give me a motion pack: a new 3D logo sting in wide, square and vertical, four lower thirds my editor can drop into Premiere, and a couple of branded transitions. Show me concepts first.
Mode: studio ("show me concepts first", SKILL.md Modes). Nothing was asked in chat: the brand is in the
repo (assets/brand/brand.json, BRAND.md, LICENSE.md), so the look, the rules and the files came from
there. Everything about look, sound and timing went on the board.
The reviewer in this example is simulated. The brief for this example said "the board decides": the agent
played the user, wrote each round's reactions as a feedback.json (studio/feedback-sim/), brought them in with
showtime studio feedback --import (the same path a reviewer on another machine uses), and recorded every pick
with its rationale in studio/decisions.md. The rationale for the concept pick is written there in full (D-002).
Crew. The brief called for the creative director, brand designer, sound designer and motion designer, and a
critic. This session had no sub-agent tool, so the agent did each hand-off itself from the same task brief and
says so in each file (crew/*/TASK.md, review/*/FINDINGS.md), as references/crew.md section 3 prescribes.
The critic's two rounds are therefore self-reviews; a second look by a person is still worth having.
How the studio session went#
Round 1: concepts (board rev 1). Three directions that differ in device, plus a wildcard, each with style frames and a 10 s bed in D (the brand sound logo's key):
| tag | concept | style frames from | bed |
|---|---|---|---|
| C1 | Velvet curtain (recommended): a real 3D stage, velvet curtains part, the mark is flown in from the flies and lands in the spotlight pool | a working three.js draft of the sting (studio frame --project) |
piano-emotional + logo-sting on the landing |
| C2 | Marquee: bulbs chase around an empty marquee board, then the lockup lights up | a composition (comps/c2-marquee.html) |
synthwave |
| C3 | Spotlight: no curtain, one follow-spot searches a dark stage and finds the mark | a composition (comps/c3-spotlight.html) |
ambient-pad + swell into a hit |
| W1 | Arcade marquee (wildcard): an 8-bit "NOW SHOWING" marquee pixel-dissolves into the mark | a small project with the WebGL pixel-dissolve (crew/pitch-cd/w1-arcade/) |
retro-8bit |
The board also asked four build questions (lower-third type, which WebGL stinger, which sound logo, replace v1
or not). The simulated reviewer picked C1 and its bed, liked the curtain-slit hook ("keep frame 0 like
this"), asked that the mark land squarely and that the wordmark sit on the dark floor, not on the gold, parked W1
("a pixelated mark breaks our own brand rules"), answered Fraunces 900 names, chromatic-split, a new logo
motif in D, and "ship as a pack first".
Round 2: storyboard, animatic and the pack (rev 2). A four-shot storyboard with thumbs from the real draft
(studio frame --storyboard), the half-size animatic with the real mix, and the rest of the pack in C1's look as
two extra cards (LT: the four lower thirds; TR: the two stingers). The reviewer approved the animatic ("the
landing on the logo note is the moment, keep it exactly here"), kept the placeholder names and asked for a
bigger gold dot on the pill lower third, which was done before the renders (D-012).
Revs 3-4: build, review, ship. The three stings, the lower thirds and the stingers were rendered and checked; the first review round found two craft defects on the curtains (next section), which were fixed and re-rendered; round 2 said ship. Rev 4 carries the decision log onto the board. Rev 5 follows a third, separate critic pass (see QA): its fixes are D-017, and D-016 corrects the simulated feedback's timestamps; rev 5 is the one exported here.
The sting, shot by shot (5.0 s)#
| time | picture | sound | job |
|---|---|---|---|
| 0.00-0.15 | velvet curtains almost closed; a slit of gold light (about 12 % of the width in every layout) shows the pool already lit on the boards (frame 0 is this) | piano pickup, a low D drone | instant recognition in a feed: a stage before the show |
| 0.15-2.30 | the drapes ease open (the hem trails the top by 0.14 s, the leading edges follow their folds), the camera dollies in 7 % | a heavy velvet whoosh | the brand idea itself: the curtain opens |
| 2.05-2.80 | the mark is flown in from the flies, turning to face the camera, and lands in the pool at 2.80 s; the pool flares once | logo-sting motif in D with its tonic on 2.80, a thock and a soft boom, the piano's chorus downbeat |
the logo, on the hit |
| 3.05-5.00 | the wordmark wipes up on the dark apron (it draws over about 0.3 s and is fully readable from about 3.5 s) and holds; dust keeps turning in the beam | a shimmer, the piano fades | the name, readable before the cut |
How it is built. One three.js scene (project/sting-16x9/sting.js) driven by ST.three(...) with
preserveDrawingBuffer: true. Every value is a closed-form function of time (no physics stepping): the drapes are
subdivided planes whose folds, gathering and hem lag come from the vertex shader, shaded as velvet (sheen at
grazing angles, darker troughs, a gold hem braid, warm light from the gap and the footlights); the beam is an
additive cone with drifting haze and 260 seeded dust motes that stay inside the cone (and fade where they would cross the landed mark); the floor shader draws the boards, the pool and the
mark's contact shadow. The mark is a tile extruded with ExtrudeGeometry (rounded corners 21/92, as in the SVG)
whose face is the official mark-hero.svg, drawn once into a texture and shown unlit, so it keeps its exact
colours; its sides are velvet deep. It is dimmer while it flies above the beam and shows its true colours in the
pool. The wordmark is the official outlined wordmark-on-dark.svg, revealed with the logo-reveal component
(mask style, its glow switched off). Grain at 3.5 % keeps the dark gradients from banding.
Three native layouts. Each aspect is its own project with its own showtime.json size; the scene reads the
stage size and a per-layout camera (visible width at the mark, height, target) and closed gap, so frame 0 is the same slit in
every layout; the wordmark position is set per page. sync-aspects.py copies the shared files from the 16:9 master. In 9:16 the mark is about 55 % of the width
(30 % in 1:1) and the wordmark sits at 66 % of the height, inside the feed safe zone.
Brand rules (BRAND.md), how they are kept. Velvet is only ever a shape (curtains, valance, the lower-third bar), never text; gold is used on dark grounds only; the mark and the wordmark are the official files, not redrawn or recoloured; the mark rests square to the camera from 2.80 s (it only turns while it is flown in); no glow or drop shadow on the mark or the wordmark (the floor shadow belongs to the stage). The W1 wildcard was parked because pixelating the mark would break the "no effects on the mark" rule.
Lower thirds and stingers#
Lower thirds (project/lower-thirds/): one page per variant on the lower-third component, with a
curtain-call.css theme that maps the brand kit onto showtime's component tokens. Names are Fraunces 900
(~56 px), roles Inter (~28 px), cream and Programme on Stage/Wings plates, so they read over any footage:
| variant | look |
|---|---|
| bar | a velvet bar (a shape) beside a Stage plate that wipes open with the name |
| card | a Wings card that wipes in, with a Spotlight-gold underline |
| kicker | a gold "NOW SHOWING" badge (Stage text on gold, 10.3:1), the name on a Stage plate, a gold rule |
| pill | a Wings pill with a gold "spotlight" dot |
The component draws the box, the name and the exit; an anime.js timeline (ST.anime) staggers the role
line in letter by letter (16 ms apart). The component's own fade of the role line is switched off in lt.css and
every letter starts hidden, so no letter shows before its turn. Each starts at 0.35 s (frame 0 is empty for a clean edit); the name is in place
about 0.75 s later and the role line types in right after; it holds 4 s, exits in 0.4 s and is gone by
5.6 s. (The brief asked for an entrance of 0.5 s or less; the component's entrance is fixed at 0.85-1.0 s, logged
as a friction.) The text is sample
text: Speaker Name, Guest Name, Host Name are placeholders, and the kicker uses the brand's real tagline.
Change names.json and re-render the variant:
showtime render project/lower-thirds --page card.html --alpha prores --no-audio -o lt-card.mov # Premiere, Final Cut, Resolve
showtime render project/lower-thirds --page card.html --alpha webm --no-audio -o lt-card.webm # web, Chrome/Firefox
The pages show a preview plate (a frame of the sting) behind the lower third in snap and preview; alpha
renders hide it.
Stingers (project/stingers/), 1 s each, fully transparent on the first and last frames, fully covered at the cut point:
curtain.html(CSS/DOM): two velvet drapes close from both sides (0-0.42 s), hold (cut under them at 0.5 s), and part again, gathering as they open.chromatic.html(CSS + WebGL): a velvet drape slides in from the right, the WebGLchromatic-splitturns it into the lit stage (0.30-0.60 s; cut at 0.45 s), and the stage slides out to the left (0.63-0.92 s). The shader window sits between two full-frame plates on purpose: showtime's WebGL compositor draws opaque pixels, so a shader window over a transparent scene would turn black in an alpha render (logged as a friction). The stage plate is a still of the empty lit stage from the sting.
For the editor. ProRes 4444 .mov files carry straight alpha; footage probe reports
prores, yuva444p12le, has_alpha: true (the brief expected yuva444p10le; FFmpeg's ProRes decoder reports
4444 as 12-bit). The VP9 .webm files carry alpha as a side channel (ALPHA_MODE=1; probe: vp_alpha: true;
plain ffprobe shows yuv420p because its built-in VP9 decoder ignores the alpha plane). WebM alpha plays in
Chrome and Firefox, not in Safari; use the .mov files in Premiere. Both are converted with the BT.709 matrix
and tagged BT.709, so an editor decoding them as tagged gets the brand colours back exactly (velvet #B3121F, gold
#E9B949).
MCP server#
Part of the build went through showtime's MCP server (skills/showtime/mcp/server.mjs) instead of the CLI: in
this session the plugin's MCP connection had timed out, so a small stdio JSON-RPC client (mcp/mcp-client.mjs)
started the server itself, listed its 18 tools and called them in order. mcp/transcript-summary.json has every
call; paths in it are shortened to <job> and project/.
| session | tool | result | what it did |
|---|---|---|---|
| 1 | new_project |
OK (0.4 s) | scaffolded a throwaway 2 s 1:1 project (dom template), to check the tool path; not part of the pack |
| 1 | audio_sfx x2 |
OK (1.6 s each) | the first whooshes (whoosh-heavy, hit 1.132 s; whoosh, hit 0.648 s); replaced in review round 3 because their hits fell after the stingers' cuts |
| 1 | render |
OK (11.4 s) | the 1:1 sting (first build) |
| 1 | qa |
OK (2.9 s) | PASS |
| 1 | deliver_exports |
FAILED (exit 1) | my mistake: from/to only apply to the image loops, and I asked for web in the same call; the error said so and named the fix |
| 1 | export_html |
OK (8.4 s) | a player HTML of the first build |
| 2 | deliver_exports x2 |
OK | web, then webp + gif, of the first build |
| 3 | render |
OK (11.3 s) | the 1:1 sting after review round 1 |
| 3 | qa |
OK (4.9 s) | PASS for square |
| 3 | deliver_exports x2 |
OK (15.4 s, 44.3 s) | web, then webp + gif of the 16:9 sting after round 1 |
| 3 | export_html |
OK (22.4 s) | a player HTML after round 1 |
| 4 | render |
OK (11.1 s) | final-1x1.mp4, after the review round 3 fixes |
| 4 | qa |
OK (2.8 s) | PASS for square: -14.0 LUFS, -1.5 dBTP, 0 warnings |
| 4 | deliver_exports |
OK (23.0 s) | the loops/ (webp, gif) of the final 16:9 sting |
| 4 | export_html |
OK (8.0 s) | html/curtain-call-sting-player.html |
Session 4 made the shipped 1:1 sting, loops and player; sessions 1-3 were superseded by the review fixes. The web
target MP4 (11.9 MB, session 3) is not shipped: it came out almost five times the size of the 2.5 MB master it was made from, with no gain
(logged as a friction); final.mp4 is the web file.
Commands, in order#
Everything ran through skills/showtime/bin/showtime (written showtime), from a work folder;
<job> is showtime-out/curtain-call-pack-20260927-152547/, REPO the repository root.
showtime doctor --quick
showtime job init curtain-call-pack --mode studio --goal "Using our Curtain Call brand, give me a motion pack: ..."
showtime studio init <job>
showtime brand init --from REPO -o brandcheck/brand.json # extractor check: it missed the canonical kit (crew/brand/extractor-diff.md)
export SHOWTIME_BRAND=REPO/assets/brand/brand.json # the canonical kit instead
showtime brand show
showtime brand css > brand.css
showtime assets font fraunces --weights 900
showtime assets font inter --weights 400,600,700
showtime studio font <job> "Fraunces"
showtime studio font <job> "Inter"
# round 1: concept beds (sound designer)
showtime audio compose --style piano-emotional --dur 10 --key D --sections 0:intro,5:chorus -o beds/bed-c1-piano.wav
showtime audio compose --style synthwave --dur 10 --key Dm --sections 0:intro,5:drop -o beds/bed-c2-synthwave.wav
showtime audio compose --style ambient-pad --dur 10 --key D -o beds/bed-c3-pad.wav
showtime audio compose --style retro-8bit --dur 10 --key D -o beds/bed-w-8bit.wav
showtime audio mix crew/sound-beds/c1-mix.json -o bed-c1.wav # + logo-sting in D at 6.0 s
showtime audio mix crew/sound-beds/c3-mix.json -o bed-c3.wav # + swell and thock at 6.0 s
showtime audio master <bed>.wav -o <job>/studio/media/audio/<bed>.mp3 # x4
# round 1: the C1 draft (three.js) and the other concepts' frames
showtime snap project/sting-16x9 --at 0,1.5,2.6,2.9,4.6 --width 960 --format jpg # many rounds, all three aspects
showtime audio sfx logo-sting --key D -o ls.wav # read the hit: the tonic at 0.28 s
showtime audio compose --style piano-emotional --dur 8 --key D --bpm 86 --sections 0:intro,2.8:chorus --no-sfx --no-stems -o project/sting-16x9/audio/piano.wav
showtime audio mix project/sting-16x9/audio/mix.json -o project/sting-16x9/audio/mix.wav # x3, balancing the hit
showtime render project/sting-16x9 --preview -o scratch/sting-draft1.mp4
showtime snap scratch/sting-draft1.mp4 --count 16 --cols 4
showtime snap crew/pitch-cd/w1-arcade --at 0.6,2.3 --width 960 --format jpg
# (wrote board.json: 4 concepts, the bed group, 4 questions, 2 dials; comps/c2-marquee.html, comps/c3-spotlight.html)
showtime studio frame <job> --concept C1 --project project/sting-16x9 --at 0,2.45,4.6 --caption "..."
showtime studio frame <job> --concept C2 --html <job>/studio/comps/c2-marquee.html --shots hook,end --caption "..."
showtime studio frame <job> --concept C3 --html <job>/studio/comps/c3-spotlight.html --shots hook,end --caption "..."
showtime studio frame <job> --concept W1 --project <job>/crew/pitch-cd/w1-arcade --at 0.6,2.3 --caption "..."
showtime studio board <job>
showtime studio open <job> # a real session ends its turn here
showtime studio feedback <job> --import <job>/studio/feedback-sim/feedback-round1.json
showtime studio feedback <job> --new
showtime studio decide <job> 'Concept: C1 "Velvet curtain" ...' --kind picked --from "board rev 1 ..." --why "..." # D-002..D-010
# round 2: storyboard, animatic, the pack parts
showtime studio frame <job> --concept C1 --project project/sting-16x9 --at 0,1.3,2.8,4.6 --storyboard
showtime render project/sting-16x9 --preview --scale 0.5 -o <job>/studio/media/animatic/c1.mp4
showtime snap project/lower-thirds --page <variant>.html --at 0.45,0.6,0.9,1.4,5.5 --width 960 --format jpg # x4, several rounds
showtime snap project/stingers --page <stinger>.html --at 0.1,0.25,0.4,0.5,0.6,0.8,0.95 --width 480 --format jpg
showtime render project/stingers --page chromatic.html --preview --scale 0.5 -o <job>/studio/media/animatic/tr-chromatic.mp4
showtime render project/lower-thirds --page bar.html --preview --scale 0.5 -o <job>/studio/media/animatic/lt-bar.mp4
showtime studio board <job> # rev 2
showtime studio feedback <job> --import <job>/studio/feedback-sim/feedback-round2.json
showtime studio feedback <job> --new # APPROVED
showtime studio decide <job> "Animatic approved ..." ... # D-011..D-013 (locked)
showtime job note <job> --stage understand ... ; showtime job note <job> --stage plan ...
# build
showtime check project/sting-16x9 ; showtime check project/sting-1x1 ; showtime check project/sting-9x16 # PASS, 0 warnings each
showtime render project/sting-16x9 --job <job> # first build (final.mp4)
showtime qa <job>/final.mp4 --project project/sting-16x9 # PASS
node mcp/mcp-client.mjs <server.mjs> calls-1.json ... # MCP session 1 (table above)
node mcp/mcp-client.mjs <server.mjs> calls-2.json ... # MCP session 2
showtime render project/sting-9x16 --job <job>
showtime qa <job>/final-3.mp4 --project project/sting-9x16 --platform reels
showtime render project/lower-thirds --page <variant>.html --alpha prores --no-audio -o <job>/pack/lower-thirds/lt-<variant>.mov # x4
showtime render project/lower-thirds --page <variant>.html --alpha webm --no-audio -o <job>/pack/lower-thirds/lt-<variant>.webm # x4
showtime render project/stingers --page <stinger>.html --alpha prores|webm --no-audio -o <job>/pack/stingers/stinger-<stinger>.mov|webm # x4
showtime footage probe <job>/pack/lower-thirds/lt-bar.mov # prores, yuva444p12le, has_alpha
showtime footage probe <job>/pack/lower-thirds/lt-bar.webm # vp9, vp_alpha
showtime snap <job>/pack/stingers/stinger-curtain.webm --at 0.5 ; showtime snap <job>/pack/lower-thirds/lt-kicker.mov --at 3
# (fixed the kicker's gold rule, hidden under its plate; re-rendered lt-kicker.mov/.webm)
showtime export html project/sting-16x9 --controls none --autoplay-muted --loop -o <job>/html/curtain-call-sting-embed.html
showtime export html project/sting-16x9 --controls none --autoplay-muted --loop --folder -o <job>/html/sting-embed-site
# review round 1 (self-review) -> fixes -> final renders
showtime review-pack <job>/final.mp4 --project project/sting-16x9 # FINDINGS: no gold hem, straight drape edges
# (fixed: the hem sat below the boards and used reversed smoothstep edges; the leading edges now follow their folds)
showtime render project/sting-16x9 -o <job>/sting-16x9.mp4 # -> final.mp4 here
showtime render project/sting-9x16 -o <job>/sting-9x16.mp4 # -> final-9x16.mp4
node mcp/mcp-client.mjs <server.mjs> calls-3.json ... # MCP session 3: final-1x1.mp4, qa, loops, player HTML
showtime qa <job>/sting-16x9.mp4 --project project/sting-16x9 --platform youtube
showtime qa <job>/sting-9x16.mp4 --project project/sting-9x16 --platform reels
showtime export html project/sting-16x9 --controls none --autoplay-muted --loop -o <job>/html/curtain-call-sting-embed.html # again, final
showtime export html project/sting-16x9 --controls none --autoplay-muted --loop --folder -o <job>/html/sting-embed-site
showtime review-pack <job>/sting-16x9.mp4 --project project/sting-16x9 # round 2: ship
showtime job note <job> --stage verify ...
showtime studio decide <job> "Review fixes ..." ; showtime studio board <job> # rev 3
showtime studio feedback <job> --import <job>/studio/feedback-sim/feedback-round3.json # ship
showtime studio decide <job> "Pack shipped as example 20; sting v1 unchanged" # D-015
showtime studio board <job> # rev 4: the decision log on the board
showtime studio export <job> --inline # rev 4
showtime studio stop <job>
# review round 3 (a separate critic pass; review-pack stops at two rounds, so no new pack) -> fixes
# (showtime itself: render --alpha now converts with the BT.709 matrix it tags; see the QA section)
# (sting.js: per-layout slit, curtains ease in from 0.15 s, dust kept in the beam; index.html: softer wordmark wipe;
# lt.css/lt.js: role letters only revealed by the stagger; chromatic.html: slide-out 0.63-0.92 s; names without "v2")
python project/sync-aspects.py
showtime snap project/sting-<aspect> --at 0,0.5,3.2,3.4,3.6,3.85,4.6 --format png # frame-0 slit, wipe, dust
showtime snap project/lower-thirds --page <variant>.html --at 0.9,1.0,1.1,1.25,1.5,1.8,3.0 --format png
showtime check project/sting-16x9 ; showtime check project/sting-1x1 ; showtime check project/sting-9x16 # PASS, 0 warnings
showtime render project/sting-16x9 -o <job>/sting-16x9-r3.mp4 # -> final.mp4, poster.jpg
showtime render project/sting-9x16 -o <job>/sting-9x16-r3.mp4 # -> final-9x16.mp4
node mcp/mcp-client.mjs <server.mjs> calls-4.json ... # MCP session 4: final-1x1.mp4, qa, loops, player HTML
showtime qa <job>/sting-16x9-r3.mp4 --project project/sting-16x9 --platform youtube
showtime qa <job>/sting-9x16-r3.mp4 --project project/sting-9x16 --platform reels
showtime render project/lower-thirds --page <variant>.html --alpha prores|webm --no-audio -o <job>/pack-r3/lower-thirds/lt-<variant>.mov|webm # x8
showtime render project/stingers --page <stinger>.html --alpha prores|webm --no-audio -o <job>/pack-r3/stingers/stinger-<stinger>.mov|webm # x4
showtime audio sfx whoosh-heavy --dur 0.82 --intensity 0.6 --seed 4 -o wh.wav # hit 0.498 s (cut 0.50)
showtime audio sfx whoosh --dur 0.856 --intensity 0.7 --seed 7 -o w.wav # hit 0.452 s (cut 0.45)
python project/trimfade.py wh.wav <job>/pack-r3/sfx/stinger-curtain-whoosh.wav 1.2 0.3 # needs numpy + soundfile (showtime's venv)
python project/trimfade.py w.wav <job>/pack-r3/sfx/stinger-chromatic-whoosh.wav 1.1 0.3
showtime export html project/sting-16x9 --controls none --autoplay-muted --loop -o <job>/html-r3/curtain-call-sting-embed.html
showtime export html project/sting-16x9 --controls none --autoplay-muted --loop --folder -o <job>/html-r3/sting-embed-site
showtime snap <new> --at <t> --compare <old> -o <job>/review/round-3/compare/<name> # the before/after sheets
showtime studio decide <job> "Correction: the simulated feedback events are restamped ..." # D-016
showtime studio decide <job> "Review round 3 fixes: ..." # D-017
showtime studio board <job> ; showtime studio export <job> --inline # rev 5 -> studio-board.html
Features shown#
- Studio mode, end to end:
studio init,board,frame(--htmlcompositions,--projectfrom a real draft,--storyboardthumbs),font,open,feedback(--import,--new),decide,status,export --inline,stop; four board revisions with history; 3 concepts + 1 wildcard; picks, likes, timecoded comments, answers, dials and an approval. - Crew hand-offs (done inline, labelled): creative director, brand designer, sound designer, motion designer (the lower thirds), critic.
- Brand kit:
brand init --from <repo>as an extractor check (its draft is diffed against the canonical kit increw/brand/extractor-diff.md),brand show,brand css,SHOWTIME_BRAND; a component theme built from it. - three.js through
ST.three(preserveDrawingBuffer), closed-form animation, extruded geometry with an SVG texture;logo-reveal;grain. - lower-third in all four variants, with an anime.js timeline (
ST.anime) for the role stagger. - Alpha renders:
render --alpha proresand--alpha webm, pages picked with--page;footage probe. - WebGL transitions:
chromatic-splitin a stinger,pixel-dissolvein the W1 concept frames. - Native aspect layouts (16:9, 1:1, 9:16), each checked and qa'd against its platform.
- Sound:
audio compose(piano-emotional,synthwave,ambient-pad,retro-8bit),audio sfx(logo-sting --key D,whoosh,whoosh-heavy,thock,boom,shimmer,swell,drone),audio mixwithalign: hitand a duck under the logo,audio master. - MCP server over stdio:
new_project,audio_sfx,render,qa,deliver_exports,export_html. - Web delivery:
export html --controls none --autoplay-muted --loop(one file) and--folder;deliver exports --targets weband thewebp/gifloops;assets font fraunces.
QA#
| file | verdict | loudness | notes |
|---|---|---|---|
final.mp4 (16:9, --platform youtube) |
PASS (0 warn) | -14.0 LUFS, -1.5 dBTP | frame 0 flows into frame 1, no frozen or black stretches |
final-1x1.mp4 (--platform square, via MCP) |
PASS (0 warn) | -14.0 LUFS, -1.5 dBTP | |
final-9x16.mp4 (--platform reels) |
PASS (0 warn) | -14.0 LUFS, -1.5 dBTP | aspect fits Reels |
showtime check on each sting project: PASS with 0 warnings (deterministic, no network, no still holds). The
wordmark is an image, so there is no live text to measure; the brand contrast table (cream on Stage 16:1) is in
crew/brand/contrast.txt. The poster (4.6 s) is not baked into frame 0 because the video opens on the curtain
slit (render: "it differs from the opening frame"), which is what the reviewer asked for.
Review (self-review, no sub-agent tool): round 1 on the first build, ship after fixes (no gold hem visible
on the curtains; the drapes' inner edges were straight lines); both fixed; round 2, ship. See review/.
Review round 3 (a separate critic pass over everything shipped, not a self-review): ship after fixes. It
kept the 16:9 sting (the hem, the landing exactly on the note, the lockup) and found one blocker, six should-fix
items and three polish items in the rest of the pack. All were fixed and re-rendered; review-pack stops at two
rounds, so the evidence is before/after sheets (showtime snap --compare) in review/round-3/:
| # | found | fixed | checked |
|---|---|---|---|
| 1 | blocker: stinger-chromatic's last frame was 32 % opaque (the stage still sliding out) |
slide-out 0.63-0.92 s | alpha 0 on frame 0 and frames 28-29, ProRes and WebM (compare-chromatic.jpg) |
| 2 | all four lower thirds: the whole role line showed, then a gap of missing letters swept across it | the component's role fade off, letters start hidden; only the stagger reveals them | snaps 0.9-1.8 s, ProRes at 0.93/1.23 s (compare-lt-bar.jpg) |
| 3 | the .mov files were BT.601 inside but tagged BT.709 (velvet decoded as #C1221D); the WebM had no tags |
a showtime bug: render --alpha now converts with the BT.709 matrix and tags both formats (with a test) |
decoded as tagged: #B3121F and #E9B949 exactly |
| 4 | the whooshes' hits fell after the stingers' cuts (1.13 s and 0.65 s vs 0.50 and 0.45 s) | re-made with --dur so the hit is on the cut, capped at 1.2/1.1 s |
envelope peaks 0.502 s and 0.445 s |
| 5 | 9:16 frame 0 was a third open (1:1 18 %), not the slit of D-007 | closed gap set per layout | frame-0 gap 11.9 / 11.6 / 11.8 % of the width (compare-9x16-frame0.jpg) |
| 6 | the sting called itself "sting v2" in titles, the embed, share.txt and two projects |
"Curtain Call motion pack sting" until the brand owner adopts it | HTML re-exported |
| 7 | the simulated reviewer events were stamped after the files that hold them (22:52Z-00:08Z) | restamped with each round's real write/import time; D-016 records it (decisions.md is append-only) | studio/feedback*.json |
| 8 | polish: the wordmark wipe read as a 4-frame pop; the README said "readable from 3.85" | gentler ease (the wipe is 0.8 s in the component): it now draws over about 0.3 s; README corrected | wipe coverage per frame |
| 9 | polish: nearly static until 0.35 s | the curtains ease in from 0.15 s; the landing is unchanged | gap at 0.5 s 229 -> 267 px |
| 10 | polish: a small cluster of dust motes beside the mark at 4.6 s | motes stay inside the beam; those in front of the landed mark fade | compare-16x9.jpg at 4.6 s |
After the fixes all three stings are PASS with 0 warnings at -14.0 LUFS / -1.5 dBTP (table above) and showtime check is PASS with 0 warnings on each project. A second look by a person is still worth having.
The HTML files make no network request (a Content-Security-Policy with default-src 'none' is in each).
Sources and licenses#
- Brand assets:
assets/brand/(the mark, the wordmark,brand.json,BRAND.md). They are owned by the showtime project and are not covered by the MIT license (assets/brand/LICENSE.md; a copy ships in each sting project asassets/BRAND-LICENSE.md). The pack is the brand owner's own work on their own mark. Anyone else may use the sting "unmodified" at the start or end of a video made with showtime, as the license says; the project files are not a license to make changed versions of the mark. - Fonts: Fraunces and Inter, SIL Open Font License 1.1, installed as files (
showtime assets font); the wordmark itself is outlined in the SVG. - Libraries: three.js (MIT), anime.js (MIT), installed by showtime setup, not vendored.
- Sound: everything is synthesised locally by
showtime audio composeandshowtime audio sfx; no samples or library tracks, so there is nothing to credit (qa: "no attribution required"). - Sample text: the lower-third names are placeholders; the kicker's line is the brand's own tagline.
No credits.txt is needed.