PersonalCast: My Personalized AI-Powered Radio

Inspiration

This project was inspired by my love of driving and my constant struggle to find the right content on long trips. While streaming music, podcasts, or audiobooks is great, it often becomes repetitive or monotonous. Switching between different content types while driving is also distracting and inconvenient.

I’ve always appreciated the format of radio — its curated flow, human commentary, and blend of segments. But traditional radio lacks personalization and often comes with irrelevant content or excessive ads.

So I asked myself: what if I could build my own personal radio station — one that mixes news, music, and stories I care about, delivered in a format that feels human and engaging?

The idea took shape as a mix of my past experience in streaming and my curiosity around how large language models and AI tools can reimagine content consumption.

What it does

PersonalCast is a proof-of-concept for a personalized AI-driven radio station.

It dynamically generates a structured program made of customizable blocks:

  • News
  • Music
  • Stories or podcasts
  • DJ commentary

Each block is filled with content pulled from services I already use—like Spotify and NewsAPI—and stitched together with LLM-generated transitions to simulate a real DJ-hosted experience. The order and frequency of blocks are fully configurable.

Everything runs in the browser with user-provided tokens, so no licensing or hosting hurdles exist.

How we built it

The most of PoC was built in bolt.new. I didn’t write traditional code; instead, I collaborated with the AI by:

  • Starting with a spec document
  • Iteratively building features phase-by-phase
  • Manually testing after each step
  • Asking for code refactors and cleanups along the way

Early on, I realized that a straight prompt-to-code approach led to messy results. So I shifted to a discuss → implement flow. This reduced errors and improved code quality.

Eventually, as complexity grew, especially around authentication, state handling, and external integrations, bolt.new began to hit its limits. While it's excellent for UI/UX prototyping and getting initial flows in place, it suffers when the logic gets more involved.

Challenges we ran into

Supabase integration

I initially hesitated to add Supabase for auth and storage, but it became necessary. Setting up Supabase Auth within bolt proved painful. The JS library’s edge cases required workarounds, and eventually, I had to get help from o3 because even bolt couldn't resolve some known issues.

Spotify playback

Integration with Spotify's API went relatively smoothly at first, but playing actual content—especially region-locked media—led to frustrating dead ends. Debugging these playback issues in bolt was nearly impossible, so I ended up rewriting part of the player logic with Claude 4 inside Cursor. That part saved the project.

Context resets

Resetting the context in Bolt (e.g., by duplicating a chat) is highly inconvenient — especially when a GitHub repository is connected. There is no way to reconnect the repo to the existing project (only to import the project from repo).

No access to the internet

Unlike some other vibecoding tools, bolt.new does not support retrieving information from the internet (or at least I wasn't able to get it working). This makes working with external APIs more difficult, especially when Bolt lacks full knowledge of the API or its latest behavior.

Accomplishments that we're proud of

  • Shipped a working AI-powered personalized radio app in a short time frame
  • Designed a flexible radio block system that mimics real broadcast scheduling
  • Built the full experience—UI, logic, integration—in a no-code/low-code environment
  • Validated the concept of an LLM-hosted radio experience with structured transitions
  • Learned how to debug and extend bolt-generated code using external tools when needed

What we learned

  • bolt.new is fantastic for prototyping UX/UI, but its limits become obvious when handling complex logic, authentication, or dynamic state
  • Planning and structuring your LLM interactions (discuss → implement) is key to reducing tech debt in AI-generated apps
  • bolt.new does not support retrieving information from the internet
  • Sometimes you still need to drop down into real code to get things right—especially with streaming services like Spotify

What's next for PersonalCast

I’d love to continue refining the concept with:

  • Better voice generation and audio blending for a smoother experience
  • Deeper personalization using user preferences and listening history
  • Scheduled playback or voice assistant integration for hands-free use
  • A standalone mobile app version

Eventually, I’d also like to explore:

  • Automatic adaptation of the radio program based on mood, time of day, or driving context
  • A true "DJ persona" with memory and style that evolves over time

Built With

Share this project:

Updates