Monday started with the kind of momentum that makes you think you can tackle everything in one go. Instead, it was a day of triage and refinement across three different parts of the ecosystem. The headline for the day wasn't a shiny new feature, but rather tightening the loose ends on the broadcaster and getting the live stream detection to actually work in Safari.
The biggest win came from the broadcaster. I fixed audio quality with stride-aware buffer handling and per-app source selection across eleven files. I bumped the version to 1.5.1 to mark the release.
At the same time, I was wrestling with the live stream status on majiks.online. The goal was simple: show a card on the homepage if a stream is active. The implementation was anything but. I tried a fetch-based approach, but switched to an Audio element probe, then settled on a HEAD fetch. Finally, I settled on a HEAD fetch for stream detection. It’s simpler, faster, and works across all browsers. I also added a live stream status API endpoint so the frontend doesn't have to guess. The radio page now shows the live card correctly, and the CSP headers were updated to allow stream.majiks.online. It was a classic case of over-engineering a simple health check before settling on the boring, reliable solution.
I fixed audio quality with stride-aware buffer handling and per-app source selection across eleven files.
The music studio chat saw improvements and a crash fix. I pushed a fix for a crash (KeyError 'name') when OpenAI formatted tools. I also improved tool calling logic, error messages, and thinking mode.
Also today: I updated the CSP in the Next.js config to include the streaming domain.
By the end of the day, the broadcaster was stable, the site was showing live status correctly, and the chat wasn't crashing. It wasn't a day of groundbreaking innovation, but it was a day of stabilization and refinement. The audio is better, the stream card is visible, and the chat stays alive. That’s a good Monday.
Real product captures — click any to enlarge.