Files
HealthLog/scripts
Marc-André Bombeck d839fbdb11 fix(demo): lift the busy-stretch blood pressure far enough to read
The blood-pressure chart scales one axis to fit systolic and diastolic, so
the 12 mmHg the busy stretch added came out as a nearly flat line on a 60 to
140 axis, even with the 7-day trend on.

The stretch now climbs over two days to about 144/91, holds for some ten
days, and comes back down over the following days after ramipril goes from
5 to 10 mg. A dose change and a family-practice visit on the day it turns
carry that step, and the medication now reads 10 mg. The day-to-day walk is
quieter, with a little reading scatter on top, so the 7-day mean draws an
arc rather than jitter.

Two limits keep the rest of the page honest. The lift stops short of
149 mmHg: one more and the padded axis rounds out to 50 to 200 and flattens
the rise again. And the stretch stays well under half of the last 30 days:
the usual range is the median ± 3 MAD of that window, and a longer stretch
moved the median onto it and widened the band to about 87 to 181 mmHg.

The stored texts that describe the last weeks mention the stretch and the
dose increase. The seed-shape test holds the larger swing, the ceiling, the
smaller day-to-day steps, the median of the window and the dose change on
the turn.
2026-10-25 11:40:04 +01:00
..
2026-05-14 23:49:32 +02:00
2026-05-16 09:28:40 +02:00
2026-05-16 14:19:57 +02:00

scripts/

One-shot operator and build scripts. These are not part of the running application — they are run by hand during a deploy, a backfill, or a release, or wired into CI. Recurring work belongs on pg-boss (src/lib/jobs/), not here.

How to run them

From a source checkout:

pnpm dlx tsx scripts/<file>.ts

The production image intentionally removes npm, pnpm, and Corepack. Only container-safe scripts named by an operator runbook use its pinned healthlog-tsx launcher; scripts that import the full application dependency graph must run from a source checkout. scripts/ is excluded from the project typecheck.

What lives here

  • generate-openapi.ts — emits docs/api/openapi.yaml from the registered Zod schemas (pnpm openapi:generate).
  • check-openapi.ts — compares a freshly generated spec against the committed YAML; CI fails on drift (pnpm openapi:check).
  • check-env.ts — pre-deploy env-var sanity check against env-manifest.json (pnpm check-env); wired into CI.
  • assert-deploy.ts — post-deploy /api/version assertion.
  • rotate-encryption-key.ts — AES-256-GCM key rotation; see docs/ops/encryption-key-rotation.md.
  • restore-backup.ts — restore an off-host AES-GCM backup from an S3-compatible bucket.
  • repair-apple-health-distance.ts — repair walking-distance rows the export.zip import stored 1000x too small; dry-run by default, see docs/ops/apple-health-distance-repair.md.
  • repair-intake-anomalies.ts — repair historic medication-ledger defects (duplicate dose-slot rows, implausible taken_at); dry-run by default, see docs/ops/intake-repair.md.
  • backfill-rollups.ts, drain-per-sample-cumulative.ts, backfill-mood-note-column.ts — historical data backfills (note: the boot-time rollup-full-backfill queue handles new accounts automatically; the CLI is the manual fallback).
  • seed-demo.ts + seed-demo-v15.sql — populate a demo tenant.
  • bench/ — seed-large-account.ts (a synthetic ten-year account of about 1.26 million measurement rows) and run.ts (latency and SQL statements per request against it); see docs/contributing/benchmarks.md. Results land in bench/results/.
  • test-notifications.ts — exercise the notification dispatcher + reminder check.
  • fetch-geolite2.sh — download the MaxMind GeoLite2 MMDBs (needs a licence key) before docker build.
  • install-hooks.sh — install the local git hooks.
  • generate-sw-version.mjs, print-bundle-report.mjs — service-worker version stamp and bundle-size report.
  • i18n/ — locale tooling; __tests__/ — tests for the scripts above.

Conventions

See ../CLAUDE.md "Tests and commands" + "Self-hosting gotchas". Operator runbooks that drive these scripts live in ../docs/ops/.