Personal Projects · Development

NSupySonic

My Deezer library as a self-hosted app: FLAC archiving, offline-first playback, web and Android.

  • Python (Flask, Gunicorn)
  • Svelte + Vite
  • Rust / WebAssembly
  • Kotlin (Android)
  • PostgreSQL
  • FFmpeg (FLAC → Opus)
  • Docker, GitHub Actions

Context

NSupySonic (Nyaker's Supysonic) started as a fork of supysonic, a Subsonic server written in Python. I wanted to stay in control of my music: every track played on Deezer is fetched once in FLAC, archived on my server and served from my own disk, even on the day Deezer stops answering. The fork grew into an application of its own, which I use every day.

Description

  • A Python (Flask) server exposes the Subsonic API on /rest and a JSON API for the web player; a Deezer proxy turns the account into a local library, with two-way sync of playlists and favourites.
  • A Svelte web player, installable as an app (PWA), built for speed: windowed lists, editable queue, synced lyrics, equalizer, crossfade and offline mode.
  • A native Kotlin Android app wraps the player and adds what a browser cannot: media service, notification, lockscreen and Bluetooth controls.
  • Audio analysis written in Rust and compiled to WebAssembly (tempo, beats, genre) drives WebGL2 animations synced to the music.

In detail

Technologies

  • Python (Flask, Gunicorn)
  • Svelte + Vite
  • Rust / WebAssembly
  • Kotlin (Android)
  • PostgreSQL
  • FFmpeg (FLAC → Opus)
  • Docker, GitHub Actions

Key features

  • FLAC archiving on first play, Opus transcoding on demand
  • Keeps working without Deezer for everything already archived
  • Listen party synced to within a millisecond (link or QR code)
  • Remote control of a player from another device, with permission levels
  • Podcasts, ZIP export, uploads of personal files
  • Works with any Subsonic client (Symfonium, DSub…)

Quality and deployment

  • Automated test suite (API, security, schema, resilience)
  • GitHub Actions CI: tests, Android APK build, multi-arch Docker image (amd64 + arm64) published to ghcr.io
  • One-command deployment with Docker Compose

Security

  • The Deezer cookie is treated like a password: never committed nor baked into the image
  • Deezer sign-in in the Android app through the official page, the password is never seen
  • Remote control and listen party links can be revoked and expire

Source code

Available on GitHub (AGPL-3.0 license)