Present PDFs from the browser: upload to start a slideshow or validate Presio sidecars. No auth.
MCP Server: xyz.presio/presio
This MCP server presents PDFs from the browser. It lets you upload a PDF presentation to start a slideshow or validate Presio sidecars. It provides no authentication. The repository is the source code for a hosted service accessed at presio.xyz.
๐ ๏ธ Key Features
Present PDFs from the browser
Upload a PDF presentation to get a short link
Control the slideshow from one browser window while viewers watch in another
Local-by-default option: PDF stays in the browser, never uploaded
Local presentations kept for up to 7 days
Controller + viewer slide control
๐ Use Cases
Start a slideshow from an uploaded PDF
Validate Presio sidecars
Share slide control via a short link
โก Developer Benefits
Browser-based PDF presentation workflow
Availability of controller/viewer roles
No authentication required for access
โ ๏ธ Limitations
No authentication
Hosted service described; requires presio.xyz usage context
Topics
latexpdfpdf-viewerpresentationtypstwebwebapp
Captured live from the server via tools/list.
present_pdf
Upload a PDF to start a local Presio presentation. Returns a url โ open it in a browser to finish handoff (skips share). Same as POST /api/present.
Present PDFs from your browser โ try it at presio.xyz.
Upload a PDF presentation, get a short link, and control the slideshow from one browser window while viewers watch in another. Presio is a hosted service; this repository is its source code.
Demo
Features
Local by default โ your PDF stays in the browser and is never uploaded. Works offline; local presentations are kept for up to 7 days.
Controller + viewer โ drive slides from the controller window while a viewer window mirrors it, kept perfectly in sync.
Present across devices โ log in and sync online to get a 6-character session code. Viewers enter it on the home page and follow along live over WebSockets.
Shared control โ hand out a controller passphrase to let someone else drive.
Speaker notes โ written next to your current and next slide, rendered as markdown.
Embedded media โ local videos and GIFs, direct video URLs, and YouTube/Vimeo. Playback, autoplay, and seeking all stay in sync with viewers.
Presentation timer โ track how long you've been talking.
Customizable controller โ rearrange the layout and remap keyboard shortcuts.
Recent presentations โ pick up where you left off from the home page.
Download โ anyone can grab the PDF from the presentation view.
Presio is agnostic to the typesetting engine used โ any PDF works, and notes can also be embedded by hand from plain Typst or LaTeX (see Embedding notes by hand). Official packages are available for the two most common ones:
#import "@preview/presio:0.2.1": 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
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}
For LaTeX, copy presio.sty from the package repository next to your .tex file โ that's the whole install.
Embedding notes by hand
Prefer not to use the packages? Presio reads speaker notes from JSON files
attached to the PDF (Typst) or from note: link annotations (LaTeX), and
renders them as markdown in the controller's notes panel.
Typst โ define a helper and call it on each slide:
typst
#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:
latex
\usepackage{hyperref}
\newcommand{\speakernote}[1]{%
\href{note:#1}{\phantom{n}}%
}
% Usage on a slide:
\speakernote{Remember to mention the demo.}
Validate what you produced at presio.xyz/check โ it
shows per-page thumbnails and reports whether the notes and media sidecars are
valid.
Self-hosting
Want to run Presio yourself instead of using the hosted service? For a full
deployment (accounts, cross-device sync, your own domain) see
deploy/README.md.
For a single offline container with no accounts and no Supabase โ just present
PDFs on your own machine or LAN โ nothing needs building: