> ## Documentation Index
> Fetch the complete documentation index at: https://docs.decktalk.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> See what changed in each DeckTalk release, including the file formats and the page contract.

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 project keeps the `deck/decktalk-runtime.js` it was created with. To move a project onto a newer
runtime, create a new project with the new DeckTalk and copy the deck pages across.

<Update label="0.4.0" description="2026-09-19" tags={["feature"]}>
  **⚠ 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

  * **narrate:** fold the narration clock into the take index, with a lead and a tail per take ([5a6120a](https://github.com/jacobcbeaudin/decktalk/commit/5a6120a213de7d70ab0190bcc20c4afa65e59152))

  * rename the vocabulary for 0.4.0 ([6b2a9fe](https://github.com/jacobcbeaudin/decktalk/commit/6b2a9fe552a88d86fa278d0e2ba073d53fb4c4ce))

  **Features**

  * **align:** check cues and pages against each other in both directions ([7fd3603](https://github.com/jacobcbeaudin/decktalk/commit/7fd3603adb22b84c7e8423cdabc8598915a01e61))
  * **api:** export the cut list reader ([6b81600](https://github.com/jacobcbeaudin/decktalk/commit/6b81600b635cc23619bb16065436c66d22be12c4))
  * **assemble:** split the stage into cut, mix, loudness and publish, and write what a viewer needs ([5dccf25](https://github.com/jacobcbeaudin/decktalk/commit/5dccf25299eebc633e1b1841f6655a2029a607db))
  * **build:** run the real verify last, and write a progress log an agent can read ([1ad53a9](https://github.com/jacobcbeaudin/decktalk/commit/1ad53a90f7b5362b9745910df0dd3b7b19b79aba))
  * **cli:** make the CLI a package that prints one envelope and one exit code ([ee6bd9b](https://github.com/jacobcbeaudin/decktalk/commit/ee6bd9b4003bf46de2d8399d80a3828fff645110))
  * **cli:** wire --from and --to, retire measure and check, and report a stale recording ([2289630](https://github.com/jacobcbeaudin/decktalk/commit/22896304be59b31a784ad2d679ea177be65d75ea))
  * give every stage one result and enforce the five layers ([f51ba4d](https://github.com/jacobcbeaudin/decktalk/commit/f51ba4dce71bdb75ce55432e44a22b961c4ac3ae))
  * **media:** fetch a pinned, SHA-256 verified ffmpeg build in place of static-ffmpeg ([ba8be62](https://github.com/jacobcbeaudin/decktalk/commit/ba8be627bb2a85d44f34badbb92c3339422cefc7))
  * **media:** serve every page from a local origin, and add decktalk serve ([dc238f5](https://github.com/jacobcbeaudin/decktalk/commit/dc238f54b5b5ec501243073ef94e8a8c9b095f5d))
  * **narrate:** identify a take by its content and price the plan before it runs ([0ac39c4](https://github.com/jacobcbeaudin/decktalk/commit/0ac39c44b11f228d5c90c0db7c20a0a7154c9225))
  * **providers:** keep the ElevenLabs key on an https ElevenLabs host ([5d3b94d](https://github.com/jacobcbeaudin/decktalk/commit/5d3b94ddad1b9e67ec25765936a0fed9fb64dfa6))
  * **record:** fold measure and check into one record package ([b02e56b](https://github.com/jacobcbeaudin/decktalk/commit/b02e56b8d77de9d101f43e8989df59a135bc99c2))
  * **record:** keep a section whose scene, assets, words and cues are unchanged ([bf371fa](https://github.com/jacobcbeaudin/decktalk/commit/bf371fa15cde9ffdebdcf956cf93cfaefc121abf))
  * **runtime:** rebuild the page runtime on markup slides and close the first-frame race ([39aab42](https://github.com/jacobcbeaudin/decktalk/commit/39aab42498a62c711652acb08b2e9bf0d6ac3865))
  * **runtime:** write each reveal's description on the cue log row the transcript reads ([fe107ee](https://github.com/jacobcbeaudin/decktalk/commit/fe107ee4efc76f72bba27d232e83480251ddd489))
  * **scaffold:** make init write a small starter, an example, the skills and AGENTS.md ([fcea3e8](https://github.com/jacobcbeaudin/decktalk/commit/fcea3e83643ae0fc407ef314fc6c5ee02fc2b88e))
  * **scaffold:** ship KaTeX inside the wheel ([cbcad35](https://github.com/jacobcbeaudin/decktalk/commit/cbcad3544d7021393cfbdaf6c507b8681a27b1a7))
  * **screenshots:** give every written PNG a row, and add --json ([93cb221](https://github.com/jacobcbeaudin/decktalk/commit/93cb2212d3844fe0c951a07ff4c2e72327f7974d))
  * **scripts:** check every internal docs link and the navigation ([21c8a63](https://github.com/jacobcbeaudin/decktalk/commit/21c8a631ef39778ad76c37f327fce4d5536f502d))
  * **skills:** ship the six skills an agent works from, and a test that keeps them true ([b237a47](https://github.com/jacobcbeaudin/decktalk/commit/b237a47fdc09438e1c6929219f5d766dc2a88be7))
  * **status:** read the four input files against each other, and report the run ([b8c9298](https://github.com/jacobcbeaudin/decktalk/commit/b8c92985be3f622fe9bd4034cec839c1152648ed))
  * **verdicts:** give the three counted judgements verdicts of their own ([5a7ed81](https://github.com/jacobcbeaudin/decktalk/commit/5a7ed8198bda15d318540ebb1f8bf13ca8c1995a))
  * **verdicts:** make an unparsed or missing KaTeX a certain finding ([7eec66c](https://github.com/jacobcbeaudin/decktalk/commit/7eec66cff8043e3693ef61969b21f7f91274ddb6))
</Update>

<Update label="0.3.0" description="2026-09-15" tags={["feature", "fix"]}>
  **Features**

  * **beats:** warn when a cue phrase occurs more than once in its section ([1174081](https://github.com/jacobcbeaudin/decktalk/commit/1174081fd0a1f49c855c779f9123fe9615cf2b55))
  * **clip:** add decktalk clip and decktalk words ([846de9f](https://github.com/jacobcbeaudin/decktalk/commit/846de9f4f857f8d1621875f232b0ed9ff1f856bb))
  * **narrate:** add lead\_seconds and tail\_seconds, and allow hold\_seconds on any page section ([ce4baf9](https://github.com/jacobcbeaudin/decktalk/commit/ce4baf9b0006a8489d8ea9efc8fbbb55f51b2105))
  * **narrate:** print the take plan in a dry run, and add --json ([bd34f89](https://github.com/jacobcbeaudin/decktalk/commit/bd34f890c8515d0ce969f762ba46d9f39332336e))
  * **preflight:** check a voiced build before it spends credits or records ([6af0507](https://github.com/jacobcbeaudin/decktalk/commit/6af050748dd21332306bac1cbeb0bfa96445207d))
  * **runtime:** list each step's cues in the catalog, and freeze just before a cue ([fe329dd](https://github.com/jacobcbeaudin/decktalk/commit/fe329ddc1c2678314d3a3ecee5dc52b937632ab4))
  * **verify:** check that the cut into a carries\_previous section does not pop ([91e6578](https://github.com/jacobcbeaudin/decktalk/commit/91e6578a842f8cd3db1d929751597cb9d88dd251))
  * **verify:** mark a cue that passes by a thin change as THIN CHANGE? ([ffc09b6](https://github.com/jacobcbeaudin/decktalk/commit/ffc09b64f948c3e94f654999e55d28560215778c))

  **Bug Fixes**

  * **assemble:** warn about a recording that measure has not read ([95896c0](https://github.com/jacobcbeaudin/decktalk/commit/95896c01f38cf80c075fd8c93c1157867b79abb5))
  * **narrate:** refuse a silent run over voiced takes unless forced ([6517ebc](https://github.com/jacobcbeaudin/decktalk/commit/6517ebccf5629812ab1d0c938a4797515f6ab7db))
  * **narrate:** stop padding a cached take again on every run ([93d643a](https://github.com/jacobcbeaudin/decktalk/commit/93d643ac7f3ad772c20534a0850eee3e59c9c9e9))
  * **verify:** count only the sections in decktalk.toml ([32112eb](https://github.com/jacobcbeaudin/decktalk/commit/32112ebd8686f6b2a82efd1606ed6630f5d26fa0))
  * **verify:** fit probes and controls between close cues ([f4dee0e](https://github.com/jacobcbeaudin/decktalk/commit/f4dee0ea54372c0e2e8f025a50708737901ce39b))
</Update>

<Update label="0.2.1" description="2026-09-14" tags={["feature"]}>
  **Features**

  * **assemble:** caption the speech inside a clip section from its words file ([cf5b938](https://github.com/jacobcbeaudin/decktalk/commit/cf5b9388866a669d85c538cb3250ceb5cc1bd6c5))
  * **captions:** break captions at sentence ends ([3a7df4c](https://github.com/jacobcbeaudin/decktalk/commit/3a7df4cbc470defc7a2d6460d72dc1ddbd36df82))
  * **chapters:** merge consecutive sections with the same title into one chapter ([0191f1b](https://github.com/jacobcbeaudin/decktalk/commit/0191f1b17cdf6d4bd4dfcb753f1b59ba227d5025))
  * **narrate:** keep a renumbered section's take by copying it to the new name ([41ced3f](https://github.com/jacobcbeaudin/decktalk/commit/41ced3ff188c1e4db83f5341289eeed37bc24b93))
  * **template:** port the approved demo film's lesson into the scaffold ([0f5332a](https://github.com/jacobcbeaudin/decktalk/commit/0f5332a8d6cd31d8c1131f6bf3471e83ddaac516))
  * **template:** port the v16 demo film's edit into the scaffold ([a530783](https://github.com/jacobcbeaudin/decktalk/commit/a530783abd2f52924457929dc95711589d89da93))
</Update>

<Update label="0.2.0" description="2026-09-14" tags={["feature", "fix"]}>
  **Features**

  * a demo deck built to a fifteen-person review, with a WebGL loss surface ([148e59f](https://github.com/jacobcbeaudin/decktalk/commit/148e59f0dbdacd6c94de9ae58e3a6b0fa802d148))
  * captions, chapters, measured cue offsets, and a loudness pass that hits its target ([27a8c1d](https://github.com/jacobcbeaudin/decktalk/commit/27a8c1d77ea1d38a477cf27e8123f0030dc83003))
  * close on "Update your video the way you update a doc." ([339dfe9](https://github.com/jacobcbeaudin/decktalk/commit/339dfe990cda887f0063b16cb60ff2f753340bce))
  * closing scene, a cut check in verify, and a cover that survives a late capture ([b1e1cdd](https://github.com/jacobcbeaudin/decktalk/commit/b1e1cdd5bf46637530a50f65009fe3c114e5abf0))
  * demo deck after the round-two design and content review ([1c5e44c](https://github.com/jacobcbeaudin/decktalk/commit/1c5e44cbe724e37bf0650708a069c7d4928ab2f2))
  * demo v10, the storytelling panel's rewrite of all five scenes ([8754f83](https://github.com/jacobcbeaudin/decktalk/commit/8754f83aff96f5791be69449c260a21a1339aa2c))
  * demo v11, a lay lesson on how AI learns, with a slot for B-roll ([dd9147e](https://github.com/jacobcbeaudin/decktalk/commit/dd9147ee93be0a0a6d08aea5123733a417278c38))
  * **demo:** a ball walks the too-long and too-short paths as their markers appear ([e25bade](https://github.com/jacobcbeaudin/decktalk/commit/e25bade3033a011d055280343753924b9a6d24a2))
  * lesson-shaped scaffold, vendored KaTeX, pause directions, and page warnings ([5ee46a8](https://github.com/jacobcbeaudin/decktalk/commit/5ee46a8f27898a76d403b8d511ca53e93698d8b2))
  * machine-readable output and one exit policy for the read-only commands ([393cbf8](https://github.com/jacobcbeaudin/decktalk/commit/393cbf8e109c2b7bce761c3a1695863dc3dcdad4))
  * pass the slide and cue context to handlers, freeze at one cue, and warn on unreachable reveals ([675894d](https://github.com/jacobcbeaudin/decktalk/commit/675894d153dccfd635580991f86edad5dac83e46))
  * play a clip between page sections, with the narration paused around it ([e884b29](https://github.com/jacobcbeaudin/decktalk/commit/e884b293551db437c0a485f79af5e47c2d10f98d))
  * **record:** log when each cue was due, ran, and drew in the sidecar ([a9a25b3](https://github.com/jacobcbeaudin/decktalk/commit/a9a25b3801ada0e5be8c0d9c881f8b8743d99247))
  * **record:** pass the previous section's words as prevwords, so scene 2 carries the Open's real count times ([04cb547](https://github.com/jacobcbeaudin/decktalk/commit/04cb547cdc315054c974d943c36d90ef68ff2320))
  * refine the graphics and adopt the four-tick mark ([142f511](https://github.com/jacobcbeaudin/decktalk/commit/142f511310a7b31ea04459fbcbfb77512f93d928))
  * show the function before naming it in the demo, and close on decktalk.app ([f9f251f](https://github.com/jacobcbeaudin/decktalk/commit/f9f251fd804f7d3b1022deb28aea3c2cb3c09955))
  * **site:** host the demo video with the homepage ([fecdfa2](https://github.com/jacobcbeaudin/decktalk/commit/fecdfa2dcc0762e282f5fc87172ef2487c8ca8e4))
  * social card, README rebuilt around the lesson scaffold, and limiter headroom ([2a4a93b](https://github.com/jacobcbeaudin/decktalk/commit/2a4a93bd0fa183b40aae22787bec5fe32233d0b8))
  * teach the learning rate honestly in the demo's gradient descent scene ([0b8a958](https://github.com/jacobcbeaudin/decktalk/commit/0b8a95883617a28c1eb74c6f46118c58910696f0))
  * **template:** open the lesson on its title and bring in the rules card on "rules" ([e596540](https://github.com/jacobcbeaudin/decktalk/commit/e596540019a6e7340e332a1d80dd9d87a06c254e))
  * **template:** scaffold the v12 demo film ([ce17e25](https://github.com/jacobcbeaudin/decktalk/commit/ce17e256ee1b59fcdb1b0463acd8216fc221510e))
  * verify every cue by default, catch unknown cue ids, and keep clips at the edges ([bd6c236](https://github.com/jacobcbeaudin/decktalk/commit/bd6c2365ca3d1691ff71705dbba5a05ff4a2fbc4))

  **Bug Fixes**

  * accept -v and -q after the command, export result types, and report unexpected errors cleanly ([ffd86ad](https://github.com/jacobcbeaudin/decktalk/commit/ffd86ad00fd9878b7c28bb3998319612e0767952))
  * captions keep the script's punctuation and the onset scan sees low-contrast reveals ([24357b7](https://github.com/jacobcbeaudin/decktalk/commit/24357b7a5ed10fcb1a984c8629f47b7be87abf3a))
  * count only the part of a frame stall that falls after narration starts ([1be18ee](https://github.com/jacobcbeaudin/decktalk/commit/1be18eebae076cd8f89df37cb3ddc477c339046b))
  * cover the page until the clock starts so a cut cannot miss the marker ([f33a2d9](https://github.com/jacobcbeaudin/decktalk/commit/f33a2d94c3872ad932798395d05904ad9c1038dc))
  * define gradient descent before the surface appears, and hand off once at the edit ([1b25627](https://github.com/jacobcbeaudin/decktalk/commit/1b25627b091a0553435b9cc5e6eb041b454b106f))
  * exact frame seeks on every ffmpeg build, and sidecars that explain synced reveals ([2499312](https://github.com/jacobcbeaudin/decktalk/commit/249931205f61c076273fc997338c5e0748402aef))
  * fail check on a page error, warn on bad TeX and dead cues, ease the ball steps out, and keep doctor from downloading ([171f4bf](https://github.com/jacobcbeaudin/decktalk/commit/171f4bf654c0a88fa6c10f01c692cb69862ce111))
  * **narrate:** pad cached takes to min\_tail\_seconds ([df93b08](https://github.com/jacobcbeaudin/decktalk/commit/df93b087172e56ee098f6e034507539dc5023c40))
  * print a skipped verify row's reason once ([2cf727d](https://github.com/jacobcbeaudin/decktalk/commit/2cf727d38d4787a5fbcf00764f018d36f00422f1))
  * quote scene 3's real length in the edit scene and give the close a beat ([7f368cc](https://github.com/jacobcbeaudin/decktalk/commit/7f368cc999818551585a8da4f62e27a436c763c2))
  * read and write every text file as UTF-8, so init works on Windows ([645aebc](https://github.com/jacobcbeaudin/decktalk/commit/645aebc79fe183cc6dc3b8898fabe14ac4468874))
  * **record:** keep frames flowing after the cover so still pages record reveals on time ([0abcf45](https://github.com/jacobcbeaudin/decktalk/commit/0abcf4532d7ec8b1254e6e795355e95d40beeb5c))
  * report unknown cue ids from beats instead of stopping before the table ([63208b9](https://github.com/jacobcbeaudin/decktalk/commit/63208b98518df26d254ab07df8675b5da4c9cef7))
  * **runtime:** draw the preview index in the page's own colors ([5eec565](https://github.com/jacobcbeaudin/decktalk/commit/5eec565d761f7a0e0265e90c0f56a7dd8f6d0c2f))
  * say the thesis once in the demo deck ([a677391](https://github.com/jacobcbeaudin/decktalk/commit/a677391b3d7b10f52c02474ecca54370f241046e))
  * start the clock on the next frame, detect and retry stalled recordings, and make frame comparisons build-proof ([91cd81c](https://github.com/jacobcbeaudin/decktalk/commit/91cd81c3de6846ae0f338a8875447870994d1d8f))
  * timeline positions from decoded audio, word-synced reveals, a click test for sync, and a scaffold that teaches gradient descent ([9b38bc2](https://github.com/jacobcbeaudin/decktalk/commit/9b38bc23cfb177853e4e283c6a84c681057ae541))
  * trim the scanned span per stream so the looped reference frame is not seeked past its end ([028c845](https://github.com/jacobcbeaudin/decktalk/commit/028c84501cc976655cb8e3250f2cb2c5d6b11e97))
  * **verify:** compare luma only, so a static colored frame reads zero ([d74bdc6](https://github.com/jacobcbeaudin/decktalk/commit/d74bdc6ca2f7b9f1a3e8a5ec0e8b680344ead6ac))
  * **verify:** confirm each onset on 8 by 8 blocks, so encoder ringing never reads as an early reveal ([8e9887a](https://github.com/jacobcbeaudin/decktalk/commit/8e9887afa7a48b9961b83b98c175ab571b66806f))
  * warm every scene 3 mesh so no cue freezes the page on its first draw ([938f9a3](https://github.com/jacobcbeaudin/decktalk/commit/938f9a3637f2a90756e176e1185c3844f755f485))
  * warm the scene 3 figure at its real drawing state before narration starts ([90807c4](https://github.com/jacobcbeaudin/decktalk/commit/90807c4cdd8844a67690a93edc1f4cb41822862f))
  * warn on unknown decktalk.toml keys, let doctor pass without KaTeX, and add optional clip sections ([dcc4dbf](https://github.com/jacobcbeaudin/decktalk/commit/dcc4dbf1bcdee7327d38fb57107c1074fbaf25cc))
  * warn when a step mounts equations without KaTeX in cue mode ([2005a4a](https://github.com/jacobcbeaudin/decktalk/commit/2005a4a30b5e57336c1bc3fa87cc4532326525b5))
</Update>

<Update label="0.1.0" description="2026-09-12" tags={["release"]}>
  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.
</Update>
