Neutralino.init() establishes an internal WebSocket asynchronously.
Calling storage.getData() before the "ready" event fires could stall
silently, meaning init() never reached connect(). Also, "ready" can
fire before DOMContentLoaded, so DOM refs would be null.
Fix: wait for both "ready" AND DOMContentLoaded before calling init(),
guaranteeing native APIs and DOM are both available.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lightweight alternative to the Electron build (~5MB vs ~300MB).
Uses system webview (WebKit2GTK on Linux, WKWebView on macOS,
WebView2 on Windows). Same UI and feature set as the Electron build:
WebSocket audio client, volume control, host/port settings, tray icon,
hide-to-tray on close, CLI args (--host, --port, --volume).
Note: Linux requires libwebkit2gtk-4.0 or libwebkit2gtk-4.1.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>