Setup
1. Installation
Section titled “1. Installation”git clone https://github.com/arnav-kr/cmf-cmf-watch-utils.gitcd watch-utilsuv syncThis creates a virtual environment with the fwkit CLI and the BLE tool dependencies. The
installation is verified with:
uv run fwkit --helpuv run python tools/cmf_watch.py --help2. Firmware image
Section titled “2. Firmware image”The stock image for this device is published under dumps/binaries/:
git lfs pull --include="dumps/binaries/firmware/JX402_V1.0.0.73.bin"A local copy is used for editing, and the firmware/ directory is gitignored:
firmware/JX402_V1.0.0.73.binThe image is parsed and verified before any edit or flash:
uv run fwkit info firmware/JX402_V1.0.0.73.binuv run fwkit verify firmware/JX402_V1.0.0.73.bin3. Watch advertising
Section titled “3. Watch advertising”With the watch disconnected in the Nothing X / CMF app, or phone Bluetooth turned off, the
watch advertises as CMF Watch Pro 2-XXXX. The advertised device is located with:
uv run python tools/cmf_watch.py scan4. Pairing and local auth state
Section titled “4. Pairing and local auth state”uv run python tools/cmf_watch.py pairThe command performs the full pairing exchange and writes tools/.watch_state.json. The file
holds the watch secret and authkey — it is never committed or shared. After a factory
reset, or after the factory-menu shutdown/reset option is used, the watch is re-paired; a
stale authkey can still get an A052 reply but will not enter the OTA data phase.
5. Read-only check
Section titled “5. Read-only check”uv run python tools/cmf_watch.py infouv run python tools/cmf_watch.py ota-state --duration 5Correct version, battery and PID values indicate a working BLE path. Firmware flashing is a later step.
Documentation site
Section titled “Documentation site”Required only for documentation work:
cd sitepnpm installpnpm dev