Skip to content

video-shotcraft

An agent skill that turns Claude Code or Codex into a motion-design studio: 157 shot recipe cards carrying the real easing and timing values, 214 motion previews, a validated 36.2-second template film, 149 sound effects filed by scene, and a browser workbench that reopens the delivered film for editing.

Screenshot of video-shotcraft
Editor screenshot, 30 Sep 2026video-shotcraft ↗

What it is

An agent skill that turns Claude Code or Codex into a motion-design studio: point it at a product and it storyboards, animates and sound-designs a cinematic promo with Remotion. The library is the point — 157 shot recipe cards under ten functional categories, each one documenting purpose, energy, suggested duration, parameters, implementation notes and known pitfalls, each paired with a TSX implementation carrying the real easing and timing values and with a motion preview you can filter in the online gallery. On top sit a validated 36.2-second template film (1920×1080, 30fps, ten shots, paper-ink-amber), 149 sound effects filed under sixteen scene categories, five music beds, a 2.5D page camera for real page captures, an exporter that turns the finished film into an editable JianYing draft, and a browser workbench that reopens the delivered film as shot, transition, caption and sound tracks. Install is a symlink into the agent’s skills directory or one npx command; Apache-2.0, about 183 MB.

Who built itThe repository is published under the GitHub account Vincentwei1021, and the README signs off as Vincent. Its 101 commits are signed under two names — Wei Yihao, from an amazon.com address, on 47 of them, and Yihao, from an address linked to the account, on 36 — which together account for 83 of the 101. Seventy-one of the commits carry a co-author trailer, and 62 of those name a Claude model: Fable 5 on 47, Opus 5 with a million-token context on 12, Fable 5.1 on 2 and Claude Code on 1. Nine contributors appear in total; after the author, the largest has six commits.

How it is put together

The parts · 6

An agent skill wrapped around a card library, with the card as the unit of reuse. The skill entry point carries the production rules, the reference documents carry the method, and every technique in the library is stored three times over — as prose a reader can follow, as a deterministic Remotion component holding the easing and timing values that were tuned frame by frame, and as a rendered preview someone can watch before committing to a shot. That triplication is what makes the library teachable to an agent: it can be told to use a card by name, read what the card is for, and copy real parameters instead of inventing them. Everything the film needs at render time is deliberately pulled into one place — sound is a timeline asset declared in a single table rather than code inside scene components, the schedule is imported from the film’s own entry point rather than duplicated by the editor, and the template’s scenes read their copy, sizes and colours from default objects so that the same values feed both the render and the inspector. The workbench is bolted on rather than built in, and its contract says what it may and may not change: timing, speed and layering are editable, per-property editing is opt-in by turning a context-level parameter into a prop with a schema, and the constants that carry the rhythm stay constants.

SKILL.md and references/
The agent-facing half: the skill entry point at 19,863 bytes, and the method documents beside it — pipeline.md (25,226), aesthetic-rules.md (27,547), sound-design.md (27,677), music-beat-sync.md (13,049), workbench.md (13,212), guided-free-creation.md (10,874), jianying-export.md (9,348) and final-review.md (7,095). Under references/shots/ sit 157 recipe cards in ten categories plus a sourcing note, and references/sequences/ holds one reusable full-video structure.
demos/
The Remotion implementations, one folder per card under the same ten category names, each holding a deterministic TSX component driven by a normalized progress value. Around them sit demos/README.md (7,276), three shared fixtures, 25 texture assets, and two scripts that keep them honest: assets/scripts/capture-template.mjs (8,973) and smoke-render-demos.py (5,940). The workbench counts 216 of these motions.
template/
The runnable Ink Press film: src/aifl/Main.tsx (9,730) holding the schedule and the sound table, six scenes under src/aifl/live/ — the largest, SceneOpen.tsx, at 25,822 bytes — and a theme layer in src/themes/ where nine presets in palettes.json feed a generated palette-assets.json of 105,914 bytes. src/workbench.ts (9,616) is the manifest contract the editor reads, and template/themes/ui.cjs (23,076) drives theme editing.
gallery/ and .github/
The static site and the intake behind it: index.html, library.html (68,925) and showcase.html with their scripts, a 65,192-byte translation table, api/library.json (267,673), 157 generated source files, llms.txt (41,035), and two generators — sync-from-cards.py (6,202) and build-seo.py (6,318) — that rebuild all of it from the cards. Beside them, the showcase issue form (3,066), the publishing script (8,145) and three workflows for pages, pull-request checks and publishing.
workbench/
A Vite and Remotion Player editor: an application shell, panels (Inspector 11,828, LibraryPanel 14,950, ThemePanel 8,907), a timeline (Timeline.tsx 9,841), a preview, a store of 11,726 bytes and an i18n file of 41,147 with four Russian JSON files under i18n/ru/. Four scripts run it — gen-index.mjs (14,604), open.mjs (8,254), parity.mjs (5,209) and test-themes.mjs (9,945) — and GUIDE.md with nine screenshots documents the interface.
assets/ and jianying-export/
The raw material: 156 audio files in 36,228 KB — five music beds and 149 effects under 16 categories — with ATTRIBUTION.md (22,401) and the 2026-07-27 audition pass (36,465); seven shared Remotion components under assets/lib/ with their own tests and helpers; brand SVGs and a brand note; and the JianYing draft exporters, mac_draft.py (17,946, verified on macOS) and windows_draft.py (7,980, labelled untested in the tree).

