Release Notes

kCal Buddy by version line. The current era shows tester-facing patches; closed eras keep the main idea only.

v0.8.xCurrent
Together

How do we improve together?

  • Spaces and shared challenges
  • iPhone + Android apps
  • Buddy Home coach loop for real daily use
  • Help Platform + Buddy Academy

Patch notes (this era)

v0.8.183 2026-11-03
  • Work with Buddy — personal AI nutrition & training coach framing, with useful tips above the Ask box (prefill only; never auto-send).
  • Membership near Buddy — Pro price (CHF 9.90/month) and Plan & credits entry visible on Advanced Home, not only inside the mode dialog.
  • Credits balance — Advanced shows your actual owned wallet balance (loading / unavailable kept honest). No invented monthly allowance or Ask gate.
  • Ask usage — Advanced shows last-request tokens/provider USD plus Today / 7-day / 30-day totals from AI Activity.
  • Home density — Beginner, Standard and Advanced default overviews are tighter so more fits on one phone screen without dropping information or footer actions.
v0.8.182 2026-11-02
  • Native beta API — release Android/iOS builds talk to beta.kcal.lol again (debug loopback origin no longer baked into distribution).
v0.8.181 2026-11-02
  • Standard Home — calories eaten, protein/fibre/water, meals, Movement, and NEXT on one screen without leaving Buddy.
  • Advanced Home — Ask Buddy with owned context toggles, history Save, and meal/training plan review + Apply on your diary.
  • Movement setup — confirmed preference/equipment inputs stay on-device and feed Home Movement without inventing sessions.
  • Save → Home refresh — after Confirm Save, owned totals refresh on Home, Foodiary and Progress without a manual reload; different-day Saves no longer mis-claim an older identical food as the new gain.
v0.8.180 2026-11-01
  • Beginner Home — calorie-hero Home: compact Balance, today's calories, protein, fibre and water, Done meals, NEXT with Log, and a readable Show all for the rest of the checklist. Your food and photos stay yours.
  • Show all — the Home checklist control is larger and easier to read and tap.
  • Home plus hint — the first-run plus hint no longer covers Log.
  • Android Back — after the keyboard hides, a second Back closes plus the same way X does.
v0.8.179 2026-10-31
  • Footer + — after you save food, the orange + stays in the middle of the tab bar on Foodiary, Progress and Menu. Confirm still hides it only while you are saving.
  • Buddy Confirm — a typed list of foods stays one meal: compact rows, one orange Save to Foodiary, and an error that names the food that failed instead of blaming every line.
v0.8.178 2026-10-31
  • Your Balance — calculates eligible provider assessments and logged goal progress instead of a permanent N/A. Tap the score for sources, inputs and exclusions; coverage shows the areas actually scored.
  • Balance history — 3/7/14/30-day charts use dated records and compatible signals, with gaps and partial days kept explicit. Synced wearable records refresh Home; the footer and saved reviews stay unchanged.
v0.8.177 2026-10-31
  • Beginner Home — sharper, more compact Home. Completed meals show as Done chips, one next action with Log, and an expandable checklist.
  • Beginner Balance — clearer Balance panel, intake recency in hours and days, and honest N/A states when data is missing. The overall score stays N/A.
v0.8.176 2026-10-30
  • Your Balance — Home shows six areas: meals, sleep, recovery, daily movement, training and energy. Weight no longer gates the page. The overall Balance Index stays N/A until scoring is reviewed; missing areas are N/A, not zero. 3, 7, 14 and 30-day direction is separate from today’s number. Last food, other drinks and water, plus a meal-processing estimate from what you logged. Tap an area for proof, then the source record.
  • Home briefing — claims follow confirmed direction and real coverage, not a clock or a missing weight.
  • Beurer scale — a direct reading stays with the account that captured it, does not save twice, and does not rewrite Foodiary kcal.
  • Proof charts — sparse weeks plot by calendar day.
  • 200% text — Home greeting, header and glance captions wrap.
  • Android Back — the keyboard hides before Home plus closes.
v0.8.175 2026-10-29
  • kCal Assistant mobile review — phone-first full-screen Setup → Overview → Discovery → Proof → Next Move → Direction → Earlier Reviews → Feedback. Period-aware titles: Know your day / week / month, and Know your progress for custom dates. One focused daily chart with labelled axes, saved-target and previous-period references. Insufficient data uses a short path instead of eight empty screens. Owned Foodiary photos stay on-device and are not sent to the review LLM. Five stars plus a separate 0 · Not useful, saved only after acknowledgement. Receipts say “No KLC charged” or “No AI call” from the live billing contract.
  • Menu → AI activity — personal history of AI tasks and provider attempts from existing operator_api_spend, with tokens, provider USD (sub-cent visible), KLC from the wallet ledger (not a price list), correlated retries only when a logical task id exists, and a link from the Assistant receipt. Reconciles with Admin → API spend. Does not change A7 pricing. Voice STT/TTS is listed when the worker reports attributable usage for the access-key owner; duplicate posts keep one attempt; missing usage stays unknown and older sessions are not backfilled.
  • Context-aware reviews — logged energy versus a saved kcal target is arithmetic only. Hockey/season context changes the next move even when completed sessions are missing. Missing activity is not inactivity. A partial week with a weekly plan is not “limited training”. Prompt personal_progress_review.v7, calculation version 3. Saved reports stay immutable.
  • Grounded next moves — weak slogans such as “increase protein” or “review activity plans” are dropped one by one; useful calculated steps stay. Overview leads with a personal headline, a compact evidence chart, and owned meal photos when they exist.
  • Help Progress covers the mobile Assistant review, Know your… period titles, owned photos, credit receipts, and Menu → AI activity. Admin activity center for all APIs is backlog.
  • Live v7 week review recorded on Android debug and reopened on iPhone 17 Simulator (loopback API) with zero extra provider calls. Physical iPhone was not connected. Additive operator_api_spend columns verified on local SQLite and a disposable Postgres 14 instance — not on beta.
  • Foodiary vs Home — client-only Buddy saves live in IndexedDB. Home and Foodiary now share that visible source, so a meal with an owned photo no longer disappears from Foodiary after refresh. An empty local day stays empty; replica rows are not a silent fallback for Sam keys.
  • Assistant ratings on local-first Sam — 0–5 review scores save for client-diary keys (they are operator feedback, not a server diary write). Earlier Reviews stays on the forward path after Direction.
  • AI activity accounting — adjacent same-person calls are not guessed as retries. Task outcome stays distinct from a single provider attempt. Pagination totals use database aggregates instead of a truncated 2,000-row slice.
  • Assistant findings — Discovery, strengths, attention and summary now need the same evidence and context eligibility as next moves. “Limited training” is rejected on a partial week or missing activity; a count of completed sessions can stay.
  • Feedback keyboard — the review panel shrinks by the IME inset so comment and Save stay reachable; Android system Back hides the keyboard before leaving Feedback.
v0.8.174 2026-10-29
  • kCal Assistant beta — Analyze my trend stays on the same Intelligence Engine. Assistant reviews your visible diary: coverage, provenance, a specific discovery, ranked next moves, and saved reviews that reopen without another AI call. Optional 0–5 ratings (0 is not unrated) persist to Admin → Feedback. Female/male appearance uses the supplied portraits.
  • Analyze my trend — product SSOT (docs/product/ANALYZE-MY-TREND.md): diary → snapshot → prompt → result → earlier reviews. Help Progress covers the Assistant review.
  • Analyze my trend boot — existing SQLite and PostgreSQL databases gain the Feedback feature index after column ALTERs, so API start no longer crashes on a missing feature column.
  • Assistant copy — stripped unit phrases such as “up by kcal” fall back to complete calculated sentences (personal_progress_review.v3).
  • + shortcuts — My Shortcuts is Analyze my trend (optional: Activity, Foodiary). Fasting stays on Home day-mode. Duplicate meal stays in Foodiary ⋯.
v0.8.173 2026-10-28
  • Analyze my trend (Platinum) — Progress, Home +, Foodiary + and Progress + share My Shortcuts. KCAL calculates a compact Intelligence Snapshot from the diary you see; Buddy interprets it. Saved reviews reopen without another AI call. Logging chips and footer nav are unchanged.
  • Analyze my trend — Sam’s on-device Foodiary is the analysis source (never an empty server copy). Invite keys merge the local replica. An empty week does not spend AI. Percentages such as 88.2% stay intact. Back returns to the previous sheet.
v0.8.172 2026-10-28
  • Confirm (meal photo) — Name + kcal + protein is enough to Save. Camera UNRESOLVED no longer greys Save after the numbers are on the card. Food names skip iOS red spellcheck dots. On phone, Save stays above the tab bar and Home + hides while Confirm is open. “kCal Buddy” ellipsizes so the ladybug stays tappable. (Beta User Katja)
v0.8.171 2026-10-26
  • Scan EAT — A barcode pack name stays on Confirm. Multilingual labels with *de* / *di* (Cucina passierte Tomaten) are not treated as camera garbage, so Save is not blocked with “Name this food before saving.”
v0.8.170 2026-10-25
  • Ladybug — Phone Home shows the red ladybug again in the top bar. Tap it to send in-app feedback.
  • Scan EAT — Eat is a typed Foodiary command: structured pack → Confirm → one save. Product names (Twix, Review, Finish the Day) are never parsed as Buddy chat. Daily Review stays on its explicit entries. A large Foodiary-vs-macro kcal gap is a warning, not “normal rounding”.
v0.8.169 2026-10-25
  • Ladybug — iOS autofill of the hidden website field no longer discards in-app reports. Screenshot capture cannot hang the sheet; if the photo is too big, the text still lands in Admin.
v0.8.168 2026-10-24
  • Nutrition labels — Confirm keeps every less-than row, including salt. Scaling 100 ml to 500 ml rewrites the printed <0.5 g notes. Saved drinks stay drinks, so they do not inflate food grams.
  • Daily Review — A past day says “This day”, not “Today”. Tarkista tänään returns you to today. Home stays today.
  • Share — Today is the local calendar date, not UTC. Opening from a historical Foodiary day exports that day. A failed load is an error, not a fake empty day.
v0.8.167 2026-10-24
  • Nutrition labels — Photograph the Nährwerte table. Buddy reads the printed rows (including German labels and <0,5 g values), keeps Drink vs Food honest, and lets you confirm how much you actually had. A 500 ml bottle is not logged as 500 ml until you say so.
  • Buddy Daily Review — Ask how the day went. Buddy explains Foodiary, goals and calendar for that date — not a new tab. Foodiary → Tarkista päivä reviews the selected day.
  • Beginner Share — Share sits on the Foodiary toolbar. Food weight is on by default. Historical days export that day.
  • Label camera — Stays in Label mode. The crop you approved is the image that is read. Package size is not consumption. Unnamed drinks stay “Drink 1”, not a nutrient word or a fake food-database match.
  • Food weight — Water and other drinks are not added to food grams.
  • Empty Foodiary — No longer says “no meals” while the day is still loading, hydrate failed, or you are on the other loopback origin (localhost vs 127.0.0.1).
v0.8.166 2026-10-23
  • Receipts — Review purchases, then Add to Stock. A till is not a meal. Missing nutrition or a missing printed total never dead-ends the save. Foodiary stays unchanged.
v0.8.165 2026-10-23
  • Barcode — Ship the flavored-pack Foodiary identity fix. v0.8.164 did not roll out (backend TypeScript).
v0.8.164 2026-10-23
  • Barcode — A flavored pack keeps its name and label numbers when you Save to Foodiary. Emmi Crème de SKYR Himbeere is not raspberries. Strawberry protein yogurt is not strawberries.
