Skip to main content

Python-scripted live slide framework

Project description

Auditorium

PyPI - License PyPI - Python Version PyPI

Auditorium is a Python framework for live technical presentations. You write slides as async def functions in a plain .py file, and Auditorium runs them as a live presentation in your browser — complete with keypress-gated reveals, timed animations, LaTeX math, syntax-highlighted code, and flexible layouts.

from auditorium import Deck

deck = Deck(title="My Talk")

@deck.slide
async def hello(ctx):
    """# Hello, World!

    This is rendered from the **docstring**.
    """
    await ctx.step()
    await ctx.md("This appeared after pressing right arrow.")
auditorium run talk.py

How it works

Each slide is an async def decorated with @deck.slide. The docstring renders as Markdown when the slide loads. The function body is imperative Python that drives the presentation through awaitable primitives:

  • Content: show(html), hide(selector), replace(selector, html), set_class(selector, cls), remove_class(selector, cls)
  • Markdown: md(text), show_md(path)
  • Timing: step() (wait for keypress), sleep(seconds)
  • Layout: columns(sizing), rows(sizing), place(html, x, y)

A FastAPI server runs your slide functions and pushes DOM mutations over WebSocket to a minimal browser client. Each browser tab gets its own independent session — you can have multiple tabs on different slides simultaneously.

Installation

Requires Python 3.12+.

pip install auditorium

Or with uv:

uv add auditorium

Usage

Create a file (e.g. talk.py) with a Deck instance and @deck.slide functions, then run:

auditorium run talk.py

Options:

Flag Default Description
--host 127.0.0.1 Host to bind to
--port 8000 Port to bind to
--no-open (opens browser) Don't auto-open the browser
--no-watch (watches files) Disable hot reload

Hot reload is on by default — edit your .py file and the browser stays on the current slide while picking up changes. A small status dot in the bottom-left corner shows connection state (green = connected, red = disconnected, blinking orange = reconnecting).

Navigation

Key Action
Right arrow / Space Advance step, or next slide if no pending step
Page Down Skip to next slide (cancel remaining steps)
Left arrow Previous slide (re-runs from start)
r Restart current slide
Digits + Enter Jump to slide N

Layouts

Layout primitives return Region objects that scope insertion targets via async with:

@deck.slide
async def side_by_side(ctx):
    """## 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 width)")

Sizing accepts integers (proportional), or "auto" for natural content size:

@deck.slide
async def structured(ctx):
    """## Header / Body / Footer"""
    header, body, footer = await ctx.rows(["auto", 1, "auto"])

    async with header:
        await ctx.md("### Fixed Header")
    async with footer:
        await ctx.md("*Fixed footer*")
    async with body:
        await ctx.md("Body stretches to fill remaining space.")

Available: columns(sizing), rows(sizing), place(html, x, y). They nest freely.

Features

  • Markdown docstrings — slide content as prose, right next to the code
  • Progressive revealsawait ctx.step() pauses for a keypress
  • Timed animationsawait ctx.sleep(seconds) for automatic pacing
  • LaTeX math — KaTeX bundled, use $...$ or $$...$$ in Markdown
  • Code highlighting — fenced code blocks highlighted by highlight.js (bundled)
  • Flexible layoutscolumns, rows, place with "auto" sizing
  • Hot reload — edit and see changes instantly, staying on the same slide
  • Independent sessions — each browser tab runs its own slide independently
  • Reconnection — survives server restarts without losing your place
  • Video recordingauditorium record captures presentations via Playwright
  • Fully offline — all assets bundled, zero outbound requests, no build step

Recording

Record your presentation to video (requires pip install auditorium[record] and playwright install chromium):

# Auto mode: headless, deterministic pacing
auditorium record talk.py -o talk.webm --auto-step 2.0

# Live mode: you drive, Playwright captures
auditorium record talk.py -o talk.webm --live
Flag Default Description
--output / -o recording.webm Output file path
--resolution 1920x1080 Viewport size
--auto-step 2.0 Seconds per step() in auto mode
--slide-delay 3.0 Seconds to linger on completed slide before advancing
--live off Visible browser, manual navigation

Example

See examples/demo_deck.py for a complete deck exercising every feature.

auditorium run examples/demo_deck.py

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

auditorium-1!2.1.0.tar.gz (612.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

auditorium-1!2.1.0-py3-none-any.whl (567.4 kB view details)

Uploaded Python 3

File details

Details for the file auditorium-1!2.1.0.tar.gz.

File metadata

  • Download URL: auditorium-1!2.1.0.tar.gz
  • Upload date:
  • Size: 612.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for auditorium-1!2.1.0.tar.gz
Algorithm Hash digest
SHA256 805f35775764d347d040b649da1a92c0ada7e92ce851379632cbd1e2b80a05fa
MD5 d0f1f4ecb3fc3d15d2bba4481dd5c764
BLAKE2b-256 51d73d3299db9441740fdf8c12caef71657f894362962536b11ef74ca1b72f92

See more details on using hashes here.

Provenance

The following attestation bundles were made for auditorium-1!2.1.0.tar.gz:

Publisher: deploy.yaml on apiad/auditorium

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file auditorium-1!2.1.0-py3-none-any.whl.

File metadata

  • Download URL: auditorium-1!2.1.0-py3-none-any.whl
  • Upload date:
  • Size: 567.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for auditorium-1!2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 359a95a0cf8f8f84ea209022d8abacce35ebdc21c4e3d0909dd95f200eb9a73e
MD5 207691ea25d29989868914ccd9488d01
BLAKE2b-256 a5fb4245f2f81667a84af37f78f6d796817960174ecde9e7aac24cbb202517bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for auditorium-1!2.1.0-py3-none-any.whl:

Publisher: deploy.yaml on apiad/auditorium

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page