← All projects

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.

React TypeScript Node.js Tailwind CSS Last.fm API Spotify API
Screenshot — main view

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.

Screenshot — album detail

Album detail page

Screenshot — browse view

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.