v0.8.163 2026-10-22
  • Get the App — Open my kCal Buddy in browser is a real link. The { data-i18n junk is gone.
v0.8.162 2026-10-22
  • Camera — Home Scan still auto-reads barcodes after the overlay TypeScript cleanup.
v0.8.161 2026-10-22
  • Camera — One native camera for every state. Food / Receipt / Barcode / Label stay in a reserved dock for live, review, loading, success and miss. Barcode auto-reads; other modes wait for the shutter. Flash is independent. Review is a real crop (drag, resize, rotate, reset) on the full-resolution still. Pack discovery stays in the same camera: front, then label, then barcode. An unknown barcode says it is not a food match, not that Buddy “doesn't know this pack yet”. Home Scan opens Barcode, not Food. A complete barcode table (verified or Open Food Facts) can Save to Foodiary after Confirm. A pack result dock lets the pack show through, with a darker band under the destinations.
  • Home — Your daily burn is an estimate, in Buddy's voice. The old Ground Truth label is gone.
  • Recognition — Receipt, barcode, label and food no longer fall into each other. A Coop till extracts merchant, items, quantities and prices, and never invents calories. Unrecognized lines stay on review; nothing is added to Foodiary until you confirm. A REAL Turmat barcode keeps the label serving (528 kcal, 18 g protein, 420 g prepared) instead of dry weight with 0 g protein. Printed EAN OCR that quotes or inserts a digit still identifies 7036480060183. Meal vision of a pack front keeps missing protein unknown instead of 0 g. A cropped nutrition table without energy row labels does not invent kcal. The 598 kcal/100 g miss was Tesseract reading 528 as 598 next to a correct 2209 kJ (2209 kJ = 528 kcal). kJ and kcal must agree; a two-column table with only one trusted energy stays unknown; dry weight is not the prepared serving. Unreadable label fields stay null with needsReview — they are never filled from the barcode catalog.
  • Foodiary — Missing nutrition stays unknown. A till name is not a verified pack. Incomplete Open Food Facts rows stay on review. Zero calories only save when they are real (water, a verified BCAA). Every write path checks this, including the API.
  • Camera — A missed read stays in the camera. Retake reopens the live view without closing first. The miss line is the real error (including a face that is not food). Android back leaves review or the camera, not the app.
  • Camera — Live preview is snappier. The shutter keeps the full photo; orange corners are a guide, not an automatic crop. Review, retake, or crop before analysis. Alignment is red / orange / green from real sharpness, light, fill and barcode reads — not a timer.
  • Receipts — Compact Coop lines (name + price, including pack grams) are recognized. Bought food is never logged to Foodiary until you confirm. Long slips can add a second page before analysis.
  • Receipts — Line prices are checked against printed TOTAL CHF. A mismatch stays on review and is never accepted as the slip total. The Android Coop Basel soup till is three lines at CHF 10.30; the drinks slip at CHF 19.50 is a different receipt.
  • Receipts — A Coop till whose logo OCR is unreadable is still Coop when “Für mich und dich” is on the slip. Garbled Menge keeps the name and line total. Wrong OCR prices stay on review.
  • Foodiary — New rows store nutrition source, review state, verified product identity and serving basis. Older rows stay empty. Nothing is invented for history.
v0.8.160 2026-10-19
  • Meal photo — A line named only "fat" is dropped. A solid food at 0 kcal is no longer called high confidence. (Beta User Katja)
  • Quick Food — Finnish names hyphenate inside the tile. (Beta User Katja)
v0.8.159 2026-10-18
  • Beginner Foodiary — Details stay the numbers. Today's verdict and Advanced stay off. Quick Food names wrap inside the tile. (Beta User Katja)
v0.8.158 2026-10-18
  • Beginner — Phone bar is Home · Foodiary · + · Progress · More. Today and Activity desks are gone. The day lives on Home. Connected Health sits at the top of Progress. (Beta User Katja)
  • Foodiary — Drinks says Add drink, not Add food. (Beta User Katja)
v0.8.157 2026-10-14
  • Foodiary — Each meal is its own card. The header shows the meal, the calories, and the protein.
  • Foodiary — Open a meal to see the foods. Close it and the header stays. Add food sits on the header, in orange when the meal already has food.
  • Foodiary — Details open under the foods, inside the open meal.
  • Foodiary — Duplicate a meal or a food, or copy it to another day, from the meal menu.
  • Food — A name you type on the confirm screen is the name that gets saved.
v0.8.156 2026-10-09
  • Food — Confirming a food shows the name, the weight, the calories, and the protein, then says whether it can be saved.
  • Food — Save is a red Save Food button when the food is ready. If it is not, the button stays off and the screen says why.
  • Food — The confirm screen says when the food was recognised, and when it still needs a check. Protein and fiber are no longer painted green.
v0.8.155 2026-10-09
  • Home — The type box and the Voice, Photo, Scan, and other log buttons leave the Home screen. The orange + at the bottom opens them.
  • Home — The plan and credits card leaves Home. Menu → Membership is where the wallet, credit packs, and Buddy Pro live.
  • Home — Buddy's bubble says one fact at a time, like a chat: the food or the number stands out, and when it happened sits on the line under it.
v0.8.154 2026-10-09
  • Time — Choosing a time opens a small clock in the app. The Android clock no longer covers the home screen.
  • Date — Choosing a day opens the calendar in the app, not the Android date dialog.
v0.8.153 2026-10-08
  • Fasting — Last food and the fasting window both count from when you ate. A drink from 19 hours ago shows 19 hours, not just now.
  • Fasting — The fasting window shows hours and minutes since that food.
v0.8.152 2026-10-07
  • Paste — A product and its nutrition label stay one food. The calories match the amount you ate.
  • Text — Holding the box to copy or paste keeps the home screen in place.
v0.8.151 2026-10-06
  • Food — A meal you type keeps every food. One banana stays one piece, and a pack label stays on that food.
  • Saved — After three or more foods, Buddy names the first and how many more, like Beans + 3 others.
v0.8.150 2026-10-06
  • 0.8.149 did not reach beta. This build is the one that does.
  • Week — Training load says Light, Leicht, or Kevyt, and each level has a color you can see.
  • Quick Food — The tile you tap shows that it is saving. The other tiles stay usable.
v0.8.149 2026-10-06
  • Week — Training load says Light, Leicht, or Kevyt, and each level has a color you can see.
  • Quick Food — The tile you tap shows that it is saving. The other tiles stay usable.
v0.8.148 2026-10-05
  • Scan — A pack photo shows which step you are on, the picture you just took, and crops to the orange frame.
v0.8.147 2026-10-05
  • Scan — When Buddy doesn't know a pack, shoot the product and then the nutrition label to add it.
v0.8.146 2026-10-04
  • Settings — Sam's phone opens Mission Control from Settings. Other accounts do not see it.
v0.8.145 2026-10-04
  • App — Home, Foodiary, and the phone stay as they were in 0.8.144.
v0.8.144 2026-10-04
  • 0.8.143 did not reach beta. This build is the one that does.
  • Language — German and Finnish screens use the app language for buttons, errors, and labels that were still in English.
  • Meal photo — A plate is named in your language. The meal reader no longer runs the pack-label reader first, which is what made iPhone photos time out before the picture was read.
  • Saved — Water, weight, and food on Home use the same short confirmation, centered on the screen.
v0.8.143 2026-10-04
  • Language — German and Finnish screens use the app language for buttons, errors, and labels that were still in English.
  • Meal photo — A plate is named in your language. The meal reader no longer runs the pack-label reader first, which is what made iPhone photos time out before the picture was read.
  • Saved — Water, weight, and food on Home use the same short confirmation, centered on the screen.
v0.8.142 2026-10-02
  • My Body — Android can read a Beurer BF1000 weigh-in and show fat and muscle on the figure. Create again starts a new twin. The figure is cropped to the person, and the labels point at the arms, torso, and legs.
  • Use this crop stays on screen with a timer until the photo is saved.
  • The cutout worker has enough memory to finish all four views.
v0.8.141 2026-10-01
  • Membership — The plan, wallet, credit packs, Buddy Pro, purchase history, and billing history are on one screen. Credits, Buddy Pro, and Billing links open Membership.
  • After a payment, Membership reloads and names what was added. Home shows the plan, the credits, and the renewal date.
  • A meal photo stays with the food reader, and a receipt stays with the receipt reader.
  • A food match keeps the food and how it was prepared together.
v0.8.140 2026-09-30
  • Library — On Home, Library opens a photo already on the phone. Photo stays the camera, Scan a pack, Receipt a grocery slip.
  • Home help — The ? tour explains Voice, Photo, Library, Scan, Text, Receipt, Water, Weight, and Activity in English, German, and Finnish.
v0.8.139 2026-09-29
  • Schnitzel Pommes (Snipo) — Schnitzel Pommes, Snipo, Schnitzel mit Pommes, and Schnitzel und Pommes log a breaded schnitzel (180 g) and a portion of fries, instead of fries alone.
v0.8.138 2026-09-29
  • My Body explorer (Admin only) is on this build — The likeness sits between the top bar and the tabs. Whole-body fat, water, and bone stay the scale readings. Arms, legs, torso, and visceral say Coming soon. Beta testers and Normal do not see My Body.
v0.8.137 2026-09-29
  • My Body explorer (Admin only) — The likeness sits between the top bar and the tabs. Whole-body fat, water, and bone stay the scale readings. Arms, legs, torso, and visceral say Coming soon. Beta testers and Normal do not see My Body.
v0.8.136 2026-09-26
  • Receipt chip → live camera with receipt OCR — Receipt no longer opens a file picker only; live shutter keeps source=receipt (live capture no longer overwrites Receipt/Barcode source back to meal).
v0.8.135 2026-09-26
  • Progress time range menu restored — 7D / 14D / 30D / 1Y (+ custom) sits on Progress again (not buried inside collapsed My Body). My Body detail scopes are Today / Week / Month / Year / Since Start and stay visible even with one reading.
v0.8.134 2026-09-26
  • Meal camera receipt → pack passport — ALDI/COOP PLU crumbs and tall slip photos now force the receipt OCR pipeline (multi-line items) instead of meal vision inventing a single “Bio Quark” pack. Overlay copy says receipt lines when ≥2 foods.
v0.8.133 2026-09-26
  • Android photo scan CapHttp multipart — FormData → native dataType: formData + base64File (fixes 400 image file required from String(FormData), and 200 HTML → Invalid server response from WebView/html5mode bypass).
v0.8.132 2026-09-26
  • Native photo/receipt scan → 400 image file required — CapHttp (0.8.129) stringified FormData ([object FormData]), so multer never saw the file. Multipart uploads now bypass CapHttp and keep real FormData.
v0.8.131 2026-09-26
  • More → Install / Get the App always visible — Yellow install rows no longer hide in Beginner mode. New beta invitees (default Beginner) can reach Android/iPhone install from More immediately.
v0.8.130 2026-09-26
  • Progress → My Body (Body Composition Slice 0) — Metric cards for weight, body fat %, body water, bone mass, lean mass (when present), and BMR inside Progress (not a standalone hub). Tap opens detail with Today/Week/Month/Year/Since Start, sparkline, highest/lowest/average, all readings kept, and provenance on every value. Home +Weight deep-links to Progress → My Body. Newest reading is the hero (presentation only); measurements stay immutable. Health Connect sync attaches origin/device when Metadata provides them.
v0.8.129 2026-09-25
  • Android Health Connect → Progress weight — CapHttp for /api (no more HTML-as-JSON); after HC Sync, timeline hydrate + Progress/summary forceNetwork so Classic Progress shows scale weight (e.g. 113.4 kg) without restart. HC permission rationale category corrected; weight read always requested.
v0.8.128 2026-09-25
  • Ship scale-weight fix to beta — Home LAST Weight prefers Connected Health scale (incl. Google Fit); Activity prefs test matches GF default-on.
v0.8.127 2026-09-25
  • Home LAST Weight prefers scale — Connected Health hub weight (Google Fit / Health Connect / Apple Health) wins over diary carry-forward. Google Fit WEIGHT also feeds My Body; GF on by default on Activity.
v0.8.126 2026-09-25
  • TEMP [HC-DEBUG] — Health Connect sync pipeline instrumentation (client + /upload + ingestHubUpload + DB proof). Remove after one real Android Sync proves the first NO.
v0.8.125 2026-09-25
  • Home LAST Weight from Connected Health — Scale weight from Health Connect / Apple Health / Google Fit timeline updates Home LAST Weight, Progress, and Activity (not diary-only). Prefer today's weigh-in on the Home strip.
v0.8.124 2026-09-25
  • My Body on Progress + Activity — Connected Health weight and body composition (fat · lean · water · bone · BMR when present) after Sync. Scale weigh-ins join the Progress weight chart. Health Connect on by default on Activity.
v0.8.123 2026-09-25
  • Connected Health v1 — Native Android Health Connect hub; normalized body composition (body water, bone mass, BMR); BF1000 certification protocol prepared (device proof PENDING). No BLE.
v0.8.122 2026-09-25
  • Home Fat Burn meter — Today's Health on mobile Home shows fat-burn probability (%) again instead of Ground Truth YOUR BURN (kcal/day). Burn O'Meter stays elsewhere.
v0.8.121 2026-09-25
  • Beta paste link every reopen (Katja · TF-78) — Instant Startup forgot the invite key in flaky WebView localStorage. Key now dual-writes Capacitor Preferences + localStorage and hydrates before first paint so Home restores without pasting again.
v0.8.120 2026-09-24
  • Spaces Mode chip buried Home — Mode switch removed from Spaces list / Space interiors (footer overlay). Change Mode on Buddy Home only; Spaces footer shows Home again.
v0.8.119 2026-09-24
  • ONE product chrome — same Buddy footer on Spaces (list + inside a Space); Space tabs (Home · Wall · Challenges · Progress · People) live in the Space page, not a second fixed footer.
  • Home Burn O'Meter restored — Today’s Health uses the real Burn O'Meter again (not a stub “Your burn” ring).
  • Mode chip position — Mode / Power chip no longer covers the Home tab.
v0.8.118 2026-09-24
  • Aktiv-Kal after Sync shows empty today — wearable sync wrote Oura to Postgres but UI re-read stale SQLite; Sync/refresh force-hydrates timeline before paint.
v0.8.117 2026-09-24
  • Camera/Water/Weight/Cart strip under Foodiary header — gone. Bottom + / Add food own capture (was re-docked Foodiary-only in 0.8.115; wrong).
  • Aktiv-Kal empty day EN under FI (Beta User Katja · TF-70) — day empty copy uses activityCal.emptyDay; FI/DE sync chip KAIKKI / ALLE.
  • Double Buddy on iPad Classic (Beta User Katja · TF-71) — float chat widget ≥1200px only; return-to-Buddy FAB below that — never both.
  • Foodiary opens at bottom on iPad (Beta User Katja · TF-73) — clock meal still highlights; no auto-scroll on open (Home Done deep-link still scrolls).
  • Meal photo of barcode → “Could not detect food” (Beta User Katja · TF-76) — when meal vision fails, OCR GTIN still opens pack passport.
  • iPad Home/Foodiary too narrow (Beta User Katja · TF-72) — stage / Foodiary desktop max-width 56rem (was 40–42rem).
  • beta kcal-api HPA fake scale — CPU request 100m → 500m; HPA minReplicas 2 (boot/OCR no longer looks like 300%+).
v0.8.116 2026-09-24
  • Foodiary double + FAB on phone — hide progressive corner + on compact/mobile; center nav + / Add food / capture strip stay.
v0.8.115 2026-09-24
  • Mobile capture strip on every tab — Camera / Water / Weight / Cart docks only on Foodiary (gone from Progress / Activity / Meal Plan).
  • iPhone grey scrollbar gutter — hide permanent scrollbar track on mobile main scroll.
v0.8.114 2026-09-24
  • Create Quick Meal — pick which foods from the current meal (checkboxes; can’t drop the last item); no more one-tap dump-all.
  • Create Quick Meal runSync timeout — meal-template capture/list is async Postgres (mutex bypass); local Quick Meal still saves if template sync fails.
  • Quick Meal regression tests — idiot-proof FE + SQLite capture suites (blank name / empty / water-only / subset pick).
  • Beta users roster — docs/product/BETA-USERS.md (profiles, TF totals, how to refresh from ASC / Admin).
v0.8.113 2026-09-24
  • ALDI receipt soft rows — soft OCR PLU matches stay on aldi_simple grammar rule (fixes backend tsc / image build).
v0.8.112 2026-09-24
  • Confirm Saved flash test — celebrate copy asserts “Thanks for logging!” / 5s close (matches current Confirm UX).
v0.8.111 2026-09-24
  • Foodiary meal macro chips — “good” chip labels use ink (not green text) so desk readability audit stays green for CI.
v0.8.110 2026-09-24
  • Receipt scanner (CH-DE SPAR / ALDI / COOP) — product-ledger area first; soft OCR row grammar (3-decimal prices, ALDI PLU/VAT noise, COOP column mush); deterministic OCR cleanup. Live JPEG fixtures score 100% on parse checks.
  • Magerquark / magequark macros — curated lean Aldi-style macros beat Food Bank / diary poison on Confirm and save (preferOverBank); implausible kcal/fat/sugar>carbs rows re-resolve.
  • Confirm meal-frame guidance — outer meal background follows overall protein/fiber vs sugar/fat ratio (green / slate / orange); each food keeps its own border tone.
  • Confirm food-frame tone — each food row border signals good (protein/fiber) vs watch (sugar/fat) via a simple ratio; green / slate / orange borders.
  • Confirm chrome — full-bleed Confirm (no floating gutters); food+details block highlighted; fewer colors (orange primary, quiet secondary — no green Add food / pink Cancel stack).
  • Confirm + footer chrome — rounded corners only on action buttons (Save / Add food / Cancel / Remove / +). Confirm card, fields, meal chips, and bottom nav are square; Confirm + footer use the screen width with a small side inset.
  • Confirm + Add food forgot / mashed the previous food — keep prior Confirm rows as structured edits; parse only the newly typed/scanned food and append. No more re-serializing macros into text (e.g. “magequark…raspberries 100 g”).
  • Local npm run dev — rebuild better-sqlite3 when Node ABI mismatches; single API supervisor lock (no more kill-loop on :3041); metrics optional locally (KCAL_METRICS_PORT=0).
  • Buddy voice console spam on Home load — boot only HTTP-prewarms the agent; LiveKit/AudioContext wait for mic/gesture (stops Chrome NotAllowedError / AudioContext autoplay noise).
  • Create Quick Food Meal (Foodiary) — one CTA above the day: pick Breakfast / Lunch / Dinner / Snack / Drink / Whole day, name it, save to My meals (Quick Food). Single-meal scope also captures a meal template.
  • Quick Food from Confirm / meal totals — save celebrate flash; Lunch (and other meals) can create a Quick Food meal from logged rows.
  • Quick Food from repeating Foodiary combos (helpers) — fingerprint meal slots (e.g. quark+berries+EAA) and detect ≥3-day repeats for a “save as Quick Food” suggestion. UI wiring next on this branch.
v0.8.109 2026-09-23
  • Instant Startup (native RC) — kCal Buddy boots from bundled APK/IPA assets (no server.url download). Latest local SQLite data paints Home immediately; auth · Outbox push · delta Pull · health · Spaces · OTA run after first paint. Poor network no longer delays cold start. Known limits: OTA applies on the next launch; first install still needs the store download; background sync still needs connectivity.
  • Instant native startup — Capacitor no longer loads https://beta.kcal.lol on cold start. APK/IPA boots from bundled HTML/JS/CSS; SQLite + last session paint Home first; sync/capabilities/OTA check run after first paint. Network is off the critical path.
v0.8.108 2026-09-23
  • CI — Buddy diary Hydrate credentials assertion — regression test only checks diary Hydrate fetches for credentials:include (background sync may call fetch without an init). Unblocks Spaces beta image build after v0.8.107.
v0.8.107 2026-09-23
  • Spaces → beta (release candidate) — Ship Spaces on beta for family invite · join · Wall · Kludos · return. Honest known limits (local-first Kludos/Wall sync, private sharing, invitation-only, no Coach Desk). Beta instructions + verification: [docs/product/SPACES-RELEASE-CANDIDATE.md](./docs/product/SPACES-RELEASE-CANDIDATE.md). Help Spaces page lists beta limitations. No new features.
  • Spaces Family Pilot (RC) — human-behavior protocol + empty results log for Katja / Dominic / Silke / friends. Decision pending real sessions: [docs/product/SPACES-FAMILY-PILOT.md](./docs/product/SPACES-FAMILY-PILOT.md) · [docs/product/SPACES-PILOT-RESULTS.md](./docs/product/SPACES-PILOT-RESULTS.md). No new features.
  • Spaces Family Pilot — observation protocol + cold-path friction fixes (pending-join resume, keep invite token until join succeeds, consent nudge, post feedback, clearer landing). No new features. SSOT: [docs/product/SPACES-FAMILY-PILOT.md](./docs/product/SPACES-FAMILY-PILOT.md).
  • Spaces Sprint 1 — invite-family polish — family-first list empty/loading, create→auto-share beat, solo Home/People invite billboards, join consent before share prefs, warmer Wall empty state, Buddy Home glance i18n. Product quality only — no platform/sync/auth changes.
  • Product Era — platform locked; engineering builds products only (Spaces → Connected Health → Universal Input → Barcode Hunt → Coach Desk → Marketplace). SSOT: [docs/product/PRODUCT-ERA.md](./docs/product/PRODUCT-ERA.md). Cursor rule: .cursor/rules/product-era.mdc.
  • Product cleanup — remove true platform bypasses — Spartan plan, Quick Add, Food Search, Generate Plan, Meal Bubble, My Meals, bowls/recipes/meal-plan writes go through persistFoodiaryUpsert → SQLite + Outbox for invite keys. Cursor-aware day loads in UserView / FoodiaryDayEditor. Invite profile mirrors profileRepository. Audit now lists only accepted-v1: [docs/engineering/PLATFORM-BYPASS-AUDIT.md](./docs/engineering/PLATFORM-BYPASS-AUDIT.md).
  • Platform Law — binding rule: products extend platforms (Local-first Sync, repositories, auth, design system, Buddy Constitution, Progressive Modes); never replace or bypass. Audit list: [docs/engineering/PLATFORM-LAW.md](./docs/engineering/PLATFORM-LAW.md) · [docs/engineering/PLATFORM-BYPASS-AUDIT.md](./docs/engineering/PLATFORM-BYPASS-AUDIT.md).
  • Local-first Sync v1.0 — FROZEN — platform certified: [docs/engineering/LOCAL-FIRST-SYNC-CERTIFICATION.md](./docs/engineering/LOCAL-FIRST-SYNC-CERTIFICATION.md). No further sync architecture phases; products extend the repository → SQLite → Sync Engine path. Final hardening: invite entries Hydrate-only (no Vue GET paint), plan modal + Method timeline via repositories.
  • Local-first sync — Phase 5 app rollout — personal diary UI (Home, Foodiary, Activity, Weight, Timeline, Buddy memory, health display, Stock list, Shopping batches) paints from repositories → SQLite first; network only via Hydrate / Sync Engine / server-only ops. Schema v5 adds Stock + Shopping caches (hydrate-only). SSOT: [docs/architecture/LOCAL-FIRST-SYNC.md](./docs/architecture/LOCAL-FIRST-SYNC.md).
  • Local-first sync — Phase 4 timeline window + observability — hot Foodiary (180d) / timeline (90d) window with automatic prune, on-demand history days, quiet VACUUM/ANALYZE/integrity maintenance, sync metrics, and a hidden /ops/sync developer diagnostics page. Outbox/Cursor/Pull protocol unchanged. SSOT: [docs/architecture/LOCAL-FIRST-SYNC.md](./docs/architecture/LOCAL-FIRST-SYNC.md).
  • Local-first sync — Phase 3 Cursor + delta Pull — after one Hydrate, devices exchange only changes via GET /api/:accessKey/sync?since=<Cursor>&limit=500. Background Sync Engine Push-then-Pulls quietly; Cursor advances only after a successful SQLite page txn. No conflict UI yet (Phase 4+). SSOT: [docs/architecture/LOCAL-FIRST-SYNC.md](./docs/architecture/LOCAL-FIRST-SYNC.md).
  • Local-first sync — Phase 2 Outbox + Push — Foodiary writes commit to SQLite first, enqueue a clientMutationId Mutation, and drain via POST /api/:accessKey/sync/push with exponential backoff + exactly-once server acks. Airplane / kill / reopen keeps meals; reconnect pushes once. SSOT: [docs/architecture/LOCAL-FIRST-SYNC.md](./docs/architecture/LOCAL-FIRST-SYNC.md).
  • Local-first sync — Phase 1 foundation — on-device SQLite replica (frontend/src/sync/), repositories (Foodiary / Entries / Timeline / Profile), and Hydrate from existing APIs. Home + Foodiary paint from SQLite first; background Hydrate refreshes the replica. SSOT: [docs/architecture/LOCAL-FIRST-SYNC.md](./docs/architecture/LOCAL-FIRST-SYNC.md).
  • Local-first sync architecture (docs) — device SQLite + sync after login for instant Home/Foodiary: [docs/architecture/LOCAL-FIRST-SYNC.md](./docs/architecture/LOCAL-FIRST-SYNC.md).
v0.8.106 2026-09-23
  • Local Vite port :5200 — kcal UI uses :5200 (not :5173 / not macOS AirPlay :5000). Admin: http://127.0.0.1:5200/#/admin. API stays :3041 · Sam sync :3998.
  • Camera Auto / Tap for barcode & QR — live camera has Auto · Tap chips: Auto freezes when a barcode/QR is recognized; Tap waits for the shutter. Choice is remembered. Shopping defaults Auto; meal camera defaults Tap (TF-67).
  • Foodiary ENERGY by Day / Week / Month — ENERGY totals follow the calendar scope: day totals for Day view; week-so-far of the full Mon–Sun week; month-so-far of the calendar month. Remaining and protein goals use the full period budget.
  • Laptop Activity / Settings “forgot” the user (Sam) — sidebar Activity, Foodiary, and Settings stayed in Buddy First instead of ejecting to Classic UserView onboarding (Set up your personal profile). Progress already stayed; those three now match.
v0.8.105 2026-09-22
  • Camera lock / freeze (Beta User Katja · TF-67/69 · Beta User Dominic · TF-68) — Home meal camera is shutter-first again (no continuous auto-lock). Shopping list keeps live barcode scan. Live hits need a real GTIN checksum; ZBar downscales so iPhone does not freeze after ~1s.
v0.8.104 2026-09-21
  • Camera lock (Beta User Katja) — barcodes and QR still lock automatically. Food and nutrition-label photos wait for your tap (no auto-shutter).
v0.8.103 2026-09-19
  • Foodiary Modify date (Sam) — Change date is Today / Yesterday, day arrows, and our own month grid. Native Android/iOS calendars are gone (0.8.102 CSS isolation still painted a broken system picker).
v0.8.102 2026-09-19
  • Help front page — join the beta — https://help.kcal.lol now starts with how to request access on kcal.lol, open the invite, set a PIN, then Get the App. Same invitation-only path as the product. Android phones see the APK download first (highly recommended); iPhone sees the TestFlight path. Desktop shows both.
  • Get the App — one phone — /download hides the other OS card when it can tell Android from iPhone.
  • Help in Finnish — FI is live in the language switcher. Help, Academy, and the Home tour are proper Finnish (product names stay kCal Buddy, Foodiary, Spaces, Buddy).
  • Foodiary date picker on Android (Sam) — changing a food’s eaten day no longer opens an unformatted native calendar (it was inheriting Buddy transparent background + tiny type, same class of bug as Move items). System date/time choosers stay system widgets.
  • Camera pauses iPhone radio (Beta User Katja · TF-65) — live scan now mixes with other audio (mixWithOthers) and restores ambient when the camera closes, so internet radio / Music can keep playing.
  • Lunch saved as breakfast (Beta User Katja · TF-66) — adding food under Lunch stays Lunch even if the time field still had a breakfast clock.
v0.8.101 2026-09-18
  • Foodiary Move items target (Sam) — destination is meal-name chips (Breakfast / Dinner), not Android’s native picker that painted giant Buddy on orange. Move items is a visible chip on every meal that has food, including Beginner (was Power-only, so desktop mobile sim often hid it).
v0.8.100 2026-09-18
  • Confirm + Add food from Scan (Sam) — scanning after Confirm + Add food returns to Confirm with both foods, not the type box. Same path as typing. Photo from that button does the same.
  • Foodiary Modify calendar (Beta User Aki · TF-63) — Modify focuses grams, not the date, so iPhone no longer pops the calendar first.
  • Foodiary Modify count — eggs and other piece foods get 1 · 2 · 3 · 4 chips (1 egg → 2 is 50 g → 100 g). Macros still scale from the existing amount.
v0.8.99 2026-09-18
  • Photo of a drink can (Beta User Katja · TF-58) — Camera vision now treats branded cans/bottles as loggable (e.g. Hartwall Vichy), not “not food”. Same Capture path. Scan the barcode on the back when the front has no bars.
  • Footer Mode chip (Beta User Katja · TF-61) — chip says Mode / Modus / Tila, not PX. Same Experience Mode switch.
  • Home ? help on iPhone (Beta User Katja · TF-62) — BACK / CONTINUE and tip labels stay below the status bar so they are not hidden under the clock.
v0.8.98 2026-09-17
  • Google Fit 400 on Home — Activity daily sync no longer POSTs /integrations/google/sync when the Google grant is ERROR / expired / connecting (not live). That was a red console 400; Home food logging does not talk to Google.
v0.8.97 2026-09-17
  • Home DE copy (Beta User screenshots) — Today’s Health Mehr › instead of English Details; leftover burn pill Formel not Formula; Next (“Als Nächstes”) follows DE/FI (water was “Drink one glass of water.”). Same coach engine, no new product.
  • Dominik Next — for Beta User Dominik, Next randomly mixes in “Drink eine Schnapseli! ;-)” and “You're sexy and you know it! ;-)”.