Choices, and what they beat

  • Sound is pinned after the picture is locked over building the audio bed alongside the edit

    Written down after the fact in references/sound-design.md: on the template film audio work started only after roughly thirty rounds of picture changes, and when a soundtrack swap once shared a round with a picture rework, the whole effect table had to be re-pinned. The document turns that into an ordering — picture locked, music bed laid, effects pinned beat by beat.

  • One declarative SFX table per film over audio code inside each scene component

    The document’s stated reason is that sound is a timeline-level asset rather than a shot-level one: effects live in a single array of frame, file and volume entries, each commented with the action it lands on, and the scene components carry no audio code at all.

  • De-brand every card on the way in over shipping the look of the films the motions were read from

    The acknowledgements name twelve official product films that were studied for timing and choreography and state that none of their footage, artwork or brand assets are included; every card uses neutral stand-in copy and one swappable accent colour, and a contributor’s pull request repeats the same undertaking in its own words.

  • Let the editor reuse the film’s own schedule and only the parameters the author exposed over a second, fully editable timeline

    Stated in the pull request that added the workbench: the manifest is exported from the film’s src/workbench.ts, the schedule is imported from Main.tsx and must not be written a second time, and the 216 demo motions plug in unchanged. Timing, speed and layering are editable and per-property editing is not, because the demos are constant-driven; the pipeline document tells future films to expose context-level parameters as props with a schema while leaving rhythm-critical constants as constants.

  • Thumbnails stand still and play on hover over an autoplaying Player on every card

    A user reported the first screen flashing wildly. The cause was a dozen autoplaying 1080p previews, with flash-cut cards whitening every 0.3 s and title cards fading every 1.8 s, doubled by StrictMode. Thumbnails moved to a static frame at 45 percent and StrictMode was dropped; the measured result was zero DOM mutations and zero console warnings where there had been 28 encoding errors.

Read fromREADME.md (15,586 characters; the reconnaissance report printed the first 6,000 and the remainder was fetched from the default branch on 2026-10-01), references/sound-design.md as printed in that report (16,331 characters, of which 12,000 were shown), the complete 989-file tree with sizes and the two-level directory summary, and the bodies and comment threads of pull requests 65, 72, 75, 80, 86 and 88 together with the showcase issues cited above.

Build log

