Overview
SlideStage is a web-based presentation control system. It organises content into a hierarchy of Projects → Decks → Chapters → Slides, then runs them live with a fullscreen Player screen, a Presenter view, and a REST API that lets any device control the presentation.
Project
Top-level container for an event or client
Deck
A single presentation with its own session
Chapter
A section within a deck (e.g. Opening)
Slide
An image, video, YouTube, or webpage
Screens
Player
Fullscreen display for the audience. Shows slides, videos, YouTube, and webpages.
Presenter
Operator view with notes, next-slide preview, timers, and navigation controls.
Stage Display
Minimal screen showing the current slide thumbnail and chapter name. Ideal for a confidence monitor.
Notes Screen
Notes-only view with adjustable font size. Use on a tablet or secondary monitor.
User Guide
Create a Project
Click New Project on the home screen. Give it a name (e.g. "Annual Conference 2026") and an optional description. Projects are the top-level container — one event, one project.
Add a Deck
Inside your project, click New Deck. A deck is a single presentation (e.g. "Opening Keynote"). Each deck has its own chapters and slides, and generates its own session token when you go live.
Build Chapters and Slides
Open the deck editor. Use Add Chapter to create sections. Inside each chapter you can add image, video, YouTube, and webpage slides — or import a PDF/PPTX file. Drag and drop to reorder slides within a chapter, or drag chapter headers to reorder chapters.
Start a Presentation
Click Start Presentation in the deck editor header. A session banner appears with three URLs: Player (for the display), Presenter (for the operator), and the API base URL for hardware control. Copy the Player URL to your display device or scan the QR code.
Control the Presentation
Use the Presenter screen to navigate slides, view notes, and manage timers. Or use the Connection API to control everything from a Stream Deck, a script, or any HTTP-capable device.
Slide Types
| Type | Formats |
|---|---|
| Image | JPG, PNG, GIF, WebP |
| Video | MP4, WebM |
| YouTube | Any YouTube URL |
| Webpage | Any URL |
Video Thumbnail Regeneration
When you upload a video, SlideStage automatically extracts a poster frame (the first frame) and uses it as the thumbnail in the editor. For older video slides that were uploaded before this feature existed, a Regenerate thumbnail button appears on the slide card.
Import
Import PDF, PPTX, PPT, or Google Slides presentations directly into a deck. Each page is converted to a high-resolution PNG image slide and uploaded to S3. Progress is streamed in real time.
Supported Sources
Upload any PDF file up to 500 MB
PPTX / PPT
PowerPoint files converted via LibreOffice
Google Slides
Paste the share URL — no download needed
Chapter Placement
By default, imported slides are appended as a new chapter at the end of the deck. Use the Insert after chapter dropdown in the import dialog to place the new chapter at a specific position mid-deck.
DPI / Resolution
Choose the output resolution: 72 dpi (fast, smaller files), 150 dpi (default, good quality), 200 dpi, or 300 dpi (high quality, slower). Higher DPI produces sharper images but takes longer to convert and upload.
Presenter Screen
The Presenter screen is the operator's control surface. It shows the current slide, the next slide preview, presenter notes, navigation controls, and three timers.
Navigation
Large Next / Prev buttons with keyboard shortcuts (→ Space / ←). Swipe left/right on mobile.
Presenter Notes
Per-slide and per-chapter notes. Adjustable font size persists between sessions.
Presentation Timer
Countdown timer for the full presentation. Start, pause, reset, set duration. Synced to backend.
Per-Slide Timer
Local countdown that resets on each slide change. Configurable duration with quick presets.
Video Timer
Shows remaining playback time for video slides. Reads duration from video metadata.
Blank Screen
B key or button to toggle a black screen on the Player. Useful between segments.
Keyboard Shortcuts
| Key | Action |
|---|---|
→ or Space | Next slide |
← | Previous slide |
B | Toggle blank screen |
F | Toggle fullscreen (Player screen) |
Bitfocus Connection
The SlideStage Bitfocus Connection module integrates with Bitfocus Buttons & Companion to give Stream Deck operators full control over presentations — including live variable feedback on button labels, server-authoritative timers, and dynamic slide/chapter dropdowns.
companion-module-slidestage-5.2.0.tgz
Latestv5.2.0 · Bitfocus Buttons & Companion compatible · Server-authoritative timers · Dynamic slide/chapter dropdowns
Release Notes
- +Server-authoritative timers — chapter timer and slide timer now receive live second-by-second ticks directly from the server via WebSocket push. Previously only slide navigation events triggered a Companion update.
- +Slide timer support — new variables
slide_timer,slide_timer_seconds,slide_timer_state,slide_timer_display, feedbacks, and preset buttons. - +20+ ready presets across six categories: Navigation, Info, Presentation, Presentation Timer, Chapter Timer, and Slide Timer.
- +Go to Slide in Current Chapter — new action with a dynamic dropdown listing only the slides in the active chapter. Rebuilds automatically when the chapter changes.
- +Dynamic slide list — Go to Slide action shows a dropdown of all slide names fetched from the server, refreshed every 30 seconds.
- +Dynamic chapter list — Go to Chapter action shows a dropdown of all chapter names with slide counts.
- +Server-sync presentation timer — countdown reads initial value from server state on every update instead of running purely locally.
Installation
Download the module
Download companion-module-slidestage-5.2.0.tgz using the button above.
Import into Bitfocus
In Bitfocus, go to Connections → Add Connection. Search for "SlideStage" or click Import from file and select the downloaded .tgz file.
Configure the connection
Enter the SlideStage URL — the full URL of your deployment (e.g. https://slidestage.loevland.com) — and the Session Token from the session banner in the deck editor.
wss:// (secure WebSocket) when your URL starts with https://.Add preset buttons
Go to the Presets tab for the SlideStage connection and drag the pre-built buttons onto your Stream Deck pages. Presets are organised into six categories: Navigation, Info, Presentation, Presentation Timer, Chapter Timer, and Slide Timer.
Variables
Use these variables in button labels to display live presentation state. All timer variables update via server-authoritative WebSocket push — the display always matches the server.
Navigation
$(slidestage:current_slide_index)Zero-based index of the current slide$(slidestage:total_slides)Total number of slides in the session$(slidestage:slide_position)Human-readable position, e.g. "3 / 12"$(slidestage:current_chapter)Name of the current chapter$(slidestage:current_filename)Filename of the current slide$(slidestage:next_slide_name)Filename of the upcoming slide — show on button labels to preview$(slidestage:next_chapter_name)Name of the next chapter$(slidestage:is_blank)"true" when the blank screen is active$(slidestage:session_name)Operator-set label for the session (e.g. "Main Stage"). Falls back to "—" when no name is assigned.$(slidestage:connection_status)ok / connecting / error — current WebSocket connection healthPresentation Timer
$(slidestage:timer_remaining)Presentation countdown remaining (mm:ss)$(slidestage:timer_state)stopped / running / paused / expiredChapter Timer
$(slidestage:chapter_remaining)Chapter timer remaining (mm:ss) — live server-authoritative tick$(slidestage:chapter_state)Chapter timer state (stopped / running / paused / expired)$(slidestage:chapter_timer_display)Formatted chapter timer for button display, e.g. "CH 04:30"Slide Timer
$(slidestage:slide_timer)Slide auto-advance timer remaining (mm:ss)$(slidestage:slide_timer_seconds)Slide timer remaining as a plain integer (seconds)$(slidestage:slide_timer_state)Slide timer state (stopped / running / paused / expired)$(slidestage:slide_timer_display)Formatted slide timer for button display, e.g. "SL 00:45"$(slidestage:is_playing)"true" when auto-advance is active (slide timer is running)Actions
All available actions in the SlideStage connection module. Actions marked Dynamic show a live dropdown populated from the server.
Navigation
| Next Slide |
| Previous Slide |
| Go to SlideDynamic |
| Go to Slide (by number) |
| Go to ChapterDynamic |
| Go to Chapter (by number) |
| Go to Slide in Current ChapterDynamic |
| Next Chapter |
| Previous Chapter |
| Toggle Blank Screen |
Presentation Timer
| Timer Start/Resume |
| Timer Pause |
| Timer Reset |
| Set Timer Duration |
Chapter Timer
| Chapter Timer Start |
| Chapter Timer Pause |
| Chapter Timer Resume |
| Chapter Timer Reset |
| Set Chapter Timer |
Feedbacks
Feedbacks change button appearance based on presentation state:
slide_changedNavigationis_blankNavigationis_playingNavigationchapter_index_matchNavigationchapter_name_matchNavigationchapter_last_slideNavigationtimer_warningPresentation Timertimer_expiredPresentation Timerchapter_runningChapter Timerchapter_warningChapter Timerchapter_expiredChapter Timerslide_timer_runningSlide Timerslide_timer_warningSlide Timerslide_timer_expiredSlide TimerRecipe: Chapter Indicator Row
Combine chapter_index_match feedbacks across multiple buttons to build a visual chapter progress bar on your Stream Deck. Each button represents one chapter and lights up blue when the presentation is on that chapter.
Step 1 — Create one button per chapter. For a deck with three chapters, create three buttons side by side. Set each button's label to the chapter name (e.g. Intro, Main, Q&A) and optionally assign a goto_chapter action so tapping the button also jumps to that chapter.
Step 2 — Add a chapter_index_match feedback to each button. Set the Chapter number option to 1 for the first button, 2 for the second, and so on. Choose a highlight colour (e.g. blue #1d4ed8).
Step 3 — Optionally add chapter_last_slide to a dedicated warning button. Place a fourth button labelled NEXT CHAPTER and attach the chapter_last_slide feedback with an amber highlight. It will light up whenever the last slide of any chapter is active, giving the operator a heads-up before the chapter transitions.
Button 1: label="Intro" → feedback: chapter_index_match(chapter=1) → blue
Button 2: label="Main" → feedback: chapter_index_match(chapter=2) → blue
Button 3: label="Q&A" → feedback: chapter_index_match(chapter=3) → blue
Button 4: label="NEXT CH" → feedback: chapter_last_slide → amberTip: use Export Page in the Bitfocus Connection modal Presets tab to download a pre-built page JSON that already includes these buttons for your specific deck — no manual setup required.
next_slide_name Variable
The next_slide_name variable lets operators preview the upcoming slide title directly on a Stream Deck button label. This is particularly useful for anticipating transitions during live events.
// Example button label:
Next: $(slidestage:next_slide_name)
// Displays as:
Next: 03-sponsor-logo.jpgAPI Reference
The Connection API is a plain HTTP REST API. No authentication is required. The base URL is shown in the session banner when you start a presentation.
Base URL: https://your-server/api/connection/:token
Content-Type: application/json (for POST requests with a body)Playback Control
Presentation Timer
Chapter Timer
The chapter timer is a separate countdown independent of the presentation timer. It is used to track time allocated to a specific chapter.
Example: curl
# Get current status
curl https://your-server/api/connection/TOKEN/status
# Advance to next slide
curl -X POST https://your-server/api/connection/TOKEN/next
# Jump to slide index 5
curl -X POST https://your-server/api/connection/TOKEN/goto \
-H "Content-Type: application/json" \
-d '{"index": 5}'
# Set timer to 10 minutes and start it
curl -X POST https://your-server/api/connection/TOKEN/timer/set \
-H "Content-Type: application/json" \
-d '{"seconds": 600}'
curl -X POST https://your-server/api/connection/TOKEN/timer/start