v0.8.96 2026-09-17
  • Home leftover pills — protein leftover text is navy (readability audit), not mint green.
v0.8.95 2026-09-17
  • Home text + footer + — tapping the field or + lifts the Universal Input card to the top (keyboard stays at the bottom) and shows live Foodiary + food-bank search under the box. Same Buddy parse as before. The type field is a little inset from the method row — wide, not edge-to-edge.
  • Home Today’s Health — larger rings with the live number inside and leftover pills. Same calories · protein · fiber · water · drinks · burn. Tap still opens Today. No script labels on the rings.
  • Home add food → Confirm — typing/send on Universal Input opens the Confirm page (BuddyConfirmCard) again. Food drafts stay in-flow; they no longer vanish into the compose popup. The orange → add button stays visible on the right of the type box (bright when there is text). Confirm + Add food reopens that same type box (not a blank row); send still returns to Confirm. Confirm itself is tighter (4-up macros, date on one line).
  • Saved flash — quieter: navy check, no green “Nice!”, no orange countdown. Glance leftover pills use todayStatus.kcalLeft (was crashing on today.kcalLeft). Script “Keep going / Beast” labels are gone; the tagline is normal type.
v0.8.94 2026-09-17
  • Spaces empty title (Beta User Katja · TF-57) — FI no longer says Aseta ensimmäinen tiili (reads as a typo for *tili*). Empty card is Create your first Space / Erstelle deinen ersten Space / Luo ensimmäinen Space. Brick stays on the slogan only.
