Skip to main content
This page lists every DeckTalk release, newest first. DeckTalk follows semantic versioning. A change to a file format or to the page contract raises the minor version. The file formats are decktalk.toml, cues.json, and the build artifacts. A page loads the runtime of the engine that opens it, which DeckTalk serves at /__decktalk/decktalk-runtime.js, so upgrading DeckTalk upgrades every project’s runtime with it.
docsfeaturefixperformance
2026-10-14
Documentation
  • measure the release that the README and the numbers page describe (9335e98)
Features
  • assemble: match every clip’s sound to the narration’s loudness (e62dd75)
  • assemble: write a captioned copy whose captions the page draws (dcf2454)
  • bound each run’s events file and cut long log lines (3e8249e)
  • bridge standard logging into the run’s event stream (1cd9010)
  • check: a project’s runtime copy is checked against the engine (cf49356)
  • cue: an unresolved cue names its line and the nearest phrase (a11096e)
  • dialogue, stepped recorder and motion, render speed, security and docs (f9ced15)
  • film: draw a project at its own canvas size, wide, square or vertical (8725223)
  • findings: PAGE_RUNTIME_STALE judges a stale runtime copy (d2fa57c)
  • leave a debug record naming the frames and events files a prune removes (4a1b9cd)
  • leave a standard log record for every stalled recording retried (e56a1ac)
  • media: an element row carries its stagger’s child count (95b3ef5)
  • media: ffmpeg calls honour cancel and tools.timeout_seconds (dfce2e0)
  • narrate: add one spend switch and a takes directory (7b091a3)
  • narrate: buy one turn again and judge each part on its own (f566daa)
  • narrate: keep paid takes safe in two places (3336d8f)
  • narrate: time a take that came without words through the aligner (422f2b6)
  • narrate: voice a section turn by turn in dialogue (aa1c3df)
  • prepare DeckTalk 0.6.0 for launch (a2c3466)
  • record fetch waits, verified downloads and the build lock (75c32c1)
  • record swallowed fallbacks and a recorded page’s console (3adde98)
  • record why every cached artifact was kept or made again (a2c8715)
  • record: an untrusted page runs sandboxed, confined to its origin (e107bee)
  • record: record by stepping the section clock and declare motion (6f67126)
  • record: record each section in chunks and report undeclared motion (93d3d19)
  • record: record page sections concurrently (d35466c)
  • runtime: serve the page runtime from the engine (56e2202)
  • say why a run ended and where each log line was written (edc6a7f)
  • speech: add a closed set of voices behind one seam (08d9e68)
  • the 0.6 engine, a hosted engine, honest results and a smaller codebase (fe448ec)
