I do all my own maintenance on the fleet.. two trucks, an ATV, a RZR.. which is why wrenchtron exists. I’ve also spent a lot of years on the workbench with Arduinos, Raspberry Pis, and SparkFun parts bins. This one comes from that side of the brain.

I’ve gotten into running lately, and the Peloton app’s outdoor mode does something I take for granted: my phone is the sensor. It starts the session, logs the whole thing, and hands me a history afterward.

Every belt-temp gauge I found for a UTV clutch is the opposite. A live number on an LED, and nothing else. Look away and that reading is gone forever.

The Build

I didn’t want to build sensor hardware. Everybody already sells it.. BLE thermometers by the dozen, built for smokers. What’s missing is the part that turns a live number into a ride you can look at later.

utvtron is a Next.js static export on Vercel. No backend.. Web Bluetooth talks to the probe, localStorage holds the history, nothing leaves the phone. Connect, start, ride, stop, look at the chart, export a CSV. That’s it.

The probe is a ThermoPro TP25, a $30 meat thermometer. Getting it to talk to a browser meant figuring out a Bluetooth protocol nobody publishes. A community project (thermopro-cli) had decompiled the Android app and documented the handshake, plus a temperature format I’d never have guessed. First connection, the app read 66°F next to the ThermoPro reading 66°F. Huh.. it works.

utvtron session history: early bench tests reading 66°F next to the ThermoPro controller, before the first real ride

First Ride

I stuck the probe behind the back seat.. wrong spot, but it was a start.. and went for a ride.

ThermoPro TP25 controller between the RZR’s rear seats, probe cable routed down toward the storage compartment

36 minutes, live readout the whole time, saved cleanly afterward.

utvtron’s first ride: 146°F max, 129°F avg, 36 minutes, with the full temperature chart and an Export CSV button

The best part was the CSV. About 20 minutes in there’s a ~50 second gap, then 33 readings with the exact same timestamp even though the temps are all different. My phone screen locked mid-ride, the browser tab went to sleep, and Bluetooth kept stacking up readings until the tab woke up and swallowed them all at once. Fixed it by keeping the screen awake while recording, catching Bluetooth drops, and autosaving every 10 seconds so a killed tab doesn’t eat the ride.

At the end I moved the probe into the engine bay and the ThermoPro’s own screen read 142°F, right in line with what the app logged. Good data, dumb phone.

ThermoPro TP25 controller reading 142°F with the probe moved into the engine bay

The RZR dash only shows coolant temp.. nothing on the belt or clutch, which is the whole reason I’m doing this. A probe behind a seat doesn’t tell me anything about the belt. Next ride it goes in the clutch duct.

Live: utvtron.vercel.app.. Chrome on Android only, Web Bluetooth isn’t on iPhone yet.

Update, Aug 10: I took that ride. The duct was the intake.