Solo developer · 2026
Vesper
A personal, local-first golf shot tracker that computes real strokes gained. No cloud, no subscription.
Overview
Commercial shot-tracking systems lock strokes-gained analytics behind hardware and subscriptions. Vesper is a from-scratch mobile app that tracks a round hole by hole, infers lie and distance from GPS and course geometry, and computes Broadie-method strokes gained per shot, entirely on-device. It shows that Broadie-style strokes-gained analysis does not require commercial hardware, a cloud service, or a subscription to work.
What I Built
- A strokes-gained engine implementing Mark Broadie’s method (expected-strokes tables by lie and distance, category splits for off-the-tee, approach, around-the-green, and putting), fully unit-tested.
- Pure geo-math for course play: haversine distance, point-in-polygon lie inference (green, bunker, fairway, rough, tee), and automatic hole advancement from live GPS.
- A course-data pipeline that pulls real hole geometry (tees, greens, hazards) from OpenStreetMap and caches it for offline play.
- An active BLE reverse-engineering track to read swing data directly from a commercial motion sensor: capture, payload decoding, and a spike-detection layer that flags candidate swings from raw accelerometer data.
- A round state machine and full React Native/Expo app (round tracking, scorecard, stats, club setup) backed by on-device SQLite.
- A tested codebase: geo math, strokes gained, state machine, and sensor fusion are all covered by a Vitest suite.
Tech
TypeScript, React Native (Expo), SQLite, Bluetooth LE (react-native-ble-plx), OpenStreetMap course data, Vitest.
Status
Active personal project. The strokes-gained engine, course geometry, and round tracking are built and tested; BLE sensor decoding is an active reverse-engineering track.
- TypeScript
- React Native
- Expo
- SQLite
- Bluetooth LE
- OpenStreetMap
- Vitest
Repository coming soon.