Inspiration
A few years ago, I got really into tennis and built an Apple Watch app to keep score. Tennis scoring has a logic to it, but remembering the score and serving order while playing can still be a distraction. That first app lived on my wrist and never reached the App Store.
This year, while working on shared frameworks and tooling for my indie apps, I dusted it off. I expanded it to iPhone, added pickleball, and added padel for friends who play it. Shipaton gave me a reason to stop expanding the scope and ship something useful. That became Serve.
What it does
Serve keeps score and serving order for tennis, pickleball, and padel on iPhone, iPad, and Apple Watch. Record the winner of each rally and Serve applies the scoring rules, including deuce, tiebreaks, and the next server. You can undo a point when you tap the wrong player.
The Watch app can start, score, and finish a match without the phone nearby. Matches are saved locally and sync when the devices reconnect. No account is required. Widgets, Live Activities, and Shortcuts make the score and common actions accessible throughout a match.
All three sports and the complete Watch scoring experience are free. Optional Serve Pro adds unlimited history, custom formats, point-by-point review and corrections, head-to-head stats, and additional widgets.
How I built it
Serve is built with Swift and SwiftUI, with a shared scoring core used by the phone and Watch apps. Every rally is stored as an immutable event. Replaying those events produces the score, serving order, and match state, which lets undo and corrections stay consistent.
Each device has its own versioned JSON store. WatchConnectivity carries match updates between devices, with queued delivery when a connection is unavailable. RevenueCat manages annual and lifetime Pro purchases, restores, and entitlement updates. The phone caches Pro access and shares it with the Watch.
Challenges
The biggest challenges were getting three sports' scoring rules right and making corrections restore serving order as well as the score. Offline phone and Watch use also meant handling delayed updates and conflicting match histories without silently losing a player's match.
The small Watch screen needed large, readable scores and quick controls. I also had to keep the scope manageable: the core job is to record rallies and keep a match moving.
Accomplishments and lessons
I shipped Serve to the App Store, turning an old personal Watch project into an app people can use on court. The shared scoring engine has tests for scoring, replay, corrections, persistence, and synchronization, alongside phone and Watch UI tests.
Building Serve reinforced the value of a shared rules engine and local persistence for an app that needs to work away from a reliable connection. It also reminded me that choosing a useful stopping point is part of shipping.
What's next
I want to keep improving the courtside experience through feedback from tennis, pickleball, and padel players, with particular attention to Watch readability, serving cues, and match review.
Built With
- revenuecat
- swift
- swiftui
Log in or sign up for Devpost to join the conversation.