v0.2.1
Latest
March 2026
New Features
- requireString() / requireFiniteNumber() validators in IPC handler layer — applied to DB_SET_SETTING and DB_SAVE_WATCH for input safety
- Discord reconnection backoff — 15-second cooldown between connection attempts prevents rapid retry spam
- PIP param validation — openPipWindow throws on empty channelUrl; channelName falls back to "PIP"
- <ErrorBoundary> component — class-based React boundary with retry button, wrapping all six page routes and the PIP player
- Error boundary CSS (.error-boundary-*) in App.css
Improvements
- IPC (main process) — Removed unused secureFetch() dead code; PLAYLIST_LOAD_URL now uses gzip-aware secureFetchText()
- Scheduler — doRefresh() protected by a 60-second timeout guard to prevent stalling
- Discord RPC — sendPacket checks socket.destroyed before writing; catches write errors and resets state
- PIP window — closePipWindow() no longer double-nulls; cleanup deferred to the 'closed' event handler
- Watch history DB — saveWatchSession runs inside a transaction and auto-prunes rows beyond 500
- Store (Zustand) — Fire-and-forget calls in initFromDb now have .catch() guards
- Player page — All async fire-and-forget calls wrapped with .catch() to prevent unhandled-rejection noise
Bug Fixes
- PLAYLIST_LOAD_URL previously bypassed gzip decompression — now consistent with all other fetch paths