Displaying Spotify Now Playing on a 3DS
A showcase of my experiments with niche hardware
When visiting Japan in August 2023, besides wanting to explore its rich culture and embrace the avalanche of impressions that is the city of Tokyo, one of my objectives for this vacation was finding a 3DS console, primarily with the purpose of experimenting with it. I own a 3DS console already, but it has save data I do not want to lose, so doing my own homebrew development on the only console I had seemed a little risky. That is why I spent two out of the four days of my stay in Tokyo strolling around Akihabara, nerding out over the impressive selection of Anime merch and tech gadgets, and of course, hunting for a suitable 3DS.
After digging around multiple HARD-OFF stores in Akihabara, I found a New 3DS LL which was in pretty good condition and sold for a reasonable price (or that’s what I was telling myself, at least). I bought it and was full of excitement to have a second device I could use for tinkering, but frankly had no clue what I wanted to do with it just yet.
Diving into Homebrew
While I didn’t know exactly what I wanted to do with the 3DS yet, I definitely wanted to mod it. In the past, I really enjoyed installing custom firmware on an old 5th gen iPod, so console homebrew was right down my alley.
I started by installing custom firmware (CFW) using the 3DS Guide. This guide is a great and very detailed resource that walks you through the entire process step-by-step, making it accessible even for those new to homebrew. You might be tempted to just use a YouTube video guide, but I highly recommend following the written guide for the best results.
After successfully installing CFW, I was truly fascinated by the huge selection of available applications and started playing with the thought of giving homebrew development a shot myself. Considering I wasn’t very familiar with low level development at that time, I knew it would be a challenge, but I was excited to learn.
Installing the Development Environment
Before diving into developing my own Homebrew app, I had to figure out what frameworks and languages I have as an option. The two most straight-forward options seem to be LÖVE (a Lua game engine) and C with devKitPro libraries (devKitARM). I chose the latter because it seemed more powerful for my use case, which was making a utility app.
Installing the libraries unfortunately was not as straight-forward as installing CFW. First of all, getting them running on Windows seemed a bit difficult, so I opted to install them on Linux instead.
This turned out to be much easier, but I was surprised to see that the devKitPro libraries are reusing the Arch Linux package manager pacman
for installation. It seemed like a weird choice to me, but I assume instead of making their own package manager, reusing an existing one made more sense. Still, it wasn’t always quite clear what packages I needed to install, so that ended up in some GBATemp scrolling sessions.
First Experiment: Spotify Now Playing

Since I’m not a game developer, I wanted to create something that would be useful in my daily life. For a long time, I have been thinking of ways to create a small status display to add some personality to my desk setup. Using a 3DS for this purpose seemed like a fun idea, so I thought about what information I would like to display on it. The first thing that came to mind was the currently playing song on Spotify.
I set up a simple homebrew application that would periodically fetch the currently playing song from Spotify and display it on the 3DS screen. The application used the libcurl
library to make HTTP requests to the Spotify API and libctru
to handle the graphics.
To achieve this, I used following technologies:
- C
libcurl
for HTTP requestslibctru
for graphics and 3DS system callscitro2d
for making a pretty UI- Spotify Web API to fetch the currently playing song
At first, I tried to implement the HTTP requests using the libctru
networking capabilities, but the provided examples did not work with the Spotify API. For some reason, my requests were getting blocked by Cloudflare, despite trying to set a user agent and other headers. After some research, I found that using libcurl
was a better option for making HTTP requests in homebrew applications.
Unfortunately, using libcurl
was not enough to get the requests working. I had to download the SSL certificate of the Spotify website because the 3DS does not come with a built-in certificate store. After that, making requests finally worked.
It took lots of trial and error to get everything working (I shot myself in the foot a lot of times with my lack of knowledge about memory management and C programming in general), but I eventually managed to get the application to fetch the currently playing song from Spotify and display it on the 3DS screen.
The result was a simple but functional application that displayed the song title and artist on the 3DS screen. I was thrilled to see my 3DS displaying the currently playing song from Spotify! I used citro2d to make the UI look a bit nicer, and I was quite happy with the result.