Music Space
A music discovery tool that aggregates recommendations from multiple sources, built specifically for finding music you wouldn't stumble across on your own.
Overview
Music Space came out of a recurring feeling that algorithmic recommendations had stopped surprising me. Spotify, Apple Music, and similar platforms are good at keeping you in your comfort zone — but not at pushing you outside it. Most of the best music I've found came from other people: blogs, forums, editorial lists, radio shows.
The idea behind Music Space was to bring those sources together in one place and present them in a browsable, searchable format. It pulls from multiple recommendation sources and surfaces releases that don't have algorithmic momentum behind them — smaller artists, niche genres, overlooked records.
Role
Solo — design, frontend, backend, API integration
Status
Live and in active development
Year
2024
Key features
Multi-source aggregation
Pulls recommendations from several sources and merges them into a unified, deduplicated feed — so you're not seeing the same algorithm repackaged.
Hidden gems focus
Results are weighted toward lower-profile releases. Popular records are included but not prioritised — the point is discovery, not validation.
Artist & album detail pages
Each artist and release has a page with biography, discography, genre tags, and links to listen on the major platforms.
Genre & mood filtering
Filter by genre, decade, or mood — useful for when you know the territory you want to explore but not the destination.
Album detail page
Genre browse view
Tech stack
Frontend
- React + TypeScript
- Tailwind CSS
- React Router
Backend & Data
- Node.js (Express)
- Last.fm API
- Spotify Web API
Tooling
- Vite
- ESLint + Prettier
- Git + GitHub
Challenges
- Different APIs return music data with very different schemas. Building a normalisation layer on the backend was necessary before any of it could be displayed consistently on the frontend.
- Rate limits across multiple third-party APIs required thoughtful request batching and caching to avoid hitting walls during normal use.
- Defining "hidden gem" algorithmically is harder than it sounds. I settled on a combination of listener counts and recency, but it required a lot of tuning to feel right in practice.
What I learned
- Building a small backend for the first time made me a better frontend developer — understanding what the server is doing changes how you design your data-fetching layer.
- Working with multiple third-party APIs in parallel taught me to build resilience into the UI from the start. If one source fails, the rest should still render gracefully.
- UX for discovery is genuinely different from UX for search. The user often doesn't know what they want — the interface needs to support browsing as a first-class experience, not just an afterthought.
What I'd improve next
User collections — the ability to save artists, albums, or tracks to a personal list — is the most obvious missing feature. I'd also like to add an editorial layer: short, human-written notes on why a particular album is worth hearing, rather than just metadata. On the technical side, I want to move the data normalisation from request-time to a scheduled background job with a lightweight cache, which would significantly improve response times.