Dais is a cross-platform PDF presentation console written in Rust for researchers and academics who build slides in LaTeX/Beamer, Typst, PowerPoint, or Keynote. Dais is designed for straightforward installation, reliable operation in real presentation setups, and compatibility with existing slide workflows.
- Multi-monitor presenter view with an audience display and a presenter console with notes, timer, and navigation.
- Overlay and build-step support for
pdfpcmetadata, Beamer\pdfpc, and manual grouping. - Presentation tools including a laser pointer, freehand ink, spotlight, and zoom.
.pdfpccompatibility and a native.daissidecar format.- Fully remappable keybindings with presenter-console defaults.
- Single-binary distribution with no runtime dependencies or installers.
# Download the latest release for your platform from GitHub Releases, then run:
dais presentation.pdfdais <file.pdf> # Present with auto-detected display mode
dais --single <file.pdf> # Single-monitor mode (no audience window)
dais --screen-share <file.pdf> # Screen-share mode (audience as normal window)
dais --edit <file.pdf> # Open the slide grouping editor
- Dual (default with 2+ monitors): Presenter console on primary, audience fullscreen on secondary.
- Single (
--single): Single-window mode. PressF5to switch between the presenter console and the presentation HUD. - Screen-share (
--screen-share): Both windows visible; audience is a normal resizable window for Zoom/Teams sharing.
With one monitor, Dais automatically falls back to single mode.
For PDFs without embedded overlay metadata (e.g., PowerPoint exports), use the built-in editor:
dais --edit slides.pdfClick between thumbnails to set group boundaries. Save writes the configured sidecar format. When loading, Dais checks .dais before .pdfpc.
Requires Rust 1.92+ (for the hayro PDF renderer). For a local version, simply run:
cargo install --path crates/daisTo install without cloning from GitHub:
cargo install --git https://github.com/christopherkenny/dais.git --package dais --bin daisThe binary will be at target/release/dais (or dais.exe on Windows).
- Windows:
%APPDATA%\dais\config.toml - macOS:
~/Library/Application Support/dais/config.toml - Linux:
~/.config/dais/config.toml
Dais also reads a project-local dais.toml next to the PDF you open, and --config <path>
can override both.
See docs/configuration.md for the full reference.
For display assignment, audience_monitor can be a monitor name or a simple display number like "2".
See docs/keybindings.md for the full reference.
See docs/clicker-setup.md for clicker profiles, custom mappings, and the --test-input diagnostic mode.
Dais is organized as a 7-crate Cargo workspace:
| Crate | Role |
|---|---|
dais |
Binary for CLI parsing and app launch |
dais-core |
Commands, state types, command bus, config, keybindings |
dais-engine |
Presentation engine that processes commands and owns state |
dais-document |
DocumentSource trait, hayro PDF renderer, and page cache |
dais-sidecar |
.pdfpc parser/writer, metadata extraction |
dais-platform |
Platform-specific monitor enumeration |
dais-ui |
egui UI for the presenter console, audience window, and grouping editor |
Key architectural decisions:
- Command bus: All user actions flow through a
Commandenum dispatched viacrossbeam-channel. New input sources (REST API, remote control) just get another sender. - State broadcast: The engine owns the authoritative
PresentationState. UI reads viaArc<RwLock<>>and never mutates state directly. DocumentSourcetrait: PDF rendering is isolated behind a document-source abstraction; the default backend ishayro.SidecarFormattrait: Pluggable sidecar formats for.pdfpccompatibility and Dais-native metadata.
# Run tests
cargo test --workspace
# Lint
cargo clippy --workspace --all-targets -- -D warnings
# Format
cargo fmt --allCI runs on all three platforms (Windows, macOS, Linux) on every push and PR.
The original project proposal is archived at docs/design-proposal.md.
MIT. See LICENSE.
