Skip to main content
This page lists each message, verdict, and warning that DeckTalk prints, with its cause and its fix. Search the page for the text you see. If the project has no voiced build yet, run decktalk build --silent first. It spends no credits, and it shows if the problem is in the cues, the pages, or the assembly. If the project has a voiced build, rehearse in a copy of the project. A silent build stops on voiced takes, because it would empty the narration cache, as A silent build and a voiced build explains.

Find your message

setup, doctor, and keys

playwright install failed in setup

Cause. Playwright could not download Chromium or, on Linux, its system libraries. The output above the error shows the reason. Fix.
  1. If the output names a network or proxy problem, set PLAYWRIGHT_DOWNLOAD_HOST as Playwright documents.
  2. If you are on Linux, run decktalk setup as a user who can use sudo.
  3. Run decktalk setup again.
More. What setup downloads

KaTeX download failed in setup

setup prints KaTeX download failed (<reason>). Projects will load it from a CDN instead. and still exits 0. Cause. setup could not download the KaTeX release. Pages then load KaTeX from a CDN, which fails offline. Fix.
  1. When the machine is online, run decktalk setup again.
  2. Run decktalk doctor and check that the katex row is ok.
More. What setup downloads

MISSING or warning in doctor

Cause. A tool is not installed. The detail says which one and tells you to run decktalk setup.
  • If chromium shows MISSING, Chromium does not launch.
  • If ffmpeg shows MISSING, no ffmpeg exists in DECKTALK_FFMPEG, the static-ffmpeg download, or PATH.
  • If katex shows warning, the KaTeX cache is empty. Pages load KaTeX from a CDN until you run setup.
Fix.
  1. Run decktalk setup.
  2. Run decktalk doctor again.
doctor exits 1 on a MISSING row. A warning row exits 1 only with --strict. More. decktalk doctor

KaTeX is not cached in init

Cause. init ran before setup cached KaTeX. init then writes CDN tags into deck/index.html, and equations do not render offline. Fix.
  1. Run decktalk setup.
  2. Run decktalk init again into a new, empty directory.
More. Build in CI and offline

is not empty in init

init prints <dir> is not empty (pass force to write into it anyway). Cause. The target directory already has files. Fix.
  1. If you want a new project, pass an empty or new directory.
  2. If you want to write into this directory, add --force. --force overwrites files that the scaffold also has.
More. decktalk init

must be letters in init

init prints project name '<name>' must be letters, digits, dots, dashes or underscores. Cause. The project name starts with a character that is not a letter or digit, or has another character. The default name is the directory name. Fix.
  1. Pass a valid name with --name, such as --name my-lesson.
More. decktalk init

not set in narrate

A voiced run prints ELEVENLABS_API_KEY, ELEVENLABS_VOICE_ID not set. or one of the two names. Cause. The key or the voice id is missing. A value that starts with <, such as <voice-id>, counts as unset. Fix.
  1. If the project has no .env, run cp .env.example .env.
  2. Replace both placeholder values in .env.
  3. Run the command again.
You can also export both variables. A silent build needs neither. More. Accounts

HTTP 401 or HTTP 402 in narrate

The error reads HTTP <code> from https://api.elevenlabs.io/v1/text-to-speech/<voice id>/with-timestamps: <detail>. Cause.
  • A 401 means that the key is wrong or was revoked.
  • A 402 or a quota message means that the plan has no characters left, or that the voice needs a paid plan.
Fix.
  1. If the code is 401, copy a new key into .env.
  2. If the code is 402, check the plan’s character balance with ElevenLabs.
  3. Run decktalk narrate --dry-run to see the exact text that a build sends.
More. What spends credits

could not reach in narrate

Cause. The machine has no route to the speech provider. The reason follows the URL. Fix.
  1. Check the network connection and any proxy.
  2. If you only need a rehearsal, run decktalk build --silent in a copy of the project.
More. A silent build and a voiced build

Project files

decktalk.toml not found in any command

Cause. The command did not run in a project directory, and --project was not given. Fix.
  1. Run cd into the project directory.
  2. If there is no project yet, run decktalk init DIR.
If you run from elsewhere, pass -p DIR instead. More. Global options

