BuildAppiPhone
ParkPlay Charlotte
An iPhone app that books a public pickleball court in two taps
Try it
Tap any open time.
Times with a line through them are already booked.
Sample times, not live county data.

- 10 s in 2 taps
- To book a court
- 12 in 28 days
- Builds
- 17
- Testers in the closed beta
- 5
- Real bookings by testers
What it is
ParkPlay Charlotte is an iPhone app for finding and booking public pickleball courts at 9 Mecklenburg County parks. You sign in with the county account you already have and everything runs on your phone. It is independent and not affiliated with the county.
It is for people who play at Charlotte's public courts and have fought the county's booking site to get one. On a phone, one booking took about 3 minutes, and each park only opens 7 days out, so a last minute change to the plan meant starting over.
I made it because booking courts caused more tension in my group than any game. I designed it and built it in SwiftUI with Claude Code inside Xcode. 17 testers tried it in a closed beta, and after 12 builds in 28 days they had made 5 real bookings and it went live on the App Store.

What I designed and built
- A week at a glance, with a bar under each day that shows how open it is
- Search across every park for an open court at the time you want
- A two-tap time picker that only leaves open the times the county will accept
- Rain alerts before you book and a Live Activity on the Lock Screen and in the Dynamic Island
- Light and dark mode, with native iOS patterns
- The App Store listing, which leads with speed and ends with privacy
Decisions
Nothing leaves your phone
I did not want anyone's information on a server, mine included. There is no ParkPlay account and no backend, and your county login stays locked on your phone. The trade-off is that the app cannot watch the forecast while it is closed, so rain alerts are scheduled ahead and checked again when you open it. I would make that trade again.
Two taps, and only times that work
After the first tap the Reserve button is ready for 1 hour and everything that cannot pair with it fades back. Tap the hour next to it to make it 2 hours. There is no way to pick a gap or a length the county will not accept. The trade-off is a 2 hour cap, which is the county's own rule, so the app follows it instead of failing at checkout.
A bar under each day, not a count
The first build showed a number under each day, like 47 open slots, and a number does not tell you much on its own. Build 5 swapped it for a bar that stays green while there is room and turns orange as courts book up. The trade-off is that you give up the exact count for a feel of the day at a glance.
Say it will rain before you pay
If there is at least a 50% chance of rain during your hour, you see it the moment you pick a time, with a clearer time to switch to in one tap. It shows again before you pay, and strong wind counts too. The trade-off is one more warning in a flow I want to be quick, and I decided a wet court costs more than a second of reading.
Match the county exactly
The courts, hours, rules and prices all belong to the county, so the app has to match its booking site or people stop trusting it. Reservations and payments are live even in the beta, so every tap has to be right. The trade-off is that any gap between the county's site and my app shows up fast in tester feedback.
Gallery
On your phone







Stack
- SwiftUI
- Claude Code
- Xcode
- Live Activities
- TestFlight
- App Store