author: Wesley Matlock read_time: 4 —
💥 Push to 100 — The Side Project That Actually Made It
Some projects start with a pitch.
Some start with a roadmap.
This one started as a half-baked idea buried in my Notes app.
“Build something. Ship it this time.” That was it.
Nothing complicated. Just a scrappy little app to help me do more pushups. But more than that? It was my excuse to learn some new tech and finally follow through on a side project. No bailing. No shiny distractions.
🧠 Built to Learn (And Break Things)
I didn’t plan for this thing to become a crash course in SwiftUI pain points — but that’s exactly what happened.
This was my first real swing at SwiftData, and while the concept is clean, syncing with iCloud turned into a whole mood. Some days, sync would just work. Other days, I’d log a set of pushups and they’d vanish like a ghost in the machine. I rewrote that logic more times than I’d like to admit — async/await everywhere, retry strategies, sanity checks. Nothing like chasing invisible bugs across two devices at midnight.
And yeah, I added subscriptions. Not because I needed them, but because I hadn’t really dug into StoreKit 2 yet and wanted to see what it would throw at me. Answer: a lot. Sandbox testing is a mess, receipt validation gets weird fast, and figuring out entitlements made me feel like I was trying to hotwire my own app.
I built and rebuilt the data model. Swapped navigation stacks midstream. Cursed at a NavigationLink like it owed me money. But it came together.
📦 Somehow… It Shipped
After a couple of false starts in App Store Connect — rejections, stalled builds, “metadata issues” — it finally went through.
And now? It’s real.
📲 Push to 100 on the App Store
I’m not gonna lie, opening that link and seeing the live listing still gives me a weird little dopamine hit. Real icon. Real users. And yes, real crashes (hopefully not many).
⌚ Watch App: Still in the Lab
The watchOS version is in TestFlight, but syncing between phone and watch has been a total headache. It’s the kind of bug that disappears the second you open Xcode to investigate. I’ve been hammering on it with multiple devices, and it’s getting better — but I’m not quite ready to ship that one yet.
Long term, this project’s more than just a workout tracker.
I’m using it as a living sandbox — to test new SwiftUI components, explore SwiftData behavior across updates, and play with whatever Apple throws at us next WWDC. If Push to 100 keeps evolving, it’s because I am too.
🚀 Why This One Mattered
Push to 100 isn’t a side project I made for clout.
I built it because I was tired of not finishing things.
Every dev’s got that pile of dead folders — half-built SwiftUIs, abandoned Combine experiments, sample projects that never made it out of the preview canvas. This time, I wanted something different. I wanted the App Store link. I wanted to feel that tap on “Submit for Review” and actually mean it.
And I did. It’s live. And even though the app is simple, I learned more from it than any course or WWDC session. I got to feel the real edges of SwiftData. I got my hands dirty with StoreKit 2. I fought the sync demons. And I didn’t quit when things got weird.
I’m still not at 100 pushups. But I shipped the app. That counts for something.
Wanna see it?
🛠 Dev Notes: What I Learned Building Push to 100
SwiftUI Architecture
- Used @Observable, @Environment, and new NavigationStack patterns
- Designed minimal, adaptive UI that works on iOS and watchOS
- Focused on modular, testable code without over-engineering
Async/Await in SwiftUI
- Applied structured concurrency to background tasks and state updates
- Reduced UI blocking during sync and data fetches
- Built safer, cleaner flows around async ViewModels
SwiftData + iCloud Syncing
- Modeled sets, reps, and streaks using SwiftData
- Dealt with real-world iCloud sync quirks across devices
- Built fallback and retry logic around state propagation
StoreKit 2 + Subscriptions
- Set up and tested in-app purchases via StoreKit 2
- Managed entitlements, sandbox testing, and restore logic
- Handled edge cases in receipt validation
Xcode Cloud CI/CD
- Configured automatic builds and TestFlight distribution using Xcode Cloud
- Used environment variables and build settings for app versioning
- Caught early regressions by running real builds in parallel with local development
App Store Connect & Release Process
- Navigated submission/review pipeline solo
- Created production metadata, screenshots, and builds
- Learned how to respond to App Review rejections (politely… mostly)
🎯 Bonus: Real-World iOS Dev Stories
I’ve been writing about all the usual SwiftUI chaos — layout bugs, async weirdness, iCloud syncing that gaslights you.
If you’re into that kind of masochism: medium.com/@wesleymatlock
And if you’ve ever shipped a side project of your own? Respect. You know the grind.
Originally published on Medium