Backlot Living Storyboard: Real-Time Production Visibility in OpenMontage
The Backlot Living Storyboard is a read-only visual dashboard in OpenMontage that aggregates pipeline state from the projects/<id>/ directory, serving live updates via Server-Sent Events to show exactly where your video production stands.
The Backlot Living Storyboard provides producers and developers with a defensive, non-destructive window into OpenMontage video production pipelines. Unlike tools that modify project state, this board interprets existing files from the projects/ folder and refreshes automatically as the pipeline progresses. It serves as the visual front-end for monitoring stages, assets, and automation health without ever writing to your project directory.
Architecture of the Backlot Living Storyboard
Read-Only Defensive Design
The board operates as a strictly read-only observer. According to backlot/README.md, it never writes to a project directory; it only interprets files that the pipeline produces. When encountering malformed JSON or missing assets, the system degrades gracefully rather than failing, ensuring that observability never interferes with production work.
Live Data Sources
All data derives from the projects/<id>/ folder structure. The system continuously reads:
- Project markers and checkpoints
scene_plan,script, andasset_manifestfiles- Recent event logs (
events.jsonl) - Media renders, snapshots, and music files
Real-Time Updates via Server-Sent Events
The File System Watcher
In backlot/server.py, a background watchfiles watcher monitors the project folder. When it detects filesystem changes, it invalidates the cached project summary and publishes the project ID to all subscribers via Server-Sent Events (SSE) on the /api/project/{id}/events endpoint.
Client-Side Refetching
The frontend subscribes to the SSE stream at /api/project/{id}/events. When the browser receives a change message type, it immediately refetches the current state from /api/project/{id}/state and redraws the storyboard. This push-based mechanism exposes new assets, updated stage statuses, and ongoing tool events without polling overhead.
Building the Board State: load_board_state() Deep Dive
The load_board_state() function in backlot/state.py assembles the complete board representation by aggregating disparate pipeline artifacts.
Stage Rail Construction
The function builds the stage rail from the pipeline manifest (or a fallback list), parsing the current status of each production stage to create the horizontal timeline view.
Storyboard Assembly
It constructs the storyboard by joining scene_plan, script, and asset_manifest files together with live events from the event log. This creates a unified view of the narrative flow alongside production metadata.
Live Flags and Media Discovery
The system discovers media including renders, snapshots, and music files, then adds live flags (live, stalled, generating) based on recent filesystem activity tracked in events.jsonl.
Pipeline Health Detection
Stall Detection
If a stage remains in_progress longer than the configured stall window of 10 minutes, backlot/state.py flags it as stalled. This exposes potentially wedged agents requiring manual intervention or debugging.
Generation Markers
Scenes actively being processed are marked with generating: true based on the most recent start events in events.jsonl, giving immediate visibility into exactly where the automation is currently working.
Practical Implementation: Launching and Querying the Board
Launch the Backlot server from the repository root:
# Launch the server and open the browser
python -m backlot open
# Run the server in the foreground on a specific port
python -m backlot serve --port 4750
Query the live board state programmatically using the Python API:
from backlot.state import load_board_state
from lib.paths import PROJECTS_DIR
project_dir = PROJECTS_DIR / "my-demo-project"
state = load_board_state(project_dir)
print("Current stage:", [s["name"] for s in state["stages"]
if s["status"] in ("in_progress", "awaiting_human")][0])
print("Storyboard scenes:", len(state["storyboard"]["scenes"]))
Consume the HTTP API for external integrations or debugging:
# Get the JSON representation of the board
curl http://localhost:8000/api/project/my-demo-project/state
# Listen for real-time change events (SSE)
curl -N http://localhost:8000/api/project/my-demo-project/events
Implement frontend updates with the EventSource API:
const evtSource = new EventSource(`/api/project/${projectId}/events`);
evtSource.onmessage = e => {
const payload = JSON.parse(e.data);
if (payload.type === 'change') {
fetch(`/api/project/${projectId}/state`).then(r => r.json()).then(renderBoard);
}
};
Summary
- The Backlot Living Storyboard provides read-only visibility into OpenMontage video production pipelines, ensuring zero interference with project files.
- Real-time updates flow through Server-Sent Events powered by a
watchfileswatcher inbacklot/server.pythat monitors theprojects/<id>/directory for changes. - The
load_board_state()function inbacklot/state.pyconstructs the complete board by joining scene plans, scripts, asset manifests, and live event logs fromevents.jsonl. - Stall detection automatically flags stages stuck
in_progressfor over 10 minutes, while generation markers indicate active scene processing based on recentstartevents. - Developers can consume state via the Python API, HTTP endpoints, or subscribe to live SSE streams for instant UI updates.
Frequently Asked Questions
What makes the Backlot Living Storyboard "read-only"?
The board never writes to the project directory. As implemented in backlot/state.py, it only interprets existing files produced by the pipeline, making it impossible for the observability layer to corrupt or modify production assets. This defensive design ensures that visualizing progress cannot accidentally alter it.
How does the board handle missing or corrupted files?
The defensive architecture specified in backlot/README.md ensures the board degrades gracefully. When encountering malformed JSON or missing assets, the system continues operating and displays available data rather than crashing, maintaining visibility even during partial pipeline failures.
What triggers a real-time update in the browser?
The watchfiles watcher in backlot/server.py detects filesystem changes in projects/<id>/, invalidates the cached summary, and publishes a change event via SSE to /api/project/{id}/events. The browser client receives this push notification and refetches the full state from /api/project/{id}/state to redraw the interface.
How does stall detection identify wedged pipeline agents?
If load_board_state() in backlot/state.py finds a stage with in_progress status lasting longer than the 10-minute stall window (tracked via timestamps in events.jsonl), it sets the stalled flag on that stage. This exposes agents that may have crashed or deadlocked, requiring manual intervention or debugging to clear the pipeline blockage.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →