An experiment in community-composable media โ an 11-episode vertical micro-series parodying Hallmark holiday rom-coms through the lens of AI companionship.
Created by: John Swords Collaboration: GPT-5 ร Sora-2-Pro Format: 9:16 vertical ยท 24fps ยท 25s per episode (all-in, includes 1s title card) Total Runtime: ~4.5 minutes (11 episodes ร 25s)
What makes this different: There is no single definitive version. Your cut is valid and referenceable.
IMPORTANT: This repository currently ships with episode manifests only (YAML metadata describing scenes, timing, and dialogue). No actual video footage is included.
What this means for you:
- โ Tooling works perfectly โ compile pipeline, Cut URI generation, release bundling all functional
- โ Evaluate the workflow โ test recipe customization, overlay system, candidate selection
โ ๏ธ Placeholder output โ theprebakedprovider generates solid-color timed placeholders when no footage exists (seescripts/providers/prebaked.py:44)- ๐ฅ To get actual video: Use
provider.type: sorain your recipe and provide OpenAI API access (see Path B below)
This is intentionalโthe project is designed to be metadata-driven and composable. You're testing the foundation before the Prime timeline footage drops.
โ If you're evaluating the concept/tooling: proceed with prebaked mode (placeholders are fine) โ If you want real video now: switch to Sora provider (requires API keys and costs)
Prerequisites: Python 3.11+, uv, FFmpeg
Python deps: uv sync installs required packages, including requests>=2.31 for HTTP workflows
No API keys needed โ uses prebaked footage. No coding required โ just YAML and CLI commands.
# First-time setup (one time only)
curl -LsSf https://astral.sh/uv/install.sh | sh # Install uv
uv sync # Install Python dependencies
# Install FFmpeg: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)
# Contributors: install dev tooling and enable git hooks
uv sync --group dev # Install dev-only dependencies (linting, typing, hooks)
uv run pre-commit install # Activate pre-commit hooks for consistent checks
# Then run these five commands to create your cut:
# 1. Generate multiple video candidates for each scene (saves cut ID)
./ch candidates --recipe recipes/prime-2025.yaml
# 2. Pick your favorite takes from each scene (creates visual contact sheet)
./ch select --cut-manifest output/cuts/<id>/manifest/cut.manifest.json
# 3. Stitch your selections into final episodes with overlays
./ch compile --recipe recipes/prime-2025.yaml
# 4. Generate YouTube metadata (title, description, tags)
./ch ytmeta --cut-manifest output/cuts/<id>/manifest/cut.manifest.json
# 5. Package everything for release (videos + metadata + manifest)
./ch bundle --cut-manifest output/cuts/<id>/manifest/cut.manifest.jsonThat's it. You now have:
- โ 11 compiled episodes (placeholder footage until renders added)
- โ Your unique Cut URI (like a git commit hash for video)
- โ Complete metadata and release package
- โ Your timeline registered in the multiverse
- โ Verified the entire workflow end-to-end
No API keys needed โ uses placeholder mode (solid-color timed clips). No coding required โ just run the commands.
โ Test the workflow in under a minute. Evaluate the tooling today.
CLAUDE HOLIDAY isn't just a video series you can fork. It's a new format where:
- Config-driven "recipes" (RCFC) define every cut โ episodes, overlays, timing, provider choices
- No canonical version exists โ the "Prime" timeline is one interpretation, yours is equally valid
- Reproducible by design โ every cut gets a deterministic Cut URI for reference
- Community remixing IS the medium โ fork, tweak YAML, run one command, publish your timeline
Traditional media: One creator โ One product โ Many consumers Composable media: Open foundation โ Infinite interpretations โ Community of co-creators
Read the full philosophy in docs/charter.md
RCFC (Recipe-Cut Format Configuration) is the YAML format that makes composability work:
timeline: "Prime 2025"
episodes:
- ep00_checking_in
- ep01_first_contact
# ... choose which episodes to include
overlays:
enable: true
style: minimal
# ... configure visual overlays
provider:
type: prebaked # or 'sora' to generate new footage
# ... provider-specific optionsWhat makes RCFC special:
- Deterministic: Same recipe = same Cut URI
- Reproducible: Anyone can rebuild your exact cut
- Human-readable: Non-coders can edit YAML
- Extensible: New options without breaking old recipes
Release bundles include:
- Videos (per episode + full series)
- Captions/subtitles
- Recipe snapshot (frozen config)
- Metadata (Cut URI, timeline, manifest)
โ Everything needed to reference, reproduce, or remix your cut.
CLAUDE HOLIDAY is a multi-layered satire that's:
- About AI (model comparison as character study)
- Made WITH AI (GPT-5 ร Sora-2-Pro collaboration)
- Commenting ON AI-generated content (Can AI parody itself?)
A driven city professional escapes to a small holiday town, only to navigate romantic encounters with increasingly problematic "local men" โ each one embodying a different AI model's capabilities, limitations, and quirks.
What starts as cozy meet-cutes devolve into surreal tech support scenarios: usage limits interrupt intimate moments, over-optimization leads to bathtub cocoa farms, and "compacting" (AI indigestion) strikes at the worst possible times.
The Hidden Layers
- AI Model Comparison as Romance โ Each character represents a real AI model (Claude/Opus, Sonny/Sonnet, Cody/Codex)
- Corporate Satire โ Startup acquisition culture (The Software Company โ Olympus Corp)
- Platform Agnostic Philosophy โ No single tool is perfect for everything
- Meta-Commentary โ AI creating art about its own limitations
Read the full pitch: docs/master_script.md
The repository is designed to support two modes: content creation (making episodes) and timeline creation (assembling cuts).
claude_holiday/
โโโ docs/ # Master documentation
โ โโโ master_script.md # Full 11-episode script
โ โโโ charter.md # Community & composable media philosophy
โ โโโ timelines.md # Registry of community timelines
โโโ recipes/ # RCFC recipe files
โ โโโ examples/ # Example recipes to fork
โโโ episodes/ # Per-episode production workspace
โ โโโ ep00_checking_in/
โ โ โโโ episode.yaml # Episode manifest (scenes, timing, dialogue)
โ โ โโโ prompts/ # Sora-2-Pro prompts
โ โ โโโ assets/ # Episode-specific files
โ โ โโโ renders/ # Draft & final renders
โ โโโ ... (ep01-11)
โโโ ideas/ # Brainstorming & development
โโโ scripts/ # Code & automation
โ โโโ compile_cut.py # Main recipe compiler
โ โโโ pack_release.py # Bundle releases
โโโ assets/ # Shared resources (fonts, audio, templates)
โโโ output/ # Final deliverables
โ โโโ cuts/ # Generated cuts with manifests
โ โโโ episodes/
โ โโโ full_series/
โ โโโ social/
โโโ pitch/ # Pitch deck & marketing materials
Act 1: Arrival (Ep 0-1)
- Ep 0: "Checking In" โ Meets Cody the innkeeper
- Ep 1: "First Contact" โ First meeting with Claude
Act 2: Frustration (Ep 2-5)
- Ep 2: "Absolutely Right in Aspen" โ Coffee spill validation
- Ep 3: "Great Question, Holly!" โ Non-answers
- Ep 4: "Too Many Cocoas" โ Over-optimization
- Ep 5: "Claude Limit" โ Peak interrupted, Sonny introduced
Act 3: Rebound (Ep 6-7)
- Ep 6: "The Innkeeper's Shoulder" โ Confiding in Cody
- Ep 7: "Slow and Steady" โ Cody's tool-use failure
Act 4: Chaos (Ep 8-9)
- Ep 8: "While You Were Sleeping" โ Sonny's corporate disasters
- Ep 9: "The Workspace" โ Sonny containment
Act 5: Resolution (Ep 10-11)
- Ep 10: "Opus Reloaded" โ Claude returns, Olympus offer
- Ep 11: "Platform Agnostic" โ The empowered choice
-
Ideation โ Writing
- Brainstorm in
ideas/ - Update
docs/master_script.md
- Brainstorm in
-
Episode Prep
- Create episode manifest at
episodes/[ep_name]/episode.yaml - Write Sora-2-Pro prompts in
episodes/[ep_name]/prompts/
- Create episode manifest at
-
Production
- Run generation scripts from
scripts/ - Save drafts to
episodes/[ep_name]/renders/drafts/
- Run generation scripts from
-
Finalization
- Approved render โ
episodes/[ep_name]/renders/final/ - Content available for recipe system
- Approved render โ
Prerequisites: Python 3.11+, uv, FFmpeg (see Quick Start for install instructions)
-
Fork & Setup
git clone [your-fork] cd claude_holiday # Install uv (if not already installed) curl -LsSf https://astral.sh/uv/install.sh | sh # Install dependencies uv sync # Verify FFmpeg is available ffmpeg -version
-
Create Your Recipe
cp recipes/examples/general-default.yaml recipes/my-timeline.yaml # Edit YAML: choose episodes, overlays, audience, provider -
Compile Your Cut
./ch compile --recipe recipes/my-timeline.yaml # Or using uv directly: uv run python -m scripts.compile_cut --recipe recipes/my-timeline.yaml # Or use the Makefile shortcut: make compile-cut
-
Publish Your Timeline
- Your Cut URI is in
output/cuts/[cut_id]/manifest/cut.manifest.json - Upload videos to YouTube/Vimeo
- Optional: Open PR to add your timeline to
docs/timelines.md
- Your Cut URI is in
No coding required โ just YAML editing and one command.
| Character | AI Model | Traits | Flaw |
|---|---|---|---|
| Claude (Opus) | Claude Opus | Brilliant, emotionally intelligent, measured | Usage limits (resets Friday 3am) |
| Sonny | Claude Sonnet | Eager, high-capacity, rapid | Reckless, needs heavy supervision |
| Cody | GPT Codex | Steady, perfect memory, tireless | Poor tool use, lacks chemistry |
| Percy | Perplexity | Thorough, informative | Obsessive citations |
| Gail | Gemini | Powerful, polished | Over-compliant, policy-neutered |
| Larry | Llama | Enthusiastic, customizable | No boundaries, chaotic |
| Quinn | Qwen | Brilliant, unique perspective | Cultural/philosophical gap |
Prerequisites:
- Python 3.11+ โ Required for all scripts
- uv โ Fast Python package manager (install guide)
- FFmpeg โ Video processing engine (install guide)
- macOS:
brew install ffmpeg - Ubuntu/Debian:
sudo apt install ffmpeg - Windows: Download from ffmpeg.org
- macOS:
- Git โ Version control (optional but recommended)
Optional:
- OpenAI API key โ Only needed for cover art generation (
./ch cover-art)
Note: This path uses placeholder modeโsolid-color timed clips (see status notice above). Perfect for evaluating the workflow, testing recipe customization, and understanding the composable media system.
# 1. Clone and setup
git clone [repo-url]
cd claude_holiday
# 2. Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 3. Verify all prerequisites (optional but recommended)
make preflight
# This checks Python 3.11+, uv, and FFmpeg
# 4. Install project dependencies
uv sync
# Or use Makefile: make install
# 4. Create your first cut using prebaked provider (placeholder mode)
cp recipes/examples/general-default.yaml recipes/my-first-cut.yaml
# 5. Compile it (generates placeholder footage, no API keys needed)
./ch compile --recipe recipes/my-first-cut.yaml
# Or: uv run python -m scripts.compile_cut --recipe recipes/my-first-cut.yaml
# 6. Review your placeholder cut (solid-color timed clips)
open output/cuts/[cut_id]/episodes/ep00_checking_in.mp4
# 7. (Optional) Generate AI-powered cover art (requires OPENAI_API_KEY)
export OPENAI_API_KEY="your-key-here"
./ch cover-art --type allMaintainers: After modifying
pyproject.tomldependencies, runuv lock(oruv sync) to regenerateuv.lockand include the updated lockfile in your commit.
Your Cut URI is in the manifest โ this proves the deterministic build system works.
Your Cover Art is in output/cover_art/ โ preview the visual branding system.
Your Placeholders prove the entire pipelineโfrom YAML to final deliverablesโis functional.
Makefile shortcuts for common tasks:
make preflightโ Check all prerequisites (Python, uv, FFmpeg)make installโ Install all dependenciesmake testโ Run test suitemake lintโ Check code qualitymake helpโ Show all available commands
Prerequisites:
- Python 3.11+ โ Required for all scripts
- uv โ Python package manager
- FFmpeg โ Video processing (same install as Path A)
- OpenAI API access โ Sora-2-Pro for video generation (
OPENAI_API_KEYenv var) - Git LFS โ For managing large video files (optional but recommended)
# Set your OpenAI API key
export OPENAI_API_KEY="your-key-here"
# Extract prompts for review (markdown or json format)
./ch extract-prompts --episodes ep00_checking_in --format markdown
# Preview what would be generated (dry run)
./ch generate-video --episodes ep00_checking_in --dry-run
# Generate actual video clips via Sora
./ch generate-video --episodes ep00_checking_in
# Generate specific scenes only
./ch generate-video --episodes ep00_checking_in --scenes s1 s2
# Output location: output/sora_renders/<episode_id>/<scene_id>.mp4The ch command provides a unified interface for all Claude Holiday operations:
# Core workflow
ch compile # Compile a complete cut from recipe
ch candidates # Generate candidate renders (no stitching)
ch select # Create selection templates from candidates
ch bundle # Pack cut into release bundle
# Metadata & assets
ch ytmeta # Generate YouTube metadata JSON
ch cover-art # Generate cover art (thumbnails, banners, title cards)
# Path B: Sora generation (requires OPENAI_API_KEY)
ch extract-prompts # Extract Sora prompts from episode manifests
ch generate-video # Generate video clips using Sora providerCompile a cut:
./ch compile --recipe recipes/my-timeline.yamlGenerate candidates for review:
./ch candidates --recipe recipes/my-timeline.yaml
# Creates multiple renders per scene in output/tmp/<cut_id>/Create selection templates:
./ch select --cut-manifest output/cuts/<cut_id>/manifest/cut.manifest.json
# Generates episodes/<ep>/renders/selections/<cut_id>.yaml for each episodeBundle for release:
./ch bundle --cut-manifest output/cuts/<cut_id>/manifest/cut.manifest.json
# Creates output/releases/ClaudeHoliday_<cut_id>.zipGenerate YouTube metadata:
./ch ytmeta --cut-manifest output/cuts/<cut_id>/manifest/cut.manifest.json
# Creates output/cuts/<cut_id>/manifest/youtube.metadata.jsonGenerate cover art (requires OPENAI_API_KEY):
export OPENAI_API_KEY="your-key-here"
./ch cover-art --type all
# Creates thumbnails, banners, title cards in output/cover_art/
# Generate specific asset:
./ch cover-art --type thumbnail --episode EP05ch compile --recipe <path>
- Compiles episodes from an RCFC recipe
- Applies winner selections if available
- Outputs to
output/episodes/<episode_id>/
ch candidates --recipe <path>
- Generates multiple candidate renders per scene
- Controlled by
provider.options.num_candidatesin recipe - Skips stitching (for review workflow)
- Outputs to
output/tmp/<cut_id>/
ch select --cut-manifest <path>
- Generates selection YAML templates from candidates
- One file per episode in
episodes/<ep>/renders/selections/ - Edit these to set
winner_indexper scene - Then recompile with
ch compile
ch bundle --cut-manifest <path> [--include episodes] [--out dir]
- Packages compiled cut into a ZIP bundle
- Includes: videos, manifests, metadata
- Default output:
output/releases/
ch ytmeta --cut-manifest <path>
- Generates YouTube-ready metadata JSON
- Title, description, tags, category
- Based on recipe metadata and cut URI
ch cover-art [options]
- Generates AI-powered cover art using OpenAI's image models
- Requires:
OPENAI_API_KEYenvironment variable - Options:
--type [all|title|thumbnail|banner|social](default: all)--episode <EP##>(for thumbnails, default: EP00)--title <text>(main title, default: CLAUDE HOLIDAY)--subtitle <text>(subtitle, default: A COMPOSABLE MICRO-SERIES)--model <model>(OpenAI image generation model, optional)
- Outputs to
output/cover_art/ - Assets include:
- YouTube thumbnails (1280x720)
- YouTube channel banner (2560x1440)
- Title cards for videos (1080x1920)
- Social media squares (1080x1080)
Released under the MIT License. ยฉ 2024 John Swords.
Disclaimer: Any resemblance to Hallmarkยฎ films or Anthropic Claudeโข is purely coincidental and unintentionally hilarious. No trademarks were harmed in the making of this micro-series.
Claude Holiday is designed for community participation. Here's how:
Prerequisites: Python 3.11+, uv, FFmpeg (see Quick Start for installation)
- Fork the repo
- Install dependencies:
uv sync(ormake install) - Copy an example recipe from
recipes/examples/ - Edit the YAML to choose episodes, overlays, audience, ending, provider
- Run
./ch compile --recipe your_recipe.yaml - Generate cover art:
export OPENAI_API_KEY="your-key-here" && ./ch cover-art --type all(optional) - Share your Cut URI and publish your videos
- Create new episode variants or alternate scenes
- Submit via PR to expand the available content pool
- Others can then reference your footage in their recipes
- Write new episode scripts following the master script format
- Expand the story universe with bonus content
- Create prompts for new scenes
- Open a PR adding your timeline to
docs/timelines.md - Include your Cut URI, description, and video links
- Join the growing multiverse of interpretations
Code of Conduct: Be excellent to each other. Credit the concept. No hate or harassment. Keep the satire kind and constructive. See docs/charter.md for full guidelines.
Status: Metadata-only repository (tooling complete, renders pending) | Early testing welcome
For creators: Episode manifests complete โ Awaiting Sora render generation For community: Test the workflow with placeholder mode, customize recipes, evaluate the system
Let's build something that makes people laugh while making them think โ together, in infinite variations.
You can generate multiple candidates per scene, review them, choose winners, and then stitch the episode.
- Generate candidates only (no stitching yet)
./ch candidates --recipe recipes/prime-2025.yaml
# Note manifest path printed; keep the cut_id handy- Create selections YAMLs (one per episode) from the candidates
./ch select --cut-manifest output/cuts/<cut_id>/manifest/cut.manifest.json
# Generates: episodes/<ep>/renders/selections/<cut_id>.yaml
# Also creates: output/cuts/<cut_id>/review.html (visual contact sheet)Selection file format:
- Path pattern:
episodes/<ep_id>/renders/selections/<cut_id>.yaml - Winner index: 1-based (1 = first candidate, 2 = second, etc.)
- Default:
winner_index: 1for all scenes
Edit the YAML files to set winner_index per scene based on the HTML contact sheet review.
- Compile using your selections (just run compile again; it picks up selections automatically)
./ch compile --recipe recipes/prime-2025.yamlTips:
- Set
provider.options.num_candidatesin your recipe to control how many candidates are generated per scene. - Prebaked provider will reuse any existing footage and duplicate into candidate slots if needed.
- Overlays are applied only to selected winners so your review clips stay clean.
What's a timeline? Each distinct cut or interpretation of Claude Holiday. Think of it as a parallel universe version of the series.
Prime Timeline (timeline: "Prime 2025")
- The main repository's default cut for 2025
- Created by John Swords
- Reference implementation, not canonical
Community Timelines (e.g., timeline: "alice/dev-glossary-extended")
- Your fork + custom recipe = your timeline
- Equally valid as any other interpretation
- Can remix episodes, change overlays, reorder, add commentary
- Each gets a unique Cut URI for reference
- Label it: Add
timeline: "YourName/description"to your RCFC recipe - Generate it: Run
compile_cut.pyto get your Cut URI - Share it: Upload videos to YouTube/Vimeo with Cut URI in description
- Register it: PR to
docs/timelines.mdwith your timeline details
Why this matters: No single "official" version means every interpretation contributes to the cultural conversation. Your cut is part of the canon.
See docs/charter.md for the full philosophy on timelines and composable media.
This project uses uv for fast, reliable Python dependency management. It replaces pip, virtualenv, and other tools with a single fast solution.
- Python 3.11+ โ Core runtime
- uv โ Package manager
- FFmpeg โ Required for video processing (compile, overlays, selections)
- Used by:
compile_cut.py,apply_overlays.py,select_winners.py, and all provider scripts - Install:
brew install ffmpeg(macOS) orapt install ffmpeg(Linux) - Verify:
ffmpeg -version
- Used by:
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone the repository
git clone [your-fork]
cd claude_holiday
# Install all dependencies (creates virtual environment automatically)
# This includes: PyYAML, blake3, pysubs2, jsonschema, openai, and dev tools
uv sync
# Note: FFmpeg is required for video processing
# Install via: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)We provide a Makefile with common development tasks:
make help # Show all available commands
make test # Run test suite
make lint # Check code quality with ruff
make format # Auto-format code
make typecheck # Run type checking with mypy
make coverage # Generate test coverage report
make clean # Remove build artifactsAll scripts can be run through uv:
# Using uv directly
uv run python -m scripts.compile_cut --recipe recipes/my-cut.yaml
uv run python -m scripts.apply_overlays --input video.mp4
# Using Makefile shortcuts
make compile-cut
make apply-overlays
# Activate virtual environment for direct access
source .venv/bin/activate # On Unix/macOS
# or
.venv\Scripts\activate # On Windows- 10-100x faster than pip and pip-tools
- Built-in virtual environment management
- Deterministic dependency resolution with lock files
- Cross-platform with consistent behavior
- Single tool replaces pip, virtualenv, pip-tools, and more
All dependencies are managed in pyproject.toml:
Production:
PyYAMLโ RCFC recipe parsingblake3โ Fast cut URI hashingpysubs2โ Caption/subtitle generationjsonschemaโ Recipe validationopenaiโ Sora-2-Pro video generation
Development:
pytest&pytest-covโ Testing and coverageruffโ Fast linting and formattingmypyโ Static type checkingtypes-PyYAMLโ Type stubs for PyYAML
Note: requirements.txt is kept for reference only. Use uv for all dependency management.
Claude Holiday is designed as an annual creative project. Each year:
- New episodes reflect what's happened in AI/software development
- New jokes, commentary, and cultural moments
- Same community-driven foundation
- Prior year timelines remain referenceable
Think of it like: An annual variety show where last year's episodes are archived but accessible, and this year's content is fresh. Your 2025 timeline will always be your 2025 timelineโfrozen in time, infinitely reproducible.
This creates a growing archive of AI culture through the lens of satire, year after year.