A real-time cue tracking and management system for live theatrical and broadcast productions. All views stay perfectly in sync via WebSockets — create and trigger cues while camera operators follow along on unique URLs for their specific cameras, and a global rundown keeps the entire crew on the same page.
![]() |
|---|
| Operator View |
![]() |
|---|
| Camera View |
- Backend: FastAPI (Python 3.11+)
- Database: SQLite with aiosqlite
- Real-time Communication: WebSockets
- Frontend: Vanilla HTML/CSS/JavaScript with Tailwind CSS
- Package Manager: UV
- Container Base: Alpine Linux with Python 3.13
- Pull the latest container:
podman pull ghcr.io/ssimpson89/cuesheet:latest
# or with Docker:
docker pull ghcr.io/ssimpson89/cuesheet:latest- Run with persistent storage:
podman run -d \
-p 8000:8000 \
-v ./data:/app/data \
--name cuesheet \
ghcr.io/ssimpson89/cuesheet:latest
# or with Docker:
docker run -d \
-p 8000:8000 \
-v ./data:/app/data \
--name cuesheet \
ghcr.io/ssimpson89/cuesheet:latest- Access the application at
http://localhost:8000
Note: The -v ./data:/app/data mount ensures your database persists between container restarts.
Building locally (for development):
podman build -t cuesheet:latest -f Containerfile .- Install UV (if not already installed):
curl -LsSf https://astral.sh/uv/install.sh | sh- Install dependencies:
uv sync- Build the CSS bundle (only needed when templates change):
npm install
npm run build:css # or: npm run watch:css (rebuild on change)The compiled static/output.css is committed to the repo, so this step is
optional for a quick run but required if you've edited any templates and
want the new Tailwind classes to appear.
- Run the server:
uvicorn app.main:app --reload- Access the application at
http://localhost:8000
The admin page is protected by password authentication to prevent unauthorized access.
- Password:
admin
Via Admin Page (Recommended):
- Log in to
/adminwith the default password - Navigate to the "Security & Authentication" section
- Enter a new password and confirm it
- Click "Change Password"
Via Database (Manual):
If you're locked out or need to reset the password manually, you can use the provided script or update the database directly:
Use the reset script
uv run python scripts/reset_password.pyThis will reset the password back to the default admin. The script automatically detects the database location (works in both development and container environments).
In a container:
# With podman:
podman exec -it cuesheet uv run python scripts/reset_password.py
# With docker:
docker exec -it cuesheet uv run python scripts/reset_password.pyBy default:
- Admin page: Always requires authentication
- All other pages: Open (operator, director, camera, overview)
You can lock individual pages or all pages at once from the admin interface:
- Log in to
/admin - Scroll to "Page Protection" section
- Toggle individual pages (Operator, Director, Camera, Overview) or use "Lock All Pages" for convenience
| Variable | Description | Default Value | Notes |
|---|---|---|---|
DB_PATH |
Database file location | /app/data/cuesheet.db (container)cuesheet.db (local) |
Path to SQLite database file |
BACKUP_DIR |
Backup files directory | backups |
Directory where database backups are stored |
BACKUP_COUNT |
Number of backups to retain | 10 |
Maximum number of automatic backups to keep |
OPENROUTER_API_KEY |
OpenRouter API key for AI features | (none) | Required for AI Assistant. Get from openrouter.ai/keys |
OPENROUTER_BASE_URL |
OpenRouter API base URL | https://openrouter.ai/api/v1 |
Can be overridden for custom endpoints |
Volumes:
/app/data: Database persistence directory
Ports:
8000: HTTP server
Health Check:
- Endpoint:
/health - Interval: 30s
- Verifies web server and database connectivity
CueSheet exposes a Model Context Protocol (MCP) server that allows AI assistants like Claude Desktop to interact with your cue system programmatically.
The MCP server provides 11 tools for managing cues and camera assignments:
Read Operations:
list_all_cues- Get all cues with camera assignmentsget_cue_details- Get detailed information about a specific cueget_current_state- Get the current playback statelist_cameras- List all cameras and their assignment counts
Write Operations:
create_cue- Create a new cueupdate_cue- Update an existing cue's text or notesdelete_cue- Delete a cue (renumbers subsequent cues)add_camera_assignment- Add or update a camera assignmentdelete_camera_assignment- Remove a camera assignment
Utility:
advance_to_cue- Navigate to a specific cue numberexport_to_csv- Export all cues and camera assignments to CSV
For Claude Desktop:
Edit your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Add the CueSheet MCP server:
{
"mcpServers": {
"cuesheet": {
"url": "http://localhost:8000/mcp",
"transport": "http"
}
}
}Restart Claude Desktop, and you can now ask Claude to interact with your cue system:
"List all cues in the cuesheet"
"Create a new cue with the line 'ALADDIN: One jump ahead'"
"Add camera 1 to cue 5 as a wide shot of the stage"
"Show me the current playback state"
For Other MCP Clients:
Point your MCP client to: http://localhost:8000/mcp
The server uses standard JSON-RPC over HTTP with these methods:
tools/list- Get all available toolstools/call- Execute a tool
Authentication:
The MCP endpoint requires the same authentication as the admin page. Include your session token in requests.
MIT

