sPot: Spotify in a 4th-gen iPod (2004)

Full-on Spotify scrolling and streaming via a Raspberry Pi Zero W and the original iPod clickwheel. Bluetooth, WiFi, and haptic feedback!!

Similar projects worth following
My mother-in-law recently gifted me a bag of the family's retired iPods. I had forgotten how good it feels to hold and use one of these things. Naturally, I decided to modify one. I wanted to supply some modern features (streaming, search, Bluetooth audio, etc), while paying homage to the amazing UX that Apple originally released almost 20 years ago.

Fast forward a few months - here's the sPot (ess-pot)! We've got:
* Streaming/Search via Spotify.
* Scratch-built UI, written in Python, based on the OG iPod experience.
* Full control via the original "click wheel".
* Haptic feedback.
* Micro-USB port for charging.
*... Linux, because there's a Raspberry Pi inside.

Hardware overview:

* Power is provided by a standard rechargeable li-ion battery. It's charged through a 500 ma Adafruit USB charger, and boosted to 5V using the Adafruit PowerBoost Basic. Both the Raspberry Pi and the display run on 5V.
* The click wheel connected to the original iPod motherboard via an 8 pin FPC cable. Thanks to this 10-year-old Hackaday article (and accompanying blog post by Jason Garr , I was able to find the pinout. Using an FPC breakout board, I easily connected the click wheel controller's 3.3V, GND, Data, and Clock lines directly to the Raspberry Pi. (More on this in the software overview).
* I used one of the Raspberry Pi's GPIO pins to drive a small DC motor (through a transistor, of course) for haptic feedback. I use quick haptic pulses in place of the iPod's original click sound, which triggers as your finger crosses each of the click wheel's virtual "steps".

* Repurposed the iPod's original lock switch to control the device's power. Conveniently, the PowerBoost module has an "enable" pin that can simply be pulled low to cut all power.

* Connected the display directly to 5V and the Pi's composite video output!


* I installed Raspberry Pi OS Lite as my OS. I figured I'd be conservative by not installing a full desktop environment, not sure if that was actually necessary in retrospect. The Pi Zero is more capable than I originally figured.
* Streaming from Spotify was surprisingly simple. I installed Raspotify, which just runs as a daemon and handles everything once you've authenticated. When it's running, the Pi appears as a "Spotify Connect" device on your account, and you can instruct it to takeover playback via an HTTP request (or using the UI of another authenticated Spotify client!).
* I used the Spotipy Python library to authenticate, search Spotify's catalog, fetch my saved artists/albums/playlists, and send playback commands to Spotify's servers.
* I wrote the UI as a Python application using tkinter. It was honestly pretty great to work with - front-end frameworks are hard to pick up! And this project was the first time I put any real effort into learning (and trying to love) Python. Forgive me, I spend most of my time in JVM-land.
* Referencing Jason Garr's blog post, I wrote a C program to the bitbang the click wheel's serial data into the Pi. I used pigpio to control the GPIO pins. Once I parse out the button presses and finger position, I send the data to the UI application via UDP. Jason - THANK you, wherever you are. This project would have been nothing without the original click wheel, and I would not have been brave enough to try to figure out the pinout myself. I will - hopefully - on future projects.
* ^ I snuck the haptic control into the C program that reads the click wheel. When the user's finger position changes, I quickly pulse the GPIO pin that's hooked up to the haptic motor. This was super easy, but the downside is that the haptics don't sync perfectly with the UI. For example, if you reach the bottom of a list, the haptics will continue even when the scrolling stops. It syncs perfectly while actively scrolling, so I didn't think it was worth changing.
* I use Redis (via Python library) to persist/cache user's Spotify data.
* I use Openbox to host the UI Application, which starts automatically once the PI boots up.
* I use pi-btaudio to get Bluetooth audio out of the Pi.

All of my source code will eventually be available here.

iPod-Spotify client UI running on Desktop
I was able to develop the UI entirely on my MacBook! Only had to optimize a tiny bit when I migrated to the Pi.
Earlier in the build: Haptic motor too big. Battery too small. Sketchy charge/boost module. Tried using a transistor to switch all power, but it kept cutting out.
These screens are adorable. Not bad image for composite input, either!
The "Now Playing" screen

Issues / TODOs:
* At some point the Pi started emitting a high-pitch whine. Big spike at 16khz and a little something at 8khz. What could this be? Doesn't bother me too much...

Read more »

View all 10 components

View all 3 project logs

Enjoy this project?



dave wrote 03/13/2021 at 08:58 point

I suceeded in getting Spot to work on my Desktop using spocon instead of raspotify but it only works after I activate my device through the spotify app ("connect spotify connect") otherwise it says "no device found". I would like to have my app work without booting Spotify app. Any ideas?

  Are you sure? yes | no

Guy Dupont wrote 03/11/2021 at 13:40 point

Head's up: looks like the displays are back in stock at Adafruit!

  Are you sure? yes | no

Ricardo Sappia wrote 03/11/2021 at 20:40 point

I found something similar in Aliexpress... maybe with some adaptions it could be an option!

AUO 2‘’ inch LCD display /2.0 LCD module /A020CN01.V1 display module (Drive board is 12V voltage)

  Are you sure? yes | no

Sean wrote 03/11/2021 at 23:59 point

I'm impressed with your LCD display implementation @Ricardo Sappia! Looking at your wiring for haptics, what is the purpose of the 1N4148 diode over the + and - of the haptic vibration motor?

  Are you sure? yes | no

Ricardo Sappia wrote 03/18/2021 at 15:27 point

@Sean i updated the post ;)

  Are you sure? yes | no

