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

FieldTypeRequiredDescription
kindstringNoCover, Part, or Standard
titlecontentNoSlide title content
bodycontentNoSlide body content
notescontentNoSpeaker notes
terminalsarrayNoEmbedded terminal panes
stylestyleNoCSS classes and inline style

Style fields

FieldTypeDescription
classesArrayCSS classes applied to the slide
styleStringInline 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/"
      

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.