Bug Fixes
  • apply every edit of a fix or none of them (53cce2a)
  • apply every file of a fix together, key edits included (249c3de)
  • artifacts: the recording key names the engine that recorded it (bdfad8d)
  • artifacts: the take index names its files by a hex digest alone (be81985)
  • bound the frozen-frame store by removing idle frames (6a19bda)
  • bracket an IPv6 serve address and drop unused URL helpers (22fdb8b)
  • browser: every launch names its page policy (0a34521)
  • carry clip speech in the transcript and record exactly the frames a film plays (40f6630)
  • check: name what reports each finding and say what to do about it (d0bf3c3)
  • check: the price is said once, by the spend it carries (1906697)
  • cli: check —fix judges again exactly what it was asked to judge (01e4d4e)
  • cli: judge ok once and draw the storyboard once (1ad7872)
  • cli: lay a piped table out at the full COLUMNS width on Windows (6d6312c)
  • clip: take a cut’s sound from the film and a clip’s words from the file beside it (f9f24dd)
  • cli: report each download as it arrives and say plainly what each command does (04479f9)
  • close the launch blockers in logs, cues, the mix and the CLI (be92765)
  • close the review findings, the ci platform rows and the edge cases (b3385dc)
  • close what the final review found (bc72b4b)
  • count every sentence through results.counted (724a671)
  • count panels, rows, refusals and keys through results.counted (1a6ed00)
  • cues: an accented or typographic word is matched whole (91343e1)
  • fold a transcript’s case the way a cue phrase is folded (35977b0)
  • gate the section join and trust no cut without its key (15d37b0)
  • give a render section its own type and open every page through one pictures module (1a4f683)
  • hold [video] slate_color to a hex colour at load (ab1f97a)
  • inputs: every project path resolves inside the project (e15506c)
  • inputs: every run refuses a build tree that leads outside it (c0662db)
  • inputs: hold every project number to its range and name what each stage reads (89ce7e3)
  • inputs: the refusals a project meets read as whole sentences (74f3c14)
  • keep an edited runtime copy unless the caller accepts the loss (61835de)
  • keep stderr pure JSON lines under —events (9366a24)
  • keep the preview server’s tracebacks and queries off stderr (6aa9f46)
  • key a clip’s slate by what it shows so an edit redraws it (408f69f)
  • leave a log record with the reason when explain, chapters or the page catalog fall back (f225858)
  • let a run waiting on the ffmpeg fetch lock be cancelled (8b01900)
  • let a stage build again its own earlier artifact that it cannot read (2b5c041)
  • let check —fix replace a stale runtime copy with the engine’s (5d7062e)
  • let rich read NO_COLOR so it outranks —color always (44f35a8)
  • lint: Biome is pinned once, and biome.json names that release (5e0c11c)
  • media: ffmpeg and ffprobe get the scrubbed environment too (d5552c6)
  • media: ffmpeg opens a project file with the file protocol alone (ab2ea83)
  • media: the toolchain is resolved per run, not once per process (6aad0ac)
  • media: what a page said reaches the run, not a warning log (6903f29)
  • name a page label that is not text rather than raise (ddfa0e7)
  • narrate: keep every paid take in one module (b88a2f0)
  • narrate: play a silent take as silence, write each placeholder once and drop unprinted takes (efa6c75)
  • narrate: stop a failed pool by a flag so its wait always returns (92bd7ec)
  • narrate: stop runs from buying what they must not buy (a3600af)
  • never watch the build folder a project names (88c8720)
  • open the poster page with the documents every frozen page gets (90b50ea)
  • origin: the project root is never a served directory (8061419)
  • pagescan: a stagger’s span counts its children, not its flag (417460c)
  • pipeline: every run-first hint is read from the pipeline table (63e5517)
  • price every spend through one rule shared by the stages (0226dd5)
  • print settings values in the JSON spelling config set reads (118fa5b)
  • project: what the load noticed is a warning on the run (8d79164)
  • publish each page attribute’s code by name, from the one code enum (6107b4f)
  • read a whole-number float as the integer key it names (638a495)
  • read loudnorm as JSON so a silent mix is not 0.0 LUFS (3f55326)
  • read no project .env outside a run (8c7f393)
  • read the cue schema off pydantic so it drops the line row (a812094)
  • record every section that fails after a pool’s first failure (ba04bd0)
  • record: hear every change a page draws and cap each encode’s threads (aac0794)
  • record: refuse a project’s programs by default and hold each page to a deadline (46b283f)
  • record: the page policy joins the still and recording keys (f1131cd)
  • redact every registered secret from every line and error (8e64bd3)
  • refuse a build directory that shares a served directory (0f835c5)
  • refuse a build lock file that cannot be a lock (94cd803)
  • refuse a machine-scoped override given to one project (ad5d2fa)
  • refuse a section range written backwards (b0708f6)
  • refuse a settings write through a project file linked outside (04be78d)
  • refuse an ffmpeg download the network refuses as a tool error (e487433)
  • release: the performance section carries the heading the docs tag (25bcecb)
  • remove the cuts of sections the project no longer declares (7397d4d)
  • report every ignored key on the run rather than in a log line (67e67b4)
  • retry a free voice, narrow four refusals and correct the docs (e1071b8)
  • retry a stalled voice reply and record every attempt and wait (ed5f323)
  • runtime: draw a frame hook once as the page hands it over (7db9e22)
  • say a misspelled key or variable on every config verb again (2479e2c)
  • say on a stage line how the stage ended when it did not end ok (50724ce)
  • say one file, one panel and one character in the singular (4d8fe09)
  • say why a fix was left alone on the run and render the fixes a command applies (057a8a4)
  • say why the tools keys give no encoder rather than reporting it missing (f5b98d4)
  • serve a preview the cue-times alias its docstring promises (e63d560)
  • settings: the page policy is the machine’s to set (7ea4963)
  • show a recorded page’s console.error as a warning (39acf37)
  • skills: the skills agree with what —section voices (3692300)
  • speech: refuse a host provider under a shipped name and send no context at zero (6ac2dd9)
  • spend: price and cap the whole build (1421eff)
  • stages: price voice and sound in one module (c06b535)
  • state the price in the spend gate’s refusals with Spend.sentence (dadef4d)
  • take a whole table out of a settings file in one write (fc8642d)
  • tomlmap: a mistyped key is offered the key for what it names (725393b)
  • toolchain: a Chromium fetch keeps its output and has a time limit (67f586d)
  • toolchain: two cold ffmpeg fetches keep each other’s download (0610332)
  • trace every subprocess and scrub the Playwright installer (3548ab6)
  • verify: a clean build’s notes are written for a first-time reader (868f974)
  • verify: cue times placed from another cues.json read as stale (7574d17)
  • verify: the no-shape refusal names the project’s build directory (8ffda58)
  • write a run’s lines in the order of their seq (c9f171c)
  • write the captions and chapters together or not at all (7244885)
