Building a place tolisten to albumstogether.
I designed and built Resonate, a live social music platform centred on shared album listening rather than passive music logging.
- ~200
- 4,000+
- 25+
- 0

The shared listening occasion disappeared.
Streaming made nearly every album instantly available. It also made listening increasingly solitary. Most music products are good at recording what already happened: an album was played, rated or added to a list.
I wanted the product to create a reason to listen, not only preserve a record of it afterwards.
The club creates the occasion. The catalogue preserves what happened there.
A listening club with a catalogue attached.
The recurring Listening Club creates a shared album pick and a common listening window. Members listen, react, rate and discuss the same release around the same time. Their responses then become part of the wider catalogue.
A normal rating product answers, “What did this person think of this album?” Resonate also asks, “What did this group think while they were listening to it together?”

What I built
Resonate extends beyond the club without losing sight of it. The surrounding product gives each listening occasion context, identity and somewhere to persist.
My role: product direction, frontend, backend, database design, APIs, infrastructure, deployment and user support.
- Albums, search, metadata, ratings, written reviews and track data.
- Profiles, follows, activity, user-made lists and pinned albums.
- Listening Club picks, shared listening windows, reactions and group ratings.
- Direct and group conversations, persistent history, unread state and read receipts.

Architecture that I operate end to end.
The application runs on Vercel. Next.js handles interface and server logic, PostgreSQL remains the source of truth, and Supabase supplies auth and real-time delivery. Scheduled work announces each club pick by email.
Users reach a Next.js and React application on Vercel. Its API and server logic use Supabase Auth with PostgreSQL, Supabase Realtime, and the external Spotify and MusicBrainz services. Scheduled jobs trigger email delivery.
Real-time messaging is a state problem.
Direct and group conversations combine persistent messages, membership, ordering, unread state, read receipts and real-time delivery. PostgreSQL is the durable source of truth; Supabase Realtime moves changes through the live interface.
The hard part was not getting a message to appear. It was keeping local and persisted state reliable when events arrive out of order, connections recover, or several views need to agree about what has been read.
The feature works in production today, although it remains one of the systems I continue to improve.
Moving album identity beyond Spotify.
The MVP treated Spotify as the main source of album identity. That accelerated the first release, but it also made Resonate’s catalogue depend on another platform’s identifiers and data model.
I am migrating canonical album identity toward MusicBrainz. Spotify, and eventually Apple Music or other services, can then become integrations and destinations instead of the definition of the catalogue itself.

The product decision is intentionality.
Resonate is differentiated by the context it creates, not by claiming other music products are wrong. Each one starts from a different social behaviour.
- RateYourMusic
- Archival and catalogue-oriented
- Musicboard
- Asynchronous music logging
- Airbuds
- Passive social listening presence
- Resonate
- Intentional shared album listening
Real users changed the work.
Resonate launched after roughly one month, with nearly all initial users coming from one organic Musicboard post. Feedback and production behaviour now drive the next iteration.

Agents accelerate the loop. Ownership stays with me.
I use Claude Code, Codex, ChatGPT, Claude and T3 Code for implementation, debugging, exploration and refactoring. I still own the problem definition, architecture, review, testing and production result.
Agent output is never treated as finished simply because it compiles.
Creator & Product Engineer
I took Resonate from the initial product idea through production deployment, and continue to operate it.
- Product direction
- UX and interface design
- Frontend and backend
- API and database design
- Integrations and infrastructure
- Deployment and scheduled jobs
- Debugging and user support
- Production iteration