Build Journal
Improving Portal Leaderboard & Call Features — May 6, 2026
I improved the portal leaderboard and call features, enhancing user experience and fixing bugs while building my agentic web platform.
What shipped
- New Leaderboard Endpoint — Introduced a dedicated /api/portals/leaderboard endpoint for better filtering.
- Call Functionality Fix — Fixed call persistence issues during transient auth failures.
- Enhanced Video Call Controls — Locked down share-link guests to allow only portal owners to end calls.
- Dynamic Navigation Tools — Phase 1 portal embed agent tool-calling harness implemented.
- Improved User Experience — Consistent styling updates for leaderboard and testimonial displays.
Today, I set out to enhance the portal leaderboard and call features on my agentic web platform, making significant improvements and addressing a few pesky bugs that had been lingering. In a focused four-hour session, I managed to ship five feature improvements along with a critical bug fix. The updates primarily revolved around the leaderboard functionality and refining the user experience during video calls.
The most impactful change was the introduction of a dedicated /api/portals/leaderboard endpoint. Previously, the leaderboard was a bit of a mess, as it reused the /api/portals endpoint that returned a list including scraped events, which resulted in a leaderboard that was more confusing than useful. Now, the new endpoint orders the portals by total visits in descending order and filters out events, ephemeral, and non-# rows at the database level. This means that when users check the leaderboard, they’ll see a more accurate reflection of active portals like #SPACE and #freakncreekn, making the experience much more relevant.
Alongside this, I made sure to drop events and ephemeral pins from the leaderboard, preventing irrelevant scraped Luma rows from dominating the chart. I also took the opportunity to match the styling of the testimonial ticker to the homepage stats numbers. It’s a small detail, but I believe consistency in design helps create a more polished user experience. The colors now transition from slate-900/45 light to a soft-purple gradient dark, which I think looks great.
On the technical side, I spent some time addressing a bug related to call functionality. The fix involved ensuring that we keep the cached user on transient /api/auth/me failures. This was crucial because it previously caused users to be kicked from ongoing calls due to backpressure on the map-zoom feature in the Jitsi embed. By dropping user.id from the dependencies, I was able to stabilize the call experience significantly. This fix not only enhances user retention during calls but also lays the groundwork for the phase 2 enhancements of the portal AI embed harness.
Speaking of the portal AI embed, I made strides in building out the initial tool-calling harness. This phase 1 implementation includes seven tools, such as get_portal_facts and search_my_knowledge, which will ultimately empower users to interact with the portal in a much more dynamic way. The widget now renders directions, maps, and opens URLs as inline pill buttons, which should make navigation much smoother. I’m excited about the potential of these tools to enhance the overall agentic web experience.
Additionally, I locked down the share-link functionality for video calls so that only the portal owner can end the call. This change aligns with the hash-config parity established with the embed. It’s a crucial update for maintaining control during calls, ensuring that the owner has the final say on when a session ends. I also made a minor but important adjustment to the /portals/<id> redirect, appending &details=1 so that the slide-over opens correctly.
Overall, today was a productive day, and I feel good about the progress made. The improvements to the portal leaderboard and call features not only enhance user experience but also align with my vision of building a robust agentic web platform. Working solo with the help of AI tools like Claude Code in VS Code allows me to iterate quickly and implement these changes without the overhead of hiring a full team. Each commit and improvement moves me closer to my goal of creating a billion-dollar valuation company.
As I continue this journey, I am reminded that building in public means sharing both the successes and the challenges. Today was a win, but there are always more bugs to tackle and features to refine. I’m looking forward to the next steps and the ongoing evolution of my platform.