Skip to main content
A playhead moves along a spoken sentence, one tick per word. The slide reacts on exactly the right words.

DeckTalk

Narrated presentations, cut to the word.
DeckTalk makes a narrated video from a markdown script and HTML slides. Each reveal starts on the word that introduces it. If you change a sentence, DeckTalk voices only that section again.

DeckTalk is for lecturers, course authors, developer advocates, and the agents that help them.

PyPI ci Apache-2.0

Quickstart · Docs · Requirements and costs · Reference card for agents · Changelog
Agents can read llms.txt.

Make your first video

You need Python 3.12 or later. These steps use uv, a Python package manager. If you use pipx, run pipx install decktalk in step 1 instead.

  1. Install DeckTalk.

    uv tool install decktalk
    

    uv ends with Installed 1 executable: decktalk.

  2. Download Chromium, ffmpeg, and KaTeX. You do this one time per machine.

    decktalk setup
    

    On Linux, this step asks for sudo. The last line is setup complete.

  3. Create the scaffold, a complete example project.

    decktalk init my-lesson
    
  4. Go into the project.

    cd my-lesson
    
  5. Build the video without an account.

    decktalk build --silent
    

    The build ends with built and the path of build/out/my-lesson.mp4. The build took 224.4 seconds on a MacBook Pro with Apple M5 Pro and 64 GB memory, because recording runs in real time.

  6. Copy the example settings file.

    cp .env.example .env
    
  7. In .env, set your ElevenLabs API key and voice id. DeckTalk never prints the key.

  8. Build the video with your voice.

    decktalk build
    

    This build spends ElevenLabs credits for every section. It writes the video, SRT and VTT captions, and one chapter per section. What spends credits lists the cost.

The scaffold is a lesson in nine sections, two of them optional clips. The quickstart shows the output of each step and what the example video shows.

What you write

Four panels. Write shows a markdown script. Narrate runs narrate and beats, and shows a tick for every word of "A bowl. A ball. One. Two, three." with 1.25 over "bowl". Record runs record, measure, and check, and shows a slide where a bowl draws on and a ball steps down it. Assemble runs assemble and verify, and shows one mp4.

You write four files. One cue id per reveal, such as 1.1bowl, ties the script, the cues, and the page together.

File What it holds
script.md What the voice says, under one ## N. Title heading per section.
decktalk.toml The project file. It ties each section to a page or to a clip of your own.
cues.json The phrase that each reveal starts on.
A page in deck/ The slides, as plain HTML.

The narrate stage writes a words file with the start and end of every spoken word. If a cue phrase is not in the spoken words, the build stops and names the cue. Your first deck writes one section in all four files.

Why the cuts are exact

A strip of recorded frames. Three magenta cover frames come first, and a line marks t=0 at the first clean frame. Under the strip, the narration "A bowl. A ball. Watch it step down" starts at t=0. Dashed leads join "bowl" and "ball" to the outlined frames where the bowl and then the ball appear.

A browser does not start recording at a known time, so DeckTalk does not use a timer. The recorder covers the page in magenta until the narration starts. The first frame without magenta is narration t=0, on Linux, macOS, and Windows.

decktalk verify then measures every reveal in the finished video. This sample comes from a silent build of the scaffold.

check                 cue       at   chg %   ctl %   offset     a/v  result
1:1.1bowl            1.25     1.25    0.93    0.00    +30ms   +31ms  changed
3:3.4name           84.72   123.32    2.76    0.00     +0ms    -4ms  changed
8:7.1checked        10.03   238.31    0.83    0.00    +10ms    +3ms  changed

The offset column is the time from the cue time to the onset of the reveal, in milliseconds. Verify defines every column and limit.

Requirements and costs

  • Software. DeckTalk needs Python 3.12 or later, on Linux, macOS, or Windows. decktalk setup downloads the rest.
  • Accounts. A silent build needs no account. A voiced build needs an ElevenLabs API key and a voice id.
  • Cost. Every ElevenLabs plan can call the API. The free plan has limits for a video you publish.

Requirements and costs lists every download and every command that spends credits.

How it compares

Tool Timing comes from Slides are After you edit one sentence
DeckTalk the spoken words, one time per word your HTML DeckTalk voices one section again. build --only N records only that section.
Remotion, Motion Canvas frame numbers or seconds in code, by default code You time the change again by hand and render again.
Manim seconds in code, or bookmarks in the narration with manim-voiceover code With manim-voiceover, bookmarks follow the new text. You still render the scene again in Python.
Descript a recording you made your screen Overdub voices the new words. The screen recording does not move with them.
Synthesia, HeyGen the avatar's speech their avatar and scenes You generate the video again.

The FAQ has the full comparison. Every build also gives you these parts:

  • A free silent build. Every stage runs with no key, and a click marks each word.
  • Cached narration. DeckTalk voices a section again only when it changes.
  • Captions and chapters. Every build writes SRT, VTT, and chapters.
  • A soundscape. Add an underscore, an ambience bed, and sound effects.
  • Loudness. DeckTalk normalizes the mix to -16 LUFS.
  • Checked output. check and verify catch bad recordings and late reveals.

Status and support

DeckTalk is alpha, and a minor release can still break things. One person maintains it.

CI runs the unit tests and a full offline build on Linux for every push to main and every pull request. CONTRIBUTING lists the macOS and Windows runs.

  • Report bugs and ask questions in Issues.
  • Report a vulnerability privately. SECURITY.md explains how.
  • The changelog lists every release.

Documentation

The docs are at docs.decktalk.app.

Contributing

To work on DeckTalk itself, start with CONTRIBUTING.md.

Apache-2.0. Made by Jacob Beaudin.

Release files for decktalk 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for decktalk 0.3.0
File Size Uploaded
decktalk-0.3.0.tar.gz 760.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for decktalk 0.3.0
File Interpreter ABI Platform
decktalk-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.5 MB

Release files / decktalk-0.3.0.tar.gz

Download URL decktalk-0.3.0.tar.gz
Size 760.5 kB
Tags Source
SHA-256 checksum
How to use checksums
c3e9a285999fa313070beaa01d3e4265adf55b13ce7cabc21ecf1c07a28e23b2
BLAKE2b-256 checksum
How to use checksums
e195516c270f086c12b3e0475b764e0d887f51daf578595023d113853d4a2c4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.

Transparency log

Release files / decktalk-0.3.0-py3-none-any.whl

Download URL decktalk-0.3.0-py3-none-any.whl
Size 779.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3c4559f6cdb8cca6d1f6041f08d2bd97d1e7006b68fba87a263a7b92e7efadb3
BLAKE2b-256 checksum
How to use checksums
a3f9d202df8446ec2ca4674331905a5548658c071b47eb964f1acc521adda8b9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.1

2 release files

0.4.0

2 release files

This release

0.3.0 This release

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page