CK Chris Kubicki

Trails · 2020–2026

SnaT

Discover trails, navigate them, record the ride to GPX — and collect the points of interest along the way.

1. What it is

SnaT is a trail companion. It lists routes worth riding, shows what is on them, guides you along one, and records the ride as a GPX track you can keep or share.

The part that makes it more than a tracker is the gamification: points of interest on a route are collectable, which gives a reason to come back to a trail you have already ridden.

2. The hard parts

  • Recording with the screen off GPX capture has to survive the phone locking and the app being backgrounded. That means iOS background location mode plus the prominent-disclosure prompt Apple requires, a foreground service on Android, and a writer that leaves a valid track behind if the process is killed mid-ride.
  • A 3D track view, drawn by hand Rather than pull in a 3D engine, the preview is a CustomPainter: the track is reduced to roughly 500 points, projected through a manual perspective matrix, and drawn over Mapbox static tiles — with a drop shadow and an elevation ruler.
  • Points of interest that react to you Every POI carries a notify radius and a collect radius. Distance is recalculated on each location update, so riding through a point collects it without any server round trip.
  • Export that fails gracefully Rides are sent to Ride With GPS through the app's own account. When that fails, the app asks for the rider's own credentials instead of showing an error and leaving them stuck.
  • Reading Firestore defensively The same GeoPoint comes back in more than one shape depending on how a document was written. The parser handles both forms, so one oddly-shaped record cannot break an entire list.

3. Notes

  • Three languages, all copy in the app rather than a translation service.
  • No advertising, deliberately — the tracking permissions are already a hard sell without an ad SDK asking for more.

4. Contact

Something to build, fix or hook up? Write — replies usually land within a day, EU timezone.

chris@kubicki.live