FAQ
shotkit is a Claude Code plugin with 5 hand-picked skills for content work, indexed on Flowy. Install it with the command on its page. It includes brand-lock-extractor, storyboard-architect, storyboard-html-preview. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Repo: whystrohm/shotkit

The pre-production system we use to ship hundreds of videos a month. Open-sourced.
Five Claude Skills that turn a creative brief into a production-grade storyboard with model-specific image prompts, on-screen text specs, an HTML preview, and a versioned audit trail, plus a brand-lock extractor that onboards a brand from its existing assets. Built by WhyStrohm. Apache 2.0.
git clone https://github.com/whystrohm/shotkit.git
cd shotkit && ./install.sh
That installs all five skills into ~/.claude/skills/. Restart your Claude Code session and they're live.

Watch shotkit explain itself. The 90-second explainer was made by shotkit. The storyboard, shots.json, brand-lock snapshot, per-generator prompts, and rendered preview live at skills/storyboard-architect/examples/shotkit-explainer/. Full breakdown at whystrohm.com/blog/you-dont-have-a-content-problem.
The rendered video and the demo GIF above are from v0.1.0 and have not been re-cut: they show seven adapters including Runway/Sora, which was discontinued and replaced by the fal.ai motion lineup. The storyboard files beside them are current.
You describe a video. The kit produces a complete pre-production package:
output/
โโโ run.json # Run id + every input pinned by content hash
โโโ storyboard.md # Human-readable, shot-by-shot
โโโ shots.json # Schema-validated, machine-readable
โโโ text-overlays.json # On-screen text + timing
โโโ brand-lock.snapshot.md # Frozen brand state at generation time
โโโ prompts/round-1/ # Per-generator prompts, copy-paste ready
โ โโโ midjourney.txt
โ โโโ flux.txt
โ โโโ ideogram.txt
โ โโโ gpt-image.txt
โ โโโ nano-banana.txt
โ โโโ seedream.txt
โ โโโ kling.txt # Motion video (default)
โ โโโ veo.txt # Motion: dialogue/lipsync + native audio
โ โโโ seedance.txt # Motion: multi-shot sequences
โ โโโ hailuo.txt # Motion: budget iteration
โโโ frames/round-1/ # Your generated frames
โโโ critiques/round-1/ # One verdict per shot, hashing what it reviewed
โโโ preview.html # Single file. Shareable. Printable. Brand-aware.
Files. Not panels. Not a SaaS dashboard. Files an editor, agency, or developer can act on without asking follow-up questions.
Everything is addressed by round and shot, so no two writes land on the same path. Two people can work one project without overwriting each other's verdicts, and round 2 never destroys the prompt that produced round 1's frames.
| Skill | What it does |
|---|---|
brand-lock-extractor | Brand assets (URL / PDF / screenshots) โ validate-ready brand-lock.md |
storyboard-architect | Brief โ structured storyboard (storyboard.md + shots.json) |
visual-prompt-forge | Shot data โ model-specific prompts for 10 generators (6 stills, 4 motion) |
visual-asset-critic | Generated image + intent โ markdown critique + machine-readable critique.json |
storyboard-html-preview | Storyboard files โ single-file shareable HTML |
They work alone. They work better together, the critic writes a machine-readable verdict the prompt-forge can act on, so generate โ critique โ revise โ re-critique runs as a closed loop. See docs/the-qa-loop.md. They work in Claude Code, Claude.ai, and the Claude API.
Every storyboard tool on the market is a SaaS app with a UI you log into. You upload a brief, you get illustrated panels, you export. The output never leaves the platform.
That's not how serious teams work. Serious teams want:
shotkit is what we use internally at WhyStrohm to ship hundreds of videos from code. We're publishing the methodology because the methodology isn't the moat. The operator is.
Read more in docs/why-this-exists.md.
The category isn't empty. It's full of tools that solve the wrong half.
validate_provenance.py recomputes the hashes. A frame regenerated after its review fails that check instead of passing quietly on a stale ACCEPT.Drop this into a Claude Code session with the skills installed:
"30-second founder explainer for WhyStrohm. We help founder-led brands build content infrastructure instead of running content like a hobby. Pain-reframe-promise. Use
brand-packs/whystrohm.mdas the brand lock. Aspect 9:16."
Claude produces the full output/ set. Open output/preview.html in any browser. Print it. Share it. Hand it to an editor.
A complete worked example lives at skills/storyboard-architect/examples/30s-pain-proof-promise/. Clone the repo and open preview.html in that folder to see what the deliverable looks like.
The complete loop, idea to revised image:
storyboard-architect produces run.json, storyboard.md, shots.json, text-overlays.json, brand-lock.snapshot.md.visual-prompt-forge writes a prompt file per generator under output/prompts/round-1/.tools/copy-prompt.py pipes one shot's prompt to the clipboard. Paste into the generator UI.output/frames/round-1/shot_NN.png.visual-asset-critic scores the frame against the shot spec and brand-lock, writing critiques/round-1/shot_NN.critique.json with the hash of the frame, the prompt, and the brand-lock it judged.tools/validate_provenance.py re-checks every hash and reports which shots are still open.visual-prompt-forge revision mode re-emits prompts for only those shots into round-2/. On REJECT, it stops and asks: a REJECT means no fix path exists.--require-accept exits 0.python tools/validate_provenance.py output/ --require-accept || echo "work remains"
Files at every step. See docs/the-qa-loop.md for the full loop and
skills/visual-asset-critic/examples/worked-run/
for a real two-round output tree with hashes.
Four ideas. None negotiable.
1. Five-layer prompt anatomy. Every image prompt is composed from locked layers: Brand Lock, Series Lock, Shot Spec, Text Layer, Generator Adapter. Change a brand color once. Every prompt updates. See docs/the-five-layer-prompt.md.
2. Versioned brand state, pinned by hash. Every run snapshots the brand-lock it was built against and records its SHA-256 in run.json. Brand changes later? The snapshot stays frozen, and if someone overwrites it, the hash mismatch says so. A filename alone never proved anything, which is the whole reason the hashes are there. See docs/audit-trail-pattern.md.
3. Text never gets baked into images. On-screen copy is a separate layer with its own timing, font, and animation spec. Always composited after generation. AI text rendering is not production-ready in 2026; treat text as a separate compositing pass.
4. Per-shot rationale. Every shot has a rationale field. Why this beat. Why this duration. Why this framing. Why this on-screen text. Decisions are logged so they can be challenged.
A brand pack is a single Markdown file that locks palette, typography, voice, and visual rules for a project. Three live in this repo:
brand-packs/_template.md. Empty starter.brand-packs/whystrohm.md. Flagship example, real WhyStrohm brand.brand-packs/examples/saas-clean.md. Neutral B2B SaaS reference.Roll your own from the template. Or generate one from existing brand assets with media-tsunami, WhyStrohm's open-source brand voice extractor.
See brand-packs/README.md for the full pattern.
shotkit produces specs and prompts, not rendered images or videos. The boundary is deliberate:
If you want the version where this is wired into a video render pipeline with automated publishing across multiple brands: whystrohm.com. The methodology is open. The operator is paid.
See docs/connecting-to-generators.md for how teams typically wire it up themselves, and docs/connecting-to-video-pipelines.md for how shots.json maps to programmatic video frameworks.
shotkit is one stage in a longer content infrastructure pipeline:
visual-asset-critic reviews each generated frame against its shot spectext-overlays.jsonshotkit owns step 2. Steps 3 through 7 are file boundaries, not API integrations. Each downstream tool reads files. Nothing is coupled beyond the schema.
For wiring it up yourself, see docs/connecting-to-generators.md and docs/connecting-to-video-pipelines.md. For the operated version, whystrohm.com.
shotkit is part of a broader WhyStrohm open-source ecosystem of brand-infrastructure tools:
The voice tools and shotkit compose. Brand voice extracted via media-tsunami feeds shotkit's brand-pack files for end-to-end brand consistency.
For the operated version of the full pipeline, see whystrohm.com.
.skill zip uploads. See docs/claude-ai-workflow.md../install.sh. See docs/claude-code-workflow.md.Tested against Claude Opus 4.7 and Claude Sonnet 4.6.
v3.0.0 makes the audit trail checkable: content hashes on every input and reviewed frame, an output tree addressed by round and shot so concurrent work cannot overwrite itself, and validators that run against a real project instead of only against the repo. See the changelog. Still on the roadmap:
storyboard-html-preview for client review and agency handoff.run.json records what was built and reviewed, not who signed it off. Approver identity and timestamp is the missing link for regulated handoffs.one-shot-all-adapters/ covers the six stills generators plus Kling; Veo, Seedance, and Hailuo have prompt examples in their adapter files but no side-by-side entry.If any of these are blocking for you, open an issue. Real use cases jump the queue.
PRs welcome for:
skills/visual-prompt-forge/adapters/)skills/storyboard-architect/references/beat-frameworks.md)brand-packs/examples/)Open an issue first for anything that changes the file schemas. Run the checks locally before opening a PR:
pip install pyyaml jsonschema
./tools/check.sh
That is the same entry point CI runs, so green locally means green on the PR. It covers frontmatter, schemas, capability-to-adapter parity, brand-locks, storyboard instances, the critique gate, the provenance chain, and both shipped tools.
New checks need a --selftest that constructs a failing fixture and proves the check catches
it. A validator nobody can see fail is a validator nobody should trust. See
tools/README.md.
Apache 2.0. See LICENSE.
Yuri Strohm. Motion Design and Narrative Visualization Specialist, founder of WhyStrohm. A decade of defense-adjacent design work informs how I build content systems: deterministic, auditable, no surprises.
If you want the version where this is wired into a programmatic video pipeline with automated publishing: whystrohm.com.
.archive/
HANDOFF.md
README.md
.gitattributes
.github/
ISSUE_TEMPLATE/
brand-pack-request.md
bug.md
workflows/
validate-skills.yml
.gitignore
AUDIT-v2.md
brand-packs/
_template.md
examples/
saas-clean.md
README.md
whystrohm.md
CHANGELOG.md
docs/
audit-trail-pattern.md
brand-lock-anatomy.md
claude-ai-workflow.md
claude-code-workflow.md
connecting-to-generators.md
connecting-to-video-pipelines.md
images/
demo.gif
shotkit-explainer-vertical.mp4
shotkit-explainer.mp4
social-preview.png
the-five-layer-prompt.md
the-qa-loop.md
why-this-exists.md
install.sh
LICENSE
README.md
remotion/
package-lock.json
package.json
README.md
remotion.config.ts
render.sh
src/
index.ts
Root.tsx
ShotkitDemo.tsx
ShotkitExplainer.tsx
SocialPreview.tsx
tokens.ts
tsconfig.json
skills/
brand-lock-extractor/
examples/
brand-lock.md
input-brief.md
references/
extraction-rubric.md
SKILL.md
templates/
brand-lock.md.tpl
storyboard-architect/
examples/
30s-pain-proof-promise/
brand-lock.snapshot.md
preview.html
run.json
shots.json
storyboard.md
text-overlays.json
60s-founder-explainer/
brand-lock.snapshot.md
preview.html
run.json
shots.json
storyboard.md
text-overlays.json
shotkit-explainer/
brand-lock.snapshot.md
preview.html
run.json
shots.json
storyboard.md
text-overlays.json
references/
beat-frameworks.md
on-screen-text.md
shot-grammar.md
timing-rules.md
SKILL.md
templates/
run.schema.json
shots.schema.json
storyboard.md.tpl
text-overlays.schema.json
storyboard-html-preview/
SKILL.md
templates/
preview.html.tpl
print.css.tpl
styles.css.tpl
visual-asset-critic/
examples/
critique.accept.json
critique.revise.json
worked-run/
brand-lock.snapshot.md
critiques/
round-1/
shot_01.critique.json
shot_02.critique.json
round-2/
shot_02.critique.json
frames/
round-1/
shot_01.png
shot_02.png
round-2/
shot_02.png
preview.html
prompts/
round-1/
flux.txt
round-2/
revised-flux.txt
run.json
shots.json
text-overlays.json
references/
critique-rubric.md
SKILL.md
templates/
critique.schema.json
visual-prompt-forge/
adapters/
_capabilities.json
capabilities.schema.json
flux.md
gpt-image.md
hailuo.md
ideogram.md
kling.md
midjourney.md
nano-banana.md
seedance.md
seedream.md
veo.md
examples/
one-shot-all-adapters/
flux.txt
gpt-image.txt
ideogram.txt
kling.txt
midjourney.txt
nano-banana.txt
README.md
seedream.txt
references/
consistency-locks.md
failure-modes.md
prompt-anatomy.md
SKILL.md
tools/
_shotkit.py
_template.py
check.sh
copy-prompt.py
README.md
shots-to-html.py
validate_brand_lock.py
validate_capabilities.py
validate_critique.py
validate_prompts.py
validate_provenance.py
validate_schemas.py
validate_shots.py
validate_skills.pyยฉ 2026 Flowy ยท Free and open source
Built for Claude Code ยท Not affiliated with Anthropic