Performance Improvements
  • assemble: keep a section cut whose inputs did not move (66abaf8)
  • check: a frozen frame waits for paint rather than a fixed settle (e4dfdfa)
  • check: check, storyboard and the poster share frozen frames (9cd073e)
  • close a served origin at once rather than on a half-second poll (90a6e92)
  • cue: a section’s words are normalised once, not once per cue (2385484)
  • fingerprint file content with BLAKE3 on every core (64b794a)
  • record: scale the cover scan and read the middle frame once (941b32e)
  • verify: decode the film once and compare every frame in process (09606a2)
  • write and read JSON no digest takes through pydantic-core (0c8b429)
docsfixfeature
2026-09-26
Documentation
  • readme: the install line names the release the page describes (a047026)
Bug Fixes
  • docs: every page’s front matter parses, and the link check holds it (2aa8b0b)
  • api: the closure resolves an annotation instead of reading its source text (41c9f55)
  • assemble: an optional clip’s slate is what the project asked for (26a8b07)
  • ci: cue timing reports rather than gates on a weak compositor (89eafe2)
  • cli: a run says what it did rather than what it would have done (d2af0d0)
  • cli: every help link lands on the command’s own section (e711357)
  • cue: the file a fix writes is a file the next command reads (fd0943f)
  • explain: the resolved cues are read in the shape cue writes them (de44d54)
  • findings: a raiser names a code and a code names every key (8632a7d)
  • findings: one certainty per code across both registries (e31e943)
  • findings: the appear-too-long sentence names the condition it judges (23ad13d)
  • media: a path with an apostrophe in it survives the concat list (e67a305)
  • media: the machine can measure itself and the preview serves what a run does (a476082)
  • origin: a declaration names a spelling rather than a file (c63eeb3)
  • project: the four asks T5 left on the project facade (1359115)
  • prose: the four semicolons the prose rule names (ee2532d)
  • results: a config answer carries the layers under it and the arithmetic above it (5850e87)
  • results: a section may be numbered zero, and CUT_POP names the picture (b5079c0)
  • runtime: a frozen slide hides whatever has still to arrive (9f67025)
  • settings: every sentence a knob prints names something that exists (aacee04)
  • settings: the measured bias claims only what a run really does (7f9799d)
  • template: the lesson example is summarised as what it is (5df6e05)
  • tomlmap: a table hands its unknown keys back instead of writing them down (9c1ea32)
