Creating Presentations
Toboggan talks are stored as TOML and can be generated from Markdown/HTML source folders with toboggan-cli.
Step-by-step: create your first presentation
1. Create a new file
touch my-talk.toml
2. Write the presentation header
title = "My First Talk"
date = "2026-05-30"
footer = "Demo footer"
These are the core Talk fields serialized by toboggan-core.
3. Add slides
Each slide is a [[slides]] entry. Slides appear in the order you write them.
[[slides]]
kind = "Part"
[slides.title]
type = "Text"
text = "Introduction"
A Part slide acts as a section divider.
[[slides]]
kind = "Standard"
[slides.title]
type = "Text"
text = "Welcome!"
[slides.body]
type = "Text"
text = "This is my first slide. Toboggan supports Markdown-like text content."
4. Add more slides
[[slides]]
kind = "Standard"
[slides.title]
type = "Text"
text = "Key Points"
[slides.body]
type = "Text"
text = "- First point\n- Second point\n- Third point"
[[slides]]
kind = "Standard"
[slides.title]
type = "Text"
text = "Code Demo"
[slides.body]
type = "Html"
raw = "<pre><code class=\"language-rust\">fn hello() { println!(\"Hello Toboggan!\"); }</code></pre>"
alt = "Rust code example"
[[slides]]
kind = "Standard"
[slides.title]
type = "Text"
text = "Thanks!"
[slides.body]
type = "Text"
text = "Thank you for watching!"
5. Run the server
toboggan-server my-talk.toml
Open http://localhost:8080 in your browser to see your presentation.
Full example
title = "My Talk"
date = "2026-05-30"
[[slides]]
kind = "Part"
[slides.title]
type = "Text"
text = "Part 1"
[[slides]]
kind = "Standard"
[slides.title]
type = "Text"
text = "Welcome!"
[slides.body]
type = "Text"
text = "Hello world!"
[[slides]]
kind = "Standard"
[slides.title]
type = "Text"
text = "Styled Slide"
[slides.style]
classes = ["centered"]
style = "background: #2d3436; color: #dfe6e9;"
[[slides]]
kind = "Part"
[slides.title]
type = "Text"
text = "Part 2"
[[slides]]
kind = "Standard"
[slides.title]
type = "Text"
text = "With Notes"
[slides.body]
type = "Text"
text = "Slide content here"
[slides.notes]
type = "Text"
text = "Speaker notes — only visible in presenter mode"
Progressive reveals (steps)
To reveal content incrementally within a single slide, wrap each chunk in a <div class="step step-N">:
[[slides]]
kind = "Standard"
[slides.title]
type = "Text"
text = "Progressive Example"
[slides.body]
type = "Html"
raw = """
<div class="step step-0">
<h3>First thing to show</h3>
<p>This appears when the slide loads.</p>
</div>
<div class="step step-1">
<h3>Second thing</h3>
<p>This appears on click / next.</p>
</div>
<div class="step step-2">
<h3>Third thing</h3>
<p>This appears on the next click.</p>
</div>
"""
alt = """
## Progressive Example
### Step 1
First thing to show.
### Step 2
Second thing to show.
### Step 3
Third thing to show.
"""
The numbering starts at 0 and increments by 1 for each step. The step_counts in the API response ([0, 2, 1, ...]) tells the client how many steps each slide has (0 = single view, no steps).
Slide fields
| Field | Type | Required | Description |
|---|---|---|---|
kind | string | No | Cover, Part, or Standard |
title | content | No | Slide title content |
body | content | No | Slide body content |
notes | content | No | Speaker notes |
terminals | array | No | Embedded terminal panes |
style | style | No | CSS classes and inline style |
Style fields
| Field | Type | Description |
|---|---|---|
classes | Array | CSS classes applied to the slide |
style | String | Inline CSS |
Notes
[slides.notes]
type = "Text"
text = "Your speaker notes here"
Notes are visible in presenter mode and are not shown to the audience.
Converting Markdown to TOML
If you prefer writing in Markdown:
# Convert a folder of markdown files to TOML
toboggan-cli slides/ -f toml -o presentation.toml
Your folder structure:
slides/
├── 01-intro.md
├── 02-details.md
└── 03-end.md
Each Markdown file becomes a slide. The frontmatter of each file sets the slide metadata:
+++
title = "My Slide"
duration = "1m"
+++
Slide content here...
Example presentations
The repository includes real-world example presentations in the slides_ex/ directory, originally created by Trail of Bits for security conferences:
-
Building Secure Smart Contracts — a folder-based presentation (
slides_ex/presentations/Building Secure Smart Contracts/) ready to be converted with the CLI:toboggan-cli "slides_ex/presentations/Building Secure Smart Contracts/" -o my_talk.toml toboggan-server my_talk.toml -
How to Fuzz Like a Pro — available in two formats:
- TOML (pre-compiled, 51 slides):
toboggan-server "slides_ex/presentations/How to Fuzz Like a Pro/how-to-fuzz-like-a-pro.toml" - Markdown (folder-based, 51 slides — editable individually):
toboggan-server "slides_ex/presentations/How to Fuzz Like a Pro/markdown/"
- TOML (pre-compiled, 51 slides):
These examples demonstrate the project structure and frontmatter conventions used in real talks.
Markdown folder as input
Starting with v0.1.1-beta.2, toboggan-server accepts a directory of Markdown files directly — no TOML conversion needed:
# Serve a folder of markdown slides directly
toboggan-server ./my-slides/
# With public dir for images
toboggan-server ./my-slides/ --public-dir ./my-slides/assets
The folder structure follows the same convention as the CLI input:
my-slides/
├── _cover.md # title and date metadata
├── _head.html # custom HTML head injection
├── 01-introduction.md # individual slides
└── 02-deep-dive/
├── _part.md # section divider
└── 01-details.md
When a directory is passed, the server parses it on startup using the same parser as toboggan-cli.