Project
Golf Tech / Mobile

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.

Tech
  • TypeScript
  • React Native
  • Expo
  • SQLite
  • Bluetooth LE
  • OpenStreetMap
  • Vitest

← All projects