← Back to the demo

Run your own emupod

This demo plays one song on a built-in card. Your own copy runs on a small computer at home, and you use the iPod from your phone's browser, with your own music.

What you need

A Raspberry Pi 4 or 5 (running Raspberry Pi OS or another 64-bit operating system) or any 64-bit Linux computer on your home network. emupod is one program: nothing else to install first (curl, which Raspberry Pi OS already has, fetches it). Your music files on it or on a share. A phone or any browser to use it with.

Install: one command

curl -fsSL https://emupod.com/install.sh | sh
curl← the command-line download tool -f← fail if the server answers with an error, so an error page is never run as a script -s← silent: no progress bar -S← but still show an error message if something goes wrong -L← follow redirects to wherever the file really lives https://emupod.com/install.sh← the install script |← the pipe: hands what curl downloaded straight to the next command sh← the shell: runs the install script it receives

The script is short: read it first. It checks your machine, downloads the emupod release for it and verifies the checksum, installs into ~/emupod, asks where your cards and music live, can start emupod at boot, and prints the address to open on your phone (for example http://192.168.1.20:8797/).

The first start puts the built-in card, Rainbow Road, in place (a one-time download of a few megabytes). Cards are virtual. You can add your own music to cards, duplicate cards, and even burn them back to a physical iPod-compatible flash card in your host's USB port.

Or with Docker

git clone https://github.com/davidbarnhart/emupod.com
cd emupod.com
docker build -t emupod .
docker run -p 8797:8797 -v emupod-cards:/cards emupod
How tested is the Docker container? Not very. If you launch this Docker container and then later that day you get absolutely CHOMPED by an alligator, I’m basically 50% sure the Docker container had nothing to do with it. Please send me your feedback on attempted Docker deployments.

Uninstall

Delete ~/emupod and, if you chose to start it at boot, ~/.config/systemd/user/emupod.service. Your cards stay in the card folder you chose.

What? Why? How?

What: this is full emulation of the 1st generation iPod. It can be run temporarily in browser or installed on a device like a Raspberry Pi and controlled via a local webpage.

Why: My name is David and I’ve been tinkering with iPods for a long time. My latest endeavor has been understanding their inner workings better. I built an emulator for the 1st generation iPod to help me better understand the software running on the iPod (aka “the firmware”). The emulator was highly useful as a research tool but highly boring for just about everything else, so I decided to augment the emulator with this webapp to make it way more fun and more accessible to others.

How: This emulator and webapp are built primarily with Rust, which allows the code to compile into WebAssembly and run in modern browsers and mobile phones. The earliest version of this leveraged the Unicorn emulator to help approximate the ARM chip inside the iPod. To pack this all into a webapp, however, I reworked the PP5002 emulator into pure Rust and improved things by yelling “enhance!” repeatedly at my computer monitor in a commanding voice.

The demo player runs entirely within your browser, with a small virtual “card” holding the firmware and single music file. The full player is meant to be installed on a small computer like a Raspberry Pi. When installed this way, it exposes a local webapp that you can open on your phone or computer to control the player. Integrate the Raspberry Pi into your home Hi-Fi system and start rocking like it’s 2001 again.

Heading font: Sorts Mill Goudy (SIL Open Font License, licence). Button font: ChicagoFLF, by Robin Casady. emupod is open source (source). It runs the iPod's real, unmodified software on an emulated PortalPlayer PP5002 chip.