6 stages
  1. 01

    Eleven weeks, three monthly batches, and a card count that never stopped moving

    The repository was created on 2026-07-19, and its first commit puts the whole of version one into a single message: the card library, the demo implementations, the finished-film template, the assets and the gallery. 101 commits follow, and their distribution is the shape of the project — 66 in July, 25 in August and 10 in September, the last of them dated 2026-09-28 and adding Russian to the workbench interface. The published numbers move in batches rather than continuously. The August note announces 48 new cards and says the library grew from 104 to 152 cards and 209 previews, distilled from 209 candidate motions through eight rounds of frame-by-frame review against reference footage. A contribution on 2026-09-01 records 152 cards and 209 previews becoming 155 and 212. Today the README banner reads 157 cards and 214 previews while the repository description still says 152 and 209, and the workbench counts 216 demo motions. Around it sit 10,029 stars, 897 forks, 11 watchers and 5 open issues, nine contributors, and two releases that are both media drops — gallery-media on 2026-07-26 and showcase-media on 2026-09-01 — rather than version numbers.

  2. 02

    Two hundred and nine candidates, eight rounds of review, forty-eight survivors

    How a card comes into being is stated in the README rather than left to be inferred: 209 candidate motions were put through eight rounds of frame-by-frame review against reference footage, and 48 of them became the August batch. Every survivor arrives as three artifacts — a recipe card under references/shots/<category>/, a native Remotion component at demos/<category>/<name>/<Component>.tsx that is deterministic and driven by a normalized progress value, and a rendered motion preview — and all of them are de-branded on the way in, with neutral stand-in copy and a single swappable accent colour. Where the motions come from is answered in the acknowledgements: twelve named official product films, among them ClickUp, Perplexity, Slack, Notion, Figma, Framer, Bear, Raycast, Pitch, Miro, Superhuman and Loom, were studied for their timing and choreography, and no footage, artwork or brand assets from any of them are in the repository. Contributors keep the same discipline by hand: one pull request adding three cards states that it contains no third-party images, video, logos, product UI or brand names, only deterministic geometry and stand-in copy, and reports the count moving from 152 cards and 209 previews to 155 and 212. The bulk of the work is scripted rather than hand-edited — gallery/sync-from-cards.py and gallery/build-seo.py regenerate the gallery index, a 65,192-byte translation table and the SEO files from the cards, and template/scripts/build-palette-assets.cjs writes a 105,914-byte palette manifest.

  3. 03

    Sound was pinned last, and the ordering was learned the hard way

    The 27 KB sound-design document is the most candid process record in the repository, and its first rule is an order of operations: lock the picture, lay the music bed, then pin the effects beat by beat. It was written from a bruising — audio work on the template film only began after roughly thirty rounds of picture changes, and once a soundtrack swap was folded into the same round as a picture rework, the entire effect table had to be re-pinned from scratch. The music bed went through three versions: a warm ambient piano piece by Kevin MacLeod under a CC-BY licence, then a cheerful folk-pop track, then the Mixkit tech-house bed that survived. The first two were rejected by the user within 34 minutes of each other, the second with the verdict that the music and the effects sounded like a video game, and that verdict became a written rule: pick effects by genre rather than by event, so a product promo draws on whoosh, impact, riser, sparkle and transition, and game sound packs are excluded. The library now holds 149 effects across 16 scene and material categories plus 5 music beds, catalogued in a 2026-07-27 audition pass — 36,465 bytes of durations, peaks and suggested pin frames — after a checksum sweep found four pairs of files that were the same download stored twice under two names.

  4. 04

    The workbench was ported in from the sibling project, and reviewed in the open

    On 2026-09-04 one pull request brought the browser workbench over from video-talkcraft, the narration-video project in the same series, and wrote down the contract that lets the skill open an editor after delivery. The film is split into shot, transition, caption and sound tracks exactly as authored; the schedule is imported from the film’s own entry point, with an explicit rule that it must not be written a second time; and the demo motions plug in as a library with zero changes to 216 components. Of 218 TSX files, two were skipped because one needs an mp4 asset and the other is a helper, and per-property editing is withheld because the demos are constant-driven — a limit the author recorded in the pipeline document instead of hiding it. The thread doubles as the review record. Five findings were fixed in one commit, among them a manifest key so that a new version with the same total duration still triggers an import, a refusal to reuse a development server the workbench does not own, and a parity script that now exits with its own code rather than reporting a green result it cannot stand behind. A user-reported “frantic flashing” on the first screen was traced to a dozen autoplaying 1080p previews used as thumbnails; thumbnails now rest on a static frame at 45 percent and play on hover, after which zero DOM mutations and zero console warnings were measured, against 28 encoding errors before. A flicker in one scene was located by counting brightness pulses in a screencast, about twenty down to two, and fixed by branching on the rendering environment. An independent review in a fresh context found no blockers.

  5. 05

    Two Russian pull requests, one localisation path

    The workbench interface became English by default on 2026-09-23, with a switcher in the top bar and roughly 150 interface strings per language collected in a single translation file, while saved project data is left untouched: track names and card labels are translated at display time, so opening an old project in another language does not rewrite it. Two Russian contributions then arrived. The first localised the interface, translated the card labels and migrated legacy track names inside saved files; the second, eleven days later, carried a full Russian string table built on top of the new language layer. The maintainer closed the first rather than merge two implementations, wrote that the second had conflicts in eight workbench files, and asked for it to be rebased as an extension of the merged layer — same file, same preference key, English still the default, existing behaviour unchanged. The contributor rebuilt it that way and reported that switching language is display-only, with the saved project JSON staying byte-identical, and with the build, the theme tests and a four-frame render parity check passing. The commit the repository now ends on is that Russian interface, merged on 2026-09-28.

  6. 06

    A showcase assembled from issue forms, and what the community argues about

    Finished films arrive through a GitHub issue form — 3,066 bytes, with a required statement that the submitter owns the video and consents to it being shown — and are published by an 8,145-byte Python script and its workflow; the bot announces that a work will appear on the showcase page within minutes, and the maintainer converts submissions to 1080p H.264 for web playback. Curation is hands-on rather than automatic: submitters who paste a link are asked to drag the video into the issue, and at least one entry was sent back with the note that it did not appear to use any motion shots from the library. The 30 issues and pull requests on record sample that traffic — a WeChat mini-program promo that named six cards and anchored its cuts at 128 BPM, a browser extension, a patent-coaching tool, an AI trading platform, and a 4K film delivered through a cloud-drive link. One pull request added an optional YouTube field to the submission form and migrated earlier entries that had put YouTube URLs in the wrong field, with 23 tests passing. A theme sidebar arrived the same way, as a feature request plus a draft; by the time it was merged the contributor had cut the diff from 190 files to 42 at the maintainer’s request, dropping generated images and the script that made them. The sharpest thread is a user reporting that the library works almost perfectly with Claude while Codex, Antigravity, Cursor and other agents produced noticeably worse films; the maintainer answered that Codex with a high setting should also work well and that other users report another model. One issue reports flaky continuous-integration tests in a path that does not exist here.

Adjacent records

All records →