All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.0 - 2026-06-17
Initial public release of ReelForge — an AI pipeline that forges scroll-stopping 9:16 vertical reels from a single talking-head clip plus its word-level transcript.
- Ten-stage orchestrator (
reelforge/cli.py, runnable viapython -m reelforge) that wires ingest, analysis, routing, zoom, captions, stitch, audio, color, music, and quality evaluation, passing typed Pydantic models between stages. - Pluggable ingest layer (
ClipSource) that assembles aClipDatafrom a local transcript JSON and source video, with backend-resolution hooks you can override to point at a real database / object store. - The Director (
analysis/director.py) — a single Gemini video upload reused across three structured (JSON-schema) passes: B-roll segments, camera zoom events, and emphasis words. - Anchor-word timing snapping — AI-proposed cut points are fuzzy-matched (case-insensitive, punctuation-stripped) against real transcript word timings for ~0.01 s precision, with deterministic spacing/overlap constraints applied in code.
- The Brain (
routing/router.py) — cost-aware, quality-gated asset routing:sora_cinematicsegments try Sora 2 and are graded by Gemini (PASS / REGENERATE / USE_FALLBACK) with auto-demotion to free Pexels stock;stock_brollgoes straight to Pexels;zoom_only/text_emphasisuse internal engines. Estimated dollar savings are tracked per run. - Sora 2 generator (
routing/sora_generator.py) with job submission, progress polling, download, and validation, plus a dummy-video fallback. - Pexels stock fetcher (
routing/stock_fetcher.py) with portrait-orientation filtering for the 9:16 format. - Face-tracked digital zoom (
effects/zoom.py) — per-frame MediaPipe detection smoothed with an exponential moving average, crop-and-resize punch-in, graceful fallback to last-known position / center crop, and original audio re-merged via MoviePy. - Kinetic captions (
effects/captions.py) — grammar-aware word chunking (max 4 words / 2 s / punctuation break), bold stroke-outlined Pillow rendering on a transparent 720x1280 canvas, emphasis words popped larger and in color, positioned in the 9:16 safe zone. - Frame-accurate stitcher (
compose/stitcher.py) — MoviePy composite of base video + B-roll (cut / fade / crossfade / swipe transitions) + captions, all snapped to frame boundaries; MoviePy v1/v2 compatible imports. - Broadcast audio mastering (
compose/audio.py) — EBU R128 loudness normalization to -14 LUFS first, then transition SFX mixed in at a fixed relative level withamix:normalize=0to avoid re-triggering the limiter. - Cinematic color grading (
compose/color.py) — FFmpeglut3d.cubepresets (cinematic warm / cool / vibrant / vintage / neutral) with sample LUTs generated procedurally when a preset file is absent. - Content-aware background music (
compose/music.py) — Gemini mood/genre classification, Freesound (Creative Commons) fetching with a bundled-track fallback, andsidechaincompressducking under the voice using per-energy presets. - Self-evaluating output (
quality/evaluator.py) — Gemini scores the finished reel across six dimensions with a pass gate at an average >= 75, and also grades individual Sora clips before use. - Graceful degradation everywhere — every missing API key skips its stage or falls back to a free/local alternative instead of crashing.
- CLI skip flags and presets —
--skip-zoom,--skip-captions,--skip-audio,--skip-color,--skip-music,--skip-evaluation,--color-preset, and--music-energy. - Environment-driven configuration (
reelforge/config.py) with a minimal, dependency-free.envloader; no hardcoded secrets. - Self-contained sample data and tests — a runnable
samples/sample_transcript.jsonand unit tests for the transcript model, ingest layer, caption chunking, and routing math that need no network or API keys. - Documentation and packaging —
README.md,docs/architecture.md,pyproject.toml/requirements.txt, a sample.cubeLUT, MITLICENSE, and a GitHub Actions CI workflow (ruff lint + byte-compile syntax check).