unknown table(s) in decktalk.toml

The error reads decktalk.toml: unknown table(s) ['<name>']; known: [...]. Cause. A top-level table name has a typo, or it is not a DeckTalk table. Fix.
  1. Compare the name with the known list in the error.
  2. Rename or remove the table.
An unknown key inside a table prints a warning instead. See ignoring unknown key in decktalk.toml. More. Load rules

ignoring unknown key in decktalk.toml

Cause. A key inside a table has a typo, or it belongs to another table or section kind. DeckTalk ignores the key and continues, so the setting has no effect. Fix.
  1. If the warning suggests a key, rename the key to that name.
  2. If the warning says the key applies only to a page or clip section, move it to that kind of section.
  3. Run the command again and check that the warning is gone.
The per-machine settings file gets the same warning, with its own path first. More. Load rules

must be in decktalk.toml

Cause. A value has the wrong type. The error names the table, the key, and both types. Fix.
  1. Look up the key’s type in decktalk.toml.
  2. Change the value to that type.
More. Load rules

invalid tuning value in decktalk.toml

Cause. A tuning field in decktalk.toml, the per-machine file, or a DECKTALK_<TABLE>_<FIELD> variable has a value of the wrong type. Fix.
  1. Look up the field’s type in Configuration.
  2. Correct the value where you set it.
More. Configuration

narrate

unfilled placeholders in narrate

The error reads unfilled placeholders ['<NAME>'] in the script; fill them or pass allow_placeholders. Cause. The script still has a [CAPS] placeholder, and the run is voiced. Fix.
  1. Run decktalk narrate --dry-run to list every placeholder.
  2. Replace each placeholder in script.md.
  3. If you want to voice the text as it is, pass --allow-placeholders.
More. Directions and placeholders

no spoken sections match in narrate

Cause. --only names a clip section or a number with no script heading. Fix.
  1. Pass a number from the list in the error.
More. decktalk narrate

have no [[section]] in decktalk.toml in narrate

Cause. The script has a ## N. heading with no [[section]] table of the same number. Fix.
  1. If the section is new, add a [[section]] table with that number.
  2. If the number is a typo, fix the heading in script.md.
More. Headings

have no narration yet in narrate

Cause. narrate --only voiced some sections, and other spoken sections have no audio yet. The timeline then covers only the sections that have audio. Fix.
  1. Run decktalk narrate with no --only.
More. Rebuild one section

holds voiced takes in narrate

Cause. You ran decktalk narrate --silent or decktalk build --silent in a project with voiced takes. A silent run would write click tracks over the voiced mp3 files and replace the manifest. The next voiced build would then spend credits on every section. Fix.
  1. If you want to rehearse, copy the project and run the silent build in the copy.
  2. If you want to drop the voiced takes, run the same command with --force.
More. A silent build and a voiced build

A section opens on its first word

Cause. narrate removes a direction before the first words of a section, [pause N] included. So the first word plays as the section’s first frame appears. Fix.
  1. Set lead_seconds on the page section in decktalk.toml. narrate joins that much silence in before the take and sends no request.
  2. Run decktalk build --only N, so the recording covers the lead.
More. Silence in a section

beats

phrase not found in beats

Cause. The cue phrase is not in the section’s spoken words. The usual reasons, most common first:
  • The phrase has a typo.
  • The script writes a number as words, and the phrase uses digits, or the other way around.
  • The phrase uses another word form, such as “rates” for “rate”.
  • A hyphen joins two words into one token.
  • The phrase has a curly apostrophe. Matching removes it, but the spoken word keeps a straight one.
Fix.
  1. Open build/audio/NN-slug.words.json for the section.
  2. Find the words as the voice says them.
  3. Copy those words into the cue’s on value in cues.json.
  4. Run decktalk beats.
If you want to build without the cue, pass --allow-unresolved. A step whose cues are all unresolved never mounts. More. Matching rules

not in its page in beats

Cause. beats looks for each cue id in its page in quotes or backticks, and did not find this one. Either the id in cues.json has a typo, or no step uses the cue. Fix.
  1. If the id has a typo, fix it in cues.json.
  2. If no step uses the cue, add data-cue="<id>" to the element in the page.
  3. If the page builds its cue ids at run time, pass --allow-unknown.
