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>
Use explicit path to neu CLI binary instead of relying on .bin/
shim resolution, which fails when the shell PATH doesn't include
node_modules/.bin/ — same fix applied to the Electron build.
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>