coospo-cli
Command-line tool for COOSPO CS500/CS600 bike computers over Bluetooth LE. It shows device
information, battery level and memory usage, and downloads your activities (.fit files) without the
CoospoRide app.
$ coospo info
Searching for CS500 or CS600...
Connected to CS500-1234567
Model: CS500
Serial: 1234567
Hardware: V1.41
Firmware: V1.5.0
Battery: 87%
Memory: 25.3M/26.9M used (93%)
Supported devices
| Device | Status |
|---|---|
| COOSPO CS500 | tested (hardware V1.41, firmware V1.5.0) |
| COOSPO CS600 | expected to work (same protocol family), not tested yet |
Older COOSPO models (BC102/107, BC200) use a different protocol (YMODEM over Nordic UART). Use xoss_sync for those.
If you own a CS600 or another model, please report whether it works in an issue.
Installation
Requires Python 3.9+ and a Bluetooth LE adapter. It uses bleak, so it should run on Linux (BlueZ), Windows and macOS; so far it's been tested on Linux.
pipx install coospo-cli
pip install coospo-cli works too. For the latest development version:
pipx install git+https://github.com/blshkv/coospo-cli
Usage
coospo info show model, serial number, firmware, battery and memory usage
coospo sync download new activities into fit_files/
coospo sync -o ~/rides ... into another directory
coospo get filelist.txt Setting.json download specific files
coospo -n CS500-1234567 info pick one of several devices by name
coospo -a AA:BB:CC:DD:EE:FF info ... or by Bluetooth address
Run coospo --help or coospo COMMAND --help for all options.
syncfirst downloadsfilelist.txt(the list of activities on the device), then every.fitfile not already in the output directory. It's safe to interrupt and run again: files are only saved after the transfer has been verified, and existing ones are skipped.- Nothing is ever deleted from the device.
- The exit status is 0 on success and 1 if the device wasn't found or any file failed.
Troubleshooting
- Device not found: the bike computer stops advertising while it is connected to the phone. Close CoospoRide or turn off Bluetooth on the phone, and make sure the device is switched on.
- Several devices nearby: use
-nwith the full name shown on the device (e.g.CS500-1234567) or-awith its Bluetooth address.
Protocol
The CS500 doesn't use the Nordic UART/YMODEM protocol of older models. It uses vendor service
0xFDA0 with HDLC-like frames carrying protobuf payloads, plus a separate raw data channel for file
contents. PROTOCOL.md documents everything known so far.
tools/gatt_dump.py (in the repository, not installed with the package) lists a device's GATT
services and characteristics, which is a quick way to check whether another model uses the same
service:
python3 tools/gatt_dump.py CS600
Helping with other models
Support for new devices or features (setting the clock, uploading settings) comes from capturing what the official app does:
- On Android, enable Developer options → Enable Bluetooth HCI snoop log, then toggle Bluetooth off and on.
- Use the feature in CoospoRide.
- Run
adb bugreport bugreport.zip; the log isFS/data/misc/bluetooth/logs/btsnoop_hci.log.
Don't attach the log or the bug report to a public issue. They contain personal data such as your location, device addresses and ride history. Describe what you did and share the relevant frames instead.
Development
pip install -e .
python3 -m unittest discover -s tests
License
GNU General Public License v3.0 or later, see LICENSE.
Acknowledgements
Inspired by xoss_sync, which supports XOSS, Cycplus and older COOSPO devices.
Metadata
Release files for coospo-cli 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| coospo_cli-0.1.0.tar.gz | 25.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| coospo_cli-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 48.7 kB
Release files / coospo_cli-0.1.0.tar.gz
| Download URL | coospo_cli-0.1.0.tar.gz |
|---|---|
| Size | 25.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1c6aa81549b62895854ac3b4b8835c8785be1f54ef5b446cf9c493437e72b2be
|
|
BLAKE2b-256 checksum How to use checksums |
0ef079954336500cc421cb8b7bcf9d373d431ed00ea36180aa6fc87410a14c5d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / coospo_cli-0.1.0-py3-none-any.whl
| Download URL | coospo_cli-0.1.0-py3-none-any.whl |
|---|---|
| Size | 23.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1e6c41eea69fb02e9bc5a52c11e707ee19e465fea9756bb21e805ccb1217a8de
|
|
BLAKE2b-256 checksum How to use checksums |
117ea79eb007a8e6577bd03a1aa60815ad21c8373e2b6ab634c07c185e6cabac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency log