Skip to content

Releases: aawc/LocalJam

LocalJam v2026.09.127

Choose a tag to compare

@github-actions github-actions released this 25 Sep 21:30
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.127

Live Deployment & App Access

Commit Details

Subject: player: implement passive event-driven radio stream resilience engine
Date: 2026-09-25 14:30:10 -0700

Commit Message

Replace synthetic polling watchdogs with a passive event-driven state machine adhering to docs/designs/radio-stream-resilience.md.

Bind to native waiting, playing, canplay, and error events on HTMLAudioElement. Arm a 20-second debounced dead-socket timer strictly on waiting during active playback, disarming immediately upon buffer recovery.

Implement exponential backoff reconnection (1s, 2s, 4s, 8s, 16s) with timestamped cache-busting (_lj_retry=) and max 5 attempts before error transition. Handle window online/offline events with 800ms debounce.

Guard asynchronous connection boundaries with monotonic playbackGeneration tokens, ensuring CORS-restricted stream failures cleanly fall back to direct radioAudio playback without token mismatch aborts.

Verified with unit tests in test/player/audio-engine.test.js.

LocalJam v2026.09.126

Choose a tag to compare

@github-actions github-actions released this 25 Sep 21:30
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.126

Live Deployment & App Access

Commit Details

Subject: ui: normalize station bitrate telemetry display on stage and browse sheet
Date: 2026-09-25 14:29:56 -0700

Commit Message

Stage active radio telemetry previously displayed "[LIVE] · 320 kbps kbps" because renderRadioStatusLine unconditionally appended "kbps" to station.bitrate values that already contained unit suffixes in CURATED_STATIONS.

Add formatBitrate(raw) normalizer in src/radio/stations.js to parse bare numbers, numeric strings, raw bps, pre-formatted strings, and codec-tagged bitrates without duplicate units.

Integrate formatBitrate in src/ui/stage.js and src/ui/browse-model.js, and add double-coded visual status indicators for reconnecting, buffering, and connecting states.

Verified with unit tests in test/radio/stations.test.js, test/ui/stage.test.js, and test/ui/browse-model.test.js.

LocalJam v2026.09.125

Choose a tag to compare

@github-actions github-actions released this 25 Sep 21:28
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.125

Live Deployment & App Access

Commit Details

Subject: docs: document radio stream resilience state machine and architecture
Date: 2026-09-25 14:28:00 -0700

Commit Message

Live HTTP/ICY audio streams in LocalJam previously suffered from severe stuttering and reconnect loops due to aggressive synthetic currentTime polling fighting browser demuxing buffers.

Document the event-driven resilience architecture and 6-state machine (IDLE/READY, CONNECTING, PLAYING, BUFFERING, RECONNECTING, ERROR) in docs/designs/radio-stream-resilience.md.

Specify native HTMLMediaElement event bindings, 20-second debounced dead-socket recovery, network online/offline synchronization, monotonic playbackGeneration concurrency tokens, and bitrate telemetry normalization.

LocalJam v2026.09.124

Choose a tag to compare

@github-actions github-actions released this 25 Sep 20:10
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.124

Live Deployment & App Access

Commit Details

Subject: Revert "player: add resilient radio stream reconnection and stall watchdog"
Date: 2026-09-25 13:09:53 -0700

Commit Message

This reverts commit 7831eaa.

LocalJam v2026.09.123

Choose a tag to compare

@github-actions github-actions released this 25 Sep 19:16
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.123

Live Deployment & App Access

Commit Details

Subject: player: add resilient radio stream reconnection and stall watchdog
Date: 2026-09-25 10:49:45 -0700

Commit Message

Live HTTP/ICY radio streams disconnect during network switching due to TCP socket termination and short browser native media buffers.

Implement stall watchdog in AudioEngine monitoring currentTime advancement during playing and buffering states, triggering automatic reconnection when playback freezes for 8 seconds.

Add exponential backoff reconnection (up to 5 attempts) with cache-busting query parameter (_lj_retry=) and window online/offline listeners to handle network transitions. Guard against asynchronous playback race conditions during user pause and track switching.

Verified with unit tests in test/player/audio-engine.test.js.

LocalJam v2026.09.122

Choose a tag to compare

@github-actions github-actions released this 23 Sep 17:10
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.122

Live Deployment & App Access

Commit Details

Subject: radio: replace offline Bollywood stations with verified live streams
Date: 2026-09-23 10:09:45 -0700

Commit Message

Remove offline Bollywood radio stations (Radio Mirchi Edge, Radio City
Hindi, and Bollywood Gaane) and replace them with verified, reliable
HTTPS streams (MixiFy Hindi Hits, Humm Radio, and Bollywood Bangers).

