From 4762ca43c2715f404f469036abcadbe7531f4b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Wed, 4 Nov 2026 00:56:27 +0100 Subject: [PATCH] docs(changelog): v1.47.0 entries --- CHANGELOG.md | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d4f41cbb..2c915d4aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ ### Added +- **Blood pressure by time of day.** The blood pressure page has a card + with the morning, midday and evening averages side by side, each with + its count and pulse, and the morning minus evening difference once both + have at least three readings. Morning runs 04:00 to 11:59, midday 12:00 + to 17:59 and evening 18:00 to 03:59 in your time zone, wide on purpose, + because home measurement guidance ties the two readings to waking and to + bedtime rather than to a clock. A control under it narrows the chart to + one part of the day, kept in the URL, and the stat strip names the part + while it is narrowed. The server computes the split, so the app can show + the same numbers (`GET /api/measurements/blood-pressure/time-of-day`, + and `partOfDay` on the daily series). (#1331) +- **Russian.** HealthLog speaks Russian, its tenth language: the whole + interface, the AI output language, the safety screen's Russian bank, + Russian month names in the coach's fact check, and the questionnaires + with the "show original" switch, marked as not yet validated. (#1322) +- **A lab reading has its own id over MCP.** `fetch labresult:` + returns one reading with the report and visits it came from, and the + links on documents and visits now point at the reading that report + holds instead of the analyte's latest one. `lab:` still answers + with the latest reading. (#1323) - **The intake history shows where an injection went.** A dose logged with an injection site already stored it, but the per-medication history only showed when it was taken and where the entry came from. @@ -11,6 +31,72 @@ in the table and on the mobile cards, so the rotation can be read back from the history. Doses without a site look as before. +### Changed + +- **The image runs on Wolfi instead of Alpine.** The runtime is glibc now, + so the native page renderer, password hashing and the Prisma engine run + their glibc builds. The published arm64 image renders PDF pages on a + Raspberry Pi 4 again, where the Alpine build of the renderer needs CPU + features an ARMv8.0 core lacks. The compressed image is a little smaller + than before. A health check that still calls `wget`, from a compose + file copied before this release or a platform template, keeps working: + the image carries a small `wget` that answers health checks and nothing + else. The current `docker-compose.yml` probes with Node directly, and + that is the one to switch to. (#1311) +- **The app connects to the database with less power.** On Postgres 17 or + later, with a database user that may create roles (the bundled compose + file's user may), the app and the worker now connect as a role of their + own that reads and writes rows but cannot change or drop tables, create + functions, read server files or create roles. Migrations, the dump + before them and restores still run as the owner, and so does the queue + schema, which the role may only write rows into. Nothing needs setting: + the role is created at start, with a password derived from an existing + secret, one per database. Where the role cannot be set up (Postgres 16, + a managed database without the right, `DB_APP_ROLE=off`), the app runs + as before and says why at start. `docs/self-hosting/database-role.md` + has the details. + +### Fixed + +- **Medication adherence reads faster.** Every rate walked a schedule from + the day the medication was created, so it slowed down as a medication + aged, about 4 ms per rate after two years. It now starts just before the + window it reads, with the same result. +- **A PDF the server cannot render is read by its text.** On a host + without the page renderer (an x86 CPU without AVX2), an AI provider that + takes pages as images could not read a PDF at all, and the message asked + for a Claude provider without saying why. A PDF with a text layer is now + read as text there, and a scan says plainly that this server cannot turn + its pages into images. A PDF that fails to render on a capable server is + reported as that, not as a provider problem. (#1311) +- **A marker that started with a text result takes the unit of its first + number.** A marker created from "see note" had an empty unit that locked + once it held a reading, so the first number, a unitless ratio included, + was refused. While a marker holds only text readings, its first number + now sets the unit. (#1313) +- **The AI safety screen catches more medication instructions.** A + negated take ("don't take your metoprolol tonight"), a pause, an extra + amount without a target ("add 4 more units of insulin") and a liquid + dose of a syrup or solution are now held back in all ten languages, + while advice such as drinking water or taking a break from screens + passes. A Dutch reminder not to stop a medication without a doctor was + held back before and passes now. +- **Least-squares fits keep r² within 0 to 1.** Values far from zero with + little spread could give an r² a hair above 1. + +### Thanks + +- @FloMaetschke for the injection site in the intake history (#1330). +- @l1137l for the Russian translation, the Russian safety bank and the + patience through two reviews (#1322). +- @johnnyrepo026 for finding the text-first marker that refused its first + number (#1313). +- @mbreitkreuz for testing the MCP links down to two reports on one day + (#1323). +- @Oguz3003 for staying with the Raspberry Pi 4 until it reads PDFs + (#1311). +- @mills1975 for asking how blood pressure differs over the day (#1331). + ## [1.46.6] — 2026-11-02 ### Added