Solo project · Android app · Live on Google Play
POITracker
Never forget a hidden gem or a breathtaking view again. A travel companion I designed, built and shipped to Google Play on my own.
- Dart
- Flutter
- Riverpod
- SQLite
- Firebase
- Google Maps
- Kotlin
- TypeScript
- Platform
- Android, on Google Play
- Role
- Solo developer: design, build and release
- Built with
- Dart and Flutter, Firebase backend
- Status
- Live and in active development
In the app
Your places on an interactive Google Map
Colour-coded categories in the list
Light and dark themes throughout
Street View, photos, reviews and reminders per place
Features
01
Instant capture
Save a spot from your GPS in one tap, from typed coordinates or an address, a map long-press or a place search, with duplicate detection before it is saved.
02
Interactive map
Browse every place on Google Maps with colour-coded markers, filter by favourites, rating or category, and jump straight into turn-by-turn navigation.
03
Organise your way
Unlimited colour-coded categories, custom tags, and collections, including shared collections, plus reusable filter and sort presets.
04
Photos and Street View
Attach multiple photos to each place and preview 360° Street View panoramas where they are available.
05
Reviews and reminders
Rate and review places, mark favourites, and schedule date-and-time reminders so you remember to revisit them.
06
Insights dashboard
Charts of activity by day, weekday, hour and month, category distribution, review trends and location hotspots, filtered by date range.
07
Backup and portability
Opt-in cloud sync with recovery snapshots, plus separate encrypted offline export and import for taking your data anywhere.
08
Private and secure
Biometric unlock, auto-lock, a security dashboard, granular consent controls, and tools to export or delete your data.
09
Home-screen widgets
Native Kotlin quick-save widgets in four sizes, so a place is one tap away from your home screen.
Under the hood
Offline-first, with sync you control
Everything is stored in a local SQLite database, so the whole app works with no signal. Cloud sync is opt-in and runs while the app is open: it covers place metadata only, photos stay on the device, and concurrent edits are surfaced as an explicit keep-device or keep-cloud choice instead of being overwritten. Pro and Lifetime accounts also get up to seven rolling daily recovery snapshots, served by TypeScript Cloud Functions.
Security and privacy by design
Sensitive data is protected with AES-GCM encryption, with keys held in platform secure storage, and exports can be encrypted. The app supports biometric unlock and auto-lock, Firebase App Check, GDPR-style consent controls, and in-app data export and account deletion.
Clean, tested architecture
A feature-first structure with Riverpod state management, repositories for data access and a service layer for business logic. Over 300 automated tests cover models, repositories, services and screens, and a GitHub Actions pipeline runs analysis, tests with coverage, Firestore security-rules tests and the Android App Bundle build.
Subscriptions done properly
Free, Pro and Lifetime tiers are sold through Google Play Billing. Purchases are verified server-side by a Cloud Function, and features are gated through reactive Riverpod providers and tier-aware widgets so access always matches the user's entitlement.
By the numbers and the stack
- 56k
- lines of Dart in the app
- 300+
- automated unit and widget tests
- 4
- quick-save home-screen widget sizes
- 7
- rolling daily recovery snapshots for Pro and Lifetime
App
- Dart
- Flutter
- Riverpod
- Freezed
- fl_chart
Data and sync
- SQLite (sqflite)
- Cloud Firestore
- Secure storage
- Offline sync queue
Backend
- Firebase Auth
- Cloud Functions (TypeScript)
- App Check
- Crashlytics
- Analytics
Platform and device
- Google Maps and Street View
- Geolocation
- Local notifications
- Biometrics
- Kotlin widgets
Quality and release
- flutter_test and Mockito
- Firestore rules tests
- GitHub Actions CI
- Google Play Billing
The story
Building it solo
POITracker is a map-first travel companion for capturing and organising points of interest, from a quick GPS save to a full library of places with photos, reviews, reminders and Street View.
I built it entirely on my own as a personal project, not formal employment: the product design, the Flutter and Dart app, the native Android home-screen widgets in Kotlin, the Firebase backend with TypeScript Cloud Functions, the automated tests and CI pipeline, and the release to Google Play.
Working solo meant owning every trade-off end to end. I kept the app fully usable offline, made sync opt-in and conflict-aware rather than silently overwriting data, kept photos on the device, and treated privacy controls, encrypted exports and subscription gating as part of the architecture instead of an afterthought.
It is live on Google Play and still in active development.