Features
Audio Sources (Radios)
See the Audio Sources reference for technical details (architecture, commands, throttling, modes).
KHInsider Radio
Play game music from KHInsider playlists via a hidden Electron window.
Commands: play, pause, next, shuffle, volume, get_state, activate, deactivate, diagnostic
- Persistent shuffle until manually disabled
- Watchdog/retry every 5s, stale after 15s
- Position updates throttled to 3s during stable playback
SMTC (System Media Transport Controls)
Read metadata from the active system media player (Spotify, YouTube Music, Tidal…) without OAuth - with direct play/pause/next controls. It is the only external playback source since ADR-012.
Commands: start_monitoring, stop_monitoring, get_state, play, pause, next, previous
- 1000ms polling, suspended when app is inactive or system is sleeping
- OS-specific implementation (Windows WinRT native via C++/NAPI, Linux MPRIS).
- Maintainability: SMTC handler utilized factory patterns and refined enumeration logic (SonarCloud optimized).
- Radio Overlay: one overlay for every music source. Music picks which player feeds it (KHInsider or the system player) and every theme is available on it.
- Multi-session aware (Windows): enumerates every active media session via
GlobalSystemMediaTransportControlsSessionManager.GetSessions()and auto-prefers Spotify when present, so the desktop app is detected even when Windows promotes a browser tab to "current". KHInsider also surfaces here because the hidden window pushesnavigator.mediaSessionmetadata.
Timer
Source of truth in the main process (prevents drift between dashboard and overlays).
Commands: start, stop, reset, get_state
- State persisted in local SQLite
- Heartbeats throttled to 5s (except on timer end or manual seek)
- Simultaneous sync: dashboard (IPC) + overlays (WS)
Twitch
Commands: connect, disconnect, status, get_profile
- OAuth PKCE authentication with local callback on
127.0.0.1:47285 - Access to streamer profile and live status - see the Profile page
Twitch Alerts
Highly customizable alerts for follows, subs, raids, and cheers. Build them visually in the Alerts Creator and manage their images in the Assets Manager.
- Shiny Effects: 20% probability of a "shiny" alert with chromatic aberration, radial rays, and unique sound effects.
- Dynamic Assets: Automatic asset resolution via
STREAMOOS_MANIFESTwith cache-busting. - Priority Queue: Alerts are queued and played based on priority (Raid > Sub > Follow).
Stream Planning
Schedule and manage your Twitch streams directly from the StreamooS dashboard. Segments sync bidirectionally with the Twitch Schedule API.
Commands: planning:sync, planning:get_weeks, planning:create, planning:update, planning:delete, twitch:search_categories
- 9-week calendar view (4 past + current + 4 future)
- Create, update, and delete stream segments with title, category, duration, and timezone
- Recurring weekly streams support
- Conflict detection between local and Twitch-side changes
- Category search with Twitch Helix API integration
Discord Rich Presence
Commands: connect, disconnect, status
- Automatically updated from KHInsider metadata
- Progress timestamps based on app uptime
- Lazy-loaded
discord-rpc
Mobile Remote
PWA accessible on the local network via HTTPS (port 8080) with PIN pairing. See Mobile Remote Setup.
Custom Overlays
StreamooS supports user-created overlays alongside the built-in ones.
- Add: import a custom HTML overlay via the dashboard
- List: view all custom overlays
- Remove: delete a custom overlay
- Open: launch a custom overlay in an external window
Custom overlays connect to the same ws://127.0.0.1:8765 endpoint and receive all feature updates.
System Tray
StreamooS runs in the background via a system tray icon.
- Hide to tray on close: Closing the dashboard window hides it to the system tray instead of quitting; a one-shot notification ("StreamooS is running in the background") explains this on first close.
- Status Indicators: Visual feedback for WebSocket and Remote Control connectivity.
- Quick Actions: Access to dashboard and application quit.
- Now Playing: Displays the current track metadata directly in the tray menu.
- Localized: Menu items in French, English, and German via the main-process i18n loader; the tray refreshes automatically when the user switches language.
- Graceful shutdown: Single instance lock + per-handler 5s timeout in
HandlerRegistry.shutdownAll()ensures every feature (KHInsider window, Twitch EventSub, Remote PWA, WS server, mDNS) is cleanly stopped - ports 8765 / 8080 / 8766 are released immediately so a relaunch never hitsEADDRINUSE.
Internationalization (i18n)
Languages: French (default), English, German Automatic detection via the browser with user preference persistence.
Overlay Themes
The Music overlay (KHInsider and the system player behind one page) and the Timer overlay each support multiple visual themes, configurable from the dashboard or with the set_overlay_config WebSocket command.
| Overlay | Available Themes |
|---|---|
| Music | streamoos (default), animal-crossing, retro-rpg, modern-gamer, ghibli, xp, glass, noisy, minimal-dark |
| Timer | streamoos (default), minimal-dark |
Overlays also support configurable position (9 anchor points: top-left, top-center, top-right, middle-left, center, middle-right, bottom-left, bottom-center, bottom-right) and toggles for album art, cover, and progress bar visibility.
Security & Performance
| Mechanism | Detail |
|---|---|
| Sandboxing | All Electron windows sandboxed (contextIsolation: true) |
| IPC Origin Verification | Strict validation of protocol, host, and port for all inbound IPC |
| IPC Payload Validation | Zod-backed schemas for all telemetry and state update IPC channels |
| CSWH Protection | WS server validates Origin header (strict allowlist) |
| Targeted Broadcasting | WebSocket server broadcasts only to features the client is subscribed to |
| XSS Sanitization | textContent / createElement - never innerHTML in overlays |
| Throttling | Timer 5s · SMTC 3s · KHInsider 3s |
| Centralized URL Security | Unified protocol/domain allowlist and path-traversal guards for all navigations |
| Navigation Lockdown | Dashboard restricted to the renderer's local URL |
| Lazy Loading | Discord RPC instantiated on demand only |
| Runtime Validation | All IPC/WS commands validated by Zod schemas |
| Remote Security | HTTPS (TLS) + dynamic JWT (safeStorage) |
| Tokens | safeStorage only - never plaintext in SQLite |
| E2E Stability | Standardized data-testid selectors to bypass hydration/localization flakiness |
