The challenge
In 2022, a coworker at Apple reached out to me about KXSF, a nonprofit radio station where he was also a DJ. The station’s website was outdated and difficult to use in modern browsers. He asked whether I could help make listening more accessible on current devices.
I built the first version of the iOS app around one purpose: let listeners open the app and play the live stream. It gave KXSF a dedicated listening experience, but it did not tell listeners which show was on, who was hosting, or what the show was about. I also helped the station navigate Apple’s nonprofit program and App Store submission process.
Listening to what users needed
After V1 launched, the station shared feedback that listeners wanted more information about the programming: the current show, its host, and details about it. The original app could start the stream, but it could not answer those questions.
I returned to the project and set the direction for V2 around helping listeners understand and explore what KXSF was broadcasting. I added show information to the listening experience, a weekly schedule, access to KXSF’s YouTube livestream, and an About page with station information, social links, a donation link, and the station website.


Working with imperfect source data
KXSF’s show information was available on its public website, but not as a clean data API. The app retrieves public pages and parses their content. Some host information was embedded in page text, and some shows had no artwork on the site.
While testing on my iPhone, I noticed one show had no artwork. I checked the station’s site and confirmed it was missing at the source. I directed a station-logo fallback so the show would still have artwork in the app and Live Activity. I then tested that show again in both places on my iPhone and confirmed the fallback displayed correctly.
Testing the real experience
I used Pixel as an AI coding partner for V2. I set the product direction, identified issues, explained the behavior I wanted, and tested the results on my iPhone; Pixel wrote the code. One example was a layout that appeared clipped in the Xcode beta Simulator. I installed the build on my phone and confirmed the app’s layout was correct on the real device. I documented that as a Simulator discrepancy rather than changing working app code. After Apple updated the beta, the Simulator displayed the app correctly too.
V2 took roughly two to three weeks to complete. After App Store review, the release went live. The shipped experience includes Listen, Shows, KXSF Live, and About. The station responded positively and discussed possible website and Android work, but those projects have not been built.
“The most important work was not simply adding screens.”
What I learned
The most important work was not simply adding screens. It was translating listener requests into a more informative listening experience, working around inconsistent public source content, and checking behavior on an actual iPhone instead of trusting a beta Simulator when its output did not match the device.
I do not yet know whether the app changed listener numbers or the outcome of the fundraiser it was released around, so I am not claiming a measured audience or fundraising impact. After launch, a listener reported that playback stopped after an interruption. I could not reproduce it on my device and asked for device details and logs so I could investigate further.