A Flutter application for organizing and cataloging sheet music collections with OCR text recognition capabilities.
- 📚 Library Management: Browse, add, edit, and delete sheet music entries
- 🏷️ Tagging System: Organize sheets with flexible tag management
- 📝 Notes Support: Add composer and notes to each entry
- 🔍 Search & Filtering: Full-text search and advanced filtering (coming soon)
- 📸 OCR Recognition: Text recognition from sheet images (coming soon)
- 💾 Data Export: Backup and export library data (coming soon)
This project uses FVM (Flutter Version Manager) for Flutter version management. All Flutter and Dart commands should use the fvm prefix.
-
Clone the repository:
git clone https://github.com/tomatitito/sheet-scanner.git cd sheet-scanner -
Get dependencies:
fvm flutter pub get
-
Generate code (for freezed models, drift database, etc.):
fvm flutter pub run build_runner build --delete-conflicting-outputs
fvm flutter run -d macosfvm flutter run -d chromeFirst, start an Android emulator:
# List available AVDs
$ANDROID_HOME/emulator/emulator -list-avds
# Start an emulator (replace <avd_name> with actual AVD)
$ANDROID_HOME/emulator/emulator -avd <avd_name>Then run the app:
fvm flutter run -d emulator-5554First, open the iOS simulator:
open -a SimulatorThen run the app:
fvm flutter run -d iosConnect your device via USB, then:
fvm flutter runfvm flutter analyzefvm flutter testfvm flutter format lib/Build APK (Android):
fvm flutter build apkBuild iOS app:
fvm flutter build iosBuild macOS app:
fvm flutter build macosBuild Web:
fvm flutter build weblib/
├── core/
│ ├── database/ # Drift database setup
│ ├── di/ # Dependency injection (GetIt)
│ ├── error/ # Failure types and error handling
│ ├── router/ # GoRouter navigation
│ ├── storage/ # File storage utilities
│ └── utils/ # Helpers (Either type, validators)
├── features/
│ ├── sheet_music/ # Core sheet music feature
│ │ ├── data/ # Data sources & repositories
│ │ ├── domain/ # Entities, repositories, use cases
│ │ └── presentation/ # UI, cubits, pages
│ ├── ocr/ # OCR/text recognition feature
│ ├── search/ # Search & filtering feature
│ └── backup/ # Backup & export feature
└── main.dart # App entry point
This project follows Clean Architecture with clear separation of concerns:
- Domain Layer: Business logic, entities, and repository interfaces
- Data Layer: Repository implementations, data sources, and models
- Presentation Layer: UI, state management (Cubit), and pages
State management uses BLoC/Cubit pattern with proper error handling via the Either type.
- flutter_bloc: State management
- get_it: Dependency injection
- go_router: Navigation
- drift: Type-safe database ORM
- freezed: Code generation for immutable models
- equatable: Value equality
- path_provider: File system paths
- file_picker: File selection (desktop/mobile)
This app uses Drift (formerly moor) for local data persistence with SQLite. The database includes:
- Sheet music entries
- Tags
- Composers
- Full-text search (FTS5) support
When contributing code:
- Run
fvm flutter analyzeto check for lint issues - Run
fvm flutter format lib/to format code - Ensure all tests pass with
fvm flutter test - Follow the existing Clean Architecture patterns
- Create descriptive commit messages
[Add appropriate license information]