Chromium evaluates the Fetch API's cache mode before the disk cache
storage decision; XHR request headers and onHeadersReceived patches do
not reliably prevent storage. The old approach silently allowed caching
regardless of the setting.
Moving cache suppression to a custom hls.js NoCacheLoader (Fetch with
cache: 'no-store') also eliminates the CORS preflight that Cache-Control
as a request header was triggering, which lets the main-process CORS
handler drop the applyNoStore branch entirely.
File logging defaulted to always-on meant the log grew silently on every
run with no way to turn it off. Changing the default to error-only and
exposing the toggle in Settings lets users opt in only when debugging.
The logout button previously triggered immediately without warning, making
accidental logouts unrecoverable without re-running the device code flow.
A confirmation step (Ja/Nein, gamepad-navigable) prevents that.
Bug reports from Steam Deck (Flatpak) arrived without any useful context:
no terminal, no log file, no trace of what failed. Silent catches in
helixClient hid quota and token errors entirely. IPC handler exceptions
reached the renderer as rejected promises with no server-side record.
electron-log now writes to a rotating log file (~1 MB, 5 files) that
users can attach to bug reports. All IPC handlers are wrapped in
safeHandle, which logs and re-throws at the boundary. Optional-feature
failures (chapters, profile images, viewer counts) emit log.warn with
enough context to diagnose. A React ErrorBoundary catches render crashes
app-wide and logs them before showing a reload prompt.
German inline comments alongside English identifiers create a language
mismatch that makes the code harder to read for anyone not fluent in
German. All 28 affected comments across 14 files are now in English,
consistent with the rest of the project's written artifacts.
Playback errors in the global overlay (direct-start from Browse/Category/
StreamList screens) were silently discarded — the stream disappeared with
no user feedback. Now shows an error overlay with the streamlink message
and a dismiss hint; hls.js fatal errors use the same path.
Chromium computes disk-cache-size dynamically from free disk space, so
the value differs between runs. The cache index then contains a size that
no longer matches, producing "Invalid cache (current) size" on shutdown.
A fixed 500 MB cap keeps the value stable across restarts.
The cache classification thresholds (500 MB / 1 GB) were designed for an
uncapped cache. With a fixed 500 MB limit, the cache can never enter those
states, leaving dead UI states and unused logic behind.
Chromium's HTTP disk cache accumulates HLS segments indefinitely on
Steam Deck — single-use segments have ~0% cache-hit rate but cause
unbounded SSD writes and disk growth. This wires up a runtime toggle
(default: cache disabled) so the user can control the behaviour without
restarting the app.
- Introduce src/main/prefs/hlsCachePref.ts as a shared mutable so
index.ts and handlers.ts don't form a circular import
- Restructure onHeadersReceived in setupTwitchCors: CORS-bypass and
no-store now run as independent blocks; no-store fires only for HLS
extensions (.m3u8/.ts/.m4s/.aac, path before ?) when the toggle is off
- Add IPC handlers app:get-cache-size, app:clear-cache,
app:set-hls-cache-enabled; wire through preload bridge and t4sd.d.ts
- Extend SettingsContext with hlsCacheEnabled (default false); push
persisted value to main on mount and on every change
- Add "Speicher" section to SettingsScreen with HLS toggle row and
cache-size display + clear button; gamepad-navigable
On Linux, the primary display resolution is queried and the window is maximized on startup. This ensures a fullscreen experience both on the Steam Deck display and on external monitors/TVs when docked.
Windows/dev behavior unchanged.