Repository navigation
Immutable
release. Only release title and notes can be modified.
What's Changed
- sync: the diary headline the monorepo landed as #696 by @kirmalyshev in #6
- The Telegram connector: chat parity over Telegram, dormant without a token by @kirmalyshev in #7
- Bump actions/checkout from 4.4.0 to 7.0.1 by @dependabot[bot] in #1
- A transport is not a sign-in: one predicate for who can reach an account by @kirmalyshev in #8
- Bump actions/dependency-review-action from 4.9.0 to 5.0.0 by @dependabot[bot] in #5
- Bump actions/upload-artifact from 4.6.2 to 7.0.1 by @dependabot[bot] in #4
- Bump github/codeql-action/init from c20e34f438d671fc35777cc9820dd7adf8252874 to faaca9a8f6edddba5725ffe5adefdab6669a2eca by @dependabot[bot] in #3
- Bump github/codeql-action/analyze from c20e34f438d671fc35777cc9820dd7adf8252874 to faaca9a8f6edddba5725ffe5adefdab6669a2eca by @dependabot[bot] in #2
- refactor: move the workspaces under src/, and web becomes frontend by @kirmalyshev in #9
- dev: a ./dev stack of this repo's own, ported from the monorepo by @kirmalyshev in #10
- dev: a test database per worktree, derived like every other value by @kirmalyshev in #11
- feat: offline capture — photos and messages are kept on the device and sent exactly once by @kirmalyshev in #14
- iac: the production images, the compose file and the edge — self-hosting, and nothing about the box by @kirmalyshev in #15
- feat(llm): store the system prompts, with the code constants as seed and fallback by @kirmalyshev in #12
- Row-level security, scoped per user: enabled, forced, and deny-by-default by @kirmalyshev in #13
- i18n: full localization in eight languages (#358) by @kirmalyshev in #16
- i18n: copy moves into the Lingui catalogs — three tables, and the guards that follow them by @kirmalyshev in #20
- The PKCS#8 guard words are assembled, not written out by @kirmalyshev in #21
- fix: db.sh pins the compose project against the caller's environment by @kirmalyshev in #23
- db-init: the hand-over is a contract with store.pg.ts, and now a test says so by @kirmalyshev in #22
- dev: this repo's own port ladder, so it stops fighting the monorepo for 8787 by @kirmalyshev in #25
- dev: the derivation outranks the caller's environment, not the other way round by @kirmalyshev in #27
- budget: one guess in the day makes the day's figure a guess by @kirmalyshev in #30
- palette: the dark half becomes a drawn register by @kirmalyshev in #32
- web: two columns, a table, and the number rule by @kirmalyshev in #34
- design: the system as a module, not a document by @kirmalyshev in #36
- The sample becomes one analysis (FREE_ANALYSES 15 → 1) by @kirmalyshev in #45
- The v5 Spud onboarding on the web, and the contract both clients render by @kirmalyshev in #46
- One number per thing, and the floor as a status line by @kirmalyshev in #48
- AGENTS.md: a review does not overrule the principal by @kirmalyshev in #41
- chore(deps): Bump actions/upload-pages-artifact from 3.0.1 to 5.0.0 by @dependabot[bot] in #40
- First verdict: one verdict, Spud only, Correct meal edits the whole meal (#49) by @kirmalyshev in #54
- Copy: every line true where it stands (#50) by @kirmalyshev in #57
- Plan page: the date, the arithmetic, saturated fat, Spud (#51) by @kirmalyshev in #59
- Web app in the Spud design: tokens, transcript, one light rule, real offer, diary logs (#52) by @kirmalyshev in #60
- DELETE /v1/meals/:id: a meal screen can delete its meal (#61) by @kirmalyshev in #62
- Web: onboarding mechanics and accessibility from the audit (#53) by @kirmalyshev in #63
- French, complete and first-class (rebased #58) by @kirmalyshev in #64
- Under-16 stop: say the delete it is doing (#65) by @kirmalyshev in #66
- Today (web): date once on a white switcher bar, coloured macro counters (shared macroTone) by @kirmalyshev in #72
- targets: appliedDeltaKcal is the delta the final target carries, floor included by @kirmalyshev in #76
- Redesign S4 · Targets v2 — other sex, three activity levels, macro targets by @kirmalyshev in #102
- Web paywall configured by env vars: plans, exit offer, self-host friendly (#77) by @kirmalyshev in #101
- S3 · Geometry and units, the pure helpers both clients draw with by @kirmalyshev in #98
- S1 · Register P tokens, type, fonts, motion (#78) by @kirmalyshev in #99
- Redesign S2 · The icon set (#79) by @kirmalyshev in #100
- S7 · The reads Home, Progress and You need, plus the persona seed (#84) by @kirmalyshev in #104
- Redesign S8 · Sign-up before the first meal, with consent by @kirmalyshev in #105
- Redesign S6 · The plan headline's claims exemption (#83) by @kirmalyshev in #107
- Redesign W0 · App shell (first, alone) (#87) by @kirmalyshev in #108
- Redesign S5 · Profile and onboarding v2 (the steps, their readers, their words) by @kirmalyshev in #109
- Move welcome and sign-up screen words to src/shared/app/signup-copy.ts by @kirmalyshev in #111
- Move the estimate chart's Target chip off the curve (#112) by @kirmalyshev in #115
- Trim reads: projection onto WeightsResponse, lean DaysResponse (#117) by @kirmalyshev in #123
- Home copy table: every W4/M4 board string, both clients, 8 languages by @kirmalyshev in #121
- S9: Chat speaks as Gabie, and the starters read the struggles by @kirmalyshev in #114
- Redesign W6/M6 · the meal surface's copy table (#93) by @kirmalyshev in #116
- Redesign W1 · Web component kit (#88) by @kirmalyshev in #120
- A change, named: the server's computed line after a meal edit (#119) by @kirmalyshev in #131
- shared: YOU_COPY — the You surface's copy table (#97) by @kirmalyshev in #127
- Retention: sweep abandoned accounts after 30 idle days (#106) by @kirmalyshev in #132
- Inline verdict form for diary rows, in eight languages (#122) by @kirmalyshev in #124
- W5 log copy table: LOG_COPY, both clients, all 8 languages by @kirmalyshev in #125
- pay-copy: the W9 paywall's words, both clients, eight languages (#96) by @kirmalyshev in #126
- Retire the mailing list backend (#113) by @kirmalyshev in #134
- Redesign W7/M7 · the chat surface's copy table (#94) by @kirmalyshev in #129
- The Progress surface's copy table (#95), both clients, eight languages by @kirmalyshev in #128
- S10 · BMI and Health Score (#118) by @kirmalyshev in #133
- The four score icons: fibre, sugar, help, salt (#136) by @kirmalyshev in #137
- Chat: the coach answer carries its macro's bar — Answered.focus (#94) by @kirmalyshev in #143
- web:e2e ports derived from the worktree slot (#138) by @kirmalyshev in #142
- The server sends the verdict words — sever Lingui from the web bundle by @kirmalyshev in #145
- W2 · /start onboarding: welcome to medical limits (00–14b) by @kirmalyshev in #140
- ProfileResponse: coachName + hasLoggedMeal (the log surface's API, #92) by @kirmalyshev in #149
- You's server half: entitlement.trialDay + healthConnected (#97) by @kirmalyshev in #153
- W8 · Progress API and shared rules (#95's non-UI half) by @kirmalyshev in #156
- W8 · the Progress web surface (#95) by @kirmalyshev in #154
- W5: the log surface — #/log (#92) by @kirmalyshev in #146
- PATCH /v1/meals/:id takes a date; HealthScore sends its base (W6 API) by @kirmalyshev in #150
- shared: countryFlag — the regional-indicator flag for a country code by @kirmalyshev in #159
- Redesign W7 · the Chat surface — Register P thread, composer, coach bar, meal-edit entry (#94) by @kirmalyshev in #157
- The meal surface — master-detail, menu, score breakdown (#93) by @kirmalyshev in #151
- W3 · /start after the questions: the reveal, the plan, sign-up, country, the handoff (#90) by @kirmalyshev in #160
- Gabie's logged-meal verdict line, computed (#130) by @kirmalyshev in #135
- API: ProfileResponse.age + shared macroLeft (W10 #97 prerequisite) by @kirmalyshev in #167
- signup-copy: continueWith, the provider button's label, shared by @kirmalyshev in #169
- W10 · You — the Register P account surface (#97) by @kirmalyshev in #165
- dev-env: a pinned EAIT_WORKTREE_SLOT answers outside a listed worktree by @kirmalyshev in #161
- Redesign W4 · Home / Today — the two-column diary by @kirmalyshev in #164
- log-copy: the phone's remaining states sheets and control labels by @kirmalyshev in #176
- home-copy: the phone picker's nav/close words and the guess hedge (#923) by @kirmalyshev in #179
- meal-copy: the keypad's backspace label, shared (#925) by @kirmalyshev in #181
- Shared: the Apple Health surface's words, its three charts, and three perf ids by @kirmalyshev in #180
- you-copy: the phone's typed-weight and staged-edit lines (ieat-app#929) by @kirmalyshev in #183
- chat-copy: the phone's chat literals + the macro figure as two keys (ieat-app#926) by @kirmalyshev in #184
- perf: PERF_SCREENS entries for the You stack's pushed screens (ieat-app#929) by @kirmalyshev in #185
- chat-copy: phone.notLogged — the kept turn's refused wording by @kirmalyshev in #186
- Shared: the body trend's pace read, off the plan's own ladder (ieat-app#927) by @kirmalyshev in #187
- You (web): the end pixel pass vs the board (#175) by @kirmalyshev in #190
- Shared: M8 review keys — alert titles, templates, frame + dash emits by @kirmalyshev in #189
- meal-copy + results: the fix/ingredient screens' words, and the change line on MealUpdated (ieat-app #965) by @kirmalyshev in #191
- meal-copy: the fix line's {kcal}, and the joins as templates — phoneGrams, phoneMealMove (ieat-app #965) by @kirmalyshev in #193
- Shared: M10 phone pieces — activityDeltaKcal, age-given targets, zoned Intl helpers, lane dash by @kirmalyshev in #192
- editMeal: derive meal totals from an items-only patch by @kirmalyshev in #195
- web meal: Cal-AI edit panels — the fix sheet and the ingredient editor (#188) by @kirmalyshev in #194
- meal detail: menu closed on arrival, main's padding restored (#172) by @kirmalyshev in #197
- chat: no Edit·Delete row on thread lines (#173) by @kirmalyshev in #198
- chore(deps): bump github/codeql-action init and analyze to 4.38.1 by @kirmalyshev in #56
- docs: add launch video to README by @kirmalyshev in #199
- docs: play the launch video inline in README by @kirmalyshev in #201
- home: page 2 replaces the card area, past days read left/over (#170) by @kirmalyshev in #202
- docs: update README launch video with chat and progress by @kirmalyshev in #204
- shared: the boot-failure and crash-boundary words (ieat-app#978) by @kirmalyshev in #203
- log upload: the column is the board's 560px, centred mid-height (#171) by @kirmalyshev in #206
- docs: README launch video with the landing's photos by @kirmalyshev in #208
- progress: uppercase labels, one-decimal BMI, label clears the bars (#174) by @kirmalyshev in #209
- web client: resize picked photos to a 768 px edge before upload by @kirmalyshev in #207
- home: the side column is a labelled landmark (#178) by @kirmalyshev in #211
- donations: FUNDING.yml, README support, and the sent Support row (#200) by @kirmalyshev in #212
- shared: Hermes-safe Intl — PluralRules, ListFormat, DisplayNames fallbacks (ieat-app#977) by @kirmalyshev in #205
- start: the W2 follow-ups — classes, named constants, escaping, tests (#141) by @kirmalyshev in #215
- qwen3-vl-235b as the analyzer, reasoning off — and the glance retired by @kirmalyshev in #216
- copy: Health score → Day score, all eight languages (#221) by @kirmalyshev in #223
- llm: pin the nutrition calls to DeepInfra, fallbacks refused by @kirmalyshev in #224
- AGENTS.md: API first, stale-test policy, the Hermes rule (#222) by @kirmalyshev in #226
- log: W5 follow-ups — radius tokens, kept/refused seams tested (#148) by @kirmalyshev in #225
- chat: W7 follow-ups — radius + stagger tokens, the spec gaps (#158) by @kirmalyshev in #227
- health copy: the ru intake periods take за (#182) by @kirmalyshev in #229
- log: verdict detail for every declared cap — sodium spelled mg (#147) by @kirmalyshev in #230
- web: refusal sentences are LOG_COPY's, one wording for both clients (#177) by @kirmalyshev in #231
- editMeal: the capped macros follow a grams edit — no stale verdicts (#196) by @kirmalyshev in #232
- e2e: the web specs meet the redesign (#168) by @kirmalyshev in #233
- README: move Support eait to the bottom by @kirmalyshev in #234
- test: the script-tag regex reads attributes and case by @kirmalyshev in #163
- home-copy: day note drops the kcal figure (ieat-app#1000) by @kirmalyshev in #235
- log-copy: the verdict detail line is composed in shared — a missing unit cannot render by @kirmalyshev in #236
- meal-copy: drop "was {amount}" from the ingredient editor by @kirmalyshev in #237
- home: the calorie card rides page 1 of the card track by @kirmalyshev in #238
- README: a meal logged from a photo, under the demo video by @kirmalyshev in #240
- Fix flaky app-chat specs (#239) by @kirmalyshev in #241
- README: drop the demo-video caption by @kirmalyshev in #243
- Chat coach is Spud, not Gabie (eait half) by @kirmalyshev in #245
- diary: list a day's meals newest first (ieat-app#1043) by @kirmalyshev in #246
- engine: refuse an empty estimate before it is recorded (#248) by @kirmalyshev in #249
- llm: retry a degenerate text estimate once, with the emptiness named (#248) by @kirmalyshev in #250
- chat (web): W7 drawing fixes — pills, send arrow, on-plan colour, 390px overflow, photo stamp (#244) by @kirmalyshev in #247
- web /start: a typed height carries the unit the page showed (#251) by @kirmalyshev in #253
- Seed meals with the landing's licensed photos by @kirmalyshev in #254
- chat: Spud stops posting calorie comments after a meal (ieat-app#1066) by @kirmalyshev in #256
- web: the proposal card's "Log it" answers from the right by @kirmalyshev in #257
- Weight chart: no dots on the line by @kirmalyshev in #255
- onboarding: activity is four workout bands — 0 / 1–2 / 3–4 / 5+ by @kirmalyshev in #258
- chat (web): the boards' words and marks for kept turns (states-failed, states-unknown) by @kirmalyshev in #265
- pay-copy: the no-trial CTA and its auto-renew line (ieat-app#928) by @kirmalyshev in #259
- You screen + meal ingredient: redesign gap close (#262) by @kirmalyshev in #267
- web onboarding: four-up activity tiles, country search that keeps the pick (#264) by @kirmalyshev in #269
- Home: the diary matches the boards — compact rows, the day's own proposal card (closes #260) by @kirmalyshev in #268
- meal-ingredient: "was {amount}" returns to the editor, drawn once the amount moves by @kirmalyshev in #270
- chat-core: read the held proposals back with every page (#530) by @kirmalyshev in #271
- perf: the Progress tab's PERF_SCREENS entry (ieat-app #1102) by @kirmalyshev in #272
- design: the .rise overlay radius token by @kirmalyshev in #273
- Chat: correcting a live proposal amends it; a turn's clock is bounded by @kirmalyshev in #275
- Turn overrun: stage on TurnOverran + per-call deadline inside run() (#276) by @kirmalyshev in #277
- POST /v1/clip/estimate: the App Clip's anonymous estimate by @kirmalyshev in #278
- copy: macros, not verdict, in user-visible strings by @kirmalyshev in #280
- Device walk #1144: retry an upstream 429 once; an expired typed proposal draws the expired line by @kirmalyshev in #281
- chore(deps): Bump actions/deploy-pages from 4.0.5 to 5.0.1 by @dependabot[bot] in #39
- chat-core: a superseded typed proposal is not expired by @kirmalyshev in #283
- chore(deps): upgrade all packages to their latest releases by @kirmalyshev in #285
- /start: the welcome demo fills its card; sign-up shows the app icon by @kirmalyshev in #287
- start: two-column option grids collapse to one column under 720px by @kirmalyshev in #296
- /start age step: the band centres the chosen age (#289) by @kirmalyshev in #297
- /start: the how-it-works cards match the board — badges in the head, figures below (#291) by @kirmalyshev in #298
- /start: the unit toggle is a pill and the weight rulers match the boards (#288) by @kirmalyshev in #307
- /start welcome: CTA row and side gutter at narrow widths (#292) by @kirmalyshev in #309
- /start sign-up: the Google logo gets its gap, and Privacy Policy its underline (#295) by @kirmalyshev in #310
- /start plan: progress bar off the heading, readable Target chip (#293) by @kirmalyshev in #312
- /start: the on-track and pace steps match their boards (#294) by @kirmalyshev in #313
- web: two-row top bar at phone width — date switcher and streak chip reachable at 390px by @kirmalyshev in #314
- log: the result views draw the photo in the full-width main by @kirmalyshev in #315
- Web Today: the inline meal proposal gets its card frame and a filled Log it (#301) by @kirmalyshev in #316
- web: the failed diary's Try again keeps its padding (#304) by @kirmalyshev in #320
- Shared: the lane-open weight chart compresses its band so the end label clears the lane's own (#303) by @kirmalyshev in #319
- chat copy: a held outcome-unknown turn no longer claims it re-sends itself (ieat-app#1106) by @kirmalyshev in #321
- web chat: keep an outcome-unknown send held in the thread (#302) by @kirmalyshev in #318
- dev seed: the photo bubble's line names the meal it logged (#306) by @kirmalyshev in #322
- meal detail: the score sheet keeps its margins below 472px (#305) by @kirmalyshev in #323
- /start sign-up: Terms links to the published document (#311) by @kirmalyshev in #324
- Fix the app-chat Send-again flake — unroute limboed the outbox's own retry (#266) by @kirmalyshev in #325
- outbox: bound a send that never settles by a deadline (#327) by @kirmalyshev in #328
- app-offline spec: count sends at the network layer, not inside a route (#326) by @kirmalyshev in #330
- ui/charts: the weigh-in line draws the 7-day trend, not raw samples by @kirmalyshev in #329
- ui/charts: the weigh-in line's end label clears the stroke (#331) by @kirmalyshev in #332
- lang: signedWholeNumbers staples the sign itself (#333) by @kirmalyshev in #334
- meals: a cooking-fat mark survives only where the item is one (#317) by @kirmalyshev in #338
- web: the /start primary button takes the brand green (#336) by @kirmalyshev in #340
- web: the meal score sheet titles itself Meal score (#337) by @kirmalyshev in #341
- Web Home: macro pages on every day, app icon, tappable empty day, week strip swipes (#342) by @kirmalyshev in #343
- Demo analyzer replays three frozen production reads for the store capture by @kirmalyshev in #308
- Meal names: one shared mealNames — ' +N' past two items, first letter upper-cased by @kirmalyshev in #344
- Health sync: a typed weigh-in outranks a same-day import; a >10% jump waits (ieat-app#1233) by @kirmalyshev in #345
- Chat: the calories bar reads kcal; the coach writes thousands separators (ieat-app#1228) by @kirmalyshev in #346
- Meal edit: every item at 0 g is refused — engine, contract and web (ieat-app#1224) by @kirmalyshev in #347
- Day score: a past day's card and sheet never say today (ieat-app#1222) by @kirmalyshev in #348
- Weight charts: the axis names the year when the range starts in another (ieat-app#1230) by @kirmalyshev in #349
- Apple Health intake: over-plan buckets read bad; Days is 'the last 7 days' (ieat-app#1231) by @kirmalyshev in #350
- Deleting a meal takes its correction and change lines out of the thread (ieat-app#1227) by @kirmalyshev in #353
- Chat: a coach answer keeps its card and suggestions across a reload (ieat-app#1229) by @kirmalyshev in #354
- Web meal menu: a typed meal is not offered 'Re-read the photo' (ieat-app#1225) by @kirmalyshev in #357
- Charts: thin the x captions so 26 weeks or 12 months stop overprinting (ieat-app#1232) by @kirmalyshev in #355
- Web meal: deleting a meal closes to the diary (ieat-app#1226) by @kirmalyshev in #352
- Weight card: no hairline through the target lane's label (ieat-app#1236) by @kirmalyshev in #356
- Home macro pager: the shorter page's card row stretches to the track's bottom (ieat-app#1241) by @kirmalyshev in #360
- Icons: kcal wears the Cal AI flame, the streak chip's shape (eait#358) by @kirmalyshev in #359
- Home kcal card: drop the "about" hedge before the figure (ieat-app#1249) by @kirmalyshev in #363
- Web chat composer: the growing field, capped at five lines (ieat-app#1289) by @kirmalyshev in #367
- Chat composer controls take the control radius, not circles (ieat-app#1290) by @kirmalyshev in #368
- Motion: the rise/pop fades run on filter:opacity() (closes #362) by @kirmalyshev in #369
- store.pg binds objects to jsonb params instead of JSON.stringify'd text by @kirmalyshev in #371
- test: scope api.test.ts's fetch mock to the app's own relative calls by @kirmalyshev in #372
- onboarding: sweep the last references to the retired goal cards (#74) by @kirmalyshev in #373
- test: scope the d7 retention count to this run's delta (closes #17) by @kirmalyshev in #375
- ms_queue counts from request receipt, not capturedAt by @kirmalyshev in #376
- Photo queue API: log a photo as a background job, one push when counted (ieat-app#1318) by @kirmalyshev in #378
- shared: F's line icons, the over token, macroTip(), and the end of 'rough estimate' (ieat-app#1291 · ieat-app#1317) by @kirmalyshev in #377
- Web photo queue: upload, drop anywhere or paste joins today's list (ieat-app#1318) by @kirmalyshev in #379
- shared: gramLeft/gramOver + the F hero's line flame (ieat-app#1291) by @kirmalyshev in #380
- shared: flame — the F hero's line flame inside the day ring (ieat-app#1291) by @kirmalyshev in #381
- Home F web: strip on top, F card in the side column, tips, keys (closes #335) by @kirmalyshev in #382
- Day score, no score yet: "—/10" and the spoken name (ieat-app#1331, #1337) by @kirmalyshev in #383
- Home list title: "Recently uploaded" → "Recent" (all 8 languages) by @kirmalyshev in #386
- Remove the "never below {floor}" marker line (web half of ieat-app#1353) by @kirmalyshev in #392
- No space between a figure and its unit: 55g · 900mg · 540kcal (web half of ieat-app#1358) by @kirmalyshev in #393
- Macro icons are the bare line glyph everywhere — no tinted disc (web half of ieat-app#1362) by @kirmalyshev in #394
- Every kcal figure without a thousands separator — one kcal formatter (closes #390) by @kirmalyshev in #395
- Web upload: the photo flies into its Home row, no toast (#391) by @kirmalyshev in #396
- Meal screen: drop the change line after a correction (web half of ieat-app#1374) by @kirmalyshev in #397
- Macro tip opens inline under the tapped bar (web + shared) by @kirmalyshev in #399
- Onboarding plan reveal: the journey, the outcome, how we got there (web + shared) by @kirmalyshev in #404
- Web: remove the 'rough estimate' label (diary, chat) — closes #400 by @kirmalyshev in #403
- Meal corrections run as a queued job: update route, one runner, web rows by @kirmalyshev in #406
- PAY_COPY: the paywall redesign's words + a check-circle icon (ieat-app#1391) by @kirmalyshev in #401
- Onboarding order: the how and on-track beats move after the questions, before the plan by @kirmalyshev in #408
- Web: Update on a correction closes back to where the user was by @kirmalyshev in #410
- Keep what the user typed in its own field after a failure by @kirmalyshev in #412
- ChatCore: a plain refusal hands its words back too by @kirmalyshev in #413
- Web onboarding: the target step's suggestion speaks the chosen units (ieat-app#1411) by @kirmalyshev in #415
- Stored reads: Indonesian and Vietnamese for the store capture by @kirmalyshev in #416
- deps: patch braces (GHSA-vfj7-8cjw-p6xm) by @kirmalyshev in #418
- Web Home: the phone's F card, strip and rows, measured (#384) by @kirmalyshev in #417
- Progress "This week": drop the "kcal a day · plan X" text by @kirmalyshev in #419
- dayLabel speaks the reader's language (kirmalyshev-org/ieat-app#1451) by @kirmalyshev in #420
- Meal card + range chips: hyphenate captions, never wrap chip labels (ieat-app#1453) by @kirmalyshev in #421
- The #1357 failure lines in all eight languages (ieat-app#1442) by @kirmalyshev in #423
- monthLabel speaks the reader's language (kirmalyshev-org/ieat-app#1464) by @kirmalyshev in #424
- Target ruler: floor and "now" marker labels stop overprinting (ieat-app#1201) by @kirmalyshev in #426
- A timed-out chat turn puts its words back in the box, then says so (kirmalyshev-org/ieat-app#1462) by @kirmalyshev in #425
- Target ruler: marker labels keep 6pt off the needle too (ieat-app#1201) by @kirmalyshev in #427
- Day score sheet: say each thing once — one meal opens its breakdown (ieat-app#1472) by @kirmalyshev in #428
- Weight chart: line ends are the real first and last weigh-ins (ieat-app#1282) by @kirmalyshev in #429
- Goal card: re-anchor the arc's start when the newest weigh-in drifts past it (ieat-app#1486) by @kirmalyshev in #430
- Demo: fault-injection hook (/demo/fault) for the error-state boards (ieat-app#1178) by @kirmalyshev in #431
- l10n: register, cancel-before-day, Health card, de/es word order (ieat-app#1490) by @kirmalyshev in #432
- Two-replica-safe singletons: leader lock, migrate lock, SIGTERM drain (#414 step 1) by @kirmalyshev in #433
- GET /v1/jobs: contract + route, backend only (#414 step 2) by @kirmalyshev in #434
- jobs table + store methods, expand-only (#414 step 3) by @kirmalyshev in #435
- Durable queue: jobs table, handler registry, worker loop (#414 step 4) by @kirmalyshev in #436
- Weight chart: inset the scale so the end label can never reach the date row (ieat-app#1507) by @kirmalyshev in #437
- LISTEN/NOTIFY for job followers and the worker (#414 step 5) by @kirmalyshev in #439
- Lock the composer field for the turn's span — a second send can no longer be wiped (#438) by @kirmalyshev in #440
New Contributors
- @kirmalyshev made their first contribution in #6
- @dependabot[bot] made their first contribution in #1
Full Changelog: https://github.com/kirmalyshev/eait/commits/v1.0.0