Formerly Executable Talk. Marketplace/package identifiers still use
executable-talkfor backward compatibility.
Deckpilot is a programmable deck system for VS Code.
Write decks in Markdown, attach actions, and use them to:
- present live demos
- automate IDE workflows
- guide onboarding and setup
- record demos into video + narration artifacts
From one deck, you can present, execute, onboard, and produce content.
Most slide tools show content. Deckpilot decks can drive the IDE, run commands, validate setup, and record what happened — all from the same file.
- Reveal.js-powered full-screen webview; arrow keys + Space navigate slides and fragments
- Fragment animations — elements reveal step-by-step (no markup required; auto-fragmentation is on by default)
- Five themes:
dark,light,minimal,contrast— set in frontmatter - Slide transitions:
slide(default) orfade - Non-linear navigation: slide picker (
Ctrl+G), jump-by-number, go-back (Alt+Left), breadcrumb trail - Presenter View — speaker notes + next-slide preview on a secondary panel
- Undo/redo IDE state during a demo (
Cmd+Z/Ctrl+Z, up to 50 snapshots) - Floating toolbar — toggle sidebar, panel, terminal, activity bar, Zen Mode
Trigger IDE actions directly from slide content:
file.open— open a file in the editoreditor.highlight— highlight specific linesterminal.run— run a terminal command (requires Workspace Trust)debug.start— launch a debug config (requires Workspace Trust)sequence— chain multiple actions into one clickvscode.command— run any VS Code command (requires Workspace Trust)wait.condition— block until a file exists or a port opens- YAML action blocks (
```action) as a readable alternative to URL-encoded inline links - Scene checkpoints — save/restore full IDE state (
Ctrl+S/Ctrl+R); pre-authored scenes declared in frontmatter appear in the picker automatically
Deckpilot can auto-present your deck and coordinate with an external recorder to produce video and narration artifacts.
- Voice-over cues —
<!-- voice: text -->per slide,<!-- voice[N]: text -->per fragment - Manual recording — start/stop session; pause/resume timing, retake markers, narration markers
- Auto-Pilot — hands-free: drives slides, fragments, and actions at a pace computed from voice cue word count
- External recorder — configure ffmpeg (or any tool) to start/stop automatically via settings
- Exports —
voiceover-script.md, SRT captions, event JSON, MP4 video (via external recorder)
mode: onboardingin frontmatter options — step counter replaces slide numbers; retry/reset on validation failurevalidate.command— verify a CLI tool is installed before proceedingvalidate.fileExists— confirm required files are presentvalidate.port— check that a required service is reachablewait.condition— block until a condition is met- Checkpoint markers —
<!-- checkpoint: name -->captures IDE state; Reset to Checkpoint restores on failure - Preflight validation — catches missing files, bad line ranges, PATH issues, and trust problems at load time
Create a .deck.md file. Slides are separated by ---.
---
title: My First Deck
author: You
---
# Hello, Deckpilot
This is slide one.
---
## Open a file
[Open main.ts](action:file.open?path=src/main.ts)
---
## Highlight some code
[Show the handler](action:editor.highlight?path=src/main.ts&lines=10-20)
---
## Run a command
[Install dependencies](action:terminal.run?command=npm%20install)Open the file and run Deckpilot: Start Presentation from the command palette (Cmd+Shift+P / Ctrl+Shift+P).
| Key | Action |
|---|---|
→ / Space |
Next fragment or slide |
← / Backspace |
Previous fragment or slide |
Shift+→ / Shift+← |
Skip fragments, jump slide |
Home / End |
First / last slide |
Ctrl+G / Cmd+G |
Slide picker |
Ctrl+S / Cmd+S |
Save scene |
Ctrl+R / Cmd+R |
Restore scene |
Alt+Left |
Go back (history) |
Digits + Enter |
Jump to slide number |
Cmd+Z / Ctrl+Z |
Undo IDE changes |
Escape |
Exit presentation |
- Write a
.deck.mddeck with slides, actions, and voice cues - Configure an external recorder in VS Code settings (e.g. ffmpeg)
- Run Deckpilot: Auto-Record Deck from the command palette
- Deckpilot drives the presentation automatically, coordinating with the recorder
- When done, export:
- MP4 video (captured by the external recorder)
- SRT captions
voiceover-script.md- Event JSON (full timing log)
Keep metadata and presenter content out of the Markdown. The merge engine combines the two files at load time; inline values always win over sidecar values.
# my-talk.deck.yaml
deck:
title: My Talk
theme: dark
slides:
- id: intro # matches <!-- id: intro --> in the .deck.md
notes: "Remind the audience who you are."
cues:
- "Welcome everyone. Today we'll look at..."
autoFragment: false # suppress fragment animations (good for title slides)
layout: center # center | left | right | columns
actions:
- type: terminal.run
cmd: npm start
recording:
autoStart: false
export:
subtitles: true
srtFormat: srtSlide IDs are set with <!-- id: slug --> comments in the Markdown right after ---.
All deck commands work when a .deck.yaml file is the active editor — they auto-resolve the paired .deck.md.
Use {{VAR}} placeholders in your deck, resolved from a .deck.env sidecar file. Mark sensitive values with secret: true to mask them in the UI and terminal output.
Embed live file contents or command output directly in slides. Syntax uses empty Markdown links:
[](render:file?path=src/main.ts&lines=1-30&format=typescript)
[](render:file?path=package.json&format=json)[](render:command?cmd=node%20--version)
[](render:command?cmd=git%20branch%20--show-current)[](render:diff?path=src/extension.ts&ref=HEAD~1)render:file— inline a file's contents;pathis required,lines(1-30) andformatare optionalrender:command— run a command and embed its output (requires Workspace Trust);cmdis URL-encodedrender:diff— show a git diff inline;pathis required,refdefaults toHEAD~1
Structure slide content with layout containers:
:::center— center content vertically and horizontally:::columns/:::left/:::right— two-column grid:::advanced— collapsible disclosure for advanced content:::optional— callout block for optional steps
Define per-OS commands in a YAML action block:
```action
type: terminal.run
label: Open folder
command:
macos: open .
windows: explorer .
linux: xdg-open .
```basePathfrontmatter — resolve relative paths when the deck lives in a subdirectory- IDE authoring assistance — syntax highlighting, autocomplete, hover docs, real-time diagnostics inside
```actionblocks
Generate or improve decks without leaving Copilot Chat.
@deck /create a five-slide intro to Kubernetes for platform engineers
@deck /convert #file:SETUP.md into a deck with terminal actions
@deck /enrich #file:demo.deck.md — add voice cues and fragments
@deck how do I make a two-column layout?
By default /create and /convert produce a sidecar file alongside the Markdown. Say without sidecar in the prompt to get a single-file deck. Say zen mode to enable Zen Mode in the frontmatter.
[Open file](action:file.open?path=src/main.ts)
[Highlight](action:editor.highlight?path=src/main.ts&lines=5-20)
[Run](action:terminal.run?command=npm%20test)
[Debug](action:debug.start?configName=Launch%20Program)[VS Code command](action:vscode.command?id=workbench.action.openSettings)
[Open docs](action:browser.open?url=https://example.com&title=Docs&column=2)browser.open parameters:
| Parameter | Required | Description |
|---|---|---|
url |
yes | https:// URL, or http://localhost/http://127.0.0.1 |
title |
no | Panel tab title. Default: "Browser" |
column |
no | ViewColumn: 1, 2, 3, or -1 (beside). Default: 2 |
As a YAML block:
```action
type: browser.open
label: Open local server
url: http://localhost:3000
title: Dev Server
column: 2
```wait.condition parameters:
```action
type: wait.condition
label: Wait for server
condition: port.open
port: 3000
host: localhost # optional, default: localhost
message: Waiting for dev server…
timeoutMs: 60000 # optional, default: 120000
pollIntervalMs: 2000 # optional, default: 3000
``````action
type: wait.condition
label: Wait for output file
condition: file.exists
path: dist/bundle.js
```wait.condition does not require Workspace Trust.
Prefer blocks over inline links — they're readable and support all options:
```action
type: terminal.run
label: Run tests
command: npm test
showCommand: true # display resolved command below the button
```Sequences:
```action
type: sequence
label: Full demo
steps:
- type: file.open
path: src/main.ts
- type: editor.highlight
path: src/main.ts
lines: 5-20
- type: terminal.run
command: npm test
```Validation (onboarding decks):
```action
type: validate.command
command: node --version
label: Check Node.js
```terminal.run, debug.start, render:command, and vscode.command require Workspace Trust. In untrusted workspaces those actions are blocked with a clear message. file.open and editor.highlight always work.
| Command | Description |
|---|---|
deckpilot.showResolvedDeckModel |
Opens the fully merged Deck model for the active .deck.md as a read-only JSON document — useful for inspecting how sidecar merges, env vars, and action blocks resolve. Run from the command palette. |
VS Code 1.95.0 or higher.
The product and repository are branded Deckpilot. Marketplace and package identifiers continue to use executable-talk for backward compatibility — existing users receive updates normally without any action required.
See CHANGELOG.md.
MIT