Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
c8e8499
fix(whoop): degrade a per-resource 403 gracefully instead of parking …
MBombeck Jun 4, 2026
0458c9a
feat(whoop): ingest body measurement — weight, max-HR, profile height
MBombeck Jun 4, 2026
35264ea
feat(i18n): translate rhythm-event copy for es/fr/it/pl
MBombeck Jun 4, 2026
e8793c8
feat(i18n): translate Settings copy for es/fr/it/pl
MBombeck Jun 4, 2026
06da3c4
feat(i18n): translate Medications copy for es/fr/it/pl
MBombeck Jun 4, 2026
0cb8070
feat(i18n): translate Achievements copy for es/fr/it/pl
MBombeck Jun 4, 2026
8434af4
fix(medications): surface failed dose logging and add an undo affordance
MBombeck Jun 4, 2026
0c3c80a
fix(medications): show a pending spinner on the intake-edit save button
MBombeck Jun 4, 2026
3c7d12f
fix(medications): replace the list loading spinner with card skeletons
MBombeck Jun 4, 2026
fc6a55b
fix(medications): give the wizard stepper jump buttons a 44px touch t…
MBombeck Jun 4, 2026
2e3bfbb
feat(coach): add a stop control and abort the stream on drawer close
MBombeck Jun 4, 2026
b12dc1e
perf(coach): parallelise the cold-path snapshot reads
MBombeck Jun 4, 2026
fb4037e
fix(coach): tidy the message thread type scale, bubble width and empt…
MBombeck Jun 4, 2026
60b86f1
fix(insights): suppress recommendation-card hover lift under reduced …
MBombeck Jun 4, 2026
e63fae5
test(insights): pin the reduced-motion guard for .animate-insight-in
MBombeck Jun 4, 2026
0baad1e
refactor(insights): share one block skeleton across dynamic loaders, …
MBombeck Jun 4, 2026
16b7306
fix(insights): surface an error toast when recommendation feedback fails
MBombeck Jun 4, 2026
51959a4
fix(settings): give the API-token revoke button an accessible name an…
MBombeck Jun 4, 2026
eddc06d
style(settings): align the mobile passkey card padding with sibling s…
MBombeck Jun 4, 2026
ad3bbd5
fix(settings): show a friendly message when an export download fails
MBombeck Jun 4, 2026
e591137
fix(dashboard): confirm before discarding a partly-filled quick-entry…
MBombeck Jun 4, 2026
76426a2
fix(dashboard): match the tile skeleton to the resting tile height
MBombeck Jun 4, 2026
a8c0a30
fix(dashboard): skip prefilled date pickers in the quick-entry dirty …
MBombeck Jun 4, 2026
1a88a3e
refactor(whoop): single-source the collection-403 soft-skip handling
MBombeck Jun 4, 2026
b99f223
fix(whoop): reject non-positive or non-finite body-measurement values
MBombeck Jun 4, 2026
41d0628
fix(i18n): use the formal register for the French feedback-error string
MBombeck Jun 4, 2026
3bc6124
chore(release): v1.11.3 — WHOOP body data, quality-of-life polish, fu…
MBombeck Jun 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
# Changelog

## [1.11.3] — 2026-06-04 — WHOOP body data, quality-of-life polish, fuller translations

### Added

- **WHOOP body data.** WHOOP weight and maximum-heart-rate context now flow in alongside recovery, sleep, cycle, and workout data. Weight is ranked below a real scale by your source priority, so a connected scale or manual entry still wins; your profile height is filled in from WHOOP only if you haven't set one yet.
- **Stop a Coach reply mid-stream.** A Stop control appears while the assistant is answering, and closing the Coach drawer now ends an in-flight response instead of leaving it running.
- **Undo a logged dose.** The confirmation after taking or skipping a dose now offers an Undo, so a mis-tap is one tap to reverse instead of a trip into the history.

### Changed

- **More of the app speaks your language.** Spanish, French, Italian, and Polish now cover the Settings, Medications, Insights rhythm-event, and Achievements copy that previously fell back to English.
- **A WHOOP plan that doesn't expose every data type no longer breaks the connection.** A data class WHOOP declines to share is skipped on its own while the rest keeps syncing.
- The first Coach reply on a cold cache arrives faster — its inputs are now gathered in parallel.

### Fixed

