Python-scripted live slide framework
Project description
Auditorium
The presentation framework for people who think in code.
Auditorium lets you build live technical presentations as Python scripts. Each slide is an async def function. Animate algorithms step by step, render live-computed plots, run numerical demos — anything Python can do, your slides can do. No PowerPoint. No Markdown. Just code.
from auditorium import Deck
deck = Deck(title="My Talk")
@deck.slide
async def sorting_demo(ctx):
"""Explain how the algorithm builds the sorted prefix."""
await ctx.md("## Bubble Sort, Step by Step")
data = [5, 3, 8, 1, 2]
for i in range(len(data)):
for j in range(len(data) - 1 - i):
if data[j] > data[j + 1]:
data[j], data[j + 1] = data[j + 1], data[j]
await ctx.md(f"`{data}`")
await ctx.sleep(0.5)
await ctx.step()
await ctx.md("**Sorted!**")
pip install auditorium
auditorium run talk.py
Why Auditorium?
Most presentation tools treat slides as static documents. Auditorium treats them as programs.
- Run algorithms live — sort arrays, traverse graphs, train models, all animated on stage
- Compute content — generate plots, tables, or LaTeX from data, not screenshots
- Use any Python library — numpy, matplotlib, pandas, whatever you import works
- Share with students worldwide — presenter mode syncs your slides to every connected browser in real time
- Export everywhere — record to video, export to PDF, or share as a self-contained HTML that replays your talk with original timing
If you've ever wished you could await inside a PowerPoint slide, this is for you.
Quick Start
pip install auditorium # or: uv add auditorium
Create talk.py:
from auditorium import Deck
deck = Deck(title="My Talk")
@deck.slide
async def intro(ctx):
"""Notes for the presenter — only visible in presenter view."""
await ctx.md("# Welcome!")
await ctx.md("*Press right arrow to continue*")
@deck.slide
async def demo(ctx):
"""Show progressive reveals and timed content."""
await ctx.md("## Key Points")
await ctx.step()
await ctx.md("- First point")
await ctx.step()
await ctx.md("- Second point")
await ctx.sleep(1)
await ctx.md("*(that one appeared automatically)*")
Run it:
auditorium run talk.py
Features
| Feature | Description | |
|---|---|---|
| Code | Imperative Python slides | Each slide is an async def — loops, conditionals, imports, anything |
| Reveal | Progressive reveals | await ctx.step() pauses for keypress, await ctx.sleep(n) auto-advances |
| Math | LaTeX math | KaTeX bundled — $inline$ and $$display$$ in any markdown |
| Code | Syntax highlighting | Fenced code blocks with highlight.js (bundled) |
| Layout | Flexible layouts | columns, rows with "auto" sizing, arbitrarily nested |
| Presenter | Presenter mode | --presenter opens a second tab with notes, timer, next-slide preview |
| Sync | Shared navigation | Presenter drives all audience tabs — students see what you show |
| Late join | Mid-slide sync | Late-joining viewers see the full slide state immediately |
| Export | PDF / HTML / PNG | auditorium export — vector PDF, self-contained interactive HTML, or PNG per slide |
| Record | Video capture | auditorium record — headless or live recording via Playwright |
| Step export | Step-by-step | --step-by-step captures each reveal as a separate frame with original timing |
| Reload | Hot reload | Edit your .py and the browser updates — stays on the same slide |
| Offline | Fully bundled | All assets (fonts, KaTeX, highlight.js) ship with the package — zero CDN, zero internet |
| Reconnect | Server restart | Client auto-reconnects and resumes at the same slide |
Presenter Mode
Start with --presenter to sync all audience tabs to your navigation:
auditorium run talk.py --presenter
Two tabs open: your presenter view (notes + timer + slide mirror) and the audience view (projected/shared). Navigate from the presenter tab — every connected browser follows in real time.
- Docstrings become speaker notes (never shown to the audience)
- Late-joining tabs catch up instantly (full slide state replayed)
- Audience keyboards are locked — only the presenter navigates
Without --presenter, each tab navigates independently.
Layouts
@deck.slide
async def layout_demo(ctx):
"""Layouts nest freely."""
await ctx.md("## Two Columns")
left, right = await ctx.columns([2, 1])
async with left:
await ctx.md("Main content (2/3 width)")
async with right:
await ctx.md("Sidebar (1/3)")
Use "auto" for natural-size regions:
header, body, footer = await ctx.rows(["auto", 1, "auto"])
Recording & Export
Requires pip install auditorium[record] and playwright install chromium.
# Record to video
auditorium record talk.py -o talk.webm
# Export to PDF (vector), HTML (interactive), or PNG
auditorium export talk.py -f pdf -o talk.pdf
auditorium export talk.py -f html -o talk.html
auditorium export talk.py -f png -o slides/
# Step-by-step: one frame per reveal, with original timing in HTML
auditorium export talk.py -f html --step-by-step -o talk.html
Navigation
| Key | Action |
|---|---|
| Right arrow / Space | Advance step or next slide |
| Page Down | Skip to next slide |
| Left arrow | Previous slide |
r |
Restart current slide |
| Digits + Enter | Jump to slide N |
Example
See examples/demo_deck.py for a full 11-slide deck exercising every feature.
auditorium run examples/demo_deck.py
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file auditorium-1!3.2.0.tar.gz.
File metadata
- Download URL: auditorium-1!3.2.0.tar.gz
- Upload date:
- Size: 636.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c25d06b0c3105dd50d868b04dd9cef77189cf606a377d9445299b3ae6a5bd350
|
|
| MD5 |
3b9db8bf07853aa5d6f833411d7f3111
|
|
| BLAKE2b-256 |
3283c9234a76f4af30346d8174706cd5a4a6a2a4cbc367a6b7e5108d8b1d2170
|
Provenance
The following attestation bundles were made for auditorium-1!3.2.0.tar.gz:
Publisher:
deploy.yaml on apiad/auditorium
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
auditorium-1!3.2.0.tar.gz -
Subject digest:
c25d06b0c3105dd50d868b04dd9cef77189cf606a377d9445299b3ae6a5bd350 - Sigstore transparency entry: 1340166350
- Sigstore integration time:
-
Permalink:
apiad/auditorium@6ff288b1e0350ac1d7edeaec09a5bf2c17fb47c9 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/apiad
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploy.yaml@6ff288b1e0350ac1d7edeaec09a5bf2c17fb47c9 -
Trigger Event:
release
-
Statement type:
File details
Details for the file auditorium-1!3.2.0-py3-none-any.whl.
File metadata
- Download URL: auditorium-1!3.2.0-py3-none-any.whl
- Upload date:
- Size: 573.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a51a229916b44741c0566958caabf1e363d844e6b47059b4f985e954fdd3d32c
|
|
| MD5 |
a59bff970b21b87e7457835054b31252
|
|
| BLAKE2b-256 |
d9afca6a5149f11f4b5b8e253d410706a50cdf8b226acd679b5654afe96d929c
|
Provenance
The following attestation bundles were made for auditorium-1!3.2.0-py3-none-any.whl:
Publisher:
deploy.yaml on apiad/auditorium
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
auditorium-1!3.2.0-py3-none-any.whl -
Subject digest:
a51a229916b44741c0566958caabf1e363d844e6b47059b4f985e954fdd3d32c - Sigstore transparency entry: 1340166352
- Sigstore integration time:
-
Permalink:
apiad/auditorium@6ff288b1e0350ac1d7edeaec09a5bf2c17fb47c9 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/apiad
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploy.yaml@6ff288b1e0350ac1d7edeaec09a5bf2c17fb47c9 -
Trigger Event:
release
-
Statement type: