Turn one topic into a production-ready short-form video pack — a locked story, then, for every scene, a Step 1 image prompt and a Step 2 video prompt, serialized into each model's official native format.
reelforge is an agentic (LangGraph +
Claude) engine. It plans the story, locks a Story Bible so characters never
drift, and emits an image-first production pack: a still for each scene, then
the image-to-video prompt that animates that exact still — chained scene to scene.
Why this design? A one-shot "make me a video prompt" script is easy to copy. A consistency-locked, per-scene, image-first pipeline that serializes to the real Nano Banana Pro / Seedance 2.0 grammar is the part that's hard to replicate — and it's deliberately the part kept in the open here. The premium prompt library (the tuning) stays private. See Safe by design.
flowchart LR
T([Topic]) --> P[Planner<br/>logline · hook · length]
P --> B[Story Bible<br/>lock characters · props · look]
B --> S[Scriptwriter<br/>hook → turn → cliffhanger]
S --> A[Assembler<br/>per-scene, image-first]
A --> O([Content Pack])
subgraph perscene [For every scene]
direction LR
I["Step 1 · IMAGE<br/>(Nano Banana Pro)"] --> V["Step 2 · VIDEO<br/>(Seedance 2.0)"]
end
A -.-> perscene
classDef agent fill:#1e293b,stroke:#7C3AED,color:#e2e8f0;
class P,B,S,A agent;
| Stage | Model / role | Output |
|---|---|---|
| Planner | Claude | logline, theme, audience, scroll-stopping hook, target length |
| Story Bible | Claude | locked characters (+ Soul ID), locations, props, look — the anti-drift contract |
| Scriptwriter | Claude | beat-arc storyboard (hook → setup → turn → rock bottom → cliffhanger) |
| Assembler | pure code | per scene: Step 1 image prompt + Step 2 video prompt, in native format |
For every scene the engine emits two steps, in order:
- Step 1 — IMAGE: a prompt that makes the scene's still (keyframe). Built from
the Story Bible and locked to an anchor hero still via
@image1, so the face, hair and wardrobe are identical scene after scene. - Step 2 — VIDEO: an image-to-video prompt that animates that still — motion
and one camera move only, never re-describing the image — and chains from the
previous clip (
Extend @video1) so the whole story flows.
Consistency comes from the Bible (pulled verbatim into every Step 1) + the anchor reference; story logic comes from beat order + clip chaining.
The same structured scene serializes into each model's official grammar:
| Step | Model | Native format |
|---|---|---|
| Image | Nano Banana Pro (default) | natural-language 5-pillar, @image1 identity lock, never JSON |
| Image | Soul Cinema | Soul ID + tight prose + real camera/lens |
| Video | Seedance 2.0 (default) | I2V: motion + one camera move, positive constraints, Total: Ns / 1 shot / 9:16 footer |
| Video | Kling 3.0 | I2V with a real negative-prompt field |
Image and video each have two interchangeable targets — pick one per run with --image-model / --video-model (defaults in bold).
# Python 3.10+
pip install -e ".[dev]"
cp .env.example .env # add ANTHROPIC_API_KEY
reelforge "A barista discovers the cafe is laundering money" --scenes 5 -o out/pack.jsonNo key yet? The pipeline still proves itself — the serializers and the per-scene assembly are pure and deterministic:
python examples/build_sample.py # writes examples/sample_pack.{json,md} — no API neededSee examples/sample_pack.md for a full generated pack (a 5-scene betrayal story: anchor still → per-scene Step 1/Step 2 → chained clips).
Choose models per run:
reelforge "topic..." --image-model soul_cinema --video-model kling_3_0This is a public portfolio repo, built so the work can't simply be lifted:
- The engine is open; the tuning is not.
prompts/sample/ships generic templates so it runs end-to-end. The production library (viral-structure frameworks, per-niche tuning, persona/brand-voice configs) is proprietary and loaded only from a privateREELFORGE_PROMPTS_DIR. Seeprompts/README.md. - Restrictive license. Source-available under PolyForm Noncommercial 1.0.0 — look, learn, evaluate; no commercial use or resale.
- Provenance. Public commit history under the author's name is the record that this work is original and whose it is.
src/reelforge/
config.py # env-driven settings (nothing secret hard-coded)
schema.py # Pydantic contract: ContentPack / Scene / StoryBible / Image+Video prompts
llm.py # Claude helper — adaptive thinking + robust JSON extraction
prompts.py # prompt loader (private dir → sample → in-code default)
serializers.py # Scene → native prompt (Nano Banana Pro / Soul Cinema / Seedance / Kling)
state.py # LangGraph state
nodes.py # plan / story bible / script / assemble
graph.py # graph assembly + run()
render.py # ContentPack → readable markdown
cli.py # `reelforge "<topic>"`
prompts/sample/ # generic, shippable templates (the moat stays private)
examples/ # build_sample.py + a committed, no-API content pack
tests/ # pure serializer + schema tests (run in CI)
Source-available under PolyForm Noncommercial 1.0.0. Copyright © Daniel Enache.


