M7 Titles and credits
An episode can open on a title card and close on its credits, drawn in the show's style. Until now an episode started cold on its first shot and stopped dead on its last. Nothing on screen said what it was called, who wrote it, or under which license it could be shared.
Read with docs/design/m1-compiler.md (timing, the audio plan) and
docs/design/m7-redirection.md (captions, edits, OpenTimelineIO).
What the cards show
- The opening card: the show's title (
show.jsontitle), small, in the accent color, and under it the episode's title (EpisodeIR.title), large, in the ink color. A short rule in the accent color sits between them. - The credits: the episode's credit lines, then a rule (when there are any), then the
show's content license ("Licensed under CC BY 4.0", from
show.jsoncontentLicense) and "Made with Reelwright". The credit lines come from the screenplay's title page:CreditandAuthor(orAuthors) make one line: "Written by Jane Doe". An author with no credit is "Written by" them.Sourceis a line of its own ("Based on a story by…"), unless it only names the show.Titleis the episode's title.Draft date,Contact,NotesandCopyrightare not shown.
- A show with no
contentLicensehas no license line. "Made with Reelwright" ends the credits unless show.json says"toolCredit": false(Show settings › Format › Credits): a credit the show cannot remove blocks delivery to a broadcaster or a streamer (product audit #19).
Lengths and fades
- The opening card lasts 4 s, the credits 5 s, unless the episode says otherwise (1–30 s and 1–60 s).
- Each card fades up from black and back down to black. The fade is the style's transition
length (
camera.transitions.durationSec, default 0.5 s), at most a third of the card. The first frame of a card and its last are black. - A style that does not allow
dip_to_blackcuts its cards in and out, with no fade. The style's own camera language says whether it fades. - The first shot follows the opening card on its own
transitionIn. The credits follow the last shot with a cut to black. (implementation) After a card that fades, a first shot that names no transition fades up from the card's black (dip_to_black, the style's length). The first stills went from the card's black frame straight to the bridge at full light. A transition the shot names still wins.
How the style shapes them
Colors. The card's background, ink and accent come from the style's shared palette:
- the slots
title_background,title_inkandtitle_accentwhen the style has them; - else the background is the darkest slot, the ink the slot that stands out most against it (a contrast of at least 4.5, else white or black), and the accent the most colorful other slot that still reads against the background (contrast 3), else the ink.
For Saturday Morning that is the deep plum ink (#1B1320), cream (#FFF6E0) and marigold (#F2A33A). The core picks them and writes them in the Timeline, so the engine only paints.
- the slots
Fonts. Titles use the style's
typography.display, credits itstypography.body, each at its weight (display 600 and body 400 by default). Inter is the one bundled family; any other draws in Inter, as in-world graphics do.Film. A card goes through the style's post pass like every other frame: grade, grain, paper, gate weave, vignette.
Size. Text is sized for a 1080-line frame and scaled to the output, inside the 80% title-safe area. A line too wide wraps at its words; a word too wide shrinks its line; a card too tall shrinks as a whole.
The data
EpisodeIR 1.6. An optional titles:
"titles": {
"open": { "durationSec": 4 },
"credits": { "durationSec": 5, "lines": ["Written by Jane Doe"] }
}
- Each part is there or not:
openalone is a title card with no credits. Both fields of each are optional. - An episode without
titleshas no cards, exactly as before. Whoever adds titles raises the episode'sschemaVersionto 1.6.
Timeline 1.6. An optional titles: the cards in time order. Each card has:
kind(openorcredits),startFrameandendFrame;fadeInFramesandfadeOutFrames;background,inkandaccentas sRGB hex;lines, each with itsroleandtext. Roles:showandepisodeon the opening card;credit,licenseandtoolon the credits.
The opening card starts at frame 0. Every scene, cue, shot, audio clip and caption starts
later by its length, so the shots are contiguous from the end of the opening card. The
credits start where the last scene ends, and frameCount includes them.
A Timeline without cards keeps its bytes, its 1.5 version included.
The compiler
- The opening card's length in frames is
round(durationSec × fps). The first scene starts there, and every scene after it follows as before. Scene timing itself is unchanged: it is scene-local, and only the scene's start moves. - The credits run from the last scene's end for their own length.
- Nothing sounds during a card. Every audio clip moves with its scene, so it starts later by the opening card, still on a frame boundary.
- Captions come only from lines, so no caption shows during a card.
The engine
The player checks the cards before the shots. On a card's frame it draws the card into a view of its own (a 2D viewport at the output size) and hands it to the post pass in place of a shot, with the fade as the post pass's black. The shot views are not drawn. The card's view is made the first time a card is shown, so a Timeline without cards builds nothing new and renders the same pixels.
The card: the background fills the frame; the lines stand in a centered column, each in its role's font, size and color; the rule is the style's line weight thick (at least 2 px at 1080 lines).
| Role | Font | Size (1080 lines) | Color |
|---|---|---|---|
| show | display, upper case, letter-spaced | 40 | accent |
| episode | display | 100 | ink |
| credit | body | 44 | ink |
| license | body | 30 | ink |
| tool | body | 30 | accent |
Lines of one role are 1.25 sizes apart; a new role leaves a little more. (implementation) The rule has 32 px (1080 lines) of space above and below it. The first credits set it in a gap sized by the text around it, and it crowded the license line.
Exports
- WebVTT and SRT: captions are timed in the episode's frames, so they move with the opening card.
- OpenTimelineIO: the video track has the opening card as a clip before the first shot
and the credits as a clip after the last, each of the rendered MP4 over its frames, with
metadata.reelwright.titleits kind. An editor's timeline lines up with the episode's, and its audio sits under the right pictures. import_otio: a title clip is part of the cut. Trimmed, it becomesset_titleswith its new length; removed,set_titleswithout it. The shots after a trimmed opening card are judged by where they sit after it.
The director
Both directors add titles when the screenplay has a title page: an opening card, and credits with the title page's credit lines. A screenplay without one gets no titles.
(implementation) The skeleton reads the title page's credits, and one function
(titlesFor) turns them into titles for both directors. The model director adds them once
its scenes are accepted, so nothing it sends the model changes, and its replay fixtures
keep their keys. A directed episode's scenes start after the card, so the heuristic
director's coverage snapshot counts frames from each scene's start.
Editing
edit_episode gains set_titles:
open(true or false) andopenSecadd, remove or re-time the opening card;credits,creditsSecandlinesdo the same for the credits, andlinesreplaces the credit lines ([]leaves only the license and "Made with Reelwright").
Fields left out keep what the episode has. A length, or lines, imply their card. Removing
both cards removes titles.
The screenplay's words on screen (implementation)
A screenplay writes words for the screen too: centered text (> THREE HOURS LATER <), a time
card on a line of its own (THREE DAYS LATER, THE NEXT MORNING, THE END), SUPER:,
TITLE:, CHYRON: and TITLE CARD: (docs/design/m4-director.md, "Screenplay directions").
The first audit's centered time card was dropped.
- EpisodeIR 1.44. A
titlecue: itstext,card(in the picture's place, else over it),durationSec(default 2.5 for a card, 3 over the picture) and thesource.lineit comes from. It is timed as any cue: a card holds the scene for its length, as a beat does; words over the picture play under the cues after them and delay none of them (the director places themwiththe next cue). The director writes them from the screenplay; a director never makes them up. - Timeline 1.21. Each becomes a title card of the Timeline: kind
card, one line of rolecard(the display font, 90 px at 1080 lines, the ink color) on the card's background over the whole frame, faded through black as the episode's own cards are; or kindsuper, one line of rolesuper(the body font, 48 px, the ink color with a shadow of the background color) low in the frame, inside the title-safe area, over the shot that plays, fading in and out on its own over a quarter of a second (at most a third of its length). Unlike the opening card and the credits, a scene's shots go on under these: a card is drawn in the picture's place while the scene's time runs, and words over the picture go into the shot's own view, so the post pass (grain, grade) is on them as on the picture. - How a scene ends (EpisodeIR 1.44
Scene.out, Timeline 1.21Shot.out):FADE OUT.fades the scene's last shot to black overfadeSecand holds black forblackSec, which the scene's length includes;CUT TO BLACK.cuts to it and holds. The Timeline gives the last shotout: {fadeFrames, blackFrames}and the player fades the frame to black. Cards written after the ending (FADE OUT., then> THE END <) come up out of its black: the picture is black from the first of them on, and its fade ends there.
Later
- Music under the cards.
- A title over the first shot instead of a card before it.
- (done) Lower thirds, a name and a line over a shot:
docs/design/lower-thirds.md. - A show's own title design (a logo, a layout).
- Title blocks on the timeline component.
Watch it
A scratch copy of Marigold: The Salvage Claim directed with the heuristic director (its screenplay has a title page), voiced, and rendered at 1280×720 on lavapipe. Stills of the title card and the credits: legible, in the style, nothing clipped, the fades smooth.
(implementation) It ran on 2026-10-01. The episode runs 61.6 s: four seconds of card, the two scenes, five of credits. The card is the deep plum ground with "MARIGOLD SALVAGE CO." spaced out in marigold over a short marigold rule, and "The Salvage Claim" large in cream, under the style's grain and cel dust. The credits read "Written for the Reelwright demo show", a rule, "Licensed under CC BY 4.0" and "Made with Reelwright". Both fade evenly through black, frame by frame, and the bridge fades up after the card. The mix is silent over both cards, and the first caption comes four seconds later than before.