Vibes coding a gadget into existence
A hobby of collecting and repairing old iPods has spawned a little side project on my nights and weekends: NUNO Player, a modern reimagining of the iPod mini.
It's an embedded systems challenge I've created for myself — to combine the iconic Click Wheel interface with audiophile-grade components and a modern microcontroller that can play lossless audio formats and support 1,000x larger music libraries, all with much better battery life than the original device from 2004.
I’ve got a GitHub repo up with the work so far — mostly getting an audio pipeline set up, along with the beginnings of Click Wheel input, a recreation of the 2004 device’s menu structure, a file system.
I am not an audio engineer. Or an embedded systems engineer. So I’m soaking up information and vibes coding with Cursor, Claude 3.5 Sonnet, and o3-mini from OpenAI. I started by building out a vision doc for the project (with an eye toward limiting scope to the feature set/user experience of the original iPod mini, so no color display or video or Bluetooth added), then worked out a reasonable development strategy and ranking of priorities, then built out a precise to-do list.
From there I’m working with Claude Sonnet in Cursor Chat to build it out, task-by-task. In the earliest coding sessions I could drop in several implementation items into the prompt at once; then, once something like a skeleton is in place, the work gets more granular. Periodically I use Repo Prompt to grab the entire codebase to dump in to o1 or o3-mini-high or Claude Sonnet to get a zoomed out perspective on priorities or needed work that isn’t on my radar. “Unknown unknowns.”
I’m having a lot of fun with it. It has never been a better time for this kind of project, to do this kind of seat-of-your-pants figuring it out as you go along. At any time you can make competing learning resources for yourself until the material clicks, like this animated diagram o1 made to explain Circular Buffers and how they help you avoid situations where you don’t have the next bits of audio ready during playback. I’m also unearthing some really cool older efforts to interface with the Click Wheel or make a “new” iPod, both providing paths to solutions and making the project feel a bit less deranged.
To do it without getting completely lost in the vibes coding of it all, mechanically telling Claude to do the next task and accepting whatever it gives back, demands the capacity to load a “model” of what you’re building in your head and continuously make it more precise and refined. You have to actually learn about what you’re doing and get leverage from these powerful models while maintaining a certain distrust of their outputs. Implementing tests that force their outputs to actually work, not just look like they will. Pitting them against each other, alternately checking each other’s work for being technically correct and directionally correct. Soon I’ll have real dev boards in the loop and rubber will really meet the road.
At some point the fantasy of the project hits some real friction. Will I be able to YouTube-tutorial my way to a multi-layer PCB in KiCAD? And how long until OpenAI Operator or Claude Computer Use can watch those videos and lay it out for me?