Features
  • agents: AGENTS.md points at the instruction set rather than repeating it (5ef668f)
  • api: generate the exported surface as its reachable closure (fafe20c)
  • api: the explainer joins the exported surface (af3a57b)
  • api: the facade and the shapes it hands back join the exported surface (da6d6f7)
  • artifacts: every build file is one frozen model that reads and writes itself (d1f9c31)
  • build: six stages in one order, with the storyboard before any credit is spent (5ae7b1e)
  • catalog: walk the library’s own contract once, internally (d8ece48)
  • errors: nine codes, seven classes and one exit each (3402c16)
  • events: one stream of eleven moments, with the four fields minted (fc49aae)
  • findings: one judgement with a code, a place and a fix (16dd3ac)
  • machine: a measured doctor keeps the number it measured (93662a7)
  • machine: one value for this computer, and the run every call opens on it (722c6bf)
  • media: a render carries the motion its settings ask for (064e503)
  • media: fetch Chromium on demand, the way ffmpeg already is (e192bd7)
  • media: the origin serves the deck and the assets a project declares (d808cb9)
  • media: the recorder owns what it opens and reads the page once (5bc87dc)
  • page: generate the bundle, the contract and the Python vocabulary (01dc72e)
  • page: one home for every page attribute and every page code (eaf0657)
  • pipeline: declare the six stages and the artifacts between them (286d694)
  • project: one object opens a directory and twelve calls move it forward (4bc00e7)
  • results: one frozen result per command, with four reserved keys (112e97e)
  • results: the two facts the command line derives its shared flags from (8781df8)
  • runtime: scenes, slides and the order declared ownership gives (9258d87)
  • runtime: the clock, the warnings and the stage a deck is drawn on (e9f2c7c)
  • runtime: the four modes, the preview alias and the facade (0ea5c0d)
  • runtime: the four moments, the class, the swap and the transcript (16d6a3c)
  • runtime: the recorder’s telemetry moves behind one seam into the probe (aed15b1)
  • scripts: one command regenerates every generated file (e121ee1)
  • scripts: rehearse the release bump on every pull request (0f613a3)
  • settings: a refused value carries the line that set it (a761feb)
  • settings: explain one knob against the project it would change (717cbea)
  • settings: the door a measurement writes a measured key through (c1ef682)
  • settings: the knob table rebuilt, with the published range enforced (e5365c1)
  • settings: unset beside write, so a key can be taken back out (d606563)
  • site: the site serves the schema every project file names (7de636e)
  • storyboard: the four selectors that narrow the sheet to one moment (ccb9202)
  • template: AGENTS.md points at the instruction set instead of repeating it (f0088dd)
  • template: the lesson example rewritten in markup, on the whole vocabulary (290b41d)
  • template: the starter deck written in moments and local cue names (ff1a77f)
  • the 0.5.0 quality release (8666520)
  • toolchain: a download announces itself to whoever is listening (0d5e1b9)
featurefix
2026-09-23
Features
  • brand: apply the voice identity to the mark, the graphics and the tokens (27b40bd)
  • site: a one-line installer, and what four containers said about it (3f4633d)
  • site: group the install steps, and pin every copy of the command together (bf6c0b2)
  • site: name every place the edited number lives (c13b3e3)
  • site: one install command, and a copy button on every one of them (b7e899e)
  • site: serve the installer as text, so a browser shows it (7ecb1d9)
  • site: the install moves to the header, and a section scrolled past still reveals (ec2d858)
  • site: the screening-room homepage, built from the Halfway film (9e35b38)
  • the screening-room homepage, the brand it is built from, and the docs theme (6a8fb64)
Bug Fixes
  • align: read a data-cue element as part of the scene that holds it (3113fc2)
  • brand: retire the last of the old electric blue (aaad7d7)
  • cli: name the unit in the narrate cost line (baaddf8)
  • cut each take at its sound end, and measure the cut where it plays (82d584c)
  • narrate: cut each take at its sound end so its tail is silence (46a1633)
  • readme: the hero image and three links that go nowhere (5406f75)
  • site: call it Films, the same word the URLs already use (4295258)
  • site: link the extensionless path, so no internal click costs a redirect (90e663e)
  • site: one sound control, and the install line keeps the weight (b7542a1)
  • site: one voice at a time, across the page (ade79dc)
  • site: put the install line above the film on a phone, not below it (1c428b5)
  • site: show the page even when the page’s own script fails (7f49b46)
  • site: the film is the unmute control, and the hero has one left edge (8667dd2)
  • site: the film pages kept a nav from before the site had four pages (13a8e27)
  • tests: busybox takes the shell as an argument, not a flag (9d5ca87)
  • tests: do not import pty at module scope, so Windows can collect (3031095)
  • tests: judge a build by the verdicts that exited it, not every verdict it reported (2ead632)
  • tests: put the late-frame rule in one place instead of in each test (dacf801)
  • tests: read released versions from the changelog, not from git tags (5496b37)
  • tests: wait for the reveal, refuse the voice clip, and say what went wrong (6c60bb0)
  • verify: place the cut check on the mix’s timeline and name the cut it judges (d665991)
