Presio
Present PDFs from your browser: a no-install alternative to
Pympress. Try it at
presio.ch or presio.xyz
(use presio.ch if your institution blocks .xyz).
Plugins
Open a PDF, drive the slides from one browser window and show them in another.
This repository is the source of the hosted service.
[Demo]
[How it works]
Features
- Local by default: your PDF stays in the browser and works offline. Local presentations are kept for 7 days.
- Controller + viewer: the viewer window mirrors the controller, in sync.
- Present across devices: log in and sync to get a 6-character code. Viewers enter it on the home page and follow along live.
- Shared control: give someone a passphrase to drive.
- Speaker notes: shown next to the current and next slide, rendered as markdown.
- Embedded media: videos, GIFs and YouTube/Vimeo, with playback synced to viewers.
- Timer, a customizable layout and remappable shortcuts.
- Plugins: add features such as polls or captions; see Plugins.
- Agent APIs: an MCP server and a REST API; see Use it from an AI agent.
Adding videos and speaker notes
Any PDF works. For notes and media, use the official packages, or embed them
by hand (see Embedding notes by hand):
Typst
LaTeX
[Open in Overleaf]
To install, copy presio.sty from the package repository next to your .tex file.
Embedding notes by hand
Presio reads speaker notes from JSON files attached to the PDF (Typst) or from
note: link annotations (LaTeX).
Typst: define a helper and call it on each slide:
LaTeX: use hyperref to create an invisible note: link:
Check the result at presio.ch/check, which reports
whether the notes and media on each page are valid.
Plugins
Plugins add features such as live polls or closed captions. Browse them under
the presio-plugin topic on GitHub
and add one from Settings → Discover plugins.
To build your own, paste this prompt into Claude Code, Codex or Cursor:
Use it from an AI agent
Agents can present and check PDFs over MCP or REST. Start at
presio.ch/llms.txt. To add the MCP server to
Claude Code:
Self-hosting
For a full deployment (accounts, cross-device sync, your own domain) see
deploy/README.md.
For a single offline container with no accounts or Supabase:
:1 tracks the current major version, so it gets no breaking changes (see
Versions and upgrading). See
Running fully local / offline
for what this mode includes.