Auto-retries on TTS_BUSY (2s/4s/6s backoff) so pre-warm race at
startup is transparent to the user.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
If API key present, GET /feed/media from Brain API to collect user's
custom sources, then POST to Feed API with customFeeds array.
Falls back to default GET if no key or fetch fails.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace Canvas wave with CSS div bars + sparkle animation (Daily style)
- Add radial glow behind waveform + particle burst around play button
- Play button: Daily style (glow, inset highlight, pulse ring when playing)
- Move skip-back/forward next to play button (horizontal row)
- Remove separate controls bar
- Move speed selector into settings panel
- Add VOICEVOX speaker selector in settings panel (ずんだもん/春日部つむぎ/四国めたん)
- Article list: show publishedAt time ago next to source
- Article list: external-link icon button on right (opens URL in new tab)
- stopPropagation on link button so tap doesn't trigger playback jump
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move article title/source/meta OUT of player into .brief-now-playing section at top
- .brief-player now contains only wave canvas + play button (prevents overflow issue)
- Increase font sizes: title 18→20px, list 13→14px, top bar 13→14px
- Add HTML escaping (esc()) in renderList to prevent XSS/broken layout
- Fix skip() to use articles.length (not speechQueue.length) for bounds
- Guard updateListHighlight against null querySelector results
- Remove defer from inline script (ignored for inline scripts, was misleading)
- Add border-top to brief-list for clear visual separation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>