Case study · 2024 – now

The Days We Keep

A private place for families to keep the ordinary days: photos, voice notes, letters and milestones, shared only with the people they choose.

Role
Founder and sole developer
Platforms
iPhone, iPad, Android
Languages
English, Spanish, Portuguese
Business
Subscriptions, 7-day trial
[Screenshot: Whole Family view]
[Screenshot: adding a voice memory]
[Screenshot: per-memory privacy]
[Screenshot: Time Capsule]

01 · The product

One private home for a family's story

Nothing is public and there is no feed. Parents invite a partner, grandparents and relatives, and choose who sees each memory. Over the years the app turns those moments into a timeline, growth charts and printable yearbooks.

02 · Architecture

Every read and write goes through a repository

That single boundary keeps the local database and Firestore in step, so the app works offline. Purchases are verified on the server before a plan unlocks.

Flutter app · iOS, iPadOS, Android

ScreensKeepsake design, GoRouter, 3 languages
Riverpod 3 stateProviders for each feature
RepositoriesOne boundary for all data access
Drift (SQLite)Offline-first local database
sync

Firebase backend

AuthSign-in and family accounts
Firestore and Cloud StorageFamilies, memories, photos, voice notes
Cloud Functions (TypeScript)Purchase verification, invites, renewals
FCM and CrashlyticsNotifications and crash reports

App Store and Google Play receipts are verified here before a plan unlocks.

03 · Hard problems

What I solved along the way

Rebuilt the app while it stayed live

Moved to Riverpod 3 and Drift screen by screen in both stores, then deleted the legacy services, models and DAOs.

Made family sync reliable

Fixed new-device logins that pulled no data, comments that never synced in real time, and a re-entrancy bug that dropped sync passes.

Billing that can be trusted

Server-side verification for Apple and Google, the Play subscriptions v2 migration, Billing Library 8 before Google's deadline, and a fail-closed bug fixed.

Faster first open

Removed an N+1 query on the memories screen, made photos load lazily and split large screens into small widgets.

Privacy enforced in two places

Firestore and Storage rules scoped to each family, plus per-memory visibility in the data layer.

Release quality

Crashlytics with obfuscated builds and symbol upload on both platforms, and a fix for an iPad freeze caused by the system password prompt.

04 · Beyond the code

I ran the whole launch

Product, UX and the warm "keepsake" paper visual style, store listings and screenshots in three languages, the Next.js marketing site, and the brand's social media, published with tools I built myself.

Plans (US)
PlanPriceIncludes
Essentials$4.99/mo or $34.99/yrUp to 3 family members, all memory types, cloud backup
Unlimited$9.99/mo or $59.99/yrTime Capsules, up to 10 members, yearbooks and keepsakes

Stack

Flutter · Dart · Riverpod 3 · Drift · Firebase Auth, Firestore, Storage, Cloud Functions, FCM, Crashlytics · GoRouter · Next.js