Inspiration

Most life changes don't happen overnight. You slowly sleep later, walk less, work more, call family less often — and only notice months later, when the change is already a habit. Health apps show today. Journals show what you remembered to write down. Neither shows the difference between this week and the last one.

Software solved this long ago: every release ships with a version number and a changelog — what was added, removed and changed. LifeDiff brings that to your own life.

What it does

LifeDiff turns every week of your life into a version, with a diff.

  • A new version every Monday. Your week closes and a new version lands — v3.26 — with one plain sentence about what actually changed.
  • The diff. Five shapes borrowed from software: added, removed, increased, decreased, changed — "You started morning walks, but reading before bed disappeared." Every line carries the numbers behind it.
  • Twelve weeks from day one. Connect Apple Health and sleep, steps, workouts and mindfulness fill in by themselves. LifeDiff reads the last twelve weeks, so the very first report has something to compare against.
  • One question an area. Work, family, money, learning — the things a phone can't measure. A quiet reminder per area, answerable straight from the lock screen.
  • A timeline that reads like a changelog. Every week is kept as a version you can open — and any two versions can be compared.
  • Insights, judged your way. Goals are directions, not targets — moving closer, moving away or holding steady — so a number going up is only "good" if that's the direction you chose.
  • Moments. Mark a new job or a move, and see what changed around it.
  • Private by design. The analysis runs on your iPhone. Health data is read-only and never written back. No ads, nothing sold, and any area can be excluded from analysis.

A source you never connected contributes no signal — never a zero — so a permission you declined can't show up as a habit you "stopped".

How RevenueCat powers LifeDiff Pro

  • One entitlement, lifediff_pro, and a default offering with two packages: monthly (lifediff.pro.monthly, $4.99) and yearly (lifediff.pro.yearly, $29.99). Both plans include a 2-week free trial (App Store introductory offer).
  • purchases_flutter 10.13 with the public iOS key. The app never decides entitlement on its own: addCustomerInfoUpdateListener streams it from RevenueCat, so Pro survives reinstalls, new phones and purchases made on another device.
  • Live prices, nothing hard-coded. The paywall renders whatever the current offering contains, in the store's own currency, and the yearly per-month figure is derived from the store price.
  • purchases_ui_flutter where RevenueCat does it best. Customer Center handles the subscription, restores, refund requests and cancelling. If the app ever has no plans of its own to show, RevenueCat's Paywall is the fallback, so a remote offering can still be sold without an App Store release. Restore purchases is on the paywall and in Profile.
  • Contextual, never in the way. The paywall appears only when you reach for depth — an older version on the timeline, comparing two versions, long-term patterns, a second goal, a premium share card — never during a check-in.
  • A fair free tier. Free keeps the weekly report, your last four versions, one goal and the basic share cards. Pro opens your whole history, comparing any two versions, long-term patterns, month and year views, every goal and every share template.

How I built it

  • Flutter 3.47.4, pinned with FVM — an iOS-only app. Riverpod 3 for state and GoRouter across five tabs.
  • The diff engine is pure Dart and runs on the phone. Added and removed are judged against a three-week baseline; increases and decreases must clear a per-signal noise floor; clock signals like bedtime are compared in minutes; a week in progress is marked provisional rather than extrapolated.
  • Apple Health through the health package, read-only: sleep, steps, workouts and mindfulness.
  • Firebase: anonymous sign-in and Firestore keep each person's weeks in their own subtree, locked to its owner by security rules — no account to create. A small Cloud Function only sends the weekly nudge; reports are built on the device.
  • Actionable local notifications, so a check-in can be answered from the lock screen; answers given while the app is closed are handed over on the next launch.
  • Golden tests: 66 screens rendered in light mode, plus dark and iPad variants, so every design change is reviewed as an image. The App Store screenshots and this gallery are generated from the same captures.
  • The launch film is built from the app itself: an integration-test tour drives the real build while the screen records, and a Remotion composition cuts it against the narration.

Challenges I ran into

  • Absence versus zero. If sleep data is missing because a permission was refused, that is not "zero hours slept". Permission state is threaded through the whole signal pipeline, so an unavailable signal is dropped rather than defaulted — and a test pins it down.
  • A first week with nothing to compare. A changelog needs a previous version. Importing twelve weeks of Apple Health history gives the first report a real baseline, and the baseline week is labelled honestly instead of dressed up as a diff.
  • Making a number mean something. "Screen time up 14%" isn't good or bad until you know what the person wants — so goals became directions, and every trend is read against the chosen one.
  • Quiet weeks. Some weeks contain nothing new. The app says so instead of inventing changes to fill the screen.
  • Screen time on iPhone. Apple keeps app usage behind the Family Controls entitlement, so instead of shipping a permission it can't honour, LifeDiff says so on the permission screen.

Accomplishments that I'm proud of

  • It shipped. LifeDiff 1.0 went live on the App Store on 25 September 2026, with subscriptions through RevenueCat.
  • The privacy story is true, not aspirational: analysis on the phone, Health read-only, areas excludable, no ads and no tracking.
  • The app refuses to pad: the first week, a quiet week, a partial week and a missing permission are all handled honestly — and covered by tests.

What I learned

  • A diff is a design constraint, not a feature. Once every change has to be one of five shapes, every screen gets simpler.
  • Entitlements belong to the store. Letting RevenueCat own that one boolean removed a whole class of state I'd otherwise have to keep right across reinstalls and devices.
  • Drive the real app for demos. Recording an integration test means the film can't drift from the product.

What's next for LifeDiff

  • Show the free trial on the paywall itself (today Apple's purchase sheet shows it).
  • Year in review: the same diff across fifty-two versions.
  • Home Screen widgets for the weekly check-in.

For judges

  • Fastest tour: on the setup screen choose Explore with sample history — 130 weeks of a fictional life load instantly, no permissions needed. You can clear it in Profile.
  • Pro: tap anything locked (an older version on the Timeline, Compare, a second goal) or Profile → See what Pro opens. Both plans include a 2-week free trial; cancel any time in Settings → Apple Account → Subscriptions.
  • Everything in the video, screenshots and gallery is fictional demo data.

Built With

  • cloud-firestore
  • cloud-functions
  • dart
  • firebase
  • firebase-authentication
  • firebase-hosting
  • flutter
  • go-router
  • healthkit
  • ios
  • node.js
  • remotion
  • revenuecat
  • riverpod
  • storekit
Share this project:

Updates

Submission history