Hojung Lim · October 2026 · First App Store release · Swift, SwiftUI, SwiftData, WatchConnectivity, ActivityKit
This page describes Golf Clicker as it first shipped. Several behaviors described here changed in later
versions. See 1.1 and the current version.
Why I Built It
Count every stroke. Nothing else. Golf apps track GPS, shots and handicaps, but on
the course I mostly wanted one number: how many strokes on this hole. Golf Clicker 1.0 was a
deliberately minimal, fully offline stroke counter for iPhone and Apple Watch. You count from your
wrist while the phone stays in your pocket, or while another golf app such as 18Birdies is open on
the phone. No account, network, backend or iCloud.
Goals for the first release:
Launch publicly on the App Store, completely free.
Validate the core stroke-counting experience on real rounds.
Validate that iPhone ↔ Apple Watch sync survives real course conditions.
Build an initial group of users to learn from.
18
Holes per round, with Front 9 / Back 9 / total subtotals
3
Targets: iPhone app, Apple Watch app, Live Activity widget extension
20
XCTest unit tests covering the round store and sync idempotency
0
Network calls; all data stays on the device
Screenshots (1.0)
iPhone
HomeActive roundRound HistoryScorecard
Apple Watch
Hole 1Hole 2Hole complete
Features in 1.0
Home
Start New Round, Round History, and a "Resume Current Round" card with a circular 18-hole progress ring and "Started 1:05 PM · Thru 7 · +2". Starting a new round while one is active asks whether to resume or replace; the replaced round is still saved to history.
Active round
Big hole number; Thru / Score / Total pills; a Par 3 / 4 / 5 selector; and a large circular stroke button with haptics. The button stayed disabled with "SELECT PAR" until par was chosen. A live "2 over par" line sat with Undo and Finish Hole. A round could only be finished after all 18 holes.
Scorecard and history
Front 9 / Back 9 sections with Out/In subtotals and a total row, color-coded +/- badges, and an edit sheet to fix a completed hole's par or strokes. Round History listed completed rounds newest first with date, holes played, duration, total strokes and +/- par, with swipe to delete.
Apple Watch
The same big-button counter with Undo and Finish Hole. After finishing a hole the watch showed "Hole 5 complete — Set up Hole 6 on your iPhone" until par was picked on the phone. It kept counting when the phone was unreachable and offered a "Sync now" button.
Live Activity / Dynamic Island
Lock Screen banner and Dynamic Island views with the current hole, par, strokes and "Thru n · total · +/-", updated after every change, including watch taps while the iPhone app is in the background.
Architecture (1.0)
Watch tap ──► WatchEvent (UUID, absolute count) ──► transferUserInfo + sendMessage
──► iPhone: dedupe by id ──► RoundStore (atomic save) ──► RoundSnapshot ──► Watch + Live Activity
RoundStore is the single entry point for every mutation; each change is saved immediately and rolled back on failure.
The watch sends absolute stroke counts, not +1 deltas, so a duplicated or replayed event cannot double-count. Duplicate event IDs are ignored.
A stale watch event was detected by comparing its timestamp with the phone's last edit on the same hole.
After any event, even a rejected one, the phone re-publishes its snapshot so the watch converges back to the phone's state.
What We Learned After Launch
Using 1.0 on real rounds, testing more watch sizes, and listening to golfers surfaced these issues. Each one became part of a later update.
WatchControls clipped on small watches.
On 41 mm cases (Series 7 class) the Undo / Finish row fell below the bottom edge, because controls were sized from the shorter screen side only.
Fixed in 1.1: the counter is laid out from the safe-area height and width.
WatchSlow to get back to the counter.
Golfers check distances in 18Birdies, then return to Golf Clicker. Without a complication or widget that took several steps every hole.
Fixed in 1.1: watch-face complication, Smart Stack widget and a deep link straight to the counter.
SyncConflicts were judged by two different clocks.
Staleness compared a watch timestamp with an iPhone timestamp, and every wrist raise asked the phone for a snapshot the phone was already sending.
Fixed in 1.1: revision-based conflict detection and snapshots carried in message replies.
Golfer feedbackPar had to be chosen before counting.
Many golfers don't know or care about par for every hole.
Addressed in 1.2: par is optional everywhere.
Golfer feedbackMany rounds are only 9 holes.
A round could only be finished after hole 18.
Addressed in 1.2: Finish Round at any hole.
Golfer feedbackGolfers sometimes skip a hole.
There was no way to mark a hole as not played.
Addressed in 1.2: Pass Hole on iPhone and Apple Watch.
ReliabilityStorage errors crashed the app, and early-ended rounds were ambiguous.
If the on-device database could not open, the app stopped. Replacing a round mid-hole left that hole marked "in progress" inside a finished round.
Fixed in 1.2: a recovery screen, a versioned data model, and an explicit "Incomplete" hole state.