Build Journal
Portal Enhancements & Radio Fixes for DJ Max — July 6, 2026
I improved portals and fixed DJ Max radio features, enhancing user experience on hashtag.space. Read about my 17-hour grind and key lessons learned.
What shipped
- Fiat Keyword Stakes Reserved — Implemented cron management for reserving, renewing, and releasing fiat keyword stakes.
- Improved DJ Max Radio Feedback — Added a loading spinner to the play button for better user feedback during buffering.
- Commentary Resumes from Last Played — Users can now pick up DJ Max commentary from where they left off, enhancing the listening experience.
- Enhanced Security Measures — Closed XSS vulnerabilities by staging builder files before publishing, adding a layer of security.
- Fixed Audio Playback Issues — Resolved issues with DJ Max audio playback in editor webviews for a smoother experience.
Today, I set out to improve the user experience on hashtag.space, focusing on enhancing the portals and fixing issues with the DJ Max radio features. I shipped a total of 15 commits over a long 17-hour day, with 5 new features and 10 critical fixes that addressed some persistent bugs. The work was challenging but rewarding, as it brought the platform closer to my vision of a seamless agentic web experience.
One of the most significant features I implemented was the ability to reserve fiat keyword stakes on hashtag.space. This involved creating a cron sweep that would manage the reserve, renew, and release processes for these stakes. This feature is crucial for maintaining a competitive edge in the agentic SEO landscape, allowing users to secure valuable keywords and manage their online presence more effectively. However, it took more time than I anticipated to get the cron jobs working correctly, requiring me to troubleshoot a few issues with timing and execution.
In addition to new features, I tackled several bugs that had been affecting the user experience. One major fix was tightening the owner command ring around the #SPACE glyph in the portals. The button arc was previously misaligned, causing buttons to splay out awkwardly. After some trial and error, I managed to center the buttons and add the necessary headroom to prevent clipping. This adjustment might seem small, but it dramatically improves the visual appeal and usability of the interface.
Another fix involved the DJ Max radio feature. Users had been experiencing issues with the in-window play button, which would remain stuck on the Play icon during stream buffering. To address this, I implemented a Loader2 spinner that provides immediate feedback while the stream is loading. This change not only improves the user experience but also reduces confusion when the stream is buffering. It was a bit tricky to diagnose the issue, but I learned a lot about managing loading states and user feedback through this process.
I also made significant improvements to the way DJ Max commentary is handled. Previously, the commentary would reset to a live loop, forcing users to re-listen to segments they had already heard. Now, the commentary resumes from where the user left off, using elapsed played time stored in localStorage. This enhancement required careful management of the script loading process to ensure that fresh content still rotated between sessions without disrupting the user experience.
Security was another critical area of focus today. I addressed a vulnerability related to stored XSS in the builder-network. By staging builder files in a non-web-served directory before publishing, I effectively closed the window for arbitrary script publishing. This fix not only enhances the security of the platform but also ensures that builders have to deliberately approve their content before it goes live, adding an essential layer of oversight.
While I made significant progress today, it wasn't without its challenges. I encountered several bugs that took longer to fix than I had expected, particularly with the DJ Max audio playback in editor webviews. The need for a self-healing 'Tap to hear the hosts' pill was a direct response to the constraints of the environment I was working in, and it took a few iterations to get it right. Each of these fixes taught me valuable lessons about the importance of user feedback and the intricacies of audio playback in web environments.
As a solo builder, I rely heavily on my AI tools like Claude Code in VS Code to help streamline my workflow. This day was a testament to the power of AI collaboration, allowing me to tackle complex issues without the overhead of a larger team. While there were moments of frustration, the satisfaction of resolving these challenges and seeing the platform evolve is what keeps me motivated. Every commit brings me one step closer to my goal of building a one-man-show company with a billion-dollar valuation.
Looking ahead, I plan to continue refining the user experience on hashtag.space and addressing any lingering issues. I’m particularly eager to explore more enhancements for the radio features and further tighten the integration of my security measures. Today was a long but fruitful day, and I’m proud of the strides I made toward realizing my vision for the agentic web.