Executable TalkTransform your Markdown presentations into live coding demonstrations with VS Code integration. Features
Getting StartedCreate a PresentationCreate a file with the
Start a Presentation
Keyboard Shortcuts
Floating ToolbarA floating toolbar appears in the bottom-right corner when you hover over the presentation. It provides quick access to VS Code workspace toggles:
Commands
Action Reference
|
| Parameter | Description | Required |
|---|---|---|
path |
Relative path to the file | Yes |
editor.highlight
Highlights specific lines in a file.
[Highlight Code](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:editor.highlight?path=path/to/file.ts&lines=5-10)
| Parameter | Description | Required |
|---|---|---|
path |
Relative path to the file | Yes |
lines |
Line range (e.g., 5-10 or 5) |
Yes |
terminal.run
Runs a command in the integrated terminal. Requires Workspace Trust.
[Run Command](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:terminal.run?command=npm%20test)
| Parameter | Description | Required |
|---|---|---|
command |
URL-encoded command to execute. Supports {{VAR}} env placeholders. |
Yes |
debug.start
Starts a debug session. Requires Workspace Trust.
[Start Debugging](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:debug.start?config=Launch%20Program)
| Parameter | Description | Required |
|---|---|---|
config |
Name of the launch configuration | Yes |
sequence
Executes multiple actions in order.
[Demo Flow](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:sequence?actions=file.open%3Ffile%3Dsrc/main.ts,editor.highlight%3Ffile%3Dsrc/main.ts%26lines%3D1-5)
| Parameter | Description | Required |
|---|---|---|
actions |
Comma-separated list of URL-encoded actions | Yes |
vscode.command
Executes any VS Code command. Requires Workspace Trust.
[Open Settings](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:vscode.command?id=workbench.action.openSettings)
| Parameter | Description | Required |
|---|---|---|
id |
VS Code command ID | Yes |
args |
URL-encoded JSON arguments | No |
Examples:
[Open Settings](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:vscode.command?id=workbench.action.openSettings)
[Toggle Sidebar](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:vscode.command?id=workbench.action.toggleSidebarVisibility)
[Search Extensions](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:vscode.command?id=workbench.extensions.search&args=%22python%22)
[Focus Terminal](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:vscode.command?id=workbench.action.terminal.focus)
[Open Keyboard Shortcuts](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:vscode.command?id=workbench.action.openGlobalKeybindings)
validate.command
Runs a command and checks its exit code. Optionally checks output content. Requires Workspace Trust.
```action
type: validate.command
command: node --version
expectOutput: "v"
label: Validate Node.js
```
| Parameter | Description | Required |
|---|---|---|
command |
Command to execute (string or platform map) | Yes |
expectOutput |
Substring that must appear in stdout | No |
timeout |
Timeout in milliseconds | No (default: 30000) |
validate.fileExists
Checks whether a file exists (or is absent).
```action
type: validate.fileExists
path: package.json
label: Check package.json
```
| Parameter | Description | Required |
|---|---|---|
path |
Relative or absolute file path | Yes |
expectMissing |
Set true to check file does NOT exist |
No (default: false) |
validate.port
Checks whether a TCP port is open.
```action
type: validate.port
port: 3000
label: Check dev server
```
| Parameter | Description | Required |
|---|---|---|
port |
Port number (1–65535) | Yes |
host |
Hostname to check | No (default: localhost) |
timeout |
Connection timeout in ms | No (default: 5000) |
Dynamic Content Rendering
Action Block Syntax (YAML)
In addition to inline action links, you can define actions using readable YAML fenced code blocks. Both syntaxes coexist — use whichever you prefer:
Before (inline link — URL-encoded):
[Open Main](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:file.open?path=src/main.ts)
After (YAML action block — human-readable):
```action
type: file.open
path: src/main.ts
label: Open Main
```
Action blocks support all 6 action types. Here are some examples:
```action
type: editor.highlight
path: src/main.ts
lines: 5-10
```
```action
type: terminal.run
command: npm test
label: Run Tests
```
```action
type: sequence
label: Full Demo
steps:
- type: file.open
path: src/main.ts
- type: editor.highlight
path: src/main.ts
lines: 5-10
- type: terminal.run
command: npm test
```
Preflight Deck Validation
Before presenting, validate your deck to catch common errors:
- Press
Cmd+Shift+P/Ctrl+Shift+P - Run Executable Talk: Validate Deck
The command checks for:
- Missing files — referenced file paths that don't exist
- Out-of-range lines — highlight ranges exceeding file length
- Missing debug configurations —
debug.startconfigs not in launch.json - Unavailable commands — terminal commands not found on PATH
- Trust issues — actions requiring trust in untrusted workspaces
Results appear as:
- Inline diagnostics (squiggly underlines) in the
.deck.mdfile - Output channel (Executable Talk Validation) with a detailed log
- Summary notification with a link to the Problems panel
Error Notifications During Presentation
When an action fails during a live presentation, a toast notification appears in the bottom-right corner showing:
- Action type icon (📄 file, 🔍 highlight, ▶ terminal, 🐛 debug, 🔗 sequence)
- Target (which file, command, or config failed)
- Error message (what went wrong)
- Step breakdown (for sequences: ✅ success, ❌ failed, ⏭ skipped)
Toasts auto-dismiss after 8 seconds for simple failures. Sequence failures and timeouts persist until manually dismissed. Up to 5 toasts can stack.
Authoring Assistance
When editing .deck.md files, you get full IDE support inside action blocks:
- Syntax highlighting: Full Markdown highlighting with YAML syntax coloring inside
```actionfenced code blocks - Autocomplete: Type suggestions after
type:, parameter suggestions scoped to the selected action type, triggered by:and/ - Hover documentation: Hover on action type keywords to see descriptions and parameter tables. Hover on parameter names for type info and allowed values.
- Real-time diagnostics: Squiggly underlines for unknown action types (error), missing required parameters (error), unknown parameter keys (warning), and invalid YAML syntax (error)
Non-Linear Navigation
During Q&A or ad-hoc discussion, jump to any slide instantly without sequential clicking.
Slide Picker
Press Ctrl+G / Cmd+G to open a searchable slide picker overlay:
- Search by title — type to filter slides in real time
- Jump by number — type a number and press Enter
- Keyboard navigation — Arrow keys to select, Enter to confirm, Escape to dismiss
Jump by Number
From the presentation, type digit keys (e.g., 1, 5) and press Enter to jump directly to that slide number. Press Escape to clear.
Go Back
Press Alt+Left to return to the previously viewed slide (not the sequentially previous one). This uses a navigation history stack separate from undo/redo.
Navigation History Trail
A breadcrumb trail appears at the bottom of the presentation showing your recent slide visits:
- Click any breadcrumb to jump back to that slide
- Icons show how you reached each slide: → sequential, ⤳ jump, ← go-back, 📌 scene restore
- Up to 10 recent entries are shown; the trail fades in on hover
Scene Checkpoints
Save and restore complete IDE state at any point during your presentation.
Save a Scene
- Press
Ctrl+S/Cmd+Sduring a presentation - Enter a name (e.g., "demo-start")
- The current IDE state is captured: open files, cursor positions, terminals, and active slide
Restore a Scene
- Press
Ctrl+R/Cmd+Rto open the scene picker - Select a scene to restore
- The IDE returns to the exact state when the scene was saved
Pre-Authored Scenes
Define scene anchors in your deck's YAML frontmatter:
---
title: My Presentation
scenes:
- name: intro
slide: 1
- name: live-demo
slide: 8
- name: wrap-up
slide: 15
---
Pre-authored scenes appear in the scene picker automatically when the presentation opens. They're labeled "authored" and navigate to the anchored slide (without capturing full IDE state).
Scene Limits
- Up to 20 runtime-saved scenes per session
- Pre-authored scenes from frontmatter don't count against this limit
- Overwriting an existing scene (same name) doesn't count against the limit
- Pre-authored scenes are read-only and cannot be deleted
Cross-Platform Commands
Write terminal commands that work on every operating system.
Platform Command Map
Instead of a string, provide an object with per-OS variants:
```action
type: terminal.run
command:
macos: open .
windows: explorer .
linux: xdg-open .
default: xdg-open .
label: Open File Browser
```
The correct command runs automatically based on the presenter's OS. If no specific entry matches, the default fallback is used.
Path Placeholders
Use platform-aware placeholders in any terminal command:
| Placeholder | macOS/Linux | Windows |
|---|---|---|
${pathSep} |
/ |
\ |
${home} |
/Users/you |
C:\Users\you |
${shell} |
/bin/zsh |
cmd.exe |
${pathDelimiter} |
: |
; |
Preflight Platform Validation
Run Executable Talk: Validate Deck to check cross-platform coverage. The validator warns if any terminal.run action with a platform command map doesn't cover the current OS and has no default fallback.
Dynamic Content Rendering (Render Directives)
Embed live content directly in your slides using render directives. These are invisible links that get replaced with actual content when the slide is displayed.
render:file
Embed file contents with optional line range.
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:file?path=src/main.ts&lines=1-20)
| Parameter | Description | Required |
|---|---|---|
path |
Relative path to the file | Yes |
lines |
Line range (e.g., 1-20 or 5) |
No |
lang |
Language for syntax highlighting | No (auto-detected) |
format |
Output format: code, quote, or raw |
No (default: code) |
Examples:
# Show the first 10 lines of package.json
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:file?path=package.json&lines=1-10)
# Show a specific function with TypeScript highlighting
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:file?path=src/utils.ts&lines=25-40&lang=typescript)
render:command
Execute a command and embed its output. Requires Workspace Trust.
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:command?cmd=npm%20--version)
| Parameter | Description | Required |
|---|---|---|
cmd |
URL-encoded command to execute | Yes |
cwd |
Working directory for the command | No |
timeout |
Timeout in milliseconds | No (default: 30000) |
format |
Output format: code, json, or raw |
No (default: code) |
cached |
Cache output between renders | No (default: true) |
Examples:
# Show npm version
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:command?cmd=npm%20--version)
# List source files
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:command?cmd=ls%20-la%20src/)
# Show git status
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:command?cmd=git%20status%20--short)
render:diff
Show git diffs or file comparisons.
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:diff?path=src/main.ts&before=HEAD~1)
| Parameter | Description | Required |
|---|---|---|
path |
File to show git diff for | Yes* |
before |
Git ref to compare against (e.g., HEAD~1, main) |
No (default: HEAD) |
after |
Git ref to compare to | No (default: working tree) |
left |
Left file for file-to-file diff | Yes* |
right |
Right file for file-to-file diff | Yes* |
mode |
Display mode: unified or split |
No (default: unified) |
context |
Number of context lines | No (default: 3) |
*Either path OR both left and right are required.
Examples:
# Show recent changes to a file
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:diff?path=src/main.ts&before=HEAD~3)
# Compare two files
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:diff?left=old/config.json&right=new/config.json)
# Show changes since a specific branch
[](https://github.com/ormasoftchile/executable-talk/blob/HEAD/render:diff?path=src/feature.ts&before=main)
Environment Variables
Parameterize your presentations so the same .deck.md file works across different machines, users, and environments — without hardcoding paths, tokens, or configuration.
Declare Variables in Frontmatter
Add an env: block to your deck's YAML frontmatter:
---
title: "Team Onboarding"
env:
- name: REPO_PATH
description: "Path to the cloned repository"
required: true
validate: directory
- name: GH_TOKEN
description: "GitHub personal access token"
secret: true
- name: BRANCH
description: "Feature branch to work on"
default: "main"
---
Declaration Properties
| Property | Required | Default | Description |
|---|---|---|---|
name |
✓ | — | Variable name (letters, digits, underscores) |
description |
"" |
Shown in hover tooltips and guided setup | |
required |
false |
Error if not set in .deck.env |
|
secret |
false |
Value masked in the presentation UI | |
validate |
— | Validation rule (see below) | |
default |
— | Fallback when not set in .deck.env |
Create a .deck.env File
Create a sidecar file with the same base name, replacing .deck.md with .deck.env:
my-talk/
├── onboarding.deck.md ← Your presentation
├── onboarding.deck.env ← Your local values (gitignored!)
└── onboarding.deck.env.example ← Template for others (committed)
Fill in your values:
# onboarding.deck.env
REPO_PATH=/home/alice/projects/my-repo
GH_TOKEN=ghp_abc123def456ghi789
BRANCH=feature/onboarding
⚠️ Important: Add
*.deck.envto your.gitignoreto prevent committing secrets!
Use {{VAR}} in Actions
Reference your variables using double-brace syntax:
```action
type: file.open
path: "{{REPO_PATH}}/package.json"
label: Open package.json
```
```action
type: terminal.run
command: cd {{REPO_PATH}} && npm install
label: Install Dependencies
```
Or with inline action links:
[Open File](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:file.open?path={{REPO_PATH}}/package.json)
[Run Tests](https://github.com/ormasoftchile/executable-talk/blob/HEAD/action:terminal.run?command=cd%20{{REPO_PATH}}%20%26%26%20npm%20test)
When the action executes, {{REPO_PATH}} is replaced with the real value from .deck.env. Both {{VAR}} env placeholders and ${home} platform placeholders can coexist in the same command.
Secret Masking
Variables with secret: true are protected during live presentations:
env:
- name: API_TOKEN
secret: true
required: true
- Displayed in presentation:
curl -H "Authorization: Bearer {{API_TOKEN}}" https://api.example.com - Actually executed:
curl -H "Authorization: Bearer ghp_abc123..." https://api.example.com - Terminal output scrubbed: Secret values replaced with
•••••before display
Validation Rules
Catch configuration problems before the presentation starts:
env:
- name: REPO_PATH
validate: directory # Must be an existing directory
- name: CONFIG_FILE
validate: file # Must be an existing file
- name: NODE_CMD
validate: command # Must be in PATH (e.g., node, git)
- name: API_URL
validate: url # Must be a valid HTTP/HTTPS URL
- name: SERVER_PORT
validate: port # Must be 1-65535
- name: VERSION
validate: "regex:^\\d+\\.\\d+\\.\\d+$" # Must match semver pattern
Validation runs during preflight check (Executable Talk: Validate Deck). Issues appear in the Problems panel.
Guided Setup
When a deck has environment variables, the extension helps get set up:
- Env status badge appears in the presentation corner showing resolution status (🟢 all resolved, 🟡 missing optional, 🔴 missing required)
- If variables are missing, click the badge or "Set Up Now" in the toast notification
- The extension generates a
.deck.env.exampletemplate if needed - Opens
.deck.envin the editor for you to fill in - As you save, the presentation refreshes automatically
Sharing Decks with Others
To make your deck portable:
Commit the
.deck.env.exampletemplate:git add onboarding.deck.env.exampleGitignore the actual values file:
# .gitignore *.deck.envWhen someone clones your repo, they:
- Copy
.deck.env.example→.deck.env - Fill in their own values
- Open the deck — ready to present!
- Copy
Fragment Animations
Reveal content step-by-step using fragment markers. Add <!-- .fragment --> after any element to make it appear on the next arrow key press:
## Key Features
- First point appears <!-- .fragment -->
- Then the second <!-- .fragment -->
- And finally the third! <!-- .fragment -->
Animation Types
Specify an animation style after .fragment:
- Fade in (default) <!-- .fragment fade -->
- Slide up from below <!-- .fragment slide-up -->
- Slide in from right <!-- .fragment slide-left -->
- Zoom in <!-- .fragment zoom -->
- Dimmed, then highlighted <!-- .fragment highlight -->
| Animation | Effect |
|---|---|
fade |
Fade in (default) |
slide-up |
Slide up from below |
slide-left |
Slide in from the right |
zoom |
Zoom in from smaller |
highlight |
Visible but dimmed, then highlighted |
Fragments work on list items, paragraphs, headings, and block elements. The syntax is compatible with Reveal.js.
Layout Directives
Optional Markdown-compatible layout helpers for structuring slide content. These degrade gracefully in plain Markdown viewers.
Centered Content
:::center
**Big idea goes here**
:::
Two-Column Layout
:::columns
:::left
Text and explanations
:::
:::right
Code samples and diagrams
:::
:::
Progressive Disclosure
:::advanced
Collapsible content for advanced users (renders as `<details>`)
:::
:::optional
Non-blocking optional content with a visual badge
:::
Speaker Notes
Add speaker notes to any slide using the notes field in YAML frontmatter:
---
notes: |
Key points to cover:
- Explain the architecture
- Show the demo
- Answer questions
---
# Slide Title
Slide content goes here...
View speaker notes by running Executable Talk: Open Presenter View.
Presentation Options
Customize the presentation using the options field in the deck frontmatter:
---
title: My Presentation
author: Your Name
options:
toolbar: true # Show toolbar (default: true)
zenMode: true # Enter Zen Mode on start (default: true)
showSlideNumbers: true # Show slide numbers (default: true)
showProgress: false # Show progress bar (default: false)
fontSize: medium # Font size: small, medium, large
theme: dark # Theme: dark, light, minimal, contrast
---
Toolbar Customization
The floating toolbar can be customized to show only specific buttons:
options:
toolbar:
- sidebar # Toggle Sidebar
- panel # Toggle Panel
- terminal # Toggle Terminal
- activityBar # Toggle Activity Bar
- zenMode # Toggle Zen Mode
Set toolbar: false to hide it completely.
Themes
Five built-in themes are available:
| Theme | Description |
|---|---|
dark |
Default. High-contrast dark background optimized for projectors |
light |
Clean white background for well-lit rooms |
minimal |
Muted, distraction-free aesthetic for code-heavy decks |
contrast |
WCAG AAA high-contrast (black/white/yellow) for accessibility |
The default theme (dark) features presentation-grade typography: centered titles, large headings, generous spacing, and enlarged code blocks.
Slide Transitions
Control how slides animate when navigating:
options:
transition: slide # slide (default) or fade
slide— Horizontal slide-in animation (default)fade— Smooth opacity crossfade
Onboarding Mode
Transform any .deck.md file into a guided onboarding experience with step tracking, validation, and recovery.
Activation
Add mode: onboarding to your deck's options:
---
title: Team Onboarding
options:
mode: onboarding
---
Behavior Differences
In onboarding mode:
- Slides are treated as steps with completion tracking
- A step progress indicator replaces the slide counter (Step 1 of 8)
- No slide transitions — focus is on instructions, not visuals
- Retry Step and Reset to Checkpoint buttons appear on failure
- Validation results display inline after
validate.*actions
Checkpoints
Add checkpoint markers to slides that represent important milestones:
# Install Dependencies
<!-- checkpoint: deps-installed -->
Install the project dependencies:
When you navigate to a slide with a checkpoint, the IDE state is automatically saved. If something goes wrong, click Reset to Checkpoint to restore the workspace to that point.
Step Validation
Use validate.* actions to confirm each step completed successfully:
```action
type: validate.command
command: node --version
label: Verify Node.js is installed
```
```action
type: validate.fileExists
path: node_modules/.package-lock.json
label: Verify dependencies installed
```
- ✅ Success marks the step as complete
- ❌ Failure shows an inline error with Retry option
Example
See examples/onboarding-demo.deck.md for a complete onboarding deck demonstrating all features.
Workspace Trust
For security, actions that execute code (terminal.run and debug.start) require Workspace Trust. When opening a presentation with executable actions in an untrusted workspace:
- You'll be prompted to confirm before proceeding
- Actions requiring trust will show as blocked
- You can still use
file.openandeditor.highlightactions
Requirements
- VS Code 1.85.0 or higher
- Workspace Trust enabled for
terminal.runanddebug.startactions
Extension Settings
This extension does not contribute any settings.
Known Issues
- Multi-monitor presenter view requires manual command execution (no automatic detection)
- Zen Mode state detection is approximate
Release Notes
See CHANGELOG.md for version history.
License
MIT
Made with ❤️ for live coding presentations