Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,15 @@
- A failed load of your share links now says so, with a way to retry, instead of quietly showing "no active share links" as if you had never shared anything. The same held for the API and connector token lists on the security screens.
- A read that fails now shows a clear, recoverable error across the app instead of an empty list or a silent gap. The sharing and token screens, the ECG detail and list, the cycle and mood insights, the dashboard preventive-care tile, the checkups list, and the admin console all say when a read failed and offer a retry, rather than reading as "nothing here".
- The AI consent and connector notes in Settings render as normal text now, not faint fine print, so the copy you are meant to read before turning a feature on is legible.
- The record-a-visit action on the checkups list now appears only where there is a real practice visit behind the reminder. A reminder you satisfy yourself in the app, like weighing in or a mood check-in, no longer offers to file a visit it never involved.
- The practices and doctors address book searches by specialty now, so typing "Zahnmedizin" finds the dentist even when the name and practice hold nothing of the sort. The list groups its entries under their specialty, with the ones you left unspecified gathered at the end, and the visit form's picker shows each contact's field beside the practice.
- Linking documents, lab results and illnesses to a visit is searchable now instead of a flat list you had to scroll. Each link block shows what you have picked as removable chips over an add button that opens a searchable sheet; lab results gather under their panel and sample date so you can attach a whole day's panel in one tap, and documents gather by month. The vaccination form uses the same picker for its document link.
- The respiratory-rate tile on the dashboard shows its unit in your own language instead of a fixed English label, and the personalized greeting carries its comma.

### Removed

- Logging water by hand inside the app is gone. The water entry on the capture menu, the dashboard quick-add and the hydration card have all been removed. Water that syncs in from another app through Apple Health still arrives and still shows on the hydration card with its daily total, history and reference line.

## [1.37.3] — 2026-08-09

