Extract a hue-distinct secondary color from album art and apply a
primary→secondary gradient across the VU meter bars (bass end = primary,
treble end = secondary). Falls back to complementary hue if no distinct
color is found.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Pre-compute star RGB components to avoid 3 string.replace() calls per
star per frame (~40K string allocs/sec eliminated)
- Cache floor gradient object; rebuild only on canvas resize
- Batch CAVA bar DOM updates through requestAnimationFrame so SSE events
never trigger mid-frame style mutations
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fetch() from file:// was blocked by missing Access-Control-Allow-Origin
on the music-light server. Both color and album art now work.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Avoids WebEngine mixed-content block on http:// img src from file://.
music-light now saves the PIL image to disk on each track change.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
img src http:// from file:// page is blocked; fetch() to localhost
works, so fetch the blob and use a blob: URL instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CSS background-image url() from http:// is blocked in WebEngine local
context even when fetch() works; <img src> does not have this restriction.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
WebEngine blocks fetching external Spotify URLs from local content.
Now uses http://127.0.0.1:8765/art which proxies the image locally.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Direct background-image URLs to external hosts are blocked in the
local WebEngineView context; fetch the image as a blob and convert
to data URL instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fetches art_url from music-light /current and displays it as a
background-image div with themed box-shadow. Fades in/out with music.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Meteors now dissolve as they approach the horizon line (fade from
50% to 60% viewport height) via CSS mask-image on their container.
Also fixed spawnMeteor appending to #meteorLayer instead of .scene.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Horizon flashes brighter on each beat (synced with character bounce)
- Spectrum visualizer behind the character shows mid/high frequencies
- Meteors streak across the sky randomly every 4-10s
- fetchTheme() pulls dominant color from music-light and tints horizon
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Detects bass beats from CAVA data using a fast/slow EMA ratio.
On each beat, applies a CSS scale+translateY animation to .beat-wrap
without interfering with the APNG playback or positioning.
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>
- Paused/stopped playerctl treated as no music (QML change)
- Character and notes only appear when Playing
- VU meter always visible but in rest state (3px, faint) when idle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove dead EQ bar code referencing elements removed with the CSS robot.
Preload all APNG files on startup so skeleton switches are instant.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Swaps DANCEBOT-9000 CSS robot for a pool of APNG characters that cycle
randomly every 8s and on track change: 4 skeleton GIFs, a dancing baby
(YouTube clip), and Pepe. Background removal done with ffmpeg colorkey.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Draws vertical lines radiating from a true central vanishing point
and horizontal lines with perspective-correct spacing — giving the
classic retrowave convergence effect instead of parallel lines viewed
from above. Horizon glow line restored above the canvas layer.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Scale floor perspective with viewport height so grid reaches horizon
on full-screen KDE (was broken with fixed 700px perspective value)
- Increase grid line thickness 1px → 2px to reduce sub-pixel flickering
- Remove DANCEBOT-9000 title text
- Add viewport meta tag for correct layout in WebEngineView
- Add dev-server.sh (port 3000) with in-browser music ticker shim
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>