A key of a step’s cues object also counts as a mention. More. Cue mismatches

UNRESOLVED in beats or verify

Cause.
  • In beats --json, a note has the verdict UNRESOLVED when a phrase is not found or the section has no words.
  • In verify, a cue named on the command line is not in beats.json. The row reads UNRESOLVED: the cue is not in beats.json.
Fix.
  1. If beats printed it, follow phrase not found in beats.
  2. If verify printed it, check the SECTION:CUE spelling against build/audio/beats.json.
  3. If the cue is new, run decktalk beats before verify.
More. decktalk verify

UNKNOWN in beats

Cause. In beats --json, a note has the verdict UNKNOWN when a cue id is not in its page. The table prints the same note as <cue>: not in <page>. Fix.
  1. Follow not in its page in beats.
More. decktalk beats

shorter than the visuals need in beats

The note reads speech <S>s is <D>s shorter than the visuals need. Cause. The section’s speech ends before the min_seconds that cues.json sets for it. This is an uncertain finding, so beats exits 1 only with --strict. Fix.
  1. If the slides need more time, add words or a [pause N] to the section in script.md.
  2. If the slides are fine, lower or remove min_seconds in cues.json.
More. cues.json

is past the end of the audio in beats

Cause. A cue time is later than the section’s audio, usually because of a large offset key. This note is not a finding. Fix.
  1. Reduce the cue’s offset in cues.json, or move the cue to an earlier phrase.
More. cues.json

occurs N times in this section in beats

The note reads '<phrase>' occurs <N> times in this section, at <T>s, <T>s. The cue uses the first. Set "occurrence" to choose one. Cause. The cue phrase matches more than one run of the section’s spoken words, and the cue does not set occurrence. The cue fires on the first match. If you meant a later one, the step appears early, maybe by many seconds. This note is not a finding, so beats exits 0, even with --strict. Fix.
  1. Compare the times in the note with the moment the visual should appear.
  2. If a later match is right, set "occurrence" to its position, such as 2, in cues.json.
  3. If the first match is right, set "occurrence": 1 to keep it and silence the note.
  4. Or make the phrase longer, so it matches only once.
More. Matching rules

no words in beats

The note reads no words (estimated manifest) or no words (missing words file). Cause. The section’s words file is empty or missing, so no phrase can resolve. Only $start resolves. Fix.
  1. Run decktalk narrate again. For a rehearsal, run decktalk narrate --silent in a copy of the project.
  2. Run decktalk beats.
More. decktalk narrate

is not in decktalk.toml in beats

The error reads cues.json: section <N> is not in decktalk.toml. Cause. A section key in cues.json has no [[section]] table of the same number. Fix.
  1. If the key is a typo, fix it in cues.json.
  2. If the section is new, add its [[section]] table.
More. cues.json

preflight

NO CHANGE or THIN CHANGE? in preflight

Cause. The frozen frame at the cue differs from the frozen frame before it by less than the [verify] floors, or by less than thin_change_factor times them. The reveal is small even in its end state, so verify is likely to read the same on the final mp4. Fix.
  1. Open the row’s two PNG files under build/preflight/NN/.
  2. If the reveal is too small to see, make it larger or give it more contrast in the page.
  3. If the reveal is small on purpose, mark the cue "verify": false. Or leave it, and check it by eye after the build.
More. decktalk preflight, THIN CHANGE? in verify

RUNTIME_OUTDATED in preflight

Cause. The page loads a copy of decktalk-runtime.js from before decktalk preflight. Its catalog has no cues, so preflight cannot freeze a step just before a cue. Fix.
  1. Run decktalk runtime to copy the packaged runtime into the project.
  2. Run decktalk preflight again.
More. Runtime

record, measure, and check

PAGE ERROR in check

record logs [page] NN-scene page error: <text>. build stops after the check table with <N> section(s) hit a page error while recording. A page with no catalog logs no window.__decktalk.catalog (is decktalk-runtime.js included, and does the page register a scene?). Cause. The page threw an uncaught error, or it has no runtime catalog. The usual reasons, most common first:
  • A render template has a single backslash, such as \underline, which is a syntax error.
  • The runtime <script> comes after the DeckTalk.scene calls.
  • The page does not load decktalk-runtime.js.
