Skip to content

phranck/musiccloud.io

Repository files navigation

Astro Biome CI Fastify React TypeScript License: MIT

email-header

musiccloud.io

Paste a music link from one streaming service, get a universal share URL that opens the same track or album on every other service the listener has.

Live at https://musiccloud.io.

What it does

  • URL resolution. Paste a Spotify, Apple Music, YouTube, Tidal, Deezer, SoundCloud, Qobuz, Bandcamp, Beatport, Audius, Pandora, JioSaavn, Boomplay, Audiomack, Netease, QQ Music, Melon, Bugs, KKBOX, or Napster link and the backend resolves the track or album across all supported services, preferring ISRC/UPC matches and falling back to scored text search with confidence filtering.
  • Text search. Type a song title or artist and get cross-service candidates with disambiguation when the top match is not confident enough.
  • Genre discovery. Browse by Last.fm tags, resolve any tag to a representative cross-service set of tracks.
  • Share pages. Every resolved result gets a short URL with server-side-rendered OpenGraph/Twitter meta for rich link previews.
  • Admin dashboard. Analytics (via Umami), track/album management, user administration, content pages, media library.
  • Public API with Swagger UI for third-party integration.

Supported streaming services

Deezer, Audius, SoundCloud, Pandora, Qobuz, Boomplay, Bandcamp, Audiomack, Netease, QQ Music, Melon, Bugs, JioSaavn, Beatport, Spotify, Apple Music, YouTube, Tidal, KKBOX, Napster.

Each service is implemented as a plugin under apps/backend/src/services/plugins/*. Adding a new one means implementing a ServiceAdapter and registering it in the plugin manifest.

Tech stack

  • Monorepo via npm workspaces.
  • Backend: Fastify 5 + TypeScript + Drizzle ORM + PostgreSQL 16. Compiled with tsup. Swagger/OpenAPI via @fastify/swagger.
  • Frontend: Astro 5 (SSR, Node adapter) + React 19 islands + Tailwind 4.
  • Dashboard: React 19 + Vite + UnoCSS + TanStack Query.
  • Shared package (packages/shared): API types, endpoint paths, error codes.
  • Tooling: Biome 2.4 (lint + format), Vitest (675 tests across 33 files), drizzle-kit migrations.

Repository layout

apps/
  Apple/            Swift native app (macOS/iOS/iPadOS) + Share Extension
  backend/          Fastify API (resolve, share, admin, analytics, swagger)
  dashboard/        Admin React SPA (analytics, users, media, content)
  frontend/         Astro SSR site (landing, search, share pages)
packages/
  shared/           TypeScript types + API contracts shared across apps
drizzle.config.postgres.ts
zerops.yml          Hosting config

Getting started

Prerequisites

  • Node.js >= 20
  • npm >= 10
  • PostgreSQL 16 (the project uses Drizzle migrations; local dev typically runs PG in Docker on port 5433)

License

MIT.

About

Share your favorite tracks

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors