Running app2025

Pace

No signal. Still recording.

Pace

Overview

Running happens in canyons, on trails, abroad with roaming off. So the phone's SQLite is the source of truth and the Go API is a replica plus a social layer. An outage degrades sharing, never the ability to record.

The problem

Most running apps treat the network as the source of truth. Offline becomes a degraded mode, and a bad sync can resurrect or drop runs.

Wins

Every mutation writes its row and its outbox entry in one transaction. The drain refuses unfinished runs, drops deleted upserts instead of resurrecting them, parks permanent failures, and halts the pass on a 5xx — because an outage describes the world, not the row.

Tech stack

Expo / React Native / SQLite / Go / Postgres / sqlc + goose / Fly.io