Engineering
How MyVitals is actually built — architecture decisions, the AI pipeline, and the bugs that taught us something.

I Shipped an App Store App That Updates Itself, Because There's Nothing in It to Update
How MyVitals reaches the Play Store with almost no native UI — a thin WebView shell pointed at a live URL — and the pile of small native tricks it takes to make a website stop feeling like one.
3 September 20263 min read

The Month My AI Pipeline Failed 100% of the Time and Every Log Said "Success"
A real postmortem on a silently degrading LLM pipeline stage, the retry budget that has to match your reverse proxy's timeout, and why "the upload succeeded" turned out to mean nothing.
3 September 20263 min read

Building "Login As Mom" Without Building a Permissions System
How MyVitals lets one family member act as another with full read/write access, why the permission check is never cached, and the req.userId vs req.effectiveUserId footgun.
3 September 20262 min read

Two Caches, One WebView, and a Deep Distrust of navigator.onLine
Why MyVitals runs a Workbox service worker AND a hand-rolled IndexedDB cache for the same data, why navigator.onLine lies, and the profile-scoping bug that comes with multi-tenant offline caching. ---
3 September 20262 min read

Teaching a Dictionary to Learn Instead of Hand-Curating It Forever
How MyVitals reconciles "FBS," "Fasting Blood Sugar," and "Glucose (Fasting)" into one canonical metric with a four-tier matching pipeline, and the duplicate-metric bug that taught me why "exact-only" matters.
3 September 20263 min read

I Wired 4 LLM Providers Into One Interface So I'd Never Have to Beg a Single Vendor for Mercy
How MyVitals swaps Gemini, OpenAI, Anthropic, and Mistral behind one interface, why extraction and chat run on different providers, and the 400 Invalid Model bug that taught me to stop trusting env vars.
3 September 20262 min read