Getting started
Install
deckhand is a single binary. Grab a prebuilt one (macOS arm64/x86_64, Linux x86_64/arm64):
curl -fsSL https://deckhand.sh/install.sh | sh
…or build from source with a Rust toolchain: cargo install deckhand.
Try the demo deck:
deckhand https://deckhand.sh/decks/demo.md
space advances, ? shows every key, q quits.
Your first deck
Create talk.md:
---
title: my first deck
theme:
border_type: rounded
---
# hello ⚓
this is a slide
---
# a second slide
- `---` starts a new column
- plain markdown: **bold**, `code`, tables, lists
--
## a deeper slide
`--` goes *deeper* in the same column — detail you only
show if someone asks. `↑` resurfaces.
Present it:
deckhand talk.md
Navigate with space / shift-space (walks everything), or steer
yourself: ←/→ between columns, ↓/↑ for depth. Press o for the
overview — every slide shows a short code; type it to jump there. Or
press / and type: it searches every slide's title, body, and notes,
and enter jumps to the pick.
Add a live terminal
Put a real shell in a slide:
# demo time
```terminal rows=10
python3 -q
```
The slide shows the command; press t, then y to run it — nothing
executes without your say-so. Once running, t focuses it (every key
goes to the terminal), Ctrl-q returns to the deck, s stops it, and
R restarts it if a demo goes sideways. Prefer the old behavior? Pass
--eager and terminals start the moment their slide appears. Leave the
body empty for an interactive shell, or use rows=fill to fill the
slide.
Add a QR code — or two, side by side
A qr fence renders as a scannable code (black-on-white, whatever
your theme), and a row fence puts blocks next to each other, cells
split by ||:
# find the slides later
````row
```qr
https://gist.github.com/you/abc123
```
||
```qr
https://en.wikipedia.org/wiki/QR_code
```
````
Rows hold any blocks — markdown next to a terminal, code beside a QR.
And a markdown image alone on its own line ()
renders as colored ASCII art, resolved against the deck's directory.
Add presenter notes
Everything after a bare ??? line is invisible to the audience:
# pricing
it's complicated
???
Don't improvise here. Point at the table and move on.
In a second terminal (tmux pane, second window, ssh):
deckhand notes
It follows the presentation live: current notes, next slide, talk timer.
Grow into a manifest
When one file gets unwieldy, lay the talk out in deck.json — one
markdown file per slide, terminals as whole slides, stacked panes,
per-slide themes:
{
"title": "my talk",
"theme": { "accent": "magenta" },
"columns": [
"slides/intro.md",
["slides/topic.md", "slides/topic-deep.md"],
{ "terminal": { "command": "htop" }, "title": "live demo" }
]
}
deckhand deck.json
And flatten it back to one shareable file whenever you like — or typeset it as a PDF or a self-contained web page, one slide per page, through the same layout engine that presents it:
deckhand compile deck.json -o talk.md
deckhand compile deck.json -o talk.pdf
deckhand compile deck.json -o talk.html
Share it as a gist
Put talk.md (or a whole manifest + slide files) in a GitHub gist, and
anyone can present it:
deckhand https://gist.github.com/you/abc123
…or load it in the browser on the play page.
Next: the full documentation covers every key, format detail, and theme knob.