A kid-friendly jukebox powered by the ESP32, inspired by Phoniebox. Unlike the original Raspberry Pi–based version, phoniesp32 is designed to be battery-operated, low-power, and ultra-portable.
⚠️ Work in Progress — Contributions, ideas, and wiring tips are very welcome!
Download Firmware (download the
firmware artifact from the latest run on main)
- ESP32-based jukebox: replaces the Raspberry Pi with an ESP32-C6.
- Low-power & battery-ready: runs on a Li-ion cell with charging and buck-boost converter.
- Bare-metal Rust firmware: built on the
embassyasync embedded framework. - Rust-powered Web UI: implemented with Dioxus and served directly from the ESP32.
- Audio transcoding & upload: convert music files via the web frontend to IMA ADPCM, upload to device, and play back instantly.
- RFID support: scan S50 fobs with a MFRC522 module to trigger playlists.
- Affordable: target build cost under 50 CHF.
- MCU: ESP32-C6
- Charging/Power: BQ24073 (Li-ion charger), TSP631000 (buck-boost converter)
- Battery: Li-ion cell (e.g. 18650)
- Audio: MAX98357 (I2S DAC + amplifier)
- Storage: SD card adapter
- RFID: MFRC522 module + S50 RFID fobs
- DIY Breakout Board Build - Build using off-the-shelf breakout boards on a breadboard or prototype board (~25 CHF)
- PCB Build - Build using a compact and robust custom PCB board (~30 CHF)
- PCBWay Shared Project Order PCB on PCBWay with optional partial assembly of basic parts. Tutorial TBD
I'm grateful to PCBWay for sponsoring this project!
The PCB and assembly quality was excellent, and their BOM review caught a few mistakes I made in component selection — super helpful. I used the sponsorship to fix minor bugs from v1 (charging indicator) and produce a version that can be hand soldered. I opted for partial assembly (resistors, capacitors, LEDs) and am practicing soldering connectors and ICs myself. Update and tutorial TBD — while waiting, check out my project on PCBWay's shared project platform.
- Hardware
- Prototype on breadboard
- Soldered Prototype
- Battery charger
- Schematics
- Custom PCB
- Design and 3D print case
- UI (Dioxus)
- File transcoding
- Served from device
- Show last scanned RFID tag ID
- Switch to Bluma CSS
- Playback control
- Store RIFF INFO chunk for artist/title
- Associate file with RFID tag
- Configure Wi-Fi settings
- Playlists
- List known tags
- List uploaded files
- Continue file upload
- Styling
- Do not use CDN
- Update to stable Dioxus 0.7
- Firmware (Embassy)
- Fallback to Wi-Fi AP mode
- Audio pipeline (I2S → MAX98357)
- SD card access
- Playback control via buttons
- Playback control via RFID tags
- Pause playback
- Playlists
- Use RIFF INFO chunk for artist/title
- Fix concurrent access to file system
- mDNS responder
- Turn off Wi-Fi when on battery power
- Enable Wi-Fi temporarily by pressing volume up+down simultaneously for 3s
- Captive portal and DHCP server for WiFi access point
- Speed up SD access/upload (SD card was bad - turns out cheap SD cards are bad at SPI)
- Playback control via BLE
- SD card partitioning support
- Update to stable esp-hal 1.0
- Web API (picoserve)
- Associate file with RFID tag
- Playback control
- Playback status
- Last scanned RFID tag ID
- Configure Wi-Fi settings
- List known tags
- List uploaded files
- Playlists
- Command line utility
- Transcode
- Upload
- Playback control
- Associate
- Build system
- Build and bundle all components
- Build via GitHub actions
- Upstream fixes
-
dioxus: Support sass:color.channel() -
mfrc522: async / IRQ support implemented in mfrc522-async
-
- Documentation
- API Documentation
- DIY Build Instructions
- Hand soldering tutorial
- Video tutorial
Want to help build the cheapest, most fun, and hackable jukebox for kids?
- Review my code! I bet there are many possibilities to optimize power/memory usage
- Implement any of the missing features
- Share your ideas
PRs, issues, and ideas are always welcome!
MIT License — free to use, hack, and share.