03 / PERSONAL IOS PROJECT
On my iPhoneMusic9.
Some things are worth bringing back.
- MY ROLE
- Personal project creator
- PLATFORM
- iOS · Personal device
- BUILT WITH
- Objective-C, UIKit & MediaPlayer


My first iPod touch stayed with me.
My first Apple device of my own was an iPod touch 5. I loved the colourful interface, the big edge-to-edge album covers, and how much care seemed to fit into such a small object.
It reminds me of a simpler time, and of how supportive my family has been. Music9 began as a way to bring a little of that feeling back: the classic iOS 9 music experience, shaped into something I can use today.

A CLOSER LOOK
Let the artwork take the stage.
Big album covers and colours that flow into the controls. This is the screen I keep coming back to.
A familiar feeling, with a few things of my own.
The Now Playing screen is my favourite part. I wanted the album artwork to feel generous, with its colour reflected in the surrounding interface. I also added lyrics, so a swipe left brings the words into view.
Music9 brings together Apple Music discovery and local music in an interface inspired by the older app. I direct the experience and try the result on my own phone, with AI assistance for implementation.
FROM MY PHONE
A little look
around Music9.
A short, silent recording of the player, albums and artist views. Recorded on my personal device.
24 seconds · Tap play to watchThe right lyrics, even when the song changes.
The problem. Opening the lyrics view more than once can trigger duplicate requests. If a listener skips a song while a lookup is running, a late response must not be treated as the new song’s result.
The implementation. A shared lyrics loader lets views join an existing request. It checks an in-memory cache and offline storage before fetching, and uses a request generation counter to ignore obsolete callbacks after a track change.
The trade-off. Caching reduces repeated work but adds invalidation rules. The cache key includes the track and lyric selection; changing a selection clears cached results. Unsuccessful lookups are cached briefly so repeated opens do not immediately retry.
The evidence. The source includes simulator checks for shared requests, cached reopening and late responses from an old track. The device captures show the user-facing lyrics experience; they do not establish that every network or playback edge case is covered.
My role and AI assistance
I chose the swipe-to-lyrics experience and review it on my phone. The loader and checks were developed with AI assistance. I’m learning how request state and caching support that experience, rather than claiming independent authorship of every implementation detail.
Made for my pocket. Still growing.
Music9 is running on my personal device. I’m continuing to refine it and working towards a TestFlight release; it is not currently available on TestFlight or the App Store.
For now, these screenshots and the recording show the experience I’ve been building and using.
I wanted to make listening to music feel a little more like it did when I first fell in love with it.
Music9 is a personal project inspired by iOS 9. It is not affiliated with Apple. Album artwork and artist imagery belong to their respective owners.