Contents

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.json title), 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.json contentLicense) and "Made with Reelwright". The credit lines come from the screenplay's title page:
    • Credit and Author (or Authors) make one line: "Written by Jane Doe". An author with no credit is "Written by" them.
    • Source is a line of its own ("Based on a story by…"), unless it only names the show.
    • Title is the episode's title. Draft date, Contact, Notes and Copyright are not shown.
  • A show with no contentLicense has 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_black cuts 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_ink and title_accent when 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.

  • Fonts. Titles use the style's typography.display, credits its typography.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: open alone is a title card with no credits. Both fields of each are optional.
  • An episode without titles has no cards, exactly as before. Whoever adds titles raises the episode's schemaVersion to 1.6.

Timeline 1.6. An optional titles: the cards in time order. Each card has:

  • kind (open or credits), startFrame and endFrame;
  • fadeInFrames and fadeOutFrames;
  • background, ink and accent as sRGB hex;
  • lines, each with its role and text. Roles: show and episode on the opening card; credit, license and tool on 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.title its 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 becomes set_titles with its new length; removed, set_titles without 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) and openSec add, remove or re-time the opening card;
  • credits, creditsSec and lines do the same for the credits, and lines replaces 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 title cue: its text, card (in the picture's place, else over it), durationSec (default 2.5 for a card, 3 over the picture) and the source.line it 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 them with the 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 role card (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 kind super, one line of role super (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.21 Shot.out): FADE OUT. fades the scene's last shot to black over fadeSec and holds black for blackSec, which the scene's length includes; CUT TO BLACK. cuts to it and holds. The Timeline gives the last shot out: {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.