~/jonasfink.dev

← cd ..

lightMe - Holistic Health App

2026 · Full-Stack Developer
ReactTypeScriptTailwind v4Node.jsExpress.jsMongoDB
lightMe - Holistic Health App — screenshotlightMe - Holistic Health App — screenshotlightMe - Holistic Health App — screenshotlightMe - Holistic Health App — screenshotlightMe - Holistic Health App — screenshotlightMe - Holistic Health App — screenshotlightMe - Holistic Health App — screenshotlightMe - Holistic Health App — screenshotlightMe - Holistic Health App — screenshot

Problem

Most health apps silo tracking: one app for food, another for mood, a third for movement — and none of them show how the three actually interact over a 12-week program. On top of that, nutrition data is notoriously unreliable: no single food database has good coverage, barcodes miss, and portion scaling is easy to get subtly wrong. I wanted one app that holds nutrition, mood and movement together, trustworthy enough to base a real coaching program on.

Solution

A React 19 + TypeScript app backed by an Express/MongoDB API. Food lookups cascade across FatSecret, USDA and OpenFoodFacts so coverage holds up where any single source falls short, with a react-zxing barcode scanner and one shared portion-scaling helper reused across search, favorites and scans — no drifting duplicate math. A Recharts dashboard puts weight, measurements, mood, calories and activity on the same timeline. JWT auth uses in-memory access tokens with silent httpOnly-cookie refresh, Stripe Checkout runs the four-tier subscription flow behind a feature flag, and a role-gated admin dashboard surfaces per-user insights, MRR/ARPU and subscription health.

Engineering notes

The codebase is built around dedupe seams rather than abstractions for their own sake: portion scaling, meal types, plan tiers and the dashboard section chrome each live in exactly one place. When pages grew past ~500 lines I pulled logic into hooks and split the UI — the Food Diary page went from 991 to 278 lines via four hooks and four components. The admin bundle is React.lazy-split so normal users never pay its cost, and Stripe CTAs are gated behind an env flag so production ships a clean "coming soon" state without build breakage.

© 2026 Jonas Fink