A single-user, mobile-first PWA for tracking body recomposition — weight, body circumferences, progress photos, and daily nutrition adherence — with optional hardware auto-capture and zero third-party cloud in the data path. Built to deploy on Cloudflare.
- React 19 + Vite 6, installable PWA (
vite-plugin-pwa, offline shell) - Hono API on a single Cloudflare Worker (serves the SPA +
/api/*) - Cloudflare D1 (SQLite) + Drizzle ORM
- Cloudflare R2 for progress photos
- Auth via Cloudflare Access (the scale-ingest endpoint uses a service token)
- Weight — an Etekcity ESF-551 BLE scale read
locally by a small Python listener that
POSTs to/api/ingest/weight. No vendor app/cloud. - Circumferences — a RENPHO RF-BMF01 BLE tape measure read in-browser via the Web Bluetooth API (Android/Chromium/Linux). No vendor app/cloud.
Body fat % (BIA) is captured when available but treated as a noisy, trend-only signal — weight (weekly average) and circumferences are the metrics that matter.
npm install
npm run dev # http://localhost:5173
npm run build
npm run typecheck
npm run db:generate # generate a D1 migration from src/db/schema.ts
npm run db:migrate:local # apply migrations to the local D1The HTTP API is documented in-code: each route carries an @openapi JSDoc
comment (in src/worker/index.ts), and the shared data models live as
@openapi component comments next to the Drizzle tables (src/db/schema.ts).
A build step assembles them into a single OpenAPI 3.1 document.
npm run openapi:gen # comments -> src/worker/openapi.gen.json (also runs on prebuild)
npm run openapi:lint # quobix vacuum, gated at a perfect 100/100 scoreThe generated spec is served by the Worker at /openapi.json
(live). CI regenerates the spec,
fails if the committed copy drifted from the comments, and holds the vacuum
score at 100.
A terminal client lives in packages/cli and ships to npm as
@skeptrune/telemetry-cli (plus standalone binaries on each GitHub Release).
It authenticates with browser SSO through Cloudflare Access — no API key.
npm install -g @skeptrune/telemetry-cli
telemetry login
telemetry status
telemetry weight log 158.2 --note "morning, fasted"
telemetry meal describe "chicken breast + toum, skipped the salad"npx wrangler login
npx wrangler d1 create telemetry-db # paste the database_id into wrangler.jsonc
npm run db:migrate:remote
npm run deploy