20+ Smart Scales
Xiaomi, Renpho (FITINDEX, Sencor, QN-Scale), Eufy, Yunmai, Beurer, Sanitas, Medisana, and more. Auto-detection out of the box.
See all scales
Cross-platform CLI for Linux, macOS & Windows. Read weight & impedance from 20+ BLE smart scales and export to Garmin Connect, Strava, Home Assistant, InfluxDB, Webhooks, Ntfy & local files. No phone app needed.
# Configure
docker run --rm -it --network host --cap-add NET_ADMIN --cap-add NET_RAW \
--group-add 112 -v /var/run/dbus:/var/run/dbus:ro \
-v ./config.yaml:/app/config.yaml \
-v garmin-tokens:/app/garmin-tokens \
ghcr.io/kristianp26/ble-scale-sync:latest setup
# Run (continuous mode, auto-restart)
docker run -d --restart unless-stopped --network host \
--cap-add NET_ADMIN --cap-add NET_RAW \
--group-add 112 -v /var/run/dbus:/var/run/dbus:ro \
-v ./config.yaml:/app/config.yaml:ro \
-v garmin-tokens:/app/garmin-tokens \
-e CONTINUOUS_MODE=true \
ghcr.io/kristianp26/ble-scale-sync:latestIdeal for Raspberry Pi, NAS, and headless servers. Works alongside any Home Assistant install (Container, Core, OS) via MQTT auto-discovery. Your data never leaves your network.
Running Home Assistant OS or Supervised? One click and skip the CLI entirely.
The badge opens your Home Assistant instance, confirms the repository, and lands you on the Add-on Store with BLE Scale Sync ready to install.
The add-on handles config through the UI, auto-detects the Mosquitto broker for Home Assistant auto-discovery, and bootstraps Garmin tokens on first start. See the Home Assistant Add-on guide for the full option reference, MFA workaround, and custom config mode.
WARNING
Add-ons are not available on HA Container or HA Core installs (no Supervisor). Use Option 1 instead.
Runs natively on all major desktop and server operating systems. No containers, no Supervisor required.
git clone https://github.com/KristianP26/ble-scale-sync.git
cd ble-scale-sync && npm install
npm run setup # interactive wizard: scale discovery, user profile, exporters
CONTINUOUS_MODE=true npm start # always-on, listens for scale indefinitelyRequires Node.js v20.19+ and a BLE adapter. For always-on deployments, create a systemd service:
[Unit]
Description=BLE Scale Sync
After=network.target bluetooth.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/ble-scale-sync
EnvironmentFile=/home/pi/ble-scale-sync/.env
Environment="CONTINUOUS_MODE=true"
Environment="PATH=/home/pi/ble-scale-sync/venv/bin:/usr/local/bin:/usr/bin:/bin"
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetsudo systemctl enable --now ble-scale.serviceRaspberry Pi Zero 2W
The ideal setup: a ~15€ single-board computer with built-in BLE, always on, always listening. Step on the scale and your data appears in Garmin Connect within seconds. No phone needed. Note: the original Pi Zero W (ARMv6) is not supported.
Two ways to connect your scale
Local BLE (any of the options above): the server has a Bluetooth adapter and talks to the scale directly. Needs BlueZ/D-Bus on Linux, or native BLE on macOS/Windows.
Remote BLE via ESP32: a cheap ~8€ ESP32 board sits near the scale and relays BLE data over WiFi/MQTT. The server needs no Bluetooth at all, which makes Docker deployment much simpler (no NET_ADMIN, no D-Bus mounts). See the ESP32 BLE Proxy guide.