Sean wrote 03/08/2021 at 01:27 point

I have the software running nicely on my PC, and have just finished a test run connecting the Pi Zero, Boost module, Charge module and the 2.0" TFT display. Making steady progress... I posted some pics and a video of the initial display testing here:

  Are you sure? yes | no

sonicspeed.opusone wrote 03/06/2021 at 12:16 point

Can any one please help me, I'm stuck with step 3. in the github repo page.

pip3 install -r requirements.txt

returns: No such file or directory

Thank you

  Are you sure? yes | no

sebakitzing wrote 03/06/2021 at 12:53 point

I explain that part here

  Are you sure? yes | no

Sean wrote 03/08/2021 at 01:29 point

Are you doing that in the frontend directory? That is where requirements.txt is located. Also make sure you have python3 and pip3 installed and configured on your system path.

  Are you sure? yes | no

zburhop wrote 03/04/2021 at 14:16 point

Has anyone got it to run. I’ve reinstalled a few times and it boots to a black screen. (Screen works during setup and boot. The Ui is the problem)No interface at all. The underlying stuff works fine. It seems to be the UI that’s jacked. Any ideas

  Are you sure? yes | no

sebakitzing wrote 03/04/2021 at 20:33 point

I will upload to Git later today what I've got to make run and what I'm having issues with...

  Are you sure? yes | no

sebakitzing wrote 03/06/2021 at 04:06 point

I just uploaded my code to the GitHub Issues section it is #22

  Are you sure? yes | no

Matt wrote 09/07/2021 at 04:24 point

Hi, I've read through your Git issue and it sounds similar to mine.

I boot and get a black screen, if I SSH in I get the error xset: unable to open display ""

If I manually run it works just fine, the issue is trying to do all this automatically on startup.

Were you ever successful in fixing this issue?


  Are you sure? yes | no

Phil Karza wrote 03/03/2021 at 02:05 point

Any progress on forking this to become a media player?  I would gladly donate with patreon - do you have a patreon account?

  Are you sure? yes | no

zburhop wrote 03/03/2021 at 11:51 point

What kind of media player?  How would that be different from what it is?  Are you talking about video?

  Are you sure? yes | no

Craig Hissett wrote 03/03/2021 at 14:11 point

Yeah this is pretty much any kind of player you could ever need. You'd just need to create some python scripts to handle whatever you're needing to play.

  Are you sure? yes | no

zburhop wrote 03/01/2021 at 11:50 point

I installed spotipy from github in the "fork" directly as the paths show.  However it does not boot autostart.  When I manually try to run it I get this error. any ideas?

pi@raspberrypi:~ $ cd fork
pi@raspberrypi:~/fork $ ls
pi@raspberrypi:~/fork $ cd /home/pi/fork/retro-ipod-spotify-client/frontend/
pi@raspberrypi:~/fork/retro-ipod-spotify-client/frontend $ sudo -H -u pi python3 &
[1] 3577
pi@raspberrypi:~/fork/retro-ipod-spotify-client/frontend $ Traceback (most recent call last):
  File "", line 12, in <module>
    from view_model import *
  File "/home/pi/fork/retro-ipod-spotify-client/frontend/", line 1, in <module>
    import spotify_manager
  File "/home/pi/fork/retro-ipod-spotify-client/frontend/", line 1, in <module>
    import spotipy
