Chrome DevTools MCP
Control live Chrome, debug network, capture screenshots, check console, automate tests.
CHChromeDevTools/chrome-devtools-mcp53k338 new stars in the last 7 days
Present PDFs from the browser: upload to start a slideshow or validate Presio sidecars. No auth.
Present PDFs from your browser. Try it at presio.ch or presio.xyz.
A modern no-install alternative to Pympress with more features!
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.
If
.xyzdomains are blocked by your institution you can use presio.ch


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.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)
\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.
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:
#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.}
Validate what you produced at presio.ch/check — it shows per-page thumbnails and reports whether the notes and media sidecars are valid.
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:
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/benedict-armstrong/presio-local:1
The :1 tag tracks the current major release line — fixes and features, no
breaking changes. See Versions and upgrading.
See "Running fully local / offline" for what this mode does and doesn't include.
Control live Chrome, debug network, capture screenshots, check console, automate tests.
CHChromeDevTools/chrome-devtools-mcp53k338 new stars in the last 7 days
Official PostHog MCP Server for product analytics, feature flags, experiments, and more.
POPostHog/posthog40k101 new stars in the last 7 days
MCP server for filesystem access
BYbytedance/UI-TARS-desktop39k67 new stars in the last 7 days
MCP server for browser use access
BYbytedance/UI-TARS-desktop39k67 new stars in the last 7 days
An MCP server to run arbitrary commands
BYbytedance/UI-TARS-desktop39k67 new stars in the last 7 days