feature
2026-09-19
⚠ BREAKING CHANGES
  • verdicts: give the three counted judgements verdicts of their own
  • cli: wire —from and —to, retire measure and check, and report a stale recording
  • narrate: fold the narration clock into the take index, with a lead and a tail per take
  • cli: make the CLI a package that prints one envelope and one exit code
  • assemble: split the stage into cut, mix, loudness and publish, and write what a viewer needs
  • verdicts: make an unparsed or missing KaTeX a certain finding
  • record: fold measure and check into one record package
  • narrate: identify a take by its content and price the plan before it runs
  • align: check cues and pages against each other in both directions
  • rename the vocabulary for 0.4.0
Features
  • align: check cues and pages against each other in both directions (7fd3603)
  • api: export the cut list reader (6b81600)
  • assemble: split the stage into cut, mix, loudness and publish, and write what a viewer needs (5dccf25)
  • build: run the real verify last, and write a progress log an agent can read (1ad53a9)
  • cli: make the CLI a package that prints one envelope and one exit code (ee6bd9b)
  • cli: wire —from and —to, retire measure and check, and report a stale recording (2289630)
  • give every stage one result and enforce the five layers (f51ba4d)
  • media: fetch a pinned, SHA-256 verified ffmpeg build in place of static-ffmpeg (ba8be62)
  • media: serve every page from a local origin, and add decktalk serve (dc238f5)
  • narrate: identify a take by its content and price the plan before it runs (0ac39c4)
  • providers: keep the ElevenLabs key on an https ElevenLabs host (5d3b94d)
  • record: fold measure and check into one record package (b02e56b)
  • record: keep a section whose scene, assets, words and cues are unchanged (bf371fa)
  • runtime: rebuild the page runtime on markup slides and close the first-frame race (39aab42)
  • runtime: write each reveal’s description on the cue log row the transcript reads (fe107ee)
  • scaffold: make init write a small starter, an example, the skills and AGENTS.md (fcea3e8)
  • scaffold: ship KaTeX inside the wheel (cbcad35)
  • screenshots: give every written PNG a row, and add —json (93cb221)
  • scripts: check every internal docs link and the navigation (21c8a63)
  • skills: ship the six skills an agent works from, and a test that keeps them true (b237a47)
  • status: read the four input files against each other, and report the run (b8c9298)
  • verdicts: give the three counted judgements verdicts of their own (5a7ed81)
  • verdicts: make an unparsed or missing KaTeX a certain finding (7eec66c)
featurefix
2026-09-15
Features
  • beats: warn when a cue phrase occurs more than once in its section (1174081)
  • clip: add decktalk clip and decktalk words (846de9f)
  • narrate: add lead_seconds and tail_seconds, and allow hold_seconds on any page section (ce4baf9)
  • narrate: print the take plan in a dry run, and add —json (bd34f89)
  • preflight: check a voiced build before it spends credits or records (6af0507)
  • runtime: list each step’s cues in the catalog, and freeze just before a cue (fe329dd)
  • verify: check that the cut into a carries_previous section does not pop (91e6578)
  • verify: mark a cue that passes by a thin change as THIN CHANGE? (ffc09b6)
Bug Fixes
  • assemble: warn about a recording that measure has not read (95896c0)
  • narrate: refuse a silent run over voiced takes unless forced (6517ebc)
  • narrate: stop padding a cached take again on every run (93d643a)
  • verify: count only the sections in decktalk.toml (32112eb)
  • verify: fit probes and controls between close cues (f4dee0e)
feature
2026-09-14
Features
  • assemble: caption the speech inside a clip section from its words file (cf5b938)
  • captions: break captions at sentence ends (3a7df4c)
  • chapters: merge consecutive sections with the same title into one chapter (0191f1b)
  • narrate: keep a renumbered section’s take by copying it to the new name (41ced3f)
  • template: port the approved demo film’s lesson into the scaffold (0f5332a)
  • template: port the v16 demo film’s edit into the scaffold (a530783)
