APNext H3 Scene Brief (manual scene)
Stop fighting the AI writer — plan the scene yourself
- briefs
The H3 multi-scene writers in this pack - Music Video, Crossover, Scenes - are great at one thing and terrible at another. Great at turning a rough idea into spec-compliant MiniMax-H3 prompts with shots, timestamps, dialogue and wardrobe locks. Terrible at knowing that you specifically wanted scene 3 to happen on the rooftop, Lena only, one slow push-in. That gap is exactly what H3SceneBrief is for: one node, one scene you plan by hand, handed to the writer as a binding brief.
And here's the part that should sell you on it: the node makes no LLM call, needs no API key, downloads no model. It's a text assembler. You type, it formats, the writer does the expensive thinking. The cost of being specific is exactly zero tokens on your side.
How it works
Each H3SceneBrief node builds one SCENE block - a plain-text plan with a description plus optional location, cast, pictures and camera fields. Chain several nodes through brief_in (same idea as how H3 Characters chain through cast_in) and wire the last node's briefs output into a writer's scene_briefs socket. The writer then treats each brief as the binding plan for that scene: it still writes the full production-ready H3 envelope - grammar, timestamps, wardrobe locks, lyric sync - but the content follows your brief. Scenes that have no brief stay the model's to invent. Nice division of labour.
The inputs you actually touch:
description- the only required one. What happens in this scene, in your words: the action, the beat, the image you want. Keep it concrete; the writer stages exactly this, adapted to the scene's duration and energy.scene_number- 0 (default) means unpinned: briefs fill scenes in chaining order, skipping any pinned ones. Set it to pin this brief to a specific scene (1 = first). This is how you say "whatever the model does elsewhere, scene 4 is this."location- where it's set. Matches or extends the writer's location lock, so a place you name here stays consistent.cast- who's on screen, comma-separated, using names from your cast (e.g.Lena, Sheldon). Empty = the writer decides.pictures- which reference pictures matter here, e.g.1orPicture 2 = the rooftop, use as the location.camera- an optional framing wish likeone slow push-in, no cuts.
Template variables ({character1}, {cast}) work inside every field, so a brief can refer to the character your H3 Characters node defined rather than you re-describing them.
The single briefs output is a STRING, not a list - chaining happens through brief_in, not by multi-wiring. Get that backwards and your scenes just won't show up in the writer.
Installing it
This ships in the dagthomas/comfyui_dagthomas pack ("SDXL Auto Prompter"). Easiest via ComfyUI Manager - search "comfyui_dagthomas" and install. Manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt
Then restart ComfyUI. The pack's requirements cover the LLM SDKs (openai, anthropic, google-genai, httpx) that the writers use - none of them apply to this node itself, since it never calls anything.
Gotchas
The writer still reinterprets your brief through the model. It won't quote you verbatim - it stages your scene within the H3 format, and lyric sync/energy for music-video runs will bend your wording. If you leave description and every field empty, the node just passes the chained list through unchanged, so a blank brief silently adds nothing. And remember: briefs shape scenes, but the writer still needs a model behind it (Claude Code CLI, an API key, or an Ollama backend) - this node alone doesn't generate anything.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| description | STRING | What happens in this scene, in your words - the action, the beat of the story, the image you want. The writer stages exactly this (adapted to the scene's duration, lyrics and energy). | |
| scene_numberopt | INT | 00–99 | Pin this brief to a specific scene/piece number (1 = first). 0 = unpinned: unpinned briefs fill scenes in chaining order, skipping pinned ones. |
| locationopt | STRING | Where the scene is set (matches or extends the location lock). | |
| castopt | STRING | Who is on screen, comma separated, using the names from your cast (e.g. `Lena, Sheldon`). Empty = the writer decides. | |
| picturesopt | STRING | Which reference pictures matter here, e.g. `1` or `Picture 2 = the rooftop, use as the location`. | |
| cameraopt | STRING | Optional camera / framing wish (e.g. `one slow push-in, no cuts`). | |
| brief_inopt | STRING | Chain from another H3 Scene Brief to build a list of scenes. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| briefs | STRING | — |