Blueprints & Templates
The video system has two layers: template modules (216 parameterized scene views) and blueprints (whole-video starters that assemble modules into a complete storyboard). Both live under web/remotion/.
The live system is web/remotion/
This is the shipping system. The retired v1 @dexian/templates / packages/templates/src/video/ 8-template system is not used — don't edit it.
Template modules
web/remotion/templates/modules/ — 216 modules, each a self-contained, data-driven scene view. Every module is a pair:
| File | Contains |
|---|---|
X.tsx |
The React/Remotion component (uses Remotion primitives: Sequence, Img, animation utils, …) |
X.module.ts |
A Zod schema for its props + metadata (contentSlots, requirements, aspect support) |
Modules cover nearly every marketing scene: hero splits, bullet/feature lists, stat holds, charts (bar, donut, stacked-area, gauge, progress-ring), device lockups, screenshot call-outs, comparisons, pyramids, org/mind-maps, Gantt/roadmaps, logo stings, outros, and full-bleed image/clip scenes.
Registry
web/remotion/templates/modules/index.ts— the auto-generated barrel: imports +ALL_MODULES[]web/remotion/document/registry.ts— buildsbyIdandrequireModule(templateId)(which exposes.schemafor validation)
Props are never auto-coerced — resolveBlueprint and the Director match props to schemas by hand, so min/max counts and shapes matter. The editor shows a live Zod validity badge per scene.
Media in modules
Components that show media use MediaPlaceholder from templates_backup/_shared/ (src + kind: "image" | "video"; a falsy src renders a dashed placeholder). Modules with real media slots include VideoSpotlight, DeviceLockup, AnnotatedScreenshot, ClickThroughFlow, BrowserMockup, and the full-bleed FullScreenImage / FullScreenClip (with caption + eyebrow overlay).
Blueprints (whole-video starters)
web/remotion/document/blueprints/ — a VideoBlueprint is a parameterized ResolvedIR: a seed storyboard whose scenes carry concrete props plus a few {{slot}} references (commonly brandColor) and may use "auto" durations.
type VideoBlueprint = {
meta: { id, title, description, category, aspect, goal };
schemaVersion: 1;
theme: { bg, surface, text, accent: "{{brandColor}}", … };
slots: Slot[]; // id, label, type: text|color|image|number|list, default
scenes: { id, templateId, props, durationInFrames, transitionOut }[];
};
resolveBlueprint(blueprint, overrides, audioDurations) (web/remotion/document/blueprint.ts):
- Replaces
{{slot}}references (whole-value for"{{key}}", string-substitution for embedded{{key}}) - Resolves
"auto"scene durations from voiceover length (@remotion/media-utils; fallback 150 frames) - Sets dimensions from aspect — 16:9 (1920×1080), 9:16 (1080×1920), 1:1 (1080×1080)
- Emits a concrete
ResolvedIR
Slot.type is one of text | color | image | number | list. There is no video slot type — media is just a path string; a module declares mediaKind to interpret it.
What ships
The registry web/remotion/document/blueprints/index.ts (BLUEPRINTS[]) wires up:
| Group | Count | Examples |
|---|---|---|
| Named blueprints | 17 | WhatsApp/conversational promo, SaaS launch, App promo, Dev API explainer, Marketing Studio, Webinar, Year-in-review, Hiring, Feature announce, Flash sale, Case study, Tech explainer, Brand manifesto, Onboarding tour, Competitor comparison, Social recap, Salesforce Assist |
| "More" collections | 51 | more.ts–more5.ts — investor pitch, roadmap, landing promo, league highlights, project plan, and many more, deliberately exercising less-used modules |
| Single-scene starters | per module | singleScenes.ts — one-scene starters generated from the module library, marked single: true |
That's ~68 whole-video blueprints plus single-scene starters. Root.tsx auto-maps every BLUEPRINTS[] entry to a Remotion <Composition>, so registering a blueprint requires no Root.tsx edit.
Authoring a new blueprint
- Create
web/remotion/document/blueprints/myThing.ts, modeled onmarketingStudio.tsorsaasLaunch.ts - Export a
VideoBlueprintand a resolvedir(callresolveBlueprint) - Register it in
blueprints/index.tsBLUEPRINTS[]({ docId, title, description, blueprint, ir }) - Match each scene's
propsto its module's Zod schema by hand (counts matter)
The Director's Analyst role also consumes the catalog (web/src/director/catalog.ts → shortlistBlueprints) to pick an anchor blueprint when planning a storyboard, so a well-described blueprint improves AI storyboarding too.
Authoring a new module
- Create
X.tsx(the view) andX.module.ts(Zod schema + metadata) undertemplates/modules/ - Hand-edit the barrel
templates/modules/index.ts(one import + oneALL_MODULESentry — there is no generator script) - Add a
presets/<Id>.jsonwith demo props (loadPresetsvalidates them against the schema) - Verify with
cd web && npm run typecheck(tsc --noEmit)
Aspect ratios
Every blueprint targets an aspect (16:9 / 9:16 / 1:1); modules declare which aspects they support. The editor and the Director can switch aspect (e.g. "Try 9:16"), and export can produce one-click variants in each supported aspect.