Offline-first sheet music app for small ensembles
Solo Scores
A tablet app for viewing, annotating and sharing sheet music that keeps every part, playlist and marking in sync across an ensemble, online or off. I design, build and run it as the sole developer.

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