LifeWell
com.aoneahsan.lifewell
LifeWell is a universal health & wellness platform โ one product across web (PWA), Capacitor Android, and a Firebase/Node-22 backend โ built on React 19 + Radix UI + TanStack + Firebase, and the canonical reference implementation for three workspace-wide engineering standards: the centralized logger (95 files / ~624 `console.*` callsites migrated), the merged-AndroidManifest Play-Console permission audit, and the safe-Firestore-date-converter rule.
At a glance
- Category
- web-app
- Status
- Live
- Started
- Jan 2025
- Last updated
- 4 days ago
Identifier
com.aoneahsan.lifewellPreview
Take a look before you go
The still below is painted first, then the running site loads behind it โ so the dialog is never an empty rectangle waiting on a network round trip. Where a site allows framing the live app takes over; where it refuses, the still stays and says so. Nothing is requested until you press.
About
What this actually is
The year somebody in a house is pregnant is often the year somebody else in it is managing blood pressure.
Those two facts sit in different applications built for different people, and neither one knows the other exists.
One app assumes a woman in her twenties. Another assumes a new parent. A third is designed around somebody with a long-term condition and a clinician waiting for numbers.
A household is all three at once.
So the records scatter across accounts and phones, and the view that would actually help โ everyone, over years, in one place โ is the one nobody ends up with.
LifeWell runs on a single Firestore backend on the free tier, with no server that has to be kept alive for it to work.
That constraint matters more here than anywhere else in this portfolio. A health record you cannot open in three years is not a record, and a tracker that stops paying for itself stops existing, taking the history down with it.
Keys never sit in the browser bundle. The calls that need one go through a Cloudflare Worker token proxy, so the secret stays on the server side of that line.
45+ health tools cover vitals, water, medications, exercise, sleep and nutrition.
Periods and fertility live in the same product as baby milestones, because in a real household those are frequently the same year.
Around them sit people, memories, notes and a community layer, so a reading has somebody attached to it instead of being a row in a table.
One product, two surfaces.
It runs as a PWA and ships as a Capacitor Android build on Google Play.
200+ routes and 10 languages, Arabic with right-to-left layout among them. Per-route static HTML with JSON-LD makes the public pages readable to a crawler, and there is a public documentation site alongside the product.
Two of the rules this whole practice now works to were paid for on this project.
The first is the central logger. Every direct console call came out across 95 files and the linter refuses new ones, which is a refactor that produced no feature any user will ever see and closed a class of leak that only shows up in production.
The second came from the Play Console.
A camera permission the app did not need was in the merged manifest, and the submission was rejected for it. Every Android build since is audited against its merged manifest rather than against the one written in the repository, because those two are not the same document.
Shared family records raise a question a single-user tracker never has to answer: who is allowed to see whose. That is a security-rules problem rather than a screen, and it is the part of this product that is easiest to get quietly wrong.
Ten languages is ten times the surface every new string has to cross.
And a tracker only ever knows what somebody typed into it. LifeWell keeps that record and shows it back over time. It does not interpret the record, gives no medical advice, and nothing in it is a diagnosis.
There is no iOS half. There is no Apple Developer account behind this work, so Android and the web are the two surfaces it has genuinely reached.
The history is the product. Everything above exists so that it is still openable in five years, on a phone I will never see, by somebody who has never heard of me.
Worth knowing
- Reference implementation of the workspace centralized-logger rule โ 95 files / ~624 `console.*` callsites migrated (2026-04-29). The logger patches global `console.log/info/debug/trace` to no-ops at boot, defaults to `warn` in dev AND prod, and is runtime-toggleable via `__setLogLevel()` / `localStorage['lifewell:logLevel']` / `VITE_LOG_LEVEL`.
- Drove the global Play-Console permission-hygiene rule: a 2026-04-18 CAMERA-permission rejection (auto-injected by `@capacitor/camera`) established the "inspect the *merged* AndroidManifest, not just the source" audit step now applied portfolio-wide.
- Drove the safe-Firestore-date rule: a production sanitizer bug (2026-05-07โ2026-06-02) destroyed Timestamp/FieldValue class instances via recursive `Object.entries`, leaving dates as plain `{seconds,nanoseconds}` maps that crashed raw `.toDate()` (broke getPerson/getFamilyTree in production). The fix โ safe converters (`toDateSafe`/`toDateOrNow`/`toTimestampSafe`) + an ESLint `no-restricted-syntax` ban on raw `.toDate()` + a sanitizer invariant that only recurses into plain object literals โ is now a global rule; corrupt docs self-heal on next write.
- Play-readiness engineering (2026-06-02): AD_ID permission declared + matched in Data Safety, R8/`minifyEnabled` with Capacitor/Cordova/OneSignal keep rules, NDK `debugSymbolLevel SYMBOL_TABLE` for native `.so` symbols.
- Zero-cost backend by design: free-tier Firestore + a Cloudflare Worker for Google-Drive token exchange (so `client_secret` never reaches the browser), instead of paid Firebase Functions for that path. CF secrets are prefixed `LIFEWELL_` to avoid collisions on the shared account.
- Banned `@capacitor-firebase/crashlytics` + `/performance` + `@capawesome/capacitor-torch` after Android Gradle wiring failures โ Sentry handles errors, Amplitude handles perf timing.
- React Compiler enabled (`babel-plugin-react-compiler`) โ automatic memoisation on React 19.
- AEO-first content: per-route static HTML + 5 JSON-LD schemas (WebSite, Organization, SoftwareApplication, MobileApplication, FAQPage) injected at build by `postbuild-seo.ts` (33 route-specific `index.html` files), so AI crawlers that don't run JS still see full content. A separate PUBLIC Docusaurus docs repo exists specifically to earn AI-search citations + developer credit while the main repo stays private.
Built with
- React 19
- TypeScript
- Vite 8
- Radix UI Themes
- TanStack Router
- Firebase
- Cloud Functions
- CapacitorJS
- Cloudflare Workers
Key features
What it does, and what that costs to build
Each of these is a capability the stack genuinely provides. None of them is an outcome nobody measured โ there is no "cut onboarding by 40%" on this page, because no one measured onboarding.
- 45+ health tools (vitals, water, meds, exercise, sleep)
- Period & fertility + baby milestone tracking
- Full Radix theme customizer (7 options)
- 10 languages including RTL Arabic
- Per-route static HTML + JSON-LD for AI search
- Public Docusaurus docs site
Screenshots
5 slots, 2 of them filled in
These are designed frames, not pictures. Each one records what belongs in the slot and at what width; the capture itself is taken from the running app. Drawing a fake screenshot here would put an image on the site that no build has ever produced.
Timeline
Still being worked on
Jan 2025
Work started
The earliest month on record for LifeWell.
Oct 2026
Last change
Status is completed โ 4 days ago. Ongoing, so this row moves whenever something lands.
Questions
Common questions
The questions that actually arrive, answered in the first sentence.
- Who built LifeWell?
- Ahsan Mahmood built it alone, and it is live at lifewell.aoneahsan.com with an Android build on Google Play. The data model, the Firestore rules holding one household's records apart from another's, the Android packaging and the store submission are all the same person's work.
- Does LifeWell give medical advice?
- No. It keeps a record of what you enter and shows it back to you over time; it does not interpret readings, does not diagnose anything and is not a substitute for a clinician. That boundary is deliberate and it is why the tools are described as tracking rather than as assessment.
- Does LifeWell work on iPhone?
- No, there is no iOS build โ there is no Apple Developer account behind this work, so nothing here has ever gone to the App Store. LifeWell runs as a web application that an iPhone can open in Safari, and it ships a real installed app only on Android.
- What can a family track in one place?
- Vitals, water, medications, exercise, sleep and nutrition, plus periods and fertility, baby milestones, and the people, memories and notes that give a reading somebody it belongs to. The point of putting them in one product is that a household is rarely one demographic, and the same year often contains a pregnancy, an infant and somebody managing a long-term condition.
- Which languages does LifeWell support?
- Ten, including Arabic with full right-to-left layout. Right-to-left is the one that decides whether a translation layer was built properly or retrofitted, because it changes layout rather than only text. Adding an eleventh language is a catalogue file rather than a rebuild.
Keep looking
More web apps
- ZT
ZTools
com.zaions.ztools
A privacy-first developer and power-user toolbox covering 20 categories, where the work happens in your browser rather than on someone's server.
- TA
TaxEase
com.aoneahsan.taxease
Tax compliance workflows for filers, with an admin side for staff.
- AH
Ahsan Mahmood Portfolio
com.aoneahsan.app
Production personal-brand platform: projects, services, blog, testimonials, and contact/payment surfaces across web and Capacitor mobile, engineered to be cited by AI search.