Replace static earth texture with tile-based rendering from CDN.
Tiles load progressively (zoom 1→2→3 base), then dynamically
load zoom 4-6 as user zooms in. Mercator→equirectangular
reprojection via strip-based canvas compositing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Search API: read title/subtitle/url from _source.page (nested)
- Channel click: extract correct ID from URL (last segment)
- Replace earth texture with higher-res 4096x2048 original
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
NASA's image server blocks cross-origin requests. Downloaded the
3600x1800 Black Marble texture and serve it from web/public/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Set renderer pixel ratio to window.devicePixelRatio for crisp
rendering on Retina/HiDPI displays (was defaulting to 1)
- Upgraded Earth texture from low-res three-globe example (~2K)
to NASA Black Marble 3600x1800 for sharp detail when zooming
- Added pointResolution(6) for cleaner point geometry
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
pointRadius was recalculated on every controls change event (including
rotation frames), causing 50k+ points to re-render each frame.
Now only triggers when altitude changes >5%, keeping rotation smooth.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SSE handler now distinguishes per-guild events (single NowPlaying)
from snapshots (Record<string, NowPlaying>) to prevent state corruption
- Theme selector moved left (right: 72px) to not overlap favorites button
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Points now shrink proportionally when zooming in, preventing
overlap in dense areas and making individual stations clickable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 5 themes: Sunset (default), Midnight, Forest, Ocean, Cherry
- Theme selector dots in top-right corner, persisted to localStorage
- Globe accent colors (points, atmosphere) update with theme
- Globe pauses auto-rotation for 5s on any interaction (click, drag, scroll)
- All radio CSS vars scoped to .radio-container[data-theme]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Server: inlineVolume on AudioResource, POST /api/radio/volume endpoint
- Volume persisted per guild, broadcast via SSE to all clients
- Frontend: volume slider in bottom bar with debounced API calls
- Volume icon changes based on level (muted/low/normal)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rotation continued while browsing stations, making selection impossible.
Now stops immediately when clicking any radio point.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Radio Garden API Client (30K+ Orte, Sender-Suche, Stream-URL Auflösung)
- Discord Voice Streaming via ffmpeg (PCM Pipeline)
- Interactive 3D Globe (globe.gl) mit allen Radiosender-Standorten
- Sender-Panel mit Play/Stop/Favoriten
- Live-Suche nach Sendern und Städten
- Now-Playing Bar mit Equalizer-Animation
- Guild/Voice-Channel Auswahl
- SSE Broadcasting für Live-Updates
- Favoriten-System mit Persistenz
- Responsive Design (Mobile/Tablet/Desktop)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>