close
Skip to content

BLE Scale SyncAutomatic body composition sync

Cross-platform CLI for Linux, macOS & Windows. Read weight & impedance from 25+ 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 "$(getent group bluetooth | cut -d: -f3)" -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 "$(getent group bluetooth | cut -d: -f3)" --device /dev/rfkill \
  -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.

Zero clone, if you already have Node.js v22+:

bash
npx ble-scale-sync setup                 # interactive wizard, writes ./config.yaml
CONTINUOUS_MODE=true npx ble-scale-sync  # always-on, listens for scale indefinitely

config.yaml and .env are read from the directory you run the command in. Requires Node.js v22+ and a BLE adapter.

Prefer a permanent install, a git clone, or the full command list? See the Standalone install guide.

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/node dist/index.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
bash
npm run build                # compile to dist/ (the service runs plain node)
sudo systemctl enable --now ble-scale.service

The unit runs node dist/index.js rather than npm start, so the host needs no TypeScript runner at runtime. Run npm run build after every git pull.

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.