Tejas

Design Engineer

Resume PDF

Spotify Ritual

Making a month of music feel like something you can keep

Turning a listening snapshot into a monthly cassette, with a small ritual around making and revisiting it.

Spotify Ritual’s real dashboard showing its cassette and monthly archive interface with fixture data
The cassette and archive in Spotify Ritual’s local preview, using demo music and account details.
In this story

I already had a script that collected liked songs into monthly Spotify playlists. It solved the practical problem: I could go back to the music I had saved in a particular month.

Spotify Ritual explores a different part of that habit. What would make creating the archive feel like a moment worth returning for?

The prototype lets me seal a month into a playlist, presents it as a cassette, and keeps a record I can revisit. The interface has a little ceremony around an otherwise familiar operation.

Start with something recognisable

A cassette is a useful object for this idea. It has a label, a bounded collection of songs, and a feeling of being deliberately put together.

The dashboard uses a cassette photograph as its base, with the playlist title placed over the label in a handwriting font. The accompanying archive view shows the cover, a mood tag, a handful of tracks, and a way to open the playlist.

The month gives the object its context. It can become a small shelf of listening snapshots rather than another endless list of tracks.

Let the music become part of the transition

While the playlist is being prepared, album artwork spirals towards the centre of the screen. The artwork comes from the track pool, so the transition carries something recognisable from the music being collected.

The animation is rendered on a canvas and driven by GSAP. When creation finishes, the remaining artwork gathers towards the centre, the status changes, and the cassette is revealed. The archive content follows it.

The current implementation deliberately holds the sealing sequence for at least six seconds, followed by its outro. That gives the sequence time to read, even when the requests finish quickly.

It is also a trade-off I want to review carefully. A sequence that feels satisfying the first time can feel slow on the fifth visit. I would test a shorter repeat experience and a reduced-motion treatment before treating this timing as settled.

Spotify Ritual’s real seal-your-month interface, with its grid of album artwork and green action button
The entry point to sealing a month, rendered by the actual frontend with the existing demo fixtures.

A listening snapshot needs an honest label

The selection code combines three sources that Spotify exposes: short-term top tracks, recently played tracks, and saved tracks. It deduplicates candidates by track ID, scores them, and balances the sources before choosing the playlist.

That produces a useful snapshot, but it does not reconstruct every listening event from an exact calendar month. The available recent-history windows and saved-track sample limit what it can know.

That distinction should survive into the product copy. The month is the archive's label and creation context. It is not a guarantee of complete historical coverage.

The mood label has a similar boundary. The code uses audio features when available and has a fallback when they are not. It is a way to give the collection a visual theme, rather than a claim about how somebody actually felt.

Keep a record of the result

The frontend handles the creation flow in stages: collect tracks, choose the selection, create a Spotify playlist, add its tracks, generate a cover, and save the month record.

The current code stores the archive record and generated artwork through Supabase. The cover is drawn programmatically on a canvas. It is not an image-model output.

Before starting a new month, the flow checks for an existing archive record and reuses it when one exists. For the current month, a separate sync action compares the selection with the playlist's existing track URIs and adds the missing ones.

There are still failure cases to harden. A Spotify playlist can be created successfully before a later storage or database request fails. Handling that partial result is a different problem from checking whether a completed month already exists.

Design the uncomfortable states too

The frontend includes preview states for an empty archive, loading, sealing, a completed seal, syncing, and errors. They let me inspect the real interface with fixture data, without repeatedly signing in or creating playlists.

That has been useful for separating the visual experience from the account and network work. I can look at a loading state as a designed screen, then check the real integration separately.

The screenshots in this draft use that preview path. They show the software's own components; they do not represent a new playlist created during this write-up.

The next iteration

I want to evaluate whether sealing a month gives people a reason to return, whether the cassette remains legible as the archive grows, and how much animation the experience needs after the first visit.

The monthly-saves script remains a useful counterpart. It quietly maintains a date-based collection of liked songs. Ritual gives a listening snapshot a presentation and a deliberate moment of creation. They share a subject, while serving different habits.

For now, Spotify Ritual is a prototype I am refining, rather than a finished service with validated usage or retention claims.