Fix.
  1. Open the page in a browser with ?scene=N&hud=1.
  2. Read the error in the browser console.
  3. Fix the page.
  4. Record the section again.
More. Record one section again

STALLED in check

check prints STALLED <ms>ms. record logs frame stall(s) after narration t=0 and recording section NN again. Cause. The machine was too busy to paint, so a reveal was recorded late. After narration t=0, the page saw a gap between two frames longer than [align] stall_ms (150). Fix.
  1. Close other work, or use a less busy machine.
  2. Record the section again.
record already tried again up to [record] retries (2) times. A long first draw under the cover, before t=0, is not a stall. More. Record one section again

TRUNCATED in check

Cause. The recording is shorter than requested by more than [align] truncated_slack_seconds (0.5). Chromium was stopped, or the machine stalled. Fix.
  1. Record the section again.
  2. Run decktalk check.
build exits 0 on TRUNCATED, so a script must run decktalk check after the build. More. Record one section again

NO COVER in measure or check

measure logs no magenta cover found; alignment is a guess, and its method column starts with NO COVER. Cause. measure found no magenta cover in the first [align] scan_seconds (4.0) of the recording, so t=0 is a guess. The usual reasons:
  • The page removes the cover itself.
  • A page written by hand starts its clock at load instead of at DeckTalk.startClock().
Fix.
  1. Make sure that the page loads the packaged decktalk-runtime.js.
  2. If you upgraded DeckTalk, run decktalk runtime.
  3. If the machine is very slow, raise [record] min_lead_seconds.
  4. Record the section again.
Without a cover, measure uses the first painted frame plus settle_seconds. If no frame is painted, it uses 1.1 s plus settle_seconds. measure scans only the first [align] scan_seconds. If narration t=0 comes later, measure still reports cover, and every reveal is late. If you raise min_lead_seconds near 4, raise scan_seconds too. More. The handshake

BLACK? in check

Cause. The brightest luma at the middle of the recording (MAX50) is below [align] black_ymax (40). Usually the page threw before it drew anything, or the slide is dark on purpose. Fix.
  1. Open the page in a browser with ?scene=N&hud=1.
  2. If the page is blank, read the browser console and fix the error.
  3. If the slide is dark on purpose, do nothing. BLACK? exits 1 only with --strict.
More. decktalk check

KATEX? in check

Cause. A page warning mentions KaTeX or data-tex. One of two warnings, most common first:
  • data-tex could not be parsed: "<tex>". A backslash inside a render template is single.
  • KaTeX did not load within 5 s, so [data-tex] elements stay plain text. The page loads KaTeX from a CDN, which fails offline.
Fix.
  1. If a value did not parse, write every backslash twice inside the render backticks.
  2. If KaTeX did not load, run decktalk setup.
  3. Run decktalk doctor and check that the katex row is ok.
  4. Copy the cached katex directory that doctor prints into deck/katex/.
  5. In deck/index.html, replace the two CDN tags with the local tags below.
  6. Record the section again.
Only deck/index.html has KaTeX tags in the scaffold. deck/lesson.html does not load KaTeX. More. Build in CI and offline

no narration span yet in record

Cause. A page section has no span in timeline.json. Usually the script has no ## N. heading for that section, or narrate has not run since you added it. Fix.
  1. If the heading is missing, add ## N. Title to script.md.
  2. Run decktalk narrate.
More. Headings

A section is early or late by a fixed amount

Cause. Nothing is printed. The recording’s t=0 is wrong, so every reveal in the section is off by the same amount. Fix.
  1. If assemble printed STALE MEASUREMENT, follow STALE MEASUREMENT in assemble.
  2. Open build/rec/NN-scene.json and read lead_method.
  3. If it starts with NO COVER, follow NO COVER in measure or check.
  4. Record the section again.
More. Record one section again

assemble

missing; slate for in assemble

