Releases: aawc/LocalJam
Release list
LocalJam v2026.09.127
LocalJam v2026.09.127
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.127
- 📦 Repository Commit: 7b8c5d386c2c6a7775617836f6fef46631fc500e
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
LocalJam v2026.09.126
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.126
- 📦 Repository Commit: 1ce2afec7376bae3c55d645930ad3b897717d9d7
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
LocalJam v2026.09.125
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.125
- 📦 Repository Commit: 43d9bf0e5a9cc9f296809a779c33661e18485777
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
LocalJam v2026.09.124
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.124
- 📦 Repository Commit: 0d9fbf8d0f37f43692f81b49169832670df09f5b
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
LocalJam v2026.09.123
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.123
- 📦 Repository Commit: 7831eaa1239e5211224e47d268d941bf1939c3d6
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
LocalJam v2026.09.122
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.122
- 📦 Repository Commit: fcaee322d990b98ac632a1f137bb6896fb970ba7
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
LocalJam v2026.09.121
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.121
- 📦 Repository Commit: 10066f67e94854d3a80cc608f60e8de5c710cef5
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.matchMedialisteners were anonymously bound and not cached; fixed by retaining explicit function references to allow properremoveEventListenercleanup 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
LocalJam v2026.09.120
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.120
- 📦 Repository Commit: aabadd964c8c40cd22085da58d8ed55cadffa632
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
LocalJam v2026.09.119
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.119
- 📦 Repository Commit: ae53eb2ab7191b83f6d77127071a51fb1711062b
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
LocalJam v2026.09.118
Live Deployment & App Access
- 🌐 Web App: https://varun.khaneja.org/LocalJam/
- 🏷️ Release Tag: v2026.09.118
- 📦 Repository Commit: 9f77072318cecf635d8462c6e127788677428647
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.