Skip to content

BLE Scale SyncAutomatic body composition sync

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.

BLE Scale Sync

Quick Start

Option 1: Docker (Linux)

bash
# 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:latest

Ideal 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.

Option 2: Home Assistant Add-on

Running Home Assistant OS or Supervised? One click and skip the CLI entirely.

Add BLE Scale Sync repository to your Home Assistant

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.

Option 3: Standalone (Node.js — Linux, macOS, Windows)

Runs natively on all major desktop and server operating systems. No containers, no Supervisor required.

bash
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 indefinitely

Requires Node.js v20.19+ and a BLE adapter. For always-on deployments, create a systemd service:

Example: /etc/systemd/system/ble-scale.service
ini
[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.target
bash
sudo systemctl enable --now ble-scale.service

Raspberry 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.

Released under the GPL-3.0 License.