featurefix
2026-09-14
Features
  • a demo deck built to a fifteen-person review, with a WebGL loss surface (148e59f)
  • captions, chapters, measured cue offsets, and a loudness pass that hits its target (27a8c1d)
  • close on “Update your video the way you update a doc.” (339dfe9)
  • closing scene, a cut check in verify, and a cover that survives a late capture (b1e1cdd)
  • demo deck after the round-two design and content review (1c5e44c)
  • demo v10, the storytelling panel’s rewrite of all five scenes (8754f83)
  • demo v11, a lay lesson on how AI learns, with a slot for B-roll (dd9147e)
  • demo: a ball walks the too-long and too-short paths as their markers appear (e25bade)
  • lesson-shaped scaffold, vendored KaTeX, pause directions, and page warnings (5ee46a8)
  • machine-readable output and one exit policy for the read-only commands (393cbf8)
  • pass the slide and cue context to handlers, freeze at one cue, and warn on unreachable reveals (675894d)
  • play a clip between page sections, with the narration paused around it (e884b29)
  • record: log when each cue was due, ran, and drew in the sidecar (a9a25b3)
  • record: pass the previous section’s words as prevwords, so scene 2 carries the Open’s real count times (04cb547)
  • refine the graphics and adopt the four-tick mark (142f511)
  • show the function before naming it in the demo, and close on decktalk.app (f9f251f)
  • site: host the demo video with the homepage (fecdfa2)
  • social card, README rebuilt around the lesson scaffold, and limiter headroom (2a4a93b)
  • teach the learning rate honestly in the demo’s gradient descent scene (0b8a958)
  • template: open the lesson on its title and bring in the rules card on “rules” (e596540)
  • template: scaffold the v12 demo film (ce17e25)
  • verify every cue by default, catch unknown cue ids, and keep clips at the edges (bd6c236)
Bug Fixes
  • accept -v and -q after the command, export result types, and report unexpected errors cleanly (ffd86ad)
  • captions keep the script’s punctuation and the onset scan sees low-contrast reveals (24357b7)
  • count only the part of a frame stall that falls after narration starts (1be18ee)
  • cover the page until the clock starts so a cut cannot miss the marker (f33a2d9)
  • define gradient descent before the surface appears, and hand off once at the edit (1b25627)
  • exact frame seeks on every ffmpeg build, and sidecars that explain synced reveals (2499312)
  • fail check on a page error, warn on bad TeX and dead cues, ease the ball steps out, and keep doctor from downloading (171f4bf)
  • narrate: pad cached takes to min_tail_seconds (df93b08)
  • print a skipped verify row’s reason once (2cf727d)
  • quote scene 3’s real length in the edit scene and give the close a beat (7f368cc)
  • read and write every text file as UTF-8, so init works on Windows (645aebc)
  • record: keep frames flowing after the cover so still pages record reveals on time (0abcf45)
  • report unknown cue ids from beats instead of stopping before the table (63208b9)
  • runtime: draw the preview index in the page’s own colors (5eec565)
  • say the thesis once in the demo deck (a677391)
  • start the clock on the next frame, detect and retry stalled recordings, and make frame comparisons build-proof (91cd81c)
  • timeline positions from decoded audio, word-synced reveals, a click test for sync, and a scaffold that teaches gradient descent (9b38bc2)
  • trim the scanned span per stream so the looped reference frame is not seeked past its end (028c845)
  • verify: compare luma only, so a static colored frame reads zero (d74bdc6)
  • verify: confirm each onset on 8 by 8 blocks, so encoder ringing never reads as an early reveal (8e9887a)
  • warm every scene 3 mesh so no cue freezes the page on its first draw (938f9a3)
  • warm the scene 3 figure at its real drawing state before narration starts (90807c4)
  • warn on unknown decktalk.toml keys, let doctor pass without KaTeX, and add optional clip sections (dcc4dbf)
  • warn when a step mounts equations without KaTeX in cue mode (2005a4a)
release
2026-09-12
First release. DeckTalk turns a markdown script, plain HTML slides, and an ElevenLabs voice into one mp4 in which every reveal lands on the word that introduces it. It records the slides in headless Chromium, cuts each section to the narration frame-exactly, mixes an optional soundscape, normalizes loudness, and verifies the result. Chromium and ffmpeg arrive through Python packages, and --silent renders a full draft without an API key.