v0.8.93 2026-09-17
  • Home ? help — dummy-proof: two tips with arrows. BACK / CONTINUE sit on frosted 50% black glass next to the tips, with a drag handle and Drag to move. Last wave is Click here to CLOSE.
v0.8.92 2026-09-16
  • Buddy Voice on beta — worker was looping runner initialization timed out then killing Sam’s session with an unrecoverable OpenAI STT error. LiveKit start was pre-warming idle jobs from host CPU count inside a 500m/768Mi cgroup. Cap idle children at 1, give init 30s, restore beta CPU/memory.
  • Docs / Help Spaces — Coach Desk is not started (v0.9.x, no nav). Easy 5-day challenge rungs are live; testers use Spaces on beta.kcal.lol.
  • Buddy phone footer — Home · Today · Foodiary · + · Activity · Progress · More in Beginner, Standard, and Power. Spaces is in More. More opens above the bar so the footer stays visible. Inside a Space the footer stays Home · Wall · Challenges · Progress · People.
  • Buddy phone header — Standard and Power use the same full-width top bar as Beginner (edge to edge).
v0.8.91 2026-09-16
  • Home Today’s Health — charts stay on top; Last and Next sit in their own strip with those labels, so the latest log and coach step are not unlabeled text.
v0.8.90 2026-09-16
  • Universal Input Home — Home is one “What would you like to log today?” card (Voice · Photo · Scan · Text · Receipt). Buddy footer is Home · Today · + · Foodiary · More — including My Spaces / Create / Join. The + expands the composer on the current screen (tap again to close) and does not switch pages. On Home, + keeps the Today peek above the sheet. Compact Today’s Health under the log (calories · protein · fiber · water rings + drinks · burn) opens Today for the expandable table — not a second dashboard. Today’s Health, Daily Task List, and the old Home dashboard live on Today. Inside a Space the footer stays Home · Wall · Challenges · Progress · People. Same Buddy parser and confirm — not a second Foodiary.
  • Phone /u/sam — same Buddy Home as /u/sam/home (and ?focus=log). The Classic dashboard stays a laptop view.
  • Footer coach — + and PX pulse once a few seconds after load with a short hint (once per session, at most every 12 hours). Opening + / PX / More dismisses it.
v0.8.89 2026-09-16
  • Spaces Challenges — easy 5-day rungs are live (Wall, Kludos, show up, water, a walk). One current stretch, derived from real posts — not Coming soon.
  • Beta Testers vol 1.0 — the public crew on My Spaces uses that name (was kcal Beta Testers).
  • Spaces faces — photos no longer wear a leftover initials pill (the extra “SA” on Sam).
v0.8.88 2026-09-15
  • Spaces Wall — Share a moment is a dropdown so the compose card stays short. On the phone it opens the system picker. Your written post shows first under Post to Wall.
v0.8.87 2026-09-15
  • Spaces Back on the phone — no longer sits in the status bar (clock / battery). Same top inset as Buddy.
v0.8.86 2026-09-15
  • Spaces on beta.kcal.lol — same crew as testers already use for Buddy. Menu → Spaces. spaces.kcal.lol stays the prod-ready host. Voice stays on the beta worker (not the spaces.kcal.lol worker).
v0.8.85 2026-09-15
  • Spaces v3 on spaces.kcal.lol — testers join kcal Beta Testers from My Spaces (public, 14-day honest logging) or create one Space and invite people they know. Home · Wall · Challenges · Progress · People + Settings gear. Nothing shared automatically. Calories, weight, and Foodiary stay off.
  • Spaces in English, German, and Finnish — product names stay English (Spaces, Space, Buddy, Foodiary, Coach, Kludos).
  • Spaces feel like a crew — 8-bit header, Public or Private (Coach coming soon), join explains meaning and share checkboxes, Wall/Kludos sync across devices. You create one Space; you can join many.
v0.8.84 2026-09-14
  • Foodiary kcal for dl/ml logs (Beta User Katja · TF-55) — “3 dl yogurt” no longer stores 100 g · 1000 kcal. Buddy peels ml/dl from the name (1 ml ≈ 1 g), looks up greek/turkish yogurt · oats · lingonberry, and never logs the USDA 1000 kcal/100g clamp as a real food. Re-log the bowl to correct today’s row.
v0.8.83 2026-09-14
  • Home host — Buddy is back to the 0.8.81 host. Camera is the orange chip again, not a plate over his feet.
v0.8.82 2026-09-14
  • Foodiary time-travels like Aktiv-Kal — the tiny ‹ › bar is gone. Same Day / Week / Month, same week strip, same Today, same gear. Flip back to last Tuesday the way you already do on Activity. No second picker. Future days stay locked. Meals stay meals — no “Kein Training” dump.
  • Buddy is the host again — Home header spans the full width of the sun timeline. Buddy is large, happy, and sits on Camera so you can actually see him.
v0.8.81 2026-09-13
  • Pack card from one scan — barcode, QR, printed EAN, or label text all open the same pack. Choose Eat (Foodiary), Remember (Quick Food), Have (Stock), or Buy (shopping list). Scan next keeps the camera up. Nothing is written until you pick.
  • Eat from a pack — Confirm uses the pack’s macros (protein/fat/carbs for the pack grams), not a re-parsed sentence.
  • Buddy is the host — Home header and toolbox are one card. Larger Buddy, a short greeting, then Camera (orange hero) · Water · Weight · Cart as quiet chips. Camera’s method list is Camera · Photo · Receipt / File · Text input · Voice (A–Z). Protein / fiber / water / drinks keep the color on the dashboard.
  • Cart scan — From your scans has Scan with Camera on the list. Same pack overlay as Home; Buy adds the pack here.
  • Burn copy follows language — Formula / Observed / Ground Truth labels, lock reasons, and signals follow FI / DE / EN instead of staying English.
  • Help Home maps — help.kcal.lol front page explains the mobile Home screen for Beginner, Standard, and Power User.
v0.8.80 2026-09-13
  • Activity Cal source chips — OU / ST / PO / GF / AH / ALL paint from the last Health Sources snapshot instead of waiting on status HTTP. Apple Health status no longer 500s (nested Postgres runSync); a failed status check keeps the chip if you already have Apple Health rows.
  • Help Release Notes — public notes are tester-facing only (operator / Admin CHANGELOG lines stay off help.kcal.lol).
v0.8.79 2026-09-13
  • Activity Cal — Apple Health is an AH chip on the same row as OU/ST/PO/GF/ALL. Tap AH (or ALL) to HealthKit Sync now from the iPhone app. The chip was missing when only Apple Health was connected.
v0.8.78 2026-09-12
  • Activity Cal sync chips — one row OU ST PO GF ALL. Tap a code to sync only that source; ALL syncs every connected wearable. If nothing synced yet today, opening Activity Cal runs Sync all once.
  • Wearable sync timeout — Oura / Polar / Strava / Google Fit pulls wait 90s instead of aborting at 20s (14-day Oura often needs more than 20s).
  • Oura / photo “fetch failed” — CoreDNS was still forwarding to Tailscale DNS (100.100.100.100) after the node logged out of Tailscale, so every outbound API call from pods failed (EAI_AGAIN). Restarted CoreDNS onto ISP DNS. Same break crashed kcal-api via Tesseract (Katja TF-52 HTTP 502).
  • TF-52 meal photo 502 copy — camera overlay no longer shows raw HTTP 502; Tesseract worker fetch deaths no longer kill the API process.
  • TF-53 BT speaker on launch — iOS no longer setActive(true) on cold launch or after Voice release (Beta User Katja).
v0.8.77 2026-09-11
  • Photograph label waits for focus — unknown barcode → Photograph label no longer snaps the blurry barcode frame. Live camera stays up until the nutrition label is in view and sharp (same wait idea as Continue scanning).
v0.8.75 2026-09-11
  • The Method “Not today” — snoozes the current lesson until tomorrow instead of jumping to the next one, and shows an error if skip fails (Beta User Dominic · TF-51). German Day 5 is confidence (not movement).
  • Apple Health on Aktiv-Kal — sleep, daily steps, active energy, and workouts from a successful HealthKit sync now show on the week (not the heart-rate sample flood). Sync already worked for Dominic; the calendar did not.
v0.8.74 2026-09-11
  • Foodiary meal editor — every stored number on a meal item is editable: grams, kcal, protein, carbs, fat, fiber, sugar, sat fat, and sodium. Save keeps them (edit used to drop fiber / sugar / sat / sodium). Leu · TEF · Spartan still follow those macros live.
v0.8.73 2026-09-11
  • Hide invite Access key on phone — the full kcl_… key wrapped over Sign out on iPhone Home and looked like an error (Beta User Katja · TF-49).
  • Getting Started first meal sticks — any logged meal (not only today) checks step 2; server account state no longer drops that flag (Beta User Aki · TF-50).
v0.8.72 2026-09-11
  • Power Home last-meal / fat-burn strip — Last meal · Now (digesting / burning fat / fasting) · Next. Power User PX only.
  • Fuel Gauge is Power User PX only — hidden for Beginner and Standard (Home, Foodiary, Progress, Today, desktop).
  • Power Home fuel mix — Last · Now · Next includes a Fuel Gauge mix bar (body fat / carbs / protein) from the food log. Estimate, not a lab reading.
  • Power Home fat-burn meter — leftover meal energy vs time, from gastric emptying of the last meal (size + clock). Fat-leaning rises as digestion winds down. Estimate, not a lab RER reading.
  • Drinks tile shows 0.0 L / 0 kcal — liquids get volume + energy, like Water’s litres. Empty is zeros, not a dash.
  • Power Home fat-burn copy — guess from last meal size + time; a full bar is HIGH!, not a fake 100% mix legend.
  • Hide Still digesting 0 kcal — empty tank is the fat-burn headline, not a leftover of zero.
  • Log meal followed Foodiary day — opening Add on Thursday no longer silently writes Lunch to Today. Composer follows the day on screen (Today / Yesterday / calendar are back).
  • Saved flash — shows the date it was saved to, kCal Buddy branding, and closes in 3 seconds.
  • Juomat + Add opens Buddy — milk coffee (maitokahvi) was hitting the blank kcal form and a “pick a known food name” warning. Same Buddy text path as meals so macros fill (Beta User Katja · TF-47).
  • Apple Health Connected then Not connected — HealthKit connect + sync worked (no OAuth tokens). Public connected required tokens, so the card flipped off after the Connected flash (Beta User Silke · TF-48).
v0.8.71 2026-09-11
  • Activity + Add closes on date change — tapping another day (or prev/next week) dismisses the add-training form instead of silently saving to the new date (Beta User Aki).
  • Apple Health permission timed out — Connect reached HealthKit, then JS killed the wait after 90s while Apple’s sheet was still open (or the WK reply was dropped). Connect now uses the native plugin and waits for Allow / Don’t Allow. Do not leave the Apple list until you tap Allow.
v0.8.70 2026-09-11
  • Apple Health on TestFlight — Connect showed "KcalHealthKit" plugin is not implemented on ios (Beta User Silke, Katja, Dominic). Capacitor 7 never registered App-target plugins; a {native:true} stub also had no HealthKit methods. Next Archive registers KcalHealthKit and installs a WK kcalHealthKit bridge so Connect reaches the Apple Health sheet even if Capacitor export fails. Needs a new TestFlight — web refresh cannot fix this.
  • Getting Started stays after logging — “Erste Schritte” treated first meal as *today only*, so the card came back. First meal now sticks (Beta User Dominic).
  • Quick food macros — Add quick food can save carbs, fat, and fiber, not only protein (Beta User Aki).
v0.8.69 2026-09-11
  • Shopping list thumbs — higher-protein packs use kcal orange (not mint green) so Home stays readable.
v0.8.68 2026-09-11
  • Camera scan mask — food/receipt camera now wears the kcal.lol viewfinder (big orange wordmark + corner brackets). Branding only; still Buddy Vision, not a Scan tab.
  • Live barcode overlay — point the camera; a barcode is read on-device and the product card slides over the live picture. Shutter stays for meals and unknown packs. Nothing is saved until you confirm.
  • Barcode GTIN + Open Food Facts — 13/14-digit codes (extra zeros, GTIN-14) are normalized before lookup. If our verified catalog misses, Open Food Facts fills the overlay (not advertised; never Verified). Photographing a pack keeps the still on the kcal.lol camera with values on the picture; Confirm still comes before Foodiary. Live barcode uses Android’s detector when it works; iPhone / Safari (no BarcodeDetector) decode the same camera with ZBar WASM — shutter stays as backup.
  • Scan pack card — protein-density ticks + graphic kcal/P/C/F/sugar meters (protein green, fuel orange, sugar red). Add to shopping list + Scan next. After Add, View list opens the list. Menu → Shopping Lists is always there (Beginner included). List lives on this phone.
  • Shopping list yield — the list totals kcal / protein / carbs / fat / sugar from pack size (cup, pouch), not per 100 g. Aim at ~100 g protein by scanning until the number lands. Pack size unknown → 100 g. Pointing the camera at a pack already on the list backfills missing macros. TEF on the basket (digest heat — protein-heavy lists burn more).
  • Shopping list lines — text rows (name + yield), light. Totals stay at the top with the same meters, also light. − / + changes how many packs; minus below 1 removes the line. A thumb (up / sideways / down) is the same protein score as the camera card.
  • Log bar — full-width frost strip (see Home through it), sharp corners. Camera / photos / voice / water stay in the row. Chevron opens Weight and Shopping Lists as a solid menu over Home (does not push the page down).
v0.8.67 2026-09-10
  • Polar Sync all 400 — Connect stored the Polar grant, but Sync died because Polar was not wired into the health sync layer. Sync Polar / Sync all can import now.
v0.8.66 2026-09-10
  • Activity Sync all — lives on its own row under the source chips. Sharing that row shoved the button and menu off the phone.
v0.8.65 2026-09-10
  • Polar on Activity Cal — Connected Polar Flow now appears in source chips and Sync all (that row was still Oura / Strava / Google Fit only). Connect still needs Sync to import rows.
  • Activity source chips — short codes on one line (OU · ST · PO · GF), less rounded.
