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

1

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.

2

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.

3

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.

4

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.

5

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.

Sessions persist until you click End Session in the deck editor. If you close the browser tab, the session stays active and the Player keeps showing the last slide.

Slide Types

TypeFormats
ImageJPG, PNG, GIF, WebP
VideoMP4, WebM
YouTubeAny YouTube URL
WebpageAny 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.

Click Regenerate thumbnail (grid view) or Gen thumbnail (list view) on any video slide without a poster frame to extract one without re-uploading the video.

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

PDF

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.

The chapter name defaults to the filename of the uploaded file. You can override it in the import dialog before starting the import.

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

KeyAction
→ or SpaceNext slide
Previous slide
BToggle blank screen
FToggle 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

Latest

v5.2.0 · Bitfocus Buttons & Companion compatible · Server-authoritative timers · Dynamic slide/chapter dropdowns

Release Notes

v5.2.0March 2026Latest
  • +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.
v5.1.0March 2026
  • +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.
v5.0.0March 2026
  • +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

1

Download the module

Download companion-module-slidestage-5.2.0.tgz using the button above.

2

Import into Bitfocus

In Bitfocus, go to Connections → Add Connection. Search for "SlideStage" or click Import from file and select the downloaded .tgz file.

3

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.

HTTPS deployments: The module automatically uses wss:// (secure WebSocket) when your URL starts with https://.
4

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 health

Presentation Timer

$(slidestage:timer_remaining)Presentation countdown remaining (mm:ss)
$(slidestage:timer_state)stopped / running / paused / expired

Chapter 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_changedNavigation
Button highlights when the slide changes
is_blankNavigation
Button highlights when blank screen is active
is_playingNavigation
Button highlights when auto-advance is active
chapter_index_matchNavigation
Button highlights when the current chapter index matches a configured value — build a chapter indicator row
chapter_name_matchNavigation
Button highlights when the current chapter name contains a configured string
chapter_last_slideNavigation
Button highlights when the active slide is the last slide of the current chapter
timer_warningPresentation Timer
Button turns amber when presentation timer < threshold
timer_expiredPresentation Timer
Button turns red when presentation timer reaches 0
chapter_runningChapter Timer
Button highlights when chapter timer is running
chapter_warningChapter Timer
Button turns amber when chapter timer < threshold
chapter_expiredChapter Timer
Button turns red when chapter timer reaches 0
slide_timer_runningSlide Timer
Button highlights when the slide auto-advance timer is running
slide_timer_warningSlide Timer
Button turns amber when slide timer < threshold (configurable)
slide_timer_expiredSlide Timer
Button turns red when slide timer reaches 0

Recipe: 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             → amber

Tip: 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.jpg

API 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

FAQ