ModuleNotFoundError: No module named 'spotipy'

  Are you sure? yes | no

sebakitzing wrote 03/06/2021 at 12:55 point

have you tried just running:

pi@raspberrypi:~/fork/retro-ipod-spotify-client/frontend python3

That's the way I got it to work

  Are you sure? yes | no

sebakitzing wrote 02/26/2021 at 03:42 point

Has anyone made the software run? I still have no screen, but I was able to se the device on 'Spotify devices', then I went to configure the BT as it was shown on pi-btaudio and the device dissapeared from Spotify...

  Are you sure? yes | no

zburhop wrote 02/26/2021 at 07:18 point

I haven't even got that far. Mind if i ask you some questions?

  Are you sure? yes | no

zburhop wrote 02/26/2021 at 07:20 point

Also good call on checking spotify.  My device only boots up to the command line......but it does show up when I select devices on my desktop computers spotify.If i select it it says connecting but ignores the request and continues where it was playing before.   When i turn the raspberry pi off it dissappears from the list.

  Are you sure? yes | no

sebakitzing wrote 02/26/2021 at 12:57 point

@zburhop  I just followed the instructions and got as far as you are telling me, command line and showing on spotify devices. I was able to get a connection twice but got no audio aout from hdmi, so then I followed pi-btaudio instructions to get BT headphones connected and it never showed again on the list.

  Are you sure? yes | no

zburhop wrote 02/25/2021 at 13:20 point

I made this Fritzing wiring diagram the other night.  Its how I wired my ipod up.  In case anyone finds it useful.

  Are you sure? yes | no

ethanheiss wrote 02/26/2021 at 02:09 point

Very dumb noob question but what gauge wire did you use?

  Are you sure? yes | no

zburhop wrote 02/26/2021 at 04:02 point

I used this wire. It’s my favorite. It’s silicone sleeved and 24awg it’s nice and flexible when your trying to squeeze this all together.

  Are you sure? yes | no

zburhop wrote 02/24/2021 at 12:41 point

Has anyone got the software to run?  Mine boots to command line and nothing else.  I've added all of the nessicary auto start stuff.  Been over it with a fine tooth comb.... nothing pops out.

  Are you sure? yes | no

sebakitzing wrote 02/25/2021 at 05:52 point

Same is happening to me. Im connected to the monitor, not the 2" screen... But I've done everything twice anda checked everything

  Are you sure? yes | no

ethanheiss wrote 02/24/2021 at 01:09 point

another question, how did you wire the lock switch to power on and off the iPod? 

  Are you sure? yes | no

zburhop wrote 02/24/2021 at 22:34 point

looking down at the hold switch board starting from the right side there are two pins. Solder a wire to each. You can leave off the third. One wire needs to go to the ground on the powerboost 1000 and one wire needs to go to the pin labled EN.  This will toggle power on and off.

  Are you sure? yes | no

ethanheiss wrote 02/25/2021 at 04:05 point

Wow thank you man saved the build!

  Are you sure? yes | no

zburhop wrote 02/25/2021 at 05:17 point

no problem.  Did you get the software going?  Im kind of at a standstill and would appreciate some help.

  Are you sure? yes | no

ethanheiss wrote 02/20/2021 at 01:00 point

I hate to be one of these people but if you make a full guide can you add a part about how to install the software and get the iPod setup? The hardware was easy just very lost on the software end. Thank You.

  Are you sure? yes | no

Guy Dupont wrote 02/20/2021 at 01:46 point

Yeah sorry, I did not anticipate anyone else actually trying to get it runaming. Have you looked at the github repo recently? As of yesterday, folks had added quite a few details about the software in the readme

  Are you sure? yes | no

ethanheiss wrote 02/20/2021 at 19:12 point

Wow just saw the update thank you so much! I practically need hand held doing this stuff appreciate it.

  Are you sure? yes | no

zburhop wrote 02/24/2021 at 22:34 point

Have you got this to work.  Im struggling with the software.

  Are you sure? yes | no

wc.przenosne wrote 02/19/2021 at 14:39 point

This is absolutely outstanding! I've never thought someone would be able to do this. I know and see it's uncomfortable to use daily, but hey - Spotify on an iPod! You hit many headlines lately!


  Are you sure? yes | no

sebakitzing wrote 02/18/2021 at 23:19 point