v0.8.64 2026-09-10
  • One Health Sources page — Settings no longer opens a leftover “Health Integrations” catalog (Apple hub, Polar missing, Oura/Strava Coming soon). Menu → Connected Health is the only list. /health-integrations is the same page.
  • Settings: Health first + TOC — Connected Health sits at the top of Settings, before profile. Jump chips live in the Settings header (Connected Health / You / This phone / Data).
  • LAW 17 — deploy means build the apps. Same X.Y.Z on web, Android APK, and iOS Archive/TestFlight. Capacitor loading beta.kcal.lol is not a skip. [ENGINEERING-CONSTITUTION.md](./docs/infra/ENGINEERING-CONSTITUTION.md).
  • TestFlight keep last 5 — after a new build is on ASC, expire older TestFlight builds (python3 scripts/testflight-keep-last.py --keep 5 --yes). Does not delete git tags, CHANGELOG, or Android GitHub releases.
  • Help Release Notes always match the tag — ./tag.sh regenerates help-site/docs/release-notes.html from CHANGELOG and publishes to help.kcal.lol (npm run help:publish).
v0.8.63 2026-09-10
  • Polar Flow — Health Sources Connect/Sync for Polar AccessLink (same pattern as Strava). Needs POLAR_* secrets.
  • Your burn on Home — Beginner: 5th row in Today's Health (tap any row for details). Standard/Power: compact gauge under Daily Energy Budget; tap ▾ for formula / observed / ground truth. Log daily for a couple of weeks to find burn for this lifestyle.
  • Compact log bar — one-row Foodiary toolbar on Home (mode chip · camera/photos/voice/water/weight · gear + expand).
  • Drinks category — Foodiary + compose/confirm chips get Drinks (coffee, tea, beer, wine, energy, protein, BCAA/EAA). Parser logs nutrition drinks there instead of Snack / clock meals. Mixed food + drink still follows the meal clock. Plain water stays hydration. Drinks is always visible on Home (Beginner Today's Health + Standard/Power cards), the Daily task list, and Foodiary columns — same as Breakfast / Lunch / Dinner / Snack. Not hidden behind an empty state.
  • Spaces Reimagined v3 — social layer of the HOS: Home · Wall · Challenges · Progress · People + Settings gear. Invitation-only. Sharing checklist + one-tap encouragement are local and honest until APIs exist.
  • Menu vs Settings — Menu is doors (Settings first, then Connected Health, Share, Spaces, Help). Explore / About & legal stay A–Z. Settings cards are grouped: You · This phone · Health · Data. Nothing removed.
  • Activity Cal Health gear — ⚙ on the calendar hint row (right). Today is centered on that same row; date range sits alone above.
  • Apple Health Connect on Health Sources — card is live (not Later). Connect / Sync now / Disconnect go through HealthKit in the kcal iOS app and persist CONNECTED on the server. Safari shows “open the iOS app”; no fake web grant. Beta User Dominik.
  • Your burn unit — Beginner Today's Health Now column shows kcal next to the number.
  • Weight updated — Home no longer treats a food-log copied entries.weight as a weigh-in. “Weight updated” only after the kg actually moved (or a first-ever weigh-in).
  • Confirm macros (Aki) — Raejuusto / Hüttenkäse look up cottage cheese in the Food Bank (USDA). Confirm fills kcal/protein/carbs/fat from the bank for the typed grams. No invented per-100g table. Beta User Aki.
  • Food Bank typeahead is not a fuzzy catalog dump — verified SKUs appear only for a barcode, a distinctive token from that brand’s own aliases, or an exact one-word SKU name. Stopwords (with, cup), diet tags (milk-free), and categories are not search keys. “Cup of coffee with milk” goes to USDA coffee, not trail pouches.
  • Compose text box — meal input is 3 lines (not 8). Header / day / meal chips sit tight above the field. Food Bank / Foodiary hits sit under the field and scroll in the space above the keyboard; Camera/Photo/Voice hide while the keyboard is up.
v0.8.62 2026-09-09
  • TF-V voice vs Spotify — Capacitor iOS owns AVAudioSession: mic tap claims playAndRecord + mixWithOthers; sleep/end deactivates with notifyOthersOnDeactivation then restores ambient so Spotify can resume. Web Safari still best-effort only.
v0.8.61 2026-09-09
  • TF batch 2026-09-09 — mustikka≠Tikka (word-boundary OCR); porkkana/carrot + Scheiben dunkles Brot macros; Twix/zero-macro named foods stay on Today; More sheet above FAB + DE/FI i18n; photo keeps meal chip; weight auto-save + weigh-in list chronological; Home compose uses /food-search (Food bank); water chips unified in dl; keyboard inset earlier; iOS ambient audio + no LiveKit prewarm on Capacitor so Spotify isn’t killed on launch.
v0.8.60 2026-09-09
  • Food parse rock-solid — chocolate / schoggi never falls through to Turmat muesli/curry (USDA offline included); AI identify prompt + guardrail; 90 percent = cocoa %; bare chocolate prefers milk bar.
v0.8.59 2026-09-09
  • “25g 90% schoggi” → Turmat — Verified search no longer matches cocoa % digits inside barcodes (…0190 → Asian Curry). schoggi maps to dark chocolate; leading grams peel; USDA wins for cocoa-% bars.
v0.8.58 2026-09-09
  • Apple Health Connect freeze — after Connect / reconnect the sheet could leave the UI stuck on busy (Cap HealthKit callbacks not resolved on main thread; server connect no longer blocks the button). Beta User Dominik.
v0.8.57 2026-09-09
  • Apple Health Phase 2 sync — Health Integrations Connected card has Sync now (last 14 days). iOS HealthKit bridge (KcalHealthKitPlugin) reads weight, sleep, workouts, heart, steps, active energy → POST /integrations/apple-health/upload → timeline (source: apple_health). Needs TestFlight / iPhone app rebuild with HealthKit entitlement.
  • Confirm food lookup uses Food Bank — /buddy/resolve-food searches Verified → library → USDA (same pipe as Foodiary). If the raw name misses (e.g. “bio honig”), AI only translates the name to English for the bank lookup — macros still come from the Food Bank, never invented. No hand-coded honey table.
  • “Mission ready” fake win — removed from Today ✓; it only meant a mission card existed, not that the day was done.
  • Text log + Confirm professionalism — gram order works either way (150g chicken / chicken 150 g); Input normalize no longer orphans trailing amounts (BCAA leader, 10 g); multi-line keeps Verified BCAA and water; Confirm shows carbs/fat/sugar + amino panel (Leu/Gln/Ile/Val).
v0.8.56 2026-09-09
  • Apple Health Foundation (Phase 1) — Settings → Health Integrations: Apple Health Connect with permission why-list, local Connected dashboard, Coming soon cards (Garmin · Withings · Oura · Strava · Fitbit · Health Connect). No cloud sync yet. Help: how to set it up.
  • Health Service scaffold — Buddy talks only to frontend/src/Health/ (canonical model + providers); Apple Health is the reference adapter.
v0.8.55 2026-09-08
  • Text log redesign — one question, one box: Log your meal sheet with Today + meal chips, large compose field, Camera/Photo/Voice chips, and full-width Add (no instruction walls).
  • Inline nutrition paste — multi-line Foodiary-style pastes (name · g · kcal · macros) parse as real foods, not junk Confirm rows.
  • Confirm food lookup — typing/adding a food name resolves macros from past Foodiary or /buddy/resolve-food (no more empty Apple stubs).
  • Past-food chip overwrite — picking a history chip replaces an incomplete typed line instead of appending.
  • Snack meal chip — Log sheet meal row keeps Snack visible (equal four-column meal grid).
v0.8.54 2026-09-08
  • Beginner checklist empty meal — Lunch (or any meal) with nothing logged stays in Still to do; Done requires real Foodiary kcal/protein/fiber, not time of day or empty/hydration-only slots.
v0.8.53 2026-09-08
  • Buddy Confirm save 404 — meal Save no longer depends on a separate /buddy/foods-override call (that was returning Draft not found and blocking breakfast/any meal). Portion edits apply atomically on /buddy/confirm; draft ownership matches by userId.
v0.8.52 2026-09-08
  • CI Home layout contracts — update BuddyFirstHome source tests for Beginner docked log bar, Coach Narrative (replaces DailyCoachCard), and hero-bar gating so the progressive ship can build.
  • Ship note — v0.8.51 was tagged but image CI failed; this patch is the first live beta of Beginner Mode / Coach Narrative.
v0.8.51 2026-09-08
  • Not deployed — tag exists; build-image failed on Home layout contract tests. Use 0.8.52+.
  • Buddy Coaching Constitution v1.0 — binding coach law (Golden Rule, one next action, no wall of numbers). SSOT: docs/product/BUDDY-COACHING-CONSTITUTION.md.
  • Coach Narrative Engine v1.0 — every login is a coaching conversation (collect → done → missing → one NEXT → why; priorities; input confidence; Today’s Lesson). SSOT: docs/product/COACH-NARRATIVE-ENGINE.md. Implementation: frontend/src/coach/coachNarrativeEngine.ts + BuddyCoachNarrative.vue.
  • Beginner Mode v2.0 — zero cognitive load Home (greeting · health metrics · one NEXT · Log Food); tabs Home · Foodiary · Progress · Menu. SSOT: docs/product/PROGRESSIVE-EXPERIENCE-MODES.md.
  • Beginner Progress — trend charts (kcal · protein · fiber · water · weight) vs rolling average for 7D/14D/30D/1Y, plus min/max/median/avg.
  • Progressive Experience Modes — beginner / standard / power presentation layer (same routes & APIs). Central useProgressiveExperience(); PX switcher on beta / native / localhost. SSOT: docs/product/PROGRESSIVE-EXPERIENCE-MODES.md.
  • Beta → Beginner default — beta.kcal.lol + native apps force Beginner once on first load after this release (PX switch still available).
  • Full-app sitemap — txt IA map of Buddy · Desktop · Spaces · hosts in docs/architecture/SITEMAP.md.
  • Buddy Confirm save — celebrate only after save succeeds; deferred reset so dismiss cannot cancel the write; client-diary allowlist includes /buddy/foods-override + /buddy/date-override.
  • Buddy multiline / fibre — verified products no longer swallow multi-food lists; fibre carried on detected payloads.
  • Foodiary meal rows — clearer Clear / Edit / Save·Cancel; tap row for nutrients; Modify · Move · Delete behind Edit; generated rows use positive green tint.
v0.8.50 2026-09-07
  • TestFlight TF-21…24 — kcal goal via gear/Settings CTA (commit intake on type for iOS); Settings Profile/Diet strings EN+DE+FI; vegetarian/vegan sync hides turkey from Meal Plan + bubble palette; ladybug tip that OS screenshots don’t open TestFlight feedback; banana (and apple/orange) resolve kcal without asking.
  • iPhone Get-the-App journey: idiot-proof You/Sam TestFlight steps (install TestFlight → send Apple email → accept Apple invite → Sam activates → install Buddy); EN/DE on /download. “Open my kCal Buddy in browser” returns personal /#/u/:accessKey/home (never marketing kcal.lol). SSOT: docs/mobile/GET-THE-APP.md.
  • Verified label products: Leader Protein Powder (30 g → 123 kcal / 23 g protein) and BCAA amino powder (scaled amino panel; no invented kcal) in Verified Products — text/voice multi-item parse, known vs estimated leucine, Stock-compatible names. Contract: docs/buddy/VERIFIED-PRODUCTS-LABEL-CONTRACT.md.
  • TestFlight TF-14…20 — splash retry when hung; boot awaits fail-open after 8s; dinner from 15:00 / spoken clock; juice/mehu (incl. karpalomehu) not forced to Water; Quick foods A→Z with Show 5/10/25/50/all; fiber estimate cap + softer copy; water chips as 1 dl / 2 dl; voice heard text tap-to-edit (Home + input bar) before Quick Save.
v0.8.48 2026-09-05
  • Spaces MVP social UI — six tabs: Home · Wall · Boards · People · Challenges · Resources. Home is living story + feed/boards preview + Continue my day. Wall posts (local) with reactions/comments. Behaviour-only leaderboards. People directory + profiles. Challenges calendar/milestones. Resources recipe/library seed. Existing Spaces APIs only.
  • Spaces MVP Phase 2 polish — richer Home/Wall/Boards/People/Challenges/Resources: media covers, podium boards, human member cards, journey dots, pinned library, card lift + reaction micro-motion. DEV-only demo Wall/story content marked Demo. Sticky bottom Space nav, My Spaces back, fetch cache across tabs.
  • Spaces journey polish — local demo Spaces API for /u/sam; Wall keeps demo posts after you post; demo reactions/comments stick; true podium without duplicate rows; solo Home invite card; friendlier challenge dates; People presence dots; larger nav taps & library covers.
v0.8.47 2026-09-05
  • Spaces Campfire Home (beta) — Space Home is the campfire: living fire + circle of people, presence, empty chairs, Buddy (speak then silence), Continue my day, Today, memory, Looking ahead, emergent culture. Experience-only — no new APIs/pages. prefers-reduced-motion respected.
  • Spaces documentation — UX sitemap, Campfire experience/storyboard, product vision, WOW catalog; Help spaces screen-by-screen (aligned with campfire era).
v0.8.46 2026-09-05
  • Spaces Community Redesign — stop the admin-dashboard vibe. Space Home is people-first (hero art → faces → Buddy → Today's mission → team momentum bar → wins → invite). List cards use warm hero banners. Tabs: Home · Team · Moments · Goals. No horizontal scrolling. Experience-only — no API changes.
  • Help Release Notes — current era (v0.8.x) expands every patch from CHANGELOG.md; closed eras stay summary-only (folds when we open v0.9.x). Credits use Beta User \<FirstName\>.
  • Help cache-bust — no silent ?v= HTML replace (left stale bodies); banner Newer Help is live → Reload latest when version.json moves ahead of the page (same idea as the app).
v0.8.45 2026-09-05
  • Receipt review UX — after scan, show the found item list with editable g + CHF (OCR values or empty boxes to fill), Accept / Skip / rename before Log. Changing weight scales macros. ALDI / Coop / SPAR fixtures must keep line prices.
  • Water quick chips (Beta User Dominic · TF) — smaller glasses 100 / 200 / 250 / 500 ml (was 250–1 L); DE/FI placeholders Wasser? / Vesi? (not English Water?).
  • Buddy Voice STT upgrade — drop Latin hallucinations (e.g. Eine? kuvaime paike.), stronger DE/FI STT prompts, Schnell speichern only when the heard line looks like food.
v0.8.44 2026-09-05
  • Buddy food micros pipe — sugar/fibre persist on Buddy/voice saves (strawberries ~12 g / 250 g; cola real sugar). SSOT: docs/foodiary/FOOD-MICROS-PIPE.md.
  • Past-day dinner no longer → Breakfast — late-logs to yesterday default to dinner (Beta User Silke · TF-9 / TF-13).
  • Camera X silent — dismissing camera/gallery no longer shows a permissions error (Beta User Katja · TF-8).
  • DE Method + Settings + voice footer — Method / Settings / quick-food / voice footer localized (Beta User Dominic · TF-7 / TF-11 / TF-12).
  • Nutrition label photos — meal camera auto-routes Nährwerte tables (Beta User Dominic · TF-10).
  • CI Home composer test — i18n day-picker aria + submitText meal arg (unblocks image build after v0.8.43 tag).
  • First live beta of the 2026-09-05 polish train — v0.8.43 was tagged but CI failed; do not expect that tag on beta.
  • Native bump — Android 0.8.44-beta (versionCode 80044); iOS 0.8.44 / 80044.
v0.8.43 2026-09-05
  • Same product fixes as 0.8.44 (tagged only; image build failed — not rolled).
  • Not live on beta — superseded by v0.8.44.
v0.8.42 2026-09-04
  • Spaces Experience Sprint (Together Era) — Space Home is a daily community ritual, not a dashboard: Hero (“what are we doing?”) → Today (mission + Buddy + Open Foodiary only) → Friends today (people + warm status) → Our week → Recent wins → Invite (“Health is better together”). Micro-delight for together / everyone / welcome / halfway. Progress / Leaderboard / Feed / Complete copy aligned emotionally. No new APIs or tables.
  • spaces.kcal.lol + beta.kcal.lol on the same v0.8.42 image — separate DBs and users; shared product version only.
  • Validation Sprint 01 notes — docs/product/SPACES-VALIDATION-SPRINT-01.md (observe 😊❓🚪❤️ only; no feature building during the week).
  • Help Platform Release Notes — era cards v0.1.x…v0.8.x (main ideas) on help.kcal.lol; Developer Docs marked coming soon.
  • Native bump — Android 0.8.42-beta (versionCode 80042); iOS 0.8.42 / 80042. Build APK + Archive next; install over previous beta.
v0.8.41 2026-09-04
  • Home health cards fit one phone row — Protein / Ballast / Water no longer spill sideways (Beta User Silke · TF-1).
  • Settings ← Zurück always clear of the iOS status bar — uses --kcal-safe-top like Home; stronger orange chrome (Beta User Silke · TF-4).
  • Weight / Water compose escape — sheet shows ← Zurück (not only ✕) so you can leave without logging (Beta User Silke · TF-2).
  • Foodiary save without typed kcal — blank kcal is estimated from name + grams (e.g. Pizza Salami 100 g → ~240 kcal) so half a pizza still logs (Beta User Silke · TF-5).
  • Beta User Silke TestFlight batch — TF-3 (choose date) already shipped via compose Today/Yesterday + Foodiary eaten stamp; TF-6 swipe-day deferred. Credits +350 ledger (~$3.50) awarded on beta 2026-09-04 (balance 350). Sam idea weight +0.006. Triage: docs/mobile/TESTFLIGHT-FEEDBACK-TRIAGE.md.
  • Native — Android APK 0.8.41 (versionCode 80041) published; iOS 0.8.41 / 80041 archived (public TestFlight URL still Coming shortly).
v0.8.40 2026-09-04
  • Oats fiber on Home — dry oats / porridge now count toward the Fiber card (~4.2 g for 42 g). Name heuristic matches plural “oats”.
  • Food catalogue macros complete — all 151 catalogue foods now have fiber_per_100g, sugar_per_100g, and sodium_mg_per_100g (plus existing kcal/protein/carbs/fat). Meat/oil fiber stays 0 on purpose.
v0.8.39 2026-09-04
  • Native ship SSOT — docs/mobile/NATIVE-SHIP-PROCESS.md: web tag → Android APK → iOS Archive → master (cross-linked from RUNBOOK / ship-mode / Get the App).
  • Foodiary eaten stamp — day + time on add/edit; always persists date + HH:MM; time remaps meal column; changing day moves the row.
  • Stuck on yesterday — warm SPA / Cap overnight no longer logs breakfast to the previous day. Resume heal (Cap appStateChange, visibility/focus, live refresh); Home always defaults to wall-clock today; Foodiary past-day browse still works.
  • Buddy voice/text time + date — spoken/clock forms (20:00, um 20 Uhr, at 8:30 pm, yesterday/gestern/eilen, …); no time → local clock; date hints flow into drafts/confirm.
v0.8.38 2026-09-03
  • Home coach strip — one compact row: Last meal, fuel/body Now (digesting / fat burn / fasting), and Next advice (Fuel Gauge–backed).
  • Home header Buddy — mobile top bar: animated Buddy + rotating tip bubble (“Hello {Name}, I am kCal Buddy!”), language, theme, gear → More. Big greeting card removed; Daily Energy stays below.
  • Quick Food starter chips — Top food, Protein + water, and From my foods are all visible (no clipped third pill).
  • Quick Food ⋯ menu — centered card; history tiles get Edit + Hide from Quick food (not Keep and Remove together).
  • Energy Minimize — hides the whole totals card (Energy, Macros, Food quality, Micros, Buddy summary), not only the Energy grid.
  • iPhone app first install — first open of kCal Buddy Create PIN on this phone (overrides the website PIN). Session cookie is retried after enroll. A full device list says so, instead of only “close the app.”
  • iPhone 14 first open layout — WKWebView no longer boots at ~980px “tile” scale; viewport-fit=cover + safe-area apply on first paint (no flip-to-fix).
  • iPhone status bar overlap — kCal Buddy title and ladybug no longer sit under the clock / battery when env(safe-area-inset-top) is 0 on first paint.
  • Android hero sun/moon line — native fetch no longer forces cookies on Open-Meteo; solar arc shows again (was date-only).
  • Mood check-in prompt — tap “How's it going?” for a playful bounce around the screen.
v0.8.37 2026-09-03
  • Foodiary fiber — Raspberries, blueberries, strawberries, and chia count toward fiber (name heuristic + USDA nutrient 291/amount). The item line shows grams when > 0. Eggs stay 0 g.
  • iPhone sideways pan — Home / Foodiary / Progress / Connected Health only scroll up/down on iPhone 16 width.
  • Android ladybug — Beta feedback chip shows in the native app (including old localhost WebViews).
v0.8.36 2026-09-02
  • iPhone / Android app sign-in — kCal Buddy loads https://beta.kcal.lol in the WebView so the session cookie sticks (same as Safari). App path is PIN only (create or enter). No QR, no email. Uninstall wipes the app sandbox. Reset sign-in then Create PIN. Browsers keep the existing email / QR path.
v0.8.35 2026-09-02
  • No pairing QR on phones — iPhone / Android (Safari, PWA, and the installed app) never show the laptop QR. First open / after Reset sign-in goes to Create PIN. Laptop browsers still use QR.
  • Capacitor iOS accepts the session cookie like Android so PIN setup can complete in TestFlight.
v0.8.34 2026-09-02
  • Launch screen — Orange + kCal Buddy splash is first paint again on localhost, beta, Spaces, and the Android APK. Same art everywhere. KCAL BUDDY - Beta on the logo, Ready to rock? bubble, typewriter Loading…, then a slow orange dissolve into Home — no white flash.
v0.8.33 2026-09-02
  • Home welcome — Good morning / afternoon / evening + name sits in Buddy’s first bubble. Home cards share one even gap. Android launch stays kcal orange (Buddy icon) instead of a white flash.
v0.8.32 2026-09-01
  • Home Protein / Fiber / Water — Color tiles on Daily Energy Budget. Tap a tile for remaining grams/litres, 2–3 eatable fill options (225 g chicken breast = ~70 g protein), sources, week chart, and Learn more. Fiber uses name heuristics when the diary stored 0. Log food from the Home Buddy bar, not from this sheet.
v0.8.27 2026-09-01
  • First-device enroll — Closing the browser before PIN/recovery no longer locks the invite. Incomplete setup stays pending; another browser can start first-device again. Trusted only after PIN + recovery codes.
v0.8.25 2026-09-01
  • Trusted-device auth on beta — /api/auth/status no longer uses sync Postgres (deasync) on the async path. That was timing out the device count and starving the pool. Hard-refresh after deploy.
v0.8.24 2026-09-01
  • Trusted-device auth (Phase 1) — New browser: phone Approve (QR + 6-digit), optional email, recovery codes, admin rescue. Existing sessions keep working. Delayed email is no longer the only way onto a laptop. Hard-refresh after deploy.
v0.8.17 2026-08-31
  • Buddy Voice meal save — One Buddy per room (joining jobs were deleted as orphans → two transcribers). Save logs the full plate, not the first STT chunk (chicken burger is not bare chicken; fries and coke stay). Buddy’s “Drink another 500 ml” is never parsed as a water log. Quick Save saves the overlay. Localhost proven 2026-08-31; hard-refresh after deploy.
v0.8.16 2026-08-31
  • Buddy Voice listen loop — Tap Voice → LISTENING (no spoken Yep). Overlay shows what to say (coffee and oats · Done · Bye). Later food appends instead of wiping the first item. STT is pinned to the app language (EN/DE/FI) so “Baeee” is bye, not Chinese. Worker owns spoken Done/Bye. Localhost proven 2026-08-31; this tag is the beta tester build. Hard-refresh after deploy.
  • Buddy Voice Slice 1 — one owner, silent open, one save — Tap Voice goes straight to LISTENING with no spoken "Yep." greeting. The voice worker owns spoken Yes/No/Done; LiveKit captions are display-only. Duplicate STT/reconnect of the same turn is ignored. Confirm is idempotent on sessionId + turnId + draftId so a replay cannot insert a second food_log_items row.
v0.8.14 2026-08-29
  • Reconnect dumped Chrome onto beta.kcal.lol, then “Could not load health connections” — Oura/Google grants were saving, but Custom Tabs were sent to the website (no APK session). Connect/status no longer require a Chrome cookie; the callback returns to the APK; kcal-integrations now allows credentialed CORS from the WebView.
v0.8.13 2026-08-29
  • Android Health Sources never left “Starting connection…” — Chrome Custom Tabs do not share the APK WebView session cookie. Every OAuth provider (/connect then /status for Oura, Google, Garmin, Strava) therefore hit auth_required in Chrome while the APK waited. Native connect/status with kcal_client=native now uses the access key in the URL (same secret as the connect link). The APK still polls /status on a native thread because Custom Tabs pause the WebView.
v0.8.12 2026-08-29
  • Health Sources spinner never cleared on Android — Custom Tabs pauses the WebView, so JS /status polling never saw Oura/Google/Garmin/Strava grants. The APK now polls /status on a native thread and brings the app back when the grant exists.
v0.8.11 2026-08-29
  • Android Reconnect opened the PWA — Capacitor turned window.open(https://beta.kcal.lol/…) into ACTION_VIEW, and Android handed that origin to the installed PWA. Connect/Reconnect now opens Chrome Custom Tabs (Chrome package). The OAuth callback returns with an Android intent URL pinned to lol.kcal.app, not the website hash.
v0.8.10 2026-08-29
  • Account chrome on the server — Home mood, Getting started (“New here?”), onboarding, bowls, recipes, My Meals, named meal-plan days, chips, NEAT notes, activity-source toggles, food portions, and quick-add tiles sync via user_account_state (GET/PATCH/POST /account-state/migrate). Browser / PWA / Android share the same invite account. Empty Android does not wipe a Browser migrate. Theme, voice mic, layout, and avatar stay on-device.
  • Android Health Sources spinner — after Oura/Google/Garmin/Strava OAuth returns to the APK, the app polls /status until the grant is visible (and on App resume / lol.kcal.app:// return) instead of leaving Starting connection… forever. The API grant was already saving; the WebView had stopped waiting.
v0.8.9 2026-08-29
  • Person Profile on the server — invite keys load/save user_profiles via GET/PATCH /api/:accessKey/profile, with one-shot POST /profile/migrate from legacy localStorage. Server wins after migrate; empty Android does not block Browser import. Demo/sam stay local.
  • Current weight from diary — derived.currentWeightKg is the latest entries.weight (not a stored profile field). Age is derived from birthDateIso. Device panel layout and avatar stay on-device.
v0.8.5 2026-08-28
  • Recipes under Meal Plan — catalog + Mine recipes (Spartan Pannukakku first), nutrition from the food catalog, Add to Foodiary as one kcal_recipe: row, not a new nav item.
  • Quick Food recipe tiles — every catalog and Mine recipe is always a tile; tap logs 1 serving into the clock/selected meal.
  • Buddy live voice aura — Home/Hero waveform + live caption while Talk is active.
  • Meal Plan plus-button crash — logging a recipe no longer remounts Meal Plan mid-update (buddyDiaryRevision is not the panel key).
  • iOS Safari photo scan — service worker no longer intercepts POST uploads; friendly error instead of raw FetchEvent.respondWith … Load failed when network fails.
  • Buddy Home speech bubble i18n — coach/toolbar hints (e.g. gear on log bar) now follow FI/DE/EN language selection instead of staying English.
  • Activity → Activity Cal — nav + panel rename. DAY / WEEK / MONTH lives on the calendar toolbar (not under the page title). Day = vertical board; Week = one compact week row; Month = full grid + Day view under the cal. Fuel Gauge sits directly under the calendar card (not between source chips and the grid). Range label includes ISO week (W34). Panel no longer repeats the page title or long marketing blurb — source chips + Share + Sync only; calendar chrome is i18n’d (en/de/fi).
  • Home Buddy Inputs card — warm peach/orange wash so Log chips don’t look like the cool white bottom nav.
  • Meal Plan is day-first, not bowl-first — allocate remaining kcal/protein across meals, pick archetypes, then compose food. Default max 1 bowl/day (not “Bowls first”). Remaining = target − Foodiary actual − still-planned (can show OVER TARGET). Generate = preview; per-meal Clear / Give me another; Approve writes Foodiary; Undo removes that last add. PLAN is not ACTUAL until approved.
  • Home Text composer — taller field (7 rows) with a bottom-right drag handle to resize.
  • Foodiary toolbar — Quick/Coach/Expert, Share, and +/− expand-collapse sit on one row.
  • The Method internal-beta gate: Buddy food confirm peeks today’s log so satisfied-lesson hints fire; local SQLite migrates food_log_items CHECK to allow Buddy generated source; weekly review rejects days not yet reached (REVIEW_NOT_READY); burn UI pairs product term with plain estimate gloss + “How was this estimated?”; DE/FI burn terms proposed pending human approval; non-sensitive analytics for burn-not-ready / migration / sync failure.
  • Buddy Soft Stop → rejoin corpses (Theme 01q) — Soft Stop kept the room warm but did not prove the sleeper could still receive Wake (buddy-state: sleeping). Next mic tap took the fast path into a zombie participant → hang / silent fail. Fix: wait ≤1.5s for sleep ACK; on miss → /voice/redispatch + skip fast path; client Black Box beacons (JOIN/BYE/SLEEP_ACK/…). Android 50-session DoD still OPEN. Never Again R5q. See docs/buddy/THEME-01Q-SOFT-STOP-REJOIN.md.
  • Camera “Don't show again” — dismiss is honored for camera as well as gallery (kcal.buddy.photoTips.dismissed); camera no longer forces the tips sheet every time.
  • Weight Edit stayed in Foodiary mode — after Log Weight → Edit, bare kg (e.g. 117.4) re-opens Weight mode so resend parses as weight, not “Could not detect any foods.”
  • The Method Phase 3 hardening: cross-key HTTP authorization integration test, KCAL_METHOD_ENABLED authoritative for invite/sam/demo/Buddy/UI, structured + food Buddy Method awareness, desktop Home Method entry, dev-only visual fixtures, Ground Truth boundary docs, extended Playwright Method coverage.
  • The Method (production path): per-user Postgres/SQLite method_state, authenticated /api/:accessKey/method/* transitions, localStorage→server migration for kcl_*, Activity Log / Timeline activity signals, full Day 7/14/21/30 weekly reviews, Day 29 personal rules editor, Buddy day-summary Method awareness, KCAL_METHOD_ENABLED flag, Method i18n (en/de/fi), safety guidance helper, Playwright Method smoke.
  • The Method (first month): guided daily lessons on Buddy Home — opt-in, lesson-based progress (missing days never reset), Personal Burning Rate reveal gated on calibration data
  • Canonical product docs: docs/product/KCAL-THE-METHOD.md, docs/product/KCAL-THE-METHOD-FIRST-30-DAYS.md
  • Engine notes: docs/architecture/KCAL-THE-METHOD-ENGINE.md
  • Foodiary meal Clear — Clear on the meal title, a Clear Lunch (etc.) button under Add food item, and Clear on collapsed bowl rows (tap twice to confirm).
  • Quick food Minimize/Expand — Foodiary Quick food grid collapses; preference persists.
  • TGIF Friday — Spartan Maximus — reusable Friday meal plan (~1,498 kcal / ~192 g protein). PLAN vs ACTUAL stay separate; mark eaten / edit grams or substitute / skip. Foodiary updates only when eaten.
  • Official kCal Buddy PWA icon pack — Android 192/512 + maskable, iOS apple-touch 180, favicons; Home top-left brand uses the same mark.
  • Home Text typeahead from Foodiary — typing in Text (e.g. Salmon) suggests previously logged foods (Salmon Sandwich, …) ranked by frequency. Tap to fill, then send.
  • Home Log methods sheet — chips do the action (Text opens composer, Camera opens camera, …). Orange CTA default + per-chip On/Off via wrench tool on the Log card (and Voice also in Settings → Microphone). Chip row uses flexible equal columns so hiding Voice (or any chip) doesn’t leave a gap. Factory default is Text when voice is off.
  • Disable Voice input (per device) — Settings → Microphone: turn Voice input off to hide Voice UI, skip mic prefetch/prompts, and disconnect any live session. Same panel sets Home Log button default. Local preference kcal.voiceInputEnabled.v1. Doc: [KCAL-VOICE-INPUT.md](docs/buddy/KCAL-VOICE-INPUT.md).
  • Apply remaining meals on live accounts — planned bowls/meals POST to /food-item (server keys); client-only keys stay on IndexedDB.
  • Activity Share sits in the Activity Log header — next to Sync, not a floating empty row under TODAY. Calendar is Day / Week / Month (default Week).
  • Text/voice confirm showed photo “Retake” UI — low-confidence confirm is source-aware (text / voice / camera / gallery); BCAA-style text asks for amounts/brands, not “photo was hard to read.”
  • Weight confirm said Save to Foodiary — primary save CTA follows intent (Save weight / water / training / Foodiary).
  • Buddy speech closer — ends with “Ready to rock? I am!”
  • TODAY hero is a live day/night timeline — charcoal TODAY + clock, muted weather/place, thin grey sunrise→sunset (or sunset→next sunrise) line. Graphical sun/moon is the progress marker (real lunar phase at night). Install kCal Buddy moved from the Home banner into Menu.
  • Installed PWA named Buddy and opened the public landing — launcher short_name is kCal Buddy; static start_url stays credential-free (/?source=pwa). Install persists the current /u/:accessKey via existing kcal.lastAccountAccessKey; standalone/PWA launch of / restores that user’s Home. Visitors with no remembered key still see the public landing.
  • Android PWA Install stuck on “Installing…” — Chrome accepted the prompt but WebAPK never finished (id: "/" collided with stale kcal installs; alpha PNGs hurt mint). New manifest id: /kcal-buddy, opaque icons, 20s stall → Add-to-Home-screen fallback copy on Home.
  • Android PWA Install still dead — SW register only in late Vue boot was fragile; add inline index.html register + beforeinstallprompt Install banner on Home so Chrome Android can actually install Buddy.
  • Android PWA Install missing — service worker registered on window.load *after* boot awaits, so load had already fired → SW never registered → Chrome hid Install app. Register ASAP + when document.readyState === "complete"; nginx manifest MIME kept in sync on deploy.
  • Buddy open <1s (Theme 01p) — Theme 01i made Home prewarm room-only, so every mic tap cold-dispatched (ctx.connect often 1.5–16s) and wake packets died before session.start wired DataReceived. Fix: Home prewarm Dispatches a sleeping worker again (coalesce, never Wake); agent early-acks Wake before session.start; client fires Wake on the warm fast-path before mic permission; Soft Stop re-prewarms if the agent vanished. Target: mic → Wake ACK under 1s when Home was open first.
  • Buddy “20 chicken nuggets” → Chicken 36 kcal — Input-2.0 heuristics treated bare 20 as grams and \bchicken\b matched inside “chicken nuggets”. Countable nugget path (~18 g/piece) + narrower chicken match; regression tests added.
  • Share image lagged text — default was Day totals (summary-only PNG) while text listed meals/food. Default is now Food items; single-day A4 stacks meals vertically with body text in the writing column (not a side-by-side mess).
  • Foodiary Quick/Coach/Expert looked broken — chips changed, but mobile remount re-collapsed Coach panels and effects stayed below the fold. Mode now gates panels (Quick = food only; Coach = Summary + Insights; Expert = all), scrolls to them, and shows a short mode hint.
  • Share control visibility — Foodiary Share sits in the view toolbar (not its own row); timeline uses Material connected-dots (icon only; tip on hover). No Share in the phone top bar.
  • Foodiary + FAB → Buddy inputs — floating + opens Camera / Gallery / Text / Voice / Water / Weight (same chip set as Home). Camera/Gallery/Voice stay on Foodiary with Buddy AI; Text/Water/Weight open Buddy Home compose.
  • Buddy Soft Stop → rejoin thrash (Theme 01n) — mic activate with replaceAgent: true murdered healthy in-room agents (skip_live + present → force-cleared / force-removed / force_created). Soft Stop → leave → rejoin raced ParticipantConnected and killed the joining worker. Fix: replaceAgent uses the same warm coalesce as force activate; Close zombies recover via age-out + /voice/redispatch after wake fail. Never Again R5n.
  • Buddy joining → Home drop (Theme 01o) — agent participant appeared before DataReceived was wired; client cleared “Buddy joining…” on presence (illegal) and wake bursts died in ≤350ms → dump to Home at ~3–4s with no Abort. Fix: stay connecting until Wake ACK; wake retries through activation window; Cancel/× on overlay; hard timeout 20s.
  • Home Text / Water / Weight compose — same day picker (Today / Yesterday / any past day) on all three; phone opens full-screen above the keyboard; Water glass chips save immediately; confirm stays in the sheet (not behind it). Typed water/weight/text use the chosen day.
  • Home text composer under bottom nav + keyboard (Beta User Katja) — typing kept Home in idle, so the tab bar stayed up and covered +/Send when the keyboard opened. Text/Weight/Water (and day picker / defaults sheet) float as centered pop cards over lightly blurred Home; keyboard lifts the compose card via visualViewport so +/Send stay reachable. Chip order ends Water → Weight.
  • Foodiary + menu opacity — Quick FAB menu used a translucent backdrop that made items unreadable over diary content. Solid white/dark panel, teleported to body, higher z-index. Doc: [KCAL-FOODIARY-LAYOUT.md](docs/foodiary/KCAL-FOODIARY-LAYOUT.md).
  • Health Sources Reset/Disconnect progress — Reset connection showed no on-screen feedback while busy (felt dead). Page banner + card hint + button label now show Resetting… / Disconnecting… with elapsed seconds, then a done line.
  • Oura/Google/Strava/Garmin connect runSync — Beta User Katja could open Health Sources + start OAuth, but connect/disconnect still used runSync and timed out mid-flow. Connect/disconnect paths are now async (same Never Again class as magic-link/PIN).
  • Home Weight day + primary modality — Weight opens the same day picker as Camera/Gallery (today / yesterday / any past day). Orange CTA remembers last Voice/Text/Camera/Gallery choice so non-voice users aren’t stuck on “Tap to tell Buddy”.
  • Health Sources + invite auth i18n — Health Sources page body and magic-link/PIN gates were English-only (only the chrome title “Terveyslähteet” switched). Wired app.healthSources + app.auth for en/de/fi.
  • Health Sources fluent status — “Checking connections…” was an on-demand blocking waterfall (4–6 status polls + retry) that disabled Connect/Reset. Now: last-known sessionStorage paint, background refresh, cold-only “Checking…”, actions never gated on status poll. Doc: [KCAL-HEALTH-SOURCES.md § Fluent status](docs/health/KCAL-HEALTH-SOURCES.md#fluent-status-do-not-block-connect).
  • Invite Access expired UX — browser navigations no longer show raw {"ok":false,"error":"Access expired"}; friendly HTML + invite gate (“Your beta invite has ended”). Auth status returns invite_expired with title/hint.
  • Health Sources misinformation — Menu/Activity could show Connected while Health Sources stuck on “Checking connections…” / Not connected. Loading always clears; status fetches time out; ERROR/TOKEN_EXPIRED count as connected; Reset connection on every disconnected live card; Disconnect on error/reconnect; Strava capabilities no longer claim Steps.
  • Health Sources scare banner (v0.7.119) — partial status poll failures no longer flash “Could not refresh…”. Doc: [KCAL-HEALTH-SOURCES.md § Status refresh banner](docs/health/KCAL-HEALTH-SOURCES.md#status-refresh-banner-do-not-scare) · Never Again R9.
  • Sign-in email runSync timeout (Beta User Katja) — “Could not send sign-in email” was runSync deadlocking on getAccessKeyAllowedEmails / insertAuthToken during magic-link. Magic-link path is now fully async (no deasync). Unblocks Oura Connect (needs signed-in session first).
  • PIN verify/set runSync timeout (Beta User Katja) — after magic-link worked she stuck on PIN: verify-pin/set-pin still used sync getAuthSession. Now async.
  • Buddy reopen hang (Theme 01m) — 1st join OK, close, reopen → 40s+ “Buddy joining…”: ctx.shutdown after Close left agent-AJ_* in LiveKit; 2nd activate logged force_coalesced_skip_live on the corpse. Fix: room.disconnect() before shutdown; mic activate sends replaceAgent: true when the phone has no local agent so server hard-clears zombies. Never Again R5m.
  • Buddy zombie after crash (Theme 01l) — worked once (~20s), then endless “Buddy joining…”: AgentSession closed but agent participant stayed (closeOnDisconnect: false) with data handlers torn down → wake hit a corpse; Theme 01k coalesce blocked /activate murder; /voice/redispatch then coalesced via dispatchVoiceAgentToRoom instead of creating. Fix: shutdown job on session Close (participant leaves); redispatch always createDispatch; UI stays connecting until Wake ACK. Never Again R5l.
  • Buddy 3rd join kill (Theme 01k) — 1st/2nd join OK, 3rd silent fail: mic forceRedispatch treated warm skip_live as hard-clear → force-cleared + force-removed the live agent mid-rejoin (founder room kcal-voice-5-ab437f85-…). Fix: never murder an in-room agent on activate (skip_live/skip_inflight + agent present → coalesce). Never Again R5k.
  • Buddy JOIN protocol LOCK (Theme 01j) — join is now an enforced state machine (buddyJoinProtocol.ts): illegal transitions ERROR + metric + correlationId/session/worker/pod/timeline; READY = Wake ACK only (presence ≠ READY); Soft Stop keeps room; metrics kcal_buddy_join_phase_total; regression suite for dispatch/wake/greeting/listening/rejoin/double-activate. Never Again R5j. Theme 01 Android DoD (20 joins) still OPEN.
  • Beta User Katja P0 — Health Sources ← Back stuck — utility pages (/connections etc.) now always navigate to Home (hash fallback), sit above leftover Home/Twos/Feedback chrome (z-index: 400), and photo-scan failure offers Dismiss beside Retake so beta users are never trapped after a failed coffee/meal photo. Never Again R8.
  • Buddy 2nd join after BYE (Theme 01g) — 1st join OK, 2nd silent fail: stale buddyWakeAckedAt + wake-only fast-path skipped /room/activate while the LiveKit AgentSession had already closed (founder room kcal-voice-5-ab437f85-…). Fix: clear wake-ack on sleep/disconnect/new activate; after sleep always force-dispatch. Never Again R5g.
  • Buddy leave keep-warm (Theme 01h) — /voice/stop deleted the LiveKit room on every leave → agent died immediately → 2nd/3rd join cold+flaky. Device Buddy rooms now keep-warm (departureTimeout 180s); stop no longer deletes them. Never Again R5h.
  • Buddy JOIN protocol (Theme 01i) — violated invariant: multiple Dispatch owners (Home prewarm + mic activate + void/await double POST + force_coalesced_skip_inflight on empty room) produced 12–16s “Buddy joining…”. Delete: prewarm never dispatches; mic /room/activate is sole Dispatch owner; force coalesce only when an agent participant is actually in-room. Never Again R5i.
  • ENVIRONMENT ISOLATION (Buddy Steel) — beta LiveKit agent name is now kcal-voice-agent-beta (API + voice-agent); prod stays kcal-voice-agent. Stops prod workers stealing beta Buddy jobs on the shared LiveKit project (founder join hang / wake never lands). Boot + post-deploy smoke fail on mismatch. Never Again R5e.
  • Buddy BYE→rejoin hang — Home prewarm treated a healthy warm agent as “stale” after the 12s join grace (JS_RUNNING + participant still in room) and deleted it. Fix: skip_live / cleanup keep aged RUNNING jobs while the agent participant is present; orphans without a participant still clear. Manual load: npm run test:buddy-bye-rejoin --prefix backend. Never Again R5f.
  • Buddy join (Theme 01) — mic forceRedispatch no longer kills an in-flight prewarm agent (force_coalesced when live/joining); activate HTTP failures fail fast instead of silent “Buddy joining…” wait. Tests: shouldHardClearOnForceActivate, voice invariants.
  • Buddy join (Theme 01b) — coalescing skip_live left zombie agent-AJ_* in user rooms (prewarm skip forever, mic never POSTed activate). Fix: hard-clear skip_live on activate; always POST /room/activate on mic tap; cleared stuck room kcal-voice-5-….
  • Buddy join (Theme 01c) — hard-clear skip_live on every tap killed warm agent after BYE → ~18s rejoin / kick-to-main. Fix: coalesce skip_live again; fast path wakes before any force-activate.
  • Buddy join (Theme 01d) — server skip_live while phone room empty → 20s+ spinner. Fix: hard-clear skip_live on cold activate only; warm = wake-only; empty-room redispatch at 2s; hard timeout 12s.
  • Buddy Android audio (Theme 01e) — greeting started on loudspeaker then flipped to quiet earpiece mid-sentence. Cause: Android WebAudio loudspeaker path mutes <audio>, so isBuddyAudioPlaying() was always false → listening/mic open mid-TTS → MODE_IN_COMMUNICATION earpiece. Fix: AnalyserNode energy on the WebAudio graph; ignore muted-element ended; hold mic closed while TTS energy present.
  • Buddy join hang (Theme 01f) — zombie agent in room cleared loading/timer so the 12s hard-timeout no-op'd while UI stayed on connecting (300s+ spinner). Fix: hard-timeout keys off wake-ack / connecting / session; markBuddyOnlineUi never leaves connecting stuck.
  • Operation BUILD — enough planning; build trust; order: Theme 01 → Telegram → Buddy smoke → sync paths → watch beta. Doc: [docs/infra/OPERATION-BUILD.md](docs/infra/OPERATION-BUILD.md)
  • Operation Buddy Steel v1.1 — execution charter: Rule 0 (measure before fix), reliability budget (RED → Steel is today’s theme), every bug → 5 artifacts, PR boredom filter. Doc: [docs/buddy/OPERATION-BUDDY-STEEL.md](docs/buddy/OPERATION-BUDDY-STEEL.md)
  • Operation Buddy Steel — harden Buddy v1 into predictable infrastructure (not v2 redesign). Metrics: join >99.5%, median &lt;3s, P95 &lt;6s, zero infinite spinner. Doc: [docs/buddy/OPERATION-BUDDY-STEEL.md](docs/buddy/OPERATION-BUDDY-STEEL.md)
  • Engineering Constitution v1.1 — LAW 16 Founder Rule (no bypass for excitement/urgency/beta asks); decision filter before any work. Doc: [docs/infra/ENGINEERING-CONSTITUTION.md](docs/infra/ENGINEERING-CONSTITUTION.md)
  • Engineering Constitution v1.0 — binding laws (healthy > features, one theme, stabilize→measure→redesign, real phone, boring UX). Doc: [docs/infra/ENGINEERING-CONSTITUTION.md](docs/infra/ENGINEERING-CONSTITUTION.md)
  • Buddy greeting (EN) — spoken/presence opener is now Hi {name}! What's up? (was What to add?).
  • STABILITY MODE (Stop the bleeding) — no new features / UI polish / new ideas until beta feels healthy. Rules 1–10 (one theme, sacred-path smoke, real phone, bug→test+Never Again+CHANGELOG, fail soft). Docs: [docs/infra/STABILITY-SPRINT.md](docs/infra/STABILITY-SPRINT.md) · [DAILY.md](DAILY.md)
  • OPERATION: FIX THIS SHIT — make kcal.lol boring-reliable; Steps 1–10. Playbook: [docs/infra/OPERATION-FIX-THIS-SHIT.md](docs/infra/OPERATION-FIX-THIS-SHIT.md). Health audit (2026-08-10): [docs/infra/HEALTH-AUDIT-2026-08-10.md](docs/infra/HEALTH-AUDIT-2026-08-10.md)
  • Post-deploy smoke — deploy.sh / tag.sh --deploy run scripts/post-deploy-smoke.sh after rollout: live /api/version + /api/health, REDIS_URL on every API pod, in-cluster Job parse → meal-override → cancel (×4 across replicas), plus /api/voice/agent/draft-ha-smoke (Redis re-read) when the image has it. Escape hatch --skip-smoke. Doc: [docs/testing/KCAL-DEPLOY-TEST-SUITE.md](docs/testing/KCAL-DEPLOY-TEST-SUITE.md)
  • Incident report 2026-08-09 — beta cascade (activity/Pilates session → Buddy/Foodiary/HA/runSync): [docs/infra/INCIDENT-2026-08-09-BETA-CASCADE.md](docs/infra/INCIDENT-2026-08-09-BETA-CASCADE.md)
  • Beta Voice canary — CronJob every 2m (k8s/voice-canary-cronjob-beta.yaml): food-gate in voice-agent image + LiveKit agent join ≤12s + parse smoke; gauges kcal_voice_canary_ok / last_success_unixtime; PrometheusRule alerts KcalVoiceCanaryDown / KcalLivekitDown
  • Ops paging path — Alertmanager (mon) → Telegram via kcCloud-monitoring/metrics/setup-telegram-alerting.sh; Grafana kcal-beta - Advanced shows Voice canary; optional instant Telegram from canary Job secret telegram-alert
  • The Way of Sam (TWoS) — opt-in floating philosopher (default off): draggable Sam, transparent cutout art, dedicated page /u/:key/twos, event-driven quiet wisdom; Do No Harm + Human Principle. Spec: [docs/product/THE-WAY-OF-SAM.md](docs/product/THE-WAY-OF-SAM.md)
  • KLC coin — Bitcoin-shaped credits: toolbar shows both ◈ 0.00001538 KLC · 15.38 µKLC (genesis frozen ~$65k/BTC; $1 retail). Ledger stays integer (1 = $0.01). Spec: [docs/product/KLC-CREDITS.md](docs/product/KLC-CREDITS.md)
  • Gallery quick chip — Buddy Home log row: Voice · Camera · Gallery · Text · Weight · Water (no more Photo Library buried under Text → +)
  • Food mass totals — meal headers show food kg + drink L (not only kcal/protein); Foodiary day KPIs include Food/Drinks; Progress shows Today / 7d / 30d / 365d food mass
  • Platform reliability track — [docs/infra/PLATFORM-RELIABILITY.md](docs/infra/PLATFORM-RELIABILITY.md) with NOW/DESIRED architecture + sequence diagrams; HA bar applies to dev / beta / prod
  • API HA — kcal Deployment replicas ≥ 2, RollingUpdate maxUnavailable: 0 (dev + beta + prod manifests)
  • PodDisruptionBudgets — k8s/pdb-dev.yaml, pdb-beta.yaml, pdb.yaml applied on deploy/tag rollout
  • Async /api/auth/status — Postgres path uses pg pool (no deasync on the sign-in hot path)
  • Home location — Settings → Profile & goals: search city (Open-Meteo geocode), pick disambiguated result (e.g. Lachen, Schwyz vs Zürich); stores resolved place on profile; Home top bar shows short label (Helsinki, FI / Lachen, SZ); weather charts follow the chosen place (default remains Lachen, SZ)
  • Activity catalog (search-first) — data-driven activityCatalog.json (Pilates, sports, combat, winter, … + synonyms); Activity Log search UI; unknown names → Other Activity; MET / intensity kcal estimates; logging never blocked by a missing type
  • runSync: timed out waiting for database operation (hot-path purge) — async Postgres for Saved Foods, food search, Buddy/voice confirm writes (insert/sum/sync/timeline), day-context, agent fuel-gauge + weekly summary, voice coach routes (/coach/*), diary entry/food-item/analysis mutations, and remaining auth resolveAccessKey callers; request mutex bypasses Buddy/voice/auth/diary async routes so deasync cannot wedge HA under load
  • Buddy “Half a cucumber…” silent ignore — fraction + produce (half a … / cucumber & common veg) now food_log so silence-commit / Done / ⚡ Quick Save fire (was not_food with transcript on screen)
  • Heard ⚡ Quick Save always when transcript visible — button no longer hidden by Spartan food gate; tap parses via Foodiary (gate still guides silence-commit)
  • Buddy voice route — BT when connected; otherwise main loudspeaker (stop iOS play-and-record earpiece quiet path when no BT)
  • Android Buddy loudspeaker — Chrome has no setSinkId; select Speakerphone mic input so OS leaves quiet earpiece / in-call mode; republish if wrong mic already open
  • Android Buddy → bottom speaker — without BT, play Buddy TTS via WebAudio AudioContext.destination (loudspeaker); mute the WebRTC <audio> element that was stuck on the quiet top earpiece
  • Android earpiece lock — soft-muted mic still forces call/earpiece mode; fully unpublish mic while Buddy speaks (republish on listening) so TTS can use speakerphone
  • “Draft not found or expired” on HA — Buddy/Foodiary drafts were in-memory per API pod; with 2 replicas parse≠confirm. Drafts now in Redis (REDIS_URL on API)
  • Buddy join UX under 1s when prewarmed — clear “joining…” on agent present; fire activate immediately on mic tap; tighter wake burst; wake∥mic prep
  • TWoS *ohmmm* bubble — position + ellipsis cleanup (bubble dots kept)
  • Blank UI / diary load dead — /entries (Home hard-require) + /activity-items now async; mutex bypass for cold-load routes; runSync timeout resets the PG chain; food/timeline/fuel-gauge already async
  • Buddy “didn’t join” after healthy agent — re-activate no longer silent (publishes listening ack); client keeps early wake-ack and allows ~22s for one redispatch (was 12s race)
  • Activity Log / Buddy: Pilates — searchable in catalog; bare “Pilates” / “I did Pilates” classifies as training (Buddy + voice), not unknown/food
  • Health Sources / Oura load failure (beta) — integrations (and API) access-key auth no longer uses nested deasync under concurrent provider status fetches; Beta User Katja–style “Could not load health integrations” + missing Oura was the deadlock
  • Buddy “Handfull of studentenfutter” silent ignore — size-word + unknown snack (and 30 g X without “of”) now classifies as food_log so silence-commit / Done / ⚡ Quick Save actually fire (was not_food → keep listening)
  • Buddy “joining…” hang — force-redispatch always evicts zombie agents (no skipped_existing on recovery); client hard-fails connect UI ≤12s and clears the overlay on connecting timeouts; voice-agent pods get a LiveKit / liveness probe; deploy docs no longer default --skip-voice
  • Buddy food paste → Day Plan — product names like “High Protein … Pudding” no longer trigger Day Plan; multi-line gram lists go to Foodiary confirm
  • Gallery/camera → previous days — pick Today / Yesterday / date before photo; confirm card can still change the diary day before Save
  • Photo scan overlay — review note no longer shown twice (“Almost done…” modal)
  • Phone view modes — Näkymä / Desktop / Grid controls hidden on phone viewport; show KCAL Koti escape to Buddy Home instead; Full Desktop never mounts on phone
  • FI Quick Actions — meal buttons use i18n again (Lisää aamiainen …); Share/Export + Show all translated
  • Save confirmation toast — “Added …” appears as a fixed toast (was easy to miss at page footer)
  • API hang / stuck “Checking sign-in…” — SMTP send now has hard timeouts; Fixed+notify persists status before email and never blocks beta forever; invite auth status fetch times out in 8s with Try again (no infinite spinner)
  • Postgres deasync deadlock — sync request semaphore under Postgres so concurrent /api/auth/status cannot nested-loopWhile and freeze the only API pod (health/version stay concurrent). v0.7.64’s Promise-based mutex was wrong (hung the first DB call) — fixed in v0.7.65.
  • Deploy race on :latest — tag.sh / deploy.sh --wait-ci waits for this commit SHA’s build-image run(s), not the latest workflow on the repo
v0.7.x
Personal

How do I improve myself?

  • Buddy Home: log → Foodiary → Progress
  • Voice + text logging that sticks
  • Targets, fuel, and habit coaching
v0.6.x
Stability

Make the daily loop trustworthy.

  • Diary accuracy and day handling
  • Mobile layout hardening
  • Invitation-only beta ops
v0.5.x
Body data

Food, drink, and wearables connect.

  • Liquids as first-class (water, coffee, volume)
  • Quick food in Foodiary
  • Oura and health integrations
v0.4.x
Buddy voice

Talk to Buddy instead of fighting forms.

  • Voice as a primary log door
  • Preview → confirm before save
  • Usable mic in real rooms
v0.3.x
Progress

See whether the day is working.

  • Calorie and macro targets
  • Today’s progress after logging
  • Early coaching from what you ate
v0.2.x
Foodiary

A diary you can correct.

  • Foodiary to review and fix meals
  • Portions, edits, day browsing
  • Home captures; Foodiary proofreads
v0.1.x
Spark

First working Buddy — log something, see something.

  • Core food logging
  • Buddy as the intelligent helper
  • Invitation-only beta begins

The current era expands tester-facing patches from CHANGELOG.md. Operator / Admin notes stay off this page. When that era closes (next major line), detail folds back to the era summary only.

Help · Buddy Academy