Cause. The file that clip names does not exist, so a titled slate plays for slate_seconds. The section in the sample sets optional = true, so its warning ends with the section is optional, so --strict allows the slate. A section without optional prints only (drop your clip at that path). Fix.
  1. If you have the video, put it at the path in clip.
  2. If the section sets optional = true, delete that line after the clip is in place.
  3. If you do not want the clip, delete the section from both decktalk.toml and script.md.
More. Add a clip section

clip missing or recording missing in assemble

Cause. --strict turns a missing recording into an error. It does the same for a missing clip, unless the clip section sets optional = true. Fix.
  1. If a clip is missing, put the video at the path in clip.
  2. If you want the slate for now, set optional = true on the clip section.
  3. If a recording is missing, record the section again.
More. Clip section keys

using black in assemble

Cause. A page section has no recording, so assemble plays black for that section. Fix.
  1. Record the section again.
More. Record one section again

STALE MEASUREMENT in assemble

Cause. measure has not read this recording since it was recorded. The sidecar has no lead_in_seconds, its lead_in_hash belongs to another take, or the webm is newer than the sidecar. The cut trims at the wrong point, so every reveal in the section is early or late by the same amount. With --strict, assemble stops. Fix.
  1. Run decktalk measure --only N for the section in the message.
  2. Run decktalk assemble.
More. build/rec/NN-scene.json

has no span in in assemble

Cause. A page section has no span in timeline.json. The script has no heading for it, or narrate has not run since you added it. Fix.
  1. If the heading is missing, add ## N. Title to script.md.
  2. Run decktalk build.
More. Headings

underscore missing in assemble

Cause. [mix] names an underscore or ambience file that does not exist. The video plays without it. The scaffold keeps both keys in comments, and decktalk soundscape generates both files. Fix.
  1. If you want the sound, run decktalk soundscape or put your own file at the path.
  2. If you do not want it, remove the key from [mix].
More. Sound

unresolved; skipped in assemble

assemble logs marker '<name>' unresolved; skipped or sfx <file>: cue '<cue>' in section <N> is unresolved; skipped. Cause. A marker’s phrase or a sound effect’s cue did not resolve, so assemble left it out. Fix.
  1. If a marker is skipped, check its section and on values in the markers file.
  2. If a sound effect is skipped, check that beats resolved its cue in that section.
  3. Run decktalk assemble.
More. markers.json

[loud] skipped in assemble

Cause. A silent build has a click track, not speech, so assemble skips the loudness pass. The clicks keep their level so that verify can find them. Fix. None is needed. A voiced build runs the loudness pass. More. Loudness

true peak or integrated loudness in assemble

assemble logs [loud] true peak <X> dBTP is above the <Y> dBTP ceiling or [loud] integrated loudness <X> LUFS is <D> LU from the <Y> LUFS target. Cause. After the loudness pass, the voiced mix misses a [mix.loudnorm] target. With --strict, the miss is an error. Fix.
  1. Lower the underscore, ambience, or sound effect levels in [mix].
  2. Run decktalk assemble.
More. [mix.loudnorm]

verify

BLACK in verify

Cause. The brightest luma 0.2 s after a section start is at most [verify] visible_ymax (60). Nothing bright is on screen when the section starts. Fix.
  1. Make sure that the scene’s first cued step draws something at t=0.
  2. If a dip to black is long on purpose, raise [verify] after_dip_seconds.
More. Section starts

SPEECH AT CUT in verify

Cause. The narration in the last 0.15 s before a cut is louder than -40 dBFS. The voice was still speaking when the picture cut. Fix.
  1. Raise [narration] min_tail_seconds to add more silence after the last word.
If the section must stay short, end its script sooner instead. Clip sections carry their own audio and have no cut row. More. Cuts

POP AT CUT in verify

Cause. A section sets carries_previous = true, but its first frame differs from the previous section’s last frame by more than [verify] max_pop_percent (0.1 percent of the pixels). The picture jumps at the cut. The usual reasons:
  • The page opens in a different state than the previous page ended in, such as a step that is not shown yet.
  • An element sits at a different position or size in the two pages.
  • The previous section’s last step fires after its narration ends, so its recording ends early.
Fix.
  1. Run decktalk shots --section N --at 0 for this section, and compare it with the last frame of the previous section.
  2. Make the page’s opening state match the previous page’s final state.
  3. If the jump is intended, remove carries_previous from the section.
