A Visual Bible in VidFlow is one row per project plus two child tables. It's the thing that decides whether your scenes look like the same video or six different short films stitched together. The approval gate before anything downstream runs is deliberate — bad reference art will haunt every shot it appears in.
Auto-extract from script. Once your script is approved, the LLM reads each chapter and pulls out every named character and named location. The extraction is conservative: a passing reference to 'a woman' doesn't become a character; 'Florentino Ameghino, the paleontologist' does. Locations work the same way — 'a city' doesn't, 'Buenos Aires, 1887' does.
Characters. Each named character gets a VisualBibleCharacter row with reference image URLs. The portrait is the primary front-facing reference. A multi-angle sheet covers different angles so shots from a profile or three-quarter view pull a matching reference. The row also carries a structured description (a JSON column — age, gender, build, height, and so on) that feeds generation prompts when the reference image alone is too brittle. Voice settings live separately: each VisualBibleCharacter links via characterId to the project-level Character model, and the optional voiceId for multi-voice narration lives on that Character row, not on the bible row.
Locations. VisualBibleLocation rows carry a base referenceUrl plus a child table of variations. Each variation is a different viewpoint, time of day, or weather state. A scene set in the same kitchen at golden hour vs. midnight pulls different variations rather than re-running the location through generation.
The combined character sheet. The single most important field for character consistency in long-form video. It's a composite image with every character at consistent scale on a uniform background. Multi-character shots pass it as a reference so the model doesn't drift on who's who. If you've ever wondered why character A morphs into character B halfway through a scene, this is the fix.
Style guide. The bible carries a styleGuide JSON — palette, composition rules, lighting notes. It applies as a soft constraint in every generation prompt for the rest of the project. Editable any time after generation: edit the JSON, new shots inherit immediately, old shots keep their original style unless you regenerate them.
Approval. This is the only stage we deliberately gate with a manual step. Once you click Approve, the bible is frozen for downstream generation. You can still regenerate individual characters or locations after approval; what's frozen is the contract that downstream shots reference these specific image URLs.
Parallel generation. Click 'Generate all' on either the Characters or Locations card and the work fans out — up to 3 concurrent calls per card, well under the generation rate limit. Mid-flight, completed assets surface as they land via a 4-second poll, so you don't sit watching nothing for 3 minutes per location while three variations generate sequentially behind a single response.
Cost. Each character is one image call. Each location is one base plus N variations. For a video with 4 characters and 3 locations with 3 variations each, you're looking at 4 + 3 + 9 = 16 image calls. KIE bills per call; the panel shows the cost preview before you trigger generation.
What it can't do yet. The bible is per-project, not per-channel. If you ship 30 videos with the same protagonist, you generate 30 portraits today. Channel-level bibles — shared assets across a creator's projects — are on the roadmap but not built. Workaround for now: save the character portraits manually after the first project and re-upload as reference in the next.
Approve only when you're happy. The five minutes you spend rerolling a portrait now save you regenerating a hundred shots later.