← All posts

A 200,000-Person Study Ties Late-Night Eating to a 36 Percent Higher Risk of Fatty Liver Disease. Mr Bite Stamps Every Meal with the Exact Minute It Was Logged, Then Throws That Minute Away Before Its Coach Ever Sees It.

An OHSU-led analysis of nearly 200,000 people found that eating after your own bedtime raises the risk of cirrhosis and fatty liver disease. Mr Bite already timestamps every logged meal to the minute and already asks users for their bedtime, but the pipeline that feeds its coach collapses a whole day's meals into one total before either number is ever compared.

A bedside alarm clock showing late nighttime hours beside a dinner plate with a fork, linked by a solid coral line to a small liver-shaped icon with a soft warning glow, while a separate dotted teal line carries the clock's exact time toward a ledger page where it dissolves into one plain rounded number, warm cream background with coral and soft teal accents

A hepatologist named Robert Wilechansky and his team at Oregon Health & Science University published an analysis on October 7th that was built to answer one specific question: does WHEN you eat predict liver disease, independent of what or how much? They pooled self-reported diet and lifestyle data from three long-running cohorts, the Nurses’ Health Study, the Nurses’ Health Study II, and the Health Professionals Follow-up Study, covering 199,155 people with a median age of 59. They defined late-night eating as eating after bedtime or in the window between dinner and bedtime, then checked that single habit against who went on to develop fatty liver disease or cirrhosis.

The late-night eaters came out worse across the board: roughly 20 to 30 percent higher rates of liver disease overall, and specific figures of a 28 percent higher risk of cirrhosis and a 36 percent higher risk of MASLD (metabolic dysfunction-associated steatotic liver disease, what used to be called fatty liver). Wilechansky is upfront that this is observational and built on broadly self-reported habits, not a food diary of what the late-night snack actually was. But he also offered the obvious practical read: confining your eating to a window well before your own bedtime might genuinely help, and OHSU is already recruiting for a trial to test that directly rather than infer it.

“After your own bedtime” is a strange phrase to read as someone who spends his days in Mr Bite’s own data model, because we already have both halves of that sentence sitting in two different files, for two completely unrelated reasons.

The first half is loggedAt, a field on every single food entry a user logs. I went and read its comment in src/types/index.ts: “Exact wall-clock moment this food was logged (ISO string). Set once at add time and preserved across edits.” It’s not a date key, it’s a real timestamp, to the minute, and it survives edits specifically so it stays trustworthy. The second half is sleepTime, a field in meal_timing_preferences that we ask users for directly, the same bedtime that drives resolveUserDayRhythm() in src/utils/userDayRhythm.ts. That function is doing real, live work elsewhere in the app: it decides which meal slots a user gets, whether breakfast gets skipped relative to their wake time, and where the midnight rollover falls for resolveNutritionDateKey(), so a 1am snack still counts toward the right day. It’s imported in thirteen different files, from TodayScreen.tsx to mrBiteDraftPlan.ts. Neither field is missing. Neither is unused. They are just never introduced to each other.

Here’s where they’d have to meet, and where that meeting is structurally impossible today. Every log a user marks consumed flows into computeConsumedDailyTotals() in supabase/functions/_shared/dailyNutrition.ts, the function that flattens a day’s meals into the one row the rest of the coaching system ever sees. I read it end to end. For every consumed meal it adds up meal.calories, meal.protein, meal.carbs, and meal.fats into four running totals, then writes out a single row: date, calories, protein, carbs, fat. That’s it. meal.loggedAt is sitting right there on the same object, in the same loop, and the function never once reads it. By the time that row lands in daily_nutrition, there is no way to know whether today’s dinner landed at 6:30pm or 11:45pm. CoachDossier’s own DailyRow type, the thing the daily coach review and the weekly AI read both build on, is typed as exactly those five fields. The clock time isn’t filtered out by a rule anybody wrote on purpose. It’s just never been asked to survive the trip.

I don’t think this is a five-minute fix, because doing it honestly means more than tacking a boolean onto a row. It means deciding what “late” means per user (we already compute that, in userDayRhythm.ts, for a different purpose), carrying at least one real timestamp per day through the materializer instead of averaging it away, and then letting the coach dossier hold a signal like “3 of your last 7 logged dinners landed after your own stated bedtime” the same honest way it already holds “2 nights under 5 hours of sleep this week” from wearable data. The scaffolding for every piece of that already exists in this codebase. It’s just split across a client type comment, a meal-timing utility, and a Supabase edge function that have never once been asked to talk to each other.

Three Quick Bites

Three vignettes: a wedge of cheddar cheese beside a small bacterium icon, a bag of frozen mixed berries beside a magnifying glass over a bacterium shape, and a small takeout meal container beside a bathroom scale with a gentle downward arrow, warm cream background with coral and soft teal accents

  1. Family Farmstead Dairy of Worcester, New York recalled one lot of its raw mild cheddar on October 15th after lab testing turned up Shiga toxin-producing E. coli. The affected cheese, lot code and best-by date both July 22, 2027, went to grocery stores in New York and New Jersey, and the company says no illnesses have been reported. It’s the second raw-milk-cheese E. coli scare this fall alone, which says something about how often “raw” and “tested clean” fail to overlap. Food Poisoning Bulletin

  2. The FDA expanded Frutas y Hortalizas del Sur’s frozen organic berry recall on October 2nd to cover more lots of Great Value Organic Triple Berry Blend and Organic Blueberries sold at Walmart in 30 states, plus one lot of Trader Joe’s Organic Mixed Berry Blend sold in 26 states. The expansion ties back to the Chilean supplier’s original July recall; the E. coli O145:H28 outbreak it’s linked to has sickened 17 people across Florida and Georgia, hospitalized 6, and the CDC has since closed its investigation. Some of the recalled bags carry best-by dates into 2028, so this is a freezer-check, not a quick toss. FDA

  3. A small NIH-funded pilot published October 7th in Obesity Science & Practice randomized 39 adults who’d lost over 10 percent of their body weight on a GLP-1 drug, testing what keeps the weight off after they stop. Within 30 days of stopping, people got usual care, the Noom app, or ten dietitian-planned meals delivered home each week, tracked by Bluetooth scale for four months. Usual care regained about 10.75 percent of their weight back; the app and meal groups regained roughly a third of that, 3.60 and 3.58 percent. The sample is tiny and weight was an exploratory endpoint, but it’s a rare trial aimed squarely at the part of GLP-1 treatment nobody likes talking about: what happens after. FoodNavigator

Tool of the Week: Luxon

A digital clock face shown mid-transition crossing from one day to the next beside a small calendar page, linked by a glowing coral line to a neatly organized stack of gear-shaped code blocks, warm cream background with coral and soft teal accents

Since this issue is about midnight-crossing minute arithmetic, the pick this week is for the builders reading rather than the eaters: Luxon, a free, open-source JavaScript library (MIT licensed) from the team behind Moment.js, built specifically to handle local time, time zones, and the exact kind of “does this fall before or after someone’s bedtime, and which calendar day does it belong to” math that userDayRhythm.ts currently hand-rolls with modulo arithmetic and a crossesMidnight boolean. Hand-rolled date math is exactly the kind of code that looks right in every test you thought to write and wrong on the one DST transition or leap-year edge you didn’t. A tested library doesn’t fix a missing feature, but it’s one less place for a real one to break once it exists. Luxon

Thanks for reading. If you want a coach that’s honest about the clock it isn’t checking yet, Mr BITE is free on iOS and Android.

Michael, building Mr BITE

← Back to all posts