About Presio
Presio is a browser-based PDF presentation tool for presenters who want to run slides without installing a desktop app. It keeps local PDFs in the browser by default and supports synchronized viewer windows, speaker notes, media and plugins.
Key features
- 01Present PDFs in a browser
- 02Synchronize controller and viewer windows
- 03Share presentations across devices
- 04Show Markdown speaker notes
- 05Sync video and embedded media playback
- 06Extend presentations with plugins
Use cases
- 01Present a PDF from a browser
- 02Show slides on a second window or device
- 03Use speaker notes while presenting
- 04Add polls or captions through plugins
MCP support
Presio provides an MCP server and REST API for agents to present and validate PDFs. The documented MCP endpoint is https://presio.ch/mcp.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://presio.xyz/mcpclaude mcp add --transport http xyz-presio-presio https://presio.xyz/mcp{"mcpServers":{"xyz-presio-presio":{"type":"http","url":"https://presio.xyz/mcp"}}}Open in Cursor{"servers":{"xyz-presio-presio":{"type":"http","url":"https://presio.xyz/mcp"}}}Open in VS Code{"mcpServers":{"xyz-presio-presio":{"type":"http","url":"https://presio.xyz/mcp"}}}{"mcpServers":{"xyz-presio-presio":{"serverUrl":"https://presio.xyz/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
2| Parameter | Type | Required | Description |
|---|---|---|---|
| filename | string | No | Original filename, e.g. deck.pdf |
| pdf_base64 | string | Yes | PDF file contents, base64-encoded |
| session_id | string | No | Id of an existing presentation to update in place (from an earlier present response) instead of creating a new one |
| controller_token | string | No | Controller token for that presentation — the t= query parameter of the url returned when it was created. Required whenever session_id is given. |
Details
From the project READMEPresio
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).
Open a PDF, drive the slides from one browser window and show them in another. This repository is the source of the hosted service.


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 — presio-typst-package
- LaTeX — presio-latex-package
Typst
#import "@preview/presio:0.2.3": media, speaker-notes
= Introduction
Hello world.
#speaker-notes[
Remember to mention the demo before moving on.
]
#media("https://www.youtube.com/watch?v=dQw4w9WgXcQ", width: 60%, aspect-ratio: 16/9)
LaTeX
\documentclass{beamer}
\usepackage{presio}
\begin{document}
\begin{frame}{Introduction}
Hello world.
\presionote{Remember to mention the demo before moving on.}
\end{frame}
\begin{frame}{The demo}
\presiomedia[width=0.7\linewidth]{https://www.youtube.com/watch?v=dQw4w9WgXcQ}
\end{frame}
\end{document}
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:
#let speaker-notes(notes) = context {
// Page number keeps the attachment filename unique per slide
let page-num = counter(page).display()
let filename = "notes-slide-" + page-num + ".json"
let json-string = json.encode((slide: page-num, notes: notes))
pdf.attach(
filename,
bytes(json-string),
description: "Speaker notes for slide " + page-num,
mime-type: "application/json",
)
}
#speaker-notes("Remember to mention the demo.")
LaTeX: use hyperref to create an invisible note: link:
\usepackage{hyperref}
\newcommand{\speakernote}[1]{%
\href{note:#1}{\phantom{n}}%
}
% Usage on a slide:
\speakernote{Remember to mention the demo.}
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:
Read https://presio.ch/plugins.md and build me a Presio plugin. Ask me what it should do first.
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:
claude mcp add --transport http presio https://presio.ch/mcp
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:
docker run -d -p 3001:3001 -e PRESIO_MODE=local -e LOCAL_DATA_DIR=/data \
-e TRUST_PROXY=false -v presio-data:/data \
ghcr.io/potentialhedge/presio-local:1
: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.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.