Changelog
What changed in Reelwright
All notable changes to this project are documented here. The format follows Keep a Changelog; versions follow Semantic Versioning.
Unreleased
In progressNothing yet since the last release.
0.13.0
17 changes: 6 added, 2 changed, 9 fixed.
Approve Claude's work where you asked for it. In claude.ai and Claude Desktop, a change Claude proposes shows as Reelwright's card: what it changes and why, the changed shots before and after, and Approve, Reject or Open in Studio right there. On the desktop, an ask from Studio's chat opens Claude Code with it typed in. Studio on Linux now updates itself from a signed feed, and puts the old version back if the new one does not start. People hug, children and grandmothers sound their age, the review opens on a picture, and Hat Day's vent no longer seems to hold up the Captain's hat.
Added6 changes
- A child made from words sounds like a child, and a grandmother like a grandmother, in a free voice. Kokoro recorded only grown people, so a seven-year-old spoke in a young woman's voice raised and a grandmother in a young woman's. Now every free voice has the ages it speaks for, and Kokoro's own voices, blended, make five for a child and four for an older woman. Someone described is cast to a voice of their age and sex, raised or lowered into their pitch, with a child's smaller formant and an older person's slower pace. Studio's note that a voice may sound the wrong age now comes only when it does: more children in a show than there are child's voices, or a grown voice chosen by hand.
- People hug. "She hugs Toby", "throws her arms around him" or "gives him a big hug" walks the one hugging right up to them and wraps both arms round them, the hands on their back at their shoulders' height, a grown-up's or a child's, and the reading names it in English and Spanish. A thing in the arms ("hugging the volcano on his lap") is held, not hugged. More of what people do with each other and the set is staged too: a hand-over as a sentence's second act ("pours a cup of water and hands it to him" hands it to him, not to herself), a chase, a run round the table, a wander across the lobby, a ball dribbled down the court, passed and shot, a safe's dial turned, arrows drawn on a whiteboard, candles blown out bending over the cake, a present torn open, a nervous swallow and a clipboard thrown in the air for joy. A one-off part answers to what they are ("the guard sits down at the front desk"), and someone rising from a seat to go to someone walks out of it the way it faces, never through its back. The six genre fresh shows stage 67 of their 69 paragraphs, none against the text, where they staged 53.
- In Review, Shift+M goes to the next note on the version shown and Alt+M to the one before, with its card brought into view, where each note was reached by Tab to its card's Go. At the last or the first note, Review says so. They are the timeline's marker keys, and Studio's shortcuts list them.
- When Claude proposes a change in claude.ai or Claude Desktop, Reelwright's card shows in the chat: what the change does, field by field and why, and for an episode the changed shots' stills, before and after. Approve, Reject or Open in Studio right there, without switching to Studio. With several options, pick one and reject the rest. The card follows the chat's language (English or Spanish) and its light or dark theme.
- On the desktop, what you ask your own Claude from Studio's chat opens Claude Code in your show with it typed in, once Reelwright is added there (Settings › Claude): press Enter there to send it. Before, it was only copied, for you to paste. "Open Claude Code again" opens it so again, and when Claude Code does not open, Studio says why and the ask is still copied.
- Studio updates itself on Linux, with no new download from the site. When a newer Reelwright is
out, Studio started from its AppImage offers Update to that version on the rail and the
welcome page. It downloads the new AppImage beside the one you run and checks it against
Reelwright's signed release feed: the feed's Ed25519 signature, then the file's size and
SHA-256. Restart to update reopens Studio on the new version with the show you had open. If
the new version has not opened within three minutes, the old one is put back and started, and
says so. A feed that Reelwright did not sign is refused, and nothing is downloaded. The core
does the work:
reelwright update checkandreelwright update get. Each release signs its feed (latest.json.sig,feed.xml.sig, bytools/site/releases.tswith the keytools/release/feed-key.tsmade). On macOS and Windows Studio still says that a newer version is out; what they need is in docs/design/in-app-update.md. In Spanish too.
Changed2 changes
- On a laptop, the review, the booth, the storyboard and the writers' room get the room they need. With the chat open at 1440 or 1280 pixels wide they had about 820 pixels or less: the review's picture was about 500 wide and its version pickers were cut. The chat now folds to its strip while one of these is open, as it already did for the script, the timeline and the editors, and comes back when you leave. Open it there yourself and Studio keeps it open. Pickers that fit their longest choice now show it whole, without a few letters lost to "…".
- reelwright.diy's pictures of Claude show your own Claude, with no key: Studio's chat with Claude at work through claude.ai and its proposal waiting for you, Settings › Claude connected on your Claude plan on the desktop, and claude.ai's connector connected on the web. They showed an API key in use and a chat priced turn by turn.
Fixed9 changes
- A phone's insert shows every message the script gives it, however it writes them: quoted
texts one under another, the lines under "Three texts from Grandpa:", cues marked (TEXT) or
(TEXTING), and words on the shot line itself (
INSERT - MEI'S PHONE: "Come home."). It showed the first and left the rest as action, or showed none. A cue marked (TEXT) is a message, never a line said aloud, and someone who only texts needs no one in the cast: such a texter used to stop the scene. With no insert written over them, texts are a phone's insert of their own. - A phone the action says shows words shows them. "Mei holds up her phone. It shows a text from Grandpa: "Come home."" cuts to her phone's screen with Grandpa's text after she holds it up, as an insert would, and the phone in her hand shows it from then on. Words in quotes or capitals count, or after a text from someone; a picture told in prose ("a map of the city") does not.
- The review opens on the first frame with a picture, past the fade up from black, where it opened on a black frame: the first look a new person had at the demo's preview was black. A frame you ask for, from a link or a note, still opens where it says.
- The timeline now says when a piece of the set hangs into someone's hat. In Hat Day the air vent over the aft door hangs its ribbons into the Captain's tricorn, so in her singles the hat reads as hung from the vent, and nothing said so: the framing score measured the vent against the top of a hat it draws taller than the engine does. Under a hat, a piece meeting the head anywhere from the top of the head up is now a piece sitting on it, in the framing score and as a film grammar warning, and the director's reframe steps the camera off it where a camera can. Hat Day's Captain, standing right under the vent, has it in 8 shots as shipped and 4 as the director cuts it again: no camera clears a vent her hat reaches.
- A crowd scene directed by Claude moves. "Crowds rush past", "The crowd slows. Faces turn." and "A cheer from the crowd" stood still under Claude's direction while the built-in director's crowd hurried past, turned and cheered: Claude had no way to cue a crowd. Now it cues one as the built-in director does, how many, at whom and when, through your own Claude or a key alike. A crowd turned to someone not in the scene, or kept round a piece the set lacks, is sent back to Claude to mend, and the same check now covers the built-in director's crowds.
- The style lab waits for its four directions while Claude Code on your plan is still making them. It gave up after two minutes and said "tools.call got no answer in time", and the directions that came after were never shown. Reelwright now tells Studio every 20 seconds that it is still at work, and Studio keeps waiting while it hears so, on the desktop and in a browser. It still says when Reelwright has stopped answering.
- A place built from the script's words no longer stands in it what a prop is wrapped in. "Toby hands her a lumpy present wrapped in newspaper" gave Birthday Chaos's living room a newspaper rack; Toby went off to the foot of the stairs to hand the present over, and the sofa filled the front of his shot. Now he crosses to Sammy with it, and the show's cut is faulted in one shot of twelve, where it was three.
- In Hat Day, the Captain's tricorn no longer seems to hang from the air vent. The vent stood on top of the aft door, 2.1 to 2.42 m up, and with the tricorn she reaches about 2.37 m, so in every one of her singles the vent's limp ribbons sat on the hat; under the bridge's 2.8 m ceiling no height over the door clears it. The bridge now has a bracket high on the wall beside the door, the vent stands on it, and the screenplay says so ("On its bracket by the aft door"). The gust still blows the hat off her head. The demo's bridge shows the bracket too.
- Studio's daily check for a newer Reelwright asks again when it gets no answer: 30 seconds later, three times in all, and the day counts as checked only once it is answered. On a busy machine Studio's first moments could hold the question past its 10 seconds, and then nothing was said until the next day.
0.12.2
23 changes: 12 added, 4 changed, 7 fixed.
Re-direct an episode from any moment. Pick a line, a cue or a shot on the timeline, in Review
or in the script, and Reelwright directs just that stretch again, keeping what you changed by
hand. Your own Claude does it with no API key, and without Claude a note like "angrier" still
works. Studio's chat leads with the Claude you already have, reelwright direct runs on your
Claude plan, players come on from the theatre's wings, and the director keeps the gestures in
the picture when it mends a shot.
Added12 changes
- The next prompt gives your Claude the show's next steps, as Studio's Show page lists them, each with the tool that does it, and asked brings it the directions Studio left waiting for Claude. Once Claude is connected, the chat's way in and Settings › Claude say how to start them: in Claude Code, type /mcp__reelwright__here and what you want; in claude.ai or the Claude app, press + and find Reelwright under Connectors. "here" takes no argument now: Claude Code passes a prompt only an argument's first word, and Claude reads your whole words beside it.
- Players come on from the wings. The theatre stage had no way on at all, so "Grace walks on from the wings" staged nothing; now each wing is a way on and off, up on the stage behind a black curtain upstage of the arch, and the house has its own doors. A set pattern can have such an opening, with no door and no wall, at one of its zones (SetPattern 1.1). The wing curtains a script names now stand beside the stage, not in the house.
- The chat's header says when your Claude is at work on the show from outside: "Claude is connected through claude.ai · working on the show now", while a step it took runs and for 20 seconds after, then back to "Claude is connected through claude.ai". With the chat's own Claude connected, the line under it says it. In Spanish too.
- An episode can be directed again from a moment instead of all over: from a line, a cue, a
shot or a frame, to the end of the scene, to the end of the episode, or through a later line.
Everything before the moment stays exactly as it was, frame for frame. With an end, everything
after it is kept too, and only moves in time if the new stretch runs longer or shorter. The
other scenes stay as they were, even when the stretch gains a line. When the new stretch
leaves someone gone, arrived or holding something else, the rest of the scene is directed
again too, and the proposal says why. Only the camera can be redone over a stretch as well,
with the performance kept. Claude asks for it with
direct_episode'sfromandto, and the command line withreelwright direct --from sc01/l04 --to scene. - What you change by hand survives directing again. A delivery, a gesture, a look, a shot's
camera or where someone stands as a scene opens, changed on the timeline, the stage or in
previs (or by Claude, once you approved it), is kept when the stretch or the whole episode is
directed again, and the director's own gesture for that person on that line gives way to
yours. A change to a line whose words were rewritten is let go, and the proposal says so.
Claude can let one go on purpose (
release), or direct it all afresh (keep: false, orreelwright direct --fresh). An episode with a change made by hand is EpisodeIR 1.66. - Studio re-directs from where you are. On the timeline, R (or Re-direct… in the header, a shot's menu, or the inspector) opens a sheet at the line, shot or moment you stopped at: this line, this shot's camera, to the end of the scene or of the episode, or In to Out; the stretch's script to rewrite in place; a note; only the camera; and what you changed by hand there, kept unless you clear it. The proposal comes back over the cut: the bar says where it changes it, plays that stretch with a second either side, flips between before and after at the same moment, voices its new lines, and approves or rejects it there. In a review, on a phone too, R or Re-direct from here does the same from the frame you watch, found in the episode by the words said there, and the Re-direction tab plays it, approves it or undoes it. In the script editor, Re-direct from here starts at the caret's line with the script as you have it. In Spanish too. Session protocol 1.20.
- Your own Claude re-directs a stretch with no API key. With Claude as the show's director, a
re-direction goes to your Claude as Direct does: Claude Code on your Claude plan, or the Claude
connected to the show (claude.ai, Claude Code or Claude Desktop). When none can take it now, the
timeline, the review's Re-direction tab and the script editor say it waits for the Claude
connected to the show, by name, then that it is re-directing it, with Copy what to say,
Re-direct without Claude (free, now) and, when a key could do it, Re-direct with your API key.
The Claude that takes it is told the stretch and directs only that scene; its proposal comes
back over the cut to compare and approve. Ask Claude yourself too: "re-direct sc02 from Nell's
line, angrier" is
direct_episodewithfrom,toandnote. - Without Claude, a note re-directs too. The heuristic director reads the script, so a note's words for how a line is said ("angrier", "quieter", "slower") go into the stretch's script as a parenthetical on the lines of whoever speaks first, merged with one already there, and the proposal says what it wrote where. A re-direction that would make the stretch as it is already says so in plain words, with what to do (write it into the script, or ask Claude), instead of "nothing to change".
- When the renderer draws a still or a storyboard with a fallback, Claude hears about it. A
font the lower third fell back on is one example, or a part it could not draw. Claude asks
for stills through render_preview, and its answer now ends with what the renderer warned
("The renderer warned: The lower third draws in Inter. (frame 0)") and lists the warnings in
its data, freshly drawn or reused.
reelwright stills --jsonprints the stills and the compiler's and the renderer's warnings for scripts; without --json it says them in words as before. - With claude.ai or Claude Code connected and no Claude of the chat's own, Studio's chat is your Claude's first: the way to give the chat its own Claude steps aside to one line, "Chat with Claude here in Studio too", with how to ask your Claude about what is open kept in sight; the things to ask here show as chips again, and go to your Claude; and the line under the box says where Enter sends your ask ("Enter opens claude.ai with your ask"). In Spanish too.
reelwright directdirects through your own Claude, with no key: when the Claude Code on this computer is signed in with your Claude plan, it does the model director's part, a task at a time, each answer checked and repaired as the API's would be. It says "Directing on Claude Code on your Claude plan", gives no price, and the episode names Claude Code as its director.--with-keyuses your API key instead; without such a Claude Code, the key directs as before. Claude Code reaches the direction through a server of the command's own on this computer's loopback, answering only a token it is given in its environment.reelwright eval recordrecords the evaluation set on your Claude plan, with no key and nothing charged: each script directed in a Claude Code session of its own and each ask put to Claude Code's chat, as Studio has them. The directions replay with no key, and what came of each ask is kept and judged as it came.--with-keyrecords with the key, as before.
Changed4 changes
- A review page's notes before deciding fold, so the change is on the first screen: notes of one kind are one card ("And 124 more like it"), warnings first, and past the first two the rest wait behind "124 more notes", which opens them all.
- Reelwright's browser checks take a slot's share of the machine, not the machine. Each started
its own headless Chromium, which, drawing on the CPU, took about six cores (one ran at 599% for
18 minutes), so a few checks filled a shared box. Every one now starts Chromium through one
launcher, on the two least busy cores with one raster thread (
RW_BROWSER_CPUSsays how many), andtools/check-browser-launch.ts, in CI and the gate, fails on a browser started any other way. - reelwright.diy says what 0.12.1 is: Studio for Windows, macOS and Linux, free to try in your browser, and the Claude you already have (claude.ai, the Claude app or Claude Code) with no API key, a key only an option. It said the web edition was for invited people, that Claude ran on your own key, and that Studio's own chat needed one. What the site says of the release and of who may join comes from the release and the service's setting, and a check refuses a page that contradicts either.
- In the booth, the chat's header says the line as a person would: "Looking at: Booth › Ottoline's first line in scene 1", where it said "Booth › Ottoline Brisk › sc01/l01". In Spanish too. The plain-words check now reads every place's title the header shows, so no id comes back there.
Fixed7 changes
- In Review, the five colours to draw a note in show where the keyboard is, and so do words that can be selected to copy them anywhere in Studio (a note, a reply in the chat): Tab put it on each with no ring at all. The check of every place Studio runs before a release now opens the demo with its preview, as a new account's is, so Review's player and notes are checked too, and it reads the ring of the Notes and Changes tabs, which it missed.
- On a phone, a page's actions keep to one line under its name: the rest wait behind More (⋯) beside the name, which shows them all, as does reaching one with the keyboard. The review's five actions took three lines there, and its Changes had room for one change.
- Over a shoulder, the gesture a shot is cut for stays in the picture. The Vault Job's Sal, holding up his hand, is no longer seen over Nikki's shoulder, where the hand was out of the picture at any size: 0.12.1 only kept such a shot no closer than a medium shot.
- A face behind an arch is seen through its opening. The framing score, the film grammar and the director's choice of camera judged a face against the middle of a set piece's box, so Opening Night's proscenium hid Leo, standing centre stage behind it, from the whole house, and the director cut to the stage's wide shot to find him. A face is now judged against the parts of the set's structure (an arch, a wall with a doorway, a pillar), as a body and a hand already were, and Opening Night has no faulted shot. Furniture and dressing still hide a face by the middle of their box.
- When the director mends a shot, the gestures stay in the picture. Of the cameras that mend it as well, it takes the one that shows the most of the gestures played in the shot, a hand beat counting when the body beat it would become shows. Night Shift's Mr. Pell, lying in bed and framed whole, keeps the two hand beats on his line, which the first camera to frame him whole had lost.
- Someone a piece of the set hides for most of a shot, and who does not speak in it, no longer stops the director from mending it. Kitchen Science's bus two-shot looked through the seat rows at Theo, hidden behind them; it now frames Nell's lean on her own.
- Where someone comes on from is never where they go. "Walks on from the wings and stands beside him" goes to him, where Opening Night's Grace walked into the wing, behind the proscenium, and said her line there; "emerges from behind the curtains" stays out of them, and "crosses from the mic to Leo" crosses to him, where it went nowhere. A shopkeeper who "stands behind the counter, reading a magazine" stays there to read it, where they walked off to the magazine rack.
0.12.1
33 changes: 10 added, 8 changed, 15 fixed.
Reelwright with the Claude you already have. Direction, memory, the style lab and writing all work through your own connected Claude, with no API key, and Studio's chat takes what you ask even with no key and no helper. What your Claude does on the show from outside Studio shows in the chat as it does it, and a proposal that re-directs an episode shows the stills of the shots it changes, before and after. A page's pictures come in about half the time, every engine job starts drawing seconds sooner, people made from words look their age, and a crowd stays inside its place.
Added10 changes
- AI direction works with no API key, through your own Claude. Ask the Claude connected to your show (claude.ai's connector, Claude Code or Claude Desktop) to direct an episode, and it directs it itself: Reelwright gives it the director's work a scene at a time and checks each answer as it checks its own director's. The episode then waits for you in Studio, marked as Claude's. In Studio, Direct with Claude uses your own Claude before any key: Claude Code on your Claude plan when it is signed in, then the Claude connected to the show right now (the script says "Claude (claude.ai) is directing this" once it takes it), then your runner or your key. With none of those, it waits for Claude: the script says so and what to ask it (Copy what to say), and Direct without Claude cuts it now, free. Direct with your API key uses your key when you choose it.
- Studio is never quiet when it does without Claude. A heuristic cut, looks Reelwright suggested alone and a memory pass Claude did not read each say so, and how to have Claude do it. A direction says who directed it and how many scenes fell back.
- Memory, the style lab's directions and writing with Claude also work through your own Claude, with no key. The Claude connected to your show reads episodes for the show's memory and proposes looks itself when you ask it, and memory says it was Claude. On your computer, with Claude Code signed in with your Claude plan, Studio's memory pass after directing, its looks and Write with Claude in the script editor run on it before any key. The writing panel then shows Claude Code and no price.
- A Reelwright service with open sign-ups no longer fills its disk with new accounts. While its data volume has less free space than its owners keep (4 GB unless they change it in Settings › Who can join), a new sign-up joins the waitlist instead of making a free account, and the sign-in page says so plainly, in English or Spanish: new accounts are paused while it makes room, and you're told your place in line. People who already have an account, and anyone an owner invited, sign in as always. The console says why while it lasts, and each owner gets one email when it starts.
- Whoever runs a Reelwright service can read and change its settings from the server's shell,
without signing in to the console:
reelwright host settings get [section]andreelwright host settings set <section>.<field> <value> [--by <who>]. The console's limits apply, the audit log says what changed and who did it, and the running service follows at once. - What your Claude does on the show from outside Studio shows in Studio's chat as it does it: claude.ai's connector, Claude Code or the Claude app. A block says "Claude · through claude.ai", then each thing it did in a few words ("Read Barnaby Culpepper", "Working on Barnaby Culpepper", what failed and why), and each change it proposed is the chat's own card, to approve, reject or undo right there. When it goes quiet the block says so, and that its reply to you is in claude.ai, with the way there. With the chat open, no toast repeats the proposal; folded, the toast still says it. The block is kept with the show's conversation. In Spanish too. (Protocol 1.19: agent.event; docs/design/showrunner-connected.md.)
- A proposal that re-directs an episode shows the stills of the shots it changes, before and after, on its card in the chat: the shots whose camera or length changed first, then those of a scene whose performance changed.
- Studio knows the moment Claude works on the show from outside it, and says so: through
claude.ai's connector, Claude Code over Reelwright's MCP, or
reelwright mcpon this computer. The chat's header says "Claude is connected through claude.ai" (or "…through Claude Code") instead of "Not connected", and the rail says it under the show's status, live as Claude comes and goes, with nothing to press. What Claude proposes arrives as it is made, as a toast that names it ("Claude, through claude.ai, proposed: …") with Review. The proposal's page, Next steps and the set and stage banners name it too ("by Claude, through claude.ai"), where they said "by the showrunner". Studio's own chat on the Claude plan is not counted as Claude from outside: its proposals stay the showrunner's, shown in the chat, with no toast and no "connected through" line for it. What Claude reads about where the person is in Studio goes when that Studio closes. A Claude working on a shared show through Reelwright no longer shows its person as "here" after they left. In Spanish too. (Protocol 1.15: session.agents, a change'svia; docs/design/claude-presence.md.) - With no key and no helper, Studio's chat still takes what you ask: it goes to your own Claude. On the web, claude.ai opens with your ask typed in (it is copied too, for a box that stays empty); on the desktop it is copied, to paste to Claude Code or the Claude app. Under your message the chat says it waits, then "claude.ai is on it" once your Claude takes it, with where you were as you asked. What it does shows in the chat as it does it, and its answer comes back into the chat. While it waits you can open claude.ai again, copy it, or take it back. In Spanish too. (Protocol 1.19: chat.ask, chat.unask, chat.asks; the MCP tool answer_in_studio.)
- Reelwright's prompts in Claude: "here" asks about what you have open in Studio,
"suggestions" gives Claude the things Studio's chat suggests there, "asked" brings it what you
asked in Studio's chat, and "review" lists what waits for your review with what each changes.
Each carries where you are in Studio, so "this" means what you have open. In Claude Code pick
them from the / menu, or type
/mcp__reelwright__here; in claude.ai they are in the + menu, under the connector. Where you are is also a resource,@reelwright:reelwright://studio, to attach in Claude Code.
Changed8 changes
- The demo's first open on the desktop draws none of its Show page's pictures. A fresh copy
spent 45 s of its 49-60 s first open (a busy dev box, load 42-48) drawing the cold open's
still and the poster, one engine start after the other, though they are the same in every
copy. They are now kept in the repository (
examples/demo-pictures/), drawn as a daemon draws them and byte for byte what it drew, and ship with the desktop release as with the service: with them, the poster showed 5 s after the show opened and no engine started.tools/demo-previews.ts --checkfails when the demo or the engine would draw them otherwise now (--picturesdraws them again;--source-onlytakes the engine as it was). - A proposal's review page reads as what changes for a person. Its cards name the document and say what is new or different by name ("Set type: Ship bridge", not settype.ship_bridge); what a document keeps for itself (its kind, schema version, id, file, hashes and where it came from) folds under each card's Details, and no JSON pointer shows under a field (it is in the name's tooltip). Approved, it says "Applied", the commit's hash only in a tooltip; the chat's proposal card drops its id and hash the same way. On a phone as on a laptop, desktop and web alike. Rejecting a proposal made before Studio opened names it in the toast and its Undo ("Rejected the proposal “Revise Barnaby Culpepper: age”"), as for one made while it was open, not "a proposal".
- A page's pictures come in about half the time when it has several: the engine is started once for a run of them instead of once each, and kept 30 seconds for the next. Godot starting was 12 of a line-up's 20 seconds on lavapipe. The demo's ten grid pictures took 220 seconds and now take 87, the same bytes. On the web service the demo's Cast, Sets and World pictures are drawn once as the image is built, as its first still is, so a new account's Cast shows its pattern at once; it came 47 seconds after Cast was pressed. Cast's faces are drawn together instead of one by one, so a cast's cards fill at once on a first visit to Cast.
- With Claude not connected, the chat, the web service and the command line say first how to use
your own Claude: add Reelwright to claude.ai (Customize › Connectors) or to Claude Code
(
claude mcp add), or let Studio's chat run on your Claude plan. An Anthropic API key comes after, as an option. Studio's Claude settings lead the same way. - Every engine job starts drawing seconds sooner: a preview, a still, a render's batch and the
check before them each loaded all of Studio's scripts first, 634 of them, when the job needs
- The engine's command line read one constant from Studio's settings, which reach every page. Loading it took 5.2-9.5 s on a busy dev box (load 43-47) and now takes 2.2-2.8 s, measured turn about at the same load. An engine test fails if any of Studio's scripts comes with it again.
- A change's title, its why and the warnings it comes with name each thing as a person does, in Studio's language, never by its id. The Show page's row for a ship's bridge read "Build Marigold ship, seed 3 (set.boxwood_bridge) from Marigold ship interiors (bridge)"; it reads "Build Boxwood Bridge from Marigold ship interiors (bridge)", and its warning says the Boxwood Bridge is the same kind of place as Marigold - Bridge. A set built under an id with no name is called by it, and a set rebuilt keeps its name. Titles say a line by its words, a gesture, a lighting or a backdrop in words, the people a gesture is for ("for people", not "for biped_toon.v1"), the fields a lock or a variation touches by their labels, and an episode's edit by what it does ("Edit The Lighthouse: move a cut"). Undo says what it takes back without the change's id; locks, sounds and clips say the name. The warnings a proposal carries, show validation's and the director's say sets, characters, styles and memory entries by name, and a set's own marks, setups, entrances and pieces in words. So do refusals about something the show has: "Marigold - Bridge has no lighting preset …", "The Lighthouse (cold open) has no screenplay …", and a change by its title ("Build Boxwood Bridge from … is applied; only a proposed change can be approved"). What the show lacks is still said as it was asked for. After Direct, the script's status line says who directed and what it made ("Directed without Claude, by the heuristic director: free. 1 scene, 2 shots, 15.5 s long, every cut keeps film grammar."), from the tool's data, where it read Claude's "sc01 INT. MESS HALL - DAY: heuristic, 3 shots, 0 grammar errors". Before you decide speaks to the person: a set too like another of the show's said "set.boxwood_bridge is a settype.ship_bridge like set.marigold_bridge … make a pattern with create_set_pattern"; Review says "Boxwood Bridge is the same kind of place as Marigold - Bridge (ship bridge) …" and "For a room of its own, build it from Patrol cutter bridge (an official ship's) instead", while Claude still reads the ids and the tool. The director's lighting, cast, sound and framing hints say what to do in Studio the same way. A change set that keeps such words is ChangeSet 1.3 (session protocol 1.18); older ones read as before. The compiler names the person whose head goes into a piece, or who is too big for a room. The plain-words check fails an id given to a sentence said with say(), or to a function that says one, so a new one cannot come back.
- The chat's way in leads with the Claude you already have, and an API key comes last, folded under "Use an Anthropic API key instead". On the web, "Use Reelwright from Claude" comes first (claude.ai's connector: no terminal, no key), then "Chat using my Claude plan" through the helper. On the desktop, "Chat using my Claude plan", or its one step (install or sign in to Claude Code), then "Use Reelwright from Claude". The first-run tour rings the first way. The key's field led on the web and on a desktop without Claude Code. In Spanish too.
- A render draws each character only over the part of them the shot can show. A close-up drew the whole body at the size of the face on screen, and a character standing beside or behind the camera was drawn whole for nothing in the picture: in the demo's cold open, Culpepper at up to 12.2 million pixels a frame while the camera was on Otto. The cold open's preview, drawn as the web service draws it on two CPUs, took 1,184 s and now takes 715 s (about 20 minutes down to 12), its close-ups 1.29 s a frame instead of 3.22; full renders and Studio's renders on a computer gain the same. The picture is the same: in every one of the 674 frames at most 13 pixels differ by more than 2 levels of 255, by rounding at a drawn edge. Studio's views, which move their camera or hold a card between poses, still draw every character whole.
Fixed15 changes
- Review's version picker says the whole version ("v1 · Preview · Oct 14, 09:40"), not "v1 · Preview · Oct": it is as wide as its words, at 1100 and at 1440 beside the chat, and the header wraps its actions to make room.
- Six new fresh shows, in genres the corpus lacked: a courtroom, a locker room, a hospital ward, a heist, a kids' party and a play's backstage. They were staged against their text in four places and made too few people: a screenplay that introduces someone age first ("SAMMY, seven, …", "DR. VOSS, fifties, …") made nobody, and MR. PELL was made twice. Now each is made once, by the name as written, and a speaker introduced with a title ("GRANDPA WALT, seventies") is the speaker. What someone is introduced with comes in with them (the coach's clipboard, the guard's flashlight), not what they wear; words written on a thing ("a crown that says BIRTHDAY GIRL") are read, not heard; a phone to the ear is held, and a photo is taken with a phone out of a pocket. Coming "out of the courtroom doors" into a hallway comes on; "runs to the bed" goes to it, and only "to bed" goes off; "hands him the chart" never hands it to the one handing it; "peers at it over her glasses" looks at it; "looks down the hall" looks along it; "the kids" are the young ones on stage and "the team" its players, not their coach. People who peek in, walk on from the wings or follow someone in come on; who slumps in a chair sits, who hides under a table crouches, who falls off a chair laughing lies there, and a pillar is a place to crouch behind. "Leo and Grace bow" both bow, "holds up his hand" holds it out, "takes Leo by the shoulders" puts hands on him, and a gavel is struck, not set down: on the courtroom's bench, where the gavel is part of it, a hand on the bench. "Everyone stands" stands each of them, and "Everyone sits" sits each back in their seat. On the genre places sitcom-places made for them the six stage 52 of their 69 paragraphs, none against the text; the first five still stage 53 of 55.
- A picture on its way says so in its place. A cast card whose face is still being drawn, a set's or a prop's tile whose picture the engine is drawing, the Show page's poster and episode stills, and the season board's stills each show "Drawing…" under the card's icon, where they showed a bare icon as if they had no picture (four of six cast cards, just after a character was added). The picture takes that place when it comes, the card keeping its size, so nothing moves. One that could not be drawn keeps its icon alone. The same on the desktop and the web, and in Spanish ("Dibujando…").
- A crowd stays inside its place. In Lunch Rush one of the cafeteria's crowd stood 3.7 m behind the back wall, where no camera saw them and they hid nothing they should. The lanes a crowd hurries along ran on past the floor until no camera would see someone at their end, and a wall hides nobody from that. Every lane now ends on the floor, clear of the furniture and the props. Where no camera sees either end, the crowd still goes off at one end and comes on again at the other; anywhere else they turn round at the end and walk back. With nowhere to walk, each stands on clear floor of their own instead of all on one spot. The old lanes took someone of a crowd past the walls in every one of the library's 36 places; none now. Lunch Rush's cheer is seen with all 12 of its crowd in the picture, not 5.
- No picker holds Studio wider than its window as the library and the show grow. Every picker is made one way now: in a form it takes its row's width, in a toolbar it is as wide as its longest choice up to the window's width less its margins, and a choice wider than it is cut short with "…" (in an inspector it goes onto a second line, whole, as it did). About 70 were sized to their longest choice, so a long name in the library (New set's pattern did, at 376 pixels in a phone's 318) or in a show (an episode, a sound recipe, a cue) pushed a dialog or a page past the window. The engine check fails on a picker made any other way, and the UX tour on one sized to its longest choice.
- Studio finds Claude Code installed with npm (its global folder, ~/.npmrc's prefix, ~/.npm-global, Windows' %APPDATA%\npm), nvm (the newest Node that has it), Volta, Bun, pnpm, fnm, mise and asdf, though a desktop app's PATH leaves those out. It said "install Claude Code once" beside "Claude is connected through Claude Code".
- Web Studio now has a Content-Security-Policy. Its page and every file under
/app/studio/allow only Studio's own origin (and its socket's, on reelwright.diy): nothing put on the page can load a script from, send a request to, or show a picture from anywhere else, and no inline script runs but the page's own. It allows WebAssembly andeval, which the engine and its page scripts need. The service's own pages keep their stricter policy. - A single the director cannot frame clean is tried over the shoulder of whom they play to. Road Trip's Mom, turned to Oscar in the back, had Gran cut in half beside her in every single; now she is seen over Oscar's shoulder. Night Ferry's Walt, a piece across his face in his single, is seen over June's, and Scout's Honor's Owen, Ruby at the edge of his single or his hair on its top, over Ruby's. Someone who gestures in the shot is seen over the shoulder no closer than a medium shot, so their hands stay in the picture.
- The framing score sees a roof. From high over a car its roof hid the boy in the back seat, and the score passed the shot, judging only the heads before him. Now a piece over someone, a car's roof, a canopy or a bunk above, hides them wherever they are in the picture, and the timeline says so.
- A shot the director mends no longer keeps a piece of the set sitting on someone's head when a step aside, another lens or another height would move it off. Kitchen Science's Dad, framed on his own away from the counter, had the wall cupboards along the top of his head; the one better angle crossed the line, and the mend kept the cupboards. Now his medium shot is on a wider lens, the cupboards clear above him.
- A held gesture (folded arms, hands on hips) counts as seen when the cut shows its stroke, the moment it lands, and the hands then stay in the picture for most of the time its character is in it; the director judges it at its stroke alike. Before, the body check counted a hold unseen when the cut went to someone else while it went on (Night Ferry's June held her folded arms through Walt's reply, 37% in the picture), and the director counted one seen that the cut had missed as it landed. A hold whose stroke the cut misses is now moved into the shot after that shows it, as any gesture is; June's, which she folds out of the wide she sits down in, stays unseen and is said, as no shot of her chair proves her hands clear of it.
- People made from words look their age. The release-candidate audit's "weathered grandfather in his seventies, ferry captain, wool cap" drew as a young man: age greyed his hair but left his brows brown, the forehead lines sat under his cap, his grey stubble read as a pale chin, and an elderly person could be drawn a child's 3.6 heads tall. Now the brows take the hair's own colour, an older face has wrinkles and an elderly one deep wrinkles and eye bags, the lines fold from the nose round the mouth where no cap hides them, stubble shows its bristles, and the elderly stand 4.2 to 4.8 heads tall.
- The framing score no longer calls someone lying down "cut in half" when a close shot's side edge crosses their body: that is where the shot crops them, as the bottom edge crops someone standing. Night Shift's Mr. Pell, in bed, failed so once drawn a grown man's proportions.
- A face's cel shadow is the far cheek's, not a band along the jaw, which read as stubble on the audit's sixteen-year-old girl and on every face in the demo. A woman or a girl drawn with no lashes gets them, and no square jaw; a man no heavy lashes.
- 0.12's new places fit a phone. The first-run tour's card no longer covers what it points at: beside the bar's Chat there was no room for it, and it was pushed back over the very button it asked you to tap ("Connect your Claude"; "Your shows" and "Find anything" too). It goes above or below what it rings when there is no room beside. Toasts keep inside a phone's window: their words wrap to it instead of running 440 pixels wide, so "Claude, through claude.ai, proposed…" keeps its Review, and they stand above the bar at the foot, not over it. On a touch screen a toast goes after its time again; the last tap's point counted as a pointer resting on it, and one that came there stayed for good. Only a finger held on it keeps it now. An episode card's menu, the way to Render preview, has rows a finger tall on a touch screen; they were 17 pixels. A menu longer than the screen with rows that tall, as the timeline's Add is, keeps inside it and scrolls. Approving a row on the Show page no longer moves it from under your finger: approved, the demo's cold open was out of date, its Watch step went at once, and the rows under it went up with the row's Undo (on a phone, Next steps a screen down under the show's card). The step stays until you leave the page, as a decided row does. And the Episodes list keeps inside a phone's window with a render listed: what the render says wraps, where on one line it held the list wider than the window, its cards and the Grid and List buttons cut at the side.
0.12.0
99 changes: 27 added, 18 changed, 54 fixed.
Reelwright on Windows, and a first hour that moves. Windows 10 and 11 join Linux and macOS in every release. The demo plays at once, on the web and on the desktop, and a new account's first still shows in about fifteen seconds; Direct is about three times faster and makes the same cut. Act a line on camera in the booth, on the desktop or in the browser, and the character plays your face. Props the script names are drawn as what they are, about a hundred kinds, and the genre shows have their places: a courtroom, a bank and its vault, a hospital ward, a locker room and backstage. Studio fits an iPad and a phone, approves a proposal right on its row, says when Claude works on the show from outside it, and offers a new person what is ready to watch first. On the web, a preview can be drawn by your own browser.
Added27 changes
- Someone can start a scene at a piece of the set no mark stands by (EpisodeIR 1.64: a
placement's mark may be
element:<id>). They stand where a walk up to it would stop, facing it, so "Maya stands by the fridge" starts her at the fridge; she started on the stove's mark. A piece the set lacks, or one with no clear side to stand at, is an error that says which. Episodes from before read and play as they did. - A gesture behind a piece of the set is kept in the picture instead of dropped. Where the line already plays big (excited or angry, or said loud or shouted), the director plays it a little bigger, just enough to bring the hands up over the piece: Otto's fist pump on the shouted "Told you! Optimism!" rises over the workbench. On any other line it frames the shot again on the same people, from higher, a size wider or from another side, so long as the cut's grammar and the shot's framing score are no worse. It never plays a sad or deadpan line bigger. Over the heuristic director's Salvage Claim, Hat Day and Night Watch, 7 cued gestures went unseen and were dropped; 6 are now (the 5 listeners' nods no shot shows, and Otto's puzzled palms in a two-shot that cannot widen without a jump cut).
- Studio on an iPad and a phone (product audit 2, #16), in the browser and in a window that narrow alike. On a touch screen every button, choice and field is a finger's target, 44 pixels or more. Held upright, an iPad's chat opens over the work instead of squeezing it. On a phone a bar along the foot takes the rail's place, one place at a time: the Show, Episodes, Review, its Notes and the Chat, which opens as a sheet. A review's player and its notes take turns. An editor a phone is too small for (the timeline, the script, the world's and the cast's documents and the rest) says so, and offers to review an episode instead. Settings on a phone lists its pages first, then shows the one chosen across the window with "All settings" back to the list; on an iPad held upright every page fits beside the list. The welcome screen's three ways in stand one over another on a phone, and the keyboard sheet keeps inside the window, its groups in one column. Every dialog, the palette, Switch show and the menus keep inside a phone's window: a dialog takes its width and what it asks narrows to it, its answers stand one over another the full width when they do not fit side by side (Cancel apart at the foot, as easy to reach as any), and a menu gives up its keys' hints before its words.
- Studio's Spanish reaches what the director stages. The script page's reading, the timeline's Action lanes and the storyboard's cards say who does what in the language you chose: "Otto se la dice a Chief, con enfado", "Otto camina hacia helm y se sienta", "las luces bajan al 30% en 4 s", and so do a scene's opening, its time ("un flashback a 1985") and the directions and shot lines the director reads in the script. Words that describe someone agree with them by their pronouns ("Ada se ve cansada", "Otto se ve cansado"), and someone who is neither she nor he is described in words that need no agreement. Your show's own names stay as you wrote them. The core composes each such sentence from a template with named slots, sends the template beside the English it always sent (session protocol 1.8), and Studio translates it piece by piece; the English the command line and Claude read is unchanged. A preview's caption ("Mug · en manos de Otto, y luego dejado, en 2 estados · Flat"), the places Studio lists before you delete something ("“The kettle hiccup” en Gags", "Reparto"), and the director's notes are in Spanish too, a shot's size and a gesture's name within them ("Fuera del encuadre de un primer plano se hizo el gesto de Otto (saludo): el plano se abre a un plano medio corto para mostrarlo"). So are the chat's suggestions ("Dale a Otto un vestuario de invierno."), and a chip puts them in the message box in your language. What Claude reads stays in English, without the templates.
- On the web, a preview can be drawn by your own browser: Render preview offers "On this computer, in your browser" beside Reelwright and your own computers, with how long it would take in that browser. A browser drawing without a graphics card takes hours, not minutes: it is told so, and that Reelwright is faster, though it can still be picked. Pick it and the tab draws the frames with the same engine Studio plays episodes with, encodes them as it goes and sends them to Reelwright, which adds the sound and keeps the preview as the episode's next version, as it does its own. It uses none of your render minutes and needs none left. Keep the tab open while it draws: its progress says so, and closing it asks first; closed anyway, the preview stops and says why. A browser that cannot draw it (no WebCodecs, or no H.264 at the preview's size) shows the option turned off, with the reason. Final renders are drawn on Reelwright or your own computer, as before. Session protocol 1.10.
- A prop the script names is drawn as what it is, not a wooden box. About a hundred kinds of the things scripts handle most are built from parts: a thermos with its screw cap, a coin, a flashlight with its beam, a jug with a handle and a lip, a plate, a wrench, a pillow, a ball, a newspaper, a volcano model and the rest. Its other words shape it ("a tall jar", "a giant snowball", "a bucket with a lid") and say what it is made of ("a brass whistle", "a wooden spoon", "a glass jug"), its colour too where that is not what it is anyway, on a library pattern or a kit piece as well. A thing only its shape words describe is built from them ("a round metal gadget"); a box is left only for things nothing describes. Over the staging corpus's scripts and the fourth product audit's shows, 178 of 291 handled things were boxes; of 134 things scored as scripts name them, all are now drawn as their kind, colour and material (23 were).
- The director is measured on shows nothing was tuned to (the fourth product audit's finding
2). Five shows are made from their words the way a person makes one: a ferry at night, a
kitchen and a school bus, a campsite and a forest trail, a crowded cafeteria, and a car in
the rain. Each gets a one-minute script, has its cast, places and props made by the
script's reading, and is directed. Then every shot is scored for a speaker's mouth or a
subject hidden, every action paragraph is judged as written, and, with an engine, every
speaking body is checked for standing still.
core/test/fresh-shows.test.tsholds the score, which only goes up, and writes each show's report of every fault in words (core/test/fixtures/fresh-shows/). - The demo plays at once. A first visit to the web edition, and Try the demo on the desktop, open the Marigold with its cold open's preview already there as v1: Watch it on Episodes and it plays within seconds. It took a twenty-minute render on the web before. The preview is the one a person's preview would be, rendered with the release.
- A line acted on video plays the actor's performance:
reelwright capture <show> --episode <id> --line sc01/l02 --clip take.mp4makes the clip's sound the line's take, and keeps how the actor's head turned and nodded, where they looked and the faces they pulled as keys beside it. The character then turns its head, glances and smiles as they did, over what the director made; the rest of the body goes on as directed. The take and its performance are one change, undone with Ctrl+Z;set_captureplays the head, the eyes or the face less, or not at all, and choosing another take brings that take's performance or plays as directed. The clip is read on this computer by MediaPipe's face models, which ship with Reelwright: nothing is sent anywhere, the picture is not kept, and the same clip always makes the same keys. Episodes are EpisodeIR 1.65 when a line plays one (LineCue.capture), the Timeline 1.39 (Actor.captures), and the keys are acapture.schema.jsonfile beside the take. The booth's camera comes next. tools/heads-check.shdraws every hat, brim and hair kind the cartoon characters have, from eight sides and from above and below, on one contact sheet to judge by eye: the demo's cast, Otto in each kind of headwear, each hair style and fringe, and caps and hats over long and full hair.- Reelwright for Windows 10 and 11 (x64), beside Linux and macOS in every release: an
installer, for you alone with no administrator, and a .zip to unpack anywhere. The download
page offers them once a release carries them, where it said "Coming soon". They are made
and checked on Linux, as the Mac's are: every program read as Windows reads it, the core's
code the very code of the Linux core, and Wine installing it, running the core's checks on
the demo and uninstalling it. Not signed yet, so the first time each runs Windows
SmartScreen says "Windows protected your PC" with the publisher unknown: More info, then
Run anyway. A signing certificate goes in one place when there is one
(
REELWRIGHT_WINDOWS_SIGN). - Claude is set up in the chat itself, as quickly as Brickworks does it (docs/audits/claude-setup-2026-10.md). Until Claude is connected, the chat opens on its way in rather than folding to a strip. Paste an Anthropic API key there and press Enter: it is checked with Anthropic and kept, the showrunner starts, and your first message goes in the box that now has the focus. That is five steps, where it took seven and a trip to Settings. On the desktop, when the Claude Code on your computer is signed in with a Claude plan, "Chat using my Claude plan" comes first: one press, three steps to the first answer, and Studio starts Claude Code for you, so there is no session of it to open. Claude Code not installed, or not signed in, the chat offers the one next step (Anthropic's install page, or Claude's own sign-in) and notices by itself when it is done, with no restart. On the web, "Chat using my Claude plan" shows one command to copy for a small helper on your computer, with a pairing code in it instead of a token to paste, and the page notices when the helper runs. The chat's header always says how Claude is connected ("Connected: API key ending ••••abcd", "Connected: your Claude Max plan, through Claude Code on this computer", "Not connected"), its Check says whether it works, and when it stops working (a key refused, Claude Code signed out, the plan's limit, the helper stopped) the header says so in red with what to do. Settings › Claude says the same: a turn that finds Claude Code signed out makes Studio look again, and once it works again the red goes without a Check. A key Anthropic refuses is said in red under the key, which stays to be corrected. With a conversation from before and Claude not connected now, the way in sits under the conversation, in sight. "Use Reelwright from Claude instead" is the other direction, you chat in Claude and it edits the show: it opens claude.ai on Add custom connector with Reelwright filled in. "More ways to connect" is Settings › Claude, which keeps every control it had. Every Connect Claude in Studio leads to the chat's way in first, until Claude is connected. In Spanish too.
- Studio in Spanish says what the core proposes in Spanish too: every change's title and why in Review, the chat, the Show page and History ("Crear 2 objetos: …", "Deshacer: …"), the reading's fix buttons and what they propose ("MEI aparece por primera vez: crear una persona"), and how a synthetic take reads in the booth ("+1.2 semitonos, más animada"). Every message of the core that Studio can show is now in Spanish (3023 of 3023); what reaches only Claude or the service's operator stays English and out of the catalog. Claude still reads the English alone. Change sets with these words are ChangeSet 1.1; older ones read as before.
- The booth acts a take on camera too, on the desktop and in the browser. Turn on "Act it on
camera too" beside the microphone: Studio first says what it keeps (how the head, eyes and
face moved, never the picture) and that nothing else leaves the computer or the browser, and
remembers the choice for the show. The camera is on only from Record to Stop; the count-in
is the person's resting face, and under Record the booth says whether it sees their face or
what to do when it does not. Stop keeps the take with the performance, played with it; the
take's row says "With your performance: head, eyes, face". Esc or leaving the booth keeps
nothing of the camera. On the desktop Studio reads the camera and the core finds the face; in
web Studio the page does, in a Worker, with the models and WebAssembly served from the
service itself, and only how the person moved reaches the service. Session protocol 1.14
(
capture.open,capture.frames,capture.status,capture.close,takes.add'scapture, a take'scapture). - The framing score faults a piece of the set sitting on someone's head: a cupboard, a shelf, a hung lamp or sign whose bottom edge runs along the top of their head in the picture, so the two read as one thing. The same goes for an edge behind them that runs through a hand at rest. The timeline lists it, and the reframe moves the camera until the piece is clear of them. Kitchen Science, a show made from its words, had the kitchen's wall cupboards sitting on Dad's head in his medium shot.
- The script's reading offers the props a person expects. Things carried in ("steps out of the trees with a lantern", "with a lunch tray"), worked ("scrolls on her phone", "knits a very long scarf", "breaks her taco in half"), poured into or that drop out of a machine are offered; a part of someone ("his hood", "his forehead"), what they wear, a piece of the set (the car's steering wheel, the wheelhouse's wheel), something done ("a nap") and a piece of a thing ("one piece" of the taco) are not. An animal brought on in capitals ("A RACCOON waddles out") is made as a character of its kind. A set built from the script leaves the things its people handle to be props. Over 166 scene lines, all 166 now get the props a person expects (91 of the first 160 did); the fourth product audit's fresh shows get a lantern, a lunch tray, a megaphone, a stick and a raccoon, and no hood, piece or steering wheel.
- The web service speaks your language too. The sign-in page, the waitlist, your sign-in code's email, invitations, notices and the digest, an invitation's page, an email's stop link and the page that asks before Claude connects are in Spanish when your browser asks for it ("123456 es tu código de Reelwright"). Choose a language in Studio's Settings on the web and the service's emails to you follow it, whatever the browser you sign in from asks for; choose the computer's own and they follow your browser again. The installed Studio signs in in its own language, and someone you let in off the waitlist is invited in the language they joined in. In English every page and email reads as it did. The console stays in English. The web Studio's loading page is in your language too, before Studio has started: the one you chose in Settings, else your browser's.
- A preview the episode changed since says so. Edit the episode, its cast, its sets, its style or a take, and its card says "out of date", the review says so on the picture and in the version list, and the Show page marks the episode Out of date with "Render a new preview". Before, an old preview looked as current as a new one. Editing another episode, the bible or someone not in it changes nothing, and neither does a new Reelwright whose library gained gestures the episode does not play; a change to one it plays does.
tools/web/phone-demo-check.tsmeasures the phone half of audit 4's 0.12 test from reelwright.diy, on a phone and an iPad held upright, every tap against a finger: with sign-ups open, a newcomer goes from the landing page to the demo playing in under five minutes (109 s); with the waitlist on, it says what a stranger can reach: the landing page's film plays, and Studio's demo does not until they are let in.- Studio knows the moment Claude works on the show from outside it, and says so: through
claude.ai's connector, Claude Code over Reelwright's MCP, or
reelwright mcpon this computer. The chat's header says "Claude is connected through claude.ai" (or "…through Claude Code") instead of "Not connected", and the rail says it under the show's status, live as Claude comes and goes, with nothing to press. What Claude proposes arrives as it is made, as a toast that names it ("Claude, through claude.ai, proposed: …") with Review; the change keeps which Claude it came through. What Claude reads about where the person is in Studio goes when that Studio closes. A Claude working on a shared show through Reelwright no longer shows its person as "here" after they left. In Spanish too. (Protocol 1.15: session.agents, a change'svia; docs/design/claude-presence.md.) - A salute. "Ruby stands up and salutes" played nothing in Scout's Honor: Reelwright had no salute. The flat hand comes up to the brow over the eye on its side, the elbow out level with the shoulder, held a beat, then cut down. "Salutes", "throws a salute" and "gives him a salute" play it, every other kind of body plays its own bow for it (a blob nods), and the pose panel lists it as Salute. A show's own salute still plays instead of Reelwright's.
- A line acted on camera shows its performance in the timeline's inspector: "Plays as acted on
camera", and how strongly the head, the eyes and the face play, from 0% (as directed) to 100%
(as acted). Turned off, the line plays as directed and the strengths are kept, shown but not
changed, so on again plays it as it was set (
set_capture'soff, LineCue.capture'soff). A take trimmed in the booth keeps its performance, cut as its sound is and measured from its new start; made louder, normalised or cleaned, it keeps it as acted. Deleting a recording deletes each version's performance with it. - A lean in. "Nell looks up from her phone. She leans across the aisle" left her as she sat: a lean in a seat was a lean against nothing, so nothing played. Now leaning in a seat ("leans on the table", "leans across the aisle", "leans forward") bends the body forward from the hips and holds it there, toward what it leans on, else whoever the sentence names, else whoever they were looking at, and the engine turns the bend round to them. On their feet a lean is where they stand, as before, and "leans back" still leans back. Other bodies hold their own still pose for it, and an object tips toward it. The pose panel lists it as Lean in. On the fresh shows 53 of 55 paragraphs are staged; on the staging corpus, 556 of 557, none against the text: the one left is a face the text leaves to the reader.
- A proposal waiting on the Show page is approved or rejected right on its row, without opening it. The row says what it changes ("Ottoline Brisk · Wants: To prove she can run a salvage on her own."), who proposed it and when, with Approve, Reject and Review beside it. Approve waits while there are options to choose between, when what it changes was edited since it was proposed, or when it came with warnings ("2 warnings: look first"), and the row says why. Review lists those warnings under Before you decide, and the chat's proposal card holds its Approve for them too. Ctrl+Enter approves and Ctrl+Backspace rejects the row the focus is on, which then moves to the next one waiting. A decided row stays where it was, as tall, until you leave the page ("Approved · …" or "Rejected · …" with Undo, "Taken back · …" with Redo), so a second click never lands on the row that would have moved up into its place. Its Undo, like Ctrl+Z, takes an approval back and brings a rejection back, as for one decided in Review. Desktop and web alike.
- A preview drawn in your browser waits for one of the page's frames between its frames, not two: a sixtieth of a second less a frame with a graphics card, a redraw of Studio's window less without one. The estimate in Render preview says so. Every picture is the same.
- Places for the genre shows: a courtroom, the courthouse hallway outside it, a locker room, a
hospital ward, a bank's lobby and its vault, and a theatre's backstage, each a library
pattern with its own kit pieces (
kit.courtroom,kit.locker_room,kit.bank,kit.backstage, and beds, bed curtains, bedside cabinets and heart monitors inkit.hospital). The courtroom has the judge's bench, the witness stand, the defense and prosecution tables and the gallery's benches, seen side on so faces read. The hallway has benches under tall windows, where it used to be built from the school corridor with its lockers. The ward has beds by the windows with curtains between them, and a "locker room" is its own kind of place now, never a gym. The bank has marble pillars to crouch beside, the tellers' counter, the guard's front desk and the round vault door. The vault has walls of deposit boxes and a safe. Backstage has the fly rail's ropes and sandbags, costume racks, a make-up table, the star's dressing room, the wings and a red cue light over the stage door. The director starts people where their words put them: the judge at the bench, the witness in the stand, the guard at the front desk, someone in the bed by the window. The places corpus builds all seven from their headings and words; before, each was a plain room or the wrong place. - The script's reading counts everyone the action brings in by name ("PRIYA, thirties, ...") as one of its people in every scene, not only the scene that names them. A phone at Priya's ear in the hallway stays hers, not the hallway's.
Changed18 changes
- The UX tour's check (CI's, and
tools/check-all.sh --goldens) fails on anything wider than the clip or scroll it is shown in, not only on what reaches past the window's edge: a page cut at its frame's side went unseen, as Settings' Claude page did on a phone. A list or a timeline that pans is named intools/ux-tour-allowed.txtwith its reason. It also fails when it measured fewer places than it went to: since 0.11.0 a tour in English stopped at every place before measuring it, said "0 problems" and passed. tools/engine-check.shfails on a typed Array or Dictionary filled from a ternary whose other side is a bare[]or{}. Godot refuses that side at run time, and no load of the script sees it: it hid the tour's places and the timeline's Add menu on the set's row.- Every check that counts now fails when it counted nothing, as the tour does. Before, any of them could pass with nothing to read. The engine's script check needs its 500 scripts and more. The engine tests need the tests they ran, from gdUnit4's own report. The hidden-input, plain-words, fixed-click, translation and changelog checks need files and words to read. The body and singing checks need a body or a note to measure, and the web tour needs a place. The fresh-shows corpus needs shots, judged paragraphs and speaking bodies. A watch that ended without saying it held, or without a picture of what it saw, fails the gate. For each one, its input was emptied: the old check passed and the new one fails. A fresh-shows report written without an engine keeps the bodies it last measured.
- The UX tour on touch also tours an iPad's half in Split View, 680 wide, in the 600 to 720
pixels where the booth turns narrow. It puts the window back to the size toured after the
rail unfolds, which held it 768 wide for every place after, and fails a place measured at
another size unless
tools/ux-tour-allowed.txtsays why ("window: WxH"). - The demo's cold open plays what 0.11 can do (fourth product audit, finding 8). Otto gives a thumbs-up on her excited first line, where her arms hung straight down. The Chief's muffled first line keeps its shot of the console, his cap peeking over it: the script writes him unseen (O.S.), and closer, lower or higher cameras only showed a bigger cap with its brim across his eyes.
- Each UX tour, watch and screenshots run keeps its own Godot user folder, so two at once in
one checkout no longer share settings: a Spanish tour's language and its recent show had
shown up in a pseudo-locale tour beside it. The tour fails when its settings name another
run's language or recent show, and
tools/tours-at-once-check.shruns two tours at once and must stay clean. - History and a review's Changes show a changed script as a proposal does: only the changed paragraphs, two lines around each with their numbers, the unchanged runs counted ("792 lines unchanged") and the words that changed marked, on a desktop and on a phone. They used to show bare stretches of lines as they were and as they are, with nothing around them.
- The status at the foot of Studio's rail says where the open show runs: "On this computer", or "On Reelwright" on the web and for a show kept there. It said a green "Connected", which next to the chat's "Not connected" (about Claude) read as one contradicting the other. While a show opens, starts again or stops, Studio no longer says "daemon": "Opening the show…", "The show stopped (exit 1). Opening it again in 4 s.", "Open the show again" and "Reelwright's log". In Spanish too.
- People speak at their age (the fourth product audit's finding 3). A new character's voice is where people of their age and sex speak, as quick as their age, and as calm or lively as their words say. A ten-year-old speaks at a child's pitch in the nearest voice Kokoro has, a woman's raised a few semitones, where Theo spoke as a grown man. A bearded dad's voice is a man's, and his casting note says what his voice sounds like, not "nasal, very high". A grandfather of few words is slow and low-key, not "quick". Kokoro has no child's voice and no older woman's, so making one says so in plain words, and so does the character's Voice panel, with what will sound closer: a voice recorded in the booth, or a cloud voice. Characters already made keep their voices. Over 22 described people, five casts and two drawn ones, the new voices corpus scored 114 of 191 before and 191 of 191 now. The character sampler is 1.6.0.
tools/web/claude-setup-check.tsat a phone's 390 opens the chat from the bar at the foot and fails unless its key's field and everything named are inside the window.- The batch gate runs a third of the other watches as well as the main path's four, so every
one of the 42 runs at least once in three batches. It ran 4, and the rest only when someone
thought to: settings-watch failed 2 of its 90 checks on every run for four days, and nothing
said so. With a record file named in
RW_WATCH_ROTATION, kept out of git, it runs those that passed longest ago first, a new one before any, and writes down when each passed. One that fails is not written down, so the next gate runs it first again. Without one it runs the day's third, so any three days in a row run them all. A watch that wrote down no check fails, as one that never said it held or kept no picture already does. - Direct is two to three times faster, and its cut is the same, byte for byte. Making sure
every gesture is seen, the director tries a framing, a wider shot or a bigger gesture at a
time, each compiled. Every try judged the whole episode's film grammar again and planned
every walk again, the cast's and a crowd's, though it changed one shot or one gesture of one
scene. A try now judges its own scene's grammar, as no rule looks across a scene's edge, and
each walk is planned once for all the director's compiles. A random three-scene script took
41 s to direct and takes 16 s; Lunch Rush, whose cafeteria crowd's lanes were planned again
for every try, 43 s and now 13 s; Scout's Honor 14 s and now 6 s. The 24 random scripts of
director-mend.test.tsand the five fresh shows direct to the same episodes, Timelines and notes as before.core/test/director-cost.test.tsfails if a try judges more than its own scene or plans a walk again. - The engine tests fail a run that logged a SCRIPT ERROR, naming the suite, the test and the
script's line, unless the test asked for that error inside gdUnit's
assert_error(...).is_runtime_error(...). Suites passed with errors in them, and the pose-key watch's 2,045 went unnoticed: it went on selecting a pose that was never keyed. It now stops there and says so. A watch that walks its paths one after another (settings, lighting, camera keys, keys, script pro, timeline pro, cast) checks that each went to its end: a path a SCRIPT ERROR cut short is a failed check that names it, where the watch said "0 failed". - A render on the web service draws all its batches on one engine, started once, where it started the engine again for every minute's batch. The cold open's preview, drawn as the service draws it on two CPUs, takes 22% less time, every frame and the video byte for byte as before. A render still goes on from the frames it kept when it stops, waits its turn between batches, shows its progress and can be cancelled as before; Studio's renders on a computer draw the same way.
- Direct is about three times faster, and its cut is the same, byte for byte. Making sure
every gesture is seen, the director tries a framing, a wider shot or a bigger gesture at a
time, each compiled. Every try judged the whole episode's film grammar again and planned
every walk again, the cast's and a crowd's, though it changed one shot or one gesture of one
scene. A try now judges its own scene's grammar, as no rule looks across a scene's edge, and
in it only the shots whose frames it changed: the shot it reframes, and one beside it whose
look turns at the cut between them. Each walk is planned once for all the director's
compiles, and a crowd's lanes see the cast once, not again at every step. A random
three-scene script took 41 s to direct and takes 12 to 16 s; Lunch Rush, whose cafeteria
crowd's lanes were planned again for every try, 43 s and then 14 s (its cafeteria dressed
since, 41 s without these changes and 23 s with them); Scout's Honor 14 s and now 6 s.
The 24 random scripts of
director-mend.test.tsand the five fresh shows direct to the same episodes, Timelines and notes as before.core/test/director-cost.test.tsfails if a try judges more than its own scene, judges a shot again that it left as it was, or plans a walk again. - The web edition is checked as it ships, before every deploy and in the gate
(
tools/host/shipped-check.ts). The service's build runs on this machine as Fly runs it, with nothing from the source beside it. In Studio from that same build, a person signs in with an emailed code and makes a show from words. They write its first episode, direct it, voice it, render a preview on the service and play it. Every earlier check ran the service from the source, so a build that left out a folder every compile reads passed them all (0.11.1). Take that folder out of the build and this check fails. - A new account's first still on the web service shows about 15 seconds after signing in,
idle or busy; it took 85 seconds on an idle machine and 130 on a busy one, and minutes on
the live service. Three things held it up, and none of them changed a picture. The Show
page asked for the poster's line-up first, and its engine drew one picture at a time, so
the cold open's still waited for it; the stills now come first, and the poster once none
is being drawn. Every copy of the demo ran Rhubarb on the cold open's six lines (13
seconds) before the still could compile; the demo now ships that lip sync with its
previews (
tools/demo-previews.ts --lip-syncmakes it again, and--checkfails without it). And every account's engine drew the same still and line-up again; the service's image now draws them once as it is built (reelwright host demo-pictures), and each copy of the demo takes them. An edited demo, or another engine, draws its own as before. - The first thing a new person is offered is to watch what is ready: on the Show page, "Watch The Lighthouse (cold open)" leads Next steps, on the desktop and the web, at a laptop's size and on a phone, above "The Salvage Claim is written, not directed yet" and the show's memory. Its button opens the cold open's preview in the review. Once a show has been watched, its Next steps go on to what comes next.
Fixed54 changes
- Where people start follows the text: "Otto stands beside him" starts him by the Chief, "Dev sits at the back" in the back row, and "stands in the middle of the kitchen" in its middle, not just inside its door. A walk to a place someone already has goes there anyway: up to the helm when Otto sits at it, beside the Chief when he lies in the middle of the hold. A walk to a piece no longer stops on another piece's mark beside it (the engine core, not the workbench's end), "walks down the aisle toward Dev" goes to Dev, and someone who walks up to a bench with no seat free on it stands by it instead of sitting on the air. Someone who comes in and goes over to someone stays in the picture: a parrot that flew in to Otto was out of its long shot nearly the whole time. On the staging corpus, 494 of 507 paragraphs are staged, none against the text.
- The timeline's Add menu opens on the set's row, where no one is. It stopped there without opening.
- In web Studio's player, a surface lit by both a coloured lamp and the scene's main light came out greener than in the render: the console's top under its amber light, the rim under the window. The browser's renderer now adds the lamps' light the way the render does, so what you play in the browser, a preview drawn there and the render show the same colours. Renders are unchanged.
- A garment or accessory the words name is drawn as that kind of thing. A hoodie has its hood
and pouch pocket; an apron is worn over the clothes, a bib with a strap round the neck and a
skirt in front of the legs; headphones sit on the ears with a band over the head, or round
the neck when the words say so; glasses are glasses, sunglasses dark ones; a helmet is a
shell, a headscarf is tied over the hair, and a dress or a skirt hangs from the hips. A robe
is a long coat, armor a closed shell, and sandals leave the foot bare; a scarf, a
neckerchief, a pin badge and a backpack, left off before, are drawn. The fourth product
audit's ten-year-old in a red hoodie had a plain top, his dad's apron was overalls and his
sister's headphones a cap. A child speaks in a child's voice: the brightest voice of their
pronouns, raised to a child's pitch and a smaller body's, never gravelly, where the
ten-year-old spoke as a grown man. The words-cast corpus checks both, and reads the audit's
script as well as the first one (
core/test/words-cast.test.ts). - Working a piece of the set, or doing something at a place, goes there first. "Maya opens the fridge" walks her up to it and puts her hand on it; "Dev washes his mug at the sink" takes him to the sink. The kitchen's place at the sink says it is under the window, so "walks over to the window" is where it should be. The street's bench and the forest's log have room for two: someone who sits down beside whoever is on it takes the other end. On the staging corpus, 504 of 513 paragraphs are staged, none against the text.
- The director no longer stands a camera just past an open set's front looking along it. Such a camera can have the floor's edge under its picture yet look under the deck in a corner. Each corner of the picture must now come in through the front, over the floor and between the walls (Hat Day's long shot of the Captain, reframed, did not). The Hat Day showcase's high group shot near the end (sh230) showed a strip of stars over the bridge's back wall; it now leaves a little less room over their heads and stays inside the set.
- The framing score no longer takes a head turned side on for a wider one. It had a face's front a third of a head past the head's side, so the Captain's head, side on, was a quarter wider than the engine draws it (a seventh over all her frames). Her nose is a tenth past it, and every head in the demo and Night Watch is now within a tenth of its drawn width at every turn. A 3D figure's head (biped_3d.v1) is measured too: the engine's probe reports its drawn box, and the score has its hair lying on the head, its hat's dome and its ears as the figure builds them.
- A place is as big as what its words put there (fourth product audit, finding 3). "The open steel car deck of an old ferry at night in the rain" was built as the library's little fishing boat, 2.6 m across, with no room for its railings; a car deck, a car park or a ferry's deck now needs room for cars, and is the open air made that big when no pattern is.
- A boat that is moored and a car that is parked stand still: the sea or the street outside no longer goes by. Words like moored, docked, tied up, parked, "the ramp is down", or PARKED or MOORED in the heading, stop its view; a vehicle on the move keeps it going.
- A phone in someone's hand is theirs, not the set's. "Nell sits across the aisle, scrolling on her phone" dressed the school bus with a 1940s desk telephone and "both hands"; now the bus has neither, the reading offers to make the phone as a prop, and the director puts it in her hand.
- A place whose words name nothing to put in it ("Somewhere quiet, inside") is the plain room with its own furniture; building it failed with "unknown palette slot @books".
- A new show made from words gestures. The fourth product audit directed Kitchen Science's first episode and not one gesture played: Dad talked for 2.5 s without moving. A speaker's hand beat lifted the hand only to the waist, below the medium and close shots people are cut in, so the director dropped every one. A beat now comes up in front of the chest, whatever the style's gesture size, and "He slaps his forehead" plays a facepalm. The episode now has four gestures, every one seen. Directed again, the demo's cold open has four gestures instead of two, and The Salvage Claim five instead of four.
- Action paragraphs stage as written on shows nothing was tuned to (the fourth product audit's finding 2). Someone introduced as they come in comes in: "slouches in", "crawls out of the tent", "pushes through the crowd", "gets out" at a gas station; Nell sat at the table from the first frame. A title in capitals is part of the name: "GRANDPA WALT" offered no sound called GRANDPA. A prop stays in its scene unless the next one names it: Theo's jug of vinegar no longer rides the school bus. "Turns it over in the flashlight beam" looks the coin over instead of turning June to the boat's wheel, and "runs back toward the wheelhouse" heads for the door, not the wheel. Someone walking past a person who backs away waits until they have. What a body does is shown: "slaps his forehead" (a facepalm), a head put down on the table, a high-five and singing along (faces), "hides behind her" and "grabs his hood" (a walk to her or him), "marches down the aisle", "walks ahead" and following, "stops dead", "looks up from her phone" (at whoever is there), and "waves her over" (at her, once). Whatever someone comes on with or hands over is made as a prop, even on a set dressed with one like it, and "one piece" of a taco is the taco. On the fresh shows 45 of 55 paragraphs are staged, none against the text (27 and 4 before); on the staging corpus, 530 of 539.
- A cap's bill is drawn as a bill from every side. It was a flat band from the front and a thin blade turned three quarters or side on, and the Chief's read as a stick through his eye in every close shot of him. It is now a curved peak out from the brow, seen a little from above as a cartoon draws it, with its shadow on the brow; from behind only what reaches past the crown shows.
- Hair seen side on ends where it lies flat. Curly hair, an afro and a horseshoe of hair round a bald crown stood out their full volume to where they ended, so a ledge stuck out past the forehead or the back of the head like a visor. The hair now thins out toward its edge, and a horseshoe's top edge rises toward the back of the head instead of running level.
- A hat someone wears sits down on their head. Hat Day's tricorn sat on top of the Captain's hair and looked like a hat floating over her head, and Otto's paper hat and the Chief's borrowed tricorn did the same: only a prop hollow underneath came down over the head, and hats are built solid. A hat, cap, top hat, tricorn or paper hat now comes down to the brow; a party hat, a crown or a book still rests on top.
- Studio on an iPad's half in Split View, 680 wide: the timeline's picture stands over its inspector where the two do not fit side by side, instead of holding the window 741 wide with the chat's strip off its edge. The script's Revisions shows its icon alone with the other tools, so where the caret is shows whole, and its find bar's count, arrows and Close go under the query instead of reaching 5 pixels past the window. In Settings' list a long show name wraps instead of being cut, as it was in a 768 window.
- A speaking shot sees the speaker's face from its front half. The framing score called a mouth turned away only past 101.5° from the lens, where the nose and the mouth go behind the cheek, so Otto's two close-ups in the engine room scored 100 showing her ear and the back of her head (audit 4); past 90° it is turned away now. And the mouth is judged where the face is drawn: carried ahead by a slouch or a stoop, turned and tipped toward what they look at, as the engine poses the head. Night Ferry's Walt, "not looking up" at the helm, said his line with the wheel's rim across his mouth, where his measures put it a head above the rim. The director's reframe mends both, and the demo's framing corpus is unchanged.
- A car has a camera inside it for the back seat: between the front seats, over their backs, a little to one side of the headrests, seeing whoever sits behind face on. Every other camera on Road Trip's Oscar stood outside the car and saw him through its body or side on through the back window.
- When the style's sizes come out wrong with all of the director's reframes in, it gives up the one that mends least first, not all that change a size: Scout's Honor kept neither of its mends, Owen's head off the edge of Ruby's close-up and the Ranger's off the top of the three of them, though one alone kept the style's sizes.
- An answer waits for the line it answers. When a speaker still walking turned to whom they talked to as they arrived, the next line followed the turn, not their line: Night Ferry's Stranger answered June while she still talked, both in her shot, his mouth never seen.
- The director's reframe kept none of its changes when the compile refused one of them, or when one was still at fault after six tries: a fresh show lost seven good reframes that way. The change the refusal or the fault is on gives way, and the rest are kept.
- More of the fresh shows staged as written. "Runs back toward the wheelhouse" leaves by the way back even where a piece of the place shares the room's name (the Night Ferry's car deck, open air since its places were fitted, has a ship's wheel it calls the wheelhouse). Whoever "stays in the car" at a gas station with no car is kept out of sight: Road Trip's Gran stood by the snack machine. Mr. Kowalski, introduced partway into the cafeteria scene, comes on and climbs up onto his chair with his megaphone; "MR. KOWALSKI" named nobody, and a titled name now answers to the surname. A walk squeezes between pieces of the set before it walks through one: the forest trail's way off was walled by two bushes, and Owen ran with his head in one. On the fresh shows 46 of 55 paragraphs are staged; on the staging corpus, 535 of 544, none against the text.
- A proposal fits a phone. Its head held the page wider than the screen, Approve off the edge: the line over its name now wraps, and its buttons go under the name where they cannot sit beside it. Every page's head does the same.
- A take recorded in the web booth is as long as you recorded it. On a page that drew slowly the booth lost sound: Godot's web audio mixes on the page's own thread, so each frame that held it longer than about 40 ms dropped that much of the microphone, and a 6 s take with frames of 100 ms kept about 1.5 s of it, chopped. The booth now records the microphone with an AudioWorklet of its own, which keeps every sound frame however slowly the page draws.
- Someone who comes in talking is seen saying it. The set's wide held Kitchen Science's Nell from behind as she came in asking about the volcano and dropped into a chair. Now a shot that sees her face takes her on the way and once she is there.
- A shot no longer cuts back to the picture of the shot before last with nothing new between, where the walls leave the camera no room. In Lunch Rush's school hallway every wider camera was crammed against the end wall into the picture of the scene's wide, and the cut went wide, to Jada, and wide again. Now the wide plays on.
- A line said with the face turned where no camera can go is shot over the speaker's shoulder onto whoever hears it. Night Ferry's Walt says "There. Told you." to the wheelhouse window, the wall at his face, and every camera saw the back of his head with June's across it. Now the director looks over his shoulder onto June, and the framing score no longer faults the mouth of the shoulder a shot looks over.
- A shot over someone's shoulder keeps their head at the side of the picture, clear of the face it looks at. On a close-up's long lens the camera stands further back, and the same step aside left the shoulder's head over the face.
- When the director's mended shots together run off the style's shot sizes, it takes back first the mend that pushed them furthest off. Scout's Honor lost all three mends of Ruby's shots (no room over her head, Owen's head at the edge, a frame cut at her knees) while a bigger mend elsewhere pushed a fourth shot into a close-up the style has enough of. Scout's Honor goes from 3 of 15 shots faulted to none.
- Rendering on the web works again. Every compile on the service, and so every render, status and timeline, failed after a few seconds: the service was built without the singing voice's project, which the voices read whenever a show compiles. The service now carries it, both builds are checked to ship every folder a compile reads, and the service's image compiles the demo's episode before it can be deployed.
- A character made from words is named as the words lead: "Theo, a ten-year-old boy in a red hoodie" is Theo, as are "Theo the baker" and a screenplay's "THEO (10)", where only "called Theo" counted and he got a drawn name. The name is not read for anything else, so a fox called Red is no red fox, and the screenplay's 10 is his age. A title says what it can: "Grandpa Walt" is old and "Mr. Kowalski" is he.
- Someone with folded arms, or full hands, or in a close shot that shows no hands, still beats on the word they lean on: the shoulders lift and drop, the chest leans in and the head dips. A long line beats more than once, so no one talks for long without moving, wherever the line falls, and someone holding something in one hand gestures with the other. The demo's Chief, arms folded, said "held together with tape and optimism" stock still for 2.17 s, and Lunch Rush's Jada talked 2.75 s still at the cafeteria table. A crowd that cheers is shown: the shot that misses it widens to the room, and the body check counts the cheer once, seen when three of the crowd are, not once for each of them.
- The core's tests that start Godot no longer run out of time on a busy machine. On a dev box set to draw on the GPU, each engine run waited for the machine's GPU lease behind other programs' renders (220 s for a render of 20), and the wait counted against the test; a run that holds no lease now draws on lavapipe, and a run's first line says which renderer it used. The files that start Godot run one at a time after the rest, and a file that starts Godot outside that lane fails, saying to list it. The director's 24 random scripts for three people are a test each, in its own time: all 24 in one test ran past it at a load of 50.
- The first-run tour gets out of the way of a page you open while it is up. Its card stayed over Settings once you opened it, and a click on Appearance landed on the card instead. Now the card goes, and a small Continue button waits at the edge of what the tour was pointing at; it brings the tour back at the same step, and so does going back to the page it was on. The tour's buttons take your first tap: its card shows once it is in place and holds still under your finger, where a tap on Skip tour as it slid in used to go unnoticed. On a phone it points at the bar at the foot, not at a sidebar that is not there, and speaks a phone's words: four steps about the bar at the foot, File › Switch show…, the Chat, and Edit › Find anything… and Settings…, with no keyboard shortcuts.
- Two people typing at the same spot in a script at once keep their words whole. A letter typed just before the same letter (a "T" before "Title") could count as typed after it, and the other person's typing at that spot landed inside the word.
- The web edition on a phone or a tablet is laid out for a finger at last: every button, choice and field 44 pixels or more. It asked the browser whether the pointer is coarse and misread the answer (the bridge hands back 1, not true), so on every phone it had kept a mouse's 29 pixels. The site's header Sign in and the sign-in page's Send and Join the waitlist are 44 pixels on a touch screen too.
- In the character studio's pose maker, playing the gesture being made no longer leaves the stage empty when it ends: it goes back to the gesture, held where the editor's playhead is, with its handles. Before, the handles stopped working until something else was chosen.
- The timeline selects only blocks the episode has. Asked to select one it could not find, it kept an empty place in the selection, and the stage, the inspector and the chat failed on it every frame.
- The web service voices a new line with the uv, Python and packages its image carries, and fetches nothing but Kokoro's model, once. Its voices had depended on what a first voice fetched: the volume's Kokoro environment linked to a Python under /root that later images did not have, so the next voice had to fetch a Python and some 80 packages before it could speak. Building the image now voices two lines no take was made for, the second with the network cut, as it already compiles the demo, so an image that cannot voice never ships.
- No one on the web service waits for Kokoro's model: a machine fetches it, with its voices
(354 MB), as it starts on a volume that does not have them, and its log says how long that
took. The first voice on a new volume had to fetch the model itself, 24 to 28 s where a
later voice takes 10 to 13.
reelwright voices preparedoes the same on any computer. - The last of what the fresh shows and the staging corpus ask for, but a seated lean. "He takes it without looking up" takes the plate held out to him. Whoever is bumped into by someone the show has nobody for starts, surprised: "A boy bumps into Pip". "Marches to the hatch, turns to face it and buries her face in her hands" stops in the doorway, beside whoever stands in it, and plays the rest there; the Captain walked out through it. A plate set down in front of someone goes on the table before them, not the chair they sit in, and is there to stare at, and a thing looked at that stands nowhere stands on the piece nearest the one looking: "The Chief stares at the cake". Someone going off shakes their head as they set off. Walking ahead on a trail whose free far marks are all by a way off it goes to the farthest, short of the way. On the fresh shows 52 of 55 paragraphs are staged; on the staging corpus, 550 of 552, none against the text.
- More of the fresh shows staged as written. "A RACCOON waddles out onto the trail" names someone: the reading offers to make the raccoon, a four-legged animal, and not yet seen it comes on by waddling out onto the trail. It was a sound nobody made. Pip, who "waves her over from a table by the window", sits at a seat of a table there; he stood at the crowd's table, which has none. "Each holding a taco" gives each their own: Jada held the one taco and Pip none, so the reading makes Pip's, and "breaks her taco in half" is hers, not his. "Jada and Pip walk against the flow" walks them across the hall together. On the fresh shows 50 of 55 paragraphs are staged; on the staging corpus, 539 of 548, none against the text.
- The first-run tour shows where to connect your Claude. Until Studio's chat has Claude, its step at the showrunner is "Connect your Claude": it points at the chat's first way in, "Chat using my Claude plan" (or the one step to it, or Use Reelwright from Claude), and says it works on the Claude you already have, with no API key. It used to say only "Connect Claude first".
- A thing someone calls their own is theirs. In Lunch Rush, "Jada breaks her taco" picked up Pip's taco off the floor, and "Pip's taco falls" knocked the only taco out of Jada's hand. When every prop so called is someone else's, held or last let go and never the owner's, the words name a thing of the owner's own: the reading offers "Pip's taco", Jada and Pip each hold one, and Jada breaks her own. Taken back from whoever holds it, or had before (the Captain's teacup, lent for a trick), it is still the one they hold. In a car, the steering wheel is still the car's, though a steering wheel is now a thing of its own.
- Nobody holds a prop far bigger than a hand holds. A prop made for "the steering wheel" was the whole car, one of whose tags it is, and Road Trip's Mom gripped a 4.5 m car in her hands. A kit piece too big to carry now answers to its own name, never to tags that name its parts or what it holds: "the steering wheel" is a steering wheel, "a bucket and spade" a spade, "his tools" a toolbox, "a flag" a flag on a stick, no car, sandbox, workbench or 2.6 m banner. And whatever the action does with a prop no hand holds and over a cubic metre, the director puts a hand on it where it stands, never in the hand.
- Start in web Studio's render dialog waits for the service's estimate, saying "Asking how long it takes…" and offering no choice until it comes. Pressed before, it sent the render to the service whatever the person had chosen in Your computers, so with "My computer when it's on" a quick click got the slow queue. When the estimate cannot come at all, Start names no place and the service renders it where the person chose, as the dialog now says; that path sent it to the service too.
- A render on a computer with no graphics card, as the web service's and CI's are, no longer crashes on a shot where someone is out of focus. The demo's sh080 taken over Otto's shoulder and focused on him stopped at its first frame: Otto's own card and the Chief's blurred themselves in a way that software renderer could not draw. They blur the same as before, now in a step it can.
- A place the script's reading builds is dressed with what is there, not with what its people carry, wear or do. Lunch Rush's cafeteria got a lunch tray, a ladder for "climbs" and a chair, and Road Trip's gas station a drinks bar with places to drink at for "a candy bar", a desk and a filing cabinet. Now what someone has with them or hands over is a prop the reading offers to make, their age, looks and verbs name nothing, the script's speakers and its kids and students count as people before they are cast, what a place already has by another name is its own (a cafeteria's "table" is its lunch tables), and a gas station is a forecourt. The wheel they grip, the chair they climb onto and the snack machine they run to stay the place's. "Kicks the machine" takes them to it, as "opens the fridge" does.
- A gesture both behind a piece of the set and cut off by the frame is seen. Lunch Rush's Pip, sat at the cafeteria table, beckons Jada over in a shot that cut her hands off, and the table hid them from every other framing. A bigger beckon cleared the table but not the frame, and the director tried each alone, so the beckon stayed unseen. Now it plays at full strength, up over the table, in a long shot of the two. A gesture on no line, the action's own, may also play bigger, since no line's feeling holds it down.
- A render whose engine stopped says what the engine said last in its log, on a machine with no display too (the web service, Linux without a desktop). There the engine runs under xvfb-run, which passes on what it says as its output, and the log's "its last words were:" stood empty, as did "it ended with code 1 and said nothing" when the engine did not start.
- A scene heading finds its set the way a person would. A set
generate setdrew is called "Harbour, seed 1" and has no aliases, so "EXT. HARBOUR" named nothing and Direct refused with no set is called "HARBOUR". When no set is called what a heading says, the set named with its words is it: the same kind of place, one's words holding the other's. "INT. BRIDGE" is the show's one bridge, "INT. ENGINE ROOM" the Marigold's. "EXT. HARBOUR" is still no harbour bridge, two bridges alike are still asked which, and an alias still comes first. A heading no set fits plays on the show's one plain set on its side of the walls, the open air or the room a blank show'sgenerate setdraws: "EXT. HARBOUR" on "Outdoors (open air), seed 3", as release-pipeline's desktop check had it. Direct says so, and the reading says so and still offers to make the harbour. Two plain sets on that side are asked which, and a heading with no INT. or EXT. gets none. What Claude reads says it too: the screenplay's needs and a written script's notes still list HARBOUR as a place to make, "until then it plays on Outdoors (open air), seed 3".generate setwith no--namesays how a heading finds the set it drew, and that--namenames it. - Studio's toasts say what happened once, in words. Long work names what it worked on, never the tool behind it: "Drew characters" and "Directed an episode", where they said Drew “generate_characters” and Directed “direct_episode”. A long Direct is said once, by "Directed Lantern Night" with Undo, not again beside it. A render that failed and was tried again takes its red toast away, so the full disk is no longer said beside "Done in 2 min 15 s". Ctrl+Z on a proposal Claude made from outside says "Brought back the proposal…" alone, without "Claude, through Claude Code, proposed…" again beside it.
- On a phone the chat opens at its top. With no conversation yet, its welcome and the way in to Claude are taller than the phone's sheet, and the chat held them at their foot as it does a conversation's newest message: it opened past "What should we make?" with the setup's own heading cut off. A conversation still keeps its newest message in view.
0.11.1
1 change: 1 fixed.
A fix for signing Claude in to the web edition.
Fixed1 change
- Connecting claude.ai or Claude Code to the web edition works again. It stopped at "This connection can't go on … its address answered 403": claude.ai turns away requests from the service's cloud address, so the service could not read how Claude describes itself. It now uses the copy of that description it keeps, and checks it the same way.
0.11.0
64 changes: 32 added, 10 changed, 22 fixed.
Performances worth watching. Bodies breathe, shift their weight and glance between lines, a speaker's hands move with the words, and a gesture the director cues is in the shot. Every shot is framed for its subject's face, with room above the head; a close-up opens on a look already made, and the timeline lists what the director could not mend. A wrong mouth or a pose can be fixed by hand and survives a re-direction. A character can speak in a directed ElevenLabs voice behind your own key, and an actor's take in the booth can be said again in that voice. The places a sitcom lives in are in the library, built from their words: bedrooms, a living room, a shop, a school, a diner, a park, a street, and a car, a bus and a boat with the world going by. Studio speaks Spanish. Write a script together live and read Claude's rewrite of a long one change by change, reach all of Studio by keyboard, and open a Reelwright service to anyone with free accounts and a waitlist.
Added32 changes
- A wrong mouth can be fixed by hand. The arrow before the Dialogue row's name, or Draw its mouths on a line, opens a Mouths row under it with each line's mouth shapes as Rhubarb read them from the take, a letter for each: A closed, B slightly open, C open, D wide open, E rounded, F puckered, G teeth on the lip, H tongue raised, X at rest. Click one and choose another in the inspector to draw it over it; with a shape chosen, drag along the row to draw it over as much of the line as you like, and Esc to stop. What you drew shows in the accent color; Delete, or Back to Rhubarb's, gives it back. Each stroke is one change, and Ctrl+Z takes it back. A drawn mouth is kept by the words under it, so a new take of the same words, slower or faster, plays it over the same words; where the words change, it is dropped, and Studio says which, rather than land on the wrong syllable. The same on the desktop and the web.
- A pose can be keyed by hand on a character, over what the director made (the third product
audit's finding 10): an elbow out of a table, a hand on a shoulder. On the timeline, the arrow
before a character's name opens their Poses row (folded away until then, so no row moves);
right-click it, or their lane, and choose Pose keyed by hand: one of their poses, those made in
the pose maker first. It comes in over a few frames, is held, and goes. The inspector changes
the pose, the hand and those frames, a drag moves it and Delete takes it away; Ctrl+Z undoes
each. The bones the pose moves take it, as the pose maker shows it, and the rest of the body
does as directed. A pose is kept by what is said or done where it was keyed: a new take of
the line carries it to the same word, and directing the episode again keeps it while the
scene still says it there. Where it no longer does, the pose is not played, and Studio says
so in plain words. Episodes are EpisodeIR 1.63 when a pose is keyed (
Scene.poses, theset_pose_keyedit) and the Timeline 1.37 (Actor.poses). - The owners of a Reelwright service can open its web edition with one setting, Settings ›
Who can join in the admin console, and it stays invite-only until they do: while it is,
everything works exactly as before. "Invite-only, with a waitlist" lets someone with no
invitation leave their email address on the sign-in page and see their place in line, the
same whenever they come back. Their address is kept in the service's own database and
nowhere else: never written to a log, never sent anywhere, and nothing is emailed to it
while it waits. Owners let people in from the Users page, one at a time or the first so
many, which sends each an invitation;
reelwright host waitlist list|admit|removedoes the same from the server's shell. - "Open, with free accounts" lets anyone sign up from the sign-in page with a code by email. Each account made that way is on the free tier, with limits the owners set in Settings › Free tier: renders a day (5), render minutes a month (60), storage (1 GB) and Claude spending a month on your own key ($5). The service enforces each one, and when it stops you it says which limit you reached and when it starts again ("You can start more at midnight UTC, in about 3 hours"). Settings › Account in the web edition shows your use against each limit. People invited by an owner, and the owners, have no free-tier limits.
- New accounts and the waitlist are limited by the visitor's own network address, through reelwright.diy as well: 5 sign-ups and 5 waitlist tries an hour, 20 a day.
- Owners can limit how many renders anyone may start in a day, beside renders at once and render minutes, in Settings › Quotas or on a person's page.
- The places a sitcom lives in are in the library, each built from its words with no model: a kid's bedroom (bunk beds, a desk, a beanbag), a grown-up's bedroom (a double bed two can lie in), the living room (a sofa facing the TV, the front door and the kitchen door, stairs up), a corner shop, a school corridor of lockers, the school cafeteria, an office's break room, a park with swings, a slide and a picnic table, a street of houses whose front steps you can sit on and whose front door you can come out of, and a car, a bus and a small fishing boat. Each has places to sit, stand and lie, ways in and out, and day and night light. "INT. MAYA'S BEDROOM", "a corner shop", "EXT. CITY PARK", "INT. SCHOOL BUS" choose them.
- In the car, the bus and the boat the world goes by outside: a new backdrop,
passing_view.v1, draws a road through a town or the country, or the open sea with a wake, streaming past the windows by distance (posts and parked cars race by, houses and hedgerows pass, hills creep, the road runs to a vanishing point), under the scene's own sky, with lit windows and street lamps at night. - Someone written to sit on the sofa sits on one of its seats, and someone to lie on it lies along it; "the TV" names the TV. Someone lying in bed rests their head on its pillow with no warning that it goes into the bed, and "sits at the wheel" is the driver's seat.
- Bodies act between and through their gestures (the third product audit's finding 6). Every character a scene plays breathes, and breathes in before a line and out through it; shifts its weight to the other foot every few seconds (in a seat, it shifts over) and at the start of each of its lines; leans into its lines and moves on their beats, more on an excited or loud line and less on a sad or frightened one; and settles after a gesture or a walk. Its eyes glance about a little more. All of it grows with the style's idle dials (fidget for the body, breathing, eye darts) and is a function of the frame, so a render, Studio and the web edition draw the same frames. A model sheet or a pose in the pose maker keeps its pose.
- A face that shouts or gasps without smiling no longer reads as a grin: its open mouth is a rounded shape with the corners a quarter of the way down, where it was a D with the corners at the top (Night Ferry's "GRANDPA!"). Smiles and frowns draw as before. A pose keyed by hand is posed as it was made: the body's idle movement gives way to it as it comes in.
tools/faces-check.sh [--out dir] [character files]draws every emotion's face, at rest and shouting, for a few characters on one contact sheet to judge by eye, and fails when fear, anger or grief turns the mouth up in any lip-sync shape (under a walrus mustache, when the mustache's ends lift).node tools/body-check.ts <show> --episode <id>says whether bodies act: for each shot over a line spoken on screen, the longest the speaker's body stays still and how much body and face move; for each gesture the episode cues, whether its hands are in the picture. It fails when a body stays still more than two seconds while its character talks, or a cued gesture is not seen;--pixelsadds the audit's own measure, the change between frames in the body against the face. The engine's newprobecommand, which it runs, plays a job without drawing it and writes where every bone is on the picture at each frame.- A voice that takes direction: ElevenLabs' Eleven v4, with your own ElevenLabs key, beside
Kokoro, which stays the free voice on your computer. Give a character one of your account's
voices (in the character studio's Voice, or by its id from
reelwright voices list), and each of their lines goes to it with its direction in ElevenLabs' own words. The emotion and how strong it is, a whisper or a shout, the pace, the parenthetical and your note to the actor are sent as tags like [very sad] [whispers] [under her breath]. A stressed word goes in capitals and a pause as "...", so the read itself changes, not just its pitch afterwards. Each line is priced before it is sent and paid from the show's budget, on the same ledger Claude spends from. The run says what it will cost first and sends nothing past the first line the budget cannot pay for. A line ElevenLabs cannot read (no key on the computer, or the budget) is read by Kokoro, and says so on that line. Once a key is there, voicing again reads it in ElevenLabs. reelwright key set|status|forget elevenlabs [--check]keeps the ElevenLabs key the way the Anthropic key is kept: owner-only, never printed. The check is free and says which plan the key is on; on the free plan, ElevenLabs' audio may not be used commercially, and Reelwright says so.- Settings › Voices, in Studio and on the web: paste your ElevenLabs key, and Studio checks it for free and says which plan it is on. Test and Remove are there too. In the character studio's Voice, your account's ElevenLabs voices are listed beside Kokoro's. Use this voice gives the character that voice, and Kokoro still reads them on a computer with no key. On the web, and for a show on Reelwright in the installed Studio, Reelwright keeps the key encrypted for your own work only, as it keeps your Claude key.
- The timeline's Voice lines says what ElevenLabs would cost before it voices anything, and asks first: "Voice 2 lines for at most $0.0123?". Afterwards it says what was spent. A line Kokoro read in place of a character's ElevenLabs voice has a small warning mark on the timeline, and its tooltip says why. Activity says it too. Once ElevenLabs can read those lines, Voice lines offers to read them again. The session protocol is 1.2. A 1.1 Studio and a 1.2 daemon still work together, either way round.
reelwright voice --estimatesays what ElevenLabs would cost an episode's missing lines, and sends nothing.reelwright voices try "<line>" --emotion sadreads one line with your key at most $0.05, saying what it sends and costs first; with--recordit keeps the call, so the tests can replay a real ElevenLabs line without calling it.- The timeline by keyboard alone (the product audit's finding 12). Tab reaches every control on the page: the header's views and buttons, the picture's toggles, the transport and its speed, the edges between the picture, the tracks and the inspector, the tracks and their corner, the zoom, the inspector, the library, the mixer's faders and buttons, and the stage. On the tracks, Enter selects the shot at the playhead (as it does with nothing selected anywhere on the page) and the arrows go from block to block; a focused edge moves by its arrow keys (Shift: further) and Home puts it back; a focused fader moves by its arrows and 0 puts it back to 0 dB; the focused stage zooms by =, - and . A click on a button still leaves the timeline's keys to the timeline, so Space plays, and Tab goes on from it.
- Both directors frame their shots better, and the timeline lists what they could not mend
(the third product audit's finding 7). Every shot is scored for the mouth of whoever speaks
in it, someone or something standing across whom it is of, a head or a body cut by the
frame's edge or at the knees by its bottom, the room over a head with its hat and hair, and
a setup cut back to with nothing new between. After the cut is made, each faulted shot
tries a step round, a size in or out, the two framed together, a view from above or the
set's other setups, and keeps the one that scores best without a jump cut or a crossed
line. The Salvage Claim's engine room no longer has Otto's or the Chief's head at the edge
of the other's close-ups, by either director, and the Chief stood up at his console is
framed whole. The room over a head is measured to the top of the head as it is drawn, its
hair's tips and its cap or hat, and a shot whose top touches them is faulted: a street's
two-shot from behind a parked car is framed on the one it showed, walking off with room
over her hair and goggles, not from the bench camera that cropped them. What is left shows
on the timeline among the compiler's notes ("the right edge of shot sh210 cuts the Chief's
head"). A line written (O.S.), (V.O.) or "(from
behind)" may be said unseen.
core/test/framing-score.test.tsscores every shot of the demo, both directions of The Salvage Claim, Hat Day and Night Watch; before: 26 shots with a head or body at the edge, 7 with someone across them, 4 setups repeated; now 1, 4 (all the Chief hiding behind his console on purpose) and 0, and one shot of the Chief standing up from behind it with his cap at the top of the picture. - The site's Hat Day and Night Watch are re-cut by the heuristic director: Night Watch no longer frames the Chief with the Captain and Otto cut by the frame's edges, and Hat Day's two-shot of Otto and the Captain no longer crops her hat's feather at the top.
- Write a script together, live. On a show on Reelwright, everyone with the script open writes in it at once, in the installed Studio and in the browser alike: what one person types appears on the others' pages a moment later, their carets and selections show in their colours with their names, and "Bo is here" says who else is in it. Ctrl+Z takes back only your own typing, a word at a time. Nobody has to save: the show has what you wrote a couple of seconds after you stop, for the director, the reading, Claude and anyone on their own computer. "Mark a version" (Ctrl+S) keeps the script as it is in History, and a version is also kept when the last writer leaves and after five quiet minutes. Typing on a dropped connection or offline goes in when you're back, once; a draft you left offline brings its typing back. A change to the script from outside, such as the showrunner's rewrite or a version restored, comes in merged with what people are typing, and nobody has to choose between versions. A viewer watches the writing as it happens. The session protocol is 1.3.
- A speaker's hands move with their words. Every spoken line of four words or more gets a small hand beat on the word it leans on ("picking up something BIG", a word in capitals, a word the parenthetical asks to stress), chosen by how the line feels: an open hand for most lines, a fist for anger and resolve, a palm turned up for a question or a joke. Fear, grief, worry and a deadpan keep the hands still. An intense line's own gesture (Otto's excited thumbs-up) now plays as strongly as the line, up at the chest instead of at the waist. The same script stages the same beats every time.
- A proposal for a script that people are writing in can be approved. Claude's rewrite used to go stale as soon as anyone typed, since a live script is written as people write; now the approval merges it with what they wrote, letter by letter, and nobody's typing is lost. Where Claude rewrote a paragraph someone had changed since, their text stays, and the proposal shows both under "Kept as people wrote it". The session protocol is 1.4.
- A set can be seen in any of its lights, and it keeps the one you chose. The light menu over the set view says each as its hour and its weather make it: Day, Evening, Night, Rain at night; one that says neither, or that would read as another does, keeps its own name ("Red alert"), and what it is for shows under the pointer. L and Shift+L step through them. A set opens in its first light, as before, until you choose another; then it opens in that one, after Studio is closed too. The outliner, the lighting editor and the key light's label over the view name each the same way. The same on the desktop and the web.
- A proposal for a script shows what Claude changed. It used to show the whole script struck out and the whole new one under it, cut off on a long script; now it shows only the paragraphs that changed, with a couple of lines around each, the words that changed marked, and each stretch left alone counted in a line. Where an approval kept what people wrote, that sits at its line. The lines wrap, down to the narrowest window Studio lays out. The session protocol is 1.5.
- Studio speaks Spanish. Settings › Appearance › Language offers English and Español, and by
default the language of your computer (of your browser, on the web). The choice is kept, on
the desktop and on the web alike, and takes effect when Studio starts again: Restart now does
it at once. Every word of Studio's own is translated, in plain, friendly Spanish, and so is
every field and choice of a document's Fields. So are the core's refusals, its toasts and the
problems it finds in a show; its other messages (the director's notes, how the script reads,
the render's) are still in English, and come next. Your shows keep their
own words: titles, names and scripts are never translated, and a show still has its own
language in Settings › The show. Translators find every word in one template
(
engine/translations/studio.pot, gettext), and the words Studio already uses inengine/translations/glossary.md. Studio's checks now fail on a word a person reads that is not translated, and the tour runs in a pseudo-language whose longer words find the labels that cannot hold them: the settings list, an episode card's facts, the style lab's summaries and the character studio's tiles now wrap longer words, and the find field drops its key hint when its words need the room. - Act a line yourself and hear it in the character's voice. After a take in the booth, its row
says "Play it in Ottoline Brisk's voice (George)": the character's name, then what your
ElevenLabs account calls the voice, the same wherever Studio names it. ElevenLabs' Voice
Changer says your take again in that voice, keeping your timing and feeling, and changes only
the voice. Studio says what it costs first ("Say it in Ottoline Brisk's voice (George) for at
most $0.0060?", about $0.12 a minute of take) and sends nothing until you say so. The new take
plays for the line, listed under yours: play each to compare, and Use this take keeps either.
Yours stays. It is as long as your take and as loud, Rhubarb reads its mouth shapes again, and
any mouth you drew over the line stays on the same words. A recorded line's inspector on the
timeline offers the same. It goes through your own ElevenLabs key and counts against the
show's budget, on the web too. ElevenLabs' free plan is told before sending, and its takes are
marked, that its audio may not be used commercially. With no ElevenLabs voice for the
character, or no key, Studio says so and what to do; with neither, nothing changes, and Kokoro
stays the free voice.
reelwright voices change <take>tries one take from a terminal. Session protocol 1.6 (takes.convert). In a narrow window (600 to 720 px, with the rail folded) the booth puts the lines above the prompter, so no take is cut off. - On the web, Render preview and Render first say how long the render takes on Reelwright and after how many renders ahead of it ("About 15–38 min here, starting now."), and beside it your own computer: how long it would take there when one is paired and on ("About 1 min on Wil's box."), that it is offline, or, with none paired, Add a computer, which opens Your computers to pair one. Start renders it where you picked; your computer is picked when that is your choice for the show. The time comes from the service's own renders: how long its recent ones took a frame, the newest counting most, said as a range that narrows to how much they vary once it has drawn five. Before that it starts from renders of the demo measured at the service's size, said with a wider range. The desktop renders as before.
- Renders on the web service now take turns at its two CPUs, about a minute of drawing at a time, instead of all drawing at once: a preview goes before a final render, and people take turns, so a preview asked for while someone's long episode renders starts after that render's current minute, not after all of it. A render waiting its turn says so, with how many draw before it and about how long it takes from now ("Waiting its turn on Reelwright: 1 ahead · about 7 min left"), and the wait uses none of your render minutes. Session protocol 1.7.
- The owners of a Reelwright service can cap render minutes a day as well as a month, for every account, for the free tier (20 a day to start) and for one account on its page. A render asked for once the day's minutes are used is refused before it starts, saying when they start again and that your own computer can render it meanwhile. The admin console says what a render minute costs the service at Fly's list price ($0.0015 on its machine), what each limit comes to, and what everyone rendered this month.
- Render workers: the service can draw a render's chunks on extra Fly machines of its own, started when a render can use them and stopped when idle, at most as many as the console's Settings › Render workers allows. It allows none until its owners say otherwise: each costs money while it runs ($0.37 an hour for the default size), and the console says what. A worker that goes away mid-chunk has its chunk drawn by another, or by the service.
Changed10 changes
- Typing on the script's pages keeps up on a feature-length script. On page 60 of 141, a letter used to take the editor 17.5 ms and an Enter's layout alone 28 ms. Now a letter takes about 3 ms and an Enter about 6 ms, both well under a frame. When an Enter pushes every page break after it on, you see the pages around it at once and the rest follow a moment later. Typing a character's name no longer reads the whole script again at each letter.
- Out of doors there are ways on and off. A street, a park, a beach or a forest from Reelwright's library, and a blank show's open air, have a way at each open side, just past the edge of the ground, with a mark just in from it. So "walks off down the street", "comes up the path", "strolls in from the left", "strolls up the beach to Maya", "disappears into the trees", "stumbles out of the woods", "heads home" and "runs after her" come on and go off, where nobody could leave or arrive before. Out of doors, someone who "slips back inside" goes off through the nearest door. Someone who went off can come back, indoors or out: "Ben comes back in" and "Maya comes up the street" bring them on again, the way they went. On the staging corpus, with sixteen cases added, 377 of 405 paragraphs are staged (93%), none against the text.
- When you reach your monthly render minutes or your monthly Claude limit on a Reelwright service, the message says the date they start again.
- reelwright.diy names the current version and the systems it can be downloaded for from the release itself, with JavaScript off too: the home page says "for Linux and macOS" and "Version 0.10.0 · out now for Linux and macOS · Windows coming soon", where it named Windows too and the first version ever released.
- The director stages the sitcom places' comings and goings and their seats. "Dev gets in on the passenger side" comes on into that seat, "gets out and slams the door" and "gets off the bus" go off, "gets on the bus" comes on through its door, "comes up from the cabin" through the boat's. On a street, "Rosa goes inside" goes off through the house's front door and "Maya comes out of the house" comes on through it, while "Ben walks up the sidewalk" and "walks away" use the end of the street, and whoever comes on there walks on up to whoever is there rather than stopping at the street's end; in the diner, "hurries out of the diner" leaves. Nobody sits on nothing any more: "Dev sits down across from her" takes the seat facing her, "sits down next to him" the one beside him, "sits down across the aisle" the seat across it, and "Dev sits." the nearest free seat; with none free they walk up and stay standing, and the next line waits until they are down. A cat sits and a bird perches where it is. "Rosa gets into bed" from the end of it lies in it, "comes to the counter" and "gets up and stands in front of the TV" go there, and someone only looked at waits off until they walk in. "June backs away, wide-eyed" looks afraid, not surprised, so her "GRANDPA!" after it is called out in fear instead of drawn as a startled grin. On the staging corpus, 457 of 480 paragraphs are staged (95%, where the 465 before these changes had 425), all 60 of the sitcom places', none against the text, which now counts a sit with no seat as against it.
- Adding a set to a big show no longer slows down as the show grows. Every change used to check
the whole show again, twice when it was proposed and twice when it was approved, so each set
already in the show added about 18 ms to every change: on a show of 200 sets an approve took
4 s, renaming a set 8 s and moving a cut 14 s. Now a change checks only what it changes and
whatever names it, and reading the show again parses only the files that changed. On 200
sets an approve takes 0.15 s, renaming a set 0.5 s and moving a cut 0.9 s. A change is refused
for exactly what checking the whole show would find, and a show you open, import or check
with
reelwright validateis still checked whole. - "June drops into the chair by the radio" takes the chair by the radio, and "the chair by the plant" the one by the plant when the kitchen has two: a seat is the kind the words name, nearest the thing they name it by, and a piece with seats of its own is sat in on one of them. With no such seat she stays on her feet, where she walked up to the radio, which the compiler left out, and sat on air. Whoever comes in through a door in a deep wall, up through the hatch inside a boat's wheelhouse or down the engine room's ladder, appears in its doorway, where the wall clears their head, not standing inside it; going out, they vanish there. On the staging corpus, with four cases from the Night Ferry and a kitchen, 461 of 484 paragraphs are staged, none against the text, which now counts a head in a wall as against it.
- Every other page by keyboard alone too. Tab reaches the booth's buttons, its microphone and its lines, each take's buttons and a recording's waveform, where [ or ] chooses its head or its tail, the arrows move it and Enter makes the trim; review's picture, its bar, where the arrows step a frame and Page Up and Page Down ten seconds, and in a wipe the line, which the arrows move; the 3D view's buttons and a proposal's; the activity list, which takes the keyboard as it opens; the menus on the season board, the show's lists and every other menu button; and a preview that failed. In the notes on a render or a script, Down goes to the people a mention offers. In the booth and in review Space still records and plays whatever has the keyboard, and Enter presses it. After an edit made by the keyboard, the focus stays where it was. F10 opens the menus. The messages at the window's foot never take the focus: Ctrl+Shift+N (Alt+Shift+N in a browser) goes to the newest one's Undo or Open and back, and one stays while the keyboard is on it. Every control the keyboard reaches shows its ring in every theme, at 3:1 or better.
- A piece of the set between the camera and whom a shot shows costs points by how much of them and of the picture it covers, not only once it buries them or fills a third of the frame for half the shot. A piece they stand at, like the Chief at his console, is the staging's and costs nothing. Before a director takes a camera with a piece still in front of its subject, it tries a step aside, a longer or a wider lens, and the camera lower or higher. The street's long shot of Maya walking off past a bin, which scored 100, now scores 95, and the director raises the camera over the bin.
- Nobody sits or lies where their head would go into the set. A seat or a bed is taken only by someone whose head fits above it there, sitting or lying as it has them, so a grown-up who "sits on the end of the bunk" in the kid's room takes the bench at the bunks' foot, not the bottom bunk under the top one, where a child would still fit. A seat too low to sit up in is taken crouching when the text puts them there or no other seat will do: the Chief scoots into the tent's low end bent over, out of the drip, and a grown-up told to sit on the bottom bunk crouches on its end. A walk passes only where one stands upright, so going to the beanbag no longer crosses the bottom bunk under the top one. On the staging corpus, which now counts a head in any piece of the set as against the text, 467 of 490 paragraphs are staged, none against it.
Fixed22 changes
- A link to someone else's show opens that show on your first visit to Reelwright, with nothing over it. Studio used to open your own copy of the demo first, offer "Make your show" over it, and open the show you came to see behind the offer; the first-run tour started over it after. Now the offer waits until you go to a show of your own or close the shared one, and the tour never starts over a show someone shared with you.
- A look from your words keeps what they say outright, in New show's How it looks, the style lab's Four directions and Claude's style proposals. "Thick ink lines" draws thick lines and "no outlines" none; "muted" lowers the color and "vivid" raises it, and "black and white" takes it away; "foggy", "misty" or "hazy" fades the distance and "clear air" keeps it clear; the colors you name are the palette's ("teal and amber": a teal key and an amber second). The looks that agree with your words come first, and each says what it kept. "Flat cel shading, muted teal and amber, thick ink lines, foggy harbour lights" made a style with no lines, more color and no fog.
- A heading kept off the foot of a page by the paragraph under it now comes back to that page when the paragraph grows long enough to break across the two, as a whole layout puts it. It used to stay on the next page until the script was opened again.
- A place made from your words is the place you described (third product audit, finding 2). "The cramped wheelhouse of an old car ferry: a ship wheel, chart table, radio, windows all round, a swinging lamp" was built as the moon, because the moon's place mentions a radio mast; now it is a room with a ship's wheel in the middle, a chart table with the radio on it, windows on every wall and a lamp hanging over the wheel. A place takes one of Reelwright's patterns only when it is that kind of place (a corridor, a kitchen, a forest) or says words that only that pattern has ("lunar", "kelp", "speakeasy"): one word another place mentions in passing never decides, nor a table, a lamp or a radio, and a scene heading's INT. or EXT. is kept. Anywhere else (a bedroom, a corner shop, a school corridor, a park at night, the inside of a car, a boat's deck, the front of a house) it is the plain room or the open air dressed with what its words name: the pieces of Reelwright's library, and, where they name nothing, what such a place has (a deck its railings, a bedroom its bed). It says plainly what no piece is ("Farmyard has no wheelbarrow"). The script's reading does the same: its "Make a set for …" and "Make all N new sets" build each place from what its scenes say is there, at the time of day its headings say. New in the library: a ship's wheel, a radio, a life ring, a bollard and a ship's rail; a bed, bunk beds, a wardrobe, a chest of drawers and a bedside table; a car seat and a dashboard; a fence.
- A night is never played as day, and rain is never "no lighting with rain". A place whose words say night, rain, snow or fog is built with the lighting for it, from Reelwright's lighting looks (a moonlit night in the rain); and Direct gives a set the night, evening, rain, snow or fog its scenes ask for when it has none, proposed with the episode. An open-air scene that opens in the rain ("A back alley in the pouring rain") opens lit for it.
- A heading's sub-place ("FERRY - WHEELHOUSE") is read with its scenes: the reading's place picker weighs what they say is there, which it missed for any place of two parts. A set made from "MAYA'S BEDROOM" is called "Maya's Bedroom", not "Maya'S Bedroom".
- The timeline in the light and high-contrast themes. The picture's toggles sit on the picture's own dark chip, light in every theme, where the light theme's dark icons were lost on a dark frame. A sound's words sit on its block's own color, not on its waveform, where the light theme's dark words were lost on the blue. The level meters have an edge, where the light theme's empty ones were two blank white bars. A number field's arrows take the theme's ink, where the light theme's were all but invisible.
- Tab goes on from a logline, a setting or the style lab's look in words to the next field, as it did before they wrapped, and from the caption box to its dialog's buttons.
- A scene headed INT. no longer plays on the outside of a place of the same name, nor EXT. on its inside. "INT. THE MILLERS' HOUSE - LIVING ROOM - NIGHT" played in the street when the front of the Millers' house was a set; now it is a place still to make, which the reading offers to build, and each side keeps its own scenes. A show's own kinds of set (an engine room, a ship's bridge) play under either heading, as before.
- A gesture the director cues is seen. Otto's thumbs-up played below the bottom of a medium shot, and a wave in a close-up was never seen. Now, once the cut is made, the director looks for each gesture's hands in the shot playing at its stroke: one that carries the beat widens its shot (a medium shot for a close-up), or the cut away from it waits for it (Otto's hand on the cracked porthole no longer goes unseen as the cut goes to the Chief), a listener's nod moves to the cut that shows them, and a beat no shot shows quietly goes. A gesture the script writes is never dropped: when no shot shows it, the director says so. A gesture behind a piece of the set (Otto's palms behind the workbench) counts as unseen too, and a hand only counts as in the frame with room to spare for how far the director's idea of a hand can be from where it is drawn. The director says what it changed. A small hand beat never pushes a close-up out. In the demo's cold open and The Salvage Claim, 5 of 8 cued gestures were out of frame (3 as the engine draws them); now none of 8. In the demo's cold open the Chief now points at Otto on "kid" at full strength, his hand over the console he stands behind instead of behind it.
- The library's boat sits in the water up to its red waterline stripe, where it seemed to
float above the sea. The passing view draws the sea on the water's own surface as well as
on its dome, so a hull is hidden below the waterline. The foam where the hull cuts the water
now hugs the hull round to its bow, where it ran past the bow in straight white bars that
looked like a road's markings. A new
bowMparam says where the bow's point is. - In the library's kid's bedroom a grown-up has somewhere to sit: a bench at the end of the bunks, clear of the top bunk ("sits on the bench at the end of the bunks"). Sitting on the bottom bunk put a grown-up's head in the top one.
- Opening another set by its address kept the first set's name over the inspector, beside the new set's fields ("Ferry - Wheelhouse" over the car deck). The inspector names the set shown now, and its new name as soon as it is renamed. So does the page's heading in the set explorer and the character studio, which kept the old name until it was opened again. Scene previs names a mark in words ("Chair seat"), as the set explorer does.
- Someone who looks down or up and then walks or turns takes the look with them. The engine turned the head back to the spot where they had been: Night Watch's Chief, setting off across the bridge, looked back over his shoulder at the floor. The timeline's film grammar and the framing score now read every look as the engine draws it, so they no longer list different faults for the same shot.
- The framing score's heads match what the engine draws: the engine's probe now reports each
drawn head's box, hair and headwear included, and
core/test/engine-heads.test.tsholds the score to it. The top is within a tenth of a head, the bottom within a quarter (an open jaw, the Chief's walrus mustache), and the width within a sixth. Spiky hair stands out less at the sides than over the crown, so the score now has Otto's head a fifth narrower, as it is drawn. - A room's window shows the time outside. The blank room's window paints a sky over a hill, and it stayed a pale day sky at night, in the evening and in the rain. It now takes the light outside, as glass does: gold in the evening, a deep blue night, grey in the rain, and exactly as painted by day. A window resized in the set explorer keeps it too. The blank room's evening now says its hour (7 in the evening), so a room made from it from now on shows dusk outside then; in a room made before, give its evening an hour in the lighting editor and its windows follow.
- The timeline names a set's lighting as the set view does ("Rain at night", not "night rain"): a lighting change's Lights, the scene's opening light and the Add menu's Lighting change.
- The piece maker follows its kit. Renamed in its Fields, or changed by someone else, the kit kept its old name over the page and its old pieces in the list until it was opened again. Now both follow, and the piece you are making stays as you left it.
- Moving over to a place in small ways is staged. "The Chief scoots over to the end of his bedroll" scoots him along it to its far end, as "slides down to the far end of the bench" and "shifts along his bedroll" do; all three staged nothing. Scooting, scooching, shifting, edging and inching to a place walk there, edging and inching slowly, and "crosses the room to the window" or "crosses the street to the phone booth" goes to the window or the phone booth. On the staging corpus, 476 of 498 paragraphs are staged, none against the text.
- A shot no longer opens on a head whipping round. A character who turns to look at someone as a line starts, cut on the line, used to spend the close-up's first third of a second turning: The Salvage Claim's Chief, turning to Otto for "l05". A turn that would still be moving in a new shot's first 8 frames is now made in the shot before, done by the cut, when the new shot shows whoever turns (anyone else turns as asked, so the shot before still ends on the look it had). Over the framing corpus, 5 cuts opened on a turn; none do now.
- A cut on the end of a line comes after its last frame. Rounded to the nearest frame, it could open the next shot on the line's last frame, the speaker's mouth still on its last shape: 6 cuts in the framing corpus did, none do now.
- A character you describe in words comes out as you described it (third product audit,
finding 2). "A sixteen-year-old girl deckhand in an oversized yellow rain slicker" is a
teenage girl, she/her, in a baggy yellow slicker over the show's own clothes, where she was a
naked yellow figure at an adult's height. A colour goes to the garment, the hair or the eyes
it is said of, and skin comes only from skin words ("pale", "dark-skinned", "green-skinned").
Slickers, raincoats, coats, caps, hats, overalls, uniforms, dresses, jumpers, boots and some
hundred more are worn as said, long or oversized, and nobody is drawn unclothed: what the
words leave out is the show's own clothes. Ages ("sixteen-year-old", "in his seventies",
"grandfather", "teenage", "kid", "an old sailor") set how old the body is and how tall, in a
kit's show too, whose people had no ages. A person made from words is one of the show's
people, with its faces, hair and builds and its style's colours, so no proposal warns that
its own eye colour breaks the style. The script's reading dresses the people it makes the
same way from what the action says of them, and gives each the pronouns their own sentences
use: "He holds out an old brass coin" makes the Stranger he, where "walks past her" made him
she. In one show no two characters get the same voice, or the same hair and face, made one
at a time or all at once, in a blank show or a kit's. Someone described in words also takes
nobody's face, hair style or garments where the show's people allow it (the garments the
words name, and a uniform in the show's own colours, may be shared), and a drawn cast puts no
one face or garment on two people: Night Ferry's three, made beside the demo's cast, are
neither each other nor Otto and Barnaby, where 12 of 20 such Night Ferries had two with one
face or one hair style. Someone the words give no pronouns reads as one sex all the same,
their hair, name and voice alike: the stranger, who speaks as a man, no longer wears a bob
under a woman's name. A man gets no long, tied-back or bobbed hair and a woman no balding or
buzzed head unless the words say so. A name drawn for someone reads as a
man's or a woman's as their pronouns say, and an old person's is no child's: the grandfather
is no longer Larina. Two characters waiting to be approved never write one file: describing
a second person, who drew the first's name, replaced the first and lost them on approval;
the second now gets a name of their own, and only the same words again redo the first. Grey hair and a balding head come with age or with the words, and a bun
only when asked, so a very tall pale stranger is no longer an old lady with a bun. A wool
cap, a knit cap or a woolly hat is a beanie, drawn snug with a folded cuff and no brim, and
the wardrobe offers it beside the cap and the hat. Yellow is yellow: a yellow slicker was
drawn a golden mustard, nearer goldenrod than gold. A corpus of 78 descriptions, five
casts, the audit's three and four deckhands at 20 seeds each, and the audit's script keeps
it so, and prints its score
(
core/test/words-cast.test.ts).
0.10.0
54 changes: 11 added, 15 changed, 28 fixed.
Write on the page, and the director stages what you wrote. The script opens on its industry pages and keeps what you type as you typed it, and the director now stages nine in ten ordinary action lines, none against the text. Studio comes in light and high-contrast themes beside dark, everything it shows reads at WCAG AA, and the web edition speaks to a screen reader. The showrunner keeps a dozen everyday tools in view and finds the rest when it needs them, so a first message on the demo costs about seven cents, and Claude's work is measured against Reelwright's own director. A phone in a scene shows its conversation, the timeline is laid out as an editor's, and a render on a slow computer finishes instead of being stopped.
Added11 changes
- Studio says what the renderer warned beside the preview or render it drew: under a document's
or a proposal's pictures, in the storyboard's header, on a finished render in the render queue
and in its row in Activity. "The renderer warned: …" in the renderer's words, in the usual
grey (a warning is no failure, so never red), with each warning's code under Details. A
picture reused from the cache says it again. The session protocol is 1.1: previews and a
render's details carry
warnings(its words and its code); a 1.0 client still connects. - The heuristic director is measured on a staging corpus (the third product audit's finding 3):
389 action paragraphs and lines, from the shows in the repo, the audit's Night Ferry and
ordinary sitcom writing in the voice a person types (pronouns, two people in one line,
entrances, exits, reactions), each with what it should stage: who moves and where to, which
gesture or none, and the feeling.
core/test/staging-corpus.test.tsdirects each on a library set and prints the score by kind of paragraph: staged, staged against the text (the wrong person walks off, a look at someone not there, a thumbs-up on fear, a name heard as a sound) and not staged. The score only goes up: a paragraph staged before that no longer is, or one that becomes staged against the text, fails the test. Today: 267 staged (69%), 31 against the text, 91 not staged; of Night Ferry's 13, 3 staged and 6 against the text. - The showrunner keeps a dozen everyday tools at hand and finds the rest when it needs them, so what it is sent with each message is about a fourteenth of what it was. On the demo a first message costs about $0.07 to send instead of $1.03, and one within the hour about $0.002 instead of $0.03. Claude Code keeps the same tools at hand when it works on your shows.
- Claude is measured against Reelwright's own director: ten scripts on the demo and twenty
things to ask the showrunner, each with what should come of it. Reelwright's own director stages
53 of the 62 moments the scripts ask for and keeps every line; Claude's score joins it once a
recording is made with
reelwright eval record, one command that says what it will cost first and stops at its limit ($8). reelwright eval releasesends one real message and one real direction with your key (at most $3) and writes down how they went, for each release to keep.- A phone's insert shows the conversation, as a messaging app does. Under
INSERT - MEI'S PHONE, write each message on a line led by who sent it (GRANDPA: Where are you?), with its time if you like (GRANDPA (9:41 PM):,[9:41]), all under the shot line or a paragraph each: the phone shows the last few that fit, Mei's own on the right in the accent color and the others' on the left, each with its time, whom each is from over it when more than one person writes, and who is writing at the top. The lines used to run together into one bubble from whoever wrote first, and a time after a name lost the insert altogether. - A phone in someone's hand shows the scene's insert on its screen: the messaging app at rest until the insert cuts in, then the conversation it showed, drawn the same way, glowing and upright as it is held. Its screen used to be a blank color.
- The web edition speaks to a screen reader (product audit 2026-10b, finding 15). To a browser Studio is one picture, so a reader heard "Reelwright Studio" and nothing more. The page now keeps a line, unseen, that says what has the keyboard as you move through Studio: "Save, button", "Show grid, check box, checked", the row or tab chosen in a list, the menu item the arrow is on, a field's name and what is in it (never a secret one's). The reader says it as it changes, in dialogs and menus too. Studio's page is marked as an application, so a reader passes its keys to Studio. The script editor's header buttons keep their names when a narrow window shows only their icons, Cast's rows say "character" rather than the kind of file, and the timeline's picture, ruler, tracks, blocks and mixer, the 3D views and the editors' panels have names a reader can say.
- Write on the page (UX review 2026-10c, #9). The script opens on its industry pages (US Letter, Courier 12, each element at its indent) and you type there, as in Final Draft: the caret moves on the page, Enter and Tab go round the elements (Enter after a heading starts the action, Tab on an empty line makes a character, Enter after a name starts their line, Tab at the end of a line opens a parenthetical), and an element still empty already sits where its first letter will. Up and Down keep your place across the page whatever the indents; Home and End go to the row's ends; Backspace at an element's start joins it to the one before. Selection, Undo, Copy and Paste (as Fountain), the spelling's wavy lines and their suggestions, Find and the names offered as you type all work on the page. The file stays Fountain: View › Source (or Source in the bar) shows that text, and Studio remembers which you chose for each script. docs/design/script-page-editing.md says which rules it follows and why.
- F6 or Ctrl+Tab moves the keyboard from the script to the director's reading and to the bar, and Shift+F6 or Ctrl+Shift+Tab back (in a browser, which keeps those, Ctrl+Shift+. and Ctrl+Shift+,). Tab still never leaves the script. The reading's cards take the keyboard: Up and Down go through them, Enter goes to the card's line.
- A light theme and a high-contrast theme beside the dark one (product audit 3, #13). Settings › Appearance › Theme offers Dark, Light and High contrast. Studio changes at once, everything already open included, and remembers the choice, on the desktop and in the browser alike. In a browser, the loading page starts in it too. High contrast is white on black with a yellow accent; its words read at 7:1. Every theme passes Studio's contrast check, the same one the tour runs. Your shows look as their styles make them, whichever you choose. The scopes keep their black screen, as a monitor's is. On the desktop the window opens dark for its first instant whatever you chose: that colour is fixed when Studio is packaged, before it can read your choice. This is how it is meant to work, not a fault.
Changed15 changes
- Every command that runs the renderer says what it warned, as
renderdoes.stills,preview,drift,status,generate setandgenerate charactersprint the renderer's warnings once each under "the renderer", in the same form as the compiler's, where some said nothing and others only a code.preview --jsonprints{previews, warnings}where it printed the list of previews alone, anddrift --jsonhaswarnings;status --jsonsays them on stderr, since its document has no room for them. When the renderer stops on an error, the command says it as "the renderer: what went wrong [its code]". - A file the show names that is not beside a render job fails the job. The frames were drawn
without it and a warning was all that said so: a scene's LUT left out of a job drew the
scene ungraded, and
stillsprinted nothing. That is the style's or a scene's LUT, a typeface the style brought in, a kit piece's model or picture, an image backdrop, and a picture a light's gobo cuts that is neither frozen in the show nor in the library. A fallback Reelwright documents is still a warning: a font it does not bundle draws in Inter, and a gobo picture can come from the library's copy. Studio still draws the set or the shot without the missing file. - The timeline is laid out as an editor's (UX review of October 2026, finding 3): the picture on top with the inspector beside it, the tracks under them, and a split between the two that is dragged up or down and remembered for the person (in the installed Studio and, for each person signed in, in their browser); a double-click puts it back. Until it is dragged the tracks take what they need up to a third of the height, so that at 1440 by 900, where the timeline folds the chat, the picture is 757 by 426 beside the inspector (it was 431 by 242 beside the tracks). The inspector is a pro tool's panel: folded and unfolded by its button, as wide as its left edge is dragged (260 to 560 pixels), both kept. A short panel (the editor's bottom one) keeps the picture beside the tracks.
- One transport for the timeline and the review: under the timeline's picture is the review's bar, the same buttons in the same order (back a frame, backward, play, forward, on a frame, the timecode, In, Out, loop, clear, the speed, the meters), each tooltip saying its key from the key map, the review's keys in the review and the timeline's on the timeline. The timeline gains a loop between In and Out and a speed for play; the review's timecode now takes one typed, as the timeline's did. The bar keeps one row where the window holds it, beside the inspector at 1440 with the rail open and beside the chat in the review: what is at the playhead ("Frame 120 · sh020 · MS", the timecode beside it saying when) takes the room its row leaves, cut with all of itself in its tooltip, and the timecode shows its last digit. The timeline's zoom moves under the tracks, beside the status line. 3D is the fourth of Picture, Stage and Both, one switch (RwModeSwitch) lit on the one shown, in the picture's place with the transport still under it; it no longer opens as a page of its own with its own Back, title, History and Play. The timeline's head is the page head every page has (RwPageHeader) in its one-line form for a work surface, as Resolve's and Premiere's are: "Timeline · The Lighthouse (cold open) · 0:28.08 · 674 frames at 24 fps", the actions on the same row, wrapping only where the window cannot hold them, so the picture has the height. RwPageHeader.compact is there for the editors to take up.
- Everything Studio shows reads at WCAG AA (product audit 2, #15), from the theme's colors, the
look the same. White words on a primary button sit on a deeper violet: 5.11:1, 4.62:1 hovered,
where they were 3.33:1 (the first screen's New show card 2.89:1). A field's outline and a
button's read at 3:1 against what they sit on: 3.44:1 on a panel, 3.17:1 on a card, where
they were 1.52:1 and 1.40:1 (Find anything and a list's tiles 1.20:1). Quiet words are a
lighter grey that reads on a pressed or chosen row too, 4.62:1 where it was 3.70:1 (6.42:1 on
a panel), and a badge's fill is fainter, so a danger badge on a card reads at 4.58:1, not
4.31:1. What the faint grey still drew reads at 3:1 as a graphic: the timeline's greyed blocks
(1.49:1 before, 3.80:1 now), the Captions track (1.49:1, now 4.70:1), every track's block
edges (2.07:1 at the least, now 3.25:1), the camera strip's held line (2.68:1, 3.44:1), the
scene lines and a sound row's M and S (1.52:1, 3.44:1); the stage's walls (1.52:1, 3.44:1),
floor (1.25:1, 3.60:1), pieces (1.95:1, 3.80:1), entrances and setups' cameras; the script's
page-break rule (1.60:1, 3.70:1); the review bar (1.52:1, 3.44:1) and its resolved notes
(2.68:1, 6.42:1). The faint grey is for what is disabled only.
tools/ux-tour.sh --check, the gate's tour, now fails on any word under 4.5:1, or any field's or button's edge, icon or drawn mark under 3:1, at every place it visits (RwContrast): before, 1,405 of them at 1440x900. - On a tablet or a phone, a pinch that began on a button pressed it as the fingers lifted (the writers' room's + Beat added a beat). The finger Studio felt first now lets go of what it was on when the browser takes the fingers for the pinch, and none of their moves reach Studio until they lift.
- The released core and the hosted service start faster wherever they validate (validate,
compile, render, the Studio daemon): the schemas' validators are generated when the core is
built instead of compiled by Ajv at every start, which took about a second; Ajv is loaded
only for a schema location they lack, and a command that validates nothing reads neither:
the released core validates the demo show in 0.7 s where it took 1.3 s, and
--versionis as quick as before. In a checkout,pnpm validatorsmakes them too (never kept in git); without them it compiles as before. What validation says is the same. - A prop and an effect open on a page of their own (UX review 2026-10c, #7), as a character opens in its studio: the thing itself first, its sheet (held and set down from the front and three-quarter, then in each state; an effect from its start to its end), and beside it, or under it in a narrow window, what it is in words. A prop says its size ("Body diameter 24 cm, body height 22 cm"), its other settings (a whistle: yes), how it is held ("In either hand, by the handle", one hand, 1.2× its size in a hand) and set down, what it is made of, its family and wear ("A little worn (40%)"), its colors by their roles, its parts each with its color, its states, and where it is used, each a link. An effect says how long it plays, whether it repeats, its sound, its flash and how far it reaches, and each emitter in a sentence ("A burst of 40, from 0 to 0.05 s, each lasting 0.25–0.6 s, at 2–5 m/s, spread 55°"). A click on a part edits it in place through the same tool as its Fields (a size the prop left to its recipe is added to its own values); Fields stay one switch away. A preview's caption that wraps to a second line no longer runs out of its tile.
tools/engine-check.shloads every engine script in one Godot, where it started a Godot for each, more than a thousand. It still names each script that will not load, with Godot's words: a parse error, a type error, a missing preload, an error in a static variable's value, even in a script another pulled in first. A Godot that stops partway fails it too.- The web checks press Studio's controls by name, as a person finds them, rather than at
points of a 1440x900 page that moved whenever Studio's layout did (
tools/web/names.ts). A check that cannot find a control fails with what is on the screen instead.node tools/check-fixed-clicks.ts(in CI andtools/check-all.sh) keeps fixed points out. - A script typed the ordinary way is kept as typed (product audit 3, #5: seven of ten paragraphs of action came out in capitals). Letters are put in capitals only in a heading, a name or a transition you chose for the line (with Tab, Enter or the element menu), never because the first letters typed looked like a name. A short name alone on its line is still a character waiting for their line; a longer line in capitals is action. Enter pressed twice between paragraphs leaves one blank line, Enter on an empty name turns it back into action, and a line typed under a name that opens with a bracket is their parenthetical. A heading keeps its letters as typed (the page prints it in capitals). The reading takes a paragraph written all in capitals as plain action: its words are no sounds and no one introduced ("Make the WINDOW sound" is gone), and a character's line is never a sound.
- The script editor's bar: Save has a disk and Spelling letters with a tick, where both had the same check mark, and Pages is now Source (the script opens on its pages).
- The batch gate watches the main path (product audit 2026-10d, finding 11).
tools/check-all.shends by running the script, review, render queue and timeline watches at once on lavapipe (tools/check-watches.sh, about 9 minutes): a show made from nothing to a voiced, played episode, a review round, a queued render and the timeline's edits, each against the real daemon. The review and render queue watches draw the cold open cut to its first 6 seconds, where drawing all 28 seconds took them half an hour. A watch that fails, hangs or hits an error in its own code fails the gate, by name, with the end of its log. The web checks' stand-in server makes a New show as the service does, blank from your words with its look from yours, so the web checks see blank shows too. Each step of the gate says when it began, and the last line how long the whole took. - reelwright.diy's pictures of Studio, and the docs', are Studio as it is now: the menu bar, the page headers, the grids, Activity and Settings › Claude where the old Connect Claude dialog was. They are shot again by the same tools (the watch tools, the Studio, booth and memory tours, the web checks and the Studio screenshots), framed as before; Write with Claude and a preview drawn on two computers at once are shown again too.
- The heuristic director stages the action lines people write (the third product audit's finding 3). Someone who backs away, takes a step back or runs away from someone goes a few steps farther off and turns to face them again, where they walked off the set; someone who walks past another goes on beyond them; "heads for the door, then stops" stops in the doorway, and "walks toward the door" no longer leaves; "runs back toward the wheelhouse", a place the set does not have, goes to the way out, else out through it. Out of doors, someone not yet seen who "walks out" comes on. "Smiles", "makes a face" (disgusted, not amused), "freezes", "goes pale", "bursts into tears", "smirks" and "eyes wide" show on the face, even behind cover or on the way out. A "he" or "she" opening a sentence is whoever the sentence before was about ("Rosa looks at Maya. She sighs."), unless that one handed the other something ("Maya hands Rosa the box. She opens it."), and the "her" of "Otto and the Chief stare at her" is the Captain. "Dev and Ben come in" and "They run out" move both. A look or a gesture given ("gives him a thumbs-up", "gives her a long look") is no hand-off. A line takes the feeling the action last gave its speaker, so "GRANDPA!" after June backs away wide-eyed is called out afraid, never cheered with a thumbs-up; the director's own gestures never cheer anyone afraid, angry or grieving, and its looks and gestures aim only at someone on stage. A name in capitals said with what they look like ("A TALL STRANGER") is the character brought in, not a sound called TALL, and "the" is nobody's first name: a character called "The Stranger" made "the wheel" and "the window" mean him. A paragraph mid-scene that stages nothing passes in 0.3 s instead of holding up to 2 s. On the staging corpus, 359 of 389 paragraphs are staged (92%, was 69%) and none against the text (was 31); all 13 of Night Ferry's (was 3, with 6 against the text).
Fixed28 changes
- Claude hears when the tools you may use change, and offers them at once, without a reconnect: a first show made or shared with you, a role changed, a show left. It is offered only what you may do somewhere: with no show, only listing your shows; as a viewer, reading; as a reviewer, comments too; as an owner or editor, everything.
- Claude Code speaks MCP's newest protocol (2026-07-28) with Reelwright on the web, instead of falling back to the older one: each request stands on its own, with no session to lose when the service restarts. Claude names the show it works on in each call (any show of yours, or shared with you, by its id from list_shows), else it works on the one you last opened. Claude apps and tools that speak the older protocol keep working as before.
- Three staging faults a showrunner saw in a render of the director's own scenes. A crate
someone climbs onto stood on the nearest free mark, even the one in a doorway, and whoever
came in walked through it: a thing is never stood on a mark within 1.2 m of a way in now,
and one to get up on stands where the set's master camera sees the climb past its pieces.
The diner's counter hid Mei's climb onto her crate from every angle on the scene's side of
the line; a console hid the Chief's from the bridge's wide, and a cut-in on the crate
played it without him: the shot a climb, a jump or a step down plays in now sees the
legs, or a cut to one that does comes as they set off. And a long scene cut away from the
Chief 22 frames into his jump down off the console: no cut lands while someone is in the
air, or while a thing thrown is; it waits until they land. Film grammar says so of any
director's cut (
grammar.cut_mid_leap,grammar.cut_mid_flight,grammar.leap_hidden, warnings), and the compile of a prop stood in a doorway (prop.in_doorway). - The season board's card said "Voiced" for a second or more after an export or a render of its episode ended, until Studio read the season again. It moves on to Rendered, or Delivered for an export, the moment the render ends, as the core will say when it reads the season next.
- A list you have open stays open when an edit from outside (someone else on a shared show, the showrunner) redraws its page, as the writers' room's menus do since 0.9.0: a character's outfit, costume and grip lists, the 3D view's mark lists, a set's and a document's fields, the style lab's. Each page waits for the open list to close before it is drawn again, and Esc with a menu, a list or a dialog open never goes Back.
- An Esc pressed just as a menu, a list or a dialog closes, or after one vanished under you, belongs to that popup. It no longer goes Back out of the page, clears the 3D view's selection, drops a take in the booth or leaves Settings.
- Someone who jumps or climbs down off a piece of the set walks on from where they land. The
Chief jumped down off the bridge's engineering console and then walked to the middle from
its top, out through its back half a console up, and round to the middle in the air: a way
down that needed no walk (to the piece's own side, or to someone already beside them) left
them up on it for their next move. A set now says when one of its marks stands inside a
piece people walk round, as where Studio's previs makes one for someone dropped on the
console (
set.mark_in_piece, a warning); a mark in its own seat, or up on the piece at its height, is where it should be. No set of the examples, the library's patterns or the tests has one. - A shot of someone who comes in through a door sees them. The crew watch's storyboard showed only an orange door for its parrot flying in: the long shot, framed on the bird where it set off outside, stood half a metre from the door, and the bird landed behind it. And a shot that panned with someone walking lost its pan when they had come in through a door, so Otto walked in and out of her own shot on her way to the galley. Whoever comes in or goes out now stays in the picture as they walk and where they stop: the shot pans with them, or widens as far as their size needs (a parrot's widest shot is a few metres back), or the shot before plays on.
tools/engine-test.sh -a <suite>runs that suite alone, once. It added every suite as well, so a suite named ran twice in one process, and the second run of a depth-of-field test crashed Mesa's lavapipe. With no-ait still runs every suite.- A browser-based MCP client on another site, such as the MCP Inspector, can connect to Reelwright on the web: its browser's preflight is answered before it signs in, and it can read the sign-in challenge and its session. Claude's apps, which connect from Anthropic's servers, never needed it.
- A fade tried in the set explorer lasts the seconds it says, and the timeline and Review play in real time, however slowly a frame is drawn: in a browser without a GPU or on a busy machine, below about seven frames a second, a 3 s fade went on for minutes and a take played in slow motion behind its sound. Frames are dropped instead, as a player does.
- In the script, Enter twice after a line (a habit from plain text) leaves one blank line before the next paragraph, not two: the first Enter ends the line under a blank line, and Enter on the empty line under it adds nothing more.
- On a first visit by a link to someone's show, the tour comes after "Make your show" is closed. It began under the offer, its first card hidden behind it, and stayed over the page once the offer was closed with Esc.
- A page's head keeps its height as its actions come and go. The timeline's "Voice 1 line", shown with the first line no one has voiced, was a pixel taller than the buttons beside it, and the picture, the transport and the tracks all moved down a pixel under the pointer.
- Opening one character after another, the character studio showed the first one's angles, faces and mouths under the second one's name until each was drawn again, on the web for seconds. They are empty now until they are drawn, and the studio says it is open only once the character it shows is the one opened.
- An episode directed from a script with no title was called by the script's path ("episodes/cargo_bay/cargo_bay.fountain") on its storyboard, its card, its title card and everywhere else. It is called by the script's name in words ("Cargo Bay"), and so is such a script in Episodes, in what uses a set and in the showrunner's suggestions. An episode titled so before is named after its script when it is directed again; a title of its own is kept. The storyboard is headed with the episode's own title once it has read it.
- A render on a slow or busy computer is no longer stopped while it draws: the service's small machine, a laptop on battery. Each batch of frames had a fixed time, two minutes and five seconds a frame, and one that slowed to a crawl was stopped a frame short, said to have "stopped answering". Its time now counts from the last frame it drew, and a cap of ten times that bounds the whole; the failure says which ran out and how far it got: "it drew no new frame for 260 seconds (27 of its 28 frames drawn)". Previews, stills, model sheets, set views and silhouettes are timed the same way, and so is a part of a render another of your computers draws. Encodes and deliveries go on while ffmpeg reports progress, where they had an hour or two in all, and stop after ten minutes without a word.
- The 3D view shows the stage at frame 0 and on any title card's frames, not a black stage with marks floating in it: the shot nearest the card is shown.
- The toast that says where a new show's folder is goes after its time. It used to stay all session, over the status line.
- A script's needs on a show with no cast say the show has no cast yet, instead of ending in "(cast: )". A heading on a show with no sets no longer suggests an alias on one of them.
- The tour's card steps away while a dialog is open, and the tour ends when you start New show or leave the show. On the web it stayed up through New show and over the style lab.
- The shot inspector stays where you scrolled it after each edit, and so does a set's inspector. It went back to the top every time.
- New episode is "New episode…" in Episodes' header as in its empty state, and the same goes for Cast's and Sets' New and Sounds' New sound: each asks something first.
- The UX tour's check measures text fields too, so a cut timecode can no longer pass it.
- While the timeline's picture is drawn again, only the picture dims: the scopes' and safe areas' toggles on it stay in full. They faded with it, too faint to see.
- The Show page, the chat, a proposal, World, Cast and Sets, Episodes, the storyboard, the writers' room and the booth could stop Studio at one height of the window: their pictures (in the writers' room and the booth, cards that sit side by side only where there is room) made the page taller as it grew wider, so where it just fit, the scroll bar came and went every frame until Studio ran out of room for its messages. Each keeps the bar's room now, and a test sizes each at that height.
- A dialog's title and buttons never leave the window. Your computers grew past the bottom of the page as its list was drawn again every few seconds, its Done out of reach; any dialog now takes its size again as what it holds changes, scrolls down and, on a phone, across, and stays in the window as it is resized. The palette, Switch show, the keyboard shortcuts and the picture viewer fit a phone, the shortcuts fit a screen that scales Studio up, and History and Save view as setup open inside the window under a button at its right edge.
- A field meant for a sentence wraps: the writers' room's logline, an idea's logline, the theme's setting in Settings and the style lab's look in words grow to three lines as you type, then scroll, where a one-line field showed only their start. Enter still does what it did (makes the idea, saves the look) and never starts a new line.
0.9.1
3 changes: 1 added, 2 fixed.
The showrunner answers your own key again. It sent Claude one more tool with exact inputs than a request may carry, and the demo's first message stopped at its own limit before it was sent.
Added1 change
- Talking to the showrunner with your own key costs far less after the first message: the tools, instructions and show it is sent each time are kept for an hour rather than five minutes. On the demo the first message costs about $1.10 and each one within the hour about $0.05, where every message after a pause cost $0.65 again.
Fixed2 changes
- The showrunner sends Claude at most 20 tools whose inputs Claude must follow exactly, the most one request may have; it sent 21.
- The demo's first message to the showrunner is answered. With your own key it stopped before it was sent, at the demo's own $2 limit a message, because its cost was counted as if three Claude models each answered it in turn. It is counted on the model that answers now, and the demo allows $3 a message, so a first answer with all its steps fits. When a message cannot afford the backup models that retry a declined answer, it goes without them rather than stopping, and the limit still holds.
0.9.0
41 changes: 7 added, 27 changed, 7 fixed.
Studio becomes one app. A menu bar and a grouped palette from one list of commands, one dialog, one page header and one word for each action, and the rail in the order work goes. Activity lists everything running, and errors stay red until you close them, red only when something failed. Lists become grids of pictures with one search, the bible and the theme read as documents, and the timeline opens on its first frame with Review's transport. Nothing you write is lost on quit or on a closed tab. claude.ai's connector signs in the way claude.ai recommends, reelwright.diy knows when you are signed in, and Reelwright Studio downloads for macOS beside Linux for the first time.
Added7 changes
- A rejection can be taken back: Ctrl+Z, or Undo on the toast that says "Rejected the proposal
“…”", brings back a proposal you rejected (Reject, None of these, Esc on a try-on, Keep the
style, a memory proposal), waiting for you again, and Ctrl+Shift+Z rejects it again. One
Ctrl+Z brings back every option None of these dropped. A try-on or the directions brought
back show again in the style lab or the character studio. The core's
changes.undoputs a person's own rejection back to wait (stale if its files moved on since) andchanges.redorejects it again; an option rejected because another was chosen stays rejected. The toast says it once: the proposal page, the set explorer, the scene previs and Memory no longer add "Ctrl+Z brings it back" beside it. - A menu bar (UX review 2026-10c, #4): File, Edit, View, Show, Episode and Help across the top of the window, over the first screen and the show, the same on the desktop and the web. Every item has its icon and its key at the right, the key you set (change one in Settings › Keyboard and the menu says it at once; in a browser none needs a key the browser keeps), and is greyed where it cannot run now. Undo and Redo say what they take back ("Undo moved the cut before shot sh030"). Edit's Cut, Copy and Paste work on the text you are typing in, else on the timeline's selection. View ticks the place you are in and the panels shown. On a Mac the menus are the system's own, at the top of the screen, with Settings in Reelwright's menu. What the chevron at the rail's foot held is in the menus now: File has your shows (Open recent; Your shows on the web), New show, Close the show and signing in to Reelwright; Edit has Settings; Help has Report a problem and the show's log. The rail's foot says how the show is doing and nothing else.
- Every list can be a grid of pictures, and every list can be searched (UX review 2026-10c, #8). World, Cast, Sets and Episodes have Grid and List buttons at the right of the list's header, as Finder, Figma's files, Frame.io and Resolve's media pool do, and Studio remembers which for each section (on the web, in your browser). A grid shows each document as a tile with the picture its own page shows: a set's view, a prop's or an effect's sheet, a style's swatch, a pattern's line-up, a character's face, each drawn in turn while the grid is on screen and kept after; a kind with no picture of its own shows its icon. Episodes' grid is the season board with each episode's still, and its list the cards with their renders, no longer both at once; a board card's ⋯ (or a right-click) offers what its card in the list does. One search field over World, Cast, Sets, Episodes, Memory and Sounds filters as you type, by every word you type in a thing's name, its kind or its marks ("draft", "robot"); Ctrl+F puts the caret in it (a key of its own on the Keyboard page) and Esc empties it, and when nothing is left it says "Nothing in Sets matches “…”" with Clear the search.
- A season card's ⋯ in Episodes' grid now does everything its card in the list does: besides opening, the script, the storyboard, recording and rendering, it has Export… (the master with what a delivery asks for), Render a dub… (each language the episode is dubbed into), Cancel the render while it runs, and Watch and Show in folder for the newest render, preview and dub.
- reelwright.diy's header knows who is signed in to the web edition, on every page: their name
and initial, with a menu that says who is signed in and has Open Studio and Sign out (which
keeps you on the page), and Open Studio as the header's main action; else Sign in, as before.
It never shows the wrong one first: a browser that has signed in asks the service before the
header is drawn (
/app/api/signed-in, which says only whether and the name, and is never cached), and one that never has asks nothing. Someone signed in before this release is known once they open Studio again. - Activity (UX review 2026-10c, #6): one list of every job running in Studio, opened from a button at the rail's foot over Settings. Renders, voicing, compiles, builds, imports and exports are each listed with how far they got and the time left (the daemon's for a render; for the rest, what the same job took last time), with the shows you switched away from; what ended stays a while with Open (Watch for a render). While anything runs, a ring round the button's icon fills and it says how many run. Long work says how it ended in a toast with Open, and a Show Pack saved says so there too, not only in Settings. The same on the desktop and the web. It opens with Ctrl+Shift+A (Alt+Shift+A in a browser, where Ctrl+Shift+A is Chrome's tab search), View › Activity or its row in the palette.
- Every release ships for macOS beside Linux. The Mac's universal app (Apple silicon and Intel, macOS 13.5 or later) is built on the same Linux machine, signed, put in its disk image and checked there before it goes out, so it can no longer be left behind. reelwright.diy/download offers it with its size and SHA-256, and says in plain steps how to open it the first time, since Apple has not notarized it yet: try to open it, choose Done, then Open Anyway in System Settings › Privacy & Security. The release's latest.json and its feed now name every package with its checksum.
Changed27 changes
- Review with no render yet reads as an empty player, not a broken page: "No render of this episode yet", a large film icon, Render a preview and Render sit in the middle of where the picture would be, where they were a short card at the top over an empty page.
- The first screen leads with the way in for someone new (UX review 2026-10c, #10). Three large cards, New show (the one filled), Try the demo show and Open a show folder (not on the web, which has no folders), each saying what it does; under them the shows opened recently as pictures (the show's cover, the still where it was left, or its cast lined up as the Show page last drew it; its initial until there is one), each with its name and when it was last opened, and its folder no longer on the card. Someone with no show yet sees the three cards alone. The same on the desktop and the web, where a show's picture on the first screen and in Switch show never loaded before (it was asked for before it was on screen).
- The first-run tour waits for the page under it (UX review #10). Its first mark comes once the Show page has its answers and pictures in, so its card never lies over grey placeholders (at most a minute, for pictures that never come); it has Back beside Next; Esc still ends it, on the desktop and the web. Its last mark rings Find anything, new at the top of the rail under the show's name: it opens the palette, with its key (Ctrl+K) on it. In a browser, the mark on its keys rings Settings, where they change.
- A booth take is never lost: Back, another line or another show while recording stops the take and holds it, as does a take that could not be sent or kept. "Keep it" sends it for its own line; "Drop it" asks first. Studio asks before closing while a take is held.
- After Revert in the script editor, the text put aside stays until you bring it back or drop it: Drop mine asks first (it was Close, which threw it away), and the text outlasts another script, another show and closing Studio.
- Studio never drops your work without a word. Leaving an editor mid-edit (Back, another
section, another show, closing Studio) keeps what you made, and coming back finds it as you
left it, marked unsaved, with Revert (or Discard) asked first:
- the writers' room's outline (Back used to throw its changes away);
- a piece in the piece maker (choosing another piece used to drop it), marked • in the list;
- a gesture or a pose in the pose editor (Close used to drop it): "Unsaved: Salute" in the list, to go on with;
- a try-on or the four directions in the style lab or the character studio;
- the writing assistant's suggestion, while the script is as it was;
- words typed into the show's settings, a memory entry, a reply to a note, a note not posted yet (on a script or in Review), and what a dialog was given and not used: New show, New character, New set, Save a version, Add a line, New sound, New episode, Add an idea and Share for review each open again as they were left. All of it is kept with each show's place, so it outlasts closing Studio too; New show's words, which are no show's yet, are kept with your settings. In a browser an edit made just before the tab closes is kept as well: Studio saves as the page is hidden or closed, not only every five seconds.
- The palette (Ctrl+K) opens at the top of the window and groups what it finds (Recent, Go to, File, Edit, Create, Show, Episode, Help, Settings, Documents, Scripts), each row with its icon, the letters you typed lit, and its key at the right (UX review #13). It has the same commands as the menu bar, from one list, and only those that can run now; with nothing typed the commands you ran lately come first, kept for next time. Documents and scripts are found with the commands as you type, and no longer show their ids. Find anything stays at the top of the rail: it is how you find the palette without knowing its key, as in Linear and Notion.
- One dialog, the same everywhere (UX review 2026-10c, #12). Every dialog in Studio is now made the same way: its title at the top left with a close button beside it, its body as big as what it holds (at most 80% of the window, scrolling past that), and its buttons together at the bottom right with the one that does what it is for last. New set no longer stands 700 pixels tall round two fields, and Save a version and New character fit their fields. The page behind dims for the palette, the keys and Switch show too, which share the dialog's frame and have a close button. Every field in a dialog is named in one style, above it.
- New show in three short steps (UX review #12): what it is, how it looks, and where it starts, with Back and Next, and Create on the last. None scrolls at 1440x900, where the one long form scrolled inside itself and cut "Where it starts" at the fold. The last step names the show's folder in words ("A folder called “Tea Time”, in Reelwright"), its path in the tooltip, where it showed the path. What was typed and not made comes back on the steps as it was left. The same on the web.
- Words are no longer cut short (UX review 2026-10c, #17). A dropdown too long for its field wraps onto a second line, the set explorer's Room tone and Floor and the shot inspector's Setup among them. The timeline's running time and the style lab's swatch names wrap to two lines, and the show's name at the rail's top shows whole, on two lines when it needs them.
- Every page opened over a section has one header (UX review 2026-10c, #14): Back at its top left, which Esc also does (typing in a field, the first Esc leaves the field); what the page is, small, over its name at one size; its actions at the right, at most one of them filled. Documents, the editors (the style lab, the character studio, the set explorer, the piece maker, the timeline's 3D), the writers' room, review, the script, the booth, the storyboard and a proposal all have it, where Back was a link on some, a button named after a place on others, and an arrow alone on two. Every editor's switch between its picture and its form says Visual | Fields.
- One word for each action, listed in docs/glossary.md: New starts making a thing and its dialog's button says Create (Sets' More menu says New prop…, not "A prop"; no more "Make it", "Write it" or "Add it"), Import brings a file in (not "Bring in"), Approve takes a proposal in (the set explorer and the 3D view said Accept), Reject is a quiet button with an x everywhere (it was red in two places; Undo brings a rejection back), Back leaves a page. The plain-words check fails a button, menu item or tooltip that says another word for one of them.
- A greyed menu item says why in its tooltip: "Open a script first.", "Nothing to undo yet.", "Select something on the timeline first.", and for a viewer of a shared show, that they can only view it.
- The Show page has one filled button, its next step; New episode beside it is a plain one, and History's Save a version… is a quiet one as every page's own action is.
- Wide pages use their width (UX review 2026-10c, #19). Every grid follows one rule, as Finder's and Frame.io's do: as many columns as fit, never more than there are things to show, each tile as wide as its share of the row within a least and a most. World, Cast and Sets (every group on a page at one size, bigger when there are few), Episodes' season board, the Show page's episodes, the storyboard (its shots fill the row, with sharper stills), the writers' room's beats and scenes, Settings' looks and the first screen's shows. The writers' room's boxes grow with their words, where a beat's text scrolled and was cut mid-line, and so do the show's logline, premise and house voice in Settings.
- The series bible and the theme open to read (UX review 2026-10c, #7): each part a heading, each entry headed by its own title, words as prose, tags and short lists as chips, a choice in its words, and nothing empty. A click on a part edits it in place with the editor the form uses, and leaving it (or Esc) reads again; a locked part says why and stays read. The form is the switch's other side, Visual | Fields, and a kind opens on the side it was left on.
- Documents keep the show's file words under Details: beside the id, the file and the status, the show it is of, who made it (and with which model), when, what they asked for, its license and the pattern it was drawn from. The form no longer has a Provenance part, an Id row on every entry or a Show field; an entry named only by its id is headed in words ("Sound in space", not "rule.sound_in_space"), its id said when its heading is pointed at.
- A padlock shows only where something is locked and on the row the pointer is over; the header's Lock fields… shows every one, with Lock document beside it, until Done locking.
- Numbers that go together say which they are: a stage's floor is From X, Z and To X, Z, a place on the floor X and Z, a point X, Y and Z, and the stage says what it comes to, "7.0 × 5.5 m, ceiling 2.8 m". The set explorer's inspector names what is selected ("Deck", "Center → Eng crouch", not "Element deck"), keeps its id under Details, offers a mark's seat by name and the set's type by the theme's name for it.
- World lists the theme, the styles and the bible, not the show itself (Settings has it), and the theme's row says Theme, where it and the show were two rows of the show's name.
- One notification layer (UX review #6). What happened in a show you switched away from, a show that could not open and the other notices over the main area are toasts at the foot of the middle now, with Open. What went wrong is always red and stays until you close it, in a toast or a status line: every view's status line is one component with neutral, success and error tones, so errors in the World, Cast and Sets lists, Sounds, Episodes and Memory are never grey. On the 3D views (the set explorer, the scene in 3D, the style lab, the character studio) a refusal stays until your next key or click instead of fading after 6 s, and a fade or a blocking they cannot do says why.
- A show whose folder has moved or gone is named by its title in words ("“The Night Watch” could not open. Its folder has moved or is gone."), its old folder only in the toast's tooltip, with Find it…, which asks where it went and keeps its place on your list, and Take it off the list.
- Only a failure is said in red. "Nothing to change", "already the active style", a render that
has ended, a preview called off, and a refusal that says why (a show has one bible, a viewer
changes nothing, a turn already running) now read in the usual tone on every status line, 3D
view, bar, callout and toast, where about a hundred places said any answer of the core in
red. One rule decides it (
RwRpcError.kind()); a refusal in a 3D view still stays until your next action, in plain words, and a step of a run that was there already counts as made, but a refused one no longer does. - Three place keys moved. The rail is in the order work goes (UX review 2026-10c, #15), and its keys follow it: Sounds is Ctrl+5 (it was Ctrl+8), the Timeline Ctrl+7 (it was Ctrl+5) and Memory Ctrl+8 (it was Ctrl+7). Show, World, Cast, Sets and Episodes keep Ctrl+1 to Ctrl+4 and Ctrl+6, History Ctrl+H, Settings Ctrl+,. In a browser it is the same numbers with Ctrl+Shift, and on a Mac with Cmd+Option there (History stays Ctrl+Shift+9). A key you changed yourself on the Keyboard page stays as you set it. The menu bar's View › Go to, the palette, the Keyboard page and the shortcuts sheet all say the new keys.
- The rail groups its places (UX review #15): Show, then Make (World, Cast, Sets, Sounds), Produce (Episodes and the Timeline, where the script, the storyboard, the booth and review open) and Keep (Memory, History), each group's name quiet over it in small capitals. Folded to its icons, the names go and a gap is left between the groups. Your account sits at the foot under Settings: it says who is signed in to Reelwright and opens the sign-in (on the web, Settings › Account), or says Sign in.
- The timeline is laid out as an editor's (UX review of October 2026, finding 3): the picture on top with the inspector beside it, the tracks under them, and a split between the two that is dragged up or down and remembered for the person (in the installed Studio and, for each person signed in, in their browser); a double-click puts it back. Until it is dragged the tracks take what they need up to a third of the height, so that at 1440 by 900, where the timeline folds the chat, the picture is 697 by 392 beside the inspector (it was 431 by 242 beside the tracks). The inspector is a pro tool's panel: folded and unfolded by its button, as wide as its left edge is dragged (260 to 560 pixels), both kept. A short panel (the editor's bottom one) keeps the picture beside the tracks.
- One transport for the timeline and the review: under the timeline's picture is the review's bar, the same buttons in the same order (back a frame, backward, play, forward, on a frame, the timecode, In, Out, loop, clear, the speed, the meters), each tooltip saying its key from the key map, the review's keys in the review and the timeline's on the timeline. The timeline gains a loop between In and Out and a speed for play; the review's timecode now takes one typed, as the timeline's did. The timeline's zoom moves under the tracks, beside the status line. 3D is the fourth of Picture, Stage and Both, one switch (RwModeSwitch) lit on the one shown, in the picture's place with the transport still under it; it no longer opens as a page of its own with its own Back, title, History and Play. The timeline's head is the page head every page has (RwPageHeader) in its one-line form for a work surface, as Resolve's and Premiere's are: "Timeline · The Lighthouse (cold open) · 0:28.08 · 674 frames at 24 fps", the actions on the same row, wrapping only where the window cannot hold them, so the picture has the height. RwPageHeader.compact is there for the editors to take up.
Fixed7 changes
- The timeline's picture is never black. An episode opens on its first frame, drawn, where it said "Click the ruler to see a frame"; while it compiles again after an edit or an undo, the last frame stays, dimmed, with "Compiling the episode…" and a spinner, where Ctrl+Z blanked it.
- L and play answer as soon as the episode is ready after a run of edits and undos. Each one read while the episode was getting ready to play opened it once more, one after another, and in a browser L waited a minute for them with a blank picture. An edit undone before it had compiled no longer drops the episode playing live back to stills, and L pressed while it compiles plays on once it has.
- On the web, the limits on sign-in codes and on connecting Claude count each person by their
own address. Everything through reelwright.diy reached the service from Vercel's address, so
everyone shared one budget of 30 an hour. Once the service and Vercel share
EDGE_SECRET, a request through reelwright.diy is counted by the address Vercel saw, and a request straight to the service by its own address, whatever it claims. claude.ai and Claude Desktop, which connect for everyone from Anthropic's few addresses, may register 1000 clients an hour. - The bridge's token is in no file: Claude Code gets it in its environment, which it fills the connection's header from. A bridge killed outright used to leave it in a file; one an older bridge left is removed when the next starts.
- Settings › Claude on the web gives
claude mcp login reelwrightto copy under the command that adds Reelwright to Claude Code, and the Claude app's steps as claude.ai has them now: Customize › Connectors, Add custom connector, and if asked, Sign in now. - claude.ai's recommended way to connect, "Use Claude's published identity", works: Reelwright reads the description Claude publishes of itself (its client metadata document) instead of turning it away. Claude Code signs in the same way now, with its own published description, and registers no new client each time. The question you are asked names the app and the site it comes from ("Claude (claude.ai)"), and says so when the answer goes to a program on your computer. Registering, the other choice, works as before.
- The writers' room no longer closes under you when you pick a scene's cast or beats. Each tick redrew the cards and shut the menu, so the Esc you then pressed to close it went Back to the season instead. The menu now stays open for as many ticks as you like, Esc closes only the menu, and the cards show the picks once it has closed. A beat's Serves the bible… works the same way.
0.8.1
6 changes: 6 fixed.
Claude's own apps reach your shows. claude.ai and Claude Desktop connectors were turned away before they could sign in. The web chat on your Claude plan works beside your own Claude Code. Long work Claude starts on the web no longer times out through the proxy. All of it is proven with the real Claude Code, not a stand-in.
Fixed6 changes
- Claude's own apps can reach your shows on the web: a request that came with another site's Origin was refused before it could sign in, and Anthropic's servers, which connect claude.ai and Claude Desktop, may send one. Reelwright's MCP endpoint and its sign-in endpoints take any Origin now; they take no cookie, so it opens nothing.
- Studio's web chat on your Claude plan works while your own Claude Code has Reelwright waiting for a sign-in (added but not signed in yet, or disconnected). Claude Code keeps that by the server's name, and the bridge used the same one, so every turn said "Claude Code could not start the show's Reelwright tools (needs-auth)". The chat's server has a name of its own now.
- Studio's chat on your plan, and the bridge, take Claude Code signed in with
claude setup-token(the plan's own token inCLAUDE_CODE_OAUTH_TOKEN, for a computer with no browser). They said it was "signed in another way, not with a Claude plan". - Claude, connected before you have a show, is told how you make one and that reconnecting brings the show's tools.
- A tool Claude runs on the web for more than two minutes no longer comes back as a gateway error: reelwright.diy's proxy drops an answer that says nothing that long, so each answer now streams, saying it is still working every 25 seconds.
- Studio's chat on your plan says plainly when Anthropic refuses a payment (a 402), where it showed the raw API error.
0.8.0
10 changes: 2 added, 4 changed, 4 fixed.
Pictures get finished, and Studio answers everything you do. A scene or a shot takes a grade, a look, or a LUT from your colourist, and scopes show what the picture holds. Every change says what it did, with Undo beside it, and nothing that can't be taken back happens without asking first. Labels say what a person would, Review and the work fit a laptop's window, and in a browser Studio's keys work while you type.
Added2 changes
- Picture finishing (product audit 2, finding 18): a grade for a scene and for a shot, LUTs,
scopes and safe areas.
- A scene and a shot can be graded on their own, over the style's grade: a flashback, a dream or a night exterior. A grade starts from a look (Flashback, Flash forward, Dream, Night, Golden hour or Noir, or a look the style defines) and sets any dial over it: exposure, contrast, saturation, warmth, tint, lift, gamma and gain. In the timeline, select a shot and pick its Look, its scene's look and its dials in the inspector; Reset grade takes the shot's away. The style lab's Lighting has lift, gamma and gain too, and lists the style's own looks. A flashback or a dream the script marks is graded as one.
- LUTs: Bring in a LUT… brings a 3D .cube in for a scene (the shot inspector's Scene LUT)
or the whole show (the style lab's Lighting): a file picker on the desktop, the browser's
upload on the web, then its license. It is checked as it comes in (2 to 65 points a side,
values in 0 to 1), refused in plain words where the button is, and once in it grades at
once (Ctrl+Z takes it back), with its strength and Remove beside it. The same from
reelwright asset import look.cube --show <dir> --license <spdx> [--for <episode>/<scene>]and theimport_luttool in chat and MCP. - Every frame is graded in the same order: the style's grade, the style's LUT, the scene's grade, the scene's LUT, then the shot's grade. In a transition each shot keeps its own look on its part of the frame. LUTs are blended exactly, so the same show renders to the same pixels everywhere, and a show that grades nothing renders as it did.
- Under the timeline's picture, a waveform, a vectorscope (with the 75% color bars' targets and the skin-tone line) and a histogram of the frame shown, and over it the action-safe and title-safe areas, each on a toggle in the picture's top left corner.
- EpisodeIR 1.60 (Scene
gradeandlut, Shotgrade), Timeline 1.35 (the same, resolved) and StyleSpec 1.3 (color.lut,color.looks, andlift,gammaandgainin a grade).
- Every change says what it did, with Undo (UX review 2026-10c, findings 5 and 11). A toast
at the foot of the window answers each change you make, in words: "Muted cloth turn 2",
"Deleted shot sh030", "Deleted “The bridge kettle”". Its Undo takes the change back, as
Ctrl+Z does, and both now say what they undid ("Undid: muted cloth turn 2"), with Redo, or
that there was nothing to undo. Toasts stack three at most, and the same on the desktop and
the web.
- Delete on a foley sound still mutes it: the sound comes from what happens on screen, so it stays on its track, muted. Its toast now says so, and that the inspector unmutes it.
- What could be neither undone nor confirmed now can be one or the other. Cancelling a render has Undo, which goes on from the frames it kept. Taking a render off the queue, or clearing the finished ones, has Undo until its toast goes. Archiving the show has Undo, and so does taking a show off the recent list. Deleting renders or clearing previews and caches asks first and says how much goes. So do removing a person from a shared show and removing one of your computers.
- Settings › Claude asks before what it cannot take back: removing your API key (Studio and Reelwright can never show it again), disconnecting a Claude connection, and turning off "Let this computer run my web chat on my Claude plan" (its token is revoked). Signing the installed Studio out of Reelwright asks too, and says what stops with it: the bridge and this computer's work, when they run here. Each says what is kept, its button names what it does, and Cancel comes first with the keyboard.
- The delete dialog speaks in words. "Delete “The bridge kettle”?" lists where it is used:
"the series bible: the lore “The Marigold” and the gag “The kettle hiccup”", each a link,
and no JSON pointers or ids. The button that deletes is red, at the right, and Cancel has
the keyboard.
find_usesgives each use's places in words (places). tools/answers-watch.shandtools/web/answers-check.tsdelete, undo and confirm in the installed Studio and in a browser.
Changed4 changes
- Studio's labels say what a person would, and its lists only what is worth saying (UX review
2026-10c, findings 8, 16 and 19).
- A document's id and file are under Details in its header, with its status, not in monospace under its title. A list's row and a document's header show a status badge only when it is not Approved (Draft, Locked, Archived): "Approved" was on nearly every row.
- Sounds show each sound by its name, without its id under it, and History each document that differs by its name, its file only on hover. The set explorer names each thing as it reads, in its outline ("Wall back", not "wall back · prim.panel"), its camera and lighting menus and its view ("2 Otto front", "Red alert"). The timeline says "Compiling the episode…", not the episode's id, and a sound brought in "Fog Horn.wav is in Sounds now.", not "is sfx.fog_horn now."
- Switch show names each show and says what changed since; its folder is in its tooltip, not on the row, where a long one ran past the edge.
- Episodes' season board shows each directed episode's still on its card, as the Show page does.
- History with no versions says so, and how they come, where it showed "Compare [empty] with [Now]"; Compare comes with the first version.
node tools/check-plain-words.tsreads Studio's GDScript too: what is given to a label, a button, a title, a tooltip, a menu item, a badge, an empty state or a status line, followed through a local and a function's parameter. An id, a file's path or a pointer put in, or a field's name, an id or a hex color spelt out, fails it. The 91 that still do are listed intools/plain-labels-known.txt, which only shrinks; one that must show an id, as Details does, is markedplain-words-okwith why.
- In a browser, Studio's places are Ctrl+Shift and their number (History's is 9; on a Mac Cmd+Option and the number), as Notion's are on the web: 0.7.0's Ctrl+Alt is AltGr on many European keyboards (Ctrl+Alt+7 types "{" on a German one). Talk to the showrunner is Ctrl+Shift+L and Replace Ctrl+Shift+F; Switch show stays Ctrl+Alt+O.
- The work gets the room on a laptop (UX review 2026-10c, #2). Until Claude is connected the chat waits folded to its strip, which says "Connect Claude" and opens it; the first-run tour's showrunner mark opens it while it points at it. The script, the timeline, the style lab, the set explorer, the character studio and the kit maker fold the chat while they are open when it would leave them under 1000 pixels, and it comes back as you leave; folding or unfolding it yourself still wins. At 1440 pixels these editors get 1175 of them, where they had 819, and show their own lists and words again: the style lab its parts, the set explorer its outline, the script its toolbar's names.
- Review says when an episode has no render yet (UX review #1): in place of a black player it offers Render a preview and Render, says how the render goes, and opens it there when it is done.
Fixed4 changes
- Settings › Claude ran under the chat at 1440 once Claude Code on this computer was signed in with a plan: the choice of key or plan sat on one line that would not break. It now puts the two ways on a line of their own, every switch in Settings wraps its words, and no card is wider than the page it is on.
- In a browser, Studio's keys work while typing in a field, as a web app's do: Ctrl+K opens the palette, a place's key goes there and Ctrl+, opens Settings, where the field used to type "k", "1" or the like and keep the key. A key the field needs for its own editing stays the field's (Ctrl+Z undoes its text), and a key held with Ctrl or Cmd never types a letter. A Ctrl+Alt key that types a character on the person's keyboard (AltGr: "ł", "{") types it and is never taken for a command, in the app too.
- The UX review's tour runs as a check in CI and in
tools/check-all.sh --goldens: at 1440x900 and 1100x800, nothing may reach past the window's edge, and nothing may be cut short but the designed ellipses intools/ux-tour-allowed.txt. - Review fits the window (UX review 2026-10c, #1). Its fixed widths added up to 1730 pixels in a 1440 window, pushing its Export, its notes and the chat off the edge. The header and the player's buttons now wrap, and the notes panel is 280 pixels and folds where the player would be too small. Words no longer cut short: History's "Compare" and "with", the editors' readouts and the gallery's captions wrap, and the script's header names it by its title, whole in its tooltip, with its file under Details as a document's is.
0.7.0
29 changes: 16 added, 1 changed, 12 fixed.
People in a script come out as written, and Studio gets out of the way. A girl of eleven is drawn as a child and her grandfather as an old man; the lantern she hands him passes from hand to hand and looks like a lantern; crowds rush past and turn to look; a phone's message fills the frame. Studio has one Settings, at the foot of the rail, where Claude is connected with your own API key or your own Claude plan, and every key can be rebound. Renders wait in a queue and carry on after a stop, and the script editor writes like Final Draft.
Added16 changes
- A framed single can be seen over someone else's shoulder: the shot inspector's "Over the
shoulder of" and
set_cameraoverShoulderOf(or "none"), which the framing solver always took but nothing could set. The shot becomes an over-the-shoulder shot, and its lead room, a single's, goes. - A pose maker (product audit #17,
docs/design/m6-performance.mdpart 4): in the character studio's Poses, a gesture or a pose is posed by taking hold of the character, card or 3D figure, at any angle.- New gesture… and New pose… show a handle on each hand and foot, the head, the chest and the hips. A hand or a foot dragged reaches for the point with its arm or leg. The head and the chest turn toward the drag. The hips move, and the legs bend under them with the feet kept on the floor. Nothing goes past what the rig lets a joint do.
- The keys are on a strip: click one to pose it, drag it along, double-click to add one,
Delete to take one out, each with how it eases on. The playhead scrubs it live, Play runs
it, and Save keeps it in the show's gestures. The fingers take a grip (relaxed, point,
open, fist, grip, thumb up: GestureLibrary 1.4
handShape). - A cue that gives no intensity plays a posed gesture as it was posed (GestureLibrary 1.4
intensity, which the pose maker saves as 1), where Reelwright's play at half. - It then plays as Reelwright's own do: on the timeline, by name in a script, in renders,
and alike in the installed Studio and the browser. A show's gestures that turn a joint
past what the rig allows are refused (
gesture.beyond_limits).
- A pose held until released (EpisodeIR 1.56
hold: {"untilReleased": true}): arms folded, hands on hips, or a pose of the show's own, held from its stroke until they gesture with that arm, take something in hand, move or change posture, or the scene ends. The timeline inspector's Holds offers Plays once, For a time and Until released, andset_gesturetakes it. The director holds a show's own pose as it holds arms folded when a script names it. - The script editor as a screenwriter's tool (product audit 2, findings 9, 10 and 23;
docs/design/m5-writers-room.md, "The script editor as a writer's tool").- Find and replace: Ctrl+F finds (it no longer types an "f"), Ctrl+H replaces while the script has the keys (elsewhere it is still History), with match case, whole word, F3 and Shift+F3 for the next and the previous match, and Replace all as one change Ctrl+Z takes back. Without match case each match keeps its case, so a renamed character's cue stays in capitals.
- Spell check: a wavy line under each word the dictionary does not know, with suggestions, Add to the dictionary and Ignore on a right-click. The show's dictionary already knows its cast, sets, props and sounds and the script's own names and places. The word list (the English Speller Database's US list, Hunspell en_US's own source, under its permissive licence) comes with Studio, so it works offline and in the browser.
- Elements as in Final Draft: Enter and Tab move between scene heading, action, character, parenthetical, dialogue and transition and write the Fountain for the writer (the blank lines, the capitals, the brackets). The element the caret is in is shown and can be chosen, and names and places complete, the script's own as well as the show's.
- Pages: the script on industry pages, the PDF export's own layout in Courier 12, with page numbers, scene numbers and (MORE) and (CONT'D); the script shows where each page begins, and the bar says the caret's page and scene and how many pages there are.
- Revisions: Lock this draft keeps the script as a version of the show, and every line changed since is marked with an asterisk and the revision's colour (Blue, then Pink, Yellow, Green and on), in the script and on its pages.
- Notes on the script: select lines and press Ctrl+Alt+M (or right-click, Note) to write one, in a panel beside the script that folds away and resizes like the reading. Notes are replied to and resolved, marked in the gutter, follow their lines as the text changes, and everyone in the show sees them as they are written.
- The script draws in Courier Prime, bundled, so it looks the same on every computer and in the browser; ids and codes draw in a bundled Noto Sans Mono.
- A script's props look like what they are (the second product audit's finding 6: the red
lantern Mei hands Grandpa was a brown box, as was every prop the missing-prop fix made).
- Reelwright has a library of prop patterns for the things scripts handle most: a paper
lantern, an oil lantern, an umbrella, a phone, a mug or cup, a spoon, a crate, a book, a
bag, a bottle, a box or gift, a note or letter, a kettle, a candle and a chest. Each is
seeded, sized as the thing is, and held by its own grips, which follow its size. The
crate, the oil lantern, the kettle, the candle and the chest are their kits' own pieces,
with what a hand needs added. PropPattern 1.1 adds
piece, the kit piece a pattern draws. - "Make a prop called red lantern", "Make all 7 missing props" and Studio's New prop draw each thing from the pattern it is, by its name and the words for it: "red lantern" is a paper lantern painted red, "Mei's phone" a phone, "a cup of tea" a mug, "a big crate" a big one, "a gift box" a present with a bow. A show's own prop patterns come first.
- A thing no pattern draws is the kit piece it is, when a kit has one: "the counter" Mochi jumps onto is the diner's counter (or the kitchen's, in a show whose sets are built from the home kit), "a lamp" a table lamp, "the telephone" a rotary one, "a stool", "a barrel". It is carried by its top, or in two hands, when it is small enough. "A shutter" is a shop's roll-up shutter of its own, and "pulls down a shutter" pulls it down. Only a thing nothing draws is the plain box, sized for what it is.
- An episode's needs make every prop its outline or its screenplay's action needs:
fill_needsdraws each withgenerate_props, where it had said "props have no sampler yet". generate_propsdoes the same for the showrunner, from the names a scene gives.
- Reelwright has a library of prop patterns for the things scripts handle most: a paper
lantern, an oil lantern, an umbrella, a phone, a mug or cup, a spoon, a crate, a book, a
bag, a bottle, a box or gift, a note or letter, a kettle, a candle and a chest. Each is
seeded, sized as the thing is, and held by its own grips, which follow its size. The
crate, the oil lantern, the kettle, the candle and the chest are their kits' own pieces,
with what a hand needs added. PropPattern 1.1 adds
- An insert of a phone, a note, a screen or a sign shows its words, filling the frame
(
INSERT - MEI'S PHONEand the text under it staged nothing in the audit). The text becomes a message on the phone's screen, under whom it is from ("A text from Grandpa: Come home", "GRANDPA: Come home"); "CLOSE ON THE NOTE" over "It reads: Back soon" is the note with its words on it. It cuts in and out as a shot does, for as long as the words take to read, in the show's title colors. EpisodeIR 1.58 addsTitleCue.insert, and Timeline 1.33 addsTitleCard.graphic. - The director stages handing over, holding up and climbing onto things (the second product
audit's finding 6: "Mei hands Grandpa the red lantern" staged a walk and nothing else, and
"Mei climbs onto a crate" staged nothing).
- Someone climbs or jumps up onto a piece of the set or a prop ("climbs onto a crate",
"jumps onto the counter", "gets up on the table") and stands on its top until their next
move, which steps them down first; "jumps down" alone steps them down beside it. A climb
takes longer the higher it goes, and a jump arcs over the top. EpisodeIR 1.57 adds
MoveCue.onto(climborjump). - A thing taken from someone's hand ("Grandpa takes the lantern from Mei") is handed over. "Holds it up" and "holds up the lantern" raise it overhead, once it is in their hand. "Holds an umbrella over the robot" goes up beside the robot first.
- "Opens", "closes" and "pulls down a shutter" put a hand on the thing where it stands, and no longer pick it up and walk off with it. "Knocks a spoon to the floor" knocks it down from beside them. "Pockets the phone" reads so in the script editor.
- "He" and "she" find someone the show gives no pronouns, as the audit's Grandpa Huo had none.
tools/staging-watch.shmakes a show from nothing in Studio, clicks the reading's fixes, and draws the climb onto the crate and the lantern handed over and held up.
- Someone climbs or jumps up onto a piece of the set or a prop ("climbs onto a crate",
"jumps onto the counter", "gets up on the table") and stands on its top until their next
move, which steps them down first; "jumps down" alone steps them down beside it. A climb
takes longer the higher it goes, and a jump arcs over the top. EpisodeIR 1.57 adds
- The script editor offers "Make a prop called umbrella" for each thing the action handles that the show has no prop for, and "Make all 7 missing props" for all of them at once, as one change. Each is the New prop template's plain box, named as the script names it and sized by what it is: a crate to stand on, a phone to hold. A typo of a prop the show has offers that prop instead.
- People are drawn at their age (second product audit #7: Grandpa, "70s", came out a tall,
athletic, dark-haired 184 cm, and a girl of eleven could only be had by typing her height).
Reelwright's people pattern has an age axis: a baby, a child, a teen, an adult, older and
elderly, each with its own height, heads tall, legs, arms, shoulders, posture, face and hair
(a child's bigger head and shorter legs; grey or white hair, bushy brows and a stoop for the
elderly). The persona's age chooses it ("11", "70s", "early thirties", "in his sixties"), and
the script's reading gives it from the introduction ("MEI, 11,", "GRANDPA HUO, 70s,") or the
name ("NANA ROSE", "BABY JANE"). Someone the script gives no pronouns takes them from a
kinship word or a title in their name or introduction ("GRANDPA HUO" is he, "MRS. KIM" she,
"THE CHIEF" no guess), never over the script's own, so Grandpa wears no bun. The same seed is the same person at every age: their face,
clothes and colours stay. An Age row in Cast › Fields draws the body again for another age,
keeping the face, and back. Versions: CharacterInstance 1.8
body.age; the character sampler is 1.4.0;generate_characterstakespersonas[].agefrom Studio. A show made before keeps its own copy of the people pattern, without ages. - A place the library does not know by name can be made from the script (second product audit
#5: ROOFTOP, NIGHT MARKET and DELIVERY VAN could not be made, and "Make all 6 new sets" made
none). "Make a set for ROOFTOP…" opens a picker of the show's patterns and Reelwright's
library, the closest first by the place's words, the words a script uses for such a place
("market" is a street of shopfronts, "noodle" a diner) and its scenes' own words, indoors or
out as INT. or EXT. says, each saying whose it is and why; the set's name is filled in as the
heading calls it and can be changed. "Make all" builds each place from its first choice and
goes on past one that fails, saying which. Sets › New set lists the library's places beside
the show's patterns.
ReadingFix.choicesandnamecarry the picker. - A render queue, as in a pro tool's render queue (second product audit #13,
docs/design/render-queue.md).- Start as many renders as you like: previews, full renders, exports and dubs of any episode. They wait their turn in a queue on the Episodes page and run one at a time. Move them up or down, pause one or the whole queue, cancel one, and clear the ones that ended.
- The queue is kept with the show. Close Studio, or lose the daemon or the machine mid-render, and the render goes on when the show is open again.
- Each render says its stage, the frames drawn, how many a second, and the time left. When it ends it says how long it took.
- A render that stopped goes on from the frames it drew and checked, not from zero. Frames are drawn in batches of about a minute, each checked against its hashes and kept. The frames, and the video, are byte for byte those of a render drawn in one go.
- A failure says what happened in plain words and what to do next: try again, free space, open the log, open the script. A full disk says where, and how much room the render needs. A missing program says which. A renderer that stopped says at which frame and in which shot.
- Before anything is voiced or drawn, a render checks for ffmpeg and the engine, that the episode compiles, and that the disk has room.
- Free space in Settings, and
reelwright clean, now clear the frames past renders drew, which nothing listed before. An episode's frames stay while a render of it in the queue has not finished: it goes on from them. - Session protocol:
renders.queue,renders.move,renders.pause,renders.resume,renders.clearand therender.queuenotification;renders.startanswers withahead;render.eventaddsfps,etaSec,elapsedSec,tookSec,checked,resumed,failure,logand thepausedstatus.
- Crowds and extras (the second product audit's finding 6: "Crowds rush past…", "The crowd
slows. Faces turn." and "A cheer from the crowd." staged nothing, and a stall owner had to be
made a cast member first).
- A sentence about a crowd hurries it past, gathers it round someone, stops it and turns it to
look, or has it cheer: "Crowds rush past", "Two passers-by stop and stare at Mei", "A crowd
gathers round the busker", "Faces turn", "A cheer from the crowd". At whom the words say,
else at what the action holds up high, else whoever it named last; "crowds" are twenty
people, "a crowd" twelve. The script editor says what each stages: "A crowd of 20 hurries
past", "The crowd slows to a stop and turns to look at the red lantern". EpisodeIR 1.59
adds
CrowdCue. - A role the action brings on with "a" or "an" ("A STALL OWNER pulls down a shutter") is an
extra of the episode, acted, voiced and named as the cast is, with no cast file to make: the
reading's "Make all 4 new characters" no longer counts them. EpisodeIR 1.59 adds
extras. - Both are drawn from the show's people pattern, varied in looks, clothes and age (children to the elderly), each from a seed of its scene and number, so the same show compiles to the same bytes.
- The crowd keeps off the cast, the set's pieces and the props, mostly behind the cast as the scene first sees it, comes on and goes off out of every camera's sight, and is never in front of the cast: anyone who would be is left out from coming into the picture to leaving it or the cut.
- Extras are drawn cheaply (Timeline 1.34
Actor.extra): no lip sync, blinks or foley, on twos, at a lower level of detail, each drawing kept while it holds. Twenty of them add about 260 ms a frame to the market's wide on lavapipe at 1280x720 (about 290 ms without them), where drawn as the cast is they added about 780. - A crowd turned to a thing held up overhead ("Mei holds the red lantern up high. The crowd slows. Faces turn.") turns as it goes up, to where it is up there, and its eyes follow it down after. A look or a gesture at a thing someone lifts (overhead, to the mouth, to the eyes) aims where the hand has it, not at the hand's place at rest.
- "Mei cheers" throws both arms up: a
cheergesture for people, which every other body plan plays as it plays a fist pump (a cat wags its tail, a robot beeps). - Studio's timeline puts a crowd's cues on a Crowd lane.
tools/crowds-watch.shmakes a night market from nothing in Studio and draws the crowd rushing past, turned to look and cheering;tools/crowd-cost.shtimes a render job's frames with and without its crowds.
- A sentence about a crowd hurries it past, gathers it round someone, stops it and turns it to
look, or has it cheer: "Crowds rush past", "Two passers-by stop and stare at Mei", "A crowd
gathers round the busker", "Faces turn", "A cheer from the crowd". At whom the words say,
else at what the action holds up high, else whoever it named last; "crowds" are twenty
people, "a crowd" twelve. The script editor says what each stages: "A crowd of 20 hurries
past", "The crowd slows to a stop and turns to look at the red lantern". EpisodeIR 1.59
adds
- Preferences (product audit 2, #15): Ctrl+,, the palette or the show menu opens Studio's own preferences. Text size makes everything in Studio bigger or smaller, from 75% to 250%, at once and remembered; Ctrl+= and Ctrl+- still step it, and Ctrl+0 puts it back.
- One Settings, with Claude in it (the owner: "in the studio there is literally nowhere to
configure/add your API key and/or use the bridge, and the settings are incoherent").
Settings is the last place on the rail, below History, a gear set apart at its foot; Ctrl+,
opens it from anywhere, the first screen too, on the page last used. A list beside it has
two groups: Studio's own, on this computer or for your account (Claude, Appearance,
Keyboard, Account on the web, About & updates), and the open show's (The show, Look, Renders
and voices, Memory, Writing, Storage, and Copy, archive or delete). A search over every
setting's name goes straight to it, and each page is a link of its own:
#/settings/claude,#/<show>/settings/look.- Claude says at its top how it is connected: not connected, connected with an API key ending ••••abcd, or through your Claude plan, and which is used for what when both are set (the chat on the plan; Write with Claude, Direct and memory on the key). With the plan ready, "The showrunner's chat uses" chooses there between the key and the plan. The key is added, tested, replaced and removed there, with where it is kept ("in a file only you can read"; Show where opens its folder) and what it costs. The plan's checklist says what Claude Code on this computer still needs, adds Reelwright to it for the show and takes it out again, and has the switch for Studio's own chat on the plan. On the web the service keeps the key and tests it, and your own Claude Code or Claude app connects through its MCP server, the bridge on your computer taking Studio's chat.
- Every Connect Claude (the chat, the script's assistant, the palette, a notice) opens Settings › Claude with the key's field ready, where a dialog opened before.
- The show menu has one Settings… where Show settings…, Preferences… and Connect Claude… were three, and the palette lists each page ("Settings: Look"). The Preferences dialog is gone; Appearance has its text size. About & updates has the version, the daily check for a newer Reelwright (from the first screen), Check now and Report a problem. The show's Claude card is now its Memory and Writing pages, so Claude means one thing.
- The service's
POST /api/claude/checkasks Anthropic whether the key it keeps still works, as connecting it did (one model listed, free), within the same ten checks an hour.
- Text size (product audit 2, #15), in Settings › Appearance: everything in Studio bigger or smaller, from 75% to 250%, at once and remembered; Ctrl+= and Ctrl+- still step it, and Ctrl+0 puts it back.
- Keys you can change (second audit #19). Settings has a Keyboard page: every command Studio
has, with its keys, found by what you type. Click a key and press the new one (Esc stops);
the + beside a command gives it one more key. A key another command has is said ("I already
does “Mark In at the playhead”") and taken from it only when you choose Use it here. A key that does
something else first in another place is said under the command, and so is a key your
browser has. Put back gives one command, or every one, its keys again.
- Start from Reelwright's keys, or keys like Premiere's or Resolve's for the editing. Like Premiere: Split is Ctrl+K, trim Q and W, nudge Alt+Left and Alt+Right. Like Resolve: Split is Ctrl+B or Ctrl+, trim Shift+[ and Shift+], In to Out Alt+/, markers Shift+Up and Shift+Down, fit Shift+Z. J, K, L, In and Out stay as they are.
- The keys are yours, not a show's: kept with your settings on the desktop, and for you in your browser on the web.
- Every place asks the same map of keys: Studio's own, the timeline, its 3D view, the set explorer, the piece maker, the character studio, the style lab, the script editor, notes, the booth, review, and changes and pictures. Tooltips, menus, the shortcut sheet and messages say the keys as they are now. The shortcut sheet has Change keys, and the palette has Settings: Keyboard.
- Esc ends the first-run tour, as Skip tour does.
Changed1 change
- The rail and the chat fit the window (product audit 2, #16: on an iPad the chat was cut off at the right edge). In a window under 1280 pixels wide, at the person's text size, the rail folds to its icons and the chat to its strip on their own, and they unfold when the window widens. A panel folded or unfolded by hand stays so whatever the window, until the person chooses what the window would have done. The installed Studio's window can now be made as narrow as the main area beside the folded panels, about 610 pixels, where it stopped at 1124.
Fixed12 changes
- Someone climbing up onto something is seen whole: a shot that follows them up is a long shot or wider, and a cut on their getting there waits until they are up. With the crate a little taller than the box it was, the staging watch's Mei climbed in a medium long shot, and the cut away to Grandpa came on her last frame of climbing.
- Studio starts on its own window color, not Godot's splash (second audit #25). The desktop
app showed Godot's logo, "GODOT Game engine", on grey before the welcome screen; only the
web hid it. Every platform now starts on the welcome screen's dark color with no image, from
the checkout and in every export, as the web does. The release smoke reads the splash
settings out of the exported Studio's own pack (
tools/release/pck.ts) and fails on an image or another color for any platform. - Messages say what to do in plain words (second audit #20).
- A place no set pattern fits: "no set pattern, the show's or Reelwright's, makes a place
like "Rooftop": build it from the set pattern nearest it, or write a set pattern for it
first", where it named
list_kits,setTypeandcreate_set_pattern. A set type with no pattern is said by its name ("a ship corridor"), not its id. - A crossed line names the two people: "shot sh050 puts the camera across the line between
Grandpa Huo and Mei, so they swap sides of the screen", and its hint says to mark the
crossing on purpose, not to set
crossesAxis. - A color off the style says which and how: "the brows color is greyer than the style allows (saturation 0.12; the style keeps 0.35 to 0.9)", not "@brows #68491B breaks the style's color rules … (style.color.rules)". The palette solver's, a pattern's and a restyle's warnings say it the same way.
- A prop the action names that the show lacks: make it from what the script needs, or name one of the show's props, by name; not "create_props (episode_needs lists it)".
- Asking for what is there already is no failure. "Nothing to change: the show already has all of this" is said in the usual color; a script fix goes on and says done, and an editor's edit is not taken back.
- A set is filed under the name it is made with: "Rooftop" is
set.rooftopinsets/rooftop.set.json, notset.outdoors_2, with a number after it where another set has that id. Sets and Cast show each name without its id under it. - Palette colors are named in words ("Cel shadow tint", "Show accent"): on the style lab's swatches and in its inspector, in the character studio, the wardrobe and the kit maker. They read "shadow_t…" and "@accent_2".
- A file changed is said by what it is and its name ("Updated the style Noir"), not its path, and opening another show (on the web) drops what was said of the one before.
- New show's title asks for "The show's name, e.g. Harbor Lights", not "Slop Trek".
node tools/check-plain-words.ts, intools/check-all.shand CI, fails on a message incore/srcthat says a tool or field name, a spec path, an id, an @slot, a hex color or a JSON pointer. The 668 messages that still do are listed by what they say intools/plain-words-known.txt: each passes until it is edited, then must be made plain, and the list only shrinks.
- A place no set pattern fits: "no set pattern, the show's or Reelwright's, makes a place
like "Rooftop": build it from the set pattern nearest it, or write a set pattern for it
first", where it named
- A full disk is a full disk, not a bug. On the command line it said "internal error: EFBIG …
This is a bug in Reelwright" with a stack trace and exit 70; it now says there is no room left
and exits 1, as a missing program does. The daemon answers it with
disk.full, not "internal error". A failed save leaves no*.tmpbeside the file. - A renderer that stopped no longer says "the engine exited with 137 and wrote no result for job.6100ab88221013a1:" over nothing. It says at which frame and in which shot it stopped, and why: a crash, or the system ending it when the computer ran out of memory.
- Hints, placeholders and notes are readable (product audit 2, #15). They were drawn in the faint grey kept for what is disabled, 2.68:1 against a panel where 4.5:1 is the least for text. The message box's "Enter to send", the switcher's keys, a field's placeholder, the cost of a turn, Studio's notes in the chat, a note's quoted lines, the script's own notes and the reading's quiet lines are now the muted grey of captions: 5.13:1 on a panel, 4.74:1 on a card, 5.52:1 in a field. The faint grey is for what is disabled only.
- On the web, Studio can be zoomed as any page can (product audit 2, #15 and #16). The
browser's zoom makes it bigger or smaller, where Studio stayed the same size, and on a tablet
or a phone two fingers pinch the page closer: the page no longer says
user-scalable=no, and Studio no longer holds every touch for itself, so the browser sees the pinch. - On the desktop a saved Anthropic API key could not be seen, tested or removed in Studio: Connect Claude said nothing of the key in use and offered only Connect again. Settings › Claude shows it by its last four and where it is kept, says when ANTHROPIC_API_KEY where Studio runs wins over it, tests it and removes it.
- With no show open nothing offered to connect Claude: Settings opens over the first screen with Studio's own pages.
- Reelwright added to Claude Code for a show could not be taken out again from Studio: the
plan's checklist offers Remove (
reelwright claude disconnect). - In a browser, Studio leaves the browser its own keys (second audit #19). Ctrl+W, Ctrl+T, Ctrl+N, Ctrl+L, F5, Ctrl+R, Ctrl+1 to Ctrl+9, Ctrl+H, Ctrl+B and the page's zoom go to the browser; Studio's page held every key back before. In a browser Studio's places are Ctrl+Alt and a number, History Ctrl+Alt+H, the sidebar Ctrl+, Studio's size Ctrl+Alt+= and Ctrl+Alt+-, Talk to the showrunner Ctrl+Alt+L, Switch show Ctrl+Alt+O and Replace Ctrl+Alt+F; Back and Forward are the browser's own. The tour's last mark and the Keyboard page say which of the browser's keys Studio still uses: Ctrl+K, Ctrl+D, Ctrl+S, Ctrl+F, F3 and Ctrl+I.
- On a Mac, History is Cmd+Y; Cmd+H hid Studio instead (second audit #19). Replace in the script is Cmd+Option+F, and Redo Cmd+Shift+Z.
0.6.0
40 changes: 17 added, 2 changed, 21 fixed.
The camera, the cut and the sound grow up, in both editions. A shot's camera moves through keys, racks its focus and goes handheld; every render is kept as a version and reviewed in a player with notes drawn on the frame; footsteps, cloth, props and doors are heard with no one placing them. Sea creatures join the cast, a show makes its own gestures and walks, every library place looks finished, with weather, and lower thirds name people on screen. A show can be made in another language and its episodes dubbed. The timeline edits as an editor expects: copy and paste, In and Out, lift and extract, a timecode, shuttle, waveforms, a mixer and fades on any clip. And the second product audit's worst findings are fixed: Direct never hands back an empty cut, a broken file is said and restored, two people's edits never add up, the web edition says when it is offline, and every Ctrl+Z counts.
Added17 changes
- Foley, made from the compiled Timeline with no one placing it
(
docs/design/sound-and-delivery.md, "Foley").- Footsteps fall on each heel strike of every walk and run, as the engine's pose solver plants them. They sound like the set's floor: wood, metal deck, carpet, stone, grass, sand or water.
- Clothes rustle as people sit, stand, turn and make a big gesture.
- Props sound picked up, put down, handed over and used, by what they are made of.
- Doors open and close as people come on and go off through them.
- Each sound plays from where it happens, the same frame always gives the same sound, and it
dips under dialogue by
format.audio.foley.duckDb(−8 dB), at itslevelDb, or not at all whenoff. - The 53 sounds are Reelwright's own recipes (CC0, synthesized), so the release ships no recordings. Renders deliver a fourth stem, foley, and OTIO exports put it on a Foley track.
- In Studio, foley has its own lane under Effects. Any one sound can be muted, levelled, played as another sound or put back as made, and a missing one added at the playhead (A, S) from the built-in sounds in the library.
- Versions: set 1.4
floor, prop 1.1material, showformat.audio.foley, EpisodeIR 1.51Scene.foley, Timeline 1.28 clip kindfoleywith itssound, FrameExport 1.1 stem rolefoley, andedit_episodeset_foley. node tools/foley-check.tsrenders a Low Tide scene and the Lighthouse and measures them: every heel strike heard within a frame, and each sound at its gain, ducked under speech.
- Camera keys (product audit #12: one move per shot, no focus, one handheld for the whole
style). A framed shot's camera can pass through several framings: keys on the timeline's
camera strip, each when it is and what it frames (size, whom, turn, height, lens), added at
the playhead (A then K, the Add menu or the shot inspector's "Add camera key"), dragged along
time, opened in the inspector with a click and removed with Delete. Between two keys the
camera comes as the change says (it holds when nothing changes, zooms when only the lens
does, pans to new subjects, pushes in or pulls out with the size) or as the key says, eased
as its easing says; the lens zooms in even steps of magnification, so a dolly zoom is two
keys. Any shot can focus on someone (the plane of their eyes, wherever they go) or at a
distance, at an aperture; a key that focuses elsewhere racks the focus over the span (on a
set's setup or an insert, keys rack the focus alone, the camera staying put), and what is off
the focus blurs as a lens of that length and aperture blurs it, characters too, alike in
renders, the installed Studio and the browser. A shot can have handheld of its own, or be locked off
in a style that shakes. A move between two framings (
move.to) is the two-key case. A key may sit outside its shot (before its start or past its end), so splitting a keyed shot at the playhead leaves its picture as it was, frame for frame. EpisodeIR 1.50 addscamera.keys,camera.focusandcamera.handheld; Timeline 1.27 adds focus and aperture to camera keys and a shot'shandheld;edit_episodeaddsset_camera_key, andset_cameratakesfocusandhandheld. - Renders are kept as versions, with notes on their frames (the product audit's finding 16,
docs/design/review-loop.md).- Versions. Every render Studio starts, here or on a runner, goes to the episode's next
version,
renders/<slug>/v1/,v2/and so on, instead of over the last one. A render that fails or is cancelled leaves nothing. From a runner, a version's files that came out as a version before had them are copied on the service, not sent up again. - What changed. What the show held as each version compiled is kept beside it, by hash,
in the objects named versions use.
renders.changessays what changed between two versions: the episode's script line by line, what the director made of it scene by scene (shots and cues by id), and every other document field by field. - Approved.
renders.approvemarks one version the episode's approved cut, with who and when. - Review copy.
renders.reviewmakes a render's review copy for a player that reads it frame by frame by byte range: every frame as a JPEG in one file, each frame's peak level left and right, and the sound as a WAV. - Notes. A note is a comment thread on a version's frame or range (CommentThread 1.1:
the anchor's
version,toanddrawing, with arrows, circles, lines and pen strokes drawn on the frame). It is checked against the render on disk. - Export.
comments.exportwrites an episode's notes as a ZIP of a CSV with timecodes and a thumbnail of each note's frame, or as a PDF with each frame and its marks beside the thread. - The review player, both editions. Watch on an episode opens its review instead of the
MP4 in another app or a browser tab: Episodes › Watch, or the route
<show>/review/<episode>/v<n>/<frame>.- The player: frame-accurate scrubbing, J, K and L (faster each press), arrows for a frame (Shift: a second), the timecode, In and Out (I, O) played round with Ctrl+L, speeds from a quarter to double, level meters, and fullscreen (F).
- Its frames are read a second at a time by byte range: from the disk on the desktop, by HTTP Range over the service on the web and for a show on a runner.
- Versions: pick one; compare two side by side or as a wipe (C), in sync; approve one; the Changes tab says what changed since the one before.
- Notes: beside the player, a click goes to one. One is written at the frame or over In to Out, with an arrow, a circle, a line or a pen stroke drawn on the frame (D picks the tool, N the text, Ctrl+Enter posts). @mentions are completed as typed. Notes are replied to and resolved; "Fix this" sends one to the showrunner with where it is.
- Share… invites a reviewer by email (M13: they comment and cannot edit). Accepting
lands them on the version: an invitation's optional
place. - Export writes this version's or every version's notes and opens the file.
tools/review-watch.shandtools/web/review-check.tsprove it live.
- Versions. Every render Studio starts, here or on a runner, goes to the episode's next
version,
- Sea life (M16 phase 3,
docs/design/m16-any-character.md): the product audit's Low Tide Blues crab, octopus and whale were made as people in pink shirts.- CharacterInstance 1.5 adds three kinds:
- fish: a fish, a shark, a whale, a dolphin, a seahorse or a sea turtle, afloat and swimming;
- octopus: an octopus, a squid or a jellyfish, a mantle over tentacles;
- crustacean: a crab, which scuttles sideways, or a lobster.
- Their flippers, front tentacles and claws are arms: they wave, conduct and hold props.
- Each kind has its own rig template, gesture library, drawing, swimming or scuttling gait, starter pattern, New character button and cast icon. Their eyes are held to the core's metrics in every posture.
create_characterreads "a hermit crab private eye in a battered fedora" as a crab in its shell wearing a worn fedora, its job "A private eye.". It reads "an octopus bandleader in a white dinner jacket" as a pink octopus in a white jacket and a black bow tie.- The director reads swims, paddles and jets as going, and a swimmer's float or drift as a swim, not a float. A crab crosses sideways. An octopus conducts, a crab snaps its claws and a fish flicks its tail.
- A script's "OCTAVIUS, an octopus bandleader" offers "make an octopus", and "Make all new characters" makes him an octopus beside the people it draws from the show's pattern.
- CharacterInstance 1.5 adds three kinds:
- A brimmed hat (a fedora, a trilby, a top hat) is drawn as itself, not as a cap. A necktie is drawn on a person (2D and 3D) and as a bow tie on an octopus.
- A show's own gestures and walks (product audit #17,
docs/design/m6-performance.mdpart 3):gestures/<slug>.gestures.jsonis laid over Reelwright's library by gesture id. The compiler times its gestures, the director reads them by name ("Otto salutes"), and the engine plays them in 2D and 3D.- The character studio's Poses has New and Edit: a pose editor that keys the pose solver's
own channels, shows each key live on the character and keeps the gesture with
save_gesture(remove_gesturetakes one out). - A character can walk its own way (CharacterInstance 1.6
walk.style: swagger, stomp, tiptoe or one of the show's styles) and at its own pace (walk.pace).
- An unknown gesture is said (
gesture.unknown), with how to make it, and Studio's timeline shows it among its compiler notes. - A body too long for the room is said (
blocking.too_big): where a whale, or any body with a length, settles in an interior set with more than 0.25 m of itself in the walls, the compiler says how long it is and how far in it goes, on which mark, and how to give it room. - Every library place signed off as a production designer would (
docs/design/world-kits.md, "Signed off: the places pass";node tools/places-sheet.tsrenders each place in each of its presets, wide and medium, as one contact sheet a place). A room's windows show the hour outside, not the room's light. The club's set has a spot hung over the floor on the singer; the diner's graveyard shift, the castle's torchlight and feast, the warehouse's and the alley's noir, the forest's golden dusk and the moon's low sun each read as their own mood. The city street has a skyline behind its shops, and seven places have pieces near the lens so their wides have depth. The club's loose tables, the diner's second table and the street's newspaper box find room now. - Weather as part of a mood (
docs/design/lighting-mood.md, "Weather"). A showrunner's rainy street now rains, the woods snow, a gale thrashes the palms and fog rolls in along the ground. A lighting preset says itsweather:rain,snow,windand which way it blows (windDeg), and lowfogBanks; a look brings it, and a lighting cue fades it in and out. Rain and snow fall as quads the vertex shader places from their index and the frame alone, so a frame draws the same every time, on the desktop and in a browser; the wind slants the rain, drifts the snow and sways what a recipe slot's newswaysays sways (leaves, needles, fronds, grass, kelp), its ink and shadow with it. A browser draws fewer drops and flakes and the set says so. The library's Storm rains on a gale; new Rain, Snowfall and Windy day looks; Misty morning lays fog banks; the city street and the alley have a rainy preset, the forest a misty dawn and snowfall. Studio's lighting editor sets the weather in its Air section, live, and the director reads "It starts to rain", "Snow falls", "The wind picks up" and "Fog rolls in". - Light through a window comes through the gobo: the blinds stripe the pool it lands in on the
floor, in step with the stripes the key lays everywhere else, and the shaft in the air hangs
as sheets of light that run on into that pool. A picture gobo is one picture per repeat, the
right way round as the light sees it, and its colors filter the light as a gel does, so
stained glass throws colored light. Forward+ and the browser draw it alike (one shared
rw_gobo.gdshaderinc). - Pictures to cut light with: the library's stained glass, a leafy canopy, a window with its
mullions and a cell's bars, small, high in contrast and tileable, frozen in the library
(
node tools/library-pictures.tsdraws them). The castle hall's daylight now falls through stained glass in colored pools across the floor, and the kitchen's morning and the classroom's afternoon lay their window's panes on it. New looks: Through stained glass, Through the bars (a narrow beam through each window), Neon through the window (a red shaft) and Sun through the leaves; a look's shafts take a width. A set that names a library picture carries it into the show's own assets, pinned by its hash, so a set built from words renders it on the desktop, on runners and in the browser.list_kitslists the pictures, the library's and the show's own. - The lighting editor cuts a picture into the key (Shapes, Picture: the library's or the show's own) and sets each shaft of light's beam (through it or down from it), width and color. Each shows in the view at once, before the daemon answers, and Ctrl+Z takes it back.
- The heuristic director reads "Light falls through the stained glass", "a red shaft of light from the window" and "a narrow beam" as a change to the set's preset whose gobo or shafts say so, and names the library's look to add when none does; a model director is told each preset's picture and its shafts' width and color.
- Lower thirds (product audit #19, its last part;
docs/design/lower-thirds.md). A name and a line under it ("MAYA OKAFOR / Night shift, St. Jude's") come in over a shot, low in the title-safe area, and go out again, drawn in the show's own typefaces and title colors as a bar, plain words or a boxed card; a style picks the design, the side, capitals, size and how fast it comes in. On the timeline, A then W (or Add › Lower third) puts one over the shot at the playhead, named after the one person that shot shows, with their role under it; it sits on the new Overlays row, drags along its shot or onto another, its end drags to change how long it shows, the inspector changes its words, whom it names, its design and side, and Delete takes it away. It moves with its shot when the cut moves, and never holds up the performance. The showrunner sets or removes one withedit_episodeset_lower_third. The director, with or without a model, readsSUPER: MAYA OKAFOR, NIGHT SHIFT(a SUPER that names one of the cast),CHYRON:andLOWER THIRD:as lower thirds over the first shot that shows whom they name,TITLE OVER BLACK:as a full card, and, with Show settings › Format › "Introduce characters with a lower third", names each character the first time an episode shows them. EpisodeIR 1.53 adds thelower_thirdcue, Timeline 1.30lowerThirds, StyleSpec 1.2typography.lowerThird, and show.jsonintroduceCharacters. - A show can be made in another language, and an episode dubbed (finding 27,
docs/design/languages.md). Studio's own words stay English.- New show and Show settings choose the show's language (
show.jsonlanguage, a BCP 47 tag; ShowManifest 1.2;init --blank --language es). The showrunner writes in it, and its characters are cast with that language's voices. - The local voices speak Kokoro's nine languages: American and British English, Spanish, French, Hindi, Italian, Japanese, Brazilian Portuguese and Mandarin, each read through the G2P Kokoro's own pipeline uses (espeak-ng, misaki's Japanese and Mandarin), with word timings. A character's voice binding may name its language (CharacterInstance 1.7); a dub with no voice for its language borrows the character's own and says so.
- Lines in another language are lip-synced by Rhubarb's phonetic recognizer, its own key and record.
- An episode carries its dubs (
EpisodeIR.dubs, 1.52): each line's words, caption and take in another language, written byedit_episode'sset_dub. A render in a dub's language (render --language ja,renders.startlanguage, Episodes' "Render a dub…") voices, lip-syncs and captions it in that language, torenders/<episode>.<tag>/(from Studio, as the episode's next version,renders/<episode>/v<N>/), its Timeline saying so (Timeline.language, 1.29). - Captions in Chinese and Japanese wrap between characters, 16 to a row, never before a stop.
- Titles, signs and Studio's text draw Cyrillic, Greek, Devanagari, Arabic, Chinese, Japanese and Korean from bundled Noto fonts (OFL) behind every family and every typeface a style brought in, joining scripts shaped; the web Studio fetches the 4 MB CJK font only when a show needs it.
- A line in a script with no capitals (Japanese, Chinese, Hindi, Arabic) is no longer read as shouted.
- New show and Show settings choose the show's language (
- The timeline works as an editor expects (product audit 2, findings 11 and 12).
- Copy, cut, paste and duplicate (Ctrl+C, Ctrl+X, Ctrl+V, Ctrl+D) shots, lines, sounds, music and anyone's business. A paste lands at the playhead, as far apart as the blocks were, in this episode or another. A pasted line goes into the screenplay too, and a pasted shot takes over the time it covers.
- In and Out (I, O) on the ruler. Lift (;) takes out what starts between them and keeps the time. Extract (') takes the time out too, so what follows plays sooner. A line taken out goes from the screenplay as well. Ctrl+Shift+Space plays from In to Out, and Alt+X clears them.
- The playhead's timecode sits under the picture. Type one (16:02, 1602, +12, -1:00) and press Enter to go there.
- J and L play backward and forward, faster with each press (1×, 2×, 4×, 8×), and K stops. The sound plays along at up to twice its speed. Up and Down step from cut to cut.
- Every line, sound, foley step and play of music shows its waveform, drawn from the audio itself. The service measures each sound once and keeps it by its hash.
- Level meters under the picture while it plays, as the review player has them.
- Each sound row has its own M and S. The mixer (the sliders over the track names) has a strip for dialogue, effects, foley, music and room tone: a meter, a fader for the track's level, and mute and solo. It folds away and resizes like the other side panels.
- Any sound fades in and out, not just music: drag the handles at its top corners. Fades on lines, sounds and foley are new.
- The mix and the fades are edits like any other, so Ctrl+Z undoes them and everyone sharing the show sees them. They are what Studio plays and what renders, and the compiler says when a track is muted or soloed.
- Versions: EpisodeIR 1.55 (
mix, andfadeInSec/fadeOutSecon lines, sounds and foley sounds,fadeOutSecon a music start), Timeline 1.32 (audio.tracks), the session'swaveforms.get, andedit_episodeset_mix,paste,lift,extractandset_fadewithinSecandoutSec. tools/timeline-pro-watch.shandtools/web/timeline-pro-check.tsprove each of these in the installed Studio and in a browser.
Changed2 changes
- A zoom runs evenly: between two camera keys the lens changes in equal steps of
magnification (halfway from 25 to 100 mm is 50, not 62.5), where it went in equal steps of
millimetres and rushed at its wide end.
set_camerawith a move, or holding still, takes the place of a framed shot's camera keys. - The local TTS tool (
tools/tts-kokoro) is 0.2.0, so a show's generated takes are made once more on its next voicing; an English line sounds byte for byte as before. Recorded and pinned takes are untouched.
Fixed21 changes
- Recipe sounds are the same bytes on every machine, so the installed app compiles a show to
the same Timeline as a checkout does. Room tone and every
*.sound.jsonwere synthesized by ffmpeg, and a release carries its own ffmpeg build, so they came out a little different there. The core now makes them itself (synth 2.0), with no ffmpeg and about ten times faster (the 53 foley sounds in 1.5 s, not 17), as 48 kHz 24-bit WAV in.reelwright/cache/sfx/(they were FLAC), made once more on a show's next compile. Tones are as they were. Noise is drawn from its seed by PCG32, as the samplers draw, so a noisy sound is another take of itself: the same colour, band and peak, and a level as far from the old one as another seed's (median 0.7 dB over the 78 recipes with noise). - The Linux release's ffmpeg has everything the core runs it with. It was built without afftfilt, tremolo and vibrato, so the voice effects robot, buzz, chirp and growl failed (hollow worked only because the old synth asked for its echo and lowpass); without premultiply, so a render with straight alpha failed to encode its MP4 and its 422 HQ master; and without MPEG-TS and the concat demuxer, so a render farm's parts could be neither encoded nor joined.
- The director keeps the set from burying the person a shot is of (#36: a single shot from
behind a sofa arm, or through a crate wall). It ranks an angle where a piece of the set
hides half of the subject's upper body, the camera stands inside a piece, or the set covers
more than a third of the picture in front of them after the clear ones; when no standard
angle is clear it tries ±45°, one size in, from above and a long shot, and the eyeline
passes turn to a clear angle first. Sight reads pieces and standing props by their own parts
(round as round, lathes by their profile), so a telescope's box no longer hides anyone. A
shot still buried says so:
grammar.subject_buried("sofa hides char.octavius below the face in shot sh030"). Over the fixture scripts and the demo show, buried shots went from 8 to 2 and singles with someone's head across the middle from 9 to 4. - A renderer asked for by name is the one that draws. With
REELWRIGHT_RENDERER=lavapipeorgpu, the core,tools/lib/render-env.shand the web checks that start Studio on the GPU passGODOT_GPU=1. Agodotwrapper that forces OpenGL Compatibility on llvmpipe (a dev box's, to keep automated runs off the GPU) then runs them as asked; before, they got Compatibility without a word. Compatibility's frames change with what ran before, so the goldens and the engine's pixel checks failed as if under load. The engine CLI says on stderr what it draws with ("reelwright engine: drawing with forward_plus on vulkan (…)"). It exits 6 (engine.wrong_renderer) when that is not the renderer named.tools/engine-test.shasks first and stops before the suites on anything but Forward+. - Someone who sits on a sofa ("Octavius sits on the sofa") sits facing the way its seat does. The heuristic director turned them toward the sofa's middle, sideways in the seat.
- Sun rays stand in the kelp forest, among its rocks and kelp, and the sand under the reef's and the kelp forest's water has its sea grass and starfish again. A piece that is only light (every material a haze or a shaft: sun rays, a beam, a water surface) took floor room as a rock does: build_set kept the rays out of the groves, and the water's surface over the whole floor left the sand no room to dress. Light now takes no room: build_set stands it among what does, people walk through it, cameras see and stand in it, and nothing is set down on it.
- Direct never hands back a cut its own compiler refuses (second product audit #1: a single of the cat across the girl and her grandfather's line emptied the whole timeline). A shot that breaks film grammar is mended, or a safe shot plays in its place, and Direct says which in words: framed with the pair from their side of the line, the scene's wide, the shot before playing on, the camera held still or level, the style's transition. A walk to a spot nobody can reach is left out, said, instead of leaving the episode undirected, and a dropped reaction no longer leaves a gesture timed from nothing. A scene the model director cannot get clean falls back to this cut.
- The timeline shows what compiles, never an empty cut. A shot that breaks film grammar stays in the cut, outlined in red, and a list over the tracks says what is wrong in words, with "Show it" and its mends as buttons ("Frame Mochi with Grandpa Huo and Mei, from this side of the line", "Cut to the wide instead", "Keep it (a deliberate cross)"). A scene that does not compile at all is left out, and says why. Each shot can be mended in turn: an edit is refused only for a problem the episode did not have.
- The script's reading takes who someone is from how the script introduces them (second product audit #4: "MEI, 11, sneakers on the counter, folds a red paper lantern." became a lantern). An age, clothes or a person's role make a person; a creature only when the introduction says so ("MOCHI, a fat orange cat,") or the cue is one. Each new name's buttons say the kind before they make it, likeliest first, and always offer a person and a prop (a talking prop for a speaker), and a place for a name the action introduces.
- Scene headings read as screenwriters mean them (second product audit #8). The place is the
location part; MOVING, CONTINUOUS, LATER, SAME, INTERCUT, PRESENT DAY, a year and
(FLASHBACK - 1985) are time or kind, wherever they stand, and DAY/NIGHT is a time of day.
"INT. DELIVERY VAN - MOVING - NIGHT" plays in the Delivery Van, not a new place; CONTINUOUS,
LATER and SAME go on at the time of day before. A flashback, a flash forward or a dream
stays in the cut on its set, marked as one: EpisodeIR 1.54
Scene.timeShift, "a flashback to 1985" in the reading, "sc05 · Flashback 1985" on the timeline's ruler. - A playhead moved while the episode gets ready to play stays where it was put. In a browser, where that takes a while, a timecode typed meanwhile was undone and In was marked at 0.
- A refused edit says why once, not twice. A lift or an extract that would leave a cut or a marker with nothing near it now names it and says to mark In later or Out sooner.
- Reelwright holds up on a busy machine, fixed where it went wrong rather than by waiting
longer:
- A tool that finished is not said to have timed out. A time limit's timer runs only once the process is free, so a busy daemon could find it due after Rhubarb, ffmpeg, Godot or Claude Code had already answered, and the compile failed ("rhubarb did not finish in 30 s") or chat was left out. Now only a tool the limit stopped timed out.
- Rhubarb is asked its version once, not once a compile: the answer is kept beside the lip sync cache, and asked again only when the binary is replaced.
- While Godot imports the engine before a render or a preview, the daemon goes on answering Studio, and renders that start meanwhile wait for that one import instead of each starting their own.
- Switching shows: a render, voicing or chat turn that finishes in a show left before Studio has read that show's episode names waits for them, and is said by its episode's name ("Render of “The Lighthouse” finished") rather than its id.
- The library drawer draws the pictures of what it shows now first. The pieces words find were drawn after every piece on the shelf, one a frame: on a busy machine a search's pictures came minutes late.
tools/switch-watch.shwaits for the render it starts in a show left as long as that render still draws its frames, not a fixed 15 minutes, which a loaded machine went past with frames still coming. A watch's wait can say what keeps it going (RwWait.until'salive).- The core's tests take the CPUs that are free when they start (the CPUs less the last minute's load, at least two), not all but one: test runs side by side drove a 24-core machine to a load of 140. The run's first line says how many it took.
- Test runs and gates no longer leave folders in the system's temp folder. A core test run, each
test file in it,
tools/check-all.sh,tools/engine-test.sh,tools/engine-check.shand the web checks make theirs in one of their own,rw-run-<pid>-…, removed when they end, failed or stopped; one a killed run left is removed by the next run to start. Vitest's own copies of the modules it hands its workers, which it never removes, go there too. Left for the OS, 181,935 of them filled a disk and a gate failed for want of space.--goldenskeeps its frames and diffs inout/check-goldens. - A file of the show that cannot be read is said, never dropped (second audit #2). A lead's file cut short made him vanish from Cast without a word, and Studio offered to make a new "OTTO", a sound OTTO and a prop otto. Now Cast and the Show page show it as a red row: which file, what is wrong with it ("it stops part way through, at line 41"), and Restore from the newest version that has a copy that reads. Nothing offers to make it again, and nothing new is written over it. An episode it stops says which file. A cut-short show.json is a broken show, not "no show yet". Every kind of document is covered.
- Restoring a version mends a broken file. The broken file itself used to refuse the restore ("the show would not validate with this change: … unexpected end of file").
- After its first save Studio heard a file change again (second audit #3). On Linux the daemon watched each file, and a save replaces the file, so it stopped hearing that file after the first save, and one person's later edits never reached another's script editor. It now watches folders.
- Two people moving one cut by half a second no longer move it a whole second. A move by an amount made from a timeline that no longer shows the scene is refused, naming who changed it, and the timeline shows their version. A move to a place is simply the last one.
- The web edition says when its network drops (second audit #14). It used to say "Connected" while every view said "Loading…". Studio now asks the service every few seconds when it has heard nothing, and listens for the browser going offline. It says "Offline, reconnecting…", comes back by itself, and every view reads again.
- An unsaved draft over a script that changed on disk says so (second audit #21), with Revert (your text put aside, "Bring mine back" to undo it) and Keep mine (Save merges them). A stale starter used to hide the real script, with Save the only way on.
- Every press of Ctrl+Z counts once (second audit #22). Presses made while one was being answered were dropped, and a press made before an edit was heard undid the change before it. They now queue, and the banner counts them down when several wait.
0.5.0
33 changes: 23 added, 4 changed, 6 fixed.
A week of the October audit's findings, in both editions. People change clothes; a look uses typefaces of its own; light carries a mood and fades on cue; anything is added on the timeline at the playhead; the season sits on a board and the writers' room drafts a script from its outline with no model; singing uses a singing synthesizer (the WORLD vocoder) in each character's own voice; the storyboard is shot cards that go out as a PDF; and a shot has its own lens, height, headroom and lead room. For editors: render at another frame rate, footage playing on a set's screen frame for frame, straight alpha over a see-through stage, and a FrameExport document for frames and stems.
Added23 changes
- Outfits (product audit #18: one costume for the whole show). A character keeps other
clothes beside their own: Cast › Wardrobe's Outfit row shows their own clothes or an outfit,
New outfit copies the clothes shown, and each is renamed, edited layer by layer with its
try-on strip, or removed. On the timeline, A then O (or a right-click on someone's lane,
Change of clothes) changes them into one at the playhead, and the inspector's Wears picks
another. Clothes carry from scene to scene until changed, and a scene can dress people as it
opens. The director, with or without a model, reads a change in the script ("puts on her
raincoat", "takes off the disguise", "changes back") as one. CharacterInstance 1.4 adds
outfits; EpisodeIR 1.47 a scene'swardrobeand theoutfitcue; Timeline 1.24 each actor'soutfitkeys;edit_episodeset_outfit. - Lighting that carries a mood (
docs/design/lighting-mood.md, finding 13 of the October audit). A lighting cue fades:durationSec,easingandlevel(1 as the preset is, 0.3 dimmed, 0 out), episode 1.48, compiled into fadinglightingChanges(Timeline 1.25) that the engine mixes frame by frame, old practicals fading out as the new ones fade in. A preset can have haze (light hanging in the air, glows round its practicals), shafts of light (through a window along the key, landing on the floor beyond, or down from a lamp), a gobo cut into the key (blinds, bars, window panes, leaves, a lattice, dapple or a picture, everywhere or in one patch), gels on the key and the practicals, and practicals that cast shadows. Asky_gradient.v1backdrop is a sky that follows the preset's hour (dawn, noon, dusk, night with the moon and stars) and weather (hazy, overcast, storm, fog, snow), tinted. Looks bring haze, gobo, sky, gels and shafts. A browser draws the first few shafts, glows and shadows (set.light_budget).node tools/lighting-stills.tsrenders each mood and the demo's bridge dimming and going to red alert. - Studio's lighting editor edits a mood live (
docs/design/lighting-mood.md, "In Studio"). Its sections set gels on the key and each lamp, which lamps cast shadows, haze, a gobo (everywhere, or in one patch under the piece selected), shafts of light from the window or lamp selected, and an exterior's sky (Add a sky, its weather, tint, cloud and stars). Each shows in the view before the daemon answers and is undone with Ctrl+Z. Try the fade plays a fade to another preset in the view and changes no file. The editor says when a browser draws fewer shafts, glows or shadows than asked for.tools/lighting-watch.shandnode tools/web/lighting-check.tsprove it on the desktop and on the web. - Lighting changes that fade and dim, authored without a model (finding 13 of the October
audit).
edit_episodeset_lightingtakes a cue'sdurationSec,easingandlevel(a level alone dims the preset lit then), andset_timing'sdurationSecsets a change's fade. On Studio's timeline, in the installed Studio and the browser alike, a lighting change is as long as its fade and its end drags it; the inspector sets its Lights, Fade, Easing and Level and what the scene opens lit with; "Add a lighting change" adds one after any block and selects it. The Set lane says "the lights fade to amber over 2 s", "the lights dim to 30%", "the lights go out". The heuristic director reads "The lights slowly dim", "The lights fade out", "The room goes dark", "The lights come back up slowly", "Night falls", "Dawn breaks" and "Moonlight through the blinds" as fades to the right preset and level, and says which library look to add when the set has none; a model director is told the same. - The library's looks and places carry these moods (
docs/design/lighting-mood.md, "In the library"). The forest, the beach, the city street and the alley have a sky that follows each preset's hour and weather (the forest's ground and the beach give their painted sky card way to it); the office's noir night has blinds, haze and a shaft through each window; the jazz club is smoky; the theatre's spotlights throw beams along their aim; the castle's daylight comes through its windows; the forest's day is dappled by leaves. New looks: Moonlight through the blinds, Misty morning and Storm. The reef's sun rays are a real shaft of light, placed in the coral reef. - A season (the product audit's #15), in the installed Studio and in a browser. show.json's
seasonkeeps the episodes in their running order, ideas not written yet among them; each episode's number is its place, and how far it has got (idea, outline, script, directed, voiced, rendered, delivered) is read from its files. Episodes opens on the season board: a card per episode with its number, its status and the bible's arcs and threads it moves, each in its own colour. Drag a card to reorder the season (Alt+Left and Alt+Right move the one focused), Add an idea… for an episode not written yet; each is your own change, undone with Ctrl+Z. The list below and the Show page follow the order. New toolsorder_episodesandadd_episode_idea;episodes.statussays each episode'snumber,status,arcsandthreads, and the season's number. - The writers' room without a model (the product audit's #14). An idea's or an outline's
Outline opens it on cards: the title, logline and premise, the beats with their kind, what
they serve in the bible and an act break after them (EpisodeOutline 1.1's
actBreak), the scenes on the show's sets with their cast, the beats they land and a summary. Save is your own change. "Write the script" no longer throws the outline away: it drafts the script from it, each scene's heading, its summary, who is in it and its beats as action, act breaks as sections, ready to write into (screenplays.draft;draft_screenplayfor the showrunner and MCP). - A show's look can use typefaces of its own (product audit #19: five bundled Latin families
and no font import). The style lab's Typography part has "Bring in a typeface…": a TrueType,
OpenType or WOFF file and the license it comes in under (OFL, Apache, or one you hold),
kept in the show's assets with that license and offered for the titles, the text and the
signs beside the bundled families. StyleSpec 1.1 adds
typography.fonts; the session'sstyles.fontbrings one in; titles, credits and in-world signs draw in it, in renders, in the browser and on runners. - A framed shot's lens, camera height, headroom and lead room are set in the shot inspector
(product audit #12: no lens control in Studio, and headroom and lead room accepted but
ignored). The framing solver now honours
headroom(the air over the tallest head, held through a tilted camera) andleadRoom(the room ahead of where a single looks, or short-sided on purpose);set_cameratakeslensMm,height,headroomandleadRoom, "auto" handing each back. - Five more places build from words with no model (
docs/design/world-kits.md): a hospital corridor, a beach, a home kitchen, a classroom and a back alley, each with marks, setups and three lighting presets, from new hospital, beach, home and school kits and new street pieces. - Adding on the timeline, in the installed Studio and in a browser: a sound, music, an effect,
a gesture, a face, a look, a posture, a lighting change, a camera move, a shot, a title card
or credits, and a line of dialogue, at the playhead. Press A and a letter (S sound, M music,
F effect, G gesture, E expression, L look, P posture, I lighting, C camera move, N shot, D
line, T title card), right-click a track or someone's lane for what it can hold, or use the
"+" in the tracks' corner. Each is your own change (Ctrl+Z takes it back), timed with the
line or business under the playhead, and opens in the inspector at once to adjust. A camera
move starts at the playhead; a line goes into the screenplay too, after the line before it,
and plays silent until it is voiced. The title card and the credits are blocks on the Shots
track, with their length and the credits' lines in the inspector. The library (the box in the
corner) lists the show's sounds, music, effects, props and the cast's gestures, to filter by
typing and drag onto a track or a lane where it should start, or Enter to add at the
playhead; the inspector picks a sound, a track or an effect from it, and where an effect
plays. New:
edit_episodeadd_line, and the session'slibrary.list. - In previs: the one selected has a facing knob to drag round to whoever or whatever they should face; in a free view the shot's camera drags round what it frames; walls are cut away where they stand between a free camera and the room, or down, or up (C), and always up through the shot; a prop from the Shelf dropped on a piece of the set or a mark stands there from the scene's start; and piloting the shot's camera carries on into the next shot, pose and lens kept, for "Use this view" to give that one.
- Sung lines are sung through the WORLD vocoder (tools/sing-world: numpy and pyworld under
uv, about 1 MB): the character's own Kokoro reading, analysed and made again at a singer's pitch (Saitou et al. 2007: each note change overshot and settled, the note before dipping away first, a 5.5 Hz vibrato with its loudness swing, a fine flutter), its vowels held for their notes with a singer's formant near 3 kHz. On the real voice each note lands within 5 cents (TD-PSOLA's within 9); its harmonics run continuously through a held vowel, HNR is 22.7 dB against 21.9, and the singer's formant band 8 dB stronger (node tools/sing-check.ts). Where uv cannot run it, sung lines fall back to TD-PSOLA, saying why, under keys of their own. The design doc compares every local singing voice we could find (DiffSinger, NNSVS, UTAU, RVC, Seed-VC, SoulX-Singer and more) by quality, licence, size and speed: none in English can be shipped yet. - Lyrics laid on a vocal.
edit_episodelay_lyricsgives a scene's sung lines, in order, the stretches of an imported vocal or song where they are sung: its phrases (singing between breaths) are found, joined so each line's share of the singing is nearest its share of the syllables, or parted at their quietest moment when there are too few, between in and out points; withinMusiceach line is timed in the song playing. It becomes aset_sungfor each line, so it is reviewed and undone like them. In Studio, Music and room tone… has "Lay the sung lines on it" for the chosen track, and "It is the music playing". - A set has a room tone of its own in the set explorer: with nothing selected, Room tone (none,
Reelwright's own, or any of the show's sounds) and its level, written as the set's
ambiencethroughrevise_set, whose description now names it. - Directing an episode again keeps its sung lines' settings: a lyric that still sings the same words keeps its melody or its vocal (the heuristic and the model director alike), where it went back to a tune of its own.
- The storyboard is a working view, the same in the installed Studio and in a browser (the
October product audit's finding 25): an episode's Storyboard in Episodes
(
#/<show>/storyboard/<episode>) shows a card for every shot of the cut, under its scene's heading, with the shot's still, "sc01 · sh020 · MCU", the lines spoken in it and what happens in it. A card opens the timeline with the playhead on that shot. Save as PDF gives the storyboard as a document to hand round, six panels a page with their pictures and words (storyboards.export; a save dialog on the desktop, a download in a browser). New in the session protocol:storyboards.exportand the preview kindpanels(one image per shot, for a view to lay out). - Cast shows each character's face in their row (finding 28): a bust drawn as the character studio draws it, kept by what it was drawn from, so the list shows it at once from then on and draws it again only when the character or the look changes.
- Render at a rate asked for:
--fpsoncompile,render(and its--deliver),stillsandexport otioresolves an episode at any rate show.json offers (25, 29.97 or 30000/1001). Its cues keep their times in seconds, to within a frame, with its lines whole, their mouths moving with the sound, and its frames drawn apart from the show's own rate's. A 24 fps show made at 25 is the same length, not 4% shorter. - Footage on screens.
reelwright asset import-clip <dir> --show <dir> --license <spdx>(andimport_clip) brings in a clip Cutwright cut:clip.json(CutwrightClip 1.0) checked, every frame and the sound checked against its hash, and frozen intoassets/as they came, each sidecar naming Cutwright's version and the clip's own provenance. The clip (clips/<slug>.clip.json) is proposed. A screen cue (EpisodeIR 1.49,edit_episodeset_screen) plays it on a set element: the element's screen shows clip frame n − start on frame n (Timeline 1.26screens), letterboxed and glowing, on its graphic or on a screen made for it, with the clip's sound from the element. The RenderResult (1.1) says which clip frame each screen showed and where its corners fell, and the core checks that against the Timeline before encoding. A clip cut for another rate is said to play slow, with the rate to render at. - Renders with straight alpha (Cutwright's R2):
reelwright render --alphaandstills --alphadraw RGBA frames, transparent where nothing is drawn, with each soft edge's color at full strength and its coverage in alpha, as a PNG holds it. Before, the engine's readback was premultiplied and the post pass premultiplied again, so soft edges came out up to twice as dark, then darker. The post pass now keeps premultiplied color, grades the straight color under it and fades alpha instead of going to black; transparent shot views draw in linear light, since Godot converts a transparent 3D picture to sRGB without dividing its alpha out; the frame server divides alpha out once, as its last pass; and sparks and glows say their light in alpha. A ProRes 4444 master keeps the alpha (yuva444p10le), EXR frames keep it premultiplied, and the MP4 and a 422 HQ master, which have no alpha plane, lay the picture over black. render.json says"alpha": true. A new golden, a see-through stage drawn with alpha, is compared in CI with every channel at tolerance 0 (tools/render-alpha-golden.sh). - A see-through stage (Cutwright's R3, SetInstance 1.3): a set's
stage.seeThroughdraws none of its walls or floors (structure elements keep their place and draw nothing), no interior shell and no backdrop, and clears to transparent, so a character stands over footage with the set's furniture and dressing. Its blob shadows draw unlessseeThrough.shadowsis false.revise_setmakes one and raises the set's version, as it now does for a room tone (1.1) and an image backdrop (1.2); a see-through set that says less than 1.3 isset.version. - A frame export with a schema (Cutwright's R1, FrameExport 1.0,
schemas/v1/frame-export.schema.json): a render that delivers png_frames writes<out>/frame-export.jsonbeside them, with the release, the engine and adapter that drew them, the Timeline's id and inputsHash, the range, size and alpha, every frame's file and SHA-256, and, with stems_wav, the stems trimmed to the range and the mix's gain applied to them. Asked only for frames and stems (render --deliver png_frames,stems_wav), a render makes no H.264; render.json then has novideo, and Studio does not list it as a render.
Changed4 changes
- What a 3D view says at its foot (a refusal, what a drag would do) sits on a card in the set explorer and previs: a refusal in red was lost over a bright frame.
- Renaming a character now reaches the script's action and parentheticals too ("Ibden looks up." becomes "Wren looks up.", an introduction in capitals in capitals), whole words only; what is spoken stays as recorded, so no take goes stale.
- A sound file brought in is named as the file it came in as ("Fog_Horn.wav" is "Fog Horn"), the name kept in the FLAC itself, and Rename… in Sounds renames a recorded sound there, its audio unchanged.
- The time-of-day dial's sun sets at 19:30, not 18:00, and the moon takes the set from about
20:00, as the library's dusk and sunset presets, the director's evening and the new sky have
it (
RwSkyModel.sun_elevation_deg). The golden hour look is 18:45.
Fixed6 changes
- People made from a script look like the script has them. Maya, "(30s, tired)" and "her", came out as the People pattern's veteran with a walrus moustache and a horseshoe of hair, only because she was the second newcomer, and her brother in a ponytail. The age the words give is kept ("30s", "a 60-year-old"), a newcomer is cast in a role their age fits, and the look fits their pronouns as a cartoon reads them (no moustache or bald pate on a she, no ponytail or bun on a he) unless the words give it.
- In a browser, a set no longer looks lit four times over where nothing stands: the Compatibility renderer's glow takes no threshold, so a style's bloom lifted the whole picture (a dark night sky behind a street came out bright violet). The browser has no glow now, and the air behind a set is the same color there as on the desktop.
build_setchooses a place by the words that are its own: a word a pattern's name or tags say is its, whatever another's description mentions ("Mom's kitchen" is the library's kitchen, not the blank room that mentions kitchens), and a word several names say chooses none of them ("a hospital corridor" is no longer the spaceship corridor).- The library's leftovers: stone and brick walls have staggered joints, the wreck's ribs are a hull's frames, and the office desk, the diner counter, feast and club tables and the warehouse bench no longer get the same thing twice side by side.
- A 3D character's gestures were missing from the timeline's gesture choice and the character studio's pose panel: their rig moves biped_toon.v1's skeleton, whose gestures they now offer.
- Another take of a line sung on an imported vocal is refused, saying why (
take.vocal): its take is that stretch of the recording, and asking listed the same take again as a new one. The booth's Another take is off for such a line, with the reason as its tip.
0.4.0
48 changes: 27 added, 3 changed, 18 fixed.
The installed Studio catches up with the web. A show's look is made in the style lab, from words, pictures or a blank. Characters can be any kind: animals, birds, insects, creatures, robots and talking objects. Sets are walked and edited in 3D, and the episode is blocked and shot from inside it. Music plays across cuts, lines can be sung, and voices follow the direction. Episodes deliver as ProRes, frames and stems. Every document is edited, renamed, copied or deleted by hand. Named versions and History make any change safe to try. Your own computers can do the rendering. A person without Claude is told what they can do themselves.
Added27 changes
Show settings › Look makes a look, not only picks one: "Design a new look…" starts a style of the show's own from a blank and opens the style lab, and "Edit this look in the style lab" opens the show's style there; the palette has "Design a new look…" too. Before, Show settings showed only the show's styles, two on the demo, as if those were the choice.
The credits' "Made with Reelwright" is the show's to turn off (product audit #19): show.json's optional
toolCredit, Show settings › Format › Credits, andshow.update'stoolCredit. Off, the credits are the show's own, for delivery to a broadcaster or a streamer.Pictures and takes go in and out of Studio by hand (product audit #26). Every preview's viewer has Save (Ctrl+S): the picture as it was made, downloaded in a browser, where the person chooses on the desktop. The booth has Import a take: a recording made elsewhere (a voice actor's 24-bit WAV, a FLAC, an MP3 or an Ogg) becomes the line's take, made the booth's 16-bit mono 48 kHz WAV by the core first.
Birds and insects, carrying in a mouth, and creature voices (M16 phase 2,
docs/design/m16-any-character.md). CharacterInstance 1.2 adds two kinds: a bird (two legs, two wings that fold along its sides, a beak and a fan of tail feathers) that flies where it goes, taking off, crossing in the air and landing (a hen or a penguin walks), perches, pecks and gestures with its wings; and an insect (a beetle, an ant, or a spider on eight legs) that scuttles on two sets of legs by turns, three feet down at a time. Each has its own rig template and gesture library standing in for every gesture a person has (a parrot's wave is its wing's), starter patterns (Birds, Insects and spiders), New character buttons and cast icons, and its eye held to the core's metrics in every posture.create_characterreads a parrot, a crow, a hen, a beetle, an ant or a spider from words. A body with no hands but a mouth (a dog, a cat, a parrot, a snake, a beetle) picks up, carries, puts down and hands over what fits in its mouth, dipping its head to the floor for it (Timeline 1.23's handmouth); what is too big for it is said (director.too_big). A voice binding'seffect(robot, hollow, buzz, chirp, growl) puts every take through it after it is voiced and read, keeping its length and its words' timings; creatures made from words or drawn from a pattern sound like their kind (a pitch, a timbre and an effect by kind and size), and a plain voice keys and sounds exactly as before. A character whose pronouns are "it" is "it" in the action ("It rolls over to the galley"); a look at someone still on their way follows them to where they stop; eyes on stalks are framed where the stalks hold them; a small creature coming in through a door is followed as it walks on; a snake's raised neck curves; each kind has its own cast icon.Characters of any kind, not only people (M16 phase 1,
docs/design/m16-any-character.md): a four-legged animal, a snake, slug or worm, a blob or ghost, a robot on wheels, treads, a hover pad or legs, or a talking object (a kettle, a teapot, a lamp, a toaster, a crate, a book). CharacterInstance 1.1 gives a character a body plan (plan) and the face features creatures need (one or three eyes, eyes on stalks, a snout, a beak, a speaker grille, no mouth); people stay 1.0, byte for byte. Each plan has its own rig template, gait, postures and gesture library, whose gestures stand in for every gesture a person has (a cat waves with a paw, an armless robot beeps), lip sync on every mouth, and metrics the compiler and the engine share (testdata/plans.json). Each kind crosses at its own pace. New toolcreate_charactermakes one from words ("a grumpy three-eyed space slug who runs the cargo bay") with no model, reading its kind, shape, features, size, colors, persona and voice from them, and takes a kind, a plan, a name or edits that win over what it read;optionsproposes a few to pick from. New shows get a starter pattern per kind beside People, andvaryvaries a creature by its kind's pattern. The heuristic director reads creature verbs (rolls, trundles, hovers, oozes, pads, prowls…) and postures (curls up, coils, powers down), names a creature by what it is ("the robot") when it is the only one, and says when a body with nothing to hold with is given prop business (director.no_hands) instead of staging it. In Studio, both editions, New character opens on "describe it in your words" and offers each kind, from the show's pattern for it or from words; the cast list says what each is, and the character studio turns, poses and varies any of them.tools/crew-watch.shproves it live.Music carries across cuts, with in and out points, and dips under dialogue (the product audit's finding 5,
docs/design/sound-and-delivery.md). A music start thatcontinuesplays on across every scene cut, as one clip with no seam, until a stop for its track in any scene, its out point or the episode's end (credits too, fading over its last second);inSecandoutSecchoose the stretch of the track it plays, and a loop goes round between them. It dips under spoken lines as a sidechain from the dialogue would duck it, but from the plan, so it is down 0.15 s before the first word and back up 0.6 s after the last (duckDb, default -10 dB, 0 never; sung lines never duck it), andduckandswellcues, which were ignored, now move its level over theirfadeSec. Each scene has room tone under it when its set or the scene says (ambience): a sound of the show's or Reelwright's ownsfx.room_tone(a quiet room at about -50 dBFS), from the scene's first sample to its last, looped with crossfades, unbroken across a cut into a scene with the same one, in the effects stem. Levels are gain envelopes on the Timeline's clips (Timeline 1.21), multiplied in to the sample, so the stems still sum to the mix. In Studio, Music and room tone… (the timeline inspector's, with nothing selected or on a music block, and the command palette's) imports a WAV, FLAC, Ogg or MP3 file into the show's music (the browser's own picker on the web), starts a track at the playhead, playing on across cuts from its in point to its out point, and sets the scene's room tone (its set's, none, or a sound of the show's); the music inspector sets a track's in and out points, whether it plays on across cuts and loops, and its dip. The edits areedit_episodeset_music(continues,inSec,outSec,duckDb,duck,swell) andset_ambience(EpisodeIR 1.44).The voice follows the direction (finding 6). A line's emotion and intensity, volume, parenthetical and note to the actor ("angrily", "slowly", "flat", "questioning", "trembling", "sarcastic";
stress 'never';pause after 'wait') and its new pitch, stressed words and pauses reach the voice: Kokoro is asked for the speed, and the rest is done to its take by prosody (core/src/audio/prosody.ts: YIN pitch tracking and pitch-synchronous overlap-add), which moves the pitch and its range, raises and lengthens a stressed word, holds a pause, bends the end up or down and trembles, keeping who is speaking. A line read as it always was keeps its take. Another take (takes.another, the booth's and the line inspector's Another take) reads a line again a little differently (pitch, range, pace and a lean toward a sibling voice, the same each time for the same take number), listed in the booth to hear and choose; choosing one sets the line'sdelivery.variant. The line inspector has Pitch, Stress (the line's words to tick), Holds (a pause inside the line) and says which fields move the voice. The character studio has a Voice panel: every voice by name, accent and gender, with speed, pitch and timbre (formants moved: bigger and darker, or smaller and brighter, at the same pitch, a binding'sformant), an Audition that plays the character's own first line as set, and Use this voice. Kokoro takes blends of its voices (af_bella:0.7,af_sky:0.3). New in the protocol:takes.another,voices.list,voices.audition;edit_episodeset_deliverytakespitchSemitones,emphasis,pausesandvariant(EpisodeIR 1.46).Sung lines (EpisodeIR 1.45). A
~lyric is sung, not spoken: to a tune of its own made from the line around where the voice speaks, to a melody (sung.melody: a note a syllable,A3 C4 E4:2 rest:0.5, at a tempo), or on an imported vocal (sung.vocal: a stretch of it is the line's take, its words timed to the vocal's notes and lip-synced to it by Rhubarb;inMusicwhen the vocal is in the music already playing, so it is not mixed twice). A melody is sung by holding each syllable's vowel for its note at its pitch, with a glide into it and a vibrato on long ones. It is speech made to sing, not a singer: the doc says how it sounds. The line inspector chooses spoken, a tune of its own, a melody (and its tempo) or a vocal (and its stretch); the edit isset_sung.Delivery to a platform's spec (findings 10 and 11). Shows can be 9:16, 1:1, 4:3 or 2.39:1 as well as 16:9 (Settings › Renders and voices has Aspect ratio, with sizes for each) and 23.976, 29.97 or 59.94 fps, timed exactly (24000/1001: a 23.976 frame is 2002 samples at 48 kHz). A full render delivers what the show asks for (Settings: "Full renders also deliver"), or what Export… asks for once: a ProRes 422 HQ (or 4444) master in QuickTime with 24-bit PCM sound, PNG frames, OpenEXR frames (linear, half float), stems as 24-bit WAV at the mix's level (dialogue, music, effects), SRT captions and an OpenTimelineIO edit; each is listed under the render with its size.
reelwright render --deliver master_prores_422hq,stems_wav,…;renders.starttakesdeliverables;format.deliverablestakesexr_frames.World kits: a show's sets are no longer limited to the starter room and park (
docs/design/world-kits.md, finding 4 of the October audit). Set pieces now come in kits: a new document kind, SetKit (kits/<name>.kit.json), holds a shelf of parametric pieces, and Reelwright ships a library of them that every show can build from. A piece says where it goes (place: on the floor, on a wall, from the ceiling, on the top of what is under it, or in clumps) and what words it answers to (tags). A recipe can draw a model brought in (ameshnode, from a frozenassets/<sha256>.rwmesh) and pictures (apicturenode, and a decal'simage), all in the style's cel shading. A lighting preset can have fog (the air things fade into), caustics (light rippling as through water above) and a practical's reach (rangeM), and a practical shines from its piece's light anchor (a lamp's bulb, not its foot);timeOfDaykeeps the lighting editor's hour. New tools:list_kits,add_piece(a piece stands in a set by its dressing rules, bringing its recipe, the palette colors it needs and a mark at each seat),save_piece(into the show's own kit),revise_kitandadd_lighting(a preset from a lighting look, or onto a preset the set has).build_setchooses from the show's patterns and the library's by a place's words, and with only a name or a description.Reelwright's library of set pieces (
engine/addons/reelwright/library/kits): thirteen kits of about two hundred parametric pieces that take any style (light fittings, a 1940s jazz club, a 1950s diner, an office, architecture, nature, a reef, a starship, an industrial floor, a city street, a castle, a theatre stage and a moon base), and twenty lighting looks (times of day, interiors, noir, neon, firelight, the stage, horror, a dream, under water, the deep sea, space, a smoky club). Twelve library set patterns (library/sets) build whole places from them with no model: a jazz club, a kelp forest, a spaceship corridor, a diner, an office, a city street, a forest, a castle's great hall, a coral reef, a warehouse, a theatre stage and the moon's surface, each with its marks, camera setups and two or three lighting presets, chosen bybuild_setfrom a place's words ("a 1940s jazz club", "Kelp Forest", "the starship's corridor").In Studio, the same in the installed edition and in a browser: the set explorer's Add a piece opens a library drawer of every piece the show can use, each with a picture drawn in the show's style, searchable by words and by shelf. A piece dragged into the view stands where it is dropped, by its dressing rules, and is selected for the gizmos. Bring in brings a model or a picture of your own in as a piece. New piece opens the piece maker, which also opens a show's kit from Sets › Kits. It makes a piece from the recipe primitives (boxes, cylinders and cones, rings, panels with openings, extruded shapes, turned outlines, decals, rows of copies), with params, materials from the palette, seats and standing places, and set dressing rules. A piece starts blank, from a template or as a copy of a library piece, is drawn live as it changes, and is saved to the show's kit. The toolbar's Lighting opens a lighting editor: start from a look, turn the hour of the day, set the key, fill, ambient and rim, the fog and the caustics, and what glows ("Light the lamps", "Light the neon"). Every change is the person's own and undone with Ctrl+Z.
Models and pictures come in as pieces of the show's own kit.
import_modelreads a GLB, glTF or OBJ (with its buffers,.mtland textures beside it): through its node transforms, in meters (a 180-unit chair is read as centimeters) or scaled to a height, set on the floor, welded with normals split at creases, a part per material. Each part becomes a material slot whose color is pulled to the show's palette when the style snaps, its finish from the material, so the style's shading and ink draw it like any piece. QA refuses a model with no triangles, over 60 000, under 1 cm or over 60 m (naming the units to try), Draco or meshopt compressed, or with no license, and stores nothing.import_artmakes a PNG or JPEG a standing cut-out card (its see-through pixels kept), a decal hung on a wall, a painted flat, or, for a 2:1 panorama, a set's 360° backdrop. Both take a path or Studio's upload, andreelwright asset importtakes a model, or a picture with--as card|decal|backdrop.Every document of a show is yours to change by hand, the same in the installed Studio and in a browser (the October product audit's findings 2, 3 and 9). A document's Fields is now an editor of every field its schema allows, laid out from the schema itself (
docs.form): the theme's tone and audience, the bible's entries, patterns, props, effects, graphics, sound recipes, characters (their name, voice and persona too), sets, outlines and styles, each field with its widget (a number with its unit and range, a slider, a choice, a switch, a color or palette slot, words, a list, a pick of the show's documents), Add for lists and missing fields and Remove for items. Each edit is your own change through the document's revise tool, shown at once, in History and undone with Ctrl+Z; a locked field is shown, says why, and its lock unlocks it; viewers and reviewers look and change nothing. The set explorer's inspector shares the same form (RwFieldForm). Rename, Duplicate and Delete work on any document or sound, from its Fields (an editor's Fields tab too) or its row in the list: a rename takes every reference with it (other documents' ids, an episode's folder, scripts' character cues and scene headings, and a character's short name when it was only their name), and deleting something still in use asks first, listing exactly what uses it, and offers another of its kind to take its place. New makes a prop, an effect or a graphic from a template, a copy of any pattern, and bible entries of every kind (a place, a person, a relationship, a running gag, a story thread, an arc, a tone rule). A new Sounds section (Ctrl+9) lists the show's sound effects and music with what uses them, plays any of them, makes one from a recipe, brings in a WAV, Ogg, MP3 or FLAC, and renames, duplicates and deletes them. New tools for the showrunner and over MCP:find_uses,remove_document,rename_document,duplicate_document,import_sound,revise_fx,revise_graphic,revise_outlineandrevise_sound. New in the session protocol:docs.form,sounds.list,sounds.preview,sounds.import, andtakes.uploadpurpose: "sound"(up to 256 MiB). Change sets can carry files of bytes, so a sound is added, moved and taken back byte for byte.Named versions and restore points (the product audit's #20), in the installed Studio and in a browser. History (Ctrl+H) lists the show's versions newest first, each with a picture of the show then, who saved it and when. Save a version… keeps every document and script as they are now under a name ("Locked for table read") and a note. Choose one to compare it with the show now, or with any other version: the documents added, removed or changed, and a document field by field, a script line by line. Restore puts the whole show, or one document, back as a version has it, after a confirmation that lists what will change; it is one change of your own, so Ctrl+Z takes it back. Locks hold through a restore. Reelwright takes a restore point by itself before a restyle, an import, a change that removes a file or a bulk edit, and keeps the newest 20. In a shared show everyone sees who saved what; viewers and reviewers browse and compare, and the owner and editors save and restore. The showrunner, and Claude through MCP, can list and compare versions, and restore one as a proposal for you to approve (
list_versions,compare_versions,restore_version). New in the protocol:versions.list,versions.save,versions.diffandversion.event.Ctrl+Z outlasts a restart: the changes you made, and undid, are kept with the show's place (the newest 100, yours alone in a shared show), so Ctrl+Z after reopening Studio or the page undoes your last change. It goes past a change that can no longer be undone to the one before it.
A show's look is made, not picked: New show starts it and the style lab finishes it (#224, the core of M14 phase 5), the same in the installed Studio and in a browser. New show asks how the look starts: described in your words (the default), from pictures you choose, from a blank, or from one of Reelwright's styles as a starting point only. The show is made at once with a draft style of its own, and the style lab opens on it; from words or pictures the showrunner proposes four distinct directions from them and the logline (the show's model when one is connected, else Reelwright's own rules, at no cost), drawn side by side to pick one or blend some. World › a style opens the same lab, and World's New style makes one from scratch in a show already made. The lab draws the style live, with no render, on the show's own cast in one of its sets, or on stand-ins (three people in a corner with a screen showing the show's title) while it has none, and a divider wipes between the style as it was and as it is (
\for either alone). Every field of the style has its control, in parts: look (its name, the look in words, the pictures it is drawn from), line (weight, wobble, taper, ink color, ink on sets), palette (its colors, and the harmony and ranges every palette keeps), shading, texture and grain, typography, lighting (the grade and glow), proportions, backgrounds, motion, timing, camera and post. A slider shows its change while you drag and saves it when you let go, as your own change throughrevise_style, in History and undone with Ctrl+Z; the grade, paper, grain and post redraw without building anything. Palettes from a key color by a harmony rule, typeface pairings, lighting looks and starting again from a blank or a built-in style are tried on first and kept or taken off. Viewers and reviewers look and compare and change nothing. The address and the showrunner's page name the part (#/<show>/world/styles/<id>/palette), and the chat's suggestions fit it. Four more typefaces come with Reelwright for titles, signs and screens: Noto Sans, Noto Serif, Noto Serif Display and Noto Sans Mono. New tools for the showrunner:propose_styles(two to four directions as one group to pick from) andblend_styles. New in the session protocol:scenes.getkindstyle,styles.reference(a picture added to a style), and thestylescapability; a StyleSpec may list itsreferences.reelwright init --blanktakes--style-from words|pictures|blank|preset,--look "<words>"and--reference <file>.Reelwright Runner: your own machine does the heavy work while you use the web Studio from anywhere (M15,
docs/design/m15-runners.md). Runreelwright runner --service https://reelwright.diy/app --pair ABCD-EFGHon a machine of yours with a code from Studio's new Your computers (the palette, both editions); it keeps its own token (which opens nothing but the runner's protocol) and the service's signing key, connects outward only, and says what the machine can do: cores, memory, the GPU Godot draws with, Godot, ffmpeg, voices and Claude Code on a plan. Choose where your renders and voicing run: Reelwright, "my computer when it's on, else Reelwright", or "always my computer", for all your shows or one, and per request (renders.startandepisode.voicetakeon). A render sent to your computer runs there in parallel Godot jobs on its GPU; the show's files go down and the render's come back as content-addressed chunks, only what the other side lacks, resuming after a drop, and the render lands in the show on the service as if made there. Episodes says where it runs ("Drawing frames: 312 of 674 · on This box", or "· on Reelwright: This box is offline"), and so does every Studio in the show (others see whose computer). With your computer off, the work runs on the service, or waits for it with "always". A shared show's work goes to an editor's computer only when its owner allows it. Jobs are signed with the service's key, which the runner checks; it runs only a closed set of job kinds, writes only in its own folder and never through a link.reelwright runner --shows <folder>also offers the shows on that machine's disk: the web Studio lists them under "On" and opens them through the service, which relays the session to a daemon on that machine and passes its files on, a byte range at a time, keeping none. The installed Studio, signed in, has one switch for this: "Let this computer run my Reelwright work", which takes your web chat on your Claude plan too when that is on (one process, not a bridge beside it), with a credential for each show that lives only while it is connected; reelwright claude bridgeand the bridges of older Studios keep working. The console's new Runners page lists every runner, its machine, its jobs with their times and bytes, and Revoke, and each person's page lists theirs; Sign out everywhere revokes runners too. Settings › Runners turns runners off for the whole service at once (everyone's work then runs on the service, and Studio says so), and on again.Previews of a show on Reelwright are drawn on your own computer when your work runs there (M15 phase 4): model sheets, line-ups, set views, style swatches, stills, storyboards, prop and effect sheets, and the before-and-after sheets of a restyle. The show stays on Reelwright and decides what each preview is, its cache and the canon an approved model sheet becomes; your runner draws it, on its GPU, many at once. Previews asked together go to your computer as one batch, its copy of the show kept between them so only what changed moves, and what was drawn once is never asked for again. Each preview says where it was drawn under its picture ("· on Wil's box", or "· on Reelwright: Wil's box is offline"), and Your computers lists the batches. With your computer off, or gone mid-batch, Reelwright draws them, saying why; with "always", they wait for it. Runners take previews unless told otherwise (
--accept render,voice,preview), and the installed Studio's does.The model director and memory's model pass run on your Claude plan, through the Claude Code on your own computer, when its runner has Claude Code signed in with a plan and your Studio chat is on your plan (M15 phase 5). Claude Code is the client there, unmodified: it takes the director's tasks one at a time through two tools of this run alone (
plan_task,plan_submit) on the service's MCP endpoint, with the credential for that show its runner was given, and the director checks each answer, as it checks the model's, and proposes the episode (or memory's update) for you to approve. No token of the plan reaches Reelwright, no budget is spent, and the run is listed on your computer ("direct on the plan"). Without such a runner, your API key directs as before, or the heuristic director does, saying why.A render is spread over your own machines when several of yours are on (M15 phase 6): the one it is given leads, draws its share and sends each other chunk's engine job to another of your runners, which draws it and sends the frames back; the lead checks them, mixes and encodes the whole. The machine that draws the most at once leads; each GPU gets as many chunks as it draws at once (its
--chunks), and a machine drawing in software helps only another in software, since its one chunk would hold a GPU's render up; a machine that stops mid-render leaves its chunks to the lead. Episodes names every machine at work ("· on This box, with The second box"), and Your computers lists each part.A farm's parts come back encoded: each helper checks its frames and sends them as the chunk's H.264 segment (a few megabytes where 75 frames at 1280x720 were 97 MB of PNGs), the lead encodes its own chunks the same way, and the render is joined with the picture copied, so the encode is spread with the draw. A part still away once the lead has drawn its own, and overdue by its own pace, is drawn by the lead too, the first finished kept and the helper stopped. The service measures each runner's uplink from what it uploads and leaves out a helper that would send a frame back slower than its lead draws one; Your computers says how fast each sends ("sends 20.5 Mbit/s").
A farm's preview is encoded as a preview, by each helper and by its lead: it was a master (CRF 16) and so larger than the same preview drawn on one machine.
A set is edited in 3D: the set explorer's gizmos (M14 phase 3). Drag a mark, an entrance, a piece of the set, a camera or a walkway's point across the floor; turn it by its knob, raise a piece or a camera by its arrow, aim a camera by its look-at, and drag the key light's sun round the set. Moves land on a 5 cm grid and turns on 15° steps (Shift: 1°), and Ctrl held snaps nothing. G and R move and turn the selection with the pointer, X and Z hold a move to an axis, and a number typed is the move in meters or the turn in degrees, exactly; Enter or a click keeps it, Esc drops it. Looking through a setup with nothing selected, G and R move and turn that camera, the view with it. The arrows nudge 5 cm and , and . turn 15°; the wheel over a camera steps its lens through the common primes; a double-click on a walkway adds a point and Delete takes away what is selected. Shift- and Ctrl-click (and the outliner) choose several things, which move and turn together, and the showrunner hears each of them. "Save view as setup" makes a new camera setup where the view's camera stands, with its lens, and looks through it. A proposal touching the set (the showrunner's, or another person's) is drawn over it as a ghost, outlined where it would move things, with a banner to accept, reject or review it in place;
\shows the proposal in the set's place and back. The walls stand up, cut away where they stand between the camera and the room, or come down (C). Every edit is your own change throughrevise_set, shown at once, in History and undone with Ctrl+Z, and moving a thing builds only that thing again (a piece moved is placed, one resized is built anew), never the whole set. An edit made while someone else changed the same set is checked: where they only removed something before it, it goes once more where its thing went; where they changed the same field, it is refused and said so ("Ada changed Marigold - Bridge. Yours was not applied, so theirs stands."), never lost and never applied to the wrong thing. A locked thing shows a lock and refuses before anything is sent; viewers and reviewers look and get no handles. The explorer opens each set where you left it (the free camera, the setup looked through, what was selected, the walls), and keeps its panes' widths, in the installed Studio and in a browser. New in the protocol:Edit.was, what a field held as the editor saw it (refused withedit.stalewhen it holds something else; Studio's alone: the showrunner's strict tools leave it out), and thedocumentfilter ofchanges.list.Previs: the episode at the playhead in 3D (M14 phase 4), over the timeline, in the installed Studio and in a browser. The 3D corner of the timeline's picture or stage (or Shift+V) opens it: the cast posed and placed where the Timeline has them, the props, the lighting and the effects, drawn by the episode's own player. Through the shot (P) it is the shot's own frame, exactly as the timeline shows it; drag in the view and the shot's camera is yours to move: pan and tilt it, dolly it with the wheel, change its lens with Shift+wheel or the lens menu, or fly it with the right button and W A S D Q E, the frame following live. "Use this view for this shot" (U) makes it the shot's camera: a new setup on the set where the camera stands, and the shot put on it, as one change of yours (Ctrl+Z takes both back); played again, the shot is the view you saw, to the pixel. Esc ejects to a free camera, with the shot's camera drawn where it stands, to orbit, pan, dolly and fly. Drag anyone onto a mark, beside a piece of the set, or onto open floor, at the playhead: it is the edit the timeline's stage makes for the same drop (a walk from the playhead, or where they start), and open floor makes a new mark there with it (on a 5 cm grid; Ctrl for none), in the same change; a move that cannot be made says why, in Studio's words or the core's. The inspector walks someone to a mark by keyboard. Scrub, step and play on the timeline under it, or from the 3D view (Space, Left and Right), the two in step; while the camera moves, one character a frame turns to face it again. A showrunner's proposal for the episode is drawn as a ghost (where it would put everyone, and its camera, dashed) with Accept, Reject, Review and
\, which plays the episode as the proposal would have it. The address names it (#/<show>/timeline/<episode>/previs, and…/previs/freefor the free camera, replaced, never pushed), and the showrunner hears the shot, the frame, the camera and who is in frame. Viewers and reviewers look, play and pilot, and change nothing. New foredit_episode:set_cameranewSetup, andset_markandset_movenewMark, each writing the set and the episode in one change.A script can bring in anyone and anywhere, with no model. A speaker the cast lacks, a name in capitals the action introduces ("CORA, a seahorse waitress, …") and a place no set answers to each get one-click fixes in the script editor's reading: "OCTAVIUS is new: make a character" draws them with the generator under the script's name, with what the action says of them as who they are, their pronouns from the action, and their own lines as a hint for the voice; "OCTAVIUS is CHIEF" has someone answer to the name from now on; "Make a set for KELP FOREST" builds the place from the kit its heading's words and INT. or EXT. fit, named as the heading names it; "KELP FOREST is Marigold - Bridge" plays it on a set the show has. Several new speakers are made at once ("Make all 3 new characters"), and several new places ("Make all 2 new sets", each a set and a change of its own;
ReadingFix.tools). Each is your own change, and Direct then proceeds. Studio's New character takes a name and a role. A typo still offers the name it nearly is, on every line it is on. New: CharacterInstancealiases;generate_characterstakesnameswithoutroles(one per character drawn).Standard screenplay forms are directed as a film is cut, not read as action (EpisodeIR 1.44 and 1.45, Timeline 1.21 and 1.22). Transitions are edits:
FADE IN:,DISSOLVE TO:andSMASH CUT TO:bring the next scene in,FADE OUT.,FADE TO BLACK.andCUT TO BLACK.end the scene before them in black (Scene.out); the standard ones written withoutTO:are transitions now. Centered text and time cards (> THREE DAYS LATER <,THE NEXT MORNING) are a card between scenes and words over the picture within one,SUPER:words over the picture andTITLE CARD:a card (atitlecue, drawn in the style's title colors and fonts). AMONTAGEorSERIES OF SHOTSis a run of short shots, one for each of its lines, each on what that line shows.INTERCUTcuts between two sets in one scene: each speaker stays where they were last seen, each place is staged on its own set with its own continuity, and every line plays on a shot of where it is said (Scene.places,Shot.set), each side looking off past the lens toward the other, one place to the right of the screen and the other to the left, in every shot of them. Parentheticals,(V.O.),(O.S.),(CONT'D), dual dialogue and lyrics stay delivery. None of them is ever a sound, a prop or a character again ("Make the MONTAGE sound", "Make the OUT sound"). The reading says what each line became: who says it, to whom and how, and where in an intercut; each direction is a card of its own.
Changed3 changes
- A person without Claude is told what they can do themselves (product audit #21, #22, #24).
Every button that asks the showrunner says "Connect Claude to ask" when Claude is not
connected, with the free route first; a need no one click makes offers "Make it yourself" in
Cast, Sets or Sounds; World's empty list names the Bible entry button. Show settings says
what Direct will really use, and Direct falls back to the heuristic director, saying so,
when the model director has no model to direct with. A new account on the web opens on
"Make your show" over the demo made for it (
/api/sessionsaysfirst), with "Or look around the demo" as the way out; a show just made opens on its style lab without the tour over it, and the tour now shows where New show is. In a writer's words: the director's hints say Cast › New character and Sets › New set instead of castMap and "M5", Studio names the person's own changes by title without their ids, and the desktop welcome's "Daemon command" is Advanced. - A preview render is a light proxy, not a master: CRF 28 at preset veryfast, capped at 3 Mb/s
for a 720-line picture, with 128 kb/s sound, in the show's own aspect at 720 lines or, as the
show says (
format.previewHeight), 540. The audit's 45 s 720p preview was 229 MB at the master's settings (CRF 16, slow, no cap); a full render is still the master. Studio's Episodes page and show overview say so, where they said a preview was 1280×720. A render's progress names its delivering stage, and a render whose start was answered late (a daemon busy compiling) is shown running, then done, not failed. - A blank show holds one style of its own,
style.<show>, a draft named after the show, where it held copies of Reelwright's two built-in styles with one switched on. The built-in styles (and a new Blank) are starting points:--style <id>copies one under the show's own id. A style that names a typeface Reelwright does not bundle is warned of.
Fixed18 changes
- A full render whose show delivers a ProRes master, PNG frames or OpenEXR frames is no longer spread over a farm, where it failed on the frames its helpers sent back encoded: it is drawn on one of your computers, and its job in Your computers says why. A render job whose task stopped on a script error, or wrote fewer images than it was asked for, now fails, naming the script error, where it said ok with images missing.
- A proposal's values read whole at every width: a new episode's id and title showed a few letters a line, squeezed beside a spacer. Short values keep their words, an old value and its new one go one under the other when they cannot share a line, and a field's values go under its name on a narrow page.
- A change Studio made for you says what became of it: a try-on kept to look at first was summed up as "Applied" though it waited. Its summary now says Proposed, Applied (and what it replaced, rejected now), Rejected or Undid, as the change stands.
- An episode the model director wrote on your Claude plan names your Claude Code (its version, plan and computer) as its model in its provenance and description, not the show's configured model, which never ran.
- A new show no longer carries another show's words. Its theme's tone came out "warm" for every audience whatever the logline said, and the style lab's sign read "DECK 3 · AIRLOCK 0427" on every show. The tone is now read from the show's own title, logline, setting and look words (a noir musical starts moody, wry, mysterious and lyrical; one for preschool children starts preschool), and "undecided" when they say nothing of it; the sign names the show's own set, else its title; and the tone fields' hint is no longer a phrase from another show.
- A dissolve after a fade-out comes up out of the black the fade left, as a fade in does: it blended the shot that faded, unfaded, into the next one. A wipe or an iris from it reveals the next shot over black.
- A look off screen (
offscreen_left,offscreen_right) runs just past the lens, the face still shown, and a look at the lens or past it turns with each cut to the new camera: it was a profile, held where the first shot's camera put it. - A name the script repeats no longer brings a second note with nothing to click: the first has the buttons, and the reading's notes say what to do in Studio's words, not the episode file's castMap and sceneSets.
- Engine tests wait for what they wait for, as long as load needs, not a fixed few seconds: a wait in a test says where it still waits past its old budget and gives up at two minutes, saying so, so one that never ends fails in two minutes rather than holding a run; and playback, the still timer, the chat's focus, the plan bridge's restarts and a deleted show's socket are waited on by their own events. The timeline's playback test failed at a load of 120.
- Generic words no longer stage things. "Bubbles drift up through a shaft of moonlight" floated everyone on stage; a float now needs someone floating (gravity going, or a person before its verb), so a thing that drifts, someone's hat or hair, "drifts off to sleep" and "floats an idea" float no one. "Her heart sinks" and "the music rises" seat and stand no one, "stands her ground" stands no one up, and "takes a seat" sits. Letters said as letters (DJ, FBI, ID) are no sounds, and idioms ("drops the subject") no props. The reading says "Otto looks up", not "looks at up".
- A number in Studio's inspectors keeps what the document holds: it was rounded to the step its arrows take, so a seat 0.23 m up showed 0.25 and was saved as 0.25 when anything beside it changed. The arrows still step 5 cm or 1°.
- Selecting a mark or a camera in the set explorer no longer narrows the view by a few pixels (the inspector grew to fit "Who stands here" and the lens presets), which moved what was under the pointer as a drag began.
- An editor that read its document again while a read was under way could go on with the document as it was: in a browser, a change's news can come before the answer to the click that made it. It now waits for a read after the one under way (the set explorer, the character studio and the style lab).
- A document opened while Studio's connection to the daemon was down said "Not connected to the Reelwright daemon" and went on saying it once the connection was back; in a browser, a page opened at a set's address could show the set that way, as a form, when its connection was slow to open. Every open view now reads its document again when the connection comes back (after a drop, a daemon started again, or a slow first connection): the set explorer, the character studio and the style lab open what they could not, or read what changed meanwhile and build only that; a document, the timeline, the memory and settings pages, a proposal and the recording booth's line show what they could not read; and the script editor reads its script again, keeping unsaved text and saying when the show's copy changed meanwhile (Save merges the two).
- What Studio asked the daemon as its connection was closing, before Studio had seen it shut
(the chat says where you are every moment), was sent into the closing connection, and the
log said
Condition "ready_state != STATE_OPEN" is true. It now fails at once as not connected, and is never sent; Studio connects again as before. - Leaving a set, a character or a style while it was still opening let it finish out of sight: the set was built, or the character or style drawn, in a view no longer shown. Leaving it now ends that opening.
- The timeline stopped playing live when its episode was read again twice in quick succession (an edit, then Ctrl+Z): the second reading gave up opening it while the first, outdated, was still at it. It now waits its turn and opens it.
- The timeline's stage kept a set as it was first read: a mark moved in the set explorer stayed in its old place on the stage. A changed set is read again.
0.3.1
3 changes: 3 fixed.
Previews no longer open a window over Studio, Back leaves the Timeline, and Studio says where it made the demo show.
Fixed3 changes
- While Studio made previews, a window with Godot's logo came up over it for each one and took the keyboard: the installed Studio's renderer opened a full-size window of its own on the desktop. The core now starts it with a window of one pixel, off the screen, with no logo, that does not take the focus, so nothing comes up and typing in Studio goes on (on macOS, Godot still asks for the renderer to be the active app as it starts). Renders come out the same, byte for byte.
- Alt+Left on the Timeline did nothing. Opening the Timeline kept two places in the history, the section and then its episode, so Back went to the section, which showed the same episode again. It is one place now: Alt+Left (and the mouse's Back button) goes to where you were before, and Alt+Right comes back.
- Try the demo show said nothing of where it put the show, and the downloads page said Documents/Reelwright, though with no Documents folder it goes in a Reelwright folder in your home. Studio now says where it made the demo (or a new show), with a button that shows the folder, and the downloads and support pages say both places.
0.3.0
81 changes: 24 added, 6 changed, 51 fixed.
Studio now opens a show's sets and its people live. You can walk round a set in 3D and look through its own cameras, and turn, pose and dress a character on its model sheet, changing either by hand. The installed Studio signs in to Reelwright: it lists your shows there beside the ones on your computer, and it can run your web chat on your own Claude plan. Shows can be shared, and each has a settings page of its own. The showrunner knows which page you are on. Scripts come in from Final Draft and Fountain and go out as a production PDF, and the Linux download is a third smaller. Linux packages are published here; the release workflow builds Windows and macOS too.
See it live
- The set explorer: Sets › a set builds it in 3D. Orbit, pan and fly as in a pro tool, look through each camera setup with keys 1 to 9, and see the marks, walkways, entrances and lights. Stand the cast on their marks, and change any field by hand, with Undo.
- The character studio: Cast › a character puts them on a turntable, on the model sheet's paper, with the approved sheet laid over them to show what has moved. Expressions, mouth shapes, postures, walks, costumes, palettes and props are all live, and Variations… offers four to pick from.
Reelwright and the installed Studio
- Sign in to Reelwright from Studio with the emailed code. Your shows there, and those shared with you, are listed beside your computer's and open as they do in the browser. Put it on Reelwright sends a show up, history and all.
- The plan bridge: one switch in Connect Claude lets this computer run your web chat on your Claude Pro or Max plan while Studio is open.
- Claude Code and the Claude apps can work on your shows on the web, as you and with your role, through Reelwright's own MCP server.
Working together
- Share a show and invite people as editors, reviewers or viewers. Everyone works in one studio, and every change says who made it. Ctrl+Z undoes only your own changes. When two people save a script, it merges line by line, and lines you both changed are shown side by side for you to choose.
- Show settings (Ctrl+8): rename the show, write its logline and pick a cover. You can switch its style after seeing every character before and after, set the size of its renders, and duplicate, export, archive or delete it, as your role allows.
- New show asks what your show is about, then starts it blank by default, in your own words.
Finding your way
- The showrunner knows the page you are on, on the desktop and the web alike. "Make it warmer" means the theme or style in front of you, and its suggestions follow you round.
- Back and Forward step through the places you opened: Alt+Left and Alt+Right, or the mouse's buttons. On the web, each place has an address that a link or a bookmark opens.
- The chat and the rail fold away and resize like a pro tool's side panels. On a laptop-sized window, nothing pushes the chat off the screen any more.
Scripts
- Import a Final Draft or Fountain script as a new episode. Export one as an industry-format PDF, as a Final Draft file or as Fountain.
- The director follows the shots a script writes, such as "CLOSE ON THE SCANNER", "INSERT - THE NOTE" or "OTTO'S POV".
A smaller download
- Linux's ffmpeg is built from source with only what Reelwright uses it for. The AppImage is
149 MB (was 217 MB) and the
.tar.xzis 126 MB (was 181 MB), and renders are the same, byte for byte.
Added24 changes
- A character opens live: the character studio (M14 phase 2). Cast › a character draws them
in Studio's own engine on the model sheet's paper, the same in the installed Studio and in a
browser, with the form one tab away (Fields). Turn them on a turntable: drag, Space to spin,
the arrows by 45°, or 1 to 5 for the sheet's front, 3/4, side, 3/4 back and back, with those
five angles drawn live beside it; a spin draws each 15° step once and keeps it, so turning
round again costs nothing, and at rest the exact angle is drawn. The Sheet view draws the
model sheet's own turnaround, pixel for pixel, and Canon (
\) lays the approved model sheet over it like a light table and says how much has moved since; the locked fields are listed beside it and marked on every control. Panels: the 21 expressions and the mouth chart A to H and X as live thumbnails, their own adjustments on sliders that move the face as you drag and save when you let go (an entry of the character's own, or a new one); postures, the rig library's gestures played live, and walks looped in place; the costume's layers and fields, with a try-on strip of what the part library draws for a field (a cap in place of goggles), tried on before it is kept; the palette's slots, checked against the style's color rules when set; and any prop of the show in a hand, held as an episode holds it, its size in hand set on the spot. Variations… asks for four costumes, palettes, hairstyles or heights, each drawn on the stage when chosen, to pick one in place. Every edit is your own change throughrevise_character(orrevise_prop), shown at once, in History and undone with Ctrl+Z; viewers and reviewers look, turn, pose and try on, and change nothing. The showrunner hears the panel and what is chosen in it (cast/char.otto/expressions/happy), the angle, the face and the pose. New in the session protocol:scenes.getkindcharacter(with the approved sheet ascanon), andtools.callkeep, which leaves a person's own change sets proposed to look at first; a variation group is now always left to pick from. - A set opens live in 3D: the set explorer (M14 phase 1). Sets › a set builds it in Studio's
own engine, the same in the installed Studio and in a browser, with the form one tab away
(Fields). Look round as in a pro tool: the middle button or Alt+left drag orbits,
Shift+middle pans, the wheel dollies toward the pointer, the right button held with W A S D
(Q E down and up) flies, F frames the selection, Home the whole set, T the plan from above.
Keys 1 to 9 look through the set's camera setups, drawing the very frame each setup's set
view draws, letterboxed with its safe areas, and 0 or Esc goes free again; a readout gives
the lens, the field of view across and up, the camera's height and tilt. Overlays, each
with its toggle (O for all of them), draw the marks with the way they face, the walkways, the
entrances, every setup's camera and what it frames, the key light and the practicals; what a
piece of the set hides is drawn faint. Switch the lighting preset (L), stand the cast on the
marks in their postures to see the set with people in it (a view only: it writes nothing),
and click anything, in the view or the outliner, to see all its fields in the inspector,
typed, with their units and ranges: any of them can be changed by hand, without the
showrunner. Each edit is your own change through
revise_set, shown at once, applied as made, listed in History and undone with Ctrl+Z; a refusal takes it back in the core's words, a locked field says so, and viewers and reviewers of a shared show look but do not edit. The showrunner knows what you look at: the page names the setup or what is selected (sets/set.marigold_bridge/setups/wide), and the camera and what is in view come with each message. In a browser the address follows, replaced rather than pushed, so Back never steps through an orbit, and a link opens the set looking through that setup. New in the session protocol:scenes.get, the job a set is drawn from, and thescenescapability. - The installed Studio, signed in to Reelwright, runs your web chat on your Claude plan with one
switch: "Let this computer run my web chat on my Claude plan" in Connect Claude, offered once
Claude Code here is signed in with a plan. Studio makes the bridge's token through its own
sign-in (nothing to paste), keeps it with the account for you only, and keeps
reelwright claude bridgerunning while it is open, saying under the switch how it is ("Running: your chat on Reelwright goes through Claude Code here, on your Max plan."). Turning it off or signing out stops the bridge and revokes the token; closing Studio stops it. Pressing Disconnect on its token on the web stops it too: Studio turns the switch off and says so ("You disconnected the plan bridge on the web. Turn it on here to start again."). A token refused for any other reason (expired, rotated out) is made again once; refused again, the switch goes off, with no endless retry. While Studio runs the bridge, the web edition's Connect Claude says only that; otherwise it names Studio's switch, with the terminal's way folded behind "Run it from a terminal instead", and a chat with no bridge says the same, Studio's switch first.reelwright claude bridgegains--token-stdin(it stops when that input ends),--json(its state as JSON lines) and--runner, and ends (exit 1) when the service refuses its token instead of trying it again, saying why (the service now keeps why a personal token ended, and a token rotated out by newer ones ends its sessions at once). - The showrunner knows where you are in Studio, on every page, desktop and web alike. The
chat's header says it ("Looking at: World › Theme", "Cast › Ottoline Brisk", "Timeline › The
Lighthouse (cold open) › sh030", Settings, a script with its selected lines, a memory entry,
a proposal), with "Ask about the whole show" to leave it out. Each message carries a brief of
that page drawn from the show (a theme's premise, rules and catalog, a style's palette, a
character's card, a set's marks and camera setups with the part you scrolled to first, the
shot at the playhead and its lines, a memory entry, a proposal's changes, the show's
settings) and the tools that act there, within 1,200 tokens, so "make it warmer" means what
you are looking at and the showrunner reaches for the right tool; it goes the same way with
an API key or a Claude plan. The suggestion chips follow you, three to five per page in your
show's own words ("Give Otto a winter costume.", "Tighten sh020.", "Try a warmer variant of
Saturday Morning.", "Build the show's first set."), made without a model the moment you stop,
and sit over the message box once a conversation is going. Answers take you there: a
proposal's card has a button to the place it changes ("Open the theme"), and a place the
showrunner links in its reply is a link that goes there, a step Back returns from. Where you
are is the same place Back and Forward know. Claude Code knows it too: the MCP server's new
studio_contexttool says where you are in Studio on that show, with the same brief, on the web service's MCP server as on your computer's, for the person signed in; and a web chat on your plan through your computer's bridge gets the same brief with each message. New in the session protocol:chat.focus, thestudio.navigatenotification, andChatContext's page path, title, part, selection, memory group and entry, proposal, camera and view. - Studio's own chat in the web edition can run on your Claude Pro or Max plan, through your own
computer, when you turn it on (off by default; "Also use my plan for Studio's chat
(experimental)" in Connect Claude, with what it means said beside it). Run
reelwright claude bridge --service https://reelwright.diy/appon your computer, signed in with a token you make in Connect Claude: your chat messages go to it, the unmodified Claude Code there answers on your plan with the show's tools through the service's MCP server, as you and with your role, and its answer, tool cards and proposals stream back into Studio as the chat's always do. Connect Claude shows whether your computer's bridge is connected and its Claude Code signed in with your plan. With no bridge running, the chat says so and offers Connect Claude. Your turns go to your own bridge only, the bridge takes a personal token only, and the service never sees anything of your plan. - Claude Code and the Claude apps can work on your shows in the web edition, on your own
Claude Pro or Max plan, through Reelwright's own MCP server at
https://reelwright.diy/app/mcp.claude mcp add --transport http reelwright https://reelwright.diy/app/mcpsigns you in through your browser (the service's emailed code, then "Allow Claude to work on your shows?"), and claude.ai or Claude Desktop connects to the same address as a custom connector. Claude starts on the show you last opened, lists your shows and those shared with you and moves to another when asked; it reads and proposes as you, with your role in each show (in a show you review, it reads and comments, and in one you can only view, it only reads), and what it proposes appears at once in the Studio open on that show, for review. For a setup with no browser, a personal token works as a bearer header. Access tokens last an hour and refresh, every token is kept hashed and can be revoked, and none of them opens anything but the MCP endpoint. The service's owners see each person's Claude connections on their page in the admin console and can disconnect them; Sign out everywhere ends them too. In the web edition, Connect Claude offers "Use your Claude subscription" beside the API key: the exactclaude mcp addcommand and the connector's address, each with Copy, Make a token (shown once, in the command that uses it), and your connections, each with when it was last used and Disconnect. The guide is at reelwright.diy/docs/claude-on-the-web, and the support page's questions say how. - The session protocol lists the showrunner's tools (
tools.list: each one's kind, description and whole input schema), andtools.callcan run a tool for an assistant (author: "showrunner"), whose change sets wait as proposals for review instead of being applied as the person's own edit. The web service's Claude connection is built on both. - An admin console for the web service's owners at reelwright.diy/app/admin, replacing the admin panel. Only the addresses in the service's ADMIN_EMAILS reach it; anyone else gets the page-not-found anyone gets. Overview shows the service at a glance (accounts, who was active today, daemons, Claude spending, the data volume, the latest activity). Users lists every account with its role, status, sign-ins, last activity, shows, storage, Claude key and spending, searched and sorted, with invites and adding accounts; each account has a page to rename it, change its role, disable or enable it, set its Claude cap, disconnect its key, see its shows and who they are shared with, stop its daemons, sign it out everywhere, email it a sign-in link, delete it with its shows (the address typed out first), and read its activity. Shows lists every show on the service with its owner, size, people and daemon; each show's page has who is in it, its daemon as it runs (memory, who is connected, the render under way) with Stop, and its activity. Operations shows the machine (disk, memory, load, uptime, the version and commit, whether mail goes out), every daemon with its memory and who is connected, the renders under way with who started them, and sends a test email to the owner's own address. Settings change how the service behaves, at once and with no redeploy: close sign-ups, put it in maintenance (only owners get in; everyone else sees the message and their daemons stop), show an announcement banner on the sign-in page and in Studio, switch off Claude on the web, sharing or the demo show for new accounts, give new accounts a default Claude cap and everyone a monthly spending ceiling (each daemon checks it before every model call), set quotas (shows, storage, renders at once, render minutes a month; each account can have its own), the daemon limits and the sign-in code limits. The audit log is searched by who, what, target and day, a page at a time, and exports as CSV. In Studio on the web, the owners have "Admin console…" in the show menu and the palette, which opens it in a new tab; everyone sees the owners' banner across the top until they close it, and during maintenance Studio shows the service's maintenance page. The admin role is now called helper: it manages the people in shows shared with it, for support, and nothing service-wide.
- Working on a show together, on the service (the first of three steps; Studio's side follows). People join a show by accepting an invitation: its owner (or an editor, when the owner lets editors invite) invites one or more addresses as an editor, a reviewer (reads and comments) or a viewer, with a note; each gets an email with Accept, good for 14 days and once, which only that address can use, and someone with no account gets one by accepting while the service lets invitations bring new people. Invitations can be resent, withdrawn and declined, and the owner sees which. Someone who opens a show's link without access can ask for it with a note; the owner approves with a role or declines. Anyone but the owner can leave a show; the owner can give it to an editor, who accepts and finds it in their own shows with everyone still in it (old links still open it), or delete it by typing its name, which ends everyone's session in it and tells them. Each person gets notifications (an invitation, a request, an offer, a role changed, a removal, a show deleted) and chooses per kind whether email comes at once, in a daily digest or not at all; every email has a link that stops its kind.
- The service is ready for the installed Studio to sign in to it: signing in with the emailed code from Studio gives that computer its own sign-in, named in your account's sessions with when it was last used, which you can end there or by signing out on it. It opens your shows and their studios as the browser does, and never the admin console.
- A show on your computer can go up to the service, history and all:
reelwright host packmakes the upload (its git history and the files git does not keep yet), which the service checks against its checksum and size limit and like any show before it becomes yours there. Anyone who may read a show on the service can download a copy to keep; its owner's copy carries its history too. An upload, or a show handed over to you, counts against your quota of shows like a new one. - The admin console's Settings has a Sharing section: whether a show's invitation may bring someone new to the service (never while sign-ups are closed), whether people may ask for access from a show's link, and the most people one show may have. They apply to the next request, as every setting does, and the Features switch for sharing now stops invitations and requests too. A person's page in the console lists their installed Studios beside their browsers, with when each was last used and a way to sign one out; Sign out everywhere signs out those too.
- Share a show with other people on the web edition. Its owner chooses People… in the show menu, the palette or the show's own settings (World, then Show) and invites someone by their email (they accept the invitation, above) as an editor (everything but sharing) or a viewer (reads and plays, and changes nothing), changes their role or removes them; each change is in the admin console's audit log. Shows shared with you are listed under "Shared with you" in the show menu, with their owner's name. Everyone in the show works in one studio, so an edit by one is there for the others, and the initials of whoever else is in it show under its status. A viewer's Studio says "View only" there and offers nothing that would change the show: no New or Import script, no Render, Voice or Record, a chat box that takes nothing, a script that reads but does not save, proposals and memory updates without Approve, locks shown but not set, and an edit on the timeline is said to be for the show's editors. The service refuses those anyway. Someone removed is cut off at once, told who stopped sharing which show, and taken to their own show. A show nobody shared with you does not exist for you. Every change says who made it, or who asked the showrunner for it: History and a proposal name them, and the show's git history has them as the commit's author. Ctrl+Z undoes your own changes only, never someone else's.
- Working on a shared show together, in the show's studio (Studio shows it in a coming release). A show can have reviewers, who read, play and comment: the studio refuses them anything that would change the show and says what they may do, and refuses a viewer comments too. Saving a script that someone changed after you opened it merges your edits with theirs line by line and says whose changes came in; where you both changed the same lines nothing is saved, and each place comes back with your lines and theirs for you to choose. A save the studio cannot merge is refused and says who changed the script and when: your text stays in the editor, and Save again keeps yours over theirs. Comments: a thread on a script's lines, a timeline frame or shot, a character, set, prop or episode, or the show, with replies, @mentions of the people in the show, edits and deletes of your own (the owner may delete any), and resolve and reopen. A comment on a script's lines stays on them as the script changes around them and says when they are gone. Comments are kept in the show's folder, so they travel with it and work on a show on your computer too, where they name nobody. Everyone in a show has a colour of their own and is seen where they are: the section, the episode or script open, the timeline's playhead and the script's line, and whether they have unsaved changes in a script someone else opens. Each change anyone makes comes with a sentence saying who did what ("Ada edited the Lighthouse's script."). On the service, someone @mentioned in a comment, or whose thread has a reply, finds it in their notifications, and by email as they choose; a render you started tells you when it finishes.
- Show settings, a place of its own in Studio: Settings in the rail (Ctrl+8), "Show settings…" in the show menu and in the palette. The owner renames the show (on the desktop its folder can follow), writes its logline, picks a cover (a still of one of its episodes, or a picture of their own), switches its style after seeing every character before and after, edits its theme's name, premise, genres and setting and its colors, sets the size and frame rate full renders are made at and which director Direct uses, says how its memory keeps up and how the writing assistant writes for it, sees what it takes on disk and deletes its renders, previews and caches. Each change is the person's own and Ctrl+Z takes it back. Duplicate makes a copy beside it, Export as Show Pack saves a zip (the browser downloads it on the web), Archive takes it off the list (under Archived in the switcher and on the first screen, Restore puts it back), and Delete, after the show's name is typed, moves its folder to the trash (or, where there is none, deletes it for good after asking) and on the web deletes it from the service. A new title shows at once in the rail, the window's title, the switcher and the show menu.
- New show asks what the show is: its title, a logline, its genre or setting in a few words, how it looks (Reelwright's styles, each with its swatch) and where it starts: Blank, the default, the person's own show; the Marigold's sci-fi kit; or a copy of the demo, each said by name. On the desktop it says where the show's folder goes and lets you choose another place; on reelwright.diy/app the service keeps it. It is the same dialog on the welcome screen, the show menu (on the desktop too now), the switcher and the palette, in both editions. New set's name field suggests a kitchen, not a galley.
- A new show is yours from its first file.
reelwright init <dir> --blank --title T(with--logline,--settingin a few words and--style) makes a show whose theme is written from your title, logline and setting, with Reelwright's built-in styles (Saturday Morning, Bright Modern) and its starting patterns: cartoon people in everyday clothes, a furnished room with a window, a sofa, a table and a door, and an open-air place with a bench, trees, a lamp post and painted sky. Nothing in it is the Marigold's. New character, New set and New episode work in it at once, with no model. The Marigold's kit (--starter) and a copy of the demo (--demo) are still there, by name.--copy <show>makes a copy of a show of yours as a show of its own, andreelwright pack <show>zips a show as a Show Pack to keep or send. Renders, caches and a show's repository are never copied or packed. - The session daemon serves a show's settings (
show.get,show.update,show.cover,show.restyle,show.storage,show.clean): its title, logline, theme's words, colors, render size and frame rate, each edit the person's own change that Undo takes back; a cover picture frozen in the show's assets (show.json's new optionalcover); a restyle proposed for its preview before it is approved; and how much room renders, previews and caches take, with a way to free it that never touches the show's own files or takes. - On reelwright.diy/app anyone in a show can copy it as a show of their own
(
POST /api/shows/<key>/duplicate, counted on their quotas of shows and storage like a new show), download it as a Show Pack (Show settings' Export uses the copy to keep,GET …/pack), and archive and restore it on their own list (POST …/archive, which nobody else's list follows). Deleting stays the owner's, with the show's name typed: Show settings' Delete is the service's one delete, which ends every session in it, tells everyone in it and takes it off everyone's archived shows. Someone not in the show gets nothing, nor learns that it is there.POST /api/showsmakes a blank show by default, from a title, logline, setting and style. - Show settings follow your role in a shared show: its owner and its editors change it, a
reviewer or a viewer sees it read-only, and only the owner can delete it. The daemon holds
them to the same:
show.getandshow.storageread, andshow.update,show.cover,show.restyleandshow.cleanwrite, so a reviewer or a viewer is refused. - The installed Studio works with Reelwright. Sign in to Reelwright (the first screen, the
show menu, the switcher or the palette) asks for your email and the code Reelwright mails
you, as the web does; that computer then has its own sign-in, kept in Studio's folder for
your user only and named in your sessions on Reelwright, and the dialog says who you are
with Sign out. Your shows there, and those shared with you, are listed on the first screen
and in the switcher beside the shows on your computer, marked with a cloud and with whose
they are, and stay listed while offline. Opening one works as in the browser: Reelwright
runs it, you see its previews, timeline and takes, a render's Watch downloads it first, and
you can do what your role lets you (a reviewer or a viewer gets nothing that would change
the show). Its Show settings copy, export, archive and delete it on Reelwright, as the web
edition does. Put it on Reelwright, in the show menu of a show on your computer, sends it to
your account there (its history and files, never its renders or caches), with a bar of how
far it got; Reelwright's answer comes back in plain words (no room for another show, too
large, a show with errors, no connection) with Try again, and once it is there the folder is
marked as on Reelwright, with the way to open the copy. `reelwright host upload
--to` does the same from a terminal, the sign-in read from its input. - Saving a script someone else saved since you opened it, in both editions: a save that merged with their changes shows the merged script and says so quietly ("Merged with Ada's changes."), one Ctrl+Z from your own text. Where you both changed the same lines, the conflict view shows each place with the lines as they were, theirs and yours side by side: keep theirs, yours, both or the lines as they were, edit what you keep, then Save. Back leaves your text as it was, unsaved. A script left with unsaved changes in another show merges too when you come back and save it.
- Scripts in and out. Episodes has "Import script…" beside New episode (and the palette has it): pick a Final Draft (.fdx) or Fountain (.fountain, .txt) file and it opens as a new episode's script, unsaved until you save it, like New episode's. Final Draft's scene headings and their numbers, action, characters with their extensions and (CONT'D), parentheticals, dialogue, lyrics, transitions, shots, dual dialogue, bold, italic and underlined words, page breaks and the title page come across; what cannot (a script note, a kind of paragraph Fountain lacks) is said. The script editor's Export menu, and the palette while a script is open, give the script as it is on screen as an industry-format PDF (US Letter, Courier 12, the standard margins, page numbers from page 2, (MORE) and CONT'D where a speech breaks across pages, never a scene heading alone at a page's foot, a title page from the script's or the show's and episode's titles), a Final Draft file that imports back to the same script, or Fountain. On the desktop a dialog asks where; on the web the browser's own file picker brings the file in and the browser downloads what goes out. The same script always gives the same PDF.
- The director reads the shots a script writes. A paragraph that is only a shot in capitals
("CLOSE ON THE SCANNER", "ANGLE ON OTTO", "INSERT - THE NOTE", "EXTREME CLOSE-UP ON HER
EYES", "WIDE SHOT", "TWO SHOT OF OTTO AND THE CHIEF", "ON THE CHIEF", "OTTO'S POV", "BACK
TO SCENE", Final Draft's Shot paragraphs among them) is a camera direction: no longer a
sound the show lacks, and never business or an entrance. The heuristic director frames
what it asks (a close-up or a single on a character, an insert on a prop or a piece of the
set, the set's wide, a two-shot, a point of view) from its line until the next shot line,
BACK TO SCENE or the end of its beat, then covers the scene its own way again. Where film
grammar forbids exactly what it asks it takes the nearest framing that keeps the rules and
says why; words that name nothing in the show are noted. The read-along shows what each
shot line asks,
reelwright directand try_action say what each became, and the model director is told to honour them.
Changed6 changes
- In the web edition, connecting, replacing or removing your Claude key no longer restarts the show you are in: a render under way goes on, and the chat works at once as before. Every model call is paid with the key of the person who asked for it, even in a show other people work in too. The browser no longer holds the token of its show's studio: the service says Studio's hello for it and names who is signed in.
- The Linux download is a third smaller: the AppImage is 149 MB (was 217 MB) and the
.tar.xz126 MB (was 181 MB). Its ffmpeg and ffprobe are built from FFmpeg 9.0.2's source with only what Reelwright runs them for, each one static file: 14 MB, where the build with every codec took 202 MB. Renders come out the same, byte for byte. Windows and macOS carry the same ffmpeg as before. - The Timeline zooms from the keyboard: = and - zoom in and out, \ fits the episode (its zoom buttons take no focus, so Space plays). The buttons' tooltips and the shortcut sheet say so.
- The showrunner chat folds away when you want the room, as a pro tool's side panel does: the chevron in its header, or Ctrl+Alt+B (Ctrl+Shift+L too, and in Ctrl+K). It slides to a slim strip at the window's right edge and the main area takes its room as it goes, so the Timeline's picture and stage, and the script, get room on a laptop; a click anywhere on the strip brings it back, as do Ctrl+L and anything that asks the showrunner. Drag its left edge to make it wider or narrower (340 to 720 px; the main area always keeps its least), and double-click the edge for its own 400 px. Studio remembers whether it was open and how wide, and the web edition remembers it for each person in their browser.
- The rail on the left folds to its icons the same way: Ctrl+B, or the chevron at its foot. Each icon's tooltip names its place and its key, the show keeps its picture (still the switcher) and the status its dot (a click opens the show menu). It slides, the main area takes the room, and Studio and the web edition remember it folded. With either column or both folded, the Timeline's Both view puts the picture and the stage side by side when the room allows, and one over the other again when a column opens and it no longer does.
- The timeline's inspector says a camera move in a filmmaker's words. A push on a setup "Pushes in to" a size, and goes a Distance (as a percentage, with what 100% does) when it has none; a zoom has its Zoom and a shake its Strength ("30% a tremor, 60% a jolt"), where they all said "To size: By how hard" and "How hard 0.15". Sizes read "Close-up (CU)", the camera "A medium shot (MS) of Otto and Chief". On a framed shot the size a push reaches is the size it "Ends on", one field instead of two that said the same thing, and turning or reframing where it ends keeps that size.
Fixed51 changes
- In the script editor, a character's cue completed after an apostrophe earlier in the script ("Otto's", "scanner's") came in with quotes around it, "CHIEF" in quotes, in both editions: the editor took the apostrophe for the start of a string. A cue typed whole also left its offer open, so Enter took that instead of ending the line; now Enter ends it.
- In the installed Studio, the chat of a show on Reelwright said your key "stays on this computer", though such a show's key is kept on the service. It now offers your own API key, kept encrypted for your account, or your Claude plan through the bridge this computer runs, and Connect Claude for that show keeps the key on the service.
- A shot the script writes ends where the next one starts. One too short to read played on
into the shot after it: "CLOSE ON THE SCANNER" over a blink, in a style that cuts no faster
than 1.2 s, took the Chief's line after it, and Otto's extreme close-up took his "What?"
when his own shot was too short to stand. The scene now waits a moment before the next
shot, just long enough, and
reelwright directsays how much longer it held each one. Where it cannot wait (a re-cut keeps the scene's timing), the shot plays as long as it is anddirector.written_shot_shortsays so, with a hint. - An insert on a prop someone holds frames it in their hand. "INSERT - OTTO'S MUG" with the
mug in Otto's hand was a close-up on her face, the mug out of the picture; it is now a
close insert on the mug as she holds it, steam and all; where the furniture hides it from
every camera, the holder's single, wide enough for their hands. An insert camera on a held
prop frames it at the size it is drawn in the hand (its
heldScale), not its true size. - An extreme close-up is centred on the face, halfway between the eyes and the mouth. It was centred on the middle of the head, so seen three-quarters on its middle was an ear and the hair, and the eyes and moustache sat off to one side.
- On the web edition, removing your Claude key, or being removed from a show, takes hold in a show's studio before you are back in it. On a busy server the studio could take your next connection before it had heard, and keep the key you had just removed for it.
- A show started from the Marigold's kit, or a copy of the demo, no longer brings the demo's renders along when the copy Reelwright carries has some.
- Sign-in codes and invites from reelwright.diy/app come from login@reelwright.diy, and a reply to one goes to support@reelwright.diy, where someone reads it.
- A storyboard made by the Linux download has its captions in Inter, as Studio's do. Its ffmpeg could not read the WOFF2 font: it drew them in the machine's own default font, or none at all on a machine without one.
- The web edition's show menu opens when the click is released and sits above its button, never over it. Opened on the press and pushed up over the button at the window's foot, it took the click's own release, and after choosing the show already open it would not open again: switching back to the show before failed on the live service.
- On a laptop-sized window, Episodes no longer pushes the showrunner chat off the screen: an episode's buttons sit under its title and wrap when there is no room, its render's Watch and Show in folder go under the render, and what the card says lines up with its title. A script not directed yet says "2 scenes, not directed yet", its file in the tooltip.
- Episodes says what a directed episode is in words, "1 scene, directed", where it showed its id ("ep.lighthouse_cold_open") under its title; the id and its script's file are in the tooltip. A script not directed yet, or an outline with no script, has its button under its title as every card does, not off at the right.
- On a laptop-sized window the Timeline and Memory no longer push the chat off the screen either. The Timeline's title and running time shorten with an ellipsis (all of each in its tooltip), the picture and the stage get as small as 240 px wide under the tracks, and in Both the stage goes under the picture when there is no room beside it, coming back beside it when there is (the inspector folded away, a wider window). Memory's group filters wrap.
- On a laptop-sized window the recording booth no longer pushes the chat off the screen: the picture goes under the prompter when there is no room beside it, and a take's buttons (gain, Normalise, Clean, Use this take, Delete) under its name.
- The Timeline's title is whole whenever the header has room for it ("The Lighthou…" sat beside an empty header), and gives way before it would widen the window. In Both on a laptop, with the stage under the picture, the two no longer push the chat's message box off the bottom of the window.
- The booth's header names the line's character whole on a laptop ("Ottoline Br…" before). Who is reading and the microphone moved out of it, under Session above the lines, and the microphone hint says to pick it there. While a take records, the booth says Space keeps it and Esc drops it, where it said "Recording sc01/l01.".
- On a laptop beside the chat, the script editor gives the script its whole width: the director's reading took 340 of 660 px and left 38 characters a line. Narrower than 800 px the reading folds away by itself, its notes still flagged beside their lines, and comes back when there is room (fold the chat or the rail). Reading shows or hides it for good.
- The Show page's counts ("2 characters", "1 set") start in line with the premise above them. Their buttons' padding showed as a 12 px indent, though it shows only under the pointer.
- An episode's card keeps Render beside Render preview, on a row of their own under Script, Storyboard and Record lines. In one row with them, on a laptop Render, the card's main button, wrapped onto a line alone.
- A switch's or a tick box's words start where the words above and below them do, as on the welcome screen's update switch and Connect Claude's plan switch. They sat 12 px in, padded by a button's box that was never drawn; the tick boxes in Memory's settings and the inspector drew it, a raised button round each one.
- Back and Forward follow where you are in Studio. On the web the browser's own buttons go
back through the sections, documents, episodes and scripts you opened, and each place has
an address (
…/studio/#/marigold/cast/char.otto, Show settings'…/#/marigold/settings) that a reload, a bookmark or a shared link opens; Back used to leave Studio altogether. Studio's own Back out of a document is the browser's Back, and going back to another script over unsaved changes asks first. On the desktop, Alt+Left and Alt+Right and the mouse's back and forward buttons do the same. - Behind a dialog that waits for an answer (Connect Claude, a new show, an unsaved script) the rest of Studio dims, so the dialog stands out from what it covers; menus, the palette and tooltips dim nothing. A dialog's buttons sit together at its right edge, Cancel beside the action, where Godot spread them across the dialog with a wide gap between.
- A document opened from a list is titled with the list's name at once, rather than "Loading…", and keeps that name if it cannot be read: "show.marigold" stood as the title and again under it, over the error.
- A document's page (a character, a set, the bible) keeps to 840 px on a wide window, its header with it, and its preview is as wide as the parts under it. A proposal's page does too: its rationale ran 1200 px a line on a 1920 px window. A value sat a thousand pixels from its name and its lock on a 1920 px window, and the preview stopped 520 px in, just short of the cards below it on a laptop.
- A choice too long for its field in the timeline's inspector ends in an ellipsis: an effect's From read "s03 · spark zap · -2 d" and a shot's Setup "None (framed by ha", cut off mid-word.
- A Timeline block too narrow for its words ends them with an ellipsis ("O…", "Chi…"), or shows none when not even a letter fits. Godot's own trim left the ellipsis off short labels, so they read as fragments, "OTT", "sca", "the s", beside captions that had one.
- A character whose business overlaps on the Timeline has one track, named once, over both their lanes. The second lane had a name cell of its own with nothing in it, a row that seemed to be nobody's; pointing at it now says whose it is.
- Scrolled along a zoomed-in episode, the Timeline keeps its track names (Shots, Camera, Dialogue, each character's lane) in view at the left instead of scrolling them away; what runs under them is not clicked by mistake, and pointing at a name shows it whole.
- A directed script says "Directed: Direct does it again from this text." under the editor, not "Directed as ep.lighthouse_cold_open; …": its title is over it already.
- The timeline's inspector says where a block falls as "Scene 1, 0:02.25 to 0:05.71", not "sc01, …", as the booth and the script do; the stage's corner says "Scene 1 · Marigold - Bridge".
- The recording booth says where a line falls as "Line 1 of 3 · Scene 1" (and "1 · Scene 1" in the list of lines), not "sc01/l01"; the picture beside the prompter says "the line with this take".
- On a wide window the Show page's episode cards share the room there is, so a title such as "The Lighthouse (cold open)" is whole beside its badge; at 1920 px two episodes sat at 237 px each in a row laid out for five. Widening the window, or folding the chat away, now widens them too: they kept the width they were first given.
- The Show page has one accent button among its next steps, on the step to take first; the others are plain, where two or three accent buttons stacked up. "All episodes" has its arrow after its words.
- Memory's settings read "1500 tokens", "6 latest episodes" and "2 episodes in a row", with one space between the number and its unit, not two.
- Memory's group filters with nothing in them ("World 0") are off, rather than buttons that show an empty page.
- A dialog's close button is the same quiet x as the rest of Studio's, not Godot's bold white one.
- In a dialog, the button that does what it is for stands out: Write it, Make it, Connect, Propose, Name it and Save in the accent, Forget and Delete in red. Cancel no longer looks just like them.
- The Timeline has room around it in Studio, as every other section does: its title no longer sits on the window's top edge, nor its status line ("8 shots, 6 lines") on the bottom one.
- Tooltips on words now show when pointed at: the rail's status (the show's name and folder), a take's file in the booth, a proposal's whole title, the bible's rules in Memory and an error's code. Godot's labels let the mouse through, so none of them ever appeared. The show at the top of the rail says its whole name when it is cut short.
- An empty check box is an outline you can see (Godot's own was a dark square on a dark button, 1.2:1), and a ticked one is filled in the accent: in the inspector's "Ends framing" and "Frames", Memory's settings and everywhere else.
- Every small heading over a group is in capitals, as "NEXT STEPS" and "PREVIEW" were: the timeline's "Inspector", the script's "How the director reads it" and the writing assistant's headings were in lower case beside them.
- Each kind of document has an icon of its own: a prop a mug, an effect a bolt, a pattern a grid of four. A prop had the set's box, and effects and every pattern had the sparkle that stands for the showrunner everywhere else in Studio.
- A switch can be seen, on or off: Connect Claude's "Also use my plan for Studio's chat" and the welcome screen's update check had Godot's own, which off was a dark track with a speck of a knob, read as a bullet after the words. Off is now a grey knob on a grey track, on a white knob on the accent, drawn at full size (27 by 16): the cap on a button's icon shrank it to 16 by 9, smaller than the words beside it.
- An open dropdown ticks its chosen item in the accent and leaves the others clear, as the shot menu does its setup and size. Godot drew a dark disc beside every choice and a white ring on the chosen one.
- The inspector's choices all start with a capital: Emotion "Excited", Volume "Loud", Hand, Speed, Gait and Posture read as Move and Comes in already did, not "excited" and "loud".
- In the timeline's inspector and in a document's details, each field's name now sits on the same line as its value (and the lock beside it); names sat a few pixels higher.
- On a Mac the shortcut sheet says Option and Cmd in what each row says too ("Option: no snapping", "Cmd-click"), not only in its keys.
- A thing on someone's head or shoulder, said of how they are ("The Captain stands in the middle of the bridge, the sock on her head", "with a parrot on his shoulder", "wearing a sock on his head"), is there from the scene's start. The thirty-ninth watch-it's last scene lost the sock that had landed on her two scenes before.
- "In the middle of it", "the centre of the room" and "in the middle" put someone on the mark the set calls its middle, standing or walking there, as "the middle of the bridge" did. On the Boxwood's bridge the Inspector stood behind the command lectern instead. The middle of a piece ("the galley table") is still the piece's.
- A thing dropped in from above falls the way it will land: at its true size, lying when it
lies down, its grip coming down where it will be worn or placed (a flight's
resting, Timeline 1.20). The thirty-ninth watch-it's sock fell standing on end and a third bigger, and lay down across the Captain's head only as it landed. Into a hand, it falls as it will be held. build_setchooses a pattern when none is named, as the missing-asset pass does, from the set type, name and a newdescription, and its proposal says which and why. Two new sets of one type planned in one outline no longer both take the one pattern no room looks like; the second takes another, and when none is left itsset.same_kindnote says whose each pattern is, counting sets still waiting in proposals.
0.2.0
50 changes: 30 added, 1 changed, 19 fixed.
Studio grows into a full editing room: a stage view to reblock a scene by dragging, an inspector and NLE-style cutting on the timeline, show memory and a writing partner in the writers' room, a recording booth for real voice actors, and the web edition with each person's own Claude key. Linux packages are published here; the release workflow builds Windows and macOS too.
Added30 changes
- The showrunner chat, Write with Claude, the model director and show memory work in the web
edition, on your own Anthropic API key. Connect Claude (in the show menu, the palette, the
chat, or Write with Claude) takes the key, checks it with Anthropic for free, and the service
keeps it encrypted for your account only; it shows you the last four characters and what you
spent this month, and lets you replace or remove it. The chat works at once, with no reload.
A Claude subscription's sign-in token is refused, and a Claude plan is never offered on the
web. An admin can set each person a monthly cap in the admin panel, which also shows who
connected Claude and what they spent (never the key); show.json's budget applies as on the
desktop. The service needs the secret
KEY_ENCRYPTION_KEY(32 random bytes, base64) to keep keys, and its admin panel says so when it is missing. - A thing can drop in from straight above where it lands (PropCue
fromAbove, EpisodeIR 1.43). It hangs just out of the top of the picture of every shot its fall spans, then falls into the shot faster and faster onto a head, a hand, a piece of the set or into another prop. "A sock drops onto the Captain's head" does so when nothing on stage is over her, and so do "falls from above", "flutters down from the vent overhead" and the like with nothing there; "drops into the bucket" no longer stands it in the bucket from the start.edit_episode'sset_propcan make one. The thirty-ninth watch-it's sock came in through the door, so its showrunner had it arc off a pipe across the bridge. - A second ship's bridge that is not the Marigold's. The demo show has a new bridge pattern,
pattern.set.patrol_cutter: the spotless bridge of an official ship, with a wide viewport, a command lectern where the officer of the watch takes calls, duty consoles under wall screens, the Board's banners and seal, and no clutter. The thirty-ninth watch-it's Boxwood, the Licensing Board's patrol cutter, came out as the Marigold's bridge with a kettle on the shelf. The missing-asset pass now picks among the patterns that build a set type: the one the outline's name and description say most about, else one no set of that type in the show looks like yet, else the catalog's.build_set'sset.same_kindnote fires only when the pattern is the one the other room looks like, and names the patterns of the type no room looks like yet. - Studio opens a show on a dashboard: the Show section. It has the show's poster (its cast,
lined up), title and premise; its episodes as cards with a still, their running time and
how far each has got (an outline, a script, directed, voiced, recorded, rendered), a click
from its script or its timeline; the next steps, each with the button that does it (review
a proposal, make the character, set or sound an episode needs, voice its silent lines,
finish recording, direct a script, write an outline's script, render a preview, look at
drift, update the show's memory); and your latest decisions with their pictures. New
episode, Write with Claude, Render and Record lines sit under the title. Every part shows
as soon as its answer comes and keeps itself fresh as the show changes. The session
protocol's new
episodes.statussays how far each episode has got without rendering anything. - No view is a dead end any more. An empty Cast offers to create your first character, an empty Sets your first set, Episodes your first episode, the Timeline with no episode a way to get one, and the booth on an episode with no lines its script. An outline from the writers' room with no script yet now shows in Episodes, with Write the script. "Ask the showrunner" puts the request in the message box for you to send.
- A short tour the first time Studio opens a show: five marks on the rail, writing a script with its read-along and Write with Claude, the timeline's inspector, the showrunner, and Ctrl+K and Ctrl+/. It covers nothing, Skip ends it, and "Show the tour again" in the palette or at the foot of the shortcut sheet brings it back.
- Reelwright installs on Windows and macOS, as it does on Linux, with everything it runs on
inside. Windows 10 and 11 get an installer that needs no administrator: it installs into
%LOCALAPPDATA%\Programs\Reelwright, adds Reelwright Studio to the Start menu and, unless you untick it,reelwrightto your PATH, and Settings > Apps uninstalls it; or a.zipto unpack anywhere. Macs get one universal app for Apple silicon and Intel on macOS 13.5 or later, in a.dmg, with the command line inside it (Reelwright Studio.app/Contents/MacOS/reelwright). Neither is signed yet: Windows' SmartScreen wants More info, then Run anyway; macOS wants Open Anyway in System Settings > Privacy & Security, orxattr -dr com.apple.quarantinewhen it calls the app damaged. Each release tag now builds all three platforms on GitHub's runners and tests each package on its own platform before it is collected with itsSHA256SUMS(.github/workflows/release.yml). - Switch between shows any time, at no cost. Ctrl+Shift+O (or the show at the top of the
rail, now with its picture) lists your recent shows, the open one first: each with its
picture, its folder (your account on the web), when you last opened it and what changed
since (proposals waiting, renders finished, an unsaved script). Type to filter, Enter
opens, Shift+Delete takes one off the list; Open another folder…, New show… and Try the
demo show follow. The show you leave keeps running: its render, voicing or chat reply goes
on, Studio says when it finishes ("Render of “The Lighthouse” finished in The Night
Watch.", with Open), and switching back is instant, on the same daemon. The last two shows
you left stay warm and are put away after ten idle minutes, never while they work. Each
show comes back where you left it, after Studio restarts too: the section, the document or
change open, the script with its unsaved text (kept as that show's draft and marked
unsaved; nothing is written until you save), its caret and scroll and the writing
assistant beside it, the booth's line, the timeline's episode, playhead and zoom, and the
chat. Switching no longer asks you to save a script first. A
show that cannot open says why and leaves you where you were. On the web edition each
show's place is kept in your browser, and the service keeps the show you left running
(two a person, four warm in all), so switching back there is instant too.
tools/switch-watch.shproves it end to end against the real daemon. - Every key Studio answers to is on one sheet: Ctrl+/ or F1, or "Keyboard shortcuts" in the palette. It lists them by where they work (Studio, the timeline, the script editor and its writing assistant, the recording booth, the chat, changes and pictures), with a box that finds a key or what it does, and says Cmd and Option on a Mac.
- A stage view on the timeline: the scene's set from above at the playhead, beside the picture or instead of it (Picture, Stage or Both in the timeline's header; V cycles them, and each show keeps its choice). The set's pieces and walls, its marks and its cameras; everyone in their timeline color, facing where they face; props where they stand; the shot's camera and what it sees; the 180° line; and the shot's walks. It follows the playhead and plays live. Drag someone onto a mark to move them there: a walk from the playhead, or, before anything happens in the scene, where they start. Drag the knob ahead of them to turn them toward someone or something, and the camera round what it frames to orbit it (a setup's shot becomes a framing). Each drop is one edit, undone with Ctrl+Z, shown as a ghost while you drag and refused in the core's own words when it cannot apply. Click someone, a prop or the camera to select their cue or the shot on the timeline; select a block and its subject lights up on the stage. The wheel zooms, a drag pans, and Fit shows the whole set. It reads only the compiled timeline and the set, so it works in the browser too.
- Drag several blocks on the timeline at once. Shift- or Ctrl-click to select them, then drag any line, action or sound among them: they all move by as many frames, each drawn where it goes as you drag, snapping by any of their edges (Alt places freely), and the drop is one change that one Ctrl+Z undoes. A click on one of them selects it alone; the end of an action and a cut still drag on their own.
- Easing you can see. A camera move's inspector picks its easing from curves drawn beside
plain names (Linear, Ease in, Ease out, Ease in-out, Back, Elastic, Bounce, Hold, then
jump), each saying what it does, or the style's own, named for the curve the style gives
it. A posture change's easing is picked the same way, and
edit_episode'sset_posturetakeseasing(stylefor the style's own again). The Camera lane draws the curve each move really plays, read from its compiled keys, and a shake as a jitter that eases off. - Markers on the timeline. M marks the playhead, Shift+M and Alt+M go to the next marker and
the one before; drag a marker to move it, double-click it to name it, right-click it to
delete it. Markers are kept in the episode (EpisodeIR 1.42), pinned to the word or cue they
mark, so a re-timed line takes its marker along, and every change is undone with Ctrl+Z.
edit_episodehasset_marker, and the Timeline lists them (1.19). - A gesture is picked from the rig's own library in the inspector, each saying what it does and whether it can be held, instead of typed. What any cue is timed from is picked there too: after or with which cue, on which word of a line, or at a time, and it stays where it plays.
- Camera moves are made on the timeline. A shot's inspector picks its move from the
style's, with how far it goes, its easing, when it starts and how long it lasts, and for a
framed shot the framing it ends on: a size, whom, a turn and a height. The Camera strip
under the shots draws each move's keys and easing; drag a key to retime the move, click it
to see the move there and scrub it live. EpisodeIR 1.41 adds
Move.to, a move between two framings, which the compiler solves at both ends and eases between at every frame, swinging round the subject on a turn. - Transitions are picked on the timeline. A shot's inspector chooses how it comes in from
the transitions its style allows, and for how long; the Shots row draws the overlap where
the shot before still shows.
edit_episodehasset_transition. A whip is a whip now: both pictures swing off as one smeared strip, where it played as a dissolve before. - Cuts edit as an editor expects. Drag a cut to roll it: it lands on the frame you drop it
on, snapped to where lines, captions, business and sounds start and to the playhead (Alt
places it freely), and it is anchored on the word there, so a line re-timed later takes the
cut with it. Drag a shot to slip it along the performance, both its cuts moving. S splits
the shot under the playhead; with a shot selected, [ and ] trim its head or tail to the
playhead. A shot's menu and the inspector remove its cut in, keeping either shot, and the
inspector rolls its cuts in and out by number.
edit_episodehasroll_cutandslip_shot,split_shottakesatSec, anddelete_shottakesfill: "after". - The timeline is a precise editor. Click a block to select it (Shift- or Ctrl-click for several) and the inspector beside the picture says what it is and shows every property an edit can change: a shot's size, setup, subjects, turn and cut; a line's emotion, intensity, pace, volume, note to the actor, pause and caption, with the take it plays; a sound's sound, source, gain and start; an action's own settings, when it starts against what it is timed from, and how long it lasts. Each change is one edit, your own, undone with Ctrl+Z. Drag someone's business or a sound along time to move it, or its end to make it last longer; drags land on frames and snap to cuts, the playhead, and where lines and caption cards start and end (Alt places freely). Comma and period nudge the selection a frame (ten with Shift), the arrows walk the blocks, Delete removes a cue, Enter goes to the inspector. The inspector folds away, and Studio remembers it. Looks are on the Action lanes too.
edit_episodeset_timingre-times any cue and keeps what it is timed from:bySecmoves it against its anchor (a gesture timed from a word keeps the word),attimes it afresh after or with another cue, anddurationSecsets how long it lasts where it has a length of its own. What is timed from it moves with it, and the answer names it; a cue timed from itself or from what waits on it is refused with why.- Each show remembers everything written so far, so later episodes keep its story, voices
and humor (
bible/memory.json, aShowMemory). Memory holds a synopsis of each episode with what changed for whom, each character's voice and catchphrases, the running gags and callbacks with every time they played and when they rest, the house style, world facts and open threads, each entry with the episodes and screenplay lines it comes from. When an episode is directed, a remember pass proposes memory's updates (or applies them, or does nothing, as memory's settings say): a deterministic pass that reads the scripts for free (it finds the Chief's "...I'm getting back down." in the Lighthouse and the "tape and optimism" callback across the Salvage Claim), then, when Claude is configured, a model pass that writes the synopsis and voice notes (show.json stagewriters_room, priced and billed like the director). Pinned, locked and retired entries are never changed by a pass; what it wanted of them is said in its proposal. Every writer reads memory within its token budget: the showrunner's context, the writers' room's answer to an outline, the script editor's writing assistant (for the scene at the caret), the newshow_memorytool and the MCP resourcereelwright://memory.remember_episodeandedit_memorypropose updates and the person's edits, and the session protocol hasmemory.list,memory.edit,memory.configure,memory.rememberand thememory.eventnotification. - Studio has a Memory section (Ctrl+7), on the desktop and the web edition alike: what the show remembers, grouped by kind with counts and searchable, the story so far by season, each gag with when it last played and whether it rests, and the theme's and bible's rules beside memory's own. Every entry edits in place and can be pinned, locked against the passes, rested, retired or forgotten, as your own change that Ctrl+Z undoes, and each source opens the episode's script at its line. Proposals to change memory wait at the top with Approve and Reject; Settings chooses what happens after an episode is directed, what is remembered and how much a writer reads; "Update from episode…" remembers one now. A show with no memory explains it and offers to build it from its episodes.
- A character can start in surprise. "Otto jumps.", "The Chief flinches", "jolts upright", "gives a start", "jumps out of his skin" and "Startled, she…" play a startle: a little hop, the shoulders up, the hands flung up, the head back, then it settles, with a surprised face unless the action names another. It comes at once, through a held pose or a gesture under way, and has no hand of its own, so whatever is held stays held. A jump that goes somewhere ("jumps onto the crate", "jumps up") is not one, nor "startles the Chief".
- Write with Claude in the script editor (Ctrl+I). Claude works as a staff writer in the
room. It can continue the script at the caret, rewrite the selection, punch it up or
shorten it, add physical business, write the next line for one of the cast, or write a new
scene from what you say happens. It writes in the show's voice and knows the cast, sets,
props and sounds, the bible, and what earlier episodes established. It also writes what
the director can stage. The suggestion streams in as it is written. The director reads
it before you see it, and anything it could not stage is sent back to Claude once. The
panel shows the suggestion, what the director stages for each paragraph, its notes with
one-click fixes, and the cost. Accept puts it in as one undo step, and only while the
script is as it was when you asked. Tone, length, boldness and the house voice are kept
per show. Calls are billed and capped by the show's budget like the director's. The
protocol has
assist.write,assist.cancelandassist.event. With no key, the panel offers to connect Claude. - One click fixes what the director could not act on. A note on a misspelled cue or set offers the cast member or set it most likely meant ("Use CHIEF"). A sound word the show lacks offers the nearest sound it has ("Use CLANKS"), or a sound made from the word itself ("Make the BLORP sound"): the word's family, a ring, a beep, metal, a thud, air, a hum, something wet, a zap or a pop, picks the recipe, and the word seeds its pitch, so the same word always makes the same sound. It is made as your own change and the script is read again at once.
- The script editor completes the show's own words as you type: after INT. or EXT. the show's sets, then the times of day their lighting answers to; a character's cue on a line of its own; a prop's name in an action; and a sound's noise in capitals ("PING"). What it offers is what the director will recognise, so a heading finds its set and a cue its character the first time. Nothing is offered inside dialogue.
- Real actors can voice an episode. Studio's booth, opened from a line in the timeline's
inspector ("Record a take", "Takes…") or an episode's "Record lines…", shows a prompter (the
line, who says it and how, the line said before it, the actor's note), counts in, records from
the microphone with a live level meter (Space starts and stops, Esc drops a take), and goes
through a character's lines with Previous and Next. Each take shows its waveform, plays
alone or against the picture from just before the line, and can be chosen; a recording can
be trimmed by dragging its ends, stepped 3 dB, normalised to the synthetic voices' -18 LUFS,
cleaned of room noise, or deleted. The chosen take is the line's
take, so lip sync and timing follow the recording and the timeline compiles again with the line as long as it; recorded lines carry a small mic there. Recordings are kept with the show inaudio/takes/, named by their hash, with provenance that says who read them and when, and every trimmed or gained version is made from the recording, so it can be made again. The core checks what it is sent (16-bit PCM WAV at 44.1 or 48 kHz, 0.3 to 120 s, not silent) and says why it refuses. New session methods:takes.list,takes.upload(a recording in pieces that fit the socket),takes.add,takes.choose,takes.deleteandtakes.edit;episode.playbackplays a take that is not chosen yet, andepisode.timelinenames the recorded lines. The booth records in the browser too, where the browser chooses the microphone and applies its own voice processing. Studio now mixes at 48 kHz and has microphone input on; macOS builds ask for the microphone. - The script and the timeline are linked both ways. From the script editor, Timeline opens
the episode with the playhead where the caret's paragraph plays. On the timeline, a
double-click on a line, a sound or someone's business opens the script at its words.
episode.timelinenow says where each paragraph and line of the screenplay plays and which cues it became; a paragraph rewritten since the episode was directed links nowhere rather than to the wrong lines. - Studio runs in a web browser as the client of the hosted Reelwright service.
tools/web/build-studio.shexports it (out/web-studio/: the single-threaded web build, so no cross-origin isolation headers, on the Compatibility renderer, with gzip and Brotli copies) behind a dark loading screen of its own, andreelwright hostserves that folder at/studio/. In a browser Studio asks the service whose show to open (/api/session, or the sign-in page when nobody is signed in) and speaks the unchanged session protocol over the page's/ws. The rail's show menu switches between the person's shows on the service, makes a new one or the demo, and signs out. Preview images, the playback job and its sound, and rendered videos come over/api/file; Watch opens a render in a new tab. Nothing that needs the person's own computer is offered there: no folder to open, daemon command, update check, problem report zip (the help page instead) or API key, and the chat says the showrunner is coming to the web edition. Live playback draws in the browser too.tools/web/dev-server.tsstands in for the service on this machine, andtools/web/shots.tsdrives the page in headless Chromium. - The web edition is at https://reelwright.diy/app, on the site's own domain. Vercel passes
/appon to the service on Fly.io, which now runs every route under a base path (BASE_PATH=/app): sign-in, the admin panel, Studio, the API, and the session cookie, whose path is/app. Health and the release downloads still answer at the root ofreelwright-app.fly.dev, so the download links already out keep working. Vercel does not carry WebSockets, so Studio opens its socket on the service's own origin (WS_ORIGIN) with a ticket from/app/api/sessionthat works once, for a minute, for that person and their daemon only; every reconnect asks for a new one. Studio finds the base path from its own page's address. The home page says the web edition is open to invited people, and the header and footer link to its sign-in. - Your own Claude Pro or Max plan can make the show, within Anthropic's terms. Connect Claude
in the desktop Studio offers two ways: an Anthropic API key, pay as you go, or your plan,
which "runs the Claude Code installed on this computer, signed in with your own account.
Reelwright never sees your login." A checklist shows Claude Code installed, signed in with
your plan (Sign in opens Claude Code's own
claude auth loginin a terminal), Reelwright added for the show, and then opens the show in Claude Code. The same steps arereelwright claude status|connect|disconnect|login|open;connectrunsclaude mcp addin the show's folder with this Reelwright's absolute command, for an AppImage, an unpacked release or a checkout, and writes nothing into the show. Claude Code asks before every decision (the decide tools carryanthropic/requiresUserInteraction), and what it proposes appears in Studio as it is made.claude status --showprints the Claude Desktop config. Studio's own chat can run on the plan too (serve --claude-plan, through an unmodifiedclaude -p), but only when you turn it on, with what that means said beside the switch; the web edition never offers it. See docs/design/claude-plan.md.
Changed1 change
- The API-key path refuses a Claude subscription's sign-in token (
sk-ant-oat…) wherever it turns up, pasted or inANTHROPIC_API_KEY, the key file, the Keychain orANTHROPIC_AUTH_TOKEN, and says how to use a plan instead. Such a token is never sent.
Fixed19 changes
- On the web service, no tool reads outside the person's own show. A sound preview takes only a sound's id, a screenplay is read only inside the show, and a picture is imported only from inside it (the desktop still imports from anywhere). Before, a crafted path could reach another person's pictures, script cues or sounds.
- The timeline's viewer is never empty while the frame at the playhead is drawn. It keeps the last picture, dimmed, under "Drawing frame 200…", until the new still comes; after an edit that took seconds of blank viewer. A still that cannot be drawn or read says so.
- The web edition's show menu no longer closes the moment it opens. The person's shows, asked for on opening, came back while the click was still held, and the menu was rebuilt under it even when nothing had changed; on a fast service most clicks after the first shut it at once. The same shows leave it alone, and it is fitted inside the window once the click is over.
- A prop that lies down (a sock, a wrench) lies across the top of a head it lands on, as it lies on a shelf. The thirty-ninth watch-it's sock stood on the Captain's head on end, like a periscope.
episode_needsandfill_needsno longer throw when the screenplay's heading names a new set the outline plans but nobody has built yet.- The web edition's show menu stays inside the window when the person's shows come in while it is open. Opened at the foot of the rail, it grew past the window's bottom, so a show made in another tab sat below its row until the menu was opened again.
- Nudging several blocks moves each as far. A gesture timed on a word of a selected line, a line after a selected one, or a cut on its words moved with it and then again by its own edit, twice as far; the timeline now sends only the edits of the blocks the others wait on.
- The Camera lane drew a move with no easing of its own as easing in and out, whatever the style gives it, and a shake as a camera travelling. It draws what the compiled move plays.
- An insert on a thing with a face (a screen, a console, a sign, a clock) is never shot from behind. The set's own close camera or the solver's angle has to see its front within 60°, or the moment keeps its own shot. The thirty-ninth watch-it's main screen could only be shot from its back.
- The web edition's live picture looks like the desktop's stills. It was 30 to 50 levels lighter: the browser's renderer reads a shader's colors as sRGB, where the desktop's reads them as linear, and adds the key light's pass to the rest in sRGB. The shaders now do their color math in linear on both, and the frame of a still and the same frame played in the browser agree within about two levels on average. The desktop's renders do not change.
- Painted backdrops (a set's sky from the asset store) show in the web edition's live playback. The browser looked for the image on its own disk; it now reads it over the service first.
- Live playback in the web edition no longer fills the browser's console with WebGL warnings ("element array buffers can not be bound to a different target") as characters talk, nor keeps a mouth's old triangles. The engine updated a reshaped polygon's triangles through a buffer target WebGL refuses; characters' polygons now draw as new meshes there.
- Switching shows on the web no longer sends Studio back to the show it is leaving. A socket
that dropped mid-switch asked the service for the session, which named the show being
left and made it current again; it now names the show being opened.
tools/web/dev-server.tskeeps the show left running as the service does, and no longer starts a second daemon for the same show when two requests come at once. - The welcome screen shows each recent show by its picture, as the switcher does (where it was left on the timeline, or its style), instead of a folder icon.
- The script editor no longer pushes the showrunner chat off the window's edge. On a 1440-wide window (reelwright.diy/app) a long episode title and four labelled buttons made it wider than its room. The title now ends in an ellipsis, and below 760 px Save, Reading and Write with Claude keep only their icons, with tooltips.
- The show's name is in one place in Studio, at the top of the rail. The status at the rail's foot says only how the show's daemon is doing ("Connected", "Starting…").
- The heuristic director no longer gives up on a whole episode over the placeholder wide it times the performance under. On a set with no establishing setup it used the first setup, and a rolled one broke a level style's grammar, so nothing was directed. That compile now skips film grammar; the real coverage is still judged.
- A gesture's verb written in capitals ("She TRIPS", "Otto JUMPS") is done big, and no longer also asks for a sound the show does not have.
- A proposal made by another process on the show, such as
reelwright mcpunder Claude Code, reached a running Studio only when something else refreshed it: the studio's watcher skipped.reelwright/. It now watches the change files there and says each change once.
0.1.0
386 changes: 177 added, 16 changed, 193 fixed.
Added177 changes
The first release: Reelwright Studio 0.1.0 for Linux x86_64, as an AppImage and a
.tar.xz, on reelwright.diy/download with each one's size and SHA-256. Windows and macOS follow.The web service hands out the desktop release:
GET /releases/<version>/<file>serves a version's packages and SHA256SUMS from<data>/releases/<version>/to anyone, as downloads (Content-Disposition: attachment, a year's cache, since a version's files never change), with HEAD and byte ranges so a broken download resumes, and nothing but a plain file name inside that folder. reelwright.diy is a static site with no room for 200 MB files, and the repository is private, so its downloads page links here.Reelwright as a web service (
reelwright host, docs/design/m12-web-service.md): sign in with a six-digit code sent by email, invite-only, with an admin panel to add, invite, promote, disable and delete people and an audit log. Each person gets their own shows and their own session daemon on the server, and the web Studio reaches it through/ws, with their previews, sound and renders served from/api/fileand nobody else's. Accounts live in SQLite through Node's built-innode:sqlite.tools/host/deploy.shbuilds an image with the pinned Node, Godot, ffmpeg and Rhubarb and deploys it to Fly.io, where it runs at https://reelwright-app.fly.dev and renders previews on lavapipe.The timeline shows what everyone does. Under the captions, each character has an Action lane of their walks, postures, gestures, faces and props, and the set one of its lights and effects, in the show's own words at the frames they happen. Sound blocks are named ("scanner ping") instead of showing only their gain, and a narrow line names its speaker.
The script editor reads the script as you write it. Beside the text, Studio says what the director will stage for each action paragraph and line, in the show's own words ("Otto walks up to the movie screen · Otto touches the movie screen"), which paragraphs it does not act on, and what it cannot do, flagged in the gutter too (a sound the show lacks, a heading that names no set). It reads again a moment after the typing stops; a card takes the caret to its lines. Forty-one watch-its found the director's misreadings only once an episode was directed and watched. The daemon's
screenplays.readanswers it, for the web edition too.Marks on the set (DamageCue, EpisodeIR 1.40, Timeline 1.17): a crack, a scorch, a dent or a stain on a piece of the set, spreading from its spot and there until it is mended, scrubbed off or the scene ends. A crack across a window's glass is a pale shattered web, one in a wall jagged ink lines; a scorch is soot rising from a burnt-black middle; a dent a shadowed hollow over a lit lip; a stain a splash with drops, in the color of what was spilled. They are lit with the set, a lighting change included. The director reads "a crack spreads across the porthole", "sparks scorch the wall black", "kicks the door and dents it", "coffee splashes all over the helm console", "wipes the coffee off" and "patches the crack", and "touches the crack" walks up to its piece.
edit_episode'sset_damageadds, changes or takes one away. The twenty-fourth watch-it's crack in the dome was a prop lying on the floor that nobody could reach up to.build_setsays when the set will look like another of the show's: a second room of a kind the show already has (another ship's bridge) comes out of the same pattern much like the first, so it suggests a pattern of its own withcreate_set_pattern. The thirty-ninth watch-it's Inspector called from a ship whose bridge was the Marigold's, kettle shelf and all.write_screenplaysays where a draft's time goes: its five longest paragraphs and lines, in seconds as the heuristic director would cut them. The hiccups watch-it's showrunner copied the whole show to time each draft through the CLI, since the answer gave only the total.Someone can get inside a prop (PostureCue
inside, EpisodeIR 1.39): in where it is as they get down, out of sight there until their next move or posture brings them out. "Otto hurries over to the barrel and crouches down inside it" hides her in it, and "climbs out of the barrel" stands her up there. The twenty-seventh watch-it's Otto crouched beside the barrel in plain view.A look, a gesture or a line's
lookAtcan name a prop (EpisodeIR 1.38): the eyes go to it wherever it is, in a hand, set down, in flight or riding another prop, and follow it as it moves. "Otto turns and stares at the compass", "the Chief watches the robot come round" and "the Captain pats it on the head" do so, andedit_episode'sset_lookandset_gesturecan aim at one. The thirty-seventh watch-it's looks at the compass and the robot made nothing, so its showrunner turned them to where things had been. "The lucky compass clamped in its arm" now rides the robot.A walk can go up to a prop (
MoveCue.toprop., EpisodeIR 1.38): where the cues before leave it, up close to it on the floor and facing it, or up to whoever holds it. The director sends someone reaching for a thing on the floor there rather than onto the mark it stands on: the thirty-seventh watch-it's Captain stood on the robot to take the compass. edit_episode'sset_movecan do it too.A prop can go round someone in a circle (PropCue
around,turns, EpisodeIR 1.37): out to a circle about them, round it, and back where it began. "The robot zips round her in a circle" and "spins in circles around the Captain" do so, andedit_episode'sset_propcan make one. The thirty-seventh watch-it's showrunner looped its robot round four marks it added to the bridge.A line said on the move plays in a close shot that pans with the speaker when no still angle keeps their face: the thirty-sixth watch-it's Otto whispers her line on her way to the counter in an MCU that turns with her. Without pans in the style, a wider still shot.
An insert can frame a prop (camera
insertwithprop, EpisodeIR 1.36), where it stands as the shot starts and in the state it is in then. The director cuts to one for a reveal said of a prop with no hands on it: "The soufflé has risen perfectly" shows the risen soufflé whole in the oven. The thirty-sixth watch-it's reveal had no close shot, and Otto blocked it in the wide.edit_episode'sset_cameraandsplit_shotcan now make an insert on a set element or a prop; before, nothing could.An effect can be aimed at a prop (FxCue
towardprop., EpisodeIR 1.35), at its middle wherever it is. "He sprays foam at the oven" aims the foam at the oven, and "at the counter" at the counter. Someone spraying sprays out of what they hold, with its sound: the thirty-sixth watch-it's foam and WHOOSH came out of the Chief's chest, at nothing, and its showrunner aimed every spray by hand. Things fall to the floor where they fell from, on the room's side of the furniture where the camera sees them, each piece its own spot: "the chess board slides off the console and the pieces CLATTER across the deck" drops the board beside the console and scatters every piece around it, toppled (PropCue place
floor, EpisodeIR 1.34). "The pieces" and "the chess pieces" are the whole set but the board. The thirty-fifth watch-it's showrunner placed and flew all six by hand, since "falls off the console" flew the board out through the door and "Meteors streak past … with a WHOOSH" asked for a prop called "meteors streak past".Everything can shake: "the whole ship shakes", "the bridge lurches violently", "an explosion rocks the station". The heuristic director makes a shake cue (EpisodeIR 1.33), harder or softer as the words say and longer when it keeps on. The compiler puts it on the scene (Timeline 1.16), and the engine shakes whichever shot plays, across cuts. The thirty-fifth watch-it's meteor storm shook nothing.
Storyboard on each episode in Studio: a still of every shot, to look over without rendering. Episodes opened only on the timeline, one still at a time.
Studio's chat knows what you have open. A message carries the script and the lines selected in it, the episode and shot at the playhead, or the document open, so "make this one older" means the character in front of you. The chat says what it will send over the message box, and × leaves it out. Its suggestions are about your show: what it still lacks (a cast, a set, a first episode), then its own characters and sets by name. They offered to make the Marigold's Chief older in every show.
Ctrl+K in Studio finds any document, script, section or command by a few letters of its name and goes there.
New show on Studio's welcome screen: a show of your own from the Marigold kit, its theme, styles and patterns, with no cast, sets or episodes yet (
reelwright init <dir> --starter --title <title>). With New character, New set and New episode, a show goes from nothing to an episode playing with voices, and no API key.New character and New set in Studio's Cast and Sets sections. Pick one of the show's patterns, how many characters or what the set is called, and it is drawn with the seeded sampler, free and with no model, then opened. Before, only the showrunner could make one.
Write an episode in Studio. Episodes has a script editor for each screenplay, Fountain colored as you type; New episode starts one from a title, set on the show's first set with two of its cast. Direct turns it into its episode with the heuristic director, free and with no API key, and Timeline shows it to play. Screenplays not directed yet are listed too: the demo's "The Salvage Claim" had never shown anywhere. Voice N lines on the timeline gives the new lines their voices on this computer, free, so it plays with them.
Play an episode in Studio. Space on the timeline plays it live with its sound from the playhead, the playhead following; K pauses, L plays, J goes back three seconds, and the arrow keys step a frame. Once it has played, every click on the ruler shows its frame at once. Before, the only way to watch an edit was to render the whole episode.
Messy faces. Soot from a blast, sand from a gust, snow from a snowball or cream from a pie stays on a face until it is wiped off: a sooty face keeps its white eyes, sand is gritty, and a faceful of snow hides the eyes. The director reads a snowball thrown at someone as a hit in the face, sand sprayed in a face, "his face black with soot" and "wipes the snow from her eyes";
set_messputs it on or wipes it off by hand. The thirty-second watch-it's Chief got a faceful of sand that left no trace.The heuristic director throws "a snowball", not the giant snowball, lands one that "bursts on his wall" on the wall, picks up what someone throws when it is not in hand, and does not start the snowfall for a "snow wall". It puts on a hat named in someone's introduction and knocks it off to their feet, puts a whistle to the lips, turns everyone "and" names, looks up at the sky, and lands "beside him" at his feet. The thirty-third watch-it's showrunner did all of it by hand.
An effect holds its scene 3 s at most, and stops with it: a 15 s snowfall stretched the last shot.
set_propcan clear a field (unset) and throw into a face.People walk up ramps and over dunes. A kit piece marked
walkOn(a ramp, a platform, steps, a dune) is walked on rather than round: a mark over it stands on its top, and a walk across it climbs and comes down its surface. The thirty-second watch-it's showrunner laid the Marigold's ramp almost flush with the sand, as nobody could walk up a slope.The heuristic director plays the show's own effects told by name: "Rain DRUMS on the tent" rains on the set's ground all night (or until "The rain stops"), its drum with it; "A drip lands on the Chief's head" drips on him; "Lightning flashes" flashes the set's lightning preset for a moment. Thunder comes from no one. It also reads "He scoots over" and "squeezes in beside him". A show's looping effect given no length plays to its scene's end. The thirty-first watch-it's showrunner put in every drop of rain, every flash and every drip by hand.
The heuristic director reads a treasure hunt: a sound said again comes from where it came before ("And BEEPS."), "It CREAKS" from the thing just handled, "faster and faster" quickens a repeated sound, a thing dug up is buried until it is taken up, "holds it up high" lifts it overhead, a detector swept in is held from the entrance, "a rusty box sits on the crate" stands it there, and "a stream of sand whips out of the rusty box, straight into the Chief's face" plays the show's sand out of the box at him while the gust's sound comes from no one. "Walks out onto the dunes" no longer walks off the set, and "he spits" is disgusted. The thirty-second watch-it's showrunner fixed all of those by hand.
A door cut in a set piece's panel no longer counts as wall to the sight and headroom checks: the thirty-second watch-it's Otto, in the ship's open hatch, had her head "in the hull".
Inside a piece too low to stand up in, people walk crouched: the engine draws a crouched walk as a shuffle on bent legs, the hips kept low, and the compile keeps a walk between two places inside a tent crouched when standing would put a head through its roof. The thirty-first watch-it's Chief stood up through the roof to cross to the dry corner.
A long sound effect no longer holds its scene open: a scene waits at most 2 s for a sound that plays once, and the rest of it fades out as the scene ends. The thirty-first watch-it's 20 s rain held its scene open for 8 silent seconds.
blocking.head_in_piecewarns where someone settled inside a piece of the set has their head in its roof or boards: the thirty-first watch-it's Chief sat at the far end of his bedroll with his head through the tent's low eave, and only a still showed it.A walk between two marks of the same piece (both name it their
seat) stays inside it: from a tent's bedroll to its dry corner, not out through its side, round the back and in again, as the thirty-first watch-it's Chief walked for 18 s until its showrunner drew walkways inside the tent.A face inside a piece of the set made from a recipe (a tent, a bunk, a booth) is hidden where the camera's line passes through the piece's own canvas, boards or walls, not seen as if the piece were air. The thirty-first watch-it's single of the Captain looked at her through the tent's roof; the heuristic director now turns to an angle through its open front, and
grammar.subject_hiddensays so when nothing can.An effect whose
maxParticlesstops an emitter before half its rate's span is a warning (fx.capped) that says when it stops and what to raise it to, and the schema says that it caps what the emitter makes in a run, not what is alive at once. The thirty-first watch-it's showrunner read it the other way, and its rain ran dry within a second.Scooting along a bench or a bedroll slides over sitting down: a move between two marks of the same seat, sat or crouched on alike and at most 1.2 m apart, no longer stands up, shuffles over and sits back down.
An effect can land on top of someone's head (
FxCue.parthead, EpisodeIR 1.31;set_fxpart), not only come from their chest: the thirty-first watch-it's drip fell from the Chief's chest until its showrunner raised it, and then splashed above Otto's head. The heuristic director puts what lands on someone ("A drip lands on the Chief's head", "drips: on Otto") there.edit_episodeset_expression: add, change or remove a face someone pulls. The thirtieth watch-it's showrunner could take out the Chief's nod but not the amused face with it.paint_sky: a sky painted all the way round a set, from a description of it: its colors up and at the horizon, far land and hills, suns, moons and banded, ringed planets lit from the sun, clouds and stars. Reelwright paints it in flat, stepped color, CC0, with no image provider, and proposes it as a backdrop asimport_assetdoes. The thirtieth watch-it's showrunner painted its ringed planet in Python.A thing dropped on someone lying face up lands over their face (
Actor.worn[].onface, Timeline 1.14), stays there as they get up and comes off in a hand: the twenty-ninth watch-it's pillow sat on top of the sleeping Chief's head, past the end of his bunk, as he said "(muffled) That was a mistake." The engine rests it on the face as drawn while they lie and covers the face with it while they stand.A thrown thing can hit someone full in the face (
place: "face", EpisodeIR 1.30): it flies to their eyes and drops at their feet. The heuristic director reads a pillow fight: out of and back into a bunk, a pillow dropped on someone, a swing at someone with a thing, "It hits the Captain full in the face" after the Chief ducks, and "The lights CLUNK on". The twenty-ninth watch-it's showrunner fixed all of those by hand.try_action, a read tool: a few paragraphs of screenplay staged by the heuristic director on one of the show's sets, reported paragraph by paragraph ("char.otto walks to helm, and sits"; "nothing staged"), with the props and sounds it could not find. The twenty-ninth watch-it's showrunner read the director's source to learn which words it reads.episode_timingnow says what each cue does in the same words, so an edit can find its cue without opening the episode's file.Arm wrestling and handshakes: a
shake_handsgesture takes the other's hand halfway between them, andpinandpinnedbring a won grip down onto the loser's side. A hand joined to someone out of reach leans the body in, then moves it in, so two people seated across a table meet over it. The heuristic director reads "They grip hands" (the two the action was about, not the referee looking on), "shakes the Chief's hand", a poke "with her free hand" while the other is held, and "SLAMS his arm flat to the table" from the grip. The twenty-eighth watch-it's showrunner made the grip a dance hold aimed at a napkin, and the two fists never met."Otto and the Chief reach for the pie at once, and glare at each other": a gesture or a face is everyone the subject names, and reaching for a thing is a hand to where it stands. "On the table, a plate holds the last slice of plum pie" stands the pie on the table.
Music without a recording, looped and stopped:
create_soundmakes a tune asmusic.<slug>(audio/music/<slug>.sound.json), a music start withloop(EpisodeIR 1.28) plays it again and again until its stop, andedit_episodehasset_music. The heuristic director starts a show's tune from its word in the action ("a scratchy old WALTZ crackles out"), stops it dead with the needle's SKIP ("The waltz stops dead"), and plays it again when the record player is playing again. The twenty-sixth watch-it's showrunner made its waltz a sound effect, which played its ten seconds once.A cue whose sound the show does not have says so (
audio.no_sound) instead of playing nothing in silence.Dancing: a
dance_holdgesture takes a ballroom hold, a hand on the partner's shoulder and the free hands joined between them, and the heuristic director has two people who waltz somewhere face each other in it once both are there, holding it until either moves on. A twirl on the floor ("he twirls her under his arm") turns them on the spot: a drift with onlyspinno longer needs a float. The twenty-sixth watch-it's waltz was two people walking side by side.A sound a character makes is voiced: "Otto GIGGLES", "The Chief SNEEZES" and their like become lines in the character's own voice (LineCue
vocal, EpisodeIR 1.29), captioned[giggles], when the show has no recording of the word. The writers' room no longer asks for them. The twenty-seventh watch-it's showrunner synthesized the giggle and the sneeze as beeps.Hide and seek reads as written: a seeker counts at "the loading door" instead of walking off the set through the hatch, with both hands over her eyes (a new
cover_eyesgesture) until she sets off; she tiptoes round the hold, turns to the tarp when it sneezes, and the props' own state names ("tipped", "slipped", "covering") match the words that change them. A beat that waited for a walker no longer plays before what it follows: the twenty-seventh watch-it's giggle and barrel came before the SNEEZE.A carried thing can hide a face: film grammar warns when what someone holds (a record player's horn before the face of the girl carrying it) stands between the camera and a face it frames, and the heuristic director turns away from it. A recipe's size now leaves out what hangs from a part its params leave out, as the engine builds it: the confetti cannon, carried in the arms, measured two metres across.
A medium shot of someone lying down frames them. Lying, the head is no higher than the waist, and the size measured top to waist came to nothing: the camera stood on its own target and showed a blank frame of furniture.
write_screenplaysays why it gives no running time when the heuristic director cannot cut the script yet. The twenty-sixth watch-it's rewrite reported only its dialogue, and its showrunner learned its length once it was directed.A bare hand on something:
touchandpressgestures (GestureLibrarycontact) put the hand on what they are aimed at, as far as the arm reaches, where a point aims past it. The heuristic director reads "presses the button", "jams her thumb over the leak" and "pats the Chief on the shoulder", walking them within reach first. The twenty-fifth watch-it's Otto had no way to put her thumb on the leak, and gave it a thumbs-up.An effect can last until a cue (
until, EpisodeIR 1.27): the twenty-fifth watch-it's rain fell for a second while its sound rang on until the CLANG. The heuristic director gives a sound's effect the sound'suntil, and stops what goes on at the sound that stops it ("A loud CLANG. The rain stops."), not as its paragraph starts;set_fxtakesuntiltoo.See an effect before using it:
render_previewkindfxplays a show's effect from the top of a post on a plain dark stage, the camera as far back as the effect reaches, in six frames across its length, and Studio shows it with the effect. The twenty-fourth watch-it's showrunner could see its meteor only by reading frame numbers out of a Timeline and asking for stills, and its first version was nearly invisible.Streaks draw as comets: an effect's stretched particle is a round, white-hot head with its trail tapering and fading behind it, where it was a long star with half its length ahead of where the particle was.
episode_timing, a read tool: when each shot and cue of an episode plays, in seconds, of the episode or a proposal's version of it. The twenty-fourth watch-it's showrunner read cue frames out of Timeline files to time its edits.edit_episodecan take someone out of a scene's opening blocking (set_marktooffstage), to walk them on with a move that enters. The meteor watch-it's Captain started at the window, and no edit could take her off it.A prop can perch on a shoulder: the twenty-third watch-it's jellyfish "settles on the Chief's shoulder" and hung in the air beside his head, since a prop could go on a head and nowhere else on a body. A place
shoulder(EpisodeIR 1.26) puts it on one's own shoulder, on the side of the hand that held it, or flies or throws it onto someone else's, on the side it comes from; a scene's prop can stand on a wearer's shoulder from the start. The Timeline (1.13) says which shoulder (worn[].on), and the engine stands it on the shoulder as drawn, on a card or a 3D figure.Sound previews: a showrunner model cannot listen, so it could not check a sound it made (the twenty-third watch-it's read the files' waveforms by hand).
create_soundnow shows a picture of what it made, its waveform over its spectrogram in Hz against seconds, andrender_previewkindsoundpictures any of the show's sounds, recorded or synthesized, without the engine.Render and watch an episode in Studio: Studio could compile, preview and edit an episode but not render one, so nobody using it could watch their show. The new Episodes section lists each episode with its latest render and preview; "Render preview" (1280×720) or "Render" runs in the background service, which says the stage and the frames drawn as it goes, and can be cancelled; a finished render opens in your video player or its folder. The session protocol gains
renders.list,renders.start,renders.cancelandrender.event; a render goes wherereelwright renderputs it, so either lists the other's.Try the demo show: a first-time Studio had nothing to open but an empty folder. The welcome screen's "Try the demo show" makes a copy of the Marigold, the demo show every Reelwright carries, in Documents/Reelwright and opens it, so there are episodes to watch and change at once.
reelwright init <dir> --demomakes the same copy from a terminal, as a git repository whose first commit is the demo as shipped.Connect Claude from Studio: an installed Studio had nowhere to enter the Anthropic API key the showrunner needs, and its chat said to set an environment variable and restart the daemon. Now the chat offers "Connect Claude…", which checks the key with Anthropic (a free call), saves it readable by you only and starts chat; a refused key says why.
reelwright key status|set|forgetdoes the same from a terminal, and never prints the key. A daemon without credentials no longer claims chat in its hello.The plan for an installable Reelwright (
docs/design/m11-release.md, roadmap M11 and M12): Studio for macOS, Windows and Linux first, the web version as a service after it. Its first step: the core reads what ships with it from one resource root (the repository, orresources/beside an installed core, orREELWRIGHT_RESOURCES), and the product version isVERSION, whichreelwright versionprints. Its second: the core starts Godot itself (reelwright engine, whichtools/engine-cli.shnow runs), with no bash between, so it renders where there is none;REELWRIGHT_ENGINEruns an exported engine instead. The checkout's override.cfg is no longer rewritten on every launch, which made every launch import the project again. Its third:tools/release/build-core.tsmakes the core one executable (130 MB, most of it Node) with its resources beside it, andtools/release/smoke.tsruns it from an empty directory with nothing on PATH: it validates, compiles and directs the demo show, and its Lighthouse timeline is the same bytes as the checkout's. Its fourth:tools/release/build-studio.tsexports the engine project as Reelwright Studio for Linux, Windows or macOS (universal, signed ad hoc), from any host. The export is both Studio and the renderer: given a command it is the engine CLI, and given none it opens Studio, whose daemon is thereelwrightbeside it. An installed core renders through the Studio beside it;smoke.ts --studioputs the two in one folder and, with no Godot to fall back on, renders the Lighthouse's golden stills, which match. Its fifth, begun: the Linux release as a.tar.xz(tools/release/fetch-tools.ts,package.ts), carrying ffmpeg, ffprobe and Rhubarb, which an installed core finds in thetools/beside it before PATH, and every part's licences in oneLICENSES/(the engine CLI's newlicensescommand prints Godot's).smoke.ts --packagechecks it with no tool, Node or Godot of the machine's: the demo compiles with its recorded takes and two seconds of it render, mix and encode. The same folder is also an AppImage that opens Studio, or runs the command line givencli, under the reel from the site, now the app's icon.reelwright doctorsays whether Reelwright can make a show on this machine, check by check with the fix, and--reportwrites the zip a problem report attaches: versions, checks, document hashes and codes, never a key, a take or the show's text. An installed Reelwright fetches the pinned uv the first time it voices a line, and keeps Kokoro's environment in the user cache. Studio says, at most once a day and only while its switch is on, when a newer Reelwright is out (reelwright.diy/releases/latest.json), with a link to what is new. "Report a problem…" in Studio saves the doctor's zip without a terminal.A hat can be worn from the scene's start: a scene's prop at place
headwith awearer(EpisodeIR 1.25), worn wherever the wearer goes, in through a door too. The director reads "sweeps in, wearing an enormous tricorn", "whips a paper hat out of her jacket and puts it on", a gust that "lifts the tricorn clean off the Captain's head" and, after a cut, lands it "...straight down onto the Chief's head". A framing of someone with a hat on frames from the hat's top (the compile plans its props before its cameras). The twenty-second watch-it's showrunner reworded seven action lines to get round all of it, and its close shots cut off the tricorn.The site has a second screening, "Hat Day": 79 seconds the twenty-second watch-it's showrunner wrote, cast and propped (the Captain, her tricorn, Otto's paper hat, the vent and its gust, five sound recipes), directed from its first draft as written.
examples/showcase/hat-dayholds it,tools/site/showcase.sh hat-dayrenders and encodes it (showcase.shnow takes the showcase's name), andcore/test/showcase.test.tskeeps it compiling clean, the tricorn on the Captain and then the Chief.The site's showcase is "Night Watch", 70 seconds a showrunner wrote from a one-line premise and the heuristic director staged and cut untouched:
examples/showcase/night-watchholds what it adds to the Marigold (the Captain, the tray and mugs, sound recipes, the screenplay, the episode and its kept takes),tools/site/showcase.shrenders and encodes it, andcore/test/showcase.test.tskeeps it compiling clean.A character can stumble: a
stumblegesture pitches the body forward as the knees buckle, then catches itself, with no hands of its own, so whatever they hold stays held. The heuristic director reads "trips", "stumbles", "staggers" and "lurches" (not "the round trips"), and does a gesture whose verb is in capitals ("She TRIPS") harder. The twenty-first watch-it's Otto tripped with a tray in her hands as a crouch and a stand. What catches someone's foot, or what they trip over, lies on the deck where they trip: its cable was nowhere.A sound can come from a prop: an sfx cue's
sourcemay beprop.<name>(EpisodeIR 1.23), and its clip pans from wherever the prop is as it starts, in a hand, on a head, set down, in the air or on a tray (sfx.no_sourcewhile it is nowhere). The heuristic director sounds a prop's noise from it ("The wrench CLANKS"), and a sound alone from the prop the sentence before was about ("Otto's mug lands upside down on her head. BONK."). "The Chief's mug" opening a sentence is about his mug, not him.set_soundtakes it. The twenty-first watch-it's CLINK came from the Chief. An effect from a prop on a head now plays from it too: the prop plan had no point for a worn prop.A prop can go on a head: a place
head(EpisodeIR 1.22) puts it on the character's own with a put-down, or on the recipient's with a flight or a throw, and a pick-up takes it off. The Timeline says so asActor.worn(Timeline 1.12), and the engine stands it on the top of the head as drawn. The director reads "lands upside down on her head" and "puts the hat on his head". The twenty-first watch-it's showrunner had to hover Otto's mug at head height over her mark.An effect can play from a prop: an FX cue's
onmay beprop.<name>(EpisodeIR 1.21), and it emits from the prop's fx anchor wherever the prop is drawn, in a hand, in the air or set down (Timeline 1.11FxEvent.prop,propAnchorM). The heuristic director plays a spray from the prop that makes it: the seventeenth watch-it's confetti burst from the Chief's chest, not the cannon in his arms.set_fxtakes it.A prop can fly up against the ceiling and stick there: a fly's place
ceiling(EpisodeIR 1.20) puts its top at the set's ceiling over where it was, with no bob, until a cue takes it down. "Sticks to the ceiling" reads so; the twentieth watch-it's pancake bobbed under the ceiling like a drone.A prop can go in or on another prop, which carries it: a place
prop.<name>(EpisodeIR 1.19) on a scene's props and on a put-down, throw, fly or pick-up. It sits at one of the carrier's seat anchors (a toaster's slots), else on its top, on the floor of a pan's bowl, not its rim; on what already rides there, a stack of pancakes. The Timeline says so asrides(Timeline 1.10), and the engine draws it on its carrier in a hand, in the air or on a place. The heuristic director reads "a frying pan with a pancake in it", "toast sits in the toaster", "puts the mug back on the tray" and "drops onto his plate". The twentieth watch-it's pancake could not be in its pan, nor its toast in the toaster.The heuristic director flips a pancake: "shoots straight up and sticks to the ceiling" hangs a prop near the ceiling, "drops onto his plate" flies it onto the plate, "takes a big bite" (bites, eats, chews) lifts what is in hand to the mouth, and someone who walks to the table and sits down takes the stool's seat. Toast that shoots from nowhere named comes out of the toaster its paragraph names, which stands where the set's marks say it is.
What a scene leaves on its set is there when the next scene on that set starts: set down, tossed aside to no one (where the thrower stood), or never moved. The nineteenth watch-it's hold, its lights back on, showed none of the tin and cable its search had flung about.
The lights can change mid-scene: a lighting cue (EpisodeIR 1.18) lights the scene with another of its set's presets from its frame (Timeline 1.9
Scene.lightingChanges), and the engine relights the set and the props, turns the key and swaps the practicals. The heuristic director reads "Every light on the Marigold dies" and "The lights come on with a THUNK", opening dark the scene whose lights come back on, andedit_episode'sset_lightingtimed after or with a cue adds one. The nineteenth watch-it had to make the blackout and the lights coming back on each a scene of its own.edit_episodehasset_posture: the posture someone opens a scene in, or a posture cue added, changed or removed. The nineteenth watch-it's showrunner had no way to start the Chief crouched behind his console before "the Chief stands up".A prop can give light: a recipe anchor of kind light takes a
light(color, intensity, reach and cone, each an expression of the recipe's params) and apitchDeg, and casts a spot that lights the set and props it points at; a state that brings the intensity to 0 switches it off. A material slot of finishhazeis drawn see-through and unlit, for a beam or a glow in the air, honouring its color's alpha. The nineteenth watch-it's flashlight lit nothing, and its beam was an opaque cone."Puts the fuse into the socket" puts it on the fuse box the sentence went to: a part the set does not name ("the socket", "the slot") belongs to the piece named before it in the sentence. It had put the fuse nowhere.
The heuristic director stages the nineteenth watch-it's search of the dark cargo hold. "The Captain and the Chief follow" walks them out of the door, or in down the ladder, after whoever went first; the Chief, behind his console, starts crouched when he "stands up"; "He pulls out a ration tin" takes it from the crate stack he went to; the CLUNK plays after the fuse goes into the socket, not before; "The Captain sits on the crate" walks her to the crate first instead of sitting her on thin air by the tarp; "crouches behind the cargo winch" walks there and then goes down. A scene may name a new set by its id in the outline, and
write_screenplaysays how long the heuristic cut will run against the outline's target, not only how long the dialogue is.A prop can lie down:
rest: "lying"sets it on its side when it is set down or placed, a quarter turn round its forward axis with its middle over its place, and the hand reaches for its grip where it lies. The eighteenth watch-it's wrench stood on its end.The prop preview shows a prop's states: after it is held and set down, it changes into each of its states on the table, one cell each (up to six). The seventeenth watch-it's showrunner could check the cannon's smoke and confetti only in episode stills.
edit_episodecan take a shot off the set's camera:set_camerawithsubjectsand a size frames them instead of a setup, and on a framed shot changes whom it frames. A cue removed by anyset_*op no longer stays because something is timed from it: that is timed from what the removed cue was timed from. The seventeenth watch-it's showrunner added a cut for the one and left an empty walk in place for the other.create_fxmakes an effect: a showrunner proposes an FxInstance (particles in any of the ten looks, glows, a flash), checked for an id its file does not name, two emitters of one name, a span that ends before it starts, an emitter that emits nothing, one that starts after the effect ends, and a beam or shockwave the engine does not draw yet. The seventeenth watch-it's showrunner had no way to make smoke or confetti, so a cannon's were prop geometry switched on and off.The heuristic director reads more sprays: one told by what comes out ("Confetti showers down over all three of them") comes from the prop named last; with no one else acting, a prop the sentence names sprays it ("the cannon coughs a fat puff of black smoke straight into her face"); "fires", "showering" and the other -ing forms count. A held prop sprays from who holds it, one on a mark from the mark, and the engine's sparks play when the show has none. A sound that already shows the effect ("SPARKS spray across the deck") is aimed rather than doubled. The seventeenth watch-it's cannon sprayed nothing on screen.
A prop carried out of a scene is in hand in the next: the seventeenth watch-it's Chief hefted the cannon and trudged out of the engine room, then stood on the bridge empty-handed with it parked on the floor. A thing held as a state ("a mug of tea in hand", "the cannon in both arms", "comes in carrying the kettle") is held from the sentence's start, so the Captain walks in with her tea; "hefts" takes a thing up.
A show's own effects play: an FX cue can name an FxInstance (
fx.<id>), and the engine draws its particle and glow emitters and its flash (RwFxInstance), a pure function of time like the built-in sparks, looping if it loops. The render job carries the effects its timeline plays (documents.fx, RenderJob 1.3). Until now onlysparks.v1was drawn, so the fifteenth watch-it faked a coffee machine's steam as a shape of the machine.An effect can be aimed: an FX cue's
toward(EpisodeIR 1.17) points a show's effect at a character's eyes, an element or a mark (FxEvent.toM, Timeline 1.8), andedit_episode'sset_fxadds, changes, aims or removes an effect cue. The fifteenth watch-it's steam landed on Otto only because she stood where its arc happened to end.The heuristic director reads a spray: "the kettle sprays steam in Otto's face" plays the show's effect for steam (
fx.steam_jet, new in the Marigold example) from the kettle, aimed at Otto; a spray the show has no effect for is reported once (director.missing_fx). The model director is told the show's effects too. The fifteenth watch-it's coffee machine sprayed Otto on the page and nowhere on screen.A bow: a hand to the chest as the body folds forward, read from "bows to the Captain" or "takes a bow" (not a ship's bows). The sixteenth watch-it's Chief bowed before his waltz, and the rig had no bow.
The heuristic director can re-cut:
recutwithheuristickeeps each scene's performance as edited, byte for byte, and covers it afresh. The fifteenth watch-it's showrunner had no model, so re-directing to fix the shots threw away every edit.edit_episode'sset_lightinglights a scene with another of its set's presets. The fifteenth watch-it's morning was lit for night, and no edit could change it.Film grammar
grammar.subject_out_of_frame: someone a framing names as its subject who is out of the picture for most of the shot. The fourteenth watch-it's three-shot of the Captain leaving was brought in from the bridge's wall until its camera stood half a metre from the Chief, out of the picture to its left, and nothing said so. The heuristic director now turns a group or two-shot round to an angle that keeps everyone in it.A walk can go up to a piece of the set: a move to
element:<id>stops within reach of its front, or of its nearest clear side, and faces it (EpisodeIR 1.16). The fourteenth watch-it's bridge had no standing mark by the helm, so the Captain could set the saucer down by the kitten only from a mark across the room or the pilot's chair. The director walks someone up to the thing they reach for when no free mark is in reach of it, and measures that reach to the thing's nearest edge, so Otto in the pilot's seat still sets her mug on the helm console without getting up.set_moveand the model director take it.edit_episode'sset_lookadds, changes, retimes or removes a look, and, naming a line, sets who it is said to. The fourteenth watch-it's Captain said "The rules are simple, Pilot" looking at the Chief, and there was no edit for where anyone looks.The 3D figure's mouth draws every lip-sync shape: the upper teeth, the tongue, a rounded O and a pucker, and a band of teeth for F and V. It only opened and widened before, so a 3D character's lines read as a dark slot flapping. The mouth now sits in the face along its curve, so a wide opening no longer sinks under the skin at the top.
Film grammar
grammar.subject_hidden: someone a shot frames whose face the set or someone else hides from the camera for most of the shot. The thirteenth watch-it's showrunner found the Chief hidden behind the Captain's scorecards in three singles, and Otto behind the Chief's back in one, only by rendering stills: the storyboard shows the middle of each shot, and nothing said so. The heuristic director now turns, or comes one size in, to see the face, and checks a group a second into the shot as well.A use can lift a prop to the lips, before the eyes or over the head (
lifton a use prop cue, EpisodeIR 1.15). The thirteenth watch-it's Captain sipped her tea with the cup before her chest. The director lifts a sip, a drink, a gulp or a slurp to the lips, and the model director andset_propknow it.A prop can come out of a pocket, or go into one:
place: "self"on a pick_up, hold or put_down (EpisodeIR 1.14). The thirteenth watch-it's Captain found her vanished teacup in her own coat pocket while the Chief still held it, and the compiler had her reach 2.4 m across the bridge into his hand. Now the cup leaves his hand and comes up out of hers, and is seen again as it does. The director reads "from his pocket", "pockets the key" and "tucks it into his overalls"; "the teacup is gone" finds its vanished state, and a bare "and sips" uses the thing just taken. A hand that reaches for something in another hand out of reach now warnsprop.out_of_reach, as one reaching for a shelf did.A prop can fly on its own: a
flyprop cue with no character (EpisodeIR 1.13). The twelfth watch-it's drone faked every trip with states, because a prop could only be put, thrown or let go. Now it flies from wherever it is to a place, out through an entrance, into someone's hand, or to hang beside their head, and it bobs where it hangs. It can come in through an entrance from off stage. The director reads "hovers up out of the crate", "zips out through the hatch", "hovers in and whirs round his head" and "settles into her palm".set_propand the model director know it too (docs/design/m6-props.md, "Flying").Characters can be 3D (
docs/design/m10-3d-characters.md). ADR-0004 kept characters as 2D cards so 3D could come later as a swap, and this is the swap. A character on rig templatebiped_3d.v1is drawn as a stylized 3D figure: a lathed torso, capsule limbs, and an ellipsoid head with eyes, brows and a mouth, in its costume's colors. It is cel-shaded and inked in the style. It poses on the card's own skeleton and pose solver, so postures, walks, gestures, looks, floats and held props carry over unchanged. Staging, framing and gesture timing do not change either, and a show can mix figures and cards.A held prop can leave the hand: a
let_goprop cue (EpisodeIR 1.12). The prop stays where the hand was. While a float lasts it hangs there and bobs, and when gravity comes back it falls to the floor. The director reads "lets go of" and "bobs up out of the Captain's hands". The eleventh watch-it's music box had stayed in her hand through the hiccup, so its showrunner stood it on the kettle shelf just before.What happens in the air plays out (
docs/design/m6-float.md, "Drifting"). Adriftcue (EpisodeIR 1.11) pushes a floater off someone or something, drifts them to someone, or spins them round. Both who pushes and who is pushed drift apart, and they come down where they drifted to. The director reads the tenth watch-it's "plants her feet on the Captain and pushes off", "spins gently away" and "darts across to the Chief" mid-float. Those had played as pauses and a walk in the air.Close inserts on set elements. A shot's camera can now be
{ "type": "insert", "element" }(EpisodeIR 1.10), and the framing solver frames that element close: an MCU, CU or ECU, from the legal side, turned byyawOffsetDeg. While the scene shows a prop that stands in for the element, the insert frames the prop. When the set has no camera that shows an element close, the heuristic director cuts to such an insert as the element sounds. It picks an angle that stays in the set and isn't crammed against a wall, with nobody and no furniture in the way. The tenth watch-it's kettle had whistled a few percent tall in the bridge's wide.set_camerare-sizes and turns an insert, and the model director is told it can use one.edit_episodegainsset_deliveryandset_sound.set_deliverychanges how a line is said: emotion, intensity, volume, pace and an actor's note. It drops the line's recorded take, so the line is voiced again.set_soundadds, changes, repeats or removes a sound cue. The tenth watch-it's showrunner could not bring out a "serenely" the director missed, nor add a sound.revise_propchanges a prop by pointer edits, asrevise_characterdoes a character: its recipe, palette, how it is held and its states. The tenth watch-it rewrote its fern whole, twice, to change a few fields.Floats (M6,
docs/design/m6-float.md): characters and props can float. The Marigold's running gag (gag.kettle_gravity: the kettle boils, the gravity hiccups, everyone floats for a beat, then drops) was carried by sounds alone; now they rise off the deck, hang there weightless and THUD back down.- EpisodeIR 1.7
floatcue: who (left out, everyone on stage), how high (default a foot), for how long oruntilthe cue they land on, adropor asettle, and whether loose props float too. Timeline 1.7Actor.floatsandScenePropPlacement.floats: spans of offset keys from the floor point, and a landing squash. An episode without floats compiles to the same bytes as before. - The compiler eases each floater up over 0.7 s, a few frames apart, at their own
height, with a slow bob and a few centimetres of drift, and drops them, accelerating,
so their feet are on the floor exactly on the landing frame; then a squash as much as
the style's
squashStretchallows. Body points rise with the float, so framing, looks and film grammar see them up, and an interior's ceiling stops the rise. - The engine draws the card lifted off its floor point with the blob shadow left on the floor, smaller and fainter; arms drift out, standing legs dangle toes down, and the figure squashes as it lands. A held prop goes up with the hand; a loose prop floats off its place. The sampler stays a pure function of the frame, stepped like every channel.
- The heuristic director reads "floats", "drift up off the deck", "hang in the air",
"the gravity hiccups" (a negated clause, or "nothing floats", makes none) and lands
them on "Gravity THUDS back", "drops", "lands", or drifts them down. "Everyone", "all
three", "they" or nobody named is everyone on stage; "a foot" is how high; "mugs and
all" floats things too. The coverage cuts to a wide as they rise. The model director
gets the cue and a line of its brief.
edit_episodegainsset_float.
- EpisodeIR 1.7
Walking up to someone (
docs/design/m1-compiler.md, "Approaches"): a move'stocan name a character (EpisodeIR 1.8). The walker follows the set's walkways toward them and stops 0.9 m away, within a hand-off's reach. The spot stays clear of the furniture, the walls and everyone else, and they turn to face the character. Where that spot is taken they step round to the next clear one. Someone already beside the character only turns.- The heuristic director uses it when a hand-off, a request or "crosses to the Chief" finds no free mark near the other character. The ninth watch-it's bridge had none, so a cable flew 6 m over the Captain.
- The model director is told it can.
edit_episode'sset_markcan send a move to a character.
Titles and credits (M7,
docs/design/m7-titles.md): an episode can open on a title card (the show's title and the episode's) and close on its credits (its credit lines, the show's content license and "Made with Reelwright"), drawn full frame in the show's style.- EpisodeIR 1.6
titlesasks for them (open,credits, their lengths and credit lines). Timeline 1.6titlesholds the cards: frames, fades, colors and lines by role. Every scene, shot, sound and caption starts later by the opening card, and the credits follow the last scene. An episode without titles compiles to the same bytes as before. - The style decides how they look: background, ink and accent from its palette (the
title_background,title_inkandtitle_accentslots when it has them), the display and body fonts from its typography, fades from its transitions, and its film look over all of it. The engine draws a card at any size inside the title-safe area. - Both directors give titles to a screenplay with a title page, crediting its Credit,
Author(s) and Source.
edit_episodegainsset_titles. The OpenTimelineIO export cuts the cards from the render as clips of their own, andimport_otioreads a trimmed or lifted card back asset_titles.
- EpisodeIR 1.6
Props on screen (M6,
docs/design/m6-props.md):- The compiler turns prop cues into who holds which prop when (Timeline
Actor.props: the prop, the hand, the grip and its pose, the reach to take it and to let it go, and lifts to use it) and where each prop stands or flies when nobody holds it (Scene.props). A prop the set dresses (akit.prop.<name>element, or one named after it, like the bridge's kettle) starts on it, and that stand-in is hidden while the scene plays. - The engine builds each prop once per scene from its recipe, as the set builder builds a
kit piece but at full color and always outlined, and each frame puts its grip at the
hand the card drew: upright in the holder's facing, at
heldScale, in front of the card (behind it when the hand is behind the body), stepping with the drawing. The hand reaches for it, closes round it in the grip's pose, carries it, and reaches to let it go. Render jobs embed the props their scenes place (documents.props). - The heuristic director reads prop business from the action ("picks up the kettle",
"hands her the mug", "sets the kettle on the console", "takes it and hands it to
Otto"): a pick-up or put-down out of reach walks to the nearest free mark first and
turns to the place, a hand-off brings the giver over, and the cover cuts to both for
it. A thing the action handles that the show has no prop for is a
director.missing_propwarning, andepisode_needslists it. edit_episodegainsset_prop: add a prop cue, or move or change one.render_previewgains thepropkind (alsoreelwright preview prop <prop>, and the Prop document in Studio): the prop held by the show's first character and set down on a table, front and three-quarter, on one sheet.- Prop states: a prop cue's
state(or thestateaction, which changes only that) switches a prop to one of its states from that moment; the Timeline keys it (Scene.props[].states) and the engine shows that state's own build. The heuristic director changes a state when a sentence names the prop and the state ("the kettle boils", "the drone's eyes go dark"). - A scene can stand a prop from its start without changing its set (
Scene.props, andedit_episode'splace_prop), so a prop one episode needs no longer appears in every episode on that set.
- The compiler turns prop cues into who holds which prop when (Timeline
M0 foundations:
- Architecture, ADRs 0001–0010, roadmap and the M1 engine and compiler designs.
- v1 JSON Schemas for every document kind, the Timeline and RenderJob engine contract, and a structured-output-compatibility lint for all of them.
- Core (TypeScript on Node 24): strict Show Pack loading, schema and semantic
validation with pointers and fix hints, canonical formatting, JCS hashing,
name-path seeds, PCG32, generated TypeScript types and GDScript classes, and a
reelwrightCLI (validate,fmt,hash,version). - Engine (Godot 4.7.2, typed GDScript enforced): gdUnit4, a CLI scene, a frame server that renders exact-size frames as a pure function of the frame number, stateless hashing and seeds shared with the core, and easing, palette and unit utilities.
- Toolchain pins with checksums, installers for Godot, Rhubarb and the GDScript formatter, a doctor, a hidden-input check, and GitHub Actions CI (lint, core, engine, and a smoke render on Linux's Vulkan software renderer).
- The Marigold demo show: theme, style, patterns, cast, bridge set, prop, FX, graphic, bible, and the cold open with local Kokoro voice takes and synthesized sound effects (CC BY 4.0 / CC0).
M1 compiler:
reelwright compile,renderandstills. EpisodeIR → frame-exact Timeline (timing, blocking, framing solver, performance channels, film-grammar checks), render jobs with a timeout per engine run, frame verification, a sample-exact linear-loudness mix, and a checked BT.709 H.264 MP4 with WebVTT and SRT captions. ffprobe and Rhubarb adapters with content-addressed caches.M1 engine: sets built from primitives in the show's style (cel shading, set ink, painted backgrounds, starfield backdrops, lighting presets), deterministic sparks FX, a timeline player that is a pure function of the frame (stepping, camera lens and shake, transitions),
frames,stillsandset_viewsjob tasks, and Movie Maker as a checked alternative capture.M1 characters: the
biped_toon.v1rig and thetoon.v1part library. Five body views are projected from one pseudo-3D design, with a continuously turning 2.5D head, blended expressions, Rhubarb mouth shapes, a pose solver (postures, gestures with IK, look, breathing, walk), camera-facing character cards, and model sheets.The Lighthouse cold open renders end to end to a 28-second MP4 with captions.
A verification skill and feature map (
.claude/skills/verify/).M2 character generation:
reelwright generate charactersdraws a cast from a CharacterPattern (one PCG32 stream per attribute), solves palettes in OKLab under the style's color rules and slot contrast, keeps the cast apart by engine-drawn silhouettes, dominant color, height and hair, and renders a model sheet per character.--replacegives existing characters new looks and--varyre-draws single pointers; locked pointers never change. The engine gains asilhouettesjob task, and the core a Kokoro voice catalog with measured pitch and timbre.M2 character generation (
reelwright generate characters):- samples one seed stream per attribute, with archetypes, conditional rules, costume layers, an OKLab palette solver, personas, Kokoro voice matching and names;
- selects the ensemble on real engine silhouettes, palette distance, height spread and unique hair;
--replacekeeps identity and locks;--varyredraws only named pointers.
M2 set generation (
reelwright generate set): room shells, zones, placements, dressing, walkways, marks, camera setups and lighting, checked in the floor plane. Sets embed the kit recipes they use.M2 engine:
- a recipe builder for kit pieces and props;
- every StyleSpec field drives sets, effects, post and camera (or is documented as reserved);
- a second demo style,
style.bright_modern; - character polish: relaxed poses, real hands, stronger expressions, mustache mouths, hair from behind, continuous body turns, a proper walk cycle, and style fields on characters.
tools/check-all.shruns every gate. The enginecomparecommand and CI golden frames cover the demo.M3 studio: change sets for every edit. A proposal holds the bases it was made against, is validated with the whole show, and applies atomically; a stale one is refused. Approving commits to the show's own git repository, and undo and redo are change sets too. Locks protect canon down to a JSON Pointer, and only lock and unlock can change them. The dependency graph drives
reelwright impactandstatus(drift: patterns, locked canon, stale proposals). The CLI addsinit,changes list|show|approve|reject|undo|redo|lock|unlock,statusandimpact.M3 tools: read, propose and decide tools with strict schemas where the API allows, from
create_showin an empty folder togenerate_characters(withroles, one per archetype),build_set,vary,revise_*,restyle_showandestimate_cost.M3 previews (
reelwright preview): model sheets, line-ups (of a character pattern too, as samples), set views, style swatches and storyboard stills, rendered through the engine for a proposal before it is approved and cached by what is drawn.M3 showrunner: an agent loop on the Anthropic SDK (
claude-opus-5-5, adaptive thinking, streamed, eager input streaming), with budgets per request, month and episode in a spend ledger shared by every process, and recorded fixtures for replay.M3 surfaces:
reelwright mcp(the show's tools and documents over MCP, previews as images or one contact sheet),reelwright chat, andreelwright serve(JSON-RPC over a loopback WebSocket, token-authenticated) for Reelwright Studio (tools/studio.sh) and the Godot editor docks: chat, proposal and diff review, a preview gallery, a variation picker and a show browser.Pattern checks at proposal time: a character pattern must set every field a character needs; its part library, rig and styles must be ones the engine draws as written; its fixed colors must fit the style; palette slots nothing uses are flagged (on characters too). A set pattern's entrance on a wall piece with no door param is flagged. The engine and the core read
toon.v1's coverage from onePartLibraryfile.M4 screenplay and heuristic director (
reelwright direct --heuristic):- a complete Fountain 1.1 parser with source lines on every element, and a printer that round-trips it;
- cue names resolve to characters and headings to sets, with
castMapandsceneSetsoverrides and did-you-mean diagnostics; - a skeleton of stable line and action ids that the validator's screenplay check accepts;
- estimated takes, so a draft compiles, grammar and all, before any voice exists
(
compileandstills --estimate-takes); - a deterministic director that blocks, performs and covers any screenplay with zero grammar errors. It stages from a provisional compile of the scene: bodies turn (and seats swivel) to looks the head cannot reach; entrances, exits, walks and handoffs become moves; the set's named setups and element inserts come first; shot sizes follow the style's framing bias; sound ties are broken by the scene or reported.
grammar.face_hidden: a speaker framed in a shot must turn their face within 105° of the lens (an error for singles and closer, a warning for wider groups).M4 model director (
reelwright direct, thedirect_episodetool): per scene, Claude stages the performance and then covers it, each draft checked against the schema, the show and a provisional compile's film grammar and repaired by pointer, with the heuristic director's scene as the fallback.--dry-runprices it without a call;--recutredoes only the coverage;--notepasses a director's note. The episode is proposed as a change set (--outwrites a file instead).M4 voices (
reelwright voice): local Kokoro takes per line through uv, cached by content;rendervoices missing lines first, and--keepproposes pinning the takes in the episode.CI's
direct-e2ejob directs, voices and renders The Salvage Claim with the heuristic director and checks the MP4 and its loudness.M3 hardening after a second watch-it:
revise_patternedits any pattern by pointer;create_graphicmakes signs, screens and badges for set elements and costume emblems;- decisions hold a lock across processes; an approval that applies but cannot be committed says why; tool progress streams to Studio's chat and to MCP clients;
reelwright statuschecks canon drift from the terminal; a proposal's previews survive later renders and restarts;show_summarycounts out-of-date proposals apart;reelwright cleanremoves copies of decided proposals and leftover job folders;- enum errors list every allowed value; a door its wall cannot open at, or a character color outside the style, is flagged when proposed.
M5 groundwork:
screenplay_needslists what a screenplay needs that the show lacks, resolved the way the director will;direct_episodetakes a screenplay's text and proposes the .fountain file with the episode.M7 groundwork:
reelwright export otiowrites an episode's cut as OpenTimelineIO (shots from the render, audio by kind in samples, captions as markers);edit_episodere-directs by small edits (move a cut, re-frame, pause, delete a shot), compiled before they are proposed.M7 timeline: Studio's Timeline section and the editor's bottom panel draw an episode's cut (shots, lines, sounds, captions) and turn a dragged cut or line, or a shot's menu, into an
edit_episodeproposal through the session'stools.call. A waiting proposal is drawn over the cut as a ghost until it is decided, and the playhead shows the still at its frame. Timeline captions now name the line they show (cue, Timeline 1.2), andpause_beforetakes abySecchange as well as agapSec.tools/timeline-watch.shruns the whole loop against the real daemon.budget.maxUsdPerEpisodecounts every directing run of an episode, not one at a time.M4 storyboards (
preview storyboard,render_previewstoryboard): an episode, or a direction proposal before it is voiced, as one sheet with a captioned still of every shot, a row per scene. Studio offers it on episodes, and a line-up on character patterns.In-world graphics: a set element's
graphicis drawn on its screen face. Render jobs embed the graphics their sets show (documents.graphics), and the engine's graphic builder draws every block type (group, text, shape, icon, radar, readout, meter) with the canvas background, corner radius and glow, animated from the scene's first frame and looping onloopSec. Text takes the style's typography roles in the bundled Inter. The Marigold bridge's helm screen now shows the scanner.Wild walls: a set element with
wild: trueis the open fourth wall, there only for shots from inside. The engine shows it only to a camera in front of its inner face, never lets it cast a shadow, and leaves every other camera's frame exactly as without it. A reverse now sees the room's own wall instead of the flat shell. The set sampler (1.2.0) gives an interior's open front one made of its back wall's piece. The committed engine room gains it, and the hand-built bridge has its own.The restyle preview shows every set too, by its establishing view, before and after, on a sheet of its own.
M10 render farm chunking:
reelwright render --chunks N --farm <dir>plans each chunk as a self-contained engine job for a worker, and--assembleverifies what the workers rendered and finishes the cut; it is byte-identical to rendering on one machine.M9 Tier 2 assets (
docs/design/m9-tier2.md): art the person brings in becomes a frozen asset atassets/<sha256>.pngwith a provenance sidecar (source, generator, model, prompt, seed, date, license, original name, the steps applied, the QA report), and the original kept by its own hash beside it. The pipeline normalizes a PNG or JPEG to sRGB at most 4096 px on its long side, pulls it toward the set's and style's palette in OKLab when the style'scolor.rules.snapToPaletteis on (keeping texture), checks palette compliance and, for a backdrop, the 2:1 aspect and size, and freezes it to the same bytes every time.reelwright asset import <file> --show <dir> --license <spdx> [--for set.<id>/backdrop/<id>]and theimport_assettool store it and propose the set change that names it, with the QA report and the set's wide view in the answer;generate_imagegoes through anImageAdapterregistry and says a provider and its key are needed, as none ships yet. Validation checks that a frozen asset is pinned by its hash, still holds those bytes, and has a licensed provenance.Painted backdrops: a set backdrop draws a frozen equirectangular image all the way around at its distance, with the style's background saturation and value, instead of a generator, with parallax from the camera and drift as before. A render job carries the assets its sets name beside its job.json. On the Marigold bridge, an imported CC0 starfield shows through the porthole.
The heuristic director cuts a lone speaker's long speech: a set's single setup for them no longer blocks every cut inside it (the M5 watch-it's captain held two 12 s shots), and a hand beat plays in a single no closer than MS, so a thumbs-up is seen.
The style's camera moves take effect:
camera.moves.smoothnesssets how a camera move with no easing of its own eases, andsnapZoomsturns a zoom with no duration into a 0.2 s crash zoom. Both were reserved until now.M10 docs site (
tools/site/docs.ts, reelwright.diy/docs): the architecture, roadmap, design notes, ADRs and getting started, with reference pages generated from the code (the CLI's help, every showrunner tool with its input, every document kind with its file convention). The output is byte-identical across runs, and--checkfails CI's lint job when it is stale. The landing page links to it.M10 continuity log:
record_continuityrecords what an approved episode established (facts and lasting changes with evidence at scenes and cues, plus the gags and threads its outline served) and keeps the bible's books in the same change set, once per episode; the writers' room is told what earlier episodes established.edit_episodesplit_shot: a new cut inside a shot at a cue, with its own size or setup, so a long take can be broken up or a reaction added; a cut that cannot go there is refused with where it would land.M7 caption cards: a long line's caption is cut into cards of at most two rows of 42 characters, at its sentences, then its clauses, then its words, each shown from the take's timing of the word that starts it; an automatic card under a second moves its break to show longer, never past two rows. WebVTT and SRT write a cue per card. A line's
captionlets a person re-break it (a newline for a row, a blank line for a card) and nudge when it shows and goes; validation warnscaption.mismatchwhen its words are not the line's.M7 caption and sound edits:
edit_episodegainsset_caption,set_gain(effects and music) andset_fade(music), each compiled before it is proposed. On the timeline, double-click a caption to edit its breaks and timing, and right-click an effect or music cue to set its gain; sound blocks show their gain.tools/timeline-watch.shre-captions a line and turns an effect down against the real daemon, then renders stills and the captions.M8 restyling:
restyle_showre-solves generated, unlocked characters' palettes under the new style's color rules in the same change set (rederive, on by default), keeps any palette edited by hand, and flags locked characters whose colors the new style rejects. Restyling back restores the seeds' palettes exactly.M8 restyle preview (
render_previewkindrestylewith the change id): every character's model sheet before and after, one row each, headed with what the restyle does to them; approving the restyle approves the sheets it showed.M8 drift report (
reelwright drift, thedrift_reporttool): every character with an approved sheet drawn again and compared pixel by pixel, with an approved | now | difference sheet per mover and its likely cause (the style, the character, or the renderer); it exits 1 when a locked character moved. Approval records now name the style and the character's design they were approved with.M7 OpenTimelineIO import (
reelwright import otio, theimport_otiotool): an editor's trims of an exported cut come back as proposed episode edits (moved cuts, lifted shots), with what edits cannot carry listed and each cut checked against where the editor put it.M5 watch-it: one prompt to headless Claude Code over MCP produced The Singing Buoy (outline in three checkpoints, a generated captain and ship's bridge, a prop, the screenplay, direction and a storyboard; 56 turns), rendered to a voiced 76.5 s MP4.
M5 writers' room: an episode's outline (EpisodeOutline,
write_outline) grows in checkpoints the person approves, premise and logline, then beats, then scenes, before a screenplay is written. It is checked against the show (cast, sets, and headings that name them as the director will), the theme's catalog (for what it adds) and the bible's books (gags, arc beats in order, threads). The Salvage Claim has its outline as the example.Sound recipes (
SoundRecipe,create_sound): a sound effect described as layers of tones, note sequences and filtered noise, synthesized by ffmpeg into the same bytes every time and cached as derived audio. A recipe ataudio/sfx/<slug>.sound.jsonis the soundsfx.<slug>to the director, the compiler and the render, exactly like a recorded file. Waves are band-limited, so nothing aliases, and echoes never clip. The missing-asset pass points the sounds a screenplay names atcreate_sound.M5 missing-asset pass:
episode_needslists every character, set and prop an episode's outline and screenplay need, and how each is met;fill_needsproposes what patterns can make, one change set each.generate_characterstakesnamesandbuild_settakesname, so the made things answer to the names the script uses. Marigold's catalog links its archetypes and set types to the patterns that draw them.The missing-asset pass lists sounds the screenplay's action names that the show has no effect for (the M5 watch-it's SINGS, CHIMES, WHISTLES and HICCUPS), read as the director reads them.
A new character the outline describes keeps its pronouns and description: the outline's
pronounsandgenerate_characters'personasset them before the voice is cast, so a captain written as "she" gets a woman's voice.M5 checks against the outline:
write_screenplaynotes outline scenes it leaves out and speakers the outline does not cast, and says how much dialogue it holds;direct_episodesays how long the episode runs against the outline's target, and warns beyond 25%;write_outlinerepeats the theme's never list and hard rules at every checkpoint.M6 held gestures and a larger library: a GestureCue's
hold(until a cue, or for seconds) keeps a holdable gesture's stroke pose, and a move or posture change lets it go. Twelve gestures joinbiped_toon.v1: arms_folded, hands_on_hips, hands_behind_back, chin_rub and lean_back (holdable), head_scratch, thumbs_up, beckon, palms_up, clap, hand_to_chest and count_off. Self-touching gestures reach the chin, head, chest or the other hand by IK; hands behind the back draw behind the torso; athumbhand shape.M6 a heuristic director that performs: gestures and faces from the action ("arms folded" held until the next move), a beat gesture by an intense line's emotion, nods and shakes, listeners who nod and answer a long turn's emotion, two seconds between one character's gestures, and no reaction where a cut lands. A line with no parenthetical takes its emotion from its words. The model director is told which gestures can hold.
M6 motion style: the engine now honors
motion.smearsandtiming.fastActionStep, which were reserved. While a character acts, each drawing carries the one before it, and the pose solver measures how fast each hand and foot moves in body heights per second. A limb over the style's smear threshold smears for that drawing: a short teardrop of its own fill with an ink edge, and ink speed lines back toward where it was. A frame that fast is drawn onfastActionStep(ones) while the rest stays oncharacterStep(twos). Both stay a pure function of the frame. On Saturday Morning a wave, fist pump, facepalm, clap or head scratch smears at its peak, and a point does not until it is given full intensity. Bright Modern, on ones with smears off, renders as before.edit_episode'sset_cameratakescrossesAxiswith anote, so a reverse across the axis that is the point can be proposed instead of refused.edit_episodetakeschange, to edit a proposal still waiting as its revision. A revision, and any re-direct of the same episode, supersedes the proposal it replaces: approving it rejects that one, so re-directing no longer leaves stale proposals behind.edit_episode'sset_markre-blocks a scene: a character's starting mark (trading places with whoever starts there) or where a move goes.Film grammar
grammar.face_cut: a face the picture's edge cuts through for most of a shot is a warning, and the heuristic director picks angles and sizes that keep faces in the picture or out of it. The seventh watch-it's storyboard had the Chief's face sliced by the edge of five singles on Otto.tools/watch-it.sh <dir> "<premise>": a whole episode from one prompt, by headless Claude Code over MCP on a copy of the Marigold show, summed up insummary.md(turns, time, cost, change sets, film grammar, the showrunner's report) with its storyboard.The Marigold show has a power cable (
prop.cable), which Otto holds in The Salvage Claim, and the bridge has agalleymark at the kettle shelf, so the kettle can be picked up within reach. The hand-written model-director fixtures are recorded again for the new mark.A sound can repeat (EpisodeIR 1.5,
SfxCue.repeat): everyeverySec, untiltimesplays, a cue, or the scene's end, one clip per play. The heuristic director repeats a sound the action says goes on ("over and over", "won't stop") until action stops it.edit_episode'sset_cameratakesyawOffsetDeg, turning a framed shot's camera round its subject.toon.v1 draws coats. The seventh watch-it gave its new Captain "a burgundy captain's coat" and it came out a jacket, its buttons and rank stripes not drawn. A coat now hangs to its length (
legs: short to mid-thigh, unset to the knee, cropped to mid-calf, long to the ankle) and flares by its fit. Its skirt is two halves that hang from the hips and swing with the thighs, so a stride parts them, with the lining behind the legs. Buttoned, it closes double-breasted below lapels; unbuttoned, it hangs open down the front. The library also drawsbuttons(on any top, jacket or coat) andrank_stripes(an epaulette and three cuff stripes on each sleeve). Coats turn with the body like everything else, and the goldens are unchanged.CharacterPattern 1.2: an archetype can bring its own costume layers, each in place of the pattern's layer it
replaces(else the one with its id), or after them. The crew pattern could not dress a captain in a coat; now its captain wears a captain's coat (costume.captain_coat, cutcoat, buttons, rank stripes or a collar) where the rest of the crew may wear a jacket, in navy, burgundy or bottle green from the captain's own@coatslot. A replacing layer draws from its own seed streams, so rookies and veterans draw exactly as before, and a captain's look moves only in costume and that one color. An archetype's layers may use its own palette slots; areplacesnaming no layer of the pattern, two layers in one place, or areplacesoutside an archetype are errors.
Changed16 changes
- A turning card rebuilt its body every degree, at any size (the M2 polish review: about twice the cost of a still one; drawing Otto turning half a degree a drawing took 25 ms against 9 ms still). A small figure's body now snaps to the coarsest view step that moves no body point more than a pixel (2 degrees for Otto at 150 px tall, 3 at 100 px), so a slow turn there builds a third to a half as many views and costs about 12 ms a drawing. A large figure, and a fast turn that needs a new view every drawing anyway, are as before. No golden moved.
- Timeline 1.5, which the compiler now writes, adds optional
Actor.propsandScene.props; EpisodeIR 1.4 adds PropCue's optionalplace,gripandstate, thestateaction, and a scene's optionalprops(the heuristic director writes 1.4 only when a prop cue needs it, andset_propandplace_propraise an episode to it); RenderJob 1.2 adds optionaldocuments.props, and a job without props keeps version 1.0 and its bytes. Older documents still validate and play. The Lighthouse has no prop cues: its Timeline gains nothing but the version, and its goldens did not move. - A prop cue lasts as long as its business (pick_up and put_down 0.8 s, hand_to 1 s, throw
0.8 s, hold 0.3 s, use 1.2 s) instead of 0.5 s, and prop business on an arm lets go of a
held gesture on that arm, as a move does. Validation checks a prop cue's
placeandgrip, and that a hand-off names someone to take it. episode_needsfor The Salvage Claim lists the cable Otto holds: the show has no prop for it.- A document written by an approved change lands as
approved, notdraft, and one written without a license takes the show'scontentLicenseinstead ofLicenseRef-Unspecified. Two watch-its stumbled on both. - Timeline 1.4 numbers a line's caption cards (
card; the cards share the line'scue), and EpisodeIR 1.3 adds LineCue's optionalcaption. The heuristic and model directors write EpisodeIR 1.3, andedit_episoderaises an episode to 1.3 when it sets a caption. Older documents still validate and play; every Lighthouse line still fits one card. - Storyboard and contact-sheet captions are literal text: a
%in one no longer blanks it (ffmpeg drawtext withexpansion=none). - Timeline 1.3 adds an optional
holdspan to gestures; EpisodeIR 1.2 adds GestureCue's optionalhold; GestureLibrary 1.1 addsholdable. The heuristic and model directors write EpisodeIR 1.2. Older documents still validate and play. direct_episode's answer carries the director's scene-by-scene report, which before reached only the change set's record.- A theme's catalog link to a pattern the show does not have is a warning, not an error: a theme is written before the patterns its catalog points at.
- The Lighthouse goldens of frames 40, 100, 290, 460 and 560: the helm screen in them now shows the scanner graphic instead of a plain glow. Nothing else in them moved.
- The ffmpeg minimum is 6.1 (Ubuntu 24.04's apt build); the mixer and encoder are tested on 6.1.1 and 9.0.2.
- Timeline diagnostics carry an optional
severity(Timeline schemaVersion 1.1). - Timeline captions carry an optional
cue, the EpisodeIR line they show, asscene/cuelike audio clips (Timeline schemaVersion 1.2, which the compiler now writes). 1.1 and 1.0 Timelines still validate and play. Nothing pins a Timeline's bytes: the goldens are rendered frames, which captions do not reach, andinputsHashcovers the compiler's inputs. Cached stills and renders key on the job, so they are made once more. - SetInstance 1.2: a backdrop has a
generatoror animage(an AssetRef), sogeneratoris no longer required; validation requires exactly one. RenderJob 1.1 addsassetRoot, which the engine sets on jobs it writes elsewhere. Older documents still validate and build, and the goldens are unchanged. - EpisodeIR 1.1 adds optional
castMapandsceneSets; SetInstance 1.1 adds optionalaliases. The validator's screenplay check now uses the full Fountain parser and accepts any name the director resolves (name, shortName, first name, id or castMap).
Fixed193 changes
Every gesture an action writes is performed. "Otto points at the Chief and shrugs" did only the point; now Otto points and then shrugs. "The Chief waves at Otto" waves at Otto. "Leans back and folds his arms" leans back and folds them, where it once only folded them. The read-along found these misreads. A gesture the script writes is no longer dropped for coming within 2 s of the last one: it waits for that one to finish, and it lets go of a held pose ("folds his arms… points at Otto"). The read-along also says a mark as one ("walks to the projector mark"), where "walks to projector" read like the prop.
An upturned bowl, a helmet or a bucket on someone's head comes down over it, to the brow, instead of sitting on top like a lid (Timeline 1.18
worn[].sinkM); a hat with a solid crown, or a mug narrower than the head, still sits on top. The movie night's popcorn bowl perched on the Chief's cap.A prop preview of something too big for the table (a 3.6 m movie screen, a tall plant) stands it on the floor beside the character and stands the cameras back until both are whole in the picture; the screen stood on the table, most of it out of the picture.
The forty-first watch-it's movie night in the cargo hold reads as written. "The projector sits on a crate" puts it on a crate nobody sits on, not on the Captain's. "Otto pins the sheet up" walks her up to the sheet's place and lays a hand on it there, and the sheet hangs on the screen spot the set made for it, where it stood on a crate; "it hangs" is its hung state. "Points at the sheet" and "holds her hand out to the sheet" gesture at it; "covers her face", "raises her hands", "throws his hands up" and "leans back" play, and a seated "leans forward" stays seated.
An effect's
chunkanddotparticles are solid inked lumps (popcorn, pebbles, crumbs, grains), each a little uneven: the movie night's buttery popcorn flew as four-point stars.A set pattern whose entrance is a ladder down from a ceiling hatch, standing out in the room, no longer warns that its wall has no opening.
A lighting change relights see-through surfaces too: a glass of water kept the old lights while the room went dark.
The fortieth watch-it's card night reads as written. A table made as a prop stands on the piece of furniture it is named for (the galley table on its table mount), and what is put on that piece goes on the table, not on the floor plate under it; a seat whose description mentions "the card table" no longer draws the cards onto its stool. "The deck of cards and the chocolate bar sit in the middle of the table" stands both there, and not Otto's cards with them. "Each holding a hand of cards" gives each their own, from the start. "An ace slides out of her sleeve onto the table" comes out of Otto's sleeve, and Otto stays where she is. "Goes nose to nose with the Chief" walks her right up to him, table or no table. "CHEAT!" is said in anger, not with a fist pump, and a big bite leaves the chocolate bar bitten.
Business behind the talk no longer holds the talk up. After a paragraph that opens "Behind her," or "Meanwhile," the next line follows its reading and plays over what it does, unless the speaker is one of those doing it. The thirty-ninth watch-it's Chief, sneaking to the bucket and back, held the Inspector's lines for nine seconds each time, and its cut ran 108 s until its showrunner retimed every sneak by hand.
Faces are read as faces. "Their faces fall" and "the Chief's face falls" make them sad, everyone in sight when it opens on "their", and no longer land anyone afloat; nor does "his jaw drops". "Otto pulls faces at the Captain" teases her, amused and looking at her, where it took up a prop called "faces".
The rest of the thirty-ninth watch-it's misreads. A prop placed by a door or at a shelf ("The cupboard stands just inside the aft door", "The bucket is at the kettle shelf") stands on the mark the set describes so, where before it stood nowhere. "Picks it up" after "sneaks to the bucket" takes the bucket, not the kettle named before. "Sneaks to the bucket, picks it up and sneaks back behind the engineering console" walks there and back, the second walk once he has it. "She opens it, stuffs the laundry inside and shoves it shut" opens the cupboard, puts the laundry in it and shuts it, in that order, and "It THUMPS" then sounds from the cupboard. "Pockets his sandwich" takes it off the console first. "Sneaks over and crouches beside him" goes to him. "Faces the main screen" turns to the prop, "walks up to the main screen" goes to it rather than the helm's screen, and "The main screen lights up" switches it to its lit state. "Stares into the camera" and "(to camera)" look down the lens.
The heuristic director reads three of the thirty-ninth watch-it's misreads right. "Behind her, Otto sneaks to the pilot seat" sends Otto, not the Captain. "The cupboard stands just inside the aft door" no longer starts the cupboard ajar, since its ajar state's "the door stands a hand's width open" shared "door" and "stands". "Sneaks up to the cupboard" and "walks to the bucket" walk there, at their gait, to within reach of where it stands.
A walk no longer goes out along the walkways and back when a way round the furniture is shorter: the hiccups watch-it's Chief walked from the workbench to the core by the ladder, past the core and back, since the engine room's walkways from both met only there. A walker who talks on the straight way, with their back to every camera of the set's, is held by a wide shot ahead of them that pans as they come past.
"Plants herself in the middle of the bridge, facing the main screen" walks her to the middle and turns her to the screen, rather than walking her to the screen; a speaker only heard (V.O.) no longer holds a mark someone else is sent to; and "gives a thumbs-up" is a gesture, not a prop to hand over. The thirty-ninth watch-it's call could not be directed at all.
"He covers himself with the tarp" hides the Chief under it until he sits up, so no tuft of hair shows past its edge. The scene's axis lapses while either of its pair is out of sight, and a wide for the action that hides someone gives way to whoever the action is about.
Hide and Seek cuts with no framing finding: the Captain's walk to count is no longer a three-shot with Otto behind the rack all along, and the eyeline repair no longer turns a single so it crosses the look of the shot before it.
The hiccups episode cuts with no framing finding: Otto's "BOO!" no longer takes a close-up framed while she is still crouched behind the console, which she sprang up out of, and a close-up turned for room keeps the Chief's face off its edge for the whole shot, not just its start and middle.
A prop's slot whose color has alpha draws see-through at that opacity, so a glass shows the water in it. The hiccups watch-it's glass of water, its tumbler
#D8F0F270, read as a white tumbler.The heuristic director stages the hiccups watch-it's ending as written: "drops the wrench on his foot" lets it fall to his feet rather than setting it down by hand, "hops over to the ladder" goes at gait
hop, and "his face goes red" (turns beet red, flushes) blushes him, red with rage being angry. Its showrunner had to paint his face red, with a hard edge.A change to a draft document leaves it a draft: approving the hiccups watch-it's new hiding mark in the demo's engine room marked the whole room approved.
The heuristic director cuts a long search where each walk arrives: Hide and Seek's Captain tiptoed to the aisle, the rack and back in one 14 s wide. A shot a split brings in, panning or not, keeps its subjects unhidden, and no cut leaves the shot before it only the part where they are hidden. Jump cuts are judged on the cut's own frame, as film grammar judges them: 0.05 s in, the camera on the breakfast's walking Chief had turned the 30° a clean cut needs, but on the cut itself only 29°.
"The Chief HICCUPS" plays sfx.hiccup once the show also has sfx.hiccup_squeak: a tie the scene cannot break goes to the sound with the fewest words the sentence leaves out. The thirty-eighth watch-it's hiccups played nothing once both existed.
Nobody starts a scene on the mark a prop stands on, and "OTTO stands by the hatch" puts her by the set's way in though the set calls it a door: she began in the middle of the bridge, on top of the robot.
Not every exclamation is a cheer: "Hey! That's the Captain's lucky compass!" and "Chief! You dove!" are surprised, "It's got your compass!" worried and "Come back here!" determined. The thirty-seventh watch-it's Otto gave the robot running off with the compass a thumbs-up and a fist pump.
"He dives and tackles it flat" runs the Chief at the robot and lays him flat there, and "pounces on the Chief" takes the Chief down too: the thirty-seventh watch-it's Chief only thudded where he stood. "Otto chases it" runs her after the robot, where she stood still, and "Otto grabs at it" reaches for the robot as it circles. The compass clamped in the robot's arm flies on with it to the bridge, where it was missing, and taking it lets go of the Captain's hands-behind-her-back so her pat on the robot plays.
A proposal that writes every file a waiting proposal by the same author writes is its revision: approving it rejects the older one, and the answer says so. Before, only
direct_episode,edit_episodeandbuild_setdid that, and the thirty-seventh watch-it's first screenplay draft stayed waiting, then stale, after its second was approved. A person's own edit is never the showrunner's revision.The thirty-seventh watch-it's first direct failed outright: "The cleaning robot zooms out from under the counter" flew it off through the hatch, and "It zips away across the galley" had nothing left to move. Out from under something is now out into the room, and away across the galley goes to its far side. "Under the counter, the cleaning robot waits" and "A stew pot bubbles on the stove" stand them there, not on the counter top; "whizzes past the console" goes by it, not onto it; "knocks the stew pot off the stove" drops it on the floor and its CLANG comes from the pot; and whoever goes for a thing that has flown goes where it is now.
"Otto tips the barrel over with a hollow CLONK" clonks from the barrel: a sound said with what someone does to a thing comes from the thing, not from them.
"Crawls across the deck to the barrel" and "rolls out across the deck to the Captain" go there. "The deck to the barrel" was read as a place, so the crawl went nowhere and the roll only lay down where it started; "tumbles across the deck to the Captain" walked to the door. A crawl now creeps low rather than walking upright.
A camera no longer stands inside a prop, nor where someone is about to walk. The thirty-sixth watch-it's close shot of Otto on her way to the counter stood the lens in the oven on it, so the bottom of the picture went dark, and she walked up to a hand's breadth of the lens. Props standing in the scene now count as furniture does, and the heuristic director judges a camera across its whole shot. Turned to see a speaker's face, a shot widens when no angle at its size keeps a walker in the picture.
A wide shot no longer stands so far out in front of a small room that it sees where the set stops. The heuristic director passes over such an angle, and compiling warns of one (
framing.past_the_set). The thirty-sixth watch-it's last wide showed the galley's deck end and the stars past it, and the night watch showcase's two wide group shots showed stars below the bridge's floor.A set's camera standing out past the open front no longer looks round the end of a side wall into the stars: the nothing past a wall's end counts as much as the floor's edge. The thirty-sixth watch-it's hatch single showed a strip of starfield beside the right wall.
Someone picking a thing up off the floor bends for it and straightens up with it, and steps closer first when it came down out of reach: the thirty-fifth watch-it's Captain picked her queen off the deck standing straight, 1.16 m away.
"Slides … face first through the foam", "falls flat on his face" and "lands flat on his back" end up lying on the floor; "He slips and lands flat on his back" flew a prop called "slips and".
A camera no longer stands just under a piece hanging over the lens: the thirty-sixth watch-it's close shot of Otto at the counter put the lens 0.2 m under the wall locker, in its light strip. Over the top of a piece, it still looks over it.
"The Chief spins round and sprays foam at the Captain" turns him to her, not right round. "The soufflé rises" is its state risen. The Chief steps up to the extinguisher's bracket rather than reaching past arm's length for it. A group shot that would see the Captain's foamy bite from behind becomes a single on her that sees her face.
The thirty-sixth watch-it's soufflé directs as written. Smoke puffing out of the oven stops when foam is sprayed at the oven, or when "the smoke clears". "The fire alarm BLARES" goes on until "the alarm stops". "The extinguisher WHOOSHES" is a sound, not a flight. "The galley goes red" and "the red light fades" change the lights. "Slides across the floor" and "slides the other way" slide to the far side, "glides" too. Foam leaves a cream mess, as does "dripping with foam". "Behind the serving counter" is the island the set describes so, not the counter. "Takes the soufflé out of the oven" takes it from the oven, and "soufflé" names the prop souffle.
episode_timinggives an effect's end as it plays, not one second after it starts."The fire alarm BLARES" sounds from the alarm, not the fire extinguisher, and "the smoke alarm" makes no smoke: a word that qualifies a piece of the set names neither a prop nor an effect.
"The red alert lamp flashes" plays the show's red alert lamp: the lamp's own name hid the effect's. Meteors that "streak past the porthole" streak at the porthole, not across the deck.
"The Chief, down among the scattered pieces, glares up at her" walks over to where the pieces fell and crouches there, in the open, to say his line. He stayed down behind the console and stood up to say it.
"The Chief ducks behind the console" crouches at the console he stands at. With two consoles on the bridge he walked over to the helm's first.
Studio shows the show's own settings: World lists show.json first, as "Show", with its format, providers and budget. It was in no section. No document shows its
$schemaas a detail any more.More of the thirty-fifth watch-it, read as written. "Duck!", "Hold on!" and "Right on top of us!" are afraid and "My bishop!" worried, not a fist pump or a thumbs-up. "Otto clings to the helm" puts her hands on it. A piece picked up off the floor is upright again.
direct_episodepasses on what the sounds and effects warn of (a clatter from a prop nowhere to be seen), andset_movetakesmark:deck_aas the other ops do.The heuristic director reads the thirty-fifth watch-it's meteor storm. "Red alert!", "the lights turn red" and "the emergency lights come on" change to the set's red alert lighting, and "the red alert cuts out" changes back; the emergency lights had come on the wrong way round. "FLASH" in capitals is seen, not a missing sound. "Everyone staggers" staggers everyone who can be seen, even with the first of them down behind a console, late in a sentence ("…, and everyone staggers") and with a plural verb ("the Captain and the Chief stagger"). A stumble breaks a held pose: the Captain kept her hands behind her back through the storm. A meteor streaking past a window after "they settle back" streaks at the window, not from one of them.
A preview rendered from a checkout right after the engine changed (a pull, a new engine class) came back without its image: previews launched the engine without the fresh import every other render gets, so Godot ran on a stale class cache. Every engine job now readies the engine first.
edit_episoderefuses a walk to where someone already stands. Sending the cold open's Otto to the helm she stood at turned every shot of the scene across the line.A face gag seen from behind is a grammar warning: cream landing on someone, a face wiped clean, in a shot that shows the back of their head. The thirty-fourth watch-it's wipe was shot that way, and nothing said so.
edit_episodecan re-cut what it changes: withrecut: true, a move or a new mark the old shots no longer fit is covered again around the new blocking, and only the scenes the edits name. Such an edit was refused for crossing the axis, and the thirty-fourth watch-it's showrunner moved Otto twice to dodge it.The heuristic director reads the birthday party of the thirty-fourth watch-it. A pie that "flies out of her hands" is thrown by whoever held it, and "lands square in the Captain's face" lands there with its cream, in one flight. Hands behind a back let go to wipe a face or take a prop. "Blows out all the candles" puts out the cake. "Carries it carefully toward the Captain" walks there. Confetti after a POP comes out of the popper, with its pop. "Dead silence." and "A long beat." hold longer than "A beat.". A line goes to whoever just came in, and "looks at it" after a wipe is not at the counter named minutes before.
Someone coming in keeps their shot over a line too short to stand: the Chief was not seen to enter his own party.
direct_episodepasses on the blocking's and the props' warnings (a head in the set, a reach too far), not only grammar's and the director's.A script's unsaved changes in Studio are never dropped without asking: opening another script, opening another show or closing Studio asks Save, Discard or Cancel. Leaving for another section keeps them, and the same script opens as it was left. The script reads itself again when its file changes (an undo, the showrunner, a hand edit), or says so when it has changes of its own; an answer for a script opened before another is dropped.
New set in Studio never takes the id of a set the show has, which rebuilt that set; one made again after an undo is new. Drawing shows what it is doing, New waits for it, and it has five minutes, not the usual thirty seconds. With no pattern to draw from, the dialog says where one comes from.
New episode on a show with no set or characters says what to make first; it failed only at Direct. Errors from the daemon carry the first finding's message, so "the episode does not compile" says why.
The timeline stops playing when it is hidden, and its player closes with no episode left. Lines that could not be voiced stay said after the episode reloads; Voice cannot be pressed again while it voices. Held keys act once (Space played and paused in turn), and Space never presses a button clicked before. A still is asked for where the playhead rests, not at every frame a drag passes.
Ctrl+K opens at once and the show's documents join as they are listed; Play from it waits for the episode to load. While a show is being made, the welcome screen opens nothing else.
An episode whose sound cannot be mixed plays without it and says why; it did not play.
init --starterstamps the new show as made now, by you, with no license claimed.A set built from a pattern whose door leads to a set the show does not have (the Marigold's engine room names its bridge) is made with that door leading nowhere. It failed, and in a new show the engine-room pattern could make no set at all.
Studio's chat no longer locks up after a model error: the turn ends on its error, Stop stops waiting for a turn the daemon no longer runs, and an overloaded or rate-limited turn can be sent again with a press. Errors read as plain sentences ("Claude is overloaded right now"), with Anthropic's own words after; out of credit, they link to billing.
Opening another show starts a new conversation; one show's chat no longer shows in another.
The Connect Claude dialog opens at its own height, its buttons on screen, and a pasted password is never sent to Anthropic to check.
A crashed daemon's banner gives its error, not the Node version it ran on.
"Waiting for you" counts a set of options as one decision.
init --demonames an episode the demo has.Your own edits in Studio are yours: a trim on the timeline is credited to you and applied as made, with no review round trip, and Ctrl+Z undoes it (Ctrl+Shift+Z redoes). They were credited to the showrunner and waited for approval.
"Sits on the left bedroll" no longer starts someone by a tree called
tree_left, nor "the right bedroll" at a mark whose description says "there": a side alone names no element, and "the" or "she" never stands for a word it starts.fill_needssays what each of its proposals warned of: the thirtieth watch-it's first hilltop build lost the Captain's rock, and its showrunner heard nothing of it.The heuristic director reads the thirtieth watch-it's picnic on a moon. "The sandwich floats up out of the basket and drifts over to the Captain" no longer floats the Captain and the Chief, so "He drifts up off the hill" floats the Chief. A prop carried in to a set that keeps a mark for it (the hilltop's "basket") is set down there, and what comes out of it starts in it. A single that bridges two shots no longer cuts a face in half.
Splitting a long shot while someone walks follows them, when a shot can hold them to its end, instead of cutting in for long on whoever stands still: the twenty-seventh watch-it held Otto, hidden in her barrel, for 12 s as the Captain tiptoed round the hold. A pan planned with a walker is the one that plays, and is checked for faces it cuts.
A framed camera pulled in from a wall no longer stands inside the furniture there: it comes on in to stand in front of it. The twenty-ninth watch-it's Captain came in through the hatch seen from inside the lockers. A throw that hits someone other than the one it was aimed at is covered on whoever it hits.
A long shot split for pace keeps both ends of a hand-off or a throw in the picture: the twenty-ninth watch-it cut in on Otto as she dropped her pillow, and it fell onto nobody.
Film grammar sees the face of someone lying on their back from any camera above it; the twenty-ninth watch-it's sleepers had to turn their heads for every line.
A set built from its pattern lays someone in a bunk at the berth's height, not on the floor under it.
A single of someone whose partner is straight above or below them (stacked bunks) faces the camera the way they face. It stood on its own target, and showed only the stars through the porthole.
Someone who walks on without a line is in the episode's cast; the scene would not compile. A thrown thing's sound comes from whoever it lands on, a paragraph's sounds play one after another, and "the pillow" is the one the action handled last.
"Otto walks over to the helm and sits down" opens with her standing, not sitting on nothing in the middle of the bridge before she walks.
A sound comes from what its own clause names: "the galley clock TICKS" from the wall clock, not the galley table, and a THUD as someone sprawls on the deck from them, not the stool the sentence named first. A clock that ticks on is not set ticking twice, and ticks once a second, not every 0.4. "The Chief topples off his stool" and "keels over" put him on the deck.
A held gesture ended by another gesture hands it the arm instead of dropping to rest first, and cutting in on the action goes to whoever it is about, not the Captain's back at the counter.
The heuristic director reads The Stuck Waltz: "they" means those the scene has met, so the Captain no longer stands on the bridge before she strolls in; lifting a record player out of the straw no longer lifts its needle, and "lifts the needle" changes the record player; cranking what was just set down is a hand on it, not a pick-up; a plural subject walks together; no fist pumps with full hands or at "Ow!"; "offers Otto her hand" holds one out.
A sound that repeats no longer holds up what follows it: the next line starts as it starts, where the twenty-sixth watch-it's looping waltz held the next line for 16 s.
Someone lying down lies across the frame: a flat card drew a body lying toward or away from the camera as a blob with its head in front, whichever way it lay, and a look with the body swung a lying body round to face whoever it looked at. Now a card draws a lying body from the side, and lying down a look turns the head. The twenty-fifth watch-it's Chief under the table always had his head toward the camera.
An aimed effect stops at what it is aimed at: a particle that comes as far as its aim near the line to it is gone, and one wide of it flies on. The twenty-fifth watch-it's jet of water went in at Otto's face and out of the back of her head.
A set pattern's mark that cannot stand where its rule puts it says why and how to fix it: "inside mess_table's footprint; move it 0.35 m or more out". The twenty-fifth watch-it's showrunner read "is blocked" as its mark being dropped, and took a pattern fix to find out.
The heuristic director reads more of what people do: "crawls under the table" goes to the lie mark there, "climbs back onto the bench" sits back down in the seat they began in, eating, sipping, munching and a spoonful of soup lift the spoon in hand to the mouth, "heaves on his wrench" uses it, and "closes her umbrella" closes it again. In the twenty-fifth watch-it the Chief never left the bench, the soup went uneaten, the umbrella stayed open, and "He crawls" moved a prop called "he".
Walks no longer follow a walkway that runs through furniture, and the set generator no longer draws one: a bench seat's walkway was exempt from its whole table and crossed it. The demo bridge's walkway to the engineering console now goes round the console's corner, where the Chief had walked through it to crouch behind it.
Someone getting up from a seat at a table steps back from it, not out over the tabletop. Stepping out of a seat the way it faces, as the meteor watch-it's bench wanted, walked the twenty-fifth watch-it's diners across their own table.
An insert no longer looks at the back of whoever stands in front of the thing it shows. The set's own camera on a piece was taken even with someone between it and the piece: the twenty-third watch-it's egg hatched on the helm console behind the seated Captain.
A proposal's warnings say what to do about them: the meteor watch-it's showrunner saw "recipe … is not used by any element" five times and never the hint to remove it. The change set keeps each warning's hint (ChangeSet diagnostics
hint).The prop sheet of a prop that cannot be held stands it on the table, with no "Held" row of an empty glove.
The built-in sparks no longer bring a big cloud of smoke to a short, weak spark. The twenty-fourth watch-it's meteor strike (0.35 s at 0.35) hid the crack it made under smoke born after it ended, at full size. Smoke now stops with the event and shrinks with its intensity.
Re-timing a cue after a later one no longer leaves the next line following the wrong cue. The twenty-fourth watch-it re-timed the tape's slap after its rip, and the Chief's "There." (no timing of its own, so after the cue before it in the list) came before the tape went on. A cue re-timed so now moves after the cue it follows, and pause_before says what it counts from.
The heuristic director reads the twenty-fourth watch-it's meteor shower as written. Its showrunner rewrote the entrance and made 40-odd edits to the cut. The Captain, towed in by Otto, comes in with her instead of standing at the window from the start. "They squeeze onto the bench: Otto, the Captain, the Chief" sits each of them on the bench in that order, and the Captain's line waits until they are down. "Pours cocoa from the thermos into the Captain's mug" pours from the thermos into her mug, which she holds out and which fills, where the Chief took her mug instead. The show's meteor effect plays at the window with each STREAKS, "A sharp CRACK." is heard, and the tape's RIP and SLAP come one after the other, once the tape is out.
An effect's
stretchdraws long streaks. The twenty-fourth watch-it's meteors had stretch 14, then 40, and drew as short sparks either way: the stretch was folded into the sprite's speed, which the style's squash and stretch caps. A stretch of 12 now draws a star twelve times as long along its flight, as wide as it was.A walk out of a seat no longer goes through the furniture the seat is in. The twenty-fourth watch-it's Chief walked from the bench straight out through its back to the window, and its showrunner had to add waypoint marks to walk him round. A walk now steps out of a seat the way it faces, and out of other furniture by its nearest side, before going round it.
Someone who comes in to whoever stands by the door is seen. The towed-in Captain stopped in the doorway and stayed invisible all scene.
Studio showed every time in UTC, so a render finished at 23:53 in Alaska read "Oct 3, 07:53", and change history was off the same way. Times are now in the computer's own zone.
Studio's background service stopped answering while it compiled an episode for the first time: every take's lip sync, probe and sound ran one after another and held the service until all were done (4 s on a short episode, longer the more lines). The tools now run beside it, one per CPU, so it keeps answering, and a first compile is faster for it: Hat Day's went from 81 s to 11 s, to the same timeline. ffmpeg's version is asked once, not once per sound on every compile, which took a warm compile from 1.1 s to 0.3 s. A render mixes its stems side by side too.
Opening a show for the first time left Studio's overview spinning for about 40 s: the hidden Timeline compiled the first episode at once, lip-syncing every take, and the overview drew nothing until drift came back behind it. The Timeline now compiles when it is first shown, and the overview shows the counts and proposals as they arrive, saying drift is still being checked rather than that there is none.
An installed Studio started without a shell (no PWD) opened a relative
--showfrom the wrong folder; it now falls back to its own working directory.The director's size passes (balancing sizes, widening for hands, keeping hats in) checked a re-sized shot only as it started, so the twenty-third watch-it's Otto, widened to an MS, had the Captain's face on the frame's edge for most of the shot. A shot now has to hold at its start, middle and end.
Movie Maker capture ran the engine through a shell, which split or expanded a show path holding a quote, a dollar sign or a backtick. Programs the engine runs now get their arguments as they are (
RwProcess), with both output streams read as they come.Recipe sounds failed on any ffmpeg from 8.0, so the Hat Day and Night Watch showcases did not compile with it. 8.0 removed
-filter_complex_script(the graph is now read with-/filter_complexfrom 7.0 on), and its expression parser stops at a depth of 100, which a low saw's 99 harmonics passed (sums are now added up in groups of 32; synth 1.2).A pool, beam or splash of light or shadow is nobody's prop: "A work lamp throws a warm pool of light" asked the twenty-third watch-it's showrunner for a "warm pool" prop, and "throws a long shadow" would have asked for a shadow.
Which way
yawOffsetDegturns a framed camera is written down (a single turns toward its subject's profile, positive, and toward their eyeline, negative; a group's or an insert's camera moves to its own right, positive), and tested. The twenty-third watch-it's showrunner found it by trial, through three refused or flagged edits.The twenty-third watch-it's misreads: a jellyfish that "floats up out of" an egg flew, out of the egg, which hatched, where everyone on the bridge floated and the jellyfish flew in through the door; "It WOBBLES again. Then it CRACKS." rocks the egg the other way and cracks it; "drifts round the bridge, past … the porthole" goes there, and "to the Chief and settles on his shoulder" hangs beside him; "Otto kneels by the nest, peering behind the crates" starts her at the nest, facing it, not at the crate stack.
A line's parenthetical can move its speaker: "(springing up)", "(sitting down)", "(crouching)". Hat Day's Otto said "Way ahead of you, Captain!" springing up, sitting.
A spray told by what comes out comes out of what the sentence says: "Then a gust WHOOSHES out of it, lifts the tricorn clean off the Captain's head" blows from the vent the sentence before named, at the Captain's head, where it played from the kettle. "The" no longer names a prop ("The bridge kettle" for "across the bridge"), and among props named as often, the one named by what it is wins over one named by what qualifies it. A gust, wind or draught is sprayed like steam. Its WHOOSH comes from the vent too, as does "Above the door, the vent WHIRS" (a sentence's subject before the door it names), and the tricorn goes up once the gust gets there, drifting toward the Chief it sails to, where it rose straight into the vent before the gust came out. The beat is on the Captain as it happens: the establishing wide stood in as the door's insert (an element with no parent matched a setup on nothing), with the Captain cut off at its edge, and the single that bridged it to the next wide was Otto's. A close-up of someone in a hat keeps its eye on the third and lets the hat go out of its top: raised to clear Otto's paper hat, it showed the hat and her eyes at the bottom of the picture. A reaction shot that plays on through its subject's own lines is no lesser shot for a short single to take the time of: the Captain's two lines played over the Chief's console for his one muffled "No.". Rendered, Hat Day had more: the tricorn cut off the Chief's head by the bridge's own camera and by close-ups (a set camera that cuts a hat is not taken, and a single of someone in a hat is no closer than MCU), the Captain half out of every three-shot (a group's camera brought in from a wall widens its lens until every body is in), and stars below the deck and past the aft wall's end in wides standing past the open edge (a camera there that sees out of the set is turned, to an angle that hides no one and sees no one from behind).
Whoever holds a tray turns to offer it to the one who walks up to take something off it: the twenty-first watch-it's Chief stood beside Otto, and his mug on the far side of the tray was 1.03 m out of his reach. A speaker hidden behind someone from every angle the line allows is framed in a two-shot with whoever hides them, not a single of the back of their head. A single turns as far as 150° round (EpisodeIR 1.24 allows a framing's
yawOffsetDegto ±180°;set_cameratoo, an insert still ±90°) to find a face turned from every nearer angle (the reading Captain faced where the Chief had stood), and a split of a shot of someone walking no longer cuts away to a listener before they arrive. A crossing to someone goes straight up to them, not to a free mark past them and back. "Sweeps in" is an entrance and "leaves it on" no exit; "Above the aft door, the air vent hangs dead" hangs it there, dead from the start; a sound in a sentence that names nobody comes from whoever the sentence before was about; and a group the crammed-shot pass turns keeps everyone it frames in the picture, someone crouched behind cover too.edit_episode'sset_propremoves a prop cue (remove), retiming what waited on it: the twenty-first watch-it's showrunner left an unwanted lift in as a hold that did nothing. A character the story names with a rank goes by it ("Captain Augusta Fairweather" is CAPTAIN, else CAPTAIN FAIRWEATHER), not the whole name.The heuristic director reads whose a thing is ("his mug", "Otto's mug", and "it" after them), flies every prop a plural names ("three mugs WHOOSH into the air"), puts what a carried tray holds on the tray from the start, lands a thing "back on the tray", drops one "into it" after someone raises a hand, reads "sets off toward" as a walk, and walks a hand up to whoever holds what it takes from. Things on a top go side by side before they stack. A pronoun names no piece of the set ("she" was the kettle shelf), a flight's verb seats nobody ("drops into"), and someone reading ("(not looking up)", "(still reading)", "She reads it") keeps their eyes down and turns to no one. The twenty-first watch-it's showrunner made some 65 hand edits for these.
Someone who whacks, swats or fans a piece of the set ("whacks the smoke alarm", "fans the alarm with it") walks within reach of it first, faces it, and strikes overhead when it hangs high: the twentieth watch-it's Chief whacked the alarm from the hatch, 3 m off.
A thing that acts of itself waits for what its paragraph did before it: the twentieth watch-it's pancake dropped onto the Chief's plate while he was still shuffling to it.
A shot left too long when the shot after it was dropped as crammed is split again, with shots that have room, else the establishing wide: Otto held 12.8 s in one close-up.
A long walk in through a door gets a shot that holds the walker once they are through it, as any crossing does: the twentieth watch-it's Otto sneaked from the hatch to the stove for 11 s on the shot of the hatch.
A thing set on a kit piece stands on the part beneath it: a stove's cooktop, not the top of its backsplash; a shelf's board, not where its brackets hang. The twentieth watch-it's pan floated 32 cm over the burners and its toast 15 cm over the shelf.
The heuristic director turns a shot whose speaker has their back to the lens for more than half the line, as film grammar counts it, not only past two thirds: the twentieth watch-it's Chief said "Smells like breakfast" with his back to the camera for 55% of it, and the cut would not render.
"The pancake" is the pancake, not the frying pan: a prop named by a whole word wins over one whose word only starts it. A thing a sentence stands "on the stove" stands on the stove, not on the floor at the stove mark. Smoke that "billows from the pan" comes from the pan, not from the smoke alarm its word named. The twentieth watch-it's frying pan flew to the ceiling in the pancake's place.
A generated set's establishing setup frames each mark's whole face, not just its middle: the nineteenth watch-it's cargo hold had the fuse box mark at the very edge of its wide, and every scene there opened on the Chief's face cut in half.
A prop stands where its sentence puts it only for its own name's words, not "the" of "The Captain's mug" (which matched "…working down there" and stood her mug on the console), and only within its clause: "a tin on the deck, the crates knocked askew" no longer stands the tin on a crate.
An extruded console (prim.extrude) stands on the floor in the compiler's footprints, as the engine builds it: it was half sunk, so what stood behind its top half was in view and an insert on it looked at the floor.
A walk takes the way round the furniture when the set's walkways go a long way round (more than 1/0.6 its length): the cargo hold's walkways all meet in the middle, and the Captain crossed the hold and back to sit on the crate beside her.
Coverage of people spread across a set: an action beat's three-shot that could not hold everyone now goes to whoever acts, a crossing to the walker, and a pan with a walker that turned the others out of the picture gives way to one on the walker alone. An action with prop business (the spare fuse out of the Chief's own pocket) keeps its shot over a one-word line after it, and a beat's shot that would jump from the one before tries its other angles rather than vanishing. The straight-on fallback for a group kept to no side of the line, and the legal side is now drawn again where a walk ends, as it is after a float: the hold's search had swapped the Chief and Otto as the room saw them, and every camera in the room was across their line. A jump cut on someone crouched behind cover counts them, as film grammar does.
The heuristic director staged the eighteenth watch-it's Meteor Night as written. "On the helm console stands a homemade TELESCOPE" stands it there; whoever the action puts somewhere ("stands in the middle of the bridge") chooses a mark before whoever names no place; "He hefts it" takes the thing named last; "backs in", "thumps it down on" and "the three of them squeeze together at the porthole" are a way in, a putting down and a gathering; a walk to a piece of the set stops at a mark one stands at within reach, else at the piece (not crouched behind the console); its smoke comes from where it was set down. What follows a colon describes a prop rather than its state, and "the popcorn bowl" is not the popcorn machine. At a window, a speaker turns to whom they talk to as soon as the head cannot reach, and a shot showing a speaker's back may become one of the set's setups. A sleeve or a handful is not a prop.
set_cameratakes a turn of -90 to 90 degrees, as a framing has; it took 180 and the proposal then failed.create_fxsays where an effect comes from and which looks are drawn as stars.A big held prop was drawn over whoever stood just in front of its holder: it sits its own radius in front of its holder's card, and the seventeenth watch-it's confetti cannon covered Otto at the Chief's heels. It now comes no nearer the camera than a card drawn over it that stands in front of its holder.
"Otto and the Chief wait in the middle of the bridge, the cannon aimed at the aft door" stood Otto by the door and sat the Chief in the pilot's seat: a first sentence's place is now the one it names first, and a second person there stands at the nearest free mark of the same posture. Someone who comes in with nowhere named and no mark free near the door comes up to whoever is nearest it past the doorway, not across the room; a speaker still walking as their line starts turns to their addressee on arrival; and a shot that shows a speaker's back for most of their line turns round its subjects (
grammar.face_hidden).The heuristic director cut someone walking out of one shot frame-right into the next from frame-right: the seventeenth watch-it's Captain, walking in through Otto's single, failed
grammar.screen_direction, and its first cut could not be shown. A pass after the eyelines turns the next shot (else the one before) to an angle that keeps the direction.The eyeline repair read a look as at someone only when its point was within 0.6 m of their eyes; a look following someone walking lags behind them, so the repair missed a mismatch film grammar found. It reads whom a look is at from the compile now.
A sound word ("The console SPARKS") played only the engine's built-in sparks, though the show has console sparks of its own. The show's effect for it plays first now.
"The Chief backs into the crate stack. It comes down, toppling" changed nothing: a prop's state was read only from a sentence that named it. A sentence that opens on "it" is now about the prop named before. The sixteenth watch-it's crates also stood on the workbench, and its cartridge player "on the helm console" on the floor: a prop stands where its sentence puts it now, and one taller than a bench stands on the floor beside whoever changes it.
A heading's time of day picked a lighting preset by any word they shared: "SHIP MORNING" took the bridge's
ship_nightfor "ship". It goes by the time of day now (the same time, else the same part of the day, else light or dark), and when the set has nothing for it the director says so (director.no_lighting).The director read a prop's state from words said near it. In the fifteenth watch-it, "works on the coffee machine" lit its ready lamp from the first frame, and "sinks out of sight behind the coffee machine" set it steaming, by "out" and "behind" in that state's description. Words of place no longer count, and a state's word said before the prop, with a word of place between, is something done to it.
A prop stood on a surface overlapped the set's own pieces there: the fifteenth watch-it's coffee machine stood inside the bridge's kettle. It keeps clear of them now, unless the piece stands in for a prop the scene has elsewhere; and where nowhere is clear it takes the least crowded spot, not the middle.
A vibrato on a glide swung a fixed number of hertz from where the glide began, so its depth in cents doubled down an octave: the fourteenth watch-it's mew, falling from 1180 to 600 Hz with a 30-cent vibrato, wobbled 59 cents by the end. It keeps its cents now (synth 1.1, so every recipe sound is made again). Its pitch range was right all along; the showrunner read it narrower off a small spectrogram.
A thing set down on a sloped piece of the set floated over the slope at its highest point: the helm console's face slopes down to its screen, and a mug set on it from the pilot's seat hung 30 cm in the air. Things now go on a top's level parts only, the console's flat back. A lamp or a screen no longer blows out a prop or a 3D figure that comes up close to it either: the fourteenth watch-it's kitten, beside the helm screen, glowed white and mint. It is lit as if it stood 0.6 m off; the set keeps its pools.
A thing set down on a surface where something already stood went down on top of it, or wherever was nearest the hand. Now it keeps clear of what is there, and goes beside the last thing put there when the hand reaches: the fourteenth watch-it's saucer landed most of a metre from the kitten it was for. Two things a scene stands on one element no longer share its middle.
A walk whose last corner rounded onto its final frame ended at that corner, short of where it was going. The arrival is always keyed now.
The heuristic director's eyeline repair read a still camera where it would stand at the end of the shot, not at its start where the compiler puts it. A close-up on someone who turns during it passed the repair and failed film grammar.
A
build_setof a set whose earlier build is still waiting replaces it: approving the new one rejects the old. The fourteenth watch-it's first cargo hold, built from a pattern it then fixed, was left pending at the end.The fourteenth watch-it's director made the kitten's business Otto's: "On top of the crate sits a KITTEN" sat her down, "The kitten climbs out of her pocket" walked her off the bridge, and KITTEN was a sound. A sentence that opens on a prop is about the prop now, and a creature that climbs or hops somewhere flies there, out of the pocket it was put in, even one from the scene before. "She scoops up the kitten, tucks it into her jacket pocket, and hurries out" made no business at all, because she was gone before it was read; business now comes before a sentence's exit. "Sets it down on the console" takes the console the scene last put a thing on, not the engineering console named last.
A set pattern whose placement is related to another closer than their two footprints allow is warned when it is proposed (
pattern.relation_overlaps). The fourteenth watch-it's hiding crate was "near" its stack at 0.15–0.3 m, meant as the gap between them; the distance is center to center, so build_set tried 48 times and left the crate, and the mark beside it, out. The schema now says so.A 3D character's model sheet showed its 2D card, so the sheet a showrunner approves did not show the character that plays. It draws the figure now, in every panel, at the card's scale and lit as a set lights it.
The thirteenth watch-it's hand-off two-shot cut Otto's face in half at the frame's edge. The director checked a single's edge for faces but not a group's. Now a set camera for a two-shot or a group cuts no face, a two-shot on a line takes only an angle that cuts none, and a hand-off or a float wide that would cut someone turns, framing them too when that shows more faces.
"The Chief walks over to Otto. He walks back to the aft door" turned the Chief round halfway there: each walk was timed from its own line, and the second began before the first arrived. A walker's next walk now waits until they arrive. The thirteenth watch-it's showrunner could not fix it by hand, because
edit_episodehad no way to add, retime or remove a walk.set_movedoes that now: who, to where, how (gait, speed, in through an entrance) and when.The thirteenth watch-it's director sat Otto in the pilot's chair to juggle: "bounds" and "hops" were no walks. They are now, with skips, leaps, struts, trots and more. "She holds up the scorecard again", after Otto spoke, gave Otto the Captain's scorecard: a pronoun's business on a thing someone else of that pronoun holds is now the holder's. "Pulls an oily rag from his pocket" made no cue: a thing pulled out of a pocket or a coat now comes into the hand, and juggling is using.
The thirteenth watch-it's first cut would not compile: four film-grammar errors in a cut the heuristic director had kept legal. The compiler read the axis's legal side from the first set camera that framed both of the pair, a later shot on the other side, while the director read it from the establishing wide. Both now use the establishing setup. And a pair off the scene's axis could look the same way across a shot/reverse-shot; the director now checks eyelines as film grammar does, and turns a shot, or cuts to a two-shot, to keep them opposed.
The twelfth watch-it's director misread three things. "Dashes to the lighthouse crate" went to a mark called
crates: a phrase now names the mark or the element it names more words of. "Creeps in through the hatch to the aisle" stopped at the hatch, and "creeps down the aisle" did nothing for someone already there; both now walk to the aisle. "Holds out her hand" made no gesture: there is now a holdablehand_outgesture, the director reads it, andedit_episodegainsset_gestureto add, hold, release or remove one.A prop state that hides every part now shows nothing. The twelfth watch-it's drone, placed "gone" until it zips in, drew its own look from the first frame: a state that built no geometry was never registered, so the engine fell back to the default.
Turning a crammed shot to an angle with room could repeat the shot beside it. The tenth watch-it, directed again, cut from the Chief's reaction to his single on the same picture. A turned angle must now be no jump cut from either neighbor, and when every angle with room would be one, the neighbor plays on instead. All four of the eighth to eleventh watch-its now direct with no grammar warnings, and the tenth is a test.
A generated character whose archetype's role offers a choice takes the one their story names. The eleventh watch-it's "Captain of the Marigold" was cast as "captain or first mate".
A prop the action handles that the set does not dress now stands somewhere. "Otto opens the toolbox" stands the toolbox on the bench beside her from the scene's start, and "lifts the music box" takes the box from there. The eleventh watch-it's toolbox opened unseen, and the music box appeared in Otto's hand.
The eleventh watch-it's galley: the Captain stood in the bridge's back corner, Otto and the Chief walked up to her, then drifted to the kettle shelf beside her. Its draft cut between singles on lenses widened to 8-10 mm against the wall, shots looking past backs, one camera inside Otto, and two people in one body. Five fixes:
- Walking up to someone ends at their side as the room's camera sees them, and where the newcomer hides nobody from it, before in front of them with a back to the room.
- A drift toward something comes to rest clear of everyone else and the furniture.
- The axis lapses while the pair floats and is drawn again where they land, so a drift that turns the old side to a wall leaves the camera in the room.
- Coverage prefers framed angles with room to stand back. A shot still crammed, or whose camera stands inside someone, turns or resizes to one with room, else gives way to the establishing wide.
- The director's snapshot of a scene left out who floats, so coverage framed floating heads on the floor and read the axis as if nobody floated.
Entrances go where the sentence sends them. "Climbs down through the hatch and creeps over to the core" went to the hatch. "Comes in behind her" goes up beside her (the woman the sentence before was about). Someone who walks on with nowhere named stops on a mark they can stand on. The eleventh watch-it sat the Chief in the pilot's chair.
A scene that two people walked on to through one door could be shot from the wrong side. The axis side was read at the scene's first frame, where both still stood on the doorway, so it fell to a default. In the eleventh watch-it that default was the engine room's cramped back side: backs of heads, the core blocking the view, one black frame. The compiler and the director now read the side where the pair first stands still, apart, on stage. The axis holds from then on, so a walk-on shot before it isn't judged against a line that flips as they come in single file.
A posture or expression change that began while the one before was still blending started from that one's end, so the pose or face jumped. The compiler now ends a blend where the next key starts. Every key keeps its frame, and the engine's sampler draws it as written.
A character who talked while walking could walk out of the picture. In the tenth watch-it's engine room Otto crossed to the core, in frame for none of her line. The director now keeps a walker in the shot, and keeps a talking walker's face to the camera. A shot pans with them when the style allows a pan, and widens or gives way to the shot before when it can't. It needs no cut while the shot already up holds them, and no close shot goes on someone about to walk.
The tenth watch-it turned up four things:
- A scene whose only character walked on was dropped as empty. Blocking may now be empty (EpisodeIR 1.9): everyone in the scene walks on.
- "The Chief fills the kettle" used a kettle still on its shelf, and the compiler warned he did not hold it. A thing used that is not in hand is now picked up first.
- "(serenely)" and "(calmly)" had no effect, nor did "(gruffly)" or "(small)". Calm reads as deadpan and a little slower, gruff as annoyed, small or timid as soft.
- The continuity log credited the kettle gag to the scene that set it up, not the one it played in. A gag is now evidenced where most of its beats are, the later scene on a tie.
In the ninth watch-it, Otto's "Found it!" was too short for a shot of its own. It took the time of the float's wide, so the whole float played on a medium shot of Otto with her head rising out of frame. A float's wide now keeps its time, as a hand-off's shot does, and the line plays in it.
"Everyone hits the deck with a THUD" did not land a float, so the ninth watch-it's crew came down 2.5 s in, not on the THUD. Hitting the deck, floor or ground now lands it.
A walk between places no walkway joins went in a straight line through whatever stood between them. On the Marigold's bridge, the helm to the engineering console went through the console, and the galley to the door brushed past the seated Captain. Such walks are now planned round the furniture, keeping a body's width clear, as the set generator plans walkways. They stay straight when nothing is in the way. A walk from beside someone goes round the people standing too.
The framing balance could tighten a scene's establishing shot to MLS, which film grammar then flagged (
grammar.no_establishing); it no longer re-sizes one. And a sentence naming none of a prop's own words ("The gravity HICCUPS") no longer switches its state because the prop's name starts with "The".The model director left an episode at EpisodeIR 1.3 whatever it wrote, unless the screenplay had titles. Props that name a place, repeating sounds, and now walks to someone all need newer versions. Both directors and
edit_episodenow raise the version to what the episode uses (core/src/director/versions.ts) and never lower it.A generated character's voice ignored how they were described: the ninth watch-it's captain, "calm to the point of absurdity", came out quick and lively. The voice's pace, energy and pitch now lean to the archetype's and the story's words (character sampler 1.3.0).
The model director was still told props were not drawn, and dropped prop cues when it re-directed. It now sees the show's props and their states, can write prop cues, and its prompt has the rules the heuristic director learned from the watch-its.
From the ninth watch-it: "Otto scrambles out" was not an exit (more ways of coming, going and crossing are read now: scrambles, dashes, darts, flees and the like); the core's HUM played once (a hum, whir, buzz or tick goes on by its nature until action stops it); and still previews of an unvoiced episode failed for want of takes (they time lines from estimates, as the storyboard does).
Short legs slipped on long gaits (the M2 polish review): a step the legs could not reach was shortened, but taken at the compiler's cadence, so the planted foot slid forward under the body: the Chief's by 3 cm early in a walk's stance and 8 cm in a stride's. A short step is now taken that much more often, so the foot stays on its spot. The actor state's
gait_phasecounts cycles instead of wrapping. The Lighthouse has no walk, so its goldens did not move.A small figure wore its rim light as a halo (the M2 polish review): the rim kept a third of its width however small the figure got. Below 168 px tall (where the lines stop thinning) it now keeps narrowing with the figure and fades, gone by 72 px. Figures drawn 168 px tall or more are as before, so the style swatch goldens did not move.
An afro read as a box (the M2 polish review): a ball cut flat at the ears, with sharp corners and barely scalloped. It is now a round cloud of eleven lumps of uneven size, set higher on the head, its underside curving up to the sides with the corners rounded off, and from behind it comes down over the nape in a U. It still turns without popping.
An episode with its continuity recorded could not be re-directed or re-cut: the log's evidence cited shots, and a shot that went away was an error that refused the change. Stale evidence is a warning now, asking for the log to be recorded again, and
record_continuityrefuses evidence that points at nothing when it is written."Otto climbs in through the hatch and hurries to the workbench" left her at the foot of the ladder: a sentence's first motion was its only one. An entrance now walks on to where the same sentence sends them.
An unvoiced line under a word-anchored cue made the compile say "word 6 is not in l04 (not a line)". The line's take is what is missing, and
take.missingalready says so.Back on a set for a later scene, the director forgot where everyone had been, and a first action that walks someone somewhere ("runs to the workbench") started them there already: in the seventh watch-it Otto began at the Chief's bench and he at its side. A return now starts each character where they were, and a walker starts away from where they walk.
The continuity log credited a beat in a return to a set (two scenes with the same heading) to the first visit. It counts scenes that share a heading now.
"He does not look up" had him look up: the director matched action verbs under a negation. A negated clause now makes no cue, and the rest of its sentence still does.
A muffled line from behind cover stood its speaker up to say it, in plain view: the Chief rose over the console for lines the script kept hidden. A "(muffled)" or "(unseen)" line now stays down and is covered from where the voice comes. Two group shots that took a framing without checking faces (the periodic two-shot on a line, and the wider shot on action) turn round to show them, and the two-shot is skipped when none shows the speaker.
Props never reached the screen: the compiler only timed prop cues and reported
compile.prop_not_rendered, so the M5 watch-it's buoy and the sixth watch-it's kettle and mugs were in the script and nowhere else. They are drawn now. Nothing could change a prop's state either, so the eighth watch-it's drone kept its eyes lit after its battery died; a prop cue'sstatedoes it now.episode.timelinewith achangefailed for a proposal's new episode, which is not on disk yet, and a compile of an episode's other version took its cast and sets from the file on disk. Both use the version given now.A line's look ignored whom the line was to: "(to the Chief)" or "Chief?" still looked at whoever spoke before. The heuristic director now reads both, and a title with a last name.
A single on someone who turned away from their axis partner, or who stood off the axis, was solved against the partner or whoever stood nearest, so the camera often saw their back: the sixth watch-it's showrunner rewrote Many Happy Returns seven times around it. A single now plays against the one its subject faces (
docs/design/m1-compiler.md§4).The heuristic director widened singles for the framing balance and for a beat's hands without checking the camera again, and a wider single could stand back across the axis. Every size change is checked now.
A gesture's follow-through left the hand a little off rest as the gesture ended, so the hand popped back on the next frame. It now settles with the gesture's envelope.
The style's
motion.gestureIntensityscaled a gesture twice: as the default intensity of a cue without one, and again in the engine. The engine alone applies it now; a cue without its own intensity is 0.5.A facepalm at less than full intensity stopped short of the face. A hand that touches the body now reaches it at any intensity, and a held pose (arms folded) is always the whole pose; intensity sizes beats only.
A generated character could be dressed in their own skin tone: tan skin and an orange jumpsuit, lightened to meet the contrast rule, read as bare skin (the M5 watch-it's captain). The main garments now pass over pick colors within 0.06 of the skin in OKLab's hue-chroma plane while the pick offers others. Character sampler 1.2.0.
grammar.no_establishingfired on a return to a location the episode had already shown (the bridge, the Snapdragon, then the bridge again), asking for a wide shot nobody needs. It now fires only on a location's first scene in the episode.A wide camera on a set's open side could back out past the floor's edge and show the room floating in its backdrop. It now comes in until the edge leaves the frame (set sampler 1.1.0).
An MCP client was sent at most two preview images per result.
Engine test runs in one worktree could delete another worktree's engine files. Each checkout now has its own Godot user folder.
A standing stance no longer bends a short-legged, big-footed character's free knee into a squat (the Chief read as half-crouched in long shots).
A walk between places no set path joins follows a chain of the set's paths instead of a straight line through the furniture, and a voice that is never seen no longer sets a scene's axis.
Cached silhouettes now key on the engine code that drew them.
Kit pieces stand on their origin in the compiler, so effects emit from their anchors.