Getting started
theater.yaml contains the settings for one theater. Start with the generated defaults, then
change the values that fit your show.
Use spaces for indentation; YAML does not tolerate tabs. Restart an already-running theater session after saving configuration changes.
live_agent: special_instructions: "Keep the narration mysterious and concise." visuals: style: "rain-soaked art nouveau fantasy" story_planning: adventure_mode: true auto_begin: true style: "dangerous, fair, and player-agency-first"
live_agent
Controls the live narrator’s behavior and Gemini Live session options.
starting_image
Optional filename or alias for the first image shown on an otherwise blank canvas. The file must be an
image in the theater’s references directory. Matching tolerates spaces and punctuation; if no
match is found, Narratron logs a warning and leaves the canvas unchanged.
starting_image: "opening scene.jpg"
observability_tool
Optionally gives the narrator a tool to request an immediate canvas observation outside the regular observation cadence. When enabled, the model can use that observation to visually inspect the current canvas—such as the displayed scene, audience drawings, and other visible state—before continuing the story.
visuals
Shared rendering direction for images and animations. The image model is selected globally in
app.yaml; theaters customize the style and canvas pacing.
How the canvas visual queue works
Saved images, generated images, and animations share a queue in canvas state. The first visual appears immediately. Later ready visuals wait only for the current visual's remaining minimum screen time, then take turns in arrival order. Each source keeps its newest waiting visual: a replacement retains that source's queue position without discarding another source's work. With the three tool sources, at most three visuals wait. A timer runs only while the queue contains a waiting visual.
With an 8-second minimum, a visual ready after the current visual has been shown for 12 seconds appears immediately. If a generated image and an animation arrive 2 and 3 seconds after a new visual, they appear at 8 and 16 seconds respectively. Pinning the canvas clears the queue; an explicit orator image override clears waiting visuals and displays the requested image immediately.
image_generation
Controls whether the narrator can create still images. Disabling generation still lets the narrator browse and display images in the theater’s references directory.
The tool cooldown controls work admission; the canvas queue controls screen time. The default
9-second shared cooldown overlaps generation. Once ready, an image waits only for the current
visual's remaining screen time and any sources ahead of it in the queue. Long tool cooldowns
therefore often allow immediate display, without a fixed cycle tick adding latency. Reduce
cycle_length to shorten screen time during bursts; reduce the shared cooldown to
admit fresh requests sooner, at the cost of more generation.
animation
Enables narrator tools (create_animation and play_animation) to generate and
display loop-ready animated scenes on the canvas. Supports multiple animation techniques—including AI
text-to-video generation, depth-layered parallax, and 3-frame sequences—with automatic scene
classification or forced overrides.
Animation techniques & classification
When forced_technique is null (the default), an internal LLM analyzes the
narrator’s scene prompt and automatically chooses the best technique:
video: Chosen for cinematic, continuous motion or fluid natural action scenes (such as rushing rivers, billowing clouds, fluttering cloth, flying dragons, and atmospheric weather). Synthesizes an MP4 video clip.layered: Chosen for scenic vistas, atmospheric backdrops, or high-energy single-moment climaxes. Generates a base still and decomposes it into multi-plane depth layers with parallax motion using FAL Qwen Layered.triframe: Chosen for high-complexity motions and distinct narrative transitions. Generates a 3-frame sequence with clear action differences and smooth crossfades.
How the video technique works
The video technique provides full-motion cinematic scenes generated by AI text-to-video
models:
- Style inheritance & loop constraint: The video prompt automatically inherits the
theater’s global visual style from
image_generation.style. Aloopableconstraint is automatically appended (for example,Style: <style>, loopable) so the resulting clip visually matches still images and loops seamlessly. - Predictable pricing & app-controlled duration: Video clip duration is set and controlled globally at the application level (5 seconds) rather than configured per theater, keeping generation costs and credit pricing predictable and consistent.
- Model backend: Utilizes MiniMax H3 Max Turbo fast text-to-video generation via FAL
(
fal-minimax-h3-turbo) to synthesize fluid, high-fidelity MP4 footage. - Playback & canvas rendering: Videos are saved locally in the theater’s
animations/folder alongside avideo.jsonmanifest, and registered under image aliases (<animation_id>_videoand<animation_id>). The canvas and OBS overlay display them as auto-looping, muted HTML5 video elements with smooth crossfades into subsequent scenes.
Example: video animation configuration
animation: enabled: true cooldown_duration: 20 # Force all animations to use the video technique, or leave null for automatic classification forced_technique: "video"
interactive_canvas
Allows the narrator to build interactive A2UI surfaces—such as status cards, grids, and action buttons—on the canvas.
game_tool
This advanced feature is off by default. Build a game package in the theater editor or an IDE,
then explicitly enable live-agent play outside Adventure Mode with a valid game/game.yaml.
The existing game.yml and game.json alternatives are supported.
Triggering player actions prompt a live-agent response. The agent uses the package's Narratron actions and current revision. See Game Packages for the authoring contract.
music
Configures playback from theater playlists and optional AI-generated music.
notepad
Configures notepad_tool for normal narration. Adventure Mode uses
planning.yaml and ignores this section.
notepad:
max_stickies: 5
initial_stickies:
Current Scene: "The observatory"
required_stickies:
- Current Scene
hidden_stickies:
- Current Scene
story_planning
Defines the Adventure Mode planner: its durable story context, pacing, and optional NPC speech.
Example: durable adventure context
story_planning: adventure_mode: true auto_begin: true enforce_structured: true input_cycle_duration: 5 output_cycle_duration: 15 history_event_limit: 20 history_chunk_size: 10 style: "Tense science-fiction mystery; setbacks are fair and consequential." require_user_input: true
Keep sticky contracts in a separate planning.yaml. Every topic has one owner:
recorder for established facts or planner for contingent future developments.
Each fields entry contains string description and initial values; quote numeric and boolean values.
Omit render to display field: value | field: value in field order, or provide a custom template.
"Current Location":
owner: recorder
description: "Established location of the player."
initial: "Aboard the Starling"
"Upcoming Encounter Suggestion":
owner: planner
hidden: true
description: "One contingent obstacle or opportunity."
fields:
encounter:
description: "Next possible encounter"
initial: "A distress signal near the comet"
story_goal:
description: "Meaningful choice for the player"
initial: "Choose whether to investigate"
drama:
description: "Stakes grounded in established facts"
initial: "The ship is low on fuel"
Author three independent pinned guides: lore/RESPONDER.md for narration and action
resolution, lore/RECORDER.md for factual notes and validated game actions, and
lore/PLANNER.md for future plans. Each role can read only its own guide. Put shared
facts and mechanics in separate lore documents, with a roadmap in each guide.
speech
Controls speech synthesis delivery settings for Adventure Mode character voicing. The underlying TTS
provider and model are application-wide operational settings defined in app.yaml, which
override corresponding fields here.
Example: character speech delivery
speech: voice_language_code: "en-US" accent_augmentation: true
chat
Controls pacing for the narrator’s chat/status tool.