A local-first sheet music reader built with Flutter. Reads PDF, JPG, and PNG files with multi-layer annotations, labels, and set lists. Available in English and French.
Try the web demo (limited — no file system access).
Most sheet music apps try to do everything — built-in pianos, tuners, metronomes, audio players. Feuillet does one thing well: viewing, annotating, and organizing your sheet music. If you need a tuner or a metronome, use a dedicated app that does it better.
- Dead simple — just your files, your annotations, your set lists.
- Clean, modern interface — no clutter, no upsells.
- Free and open source — no subscriptions, no accounts.
- Sync with anything — I use Syncthing and love it, but Dropbox, iCloud, Google Drive, or any folder-sync tool should work too.
Feuillet does not ship a cloud backend, account system, or proprietary sync protocol. It transparently sits on top of a regular folder on your filesystem:
- Documents are plain
.pdf/.jpg/.pngfiles. - Annotations are stored as
.feuillet.jsonsidecar files next to each document. - Set lists are stored as
.setlist.jsonfiles in asetlists/subfolder.
The app watches the folder and reacts to whatever changes happen there — whether you renamed a file in Finder, dropped a new PDF in via SSH, or had Syncthing/Dropbox/iCloud/Google Drive deliver an update from another device. Pick any sync tool (or none); Feuillet doesn't care how the bytes get there.
There is intentionally no conflict resolution or merge logic — the sync tool handles that. This keeps the app simple and predictable.
The local SQLite database holds your shared content (documents, annotations, labels, set lists) as well as device-local state that doesn't sync — per-document viewing settings (zoom, brightness, contrast, last page) and app preferences like the configured library directory.
- Library — import PDF/JPG/PNG, drag-and-drop on desktop, recursive folder scan, search, grid/list views, thumbnails, multi-select.
- Auto-labels from folders —
Bach/Suites/Suite1.pdfis labeledBachandSuitesautomatically. Manual labels with color palette also supported. - Viewer — pinch-zoom, pan, brightness/contrast, per-document persistence (zoom, page, settings). Header collapses into an overflow menu on small screens.
- Annotations — multiple layers per document, pen / highlighter / eraser, color and thickness controls, layer show/hide/rename/reorder. Strokes use raw pointer events for accurate capture.
- Document rename — renaming a document also renames its sidecar and updates references in set lists.
- Set lists — create, reorder via drag-and-drop, performance mode with quick navigation between pieces.
- Localization — English and French.
| Platform | Status |
|---|---|
| macOS | Full support |
| Android | Full support (uses MANAGE_EXTERNAL_STORAGE) |
| iOS | Built but not distributed (no App Store license yet) |
| Web | Limited — IndexedDB storage, no file watching, dev only |
| Windows / Linux | Not built — contributions welcome |
make setup # install deps, generate code, compile web worker
make run-macos # or: make run-android, make run-web
make test
make build-allSee make help for the full list of targets.
Default document directory (configurable in app settings — the app will suggest updating it on first run):
- macOS:
~/Library/Application Support/com.feuillet.app/feuillet/pdfs/ - iOS: App sandbox
Documents/feuillet/pdfs/(accessible via Files app) - Android:
/data/data/com.feuillet.feuillet/app_flutter/feuillet/pdfs/
- Flutter (Android, macOS, Web)
- Drift (SQLite, type-safe, WAL mode for safe concurrent access)
- Riverpod for state management
- pdfx for PDF rendering, watcher for file system events
See CLAUDE.md for a deeper architectural tour.
Android — grab the APK from the latest GitHub release. For automatic updates, add Feuillet to Obtainium.
iOS — the app builds and runs on iOS, but there's no App Store listing yet (no Apple Developer license at the moment). I'd reconsider if the project gets enough traction — open an issue or star the repo if you'd like to see it happen.
macOS — download the .app bundle from GitHub releases.
Web — try the demo (limited — no file system access).
Tags v*.*.* trigger a GitHub Actions workflow that builds Android APK, macOS .app, and web bundle, and attaches them to a GitHub release.
# Update CHANGELOG.md and pubspec.yaml version, then:
git tag v0.2.0
git push origin v0.2.0See CONTRIBUTING.md. Run make analyze && make test before opening a PR.
MIT.