Practice management for musicians — Track repertoire, schedule reviews with spaced repetition, and keep organized notes.
TuneTrees is built for tune-based traditions:
- Irish/Scottish/Cape Breton trad
- Old-time, bluegrass
- Jazz standards
- Folk songs
- Any repertoire where you're building a "book" of discrete pieces
🎵 tunetrees.com | 📖 Documentation | 🐛 Issues
- 🎯 Spaced Repetition — FSRS algorithm schedules reviews at optimal intervals
- 📱 Works Offline — Full functionality without internet, syncs when connected
- ☁️ Cloud Sync — Practice on any device, data syncs automatically
- 🎸 Any Instrument — Multiple Repertoires
- 🎯 Goal Focused — Per-tune goal setting
Visit tunetrees.com — no install required!
Install as an app:
- iOS: Safari → Share → Add to Home Screen
- Android: Chrome → Menu → Install app
- Desktop: Chrome → Install icon in address bar
git clone https://github.com/sboagy/tunetrees.git
cd tunetrees
npm install
cp .env.example .env.local # Add Supabase credentials
npm run devTo help debug sync performance and E2E flakiness, you can enable compact per-sync diagnostics logs:
- Client (browser): set
VITE_SYNC_DIAGNOSTICS=true - Worker (optional): set
SYNC_DIAGNOSTICS=true(and optionallySYNC_DIAGNOSTICS_USER_ID=<supabase auth uid>)
See Developer Setup and Deployment for details.
| Layer | Technology |
|---|---|
| Frontend | SolidJS, TypeScript, Tailwind CSS |
| Local DB | SQLite WASM (sql.js) + Drizzle ORM |
| Cloud | Supabase (PostgreSQL, Auth, Realtime) |
| PWA | Vite PWA + Workbox |
| Deploy | Cloudflare Pages |
- User Guide — Getting started, features, FAQ
- Developer Setup — Run locally, contribute
- Architecture — System design
- oosync Config Reference —
oosync.codegen.config.jsonand workerparamMapbindings - Full Docs — Complete documentation index
npm run dev # Development server
npm run build # Production build
npm run test # Unit tests
npm run test:e2e # E2E tests (Playwright)
npm run typecheck # TypeScript check
npm run lint # Biome lint
# Schema codegen (Postgres → SQLite)
npm run codegen:schema # Generate drizzle/schema-sqlite.generated.ts via Postgres introspection
npm run schema:sqlite:check # Drift guard (alias of codegen:schema:check)- Fork the repository
- Create a feature branch
- Make your changes
- Run
npm run typecheck && npm run lint && npm run test - Submit a pull request
See Development Setup for details.
