Professional web-based presentation tool with dual-window mode, intelligent timing management, and speaker notes. Built with SvelteKit for a seamless, offline-capable experience.
git clone https://github.com/glowingkitty/WebSlidePresenter.git
cd WebSlidePresenter/app
npm install
npm run dev- Load PDF: Click "๐ Load PDF" or drag & drop a PDF file onto the preview area
- Quick Timing: Click "Auto-fill" โ Enter duration (e.g.,
30minutes) - Open Audience View: Click "๐ฅ Audience" โ Press
Ffor fullscreen - Present: Click "Start" โ Use
โ/Space/ navigation buttons to advance
- Drag & Drop: Simply drag a PDF file onto the app to load it instantly
- Persistence: Your presentation persists across page reloads automatically
- Pause & Adjust: Click "Pause" during presentation to adjust timing on the fly
- Save Config: Click "๐พ Save" to save timing + notes for reuse
- Navigation Buttons: Use on-screen buttons for touch/mouse control
- Clear Data: Click "๐๏ธ Clear All" to reset everything when starting fresh
- Milestone-Based Timing: Set target times only for key slides, others auto-calculate via interpolation
- Edit & Present Modes: Clean separation between setup and presentation
- Pause & Adjust: Pause during presentation to fine-tune timing without losing progress
- Real-Time Pacing: Color-coded indicators (
โ ๏ธ Too Fast / โ Ahead / โ On Time / โ Behind) - Timing Overview: See all slide timings at a glance with milestone indicators (๐ vs ๐)
- Minutes-Only Display: Shows minutes during presentation, countdown in last minute
- Presenter View: Full control with slide preview, notes, timer, and timing info
- Audience View: Clean, distraction-free slide display
- Synchronized Navigation: BroadcastChannel API keeps windows in sync
- Mini Next-Slide Preview: PowerPoint-style preview in presenter view
- Per-Slide Notes: Editable speaker notes for each slide
- Auto-Save: Notes save automatically to localStorage
- Persistent: Notes persist across sessions
- YAML Export/Import: Save timing and notes together
- Config Files: Reuse configurations across presentations
- Easy Sharing: Share timing plans with collaborators
- Drag & Drop Upload: Drag PDF files directly onto the app to load them
- Navigation Buttons: On-screen buttons for mouse/touch navigation (โฎ๏ธ
โ๏ธ โถ๏ธ โญ๏ธ) - Keyboard Navigation: Full keyboard control (arrows, space, home, end)
- Responsive Design: Fully optimized for mobile, tablet, and desktop
- Persistent State: Presentations automatically restore after page reload
- Progress Tracking: Visual progress bar with slide counter
- Boundary Protection: Can't navigate beyond first/last slide
- Clear All Data: One-click button to reset all data and start fresh
- Installable: Install as desktop/mobile app
- Offline Support: Works without internet connection
- Service Worker: Caches assets for fast loading
- No Tracking: Zero analytics or external connections
- Fully Static: No backend server required
- Local Storage: All data stays on your device
- No External CDNs: All dependencies bundled
Option A: Click to Upload
- Click "๐ Load PDF" button in the top toolbar
- Select your PDF file from the dialog
- Wait for slides to render (progress indicator shows status)
Option B: Drag & Drop (Recommended)
- Drag your PDF file from your file explorer
- Drop it onto the slide preview area (highlighted in blue when dragging)
- Watch as the app processes your slides with a progress bar
Note: Your presentation will automatically persist across page reloads, so you can close and reopen your browser without losing your slides.
- Click "Auto-fill" button
- Enter total presentation duration (e.g., 30 minutes)
- System automatically distributes timing evenly
- Navigate to key slides (section starts, transitions)
- For each key slide, enter target time in the Target input field
- Other slides auto-calculate between milestones
- Indicators: ๐ = Milestone (you set), ๐ = Auto-calculated
Example:
Slide 1: 0 min ๐ (you set)
Slide 2: 2 min ๐ (auto)
Slide 3: 5 min ๐ (auto)
Slide 4: 10 min ๐ (you set)
Slide 5: 15 min ๐ (auto)
- Click "๐พ Save" button
- Downloads YAML file with timing and notes
- Reuse later with "๐ Config" button
Need to start fresh? Click "๐๏ธ Clear All" to remove:
- All slides
- Speaker notes
- Timing configuration
- Persistent state
- Click "๐ฅ Audience" button
- Move window to second screen/projector
- Press
Ffor fullscreen
- Click "Start" button to begin timer
- Navigate slides using either:
- Keyboard:
โorSpace(Next),โ(Previous),Home(First),End(Last) - On-Screen Buttons: โฎ๏ธ (First),
โ๏ธ Prev, Nextโถ๏ธ , โญ๏ธ (Last) - Timing Overview: Click any slide in the sidebar to jump directly to it
- Keyboard:
โ ๏ธ Slow down! - More than 2 min ahead (orange)- โ Ahead of schedule - 0.5-2 min ahead (green)
- โ On schedule - Within ยฑ0.5 min (yellow)
- โ Behind schedule - More than 0.5 min behind (red)
- Click "Pause" during presentation
- Returns to edit mode but keeps elapsed time
- Adjust target times if needed
- Click "Resume" to continue from where you paused
- Or "Stop" to reset timer to 0
- Click in notes area below slide
- Type your notes (auto-saves as you type)
- Notes persist across sessions
| Key | Action |
|---|---|
โ or Space |
Next slide |
โ |
Previous slide |
Home |
First slide |
End |
Last slide |
? |
Show keyboard shortcuts |
| Key | Action |
|---|---|
F |
Toggle fullscreen |
- Timer at 0
- Can edit target times
- Available: Auto-fill, Clear All (if times set), Start
- Timer running
- Target times locked
- Shows: Elapsed, Target, Remaining, Pacing
- Available: Pause
- Timer paused at current time
- Can edit target times (fine-tune on the fly!)
- Shows: Elapsed time preserved
- Available: Auto-fill, Clear All, Resume, Stop
- Check file size (very large PDFs may take time)
- Ensure file is a valid PDF
- Try drag & drop instead of file dialog
- Check browser console for errors
- Check if IndexedDB is enabled in your browser
- Ensure you're not in private/incognito mode
- Try clicking "๐พ Save" to export configuration as backup
- Ensure both windows are from same origin
- Check that BroadcastChannel is supported
- Refresh both windows
- Set target times for at least 2 slides
- Ensure times increase sequentially
- Use Auto-fill for quick setup
- IndexedDB is used for large data
- Click "๐๏ธ Clear All" to free up space
- Check available storage in DevTools
- App is fully responsive and should work on all devices
- Use on-screen navigation buttons instead of keyboard
- Rotate to landscape for better slide visibility
- Built with SvelteKit
- PDF rendering by PDF.js
- Styled with Tailwind CSS