pkill pattern was wrong (path has dancingcharacter not skeledance).
Now uses a lockfile to prevent QML from spawning multiple instances.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
DataSource fork+exec was limited to ~1fps. Now cava pipes into a Python
SSE server (port 5555) and the HTML connects directly via EventSource,
getting updates at up to 60fps without QML overhead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CAVA runs in background via cava-start.sh, writing bar values to
/tmp/skeledance_bars. A new QML DataSource polls that file at 80ms
and calls updateBars() in JS. Falls back to rest state when not playing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>