
Building the Miniature Painting Tracker app was a journey into creating a tool that truly supports hobbyists in their creative process. The app is designed for anyone who loves painting tabletop miniatures, such as Warhammer or Age of Sigmar, and wants to keep a detailed record of their projects. From the start, I wanted the experience to be intuitive and visually engaging, allowing users to document every step of their painting journey, from assembly to the final touches.
The core of the app is built with Flutter and Dart, which allowed me to deliver a smooth, cross-platform experience on both Android and iOS. I structured the codebase using best practices, separating screens, viewmodels, services, and repositories to keep everything maintainable and scalable. For state management, I chose Riverpod, which made it easy to manage dependencies and keep the app’s state predictable and testable.
One of the biggest challenges was ensuring that users could work offline and still have their data safely synced to the cloud. To solve this, I integrated Drift for local SQLite storage, so all project data, photos, and notes are available even without an internet connection. When the device goes back online, a custom PendingUploadManager service automatically syncs any changes to Firebase Firestore, which serves as the cloud backend. This hybrid approach means users never have to worry about losing their progress, no matter where they are.
Photos are a huge part of the painting process, so I made sure the app supports taking and uploading images at every step. Images are stored in Cloudinary, and their links are saved in Firestore for easy access and sharing. To make the experience even smoother, I used cached_network_image and flutter_cache_manager to ensure images load quickly and are available offline.
Managing a paint collection is another key feature. Users can add paints by scanning barcodes or entering details manually, and the app helps them track which paints they own and which ones they need for a project. This is powered by mobile_scanner for barcode reading and shared_preferences for lightweight, persistent storage.
Navigation throughout the app is handled by go_router, which keeps routing declarative and easy to manage as the app grows. For exporting and sharing, I added PDF generation and sharing features using the pdf, printing, and share_plus packages, so users can easily show off their progress or keep a personal archive.
Throughout development, I relied on build_runner for code generation, especially with Riverpod and Drift, and kept the codebase clean with flutter_lints and thorough testing. The app’s look and feel is defined by a custom dark theme, with modern accent colors and fonts, making it both stylish and easy on the eyes during long painting sessions.
In the end, the Miniature Painting Tracker is more than just a project tracker—it’s a companion for hobbyists, built with robust technologies and thoughtful design to make the creative process more enjoyable and organized.