Hey @Guy Dupont did you work with the standard or fat size iPod?

I want to replace my back housing so getting the fat one might not be a bad idea... But if the standard works, I'm keeping it

  Are you sure? yes | no

Guy Dupont wrote 02/19/2021 at 02:35 point

I used the 20GB, which I think is the standard?

  Are you sure? yes | no

sebakitzing wrote 02/19/2021 at 03:06 point

Yep, that's the standard. Thanks!

  Are you sure? yes | no

Junaldinho wrote 02/18/2021 at 14:32 point

Question to everyone, I am trying to purchase all the components to create this build but struggling to find a 2inch TFT display as every online store seems to be sold out or discontinued, has anyone tried another display that works with this build and if so how would you wire this? Thanks 

  Are you sure? yes | no

Guy Dupont wrote 02/18/2021 at 16:55 point

Looks like one left here!

But yeah I'm also curious about alternatives. I think there are plenty out there with a correctly sized display... but the carrier boards tend not to fit in the iPod case. 

  Are you sure? yes | no

Junaldinho wrote 02/18/2021 at 17:13 point

thanks Guy, however I’m in the UK and they don’t deliver to us. I’ve looked at alternative screens but they seem to be hats for the Pi Zero unit which would be too thick for the iPod case. Hopefully someone could find a solution. 

  Are you sure? yes | no

efernan wrote 02/18/2021 at 18:59 point


I'm testing this:

I'm fighting with the dremel to fit the ipod case...

You may want to take a look here:

  Are you sure? yes | no

Junaldinho wrote 02/19/2021 at 00:59 point

thanks will take a look at this. If you manage to connect this up could you post a picture of how you wired this up to include space to connect the click wheel. 

  Are you sure? yes | no

dave wrote 03/05/2021 at 09:18 point

Hi, I ordered this screen and just received it but looks big for the case!

Did you succeed to fit it in?

  Are you sure? yes | no

Kakoub wrote 02/16/2021 at 17:03 point

Hello I tried to figure out the full electronic diagram and correct wiering but I'm not 100% sure to be correct especially about connecting the Rasb pin 34 and for the TV output, also I'm not into haptic feedback for myself, so I didn’t included it. I add what Guy post for the clicking wheel wiring thanks for that :).

Here is a pic:

Please fell free to tell me if I'm wrong anywhere or if I'm not using the correct terms on my diagram I'm still fresh to this.

  Are you sure? yes | no

Guy Dupont wrote 02/16/2021 at 17:14 point

Your wiring looks perfect! What exactly isn't working for you?

A few things to look into:
1. Have you enabled composite video output?

2. For the click wheel, have you compiled and run my click.c program? I start it up when the pi boots.

3. Are you sure your click wheel ribbon cable is going in the right direction. The pins are only labeled on once side. (I had this messed up originally).

  Are you sure? yes | no

Kakoub wrote 02/16/2021 at 17:17 point

Haha I didn't began to really try it out, I wanted to be sure of my diagram before soldering any stuff :) 

  Are you sure? yes | no

nicholassieracki wrote 02/19/2021 at 01:13 point

Thanks Kakoub,


II wired up off this diagram, bit it doesn't seem to boot via GIPO PIN2 is there anything special that I have to do in software to enable this?

 When I power the PI via USB both the Pi and the display boot up. But when I disconnect and power via the Adafruit charger, neither get power.


  Are you sure? yes | no

Mike G wrote 02/14/2021 at 15:27 point

I too have a 4th gen ipod that doesn't seem to want to charge. Ive been told its the IC on the logic board. I have a spare raspberry pi zero w and would love to overhaul this so I can run rockbox or similar and preferably maintain use of the headphone jack but have no idea where to start.

  Are you sure? yes | no

Phil Karza wrote 02/10/2021 at 01:14 point

could you make this into an mp3/flac  player to make it just like an ipod.... so we don't have to stream??  What do you think - have it open up clementine (my favorite) or another player??  I would love that...  enable ssh and auto start clementine and networking....

  Are you sure? yes | no

Guy Dupont wrote 02/10/2021 at 01:30 point

Yup, this will run any music player that will run on the Pi! Just need to write a little extra software to map the click wheel input to key commands.

  Are you sure? yes | no

Phil Karza wrote 02/10/2021 at 01:38 point

That would be GREAT!  I have several non-working 4s....   I would like to see this run a music player, be loaded by network and charge by a port - Volumio would also be a great thing to add to this.

