Skip to content
Pacholo Amit
Index
alpha

Songstress

Your music. Your server. Every device.

Year
2026
Role
Solo
Category
product
Status
alpha
Platforms
4

Web · desktop · iOS · Android

FLAC, offline
24/96
Current release
v0.31
VisitSource private
Songstress on the desktop, showing a library of genres and most-played albums

Built with

  • React
  • TypeScript
  • Tauri
  • Expo
  • PocketBase
  • Python
  • Tailwind CSS
  • Docker

Songstress started as an answer to one irritation: the MP3s and AACs in my library that should have been FLAC all along.

The acquisition pipeline scans a library for lossy files, hunts verified-lossless replacements down a configurable ladder of sources, and swaps them in place, leaving Navidrome favorites and playlists intact. Like Lidarr, but for quality rather than coverage.

It has since grown into the whole listening stack: a player that follows you from the desktop to the couch to the phone, playlists imported from Spotify, Apple Music, Tidal and ListenBrainz, and duplicate-free management across multiple libraries.

What it does that a music player usually does not

  • Songstress Connect, hand playback between devices mid-song, the way Spotify Connect does, except the server is yours.
  • Playlist time machine, version history for a playlist, with a diff, and the ability to play an old version.
  • Merge, symlink-based deduplication across libraries, with undo and quarantine rather than deletion.
  • A ten-band equaliser carrying AutoEq profiles for thousands of specific headphone models.
  • Gapless playback on a dual buffer, time-synced lyrics with tap-to-jump, and a vinyl mode for people who want to watch the record turn.

Architecture

Ports and adapters. The domain core and application layers depend only on interfaces; the concrete SDK, HTTP and database code lives in adapters at the edges. It is a polyglot monorepo, Turborepo drives the TypeScript workspace and uv drives the Python one.

The desktop app is Tauri, the mobile apps are Expo with native tabs and Home Screen widgets, and the datastore, realtime bus, job queue and SPA host are all one PocketBase instance. A Python asyncio worker does the heavy acquisition work.

Deployment is a single Docker Compose file on anything that runs Docker, a NAS, a mini PC, a cheap VPS.

Status

Alpha, and licensed PolyForm Noncommercial. The server, web player and desktop app are free permanently; the mobile apps are the paid part, and they have not shipped yet.

The product

The Songstress landing page
Songstress on an iPad
The Songstress player on iPhone, playing a FLAC track
A playlist in Songstress on iPhone
Next in the recordPachtop