InputConvDenseBottleneckReadout
← All Work
Health Tech · ML Personalization · Subscriptions

Praana Foods

Precision vegan nutrition as a service. An ML feedback loop that recalibrates each subscriber's macro and micronutrient targets monthly based on reported health signals — without requiring wearables or daily tracking.

Client: Praana FoodsRole: ML & Full-Stack EngineerYear: 2022
ML PersonalizationNutrition AISubscriptionsHealth TechFeedback Loops
Praana Foods — AI nutrition platform

The Problem

Most meal subscription services offer two flavors of personalization: a one-time dietary questionnaire at signup, and manual preference settings you can update if you remember to. Neither adapts. A subscriber whose health goals shift from weight loss to muscle gain, or who goes from a sedentary role to a physically active one, gets the same meals they signed up for six months ago.

The existing solutions that do adapt — continuous glucose monitors, calorie-tracking apps, fitness wearables — require daily active engagement from the subscriber. The compliance rates on sustained use of these tools are notoriously low. Most people track for two weeks and abandon it.

Praana's insight: monthly check-ins are a sustainable touchpoint frequency. If you design the check-in well — capturing the right 4–6 signals in under 2 minutes — you can run a monthly recalibration cycle that keeps the nutritional profile accurate without exhausting the subscriber.

The ML Personalization Engine

Monthly Health Signal Collection

The check-in captures: current weight, subjective energy level (1–5), current health focus (weight management / muscle gain / heart health / energy / cognitive), activity level change since last month, and any notable health events (illness, injury, stress period). Six signals, collected in a conversational UI that takes under 90 seconds. Response rates are high because the questions are short and the subscriber sees immediate visual feedback on what changes.

Recalibration Model

The recalibration model is an XGBoost regressor trained on nutritional science guidelines cross-referenced with reported outcome data. Inputs: the subscriber's static profile (age, gender, height, health conditions) + the current-month check-in signals. Outputs: target macro ratios (protein/carb/fat percentages), total caloric target, and micronutrient priority flags (e.g., "prioritize iron-rich sources this month" for a subscriber reporting low energy). The model outputs are mapped to meal slot constraints that drive the kitchen's production configuration for that subscriber's next batch.

Life-Stage Alignment

The model is parameterized by demographic group — the nutritional requirements and optimal macro ratios differ meaningfully between a 25-year-old athlete focused on performance and a 52-year-old professional managing cardiovascular risk. Rather than a single universal model, I trained demographic-stratified models that share a common feature space but apply different learned coefficients for the macro output. This avoids the one-size-fits-all problem that makes generic nutrition apps feel inaccurate.

Safety & Preference Guard Layer

The recalibration model outputs are filtered through a hard-constraint layer before reaching the meal configuration system. Allergies and intolerances are stored as immutable subscriber attributes — these override the ML recommendations unconditionally. The constraint layer runs a final safety check: no ingredient from a subscriber's exclusion list appears in any meal slot, regardless of what the recalibration model might suggest. This separation of concerns (ML for optimization, rule system for safety) was a deliberate architectural choice to prevent model drift from ever touching allergy constraints.

Platform & Subscription Infrastructure

Subscription & Billing

Stripe Billing handles subscription lifecycle — plan changes, pauses, reactivations, and proration. The billing cycle is aligned to the recalibration cycle: the month starts with a check-in, generates a new meal configuration, and triggers the production order before billing completes. Failed payments pause delivery (not cancellation) with a grace period for retry.

Kitchen Integration

Meal configurations are compiled into a structured production manifest — ingredient quantities per subscriber slot, batch groupings by fulfillment center, and substitution rules for supply disruptions. The manifest is generated 72 hours before kitchen production runs, giving time for final constraint validation and manual spot-checks.

Subscriber Dashboard

Subscribers see their current macro targets, the reasoning behind their last recalibration ("We increased your protein target this month based on your reported activity increase"), and a month-over-month trend of their health signals. Transparency in the recalibration reduces churn from subscribers who would otherwise feel the meals "just changed" without understanding why.

Operational Monitoring

The recalibration pipeline runs on a scheduled Celery job on the 1st of each month. Each subscriber's job is idempotent — re-running produces the same output for the same inputs. Failed jobs alert the ops team with the subscriber ID and error context. Recalibration results are stored with full audit history: inputs, model version, outputs, safety check log.

Stack

Pythonscikit-learnXGBoostFastAPIPostgreSQLReactTypeScriptNode.jsCelery + RedisSendGridStripeAWS LambdaTailwind CSS