I just set up a player and used this DAC - i2s - and it is pretty easy to set up... and is smaller... and does work with a small amplifier board, too,searchweb201602_,searchweb201603_

  Are you sure? yes | no

Phil Karza wrote 02/10/2021 at 01:52 point

forgot to mention - a battery indicator would be good, too!

  Are you sure? yes | no

Phil Karza wrote 02/12/2021 at 02:52 point

Is there anything I could do to help?

  Are you sure? yes | no

Guy Dupont wrote 02/13/2021 at 14:30 point

@Phil Karza nice! did you get the i2s to work with Raspotify, or another music player? Very cool either way. And I thought about a battery indicator too - any ideas how to get that done without taking up much more space? 

  Are you sure? yes | no

Pierre-Loup M. wrote 02/14/2021 at 10:48 point

@Guy Dupont @Phil Karza I've used I2S DAC with Pi Zero, namely the PCM5102A that is used in almost every sound board made for the Pi. Pimoroni had (I believe they no longer make it) a nice phatDAC hat for Pi Zero with it on it. It works really well, the only thing you have to do is to set the Pi to output audio on I2S. There is a comprehensive how-to at this address, with both a one line script and a extended manual setup, here :
The pinout is available here :

I believe your sPot could have audio out through the jack as well with very little hassle ! ;)

  Are you sure? yes | no

sebakitzing wrote 02/14/2021 at 13:06 point

@Pierre-Loup M. Doing that would leave the audio output only to the headphone jack? Any ideas on some setting where you can choose  BT/HeadphoneJack?

  Are you sure? yes | no

Phil Karza wrote 02/14/2021 at 18:19 point

I got it to work on volumio - it was not a problem - but there were several different solutions for wiring and software configuration.  I did kind of a hybrid.

As for the battery indicator - it a hotkey combo was able to be added to switch to desktop, that could work ?  would  it also be possible to have the code to work with vlc, for instance?

  Are you sure? yes | no

Pierre-Loup M. wrote 02/15/2021 at 13:47 point

@sebakitzing : to my knowledge there is not conflict between I2S and wifi / bluetooth. I use I2S audio + wifi on my Wendy project (see my profile), it's ok. I believe audio out can be routed to several outputs, but that may be needed to write some scripts. I suppose a good start are the Alsa and Jack documentations. Alsa is the default audio layer in Raspbian, I'm not sure if Jack is preinstalled.

Maybe volumio and other audio ditributions of linux have informations about that. Making a connected player for my hifi system is a project I've had for a long time, but never had the time to look at it...

For the headphone, itself, the PCM5102 is a both qualitative and cheap solution, but it gives a line level. A headphone amp (on chip or discrete components) will be needed.

I'm currently working (well, I haven't look at it in a month) on a esp32-based iPod, on which I use both the PCM5102 for hifi audio out and TPA6130A2 for headphones amp. I will publish the project, but I need to progress more on it. And as it's working on the esp32, it can give directions for hardware, but not for software.

  Are you sure? yes | no

Allen Kreager wrote 02/09/2021 at 16:02 point

This project is incredible! I should be getting my iPod today from eBay. I am going to work on a good 3D model of the gutted internals of the iPod and start putting together a 3D printed frame to hold all the components. I want to experiment with other displays and try to get something working that can turn the backlight off. 

  Are you sure? yes | no

Allen Kreager wrote 02/11/2021 at 03:40 point

I have a pair of USB type C headphones that I connected to my RasPi Zero through a few adapters and a hub and they instantly showed up as an audio output. I think if you wire the D+/D- from the pi to the USB port on your LiPo charger board you could have wired audio without adding a separate DAC. 

  Are you sure? yes | no

Guy Dupont wrote 02/12/2021 at 13:56 point

Great idea, but not really what I'm going for with this design. I care more about getting the headphone jack functional than I actually do about wired audio.

  Are you sure? yes | no

Allen Kreager wrote 02/12/2021 at 20:07 point

Are you planning on wiring the audio from the Pi directly to the headphone jack or are you planning on reverse engineering the 12 pin fpc connector on the board?

  Are you sure? yes | no

jamietchisholm wrote 02/09/2021 at 06:50 point

I love this project! I want to get started on this soon. Would very much look forward to a detailed walk-through. If anyone already has a walk-through of Guy Dupont’s method please share! Looking to build two of these and want to drill every step in my head.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates