next slide please

Because no one should have to ask someone else to progress their slides.

$ brew install codingconcepts/tap/nsp

Installing

Homebrew

brew install codingconcepts/tap/nsp

Install script

Downloads the right binary for your OS and architecture into /usr/local/bin, asking for sudo only if it has to:

curl -fsSL https://nextslideplease.run/install.sh | sh

Pass a tag to pin a version:

curl -fsSL https://nextslideplease.run/install.sh | sh -s v0.1.0

Download a binary

Builds for macOS, Linux and Windows are on the releases page. Download the one matching your OS and architecture, chmod +x it, and move it onto your PATH as nsp.

From source

go install github.com/codingconcepts/next-slide-please/cmd/nsp@latest

Check it worked

nsp version

Using it

The presenter - the person with the slides, being asked for the next one - starts first. That prints a code to share with everyone who should be able to drive:

nsp present
next slide please

Share this code
╭──────────────╮
│  0PpTrMetgz  │
╰──────────────╯

╭─────────────────────────────────────────────────────╮
│ 3 connected                                         │
│ › Rob Reid                      enabled       → ×12 │
│   bob                           logging       ← ×2  │
│   carol                         muted         -     │
╰─────────────────────────────────────────────────────╯
↑/↓ select · space muted/logging/enabled · a enable all · l log all · n mute all · q quit

A speaker joins with that code:

nsp speak --code 0PpTrMetgz --name alice

Every speaker is in one of three modes, and space walks the selected one round them:

ModeWhat happens to their keys
loggingShown in the list as they arrive, and nothing else. Where everyone starts.
enabledPressed for real. They are driving.
mutedDropped.

Speakers arrive logging rather than enabled: holding the code gets you into the room, and you decide who drives. You can watch someone connect and press the right keys before they can move a slide, which is the moment to find out that their arrow keys work.

How it works

Keypresses travel directly between machines over a WebRTC data channel. A small Cloudflare Worker introduces the peers to each other and then drops out of the path - it only ever sees connection setup, never a slide command.

Several people can join one presentation. The presenter sees them all in a list and can mute and unmute any of them mid-talk.

Platforms and permissions

Speakers run anywhere. nsp speak is pure Go and reads its keys from its own terminal rather than from the system, so it needs no permission and does not watch the keyboard.

Presenting is macOS only for now, because pressing a key is the one thing nsp has to ask the operating system to do. On macOS that goes through CoreGraphics, and macOS will ask for Accessibility permission for whichever terminal you present from. Nothing else in nsp needs a permission of any kind.

nsp present elsewhere fails immediately with an explanation rather than silently receiving keys and doing nothing. --dry-run works everywhere, and shows the keys the presenter receives instead of pressing them.