A modern, cross-platform PDF presenter with an auto-advance timer. Spiritual successor to the venerable but aging Impressive, rebuilt as a single static binary you can curl from a GitHub release and just run.
You have a PDF deck. You want to play it full-screen and have it auto-advance every N seconds — for a booth, a kiosk, a lobby screen, or just to step through slides hands-free. That's the whole feature set.
- One file. No installer, no runtime, no Python. Download a binary,
chmod +x, run. - Auto-advance with per-slide overrides. Default 30 s, page 7 needs a minute, page 3 should fly by — say so in a TOML sidecar.
- Progress overlay. A page-position bar and auto-advance countdown bar keep you oriented at a glance.
- Slide overview. Press
Tabfor a split-view thumbnail grid — large preview on the left, all slides on the right. Navigate with arrow keys or click to jump anywhere. - Resolution-aware. Pages re-rasterise at native pixel resolution on every monitor — crisp on Retina, 4K, mixed-DPI multi-monitor.
- Permissively licensed. Apache-2.0. Uses Chromium's PDFium (Apache-2.0) via a WebAssembly runtime, so the rendering engine is portable and never needs a system library.
- Built in CI. GitHub Actions produces native binaries for macOS (Apple Silicon + Intel), Linux x86-64, and Windows x86-64.
brew tap gethash/tap
brew install boozleCompiles from source locally — no Gatekeeper quarantine workaround needed.
curl -fsSL https://github.com/gethash/boozle/releases/latest/download/install.sh | shThe script detects your OS/arch, fetches the right archive, verifies its SHA-256 against the release's checksums.txt, and installs to /usr/local/bin (falling back to ~/.local/bin if you can't write there).
Override defaults with env vars:
BOOZLE_VERSION=v0.2.0 BOOZLE_INSTALL_DIR=~/bin \
curl -fsSL https://github.com/gethash/boozle/releases/latest/download/install.sh | shboozle is currently distributed unsigned. macOS Gatekeeper will block it on first launch. After install, run once:
xattr -d com.apple.quarantine /usr/local/bin/boozle(Code signing & notarisation are planned for a future release.)
iwr -useb https://github.com/gethash/boozle/releases/latest/download/install.ps1 | iexThe script installs to %LOCALAPPDATA%\boozle and prepends that directory to your user PATH. Open a new terminal afterwards.
Windows SmartScreen will warn on first run because the binary is unsigned — click More info → Run anyway.
Grab the right archive for your platform from Releases, extract, and drop boozle (or boozle.exe) somewhere on your PATH.
boozle slides.pdf --auto 30sBy default boozle opens fullscreen on your primary monitor and waits for you to advance manually. Add --auto <duration> to walk forward on its own, --loop to start over after the last page.
| Flag | Default | Description |
|---|---|---|
-a, --auto <duration> |
disabled | Advance every duration. Accepts any Go duration: 30s, 1m30s, 2m, 750ms. |
-l, --loop |
false |
Loop back to the first page after the last. |
-s, --start <N> |
1 |
Start at page N (1-indexed). |
-m, --monitor <N> |
0 |
Open on the N-th monitor (0 = primary). |
--pages <range> |
all | Restrict to pages, e.g. 3-7,10. |
--bg <hex> |
#000000 |
Background fill (#RGB, #RRGGBB, or #RRGGBBAA). |
--progress |
false |
Show page-position bar and auto-advance countdown overlay. |
--autoquit |
false |
Quit after the last page instead of stopping. |
--no-fullscreen |
false |
Run windowed (debugging / dev). |
--config <path> |
auto | Use this TOML sidecar instead of the auto-detected one. |
-h, --help |
Show help. | |
-v, --version |
Show version. |
| Key | Action |
|---|---|
→ PgDn Space Scroll down |
next page |
← PgUp Scroll up |
previous page |
Backspace |
previous page (or delete a digit if you're typing a page number) |
Home / End |
first / last page |
digits + Enter |
jump to page (e.g. 1, 2, Enter → page 12) |
l |
return to the previously viewed page |
p |
pause / resume auto-advance |
b |
black-out the screen (toggle) |
w |
white-out the screen (toggle) |
f |
toggle fullscreen |
Tab |
open slide overview (arrow keys or click to select, Enter to jump) |
q Esc |
quit |
Create slides.boozle.toml next to slides.pdf. Command-line flags always win over sidecar values, so the sidecar is a good place for per-deck defaults:
auto = "30s"
loop = true
pages = "1-5,8,10-12"
bg = "#0a0a0a"
progress = true
autoquit = false
[[page]]
n = 3
auto = "1m" # this slide needs longer
[[page]]
n = 8
auto = "5s" # this one just blips pastA complete annotated example lives at examples/sample.boozle.toml.
# Lobby kiosk, looping every 20 seconds with a progress bar:
boozle deck.pdf --auto 20s --loop --progress
# Play once and close the window when done:
boozle deck.pdf --auto 30s --autoquit
# Open the last quarter of a long deck on a second monitor:
boozle deck.pdf --pages 80-100 --monitor 1
# Use the sidecar for everything, just press play:
boozle deck.pdfYou shouldn't need to — every release ships pre-built binaries — but if you want to:
git clone https://github.com/gethash/boozle.git
cd boozle
go build -o boozle ./cmd/boozle
./boozle --no-fullscreen examples/sample.pdfRequirements: Go 1.22+ and a working CGO toolchain (Ebiten links system OpenGL on Linux/Windows and Cocoa/Metal on macOS). On Linux, install:
sudo apt-get install libgl1-mesa-dev libxcursor-dev libxi-dev libxinerama-dev \
libxrandr-dev libxxf86vm-dev libxkbcommon-devRun the test suite:
go test ./...
# Render-path coverage requires a real PDF:
BOOZLE_TEST_PDF=/path/to/any.pdf go test -count=1 ./internal/pdf/...- Rendering: PDFium (Chromium's PDF engine) compiled to WebAssembly, run inside
wazero— a pure-Go WASM runtime. No native PDFium library, no.dylib/.so/.dllto ship alongside the binary. - Windowing & input: Ebitengine handles the fullscreen window, vsync, monitor selection, and HiDPI scale factors.
- Caching: an LRU keyed by
(page, pixel-width, pixel-height)keeps the current and a few neighbour pages rasterised; a background goroutine pre-fetches the next page so auto-advance never stalls on PDFium. - Sidecar: BurntSushi/toml parses the per-PDF config; flags override sidecar values via cobra/pflag.
Apache-2.0. See LICENSE and NOTICE for third-party attributions.