Skip to content

gethash/boozle

Repository files navigation

boozle

CI Release License

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.

What it does

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 Tab for 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.

Install

Homebrew (macOS and Linux)

brew tap gethash/tap
brew install boozle

Compiles from source locally — no Gatekeeper quarantine workaround needed.

macOS / Linux

curl -fsSL https://github.com/gethash/boozle/releases/latest/download/install.sh | sh

The 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 | sh

macOS first-run note

boozle 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.)

Windows

iwr -useb https://github.com/gethash/boozle/releases/latest/download/install.ps1 | iex

The 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.

Manual

Grab the right archive for your platform from Releases, extract, and drop boozle (or boozle.exe) somewhere on your PATH.

Usage

boozle slides.pdf --auto 30s

By 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.

Flags

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.

Keybindings

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

Sidecar configuration (per-PDF)

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 past

A complete annotated example lives at examples/sample.boozle.toml.

Examples

# 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.pdf

Build from source

You 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.pdf

Requirements: 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-dev

Run 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/...

How it works

  • Rendering: PDFium (Chromium's PDF engine) compiled to WebAssembly, run inside wazero — a pure-Go WASM runtime. No native PDFium library, no .dylib/.so/.dll to 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.

License

Apache-2.0. See LICENSE and NOTICE for third-party attributions.

About

No bloated presentation suite. No browser hacks. No runtime setup. Just drop in a PDF and let Boozle run the show.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors