PWA Player
The PWA (Progressive Web App) is the rendering engine that powers all xiboplayer platforms. It can also run standalone in any modern browser.
Features
- Runs anywhere — Chrome, Firefox, Edge, or any Chromium-based browser
- Offline-first — Service Worker caches all media for offline playback
- All widget types — video (MP4, HLS), images, PDF, text/tickers, web pages, clock, calendar
- Interactive actions — touch/click triggers, keyboard navigation, layout jumps
- Proof of play — per-layout and per-widget duration tracking
- Zero install — just open a URL
Deployment
The PWA must be served from the same origin as the CMS (same-origin policy for API calls). Two options:
Option A: Deploy to CMS container
# Build from source
git clone https://github.com/xibo-players/xiboplayer.git
cd xiboplayer && pnpm install
pnpm --filter @xiboplayer/pwa build
# Copy to CMS web root
podman cp packages/pwa/dist/. xibo-cms-web:/var/www/cms/web/chromeos/
Access at: https://your-cms.example.com/player/
Option B: Via Ansible
ansible-playbook playbooks/services/deploy-pwa.yml -e target_host=h1.example.com
Option C: Electron / Chromium wrapper
The Electron and Chromium players serve the PWA via a built-in Express proxy, avoiding the same-origin constraint. This is the recommended approach for kiosk deployments.
Keyboard shortcuts
| Key | Action |
|---|---|
D | Toggle download overlay (shows download progress) |
T | Toggle timeline overlay (shows schedule) |
S | Toggle setup overlay (CMS configuration) |
How it works with Electron / Chromium
Player wrapper
└── Express proxy (localhost:8765)
├── /player/ → serves PWA dist files
├── /xmds-proxy → forwards SOAP to CMS
├── /api/* → forwards REST to CMS
└── /store/* → ContentStore filesystem
↓
PWA loads from localhost
Service Worker caches everything
Offline playback from local store
Limitations (standalone browser mode)
- Same-origin required — must be hosted on CMS domain
- No kiosk mode — browser controls remain visible
- No GPU detection — uses browser defaults
- No system integration — no auto-start, no power management
- Storage limits — browser storage quotas apply (typically 50% of disk)
For production kiosk deployments, use the Electron or Chromium wrapper instead.
Source
- GitHub: xibo-players/xiboplayer (
packages/pwa/) - npm: @xiboplayer/pwa