More. Cut continuity

NO CHANGE in verify

Cause. The picture did not change enough across the cue, or it changed no more than it was already changing. The usual reasons:
  • The reveal is very small or very slow.
  • The reveal changes only color at the same brightness. verify compares luma only.
Fix.
  1. Run decktalk shots --section N --at S, where S is just after the value in the cue column.
  2. If the reveal is subtle on purpose, mark the cue "verify": false in cues.json.
  3. If the reveal is slow, lengthen [verify] probe_delays.
A cue less than a second after another cue gets probes that fit the gap. verify logs another cue is close for it. A slow reveal may not finish inside a short gap. Check such a reveal by eye. More. Change test, Close cues

THIN CHANGE? in verify

Cause. The cue passed the change test, but only just. Its chg % is below 0.3, or its chg % minus its ctl % is below 0.3. Those limits are [verify] thin_change_factor (3) times the floors of 0.1. A slightly smaller reveal, or a little more motion elsewhere, would read NO CHANGE. This is an uncertain finding, so verify exits 1 on it only with --strict. Fix.
  1. Run decktalk shots --section N --at S, where S is just after the value in the cue column.
  2. If the reveal is too small to see, make it larger or give it more contrast in the page.
  3. If the reveal is small on purpose and plainly visible, leave it. Or mark the cue "verify": false.
  4. To turn the warning off, set [verify] thin_change_factor = 1.
More. Change test

OFF CUE in verify

This example shows the format of an OFF CUE row.
Cause. The picture changed, but the offset column is past 80 ms or the a/v column is past 120 ms. The table prints no distance, so compare the columns with those limits.
  • A negative offset column means that something moved before the cue. Often an earlier reveal is still animating, or a data-at element appeared at the mount.
  • A positive offset column of more than a frame or two means that the reveal has its own delay, such as a CSS transition.
Fix.
  1. Run decktalk shots --section N --at S for times around the value in the cue column.
  2. Find the early motion or the delay in the frames.
  3. If the delay is intended, raise [verify] max_offset_frames.
If only the a/v column is past its limit, see A large a/v value in verify. More. Onset and offset

A large a/v value in verify

Cause. Nothing but OFF CUE is printed. The audio and picture in the final file are out of step, or a louder sound effect sits near the cued word. Fix.
  1. Build with decktalk build --silent --nomix to rule out the soundscape.
  2. Open build/rec/NN-scene.json and check that lead_method starts with cover.
  3. Record the section again.
  4. Check that the offset column alone is small.
A silent build puts a click at every word start, and the a/v column compares the picture with that click. The click and the cue come from the same word time. A large value therefore points at the recording or the mix. More. verify

NO_CLICK in verify

Cause. After a silent build, verify found no click within [verify] click_search_seconds (0.25) of the cued word’s start. The a/v column shows -, and the JSON reason is NO_CLICK. Fix. None is needed. verify still judges the cue on its offset column. A $end cue gets NO_CLICK when its last word is longer than click_search_seconds. $end sits on the end of the last word, and clicks sit on word starts. More. verify

skipped in verify

Cause. verify measured nothing for the cue. The reason follows the verdict, and a skipped row never fails. Fix.
  1. Find the reason in Skipped rows, and apply its fix.
More. Results

malformed check in verify

The error reads malformed check '<text>'; want SECTION:CUE, e.g. 3:3.1draw. Cause. A cue argument does not start with a section number and a colon. Fix.
  1. Write each cue as SECTION:CUE, such as 8:7.1checked.
More. decktalk verify

need build/out/NN-section.mp4 files in verify

Cause. The project has no assembled video yet. Fix.
  1. Run decktalk build --silent, or decktalk assemble if the recordings exist.
  2. Run decktalk verify.
More. decktalk build

is not a section in decktalk.toml in assemble or verify

Cause. build/out holds a section video whose number is not a section in decktalk.toml. An earlier build usually left it before you renumbered or removed sections. assemble and verify read only the sections in decktalk.toml, so the file changes nothing. Fix.
  1. If you renumbered or removed the section, delete the file.