### Added
Expand Down
2 changes: 1 addition & 1 deletion e2e/mobile-viewport.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ test.describe("mobile-viewport smoke", () => {
// 1) The center capture action opens the capture picker.
await page.getByTestId("bottom-nav-capture").click();
await expect(page.getByTestId("capture-picker-options")).toBeVisible();
for (const kind of ["measurement", "medication", "mood", "water"]) {
for (const kind of ["measurement", "medication", "mood"]) {
await expect(page.getByTestId(`capture-picker-${kind}`)).toBeVisible();
}
// Dismiss the picker before opening the hub.
Expand Down
2 changes: 1 addition & 1 deletion e2e/setup/global-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ export default async function globalSetup(config: FullConfig): Promise<void> {
// out (50+ failed CI runs since v1.4.13). Specs that need the
// tour can opt back in by mocking `/api/auth/me`.
// Nutrients is intentionally opt-in in production. The shared fixture
// enables it because the water-capture specs exercise that real gate.
// enables it so the nutrients/hydration display specs render the card.
await pool.query(
`INSERT INTO users
(id, username, email, password_hash, role,
Expand Down
148 changes: 0 additions & 148 deletions e2e/water-capture.spec.ts

This file was deleted.

32 changes: 17 additions & 15 deletions messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -349,9 +349,7 @@
"medication": "Medikament",
"medicationDescription": "Eine Dosis als genommen markieren",
"mood": "Stimmung",
"moodDescription": "Stimmung und Tags erfassen",
"water": "Wasser",
"waterDescription": "Wasseraufnahme schnell hinzufügen"
"moodDescription": "Stimmung und Tags erfassen"
},
"cycle": "Zyklus",
"labs": "Laborwerte",
Expand Down Expand Up @@ -455,7 +453,6 @@
"quickAddMeasurement": "Messung erfassen",
"quickAddMood": "Stimmung erfassen",
"quickAddMedicationIntake": "Einnahme erfassen",
"quickAddWater": "Wasser erfassen",
"customizeDashboard": "Dashboard anpassen",
"medicationIntakeQuickAdd": {
"sheetTitle": "Medikamenteneinnahme erfassen",
Expand Down Expand Up @@ -9654,17 +9651,11 @@
"dayInvalid": "Die Einträge trugen ein Datum, das der Server nicht akzeptieren konnte. Das kann passieren, wenn Uhrzeit oder Zeitzone auf der sendenden Seite falsch eingestellt sind — das lohnt sich zu prüfen.",
"upsertFailed": "Diese Einträge haben den Server erreicht, aber ein Problem auf unserer Seite hat verhindert, dass sie gespeichert wurden. Du musst nichts weiter tun.",
"unknown": "Diese Einträge sind angekommen, konnten aber nicht gespeichert werden."
}
},
"moduleEnableError": "Das Nährstoffmodul konnte nicht aktiviert werden. Versuch es noch mal."
},
"hydration": {
"referenceMeta": "Richtwert {value} {unit}/Tag · EFSA",
"quickAddTitle": "Wasser hinzufügen",
"quickAddCustomLabel": "Eigene Menge (ml)",
"quickAddCustomPlaceholder": "250",
"quickAddSubmit": "Hinzufügen",
"quickAddError": "Konnte nicht gespeichert werden — versuch's noch mal.",
"quickAddSuccess": "{amount} ml Wasser hinzugefügt.",
"editTotal": "Heutige Summe bearbeiten"
"referenceMeta": "Richtwert {value} {unit}/Tag · EFSA"
},
"caffeine": {
"ceilingMeta": "Sichere Obergrenze {value} {unit}/Tag · EFSA"
Expand Down Expand Up @@ -10285,7 +10276,7 @@
"description": "Dein eigenes Adressbuch — einmal tippen, überall auswählen.",
"linkLabel": "Adressbuch",
"add": "Eintrag",
"searchPlaceholder": "Name oder Praxis suchen",
"searchPlaceholder": "Name, Praxis oder Fachrichtung suchen",
"loadError": "Adressbuch konnte nicht geladen werden.",
"emptyTitle": "Noch kein Eintrag",
"emptyDescription": "Lege eine Praxis an, damit du sie beim Termin auswählen kannst.",
Expand All @@ -10304,6 +10295,17 @@
"saveFailed": "Eintrag konnte nicht gespeichert werden.",
"deleteTitle": "Eintrag löschen?",
"deleteDescription": "Deine bisherigen Termine bleiben erhalten und behalten diesen Namen.",
"deleteFailed": "Eintrag konnte nicht gelöscht werden."
"deleteFailed": "Eintrag konnte nicht gelöscht werden.",
"noSpecialtyGroup": "Ohne Fachrichtung"
},
"links": {
"picker": {
"add": "Hinzufügen",
"done": "Fertig",
"selectAll": "Alle auswählen",
"searchPlaceholder": "Suchen",
"searchNoMatch": "Kein Treffer",
"remove": "Entfernen"
}
}
}
32 changes: 17 additions & 15 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -349,9 +349,7 @@
"medication": "Medication",
"medicationDescription": "Mark a dose as taken",
"mood": "Mood",
"moodDescription": "Log your mood and tags",
"water": "Water",
"waterDescription": "Quickly add your water intake"
"moodDescription": "Log your mood and tags"
},
"cycle": "Cycle",
"labs": "Labs",
Expand Down Expand Up @@ -455,7 +453,6 @@
"quickAddMeasurement": "Log measurement",
"quickAddMood": "Log mood",
"quickAddMedicationIntake": "Log medication intake",
"quickAddWater": "Log water",
"customizeDashboard": "Customize dashboard",
"medicationIntakeQuickAdd": {
"sheetTitle": "Log medication intake",
Expand Down Expand Up @@ -9654,17 +9651,11 @@
"dayInvalid": "The entries carried a date the server couldn't accept. This can happen when the clock or time zone on the sending side is wrong — it's worth checking.",
"upsertFailed": "These entries reached the server, but a problem on this end kept them from being saved. There's nothing you need to do.",
"unknown": "These entries arrived but couldn't be stored."
}
},
"moduleEnableError": "The nutrients module couldn't be turned on. Please try again."
},
"hydration": {
"referenceMeta": "Reference intake {value} {unit}/day · EFSA",
"quickAddTitle": "Add water",
"quickAddCustomLabel": "Custom amount (mL)",
"quickAddCustomPlaceholder": "250",
"quickAddSubmit": "Add",
"quickAddError": "Couldn't save that — try again.",
"quickAddSuccess": "{amount} mL water added.",
"editTotal": "Edit today's total"
"referenceMeta": "Reference intake {value} {unit}/day · EFSA"
},
"caffeine": {
"ceilingMeta": "Safe-level ceiling {value} {unit}/day · EFSA"
Expand Down Expand Up @@ -10285,7 +10276,7 @@
"description": "Your own address book — type a practice once, pick it everywhere.",
"linkLabel": "Address book",
"add": "Entry",
"searchPlaceholder": "Search name or practice",
"searchPlaceholder": "Search name, practice or specialty",
"loadError": "The address book could not be loaded.",
"emptyTitle": "No entry yet",
"emptyDescription": "Add a practice so you can pick it when you record a visit.",
Expand All @@ -10304,6 +10295,17 @@
"saveFailed": "The entry could not be saved.",
"deleteTitle": "Delete this entry?",
"deleteDescription": "Your existing visits stay, and they keep this name.",
"deleteFailed": "The entry could not be deleted."
"deleteFailed": "The entry could not be deleted.",
"noSpecialtyGroup": "No specialty"
},
"links": {
"picker": {
"add": "Add",
"done": "Done",
"selectAll": "Select all",
"searchPlaceholder": "Search",
"searchNoMatch": "No match",
"remove": "Remove"
}
}
}
32 changes: 17 additions & 15 deletions messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -349,9 +349,7 @@
"medication": "Medicamento",
"medicationDescription": "Marcar una dosis como tomada",
"mood": "Estado de ánimo",
"moodDescription": "Registra tu estado de ánimo y etiquetas",
"water": "Agua",
"waterDescription": "Añade rápidamente tu consumo de agua"
"moodDescription": "Registra tu estado de ánimo y etiquetas"
},
"cycle": "Ciclo",
"labs": "Análisis",
Expand Down Expand Up @@ -455,7 +453,6 @@
"quickAddMeasurement": "Registrar medición",
"quickAddMood": "Registrar estado de ánimo",
"quickAddMedicationIntake": "Registrar toma",
"quickAddWater": "Registrar agua",
"customizeDashboard": "Personalizar panel",
"medicationIntakeQuickAdd": {
"sheetTitle": "Registrar toma de medicación",
Expand Down Expand Up @@ -9654,17 +9651,11 @@
"dayInvalid": "Las entradas llevaban una fecha que el servidor no pudo aceptar. Esto puede ocurrir cuando el reloj o la zona horaria del lado que envía los datos están mal configurados; merece la pena revisarlo.",
"upsertFailed": "Estas entradas llegaron al servidor, pero un problema de nuestro lado impidió guardarlas. No tienes que hacer nada.",
"unknown": "Estas entradas llegaron, pero no se pudieron guardar."
}
},
"moduleEnableError": "No se pudo activar el módulo de nutrientes. Inténtalo de nuevo."
},
"hydration": {
"referenceMeta": "Ingesta de referencia {value} {unit}/día · EFSA",
"quickAddTitle": "Añadir agua",
"quickAddCustomLabel": "Cantidad personalizada (mL)",
"quickAddCustomPlaceholder": "250",
"quickAddSubmit": "Añadir",
"quickAddError": "No se pudo guardar. Inténtalo de nuevo.",
"quickAddSuccess": "Se añadieron {amount} mL de agua.",
"editTotal": "Editar el total de hoy"
"referenceMeta": "Ingesta de referencia {value} {unit}/día · EFSA"
},
"caffeine": {
"ceilingMeta": "Límite de seguridad {value} {unit}/día · EFSA"
Expand Down Expand Up @@ -10285,7 +10276,7 @@
"description": "Tu propia agenda: escribe una consulta una vez y elígela en todas partes.",
"linkLabel": "Agenda",
"add": "Entrada",
"searchPlaceholder": "Buscar nombre o consulta",
"searchPlaceholder": "Buscar nombre, consulta o especialidad",
"loadError": "No se pudo cargar la agenda.",
"emptyTitle": "Todavía no hay entradas",
"emptyDescription": "Añade una consulta para poder elegirla al registrar una cita.",
Expand All @@ -10304,6 +10295,17 @@
"saveFailed": "No se pudo guardar la entrada.",
"deleteTitle": "¿Eliminar esta entrada?",
"deleteDescription": "Tus citas anteriores se mantienen y conservan este nombre.",
"deleteFailed": "No se pudo eliminar la entrada."
"deleteFailed": "No se pudo eliminar la entrada.",
"noSpecialtyGroup": "Sin especialidad"
},
"links": {
"picker": {
"add": "Añadir",
"done": "Listo",
"selectAll": "Seleccionar todo",
"searchPlaceholder": "Buscar",
"searchNoMatch": "Sin coincidencias",
"remove": "Quitar"
}
}
}
Loading
Loading