Skip to main content
Each project has one decktalk.toml. Every path in it is relative to the project directory. An unknown top-level table fails the load, so a typo cannot silently do nothing. The file has two kinds of content. The document tables on this page describe the presentation. The tuning tables change how DeckTalk renders and are rarely needed.
decktalk.toml

[project]

[voice]

These are the voice settings for this presentation. The model key overrides the tool default, which is eleven_multilingual_v2 unless [narration] says otherwise. The voice id and the API key are secrets, so they live in .env as ELEVENLABS_VOICE_ID and ELEVENLABS_API_KEY, or in the environment.

[[section]]

Write one table per ## N. section of the script. The order does not matter, because DeckTalk sorts them by number. Every script section must have one. A section is either a page or a clip. A clip that is not 1920 by 1080 is scaled and padded to fit. A missing clip is not an error unless you pass --strict. A titled slate plays for slate_seconds in its place, so a project builds before every asset exists.

[transition]

[mix]

The mix is optional. Without this table the film carries narration and clip audio only. Sound explains how the parts fit together.

[soundscape]

These tables hold the prompts for decktalk soundscape, which generates sound with ElevenLabs. Ambience and music write to the ambience and underscore paths named in [mix]. When [mix] names none, they write to build/sfx/ambience.mp3 and build/music/underscore.mp3. Each sound effect writes to build/sfx/<name>.mp3 unless its out key says otherwise.

Tuning tables

Any settings section can be overridden per project with a table of the same name, such as [video] or [record], or per shell with a DECKTALK_<SECTION>_<FIELD> variable. Configuration lists every field with its default.

script.md

The script is markdown with one rule. Each ## N. Title heading starts section N, and the text under it is what the voice says for that section.
  • Text in square brackets, such as [Deck scene 3.], is a stage direction. It is not spoken, and a short pause is left where it sat.
  • A bracket in capitals, such as [NAME], is a placeholder. The narrate stage refuses to synthesize a section that still has one unless you pass --allow-placeholders.
  • A tag such as <break time="1.0s"/> inserts a pause of that length.
  • Other markdown, such as emphasis, is stripped before synthesis.

cues.json

The cue file names the spoken phrase that each visual lands on. Cues describes its shape and the matching rules.