mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 04:32:42 +00:00
ECG recordings synced from a compatible watch were stored encrypted but shown nowhere. They now have a surface in Insights: a list of recordings, each opening the full single-lead waveform on a familiar ECG grid, with the date, duration, average heart rate, and the result the device recorded. The read routes narrow ownership in the query and decrypt the waveform through the existing fail-closed codec; the overview is min/max-decimated so the R-wave peaks survive the reduction, with a raw path for a calibrated view. The result shown is the recording device's own classification, attributed to the device — HealthLog does not read or interpret the trace and produces no verdict of its own. A permanent note states this, and a non-normal result carries a line to discuss the recording with a clinician.
150 lines
4.5 KiB
JSON
150 lines
4.5 KiB
JSON
{
|
|
"name": "healthlog",
|
|
"version": "1.28.50",
|
|
"description": "Self-hosted personal-health-tracking PWA with Withings integration, AI insights, and doctor-report PDF export.",
|
|
"license": "PolyForm-Noncommercial-1.0.0",
|
|
"homepage": "https://healthlog.dev",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/MBombeck/HealthLog.git"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/MBombeck/HealthLog/issues"
|
|
},
|
|
"keywords": [
|
|
"health-tracking",
|
|
"self-hosted",
|
|
"pwa",
|
|
"blood-pressure",
|
|
"withings",
|
|
"next.js",
|
|
"prisma",
|
|
"passkey"
|
|
],
|
|
"private": true,
|
|
"packageManager": "pnpm@10.31.0",
|
|
"scripts": {
|
|
"prepare": "lefthook install || echo 'lefthook install skipped (no git repo or binary unavailable)'",
|
|
"dev": "next dev",
|
|
"predev": "node scripts/generate-i18n-boot.mjs",
|
|
"prebuild": "node scripts/generate-sw-version.mjs && node scripts/generate-i18n-boot.mjs",
|
|
"build": "next build",
|
|
"analyze": "ANALYZE=1 next build",
|
|
"bundle-report": "node scripts/check-bundle-budget.mjs",
|
|
"bundle-check": "node scripts/check-bundle-budget.mjs --check",
|
|
"start": "next start",
|
|
"lint": "eslint",
|
|
"db:generate": "prisma generate",
|
|
"db:push": "prisma db push",
|
|
"db:migrate": "prisma migrate dev",
|
|
"db:migrate:deploy": "prisma migrate deploy",
|
|
"db:studio": "prisma studio",
|
|
"format": "prettier --write .",
|
|
"format:check": "prettier --check .",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:integration": "vitest run --config vitest.integration.config.mts",
|
|
"e2e": "playwright test",
|
|
"e2e:ui": "playwright test --ui",
|
|
"openapi:generate": "npx tsx scripts/generate-openapi.ts",
|
|
"openapi:check": "npx tsx scripts/check-openapi.ts",
|
|
"check-env": "npx tsx scripts/check-env.ts",
|
|
"mcp:stdio": "npx tsx src/cli/mcp-stdio.ts"
|
|
},
|
|
"dependencies": {
|
|
"@aws-sdk/client-s3": "^3.1075.0",
|
|
"@dnd-kit/core": "^6.3.1",
|
|
"@dnd-kit/sortable": "^10.0.0",
|
|
"@dnd-kit/utilities": "^3.2.2",
|
|
"@hookform/resolvers": "^5.4.0",
|
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
"@napi-rs/canvas": "0.1.80",
|
|
"@node-rs/argon2": "^2.0.2",
|
|
"@parse/node-apn": "^8.1.0",
|
|
"@prisma/adapter-pg": "^7.8.0",
|
|
"@prisma/client": "^7.8.0",
|
|
"@simplewebauthn/browser": "^13.3.0",
|
|
"@simplewebauthn/server": "^13.3.2",
|
|
"@tanstack/react-query": "5.101.2",
|
|
"@tanstack/react-virtual": "^3.14.5",
|
|
"@types/sax": "^1.2.7",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"date-fns": "^4.4.0",
|
|
"dotenv": "^17.4.2",
|
|
"fflate": "^0.8.3",
|
|
"jose": "^6.2.3",
|
|
"jspdf": "^4.2.1",
|
|
"jspdf-autotable": "^5.0.8",
|
|
"lucide-react": "^1.18.0",
|
|
"mmdb-lib": "^3.0.2",
|
|
"next": "16.2.10",
|
|
"next-themes": "^0.4.6",
|
|
"nodemailer": "9.0.3",
|
|
"otpauth": "^9.5.1",
|
|
"p-limit": "^7.3.0",
|
|
"pg-boss": "^12.26.0",
|
|
"prisma": "^7.8.0",
|
|
"qrcode": "^1.5.4",
|
|
"radix-ui": "^1.6.0",
|
|
"react": "19.2.7",
|
|
"react-day-picker": "^10.0.1",
|
|
"react-dom": "19.2.7",
|
|
"react-hook-form": "7.81.0",
|
|
"recharts": "^3.8.1",
|
|
"rrule": "^2.8.1",
|
|
"sax": "^1.6.0",
|
|
"sonner": "^2.0.7",
|
|
"tailwind-merge": "^3.6.0",
|
|
"tesseract.js": "^7.0.0",
|
|
"undici": "^8.5.0",
|
|
"web-push": "^3.6.7",
|
|
"yaml": "^2.8.4",
|
|
"zod": "^4.4.3",
|
|
"zod-openapi": "^6.0.0",
|
|
"zxcvbn-typescript": "^5.0.1"
|
|
},
|
|
"devDependencies": {
|
|
"@axe-core/playwright": "^4.12.1",
|
|
"@next/bundle-analyzer": "^16.2.9",
|
|
"@playwright/test": "^1.60.0",
|
|
"@tailwindcss/postcss": "^4",
|
|
"@testcontainers/postgresql": "^12.0.3",
|
|
"@types/node": "26.1.1",
|
|
"@types/nodemailer": "^8.0.1",
|
|
"@types/pg": "^8.20.0",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"@types/web-push": "^3.6.4",
|
|
"@vitejs/plugin-react": "^5.1.4",
|
|
"@vitest/coverage-v8": "^4.1.5",
|
|
"eslint": "^9",
|
|
"eslint-config-next": "16.2.6",
|
|
"knip": "^6.16.1",
|
|
"lefthook": "^2.1.10",
|
|
"pdf-parse": "^2.4.5",
|
|
"pdfjs-dist": "5.4.296",
|
|
"pg": "^8.22.0",
|
|
"prettier": "^3.9.1",
|
|
"prettier-plugin-tailwindcss": "^0.8.0",
|
|
"shadcn": "^4.13.0",
|
|
"tailwindcss": "^4",
|
|
"testcontainers": "^12.0.3",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "^6",
|
|
"vitest": "^4.1.5"
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"prisma",
|
|
"@prisma/engines"
|
|
],
|
|
"overrides": {
|
|
"hono@<4.12.25": "^4.12.25",
|
|
"picomatch@<4.0.4": "^4.0.4"
|
|
}
|
|
}
|
|
}
|