Read your smart scale's hidden telemetry — fully in your browser, no app, no cloud.
occult is an unofficial, independent Web Bluetooth client for the Cult Smart
Scale. It connects to the scale over BLE straight from a Chromium-family
browser, decodes the proprietary measurement frames (weight, heart rate, and
bioimpedance), computes body composition on-device with peer-reviewed equations,
stores everything locally in IndexedDB, and charts your trends — across multiple
user profiles.
No accounts. No servers. Nothing leaves your device.
Important
Disclaimer. Unofficial, third-party project for educational, research, and personal-interoperability purposes only. Not affiliated with, endorsed by, or sponsored by the makers of the scale; product names are referenced nominatively to describe hardware compatibility only. The metrics shown are not clinically validated and are not medical advice. Bioimpedance is noisy — treat everything here as trends, not truth.
- Direct BLE pairing — Web Bluetooth talks to the scale on service
0xfff0, no handshake required (the protocol was reverse-engineered live; seeresearch/cult_scale_protocol.md). - Live weigh-in — watch the weight settle and your heart rate read out in real time.
- On-device body composition — BMI, body-fat % (Deurenberg 1991), total body water (Watson 1980), resting metabolic rate (Mifflin-St Jeor 1990), and skeletal-muscle mass (Janssen 2000) from the scale's impedance.
- Multiple profiles — track the whole household; each profile has its own height/sex/age, accent color, optional impedance calibration, and history.
- Beautiful trends — weight, fat %, muscle, and BMI line charts plus a body-composition donut, themed per profile.
- Local-first — all data in IndexedDB. CSV + full JSON export/import.
- Manual entry — works even without the scale or Web Bluetooth.
- Installable PWA, dark "gilded-grimoire" aesthetic.
Web Bluetooth needs a secure context (no file://) and a Chromium browser
(Chrome/Edge on desktop, or Bluefy on iPhone). Serve the folder:
python serve.py # → http://localhost:8765
# or:
python -m http.server 8765Open http://localhost:8765 in Chrome. On first launch you set up a profile
(name, age, sex, height); then press Measure and step on the scale. The
dashboard stays empty until your first real reading. Add more profiles any time
from the Profiles tab.
It's pure static files — drop the folder on any static host:
# Cloudflare Pages
npx wrangler pages deploy . --project-name=occult
# or GitHub Pages: push and enable Pages on the repo rootHTTPS there satisfies the secure-context requirement automatically.
11-byte frames on notify characteristic 0xfff4, marker 0xCF:
| byte | field |
|---|---|
| 0 | 0xCF marker |
| 1 | heart rate (bpm, body phase) |
| 3–4 | weight, little-endian uint16 ÷ 100 = kg |
| 5–6 | impedance (raw) |
| 9 | phase flag (0x01 weighing, 0x00 body/HR) |
| 10 | XOR checksum of bytes 0–9 |
Full writeup, calibration notes, and the body-composition derivation:
research/cult_scale_protocol.md.
occult/
├── index.html dashboard shell
├── app.js controller (wires BLE ↔ store ↔ metrics ↔ UI)
├── styles.css design system
├── vendor/chart.umd.min.js Chart.js (vendored)
├── js/
│ ├── ble/ uuids · parser (frame decode) · client (Web Bluetooth)
│ ├── data/ schema · db · store (CRUD) · export
│ ├── metrics/ bodycomp (BMI/BMR/fat/TBW/SMM)
│ ├── ui/ charts · render · profiles-ui
│ └── util/ events · format
└── research/ reverse-engineered protocol notes
- openScale (GPLv3) — the open-source
BLE-scale project. Its
CultSmartScaleProHandler,OneByoneHandler/OneByoneLib, andStandardImpedanceLibwere invaluable for decoding the protocol family and the body-composition formulas (and for confirming the encrypted0xDFbody-comp packet is not reverse-engineerable). - whoof — an independent, local-first Web Bluetooth client for the WHOOP 4.0 strap. Its architecture (vanilla-JS modules, IndexedDB, cache-first PWA, on-device metrics) was the blueprint for occult's "own your data, no cloud" design.
MIT. Product names are trademarks of their respective owners; this project is not affiliated with or endorsed by them.