Highlights

  • Works with no signal at all

    Players open, annotate and reorder their music offline, and every change syncs to the rest of the ensemble when they reconnect.

  • One codebase, everywhere

    iPad, Android tablets and the web, with fixes reaching users without waiting for app store review.

  • Roles the server enforces

    Each member of a shared collection can only see and change what their role allows.

  • Playlists from your library

    AI builds a set from the music you already have, on request.

  • 268 checks per release

    Every release is gated by automated checks across iOS, Android and web, run by AI testers with Soundcheck.

Why I built it

I trained and worked as a professional musician, and Solo Scores started as the tool I wanted for my own ensembles: one place for every part, with everyone's markings kept in step. I first built it in 2018 as a progressive web app. In 2025 I rewrote it from scratch as a native app for the tablets players use on their music stands.

Offline first

Musicians play in churches, basements and wedding venues, where a signal is the exception. The app treats the device's local SQLite database as the source of truth and syncs in the background with PowerSync to a PostgreSQL database behind a Fastify API.

I chose PowerSync over Supabase because it gave strict offline behaviour together with fine-grained, role-based access control, so what each member of a shared collection can see and change is decided on the server, not just in the UI.

AI features

I've built two features on the Claude API:

  • Playlist generation (released to early users): builds playlists from your library using Sonnet with JSON-schema structured output, prompt-injection-resistant prompts and a rate-limited server proxy, so no API key ever reaches the app.
  • Metadata extraction (in development): uses Haiku's vision to read sheet-music details from imported PDFs. Fields are nullable, so the model can say a value is unclear instead of guessing.

Shipping it

The app is built with Expo and released through EAS, with over-the-air updates for JavaScript-only fixes. Billing runs through RevenueCat, and PostHog covers analytics, session timelines and crash reporting. A companion website, built with React Router and prerendered to static HTML, serves the marketing pages, a web version of the app and help articles generated from the app's own help content.

Every release since v2.17.0 has been gated by an AI regression suite of 268 checks across iOS, Android and web, run with Soundcheck. Its testers have found real bugs, such as a stuck upload and missing file states, which led to a reworked upload tray.

Details

Type
Product
Role
Sole developer: product, design, build and release
When
2018 – present
Platforms
iPad, Android tablets, Web
Built with
React Native, Expo, TypeScript, PowerSync, SQLite, Fastify, PostgreSQL, Claude API, React Router, RevenueCat, PostHog, EAS, Railway