Tracking a silly idea when it’s born - ESP32 based web radio stream player
So many projects I end up spending months on come out of silly ideas that get stuck in my head and blindly chase after. I had one such idea yesterday two days ago and figured perhaps it might be interesting, for my own sake, to be able to catch one of these ideas in the wild and capture the beginning of the spiral I may potentially end up on.
This particular idea is for a ESP32 based web radio streamer that outputs line-level audio via a 3.5mm jack. This reason for this project:
- AI / Claude / etc has become a regular part of my life I’ve been trying to create AI-free “touch grass” parts of my life
- I have friends and family who are into local radio stations and I thought a web streaming device might make a nice gift
Day one: first blush requirements
Hardware basics / platform
- ESP32 based - almost all of my electronics projects are based on the ESP32 modules
- USB-C for power
- Custom PCB for tidiness
I nearly always create custom PCBs for projects these days because it just feels much tidier and more professional to me. I also enjoy (not always in the moment I admit) the process of populating a PCB and seeing everything magically working the first time. This ramps up complexity and timeline significantly because the iteration time between designing a PCB, having it manufactured, ordering parts, populating, soldering, debugging, and (more than likely) doing this all again when I find a bug in the hardware design takes at least a month I’d say. Still well worth it to me.
Features
- Single line-level (what actually is “line-level”?) output of a 3.5mm jack to connect to power speakers or an amp
- Single, hardcoded radio station stream URL that the device always streams from
- An on / off switch?
Day two: The rabbit hole opens
After thinking / daydreaming for a day, I’ve come up with a few more thoughts.
Provisioning
If I’m going to give this device out to friends and family I need to allow them set the thing up without me hardcoding their wifi SSID / credentials. In the past I may have just hardcoded wifi credentials when I built the firmware / flashed a device, but this just feels bad because I know the day will come that the user will change their wifi setup and they will have no way to get the device I worked so hard on back online.
I’ve gone the “SoftAP” route before, having the device when reset broadcast a wifi network and host a simple little web interface to allow a user to setup their wifi, but I never have found this to be a great experience, even when it’s a known hardware that is using this method of setup. The WiFi connection is flakey, if you don’t have captive portal working (and this has always been hit or miss in my experience - see hotels wifi, airplane wifi, etc) then the user has to type in some IP address or you have to have a more complex network setup to make sure they get correctly routed to the device hosted web app.

The instructions I gave my family when I gave them the “Mitchine” - note how painful this is. Captive portal would have, in theory, saved manually typing an IP address but I found this wasn’t always reliable
The better solution, in my opinion, is to do provisioning over bluetooth. Unfortunately this requires a native Android / iOS app to work, but I could potentially use Espressif’s Provisioning Apps to avoid having to make an app of my own. But that’s not a great user experience.
We’ll see.
Ceramic stand / PCB holder?
I’ve invested a fair amount of time over the past five or so months testing different clay bodies we use in our modest home pottery / studio to figure out how to get dimensionally accurate-ish castings I can use for different projects. I think it would be cool to create a PCB mount or something that can hold the PCB and display it in someway if I wanted.
External speaker?
Related to the ceramic stand really, but as a gift or toy, it would be cool to have a little speaker, just a low quality one, that the device could drive. My primary goal for the project is to have line-out so I can hook the thing up to an amp but I might as well add the ability drive a small speaker while I’m at it.
Starting
So this is where I’m at, at the start of the project, a few days in, with nothing started other than some day-dreaming.