Open Hardware for
Open Fitness

We build fitness hardware in the open. Every schematic, every line of firmware, every CAD file, published under open source licenses.


Have an open source fitness project? Click here to access our API & developer portal and get your project listed here.

DEVELOPMENTGitHub →

Digital Weight

Motorized resistance in a portable package

A compact, motorized resistance device that replaces an entire rack of dumbbells. The current V5 build packs a brushless DC motor with closed-loop force control into a 12 lb package, delivering precise, programmable resistance up to 150 lbs — or up to 300 lbs with the pulley accessory — across concentric, eccentric, and isometric modes.

  • Replace a full dumbbell rack with one 12 lb device
  • Lifts 150 lbs — up to 300 lbs with the pulley accessory
  • Real-time force feedback over WiFi + BLE
  • Open source firmware + hardware designs
  • Compatible with standard tool batteries
Specs
Max Force::150 lbs (300 lbs with pulley accessory)
Weight::12 lbs
Connectivity::WiFi + BLE
Modes::Concentric, Eccentric, Isometric
Motor::Brushless DC, 48V
Control Loop::1kHz PID
Battery::16S LiPO4 with BMS (+ tool battery compatible)
Enclosure::3D printed + aluminum frame
Version History
v3prototype
v4prototype
v5prototype
v6concept
firmware/src/ble_force.cppView on GitHub →
#define FORCE_PIN A0
#define CALIBRATION_FACTOR 0.489f

float readForce() {
  int raw = analogRead(FORCE_PIN);
  float voltage = raw * (3.3f / 4095.0f);
  float lbs = voltage * CALIBRATION_FACTOR * 250.0f;
  return lbs;
}

void onBleForceRequest(BLECharacteristic& c) {
  float force = readForce();
  c.writeValue(force);
}
CONCEPTGitHub →

Balance Brick (Compact Scale)

Open source smart ultra compact scale disguised as a fun balance brick

A single-foot precision body weight that doubles as a balance pose challege device. Daily balance challenges. Streams readings over wifi to the Open Workout System app for automatic logging and trend tracking.

  • Sub-0.1 lb accuracy with proper calibration
  • Auto-sync weight to your training log
  • No cloud account required — your data stays local
Specs
Max Weight::400 lbs / 180 kg
Resolution::0.05 lb / 0.02 kg
Sensors::4x strain gauge load cells
Connectivity::WiFi
Power::LiFePO4 + USB-C charging
Platform::Composite wood (TBD), 3" x 6"
Version History
v1concept
tools/calibrate_scale.pyView on GitHub →
import serial
import numpy as np

def calibrate(port="/dev/ttyUSB0", known_weight=25.0):
    """Two-point calibration: zero + known weight."""
    ser = serial.Serial(port, 115200)

    input("Remove all weight. Press Enter...")
    zero = np.mean([int(ser.readline()) for _ in range(50)])

    input(f"Place {known_weight} lb weight. Press Enter...")
    loaded = np.mean([int(ser.readline()) for _ in range(50)])

    factor = known_weight / (loaded - zero)
    print(f"Zero offset: {zero:.1f}")
    print(f"Cal factor:  {factor:.6f}")
    return zero, factor