- **A failed dose log is no longer silent.** If recording a dose doesn't go through, you now see an error instead of a confirmation for something that didn't happen.
- The quick-entry sheets only ask before discarding when you have actually typed something.
- A failed export now shows a clear message instead of a raw error code.
- Saving feedback on an Insights recommendation surfaces an error if it can't be stored.
- Several loading placeholders now reserve their final height, removing the small layout shifts on the Insights and dashboard surfaces as content lands.

### Accessibility

- Reduced-motion now suppresses the Insights card entrance animation.
- The API-token revoke button carries an accessible name and a larger target, and the medication scheduler's step controls have a larger touch target.

### Notes

- WHOOP weight is the value stored in your WHOOP profile, not a scale reading; it is ranked last among weight sources and only surfaces when nothing higher-priority is present.

## [1.11.2] — 2026-06-04 — Coach-memory controls, privacy hardening, more pinnable metrics

### Added
Expand Down
2 changes: 1 addition & 1 deletion docs/api/openapi.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
openapi: 3.1.0
info:
title: HealthLog API
version: 1.11.2
version: 1.11.3
description: >-
Self-hosted personal-health-tracking PWA — public API surface for the iOS native client and external ingest.

Expand Down
15 changes: 15 additions & 0 deletions messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,12 @@
"emptyDescription": "Lege zuerst ein Medikament mit Zeitfenster an, damit du die Einnahme protokollieren kannst.",
"emptyCta": "Medikament anlegen"
},
"quickEntryDiscard": {
"title": "Eintrag verwerfen?",
"description": "Du hast nicht gespeicherte Eingaben. Formular schließen und das Getippte verwerfen?",
"confirm": "Verwerfen",
"cancel": "Weiter bearbeiten"
},
"compliance7d": "Einnahmetreue (7 Tage)",
"mood": "Stimmung",
"customizeTitle": "Dashboard-Layout",
Expand Down Expand Up @@ -622,6 +628,10 @@
"skipped": "Übersprungen",
"intakeToastTaken": "{name} als genommen erfasst",
"intakeToastSkipped": "{name} übersprungen",
"intakeToastFailed": "{name} konnte nicht erfasst werden – bitte erneut versuchen",
"intakeUndo": "Rückgängig",
"intakeUndone": "Eintrag zurückgenommen",
"intakeUndoFailed": "Rückgängig fehlgeschlagen – im Verlauf korrigieren",
"weekdaySunday": "Sonntag",
"weekdayMonday": "Montag",
"weekdayTuesday": "Dienstag",
Expand Down Expand Up @@ -1518,6 +1528,7 @@
"feedbackThanks": "Danke für dein Feedback",
"feedbackConfirmed": "Feedback gespeichert",
"feedbackAlreadyRated": "Bereits bewertet",
"feedbackError": "Dein Feedback konnte nicht gespeichert werden. Bitte versuche es erneut.",
"confidence": "Vertrauen",
"confidenceAria": "Vertrauen: {value} von 100",
"confidenceHigh": "Hohes Vertrauen",
Expand All @@ -1539,6 +1550,7 @@
"regenerateAnalysis": "Analyse neu starten",
"regenerateSuccess": "Analyse wurde neu erstellt",
"warmAssessments": "Auswertungen vorbereiten",
"warmAssessmentsHint": "Auswertungen werden über Nacht automatisch aktualisiert. Bereite sie jetzt vor, um den neuesten Stand zu sehen.",
"warmStarted": "Auswertungen werden im Hintergrund erstellt",
"narrativeTitle": "Dein Zeitraum im Rückblick",
"narrativeWeek": "Diese Woche",
Expand Down Expand Up @@ -1696,6 +1708,7 @@
"tagline": "Persönlicher Gesundheitscoach, auf deine Daten gestützt.",
"newChat": "Neuer Chat",
"send": "Senden",
"stop": "Stopp",
"thinking": "Denke nach…",
"composerPlaceholder": "Frag mich etwas zu deinen Daten…",
"composerHint": "Enter zum Senden, Umschalt+Enter für eine neue Zeile.",
Expand Down Expand Up @@ -3093,6 +3106,7 @@
"title": "Export",
"description": "Lade deine Gesundheitsdaten als PDF, CSV oder vollständiges JSON-Backup herunter.",
"otherOptionsHeading": "Weitere Export-Optionen",
"downloadFailed": "Der Export konnte nicht heruntergeladen werden. Bitte versuche es erneut.",
"hero": {
"eyebrow": "Arzttermin",
"valueStatement": "Ein druckbarer PDF-Bericht für den Arzttermin — Vitalwerte, BMI, Blutdruck-Klassifikation, Medikamenten-Compliance und (optional) Stimmungsverlauf, alles auf wenigen Seiten.",
Expand Down Expand Up @@ -3457,6 +3471,7 @@
"tokenNamePlaceholder": "Token-Name (z.B. iPhone Shortcut)",
"tokenCreated": "Token erstellt — kopiere ihn jetzt! Er wird nicht erneut angezeigt.",
"tokenRevoke": "Token widerrufen?",
"tokenRevokeAction": "Token widerrufen",
"tokenRevokeDescription": "Der Token wird unwiderruflich deaktiviert. Anwendungen, die ihn nutzen, verlieren den Zugriff.",
"tokenRevoked": "Widerrufen",
"tokenExpired": "Abgelaufen",
Expand Down
15 changes: 15 additions & 0 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,12 @@
"emptyDescription": "Create a medication with a schedule first, then come back here to log the intake.",
"emptyCta": "Add medication"
},
"quickEntryDiscard": {
"title": "Discard this entry?",
"description": "You have unsaved input. Close the form and lose what you typed?",
"confirm": "Discard",
"cancel": "Keep editing"
},
"compliance7d": "Compliance (7 days)",
"mood": "Mood",
"customizeTitle": "Dashboard layout",
Expand Down Expand Up @@ -622,6 +628,10 @@
"skipped": "Skipped",
"intakeToastTaken": "{name} recorded as taken",
"intakeToastSkipped": "{name} skipped",
"intakeToastFailed": "Could not record {name} — try again",
"intakeUndo": "Undo",
"intakeUndone": "Entry reverted",
"intakeUndoFailed": "Could not undo — open the history to fix it",
"weekdaySunday": "Sunday",
"weekdayMonday": "Monday",
"weekdayTuesday": "Tuesday",
Expand Down Expand Up @@ -1518,6 +1528,7 @@
"feedbackThanks": "Thanks for your feedback",
"feedbackConfirmed": "Feedback recorded",
"feedbackAlreadyRated": "Already rated",
"feedbackError": "Could not save your feedback. Please try again.",
"confidence": "Confidence",
"confidenceAria": "Confidence: {value} of 100",
"confidenceHigh": "High confidence",
Expand All @@ -1539,6 +1550,7 @@
"regenerateAnalysis": "Re-run analysis",
"regenerateSuccess": "Analysis refreshed",
"warmAssessments": "Prepare assessments",
"warmAssessmentsHint": "Assessments refresh overnight automatically. Prepare them now to read the latest.",
"warmStarted": "Assessments are being prepared in the background",
"narrativeTitle": "Your period in review",
"narrativeWeek": "This week",
Expand Down Expand Up @@ -1696,6 +1708,7 @@
"tagline": "Personal health coach, grounded in your data.",
"newChat": "New chat",
"send": "Send",
"stop": "Stop",
"thinking": "Thinking…",
"composerPlaceholder": "Ask anything about your data…",
"composerHint": "Press Enter to send, Shift+Enter for a new line.",
Expand Down Expand Up @@ -3093,6 +3106,7 @@
"title": "Export",
"description": "Download your health data as PDF, CSV, or a full JSON backup.",
"otherOptionsHeading": "Other export options",
"downloadFailed": "Couldn't download the export. Please try again.",
"hero": {
"eyebrow": "Doctor visit",
"valueStatement": "A printable PDF report for your doctor's appointment — vitals, BMI, blood-pressure classification, medication compliance and (optionally) mood, all on a few pages.",
Expand Down Expand Up @@ -3457,6 +3471,7 @@
"tokenNamePlaceholder": "Token name (e.g., iPhone Shortcut)",
"tokenCreated": "Token created — copy it now! It won't be shown again.",
"tokenRevoke": "Revoke token?",
"tokenRevokeAction": "Revoke token",
"tokenRevokeDescription": "The token will be permanently deactivated. Applications using it will lose access.",
"tokenRevoked": "Revoked",
"tokenExpired": "Expired",
Expand Down
Loading
Loading