More. build/out/

A typewriter reveal fails the cue check

Cause. Nothing but NO CHANGE is printed. An element with data-type or data-sync appears a little at a time, so the first probe sees too little change. Fix.
  1. Give the element’s container a reveal that appears at once on the same cue, such as data-fx="fade".
  2. Keep data-type or data-sync on the text inside it.
More. Slide recipes

words and clip

timeline.json not found in words or clip

Cause. The project has no narration yet, so no section has word times. Fix.
  1. Run decktalk narrate, or decktalk build --silent.
  2. Run the command again.
More. decktalk words

has no section video in clip

Cause. clip cuts from the section video that assemble writes, and the section has none. Fix.
  1. Run decktalk build --silent, or decktalk assemble if the recordings exist.
  2. Run decktalk clip again.
More. decktalk clip

is a clip section in clip

Cause. The section number names a clip section. A clip section has no narration, so clip has no mp3 to cut. Fix.
  1. Run decktalk status. Each page section row names its page, and each clip section row starts with clip.
  2. Run decktalk clip with the number of a page section.
More. decktalk clip

cuts the word in clip

Cause. --from or --to falls inside a spoken word. The clip keeps the part of the word inside the span, but the words file has no entry for the word, so no caption shows it. Fix.
  1. Run decktalk words --only N for the section.
  2. Move --from before the word’s start, or --to after the word’s end, into the silence next to the word.
  3. Run decktalk clip again.
More. decktalk words

Pages in a browser

The page writes each warning to the browser console with the prefix decktalk:. During a recording, record logs it as [page] NN-scene <warning> and writes it to the sidecar.

data-sync text not found in the spoken words in a page

Cause. The text of a data-sync element matches no run of the section’s spoken words, so the element appears whole. Usually the slide writes a number as digits and the script writes it as words. Fix.
  1. Compare the element’s text with the sentence in script.md.
  2. Make the words match. Case and punctuation do not matter.
More. Runtime

matches no element, handler, or step in a page

Cause. The cue fired, but no element has that data-cue, no handler is registered for it, and no step has that id. beats did not catch it, because the id still appears in quotes in the page, such as a key of a step’s cues object. Fix.
  1. Add data-cue="<id>" to the element that should appear.
More. Cue mismatches

unknown cue id in a page

The warning reads unknown cue id <id> (no step id or cues list matches it). Cause. The page received a cue in ?beats= that no step in the playing scene owns. Fix.
  1. Check the id against the step ids and their cues lists.
  2. Add the id to the cues list of the step that should own it.
More. Cue ownership

owns no cue in a page

The warning reads step "<id>" owns no cue in ?beats=, so it never appears. Cause. In cue mode, a step mounts at its earliest cue. This step owns none of the section’s cues. Fix.
  1. Add a cue for the step to cues.json.
If a cue for the step already exists, list its id in the step’s cues instead. More. Cue mismatches

A page is empty, or window.__decktalk is missing

Cause. Nothing is printed. The page does not load decktalk-runtime.js, or its runtime <script> tag comes after the DeckTalk.scene calls. Fix.
  1. Load decktalk-runtime.js before any DeckTalk.scene call.
  2. Open the page in a browser to check the scene index.
More. Page contract

Speed

A build is slow

Cause. Nothing is printed. record plays each page section in real time, and encoding adds more time. Fix.
  1. If you changed one section, run decktalk build --only N.
  2. For drafts, set DECKTALK_VIDEO_PRESET=veryfast, or preset = "veryfast" under [video].
  3. For the final video, go back to the default preset.
A silent build of the scaffold took 276 s for its 257.72 s video. The machine was a MacBook Pro with an Apple M5 Pro and 64 GB of memory. More. Rebuild one section

TimeoutError in shots

Cause. An --at value past 30 s waits longer than the browser’s 30 s limit. Fix.
  1. Use --at values of 30 s or less.
  2. For a later moment in a long section, take a frame from the final video instead.
More. decktalk shots If no entry fits, open an issue. Include the output of decktalk doctor and the [[section]] tables involved.
  • Look up an option or exit code: CLI
  • Read a verify table: verify
  • Ask a general question: FAQ