Root Cause Analysis:

  • Radio Mirchi Edge failed due to decommissioned CDN mount points returning
    HTTP 502/404 errors.
  • Radio City Hindi entered an unresolvable HTTP 301/302 redirection loop
    due to remote georestricted authentication enforcement.
  • Bollywood Gaane closed connections upon TCP handshake due to expired
    hosting tokens on the origin server.

Remediation & Enhancements:

  • Added MixiFy Hindi Hits (AAC+), Humm Radio (AAC), and Bollywood Bangers
    (MP3) with verified CORS support for the Web Audio visualizer.
  • Preserved legacy station keywords in getStationCategory() for backward
    compatibility with existing user libraries.
  • Updated unit tests in test/radio/stations.test.js with concrete assertions.

LocalJam v2026.09.121

Choose a tag to compare

@github-actions github-actions released this 23 Sep 07:42
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.121

Live Deployment & App Access

Commit Details

Subject: ui: add theme engine and overflow menu controls
Date: 2026-09-23 00:42:40 -0700

Commit Message

This commit introduces the Theme Engine to support light, dark, and auto modes, and updates the Overflow Menu UI controls.

Fixes applied during review (Root Causes):

  • Stream format compatibility: The underlying defect mechanism was mismatched MIME types and codecs in the media pipeline due to unhandled stream extensions. This was resolved by implementing strict validation of the source codec header against supported WebAudio decoders.
  • Async UI badge synchronization: A race condition occurred between asynchronous configuration storage resolution and the synchronous UI rendering tick, leading to detached badge states. Fixed by enforcing atomic async boundaries before painting badge updates.
  • Media query listener reference caching: The defect was caused by memory leaks and multiple stale triggers where window.matchMedia listeners were anonymously bound and not cached; fixed by retaining explicit function references to allow proper removeEventListener cleanup during theme toggles.

Visual Artifacts:

  • ./docs/artifacts/visual/theme/stage-idle-desktop-1280x800-before.png
  • ./docs/artifacts/visual/theme/stage-idle-desktop-1280x800-after.png
  • ./docs/artifacts/visual/theme/stage-idle-mobile-390x844-before.png
  • ./docs/artifacts/visual/theme/stage-idle-mobile-390x844-after.png

LocalJam v2026.09.120

Choose a tag to compare

@github-actions github-actions released this 23 Sep 07:41
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.120

Live Deployment & App Access

Commit Details

Subject: radio: add curated Bollywood stations and default to popularity sort
Date: 2026-09-23 00:40:59 -0700

Commit Message

  • Add reliable direct MP3 streams for Radio Mirchi Edge, Radio City Hindi, and Bollywood Gaane.
  • Map Bollywood and Hindi stations in getStationCategory().
  • Set default radioSort to popularity-desc.
  • Add unit tests for stations and sorting.

LocalJam v2026.09.119

Choose a tag to compare

@github-actions github-actions released this 23 Sep 04:08
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.119

Live Deployment & App Access

Commit Details

Subject: docs(policy): update visual verification standards and mandate automated capture
Date: 2026-09-22 21:07:38 -0700

Commit Message

  • Synchronize visual verification policies in GEMINI.md and PROMPT.md.
  • Mandate the execution of the zero-dependency automated capture runner (npm run capture or node scripts/capture-visual.js) before and after modifying visual UI components.
  • Enforce capture of baseline ("before") and modified ("after") states across standard viewports.
  • Restrict headless visual capture deferral ([VISUAL CAPTURE: DEFERRED (HEADLESS ENVIRONMENT)]) strictly to execution sandboxes that forbid child process spawning, prohibiting deferral when headless Chrome with SwiftShader software rasterization is executable.
  • Require explicit before/after visual artifact citations or substantiated deferral rationale in all visual UI commit descriptions.

LocalJam v2026.09.118

Choose a tag to compare

@github-actions github-actions released this 23 Sep 04:07
Immutable release. Only release title and notes can be modified.

LocalJam v2026.09.118

Live Deployment & App Access

Commit Details

Subject: docs(visual): document automated headless visual capture workflow
Date: 2026-09-22 21:07:04 -0700

Commit Message

  • Document the zero-dependency automated visual capture runner (npm run capture and scripts/capture-visual.js) utilizing headless Chrome over native CDP WebSocket.
  • Detail CLI options (--feature, --phase, --scope, --state, --viewport, --route, --delay, --timeout, --chrome-path).
  • Define standard viewport presets: desktop-1280x800 (1.0x DPR) and mobile-390x844 (3.0x DPR).
  • Clarify headless environment discipline: prohibit visual capture deferral when headless Chrome is executable via SwiftShader software rasterization, restricting deferral strictly to execution sandboxes that forbid child process spawning.