Self-hosted health tracking

Your health data,
on your terms.

Klebb is a manifest-driven dashboard for tracking anything medical: supplements, peptides, bloods, weight, mood, sleep, whatever matters to you. Drop a JSON file, a card appears. No database, no cloud, no compromises.

  • Manifest-driven
  • Self-hosted
  • Passkey-only
  • AGPL-3.0

What it does

A dashboard that bends to you,
not the other way around.

Manifest-driven

Every card is a single JSON file. Add tracking for a new supplement, a new biomarker, a new mood scale: create a file, refresh the page, you have a card. No code changes, no schema migrations.

Self-hosted

Your data lives in plain JSON files on your own machine. No external service knows what you ate, what you took, or how you slept. git diff tells you exactly what changed.

AI chat with your data

An optional chat agent reads your manifests as context. Ask why your HRV tanked last week, or which supplement stack mapped to your best sleep. Bring your own gateway, any OpenAI-compatible endpoint works.

Passkey-only auth

WebAuthn, no passwords, no email, no SMS codes. One tap on your phone or hardware key and you are in. Multi-instance: every user gets their own isolated dashboard with separate data and credentials.

How it works

The manifest is the app.

A Klebb card is one file. Two halves: meta describes what it tracks and how to render it; data is the history. The server reads it, hands it to the browser, and the right renderer draws the card.

  • No catalog. Files on disk are the source of truth.
  • No build step. Edit a file, reload, done.
  • No lock-in. Your history is plain JSON; take it anywhere.
  • Composable. A renderer can pull from many manifests; complex views are just code, not infrastructure.
data/weight.json
{
  "schema": "klebb.datafile.v1",
  "meta": {
    "id": "weight",
    "title": "Body weight",
    "unit": "kg",
    "view": {
      "component": "eh-trend-card",
      "goal": 82
    }
  },
  "data": [
    { "date": "2026-05-19", "value": 84.2 },
    { "date": "2026-05-20", "value": 83.9 },
    { "date": "2026-05-21", "value": 83.6 }
  ]
}

Tech stack

Boring, on purpose.

Klebb is what falls out when you refuse to add a framework until you genuinely need one. Roughly 1,200 lines of server, no bundler, no database, no surprises.

Frontend

Lit web components loaded straight from esm.sh. No React, no bundler, no build pipeline.

Backend

Plain Node.js http. No Express, no ORM. Node 20+.

Storage

JSON files on disk. The filesystem is the database; rsync is the backup tool.

Auth

WebAuthn passkeys with recovery codes. No passwords stored, ever.

Deploy

One systemd unit per user, or a single Docker image. Multi-instance isolation comes for free.

Licence

AGPL-3.0-only. Run it, fork it, modify it; share what you change.

Get started

Run your own instance.

Klebb is a single binary's worth of code and a directory of JSON files. The fastest way to try it is Docker; the most flexible is a systemd unit on whatever Linux box already runs your other things.

With Docker

docker run -d \
  --name klebb \
  -p 10002:10002 \
  -v $HOME/klebb-data:/app/data \
  -e HEALTH_RP_ID=klebb.local \
  ghcr.io/klebb/klebb:latest

Docker image and full docs land with the public release.

From source

git clone https://github.com/klebb/klebb.git
cd klebb
npm install
HEALTH_HOME=./data node server.js

Open http://localhost:10002, register a passkey, drop manifests into ./data.

Repository: coming soon The public repo flips on with the first tagged release.