diff --git a/README.md b/README.md index c56b892..1729d51 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,22 @@ For podcasts: transcript selection; render 9:16 / 1:1 / 16:9 with a positionable crop and big word-by-word captions. +Shaping the episode: + +- **Scenes** — split at the playhead (**S**) or before any sentence, then + name, cut or merge whole scenes. **Suggest scenes** proposes topic + changes for review, landed on detected camera cuts; or build scenes + from your chapters. +- **Title cards** — intro, chapter, quote and outro cards between scenes, + previewed live and rendered into the export. +- **Transitions** — dip to black/white, crossfade into a card, and fades + in and out of the episode, without shifting anything's timing. +- **B-roll** — upload images and clips, then cover a transcript selection + full screen or picture-in-picture. + +Every edit, including bulk ones like "remove all filler words" or applying +suggested scenes, is a single undo step (**⌘Z** / **⇧⌘Z**). + AI models only ever return text and sentence picks, never timestamps or edits: times always come from the transcript's own word timestamps, and every response is validated before use. See the diff --git a/claude.md b/claude.md index ad7e49d..acc4219 100644 --- a/claude.md +++ b/claude.md @@ -634,6 +634,91 @@ it; `plan.ts` then crops/scales to the clip frame, and captions are re-cut into 3-4 word Shorts cues laid out for that frame (the ASS script resolution must match the output aspect, or libass stretches glyphs). +## Scenes and title cards + +Scenes are derived, never stored: the ranges between `split` operations +(`lib/timeline/scenes.ts`); a split at exactly 0 only names the first +scene. New splits snap to the middle of a gap between words. + +A `card` operation inserts a full-screen title card (template, title, +subtitle, 1-10s, solid color) before the content at its source time `at` +-- a scene start, 0 for an intro, the duration for an outro. Cards add +time that isn't in the source, so there are three clocks: source, edited +(cuts removed, `cuts.ts`) and **program** (edited plus cards, +`lib/timeline/program.ts`, duplicated client/server). Code that already +works in edited time (captions, chapters, transcript export) shifts into +program time through `editedToProgramTime`, so cuts and cards compose +without knowing about each other. A card whose whole scene is cut is +dropped with it. Clips skip cards. + +Rendering: each card is an ffmpeg `color` source at the source's size and +frame rate, joined with the same xfade chain as cuts; all card text is +one generated `.ass` file (`lib/cards/ass.ts`) burned in over the program +before captions and the logo. User text only ever reaches ffmpeg inside +that file, and the API refuses braces, backslashes and control +characters. The preview can't insert frames into a `