Plot is a local-first Flutter habit tracker built around a GitHub-style contribution calendar. Its responsive dashboard provides dedicated desktop and mobile layouts for recording daily progress and reviewing streaks.
- Create, edit, color-code, and delete habits
- Mark or clear days in a 52-week contribution calendar
- View current streak, longest streak, and days planted in the last 52 weeks
- Use a desktop sidebar or a compact mobile habit picker
- Keep habit data on the device in SQLite
- Flutter and Material 3
- Riverpod
AsyncNotifierfor asynchronous application state - Drift and SQLite for local persistence
- GoRouter for navigation
pathandpath_providerfor the database locationwindow_managerfor desktop window setupflutter_test, Drift's in-memory database, and Mocktail for testingvery_good_analysisfor static analysis
Code generation and packaging tools include build_runner, drift_dev, flutter_launcher_icons, flutter_distributor, and msix.
lib/
├── app/ # App widget and router
├── core/
│ ├── database/ # Drift schema and SQLite connection
│ └── theme/ # Material theme
├── features/
│ ├── dashboard/presentation/ # Responsive desktop/mobile dashboard UI
│ └── habits/
│ ├── application/ # Riverpod AsyncNotifier and state
│ ├── data/ # Drift-backed repository
│ └── domain/ # Habit model and streak calculations
├── widgets/ # Contribution calendar
└── main.dart # Platform setup and app entry point
test/
├── features/habits/ # Domain and controller tests
├── widgets/ # Calendar tests
└── widget_test.dart # Desktop/mobile flows and persistence
See docs/architecture.md for the runtime data flow and layer responsibilities.
Plot does not require an account or server. HabitsRepository stores habits, daily entries, and app settings through Drift in a local plot.sqlite database in the platform application documents directory.
Install dependencies and run the app:
flutter pub get
flutter runRun analysis and tests:
flutter analyze
flutter testPlot is licensed under the GPL-3.0 license.