A diary app that helps men learn to recognize and put words to their emotions. I designed, built and released it on my own, from the first idea to Google Play.
▸ Get it on Google Play (Android)
This is a public showcase. The app's source code is private; this repository holds screenshots, architecture notes and a few selected code samples.
The idea came from Gary Chapman's The Five Love Languages: many people, men especially, have learned to deny their feelings and struggle to name them. Chapman suggests a simple exercise: a few times a day, stop and ask yourself what you felt over the last hours. The Men's Diary turns that exercise into a daily habit.
- Diary with moods: entries with a 7-level mood scale, a mood-colored calendar and a searchable history
- Emotion vocabulary: emotion words are highlighted as you write; new ones are "discovered" and unlock content and features over time
- Word and quote of the day, with community suggestions that go through moderation
- Stats: streaks, mood spectrum and trends, writing consistency, emotional range across Plutchik's 8 emotion families
- Habits: daily and weekly tasks, configurable reminder notifications
- Personalization: original avatars and banners, a guided interactive onboarding with a mascot character
- Privacy: biometric/PIN app lock, in-app account deletion
- In-app purchases: one-time "unlock everything" and a tip jar through Google Play Billing
- Offline-first. All writes go to a local SQLite database (Drift) and succeed instantly; a background sync service replicates to Cloud Firestore when online, with last-write-wins conflict resolution and per-row sync state. Details: docs/offline-first-architecture.md
- Race-free unique nicknames using an atomic Firestore transaction, with local rollback when the server rejects a claim.
- Reliable purchases. A purchase delivered before the user is signed in isn't acknowledged, so Google Play re-delivers it instead of losing it.
- Stats cache in the local DB so streaks and counts don't need a full recompute on every screen.
- Tracking down a Play-only sign-in bug: Google Sign-In failed only for Play Store installs; I traced it to the certificate Play actually signs the APK with (verified with
apksigner) and registered the correct fingerprint. - Content admin tool in Python/Streamlit with the Firebase Admin SDK, to review community suggestions and schedule daily content.
flowchart LR
UI["Flutter UI<br/>(Riverpod)"] -- "write (instant)" --> DB[("Drift / SQLite")]
DB -- "streams" --> UI
DB <-- "SyncService<br/>push / pull" --> FS[("Cloud Firestore")]
Auth["Firebase Auth<br/>+ App Check"] --- FS
Admin["Admin tool<br/>(Python / Streamlit)"] --> FS
| Area | Technologies |
|---|---|
| App | Flutter, Dart, Riverpod |
| Local data | Drift, SQLite |
| Backend | Cloud Firestore, Firebase Auth (Google, Apple), Firebase App Check |
| Payments | Google Play Billing (in_app_purchase) |
| Device | Local notifications, biometric auth (local_auth), connectivity monitoring |
| Tooling | Python, Streamlit, Firebase Admin SDK |
- Solo development, iterated from v1.0 to the current v1.4.0.
- Several Google Play closed-testing rounds; tester feedback was logged and fixed release by release.
- Manual QA on real devices, including OEM-specific issues (e.g. navigation bar insets on Xiaomi HyperOS, aggressive battery optimization breaking reminders).
- Publicly released on Google Play (Android). The iOS project is scaffolded but not released.
Selected files from the private repository (code-samples/). They're shown for reading and won't build on their own.
| File | What it shows |
|---|---|
| sync_service_excerpt.dart | Sync lifecycle, the sync cycle, push/pull, atomic nickname claim |
| entries_dao.dart | Drift DAO: live queries, soft delete, conflict-aware upsert, orphan cleanup |
| entries_table.dart | Table schema with per-row sync state |
| iap_service.dart | Google Play purchase stream and safe delivery |
© Aidar Nizamov. All rights reserved. The code samples are shared for portfolio purposes only.




