Tindeq Progressor
The Tindeq Progressor is a Bluetooth dynamometer for measuring finger and pulling strength. It connects to the Tindeq app and works with any hangboard or lifting edge; climbers use it for testing, training, and rehab. Use the shared device interface to connect, stream force data via notify(), and export with download().
Basic usage
import { Progressor } from "@hangtime/grip-connect"
const device = new Progressor()
device.notify((data) => console.log(data.current, data.peak))
await device.connect(
async () => {
console.log("Battery:", await device.battery())
console.log("Firmware:", await device.firmware())
await device.stream() // Start stream first (tare requires active stream)
device.tare() // Tare while streaming
await device.stop()
device.download("json")
device.disconnect()
},
(err) => console.error(err),
)Methods
Progressor supports all shared methods (connect, disconnect, isConnected, notify, active, read, write, tare, download). See Device interface for details.
Device-specific
| Method | Returns | Description |
|---|---|---|
battery() | Promise<string | undefined> | Battery/voltage information. |
firmware() | Promise<string | undefined> | Firmware version. |
calibration() | Promise<string | undefined> | Read linear calibration: slope, intercept, trim. |
calibrationTable() | Promise<string | undefined> | Read hidden 15-entry calibration table. Expert only. |
addCalibrationPoint() | Promise<void> | Capture current ADC reading as calibration point. |
saveCalibration() | Promise<void> | Compute curve from stored points and save to flash. |
setCalibration(curve) | Promise<void> | Raw overwrite: write 12-byte calibration block. Expert only. |
reboot() | Promise<void> | Reboot the device immediately. Expert only. |
stop() | Promise<void> | Stop an ongoing stream. |
stream(duration?) | Promise<void> | Start force stream. duration in ms; 0 or omit for continuous. |
tare(duration?) from the shared interface uses hardware tare: it sends the device command to zero the scale. The device must be streaming when you call tare—the hardware captures the current weight reading during the stream. The duration parameter is accepted for API compatibility but ignored (hardware tare is instant).
Calibration
Calibration is done by capturing calibration points (the device’s current ADC reading at known loads), then calling saveCalibration() to compute the curve and write it to flash. The standard flow uses two points: zero load and a known reference weight.
Add a Calibration point
- Add zero point: With no load on the device, call
addCalibrationPoint(). The device captures the current ADC reading. - Add reference point: Place a known weight (e.g. 5 kg) on the device and call
addCalibrationPoint()again. - Save: Call
saveCalibration()to compute the curve from the stored points and persist it to flash.
The device needs a stable load for each capture.
Reading the calibration curve
calibration() returns the current 12-byte block as a hex string together with the decoded float32 coefficients:
slopeintercepttrim
value = raw * slope + intercept + trimThe display also includes the combined effective offset = intercept + trim. Use the hex bytes for backup/restore if you want an exact copy of the device state. This is separate from the hidden piecewise table and its extra global offset state.
Raw overwrite (expert only)
setCalibration(curve) writes a 12-byte Uint8Array directly to the device, bypassing the measured-point flow. The block is interpreted by firmware as 3 little-endian float32 values: slope, intercept, trim. Use it to restore a backed-up curve or clone calibration between identical devices. WARNING: EXPERT ONLY - incorrect values will produce wrong force readings.
Advanced calibration table
calibrationTable() exports the hidden 15-entry piecewise calibration table as newline-separated records. Each line includes the raw 16-byte payload followed by the decoded fields: hex | lowerRaw..upperRaw | slope | intercept. This command is based on firmware analysis rather than Tindeq’s public API, so availability may vary by firmware version and hardware clone.
Reboot (expert only)
reboot() sends opcode 0x75 with the firmware's required confirmation byte and triggers an immediate device reboot. Expect the BLE connection to drop right away.
Performance metadata
Progressor includes performance metadata on every notify() payload like all streaming devices. For Progressor, performance.samplingRateHz is computed from device timestamps: number of samples in the last 1 second of device time. Payload length / 8 gives performance.samplesPerPacket.
Compatible hardware
Crimpdeq is open-source portable hardware inspired by the Tindeq Progressor and designed for climbers, coaches, and therapists. It uses the Tindeq Progressor API (BLE), so it is compatible with Grip Connect’s Progressor class. The project includes firmware (Rust), PCB design, and a book for assembly and calibration.
Mito is a small, open-source force gauge for isometric finger strength training. It advertises as a Progressor and works with the Frez and Tindeq apps, so it is compatible with the Progressor class. Built on a Seeed XIAO nRF52840, HX711 ADC, and custom load cell; firmware and hardware are open.
Hangman is an open-source Bluetooth-enabled crane-scale retrofit for climbing training and rehabilitation. It replaces the internal electronics of a low-cost 150 kg crane scale with a custom nRF52-based PCB and differential ADC, running Rust firmware built on Embassy and Nordic’s SoftDevice, and can integrate with Progressor-compatible software.
Official API
Tindeq publishes the Progressor Bluetooth interface for custom applications: Tindeq Progressor API. It describes the custom Progressor service, control point (single-byte opcodes with optional payload), data point (notifications), and includes notes on auto-shutdown and data format. Useful for low-level integration or verification with tools like nRF Connect.
Tindeq’s example client (progressor_client.py) demonstrates the documented command set (opcodes 100–111). Additional commands implemented are based on firmware analysis and device testing rather than the public specification.