docs(changelog): v1.47.0 entries

This commit is contained in:
Marc-André Bombeck committed 2026-11-04 00:56:27 +01:00
1 parent a162990d18
commit 4762ca43c2
1 file changed
+86
+86
View File
@@ -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:<id>`
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:<analyte>` 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