Notes from the build.
Short, practical write-ups on the things I hit while shipping — iOS, watchOS, and the craft of getting an app out the door.
Smoothing noisy GPS: Kalman + Douglas–Peucker in a running app
Why raw watch GPS jitters, and the two-step pipeline I use to get a clean route.
Watch-first, not watch-also: designing intervals for the wrist
Treating the watch as the primary screen changes nearly every UI decision.
Fifty apps in: what actually makes iOS code last
Lessons from a decade of shipping — and, harder, maintaining — App Store apps.
ASO for a tiny app: 200 keywords and what moved installs
A small currency app as a sandbox for keywords, icons and custom product pages.
Keeping a watchOS workout alive without wrecking the battery
HKWorkoutSession lifecycle, extended runtime, and what actually drains the battery on a long run.
Streaming live heart rate from watch to phone
The real-time channel, throttling, and what to do when the phone is asleep.
One-tap Strava export over OAuth 2.0
The token dance, PKCE, and keeping refresh tokens out of trouble.
A GPS route on MapKit that doesn't stutter when you pan
MKPolyline, overlay renderers, and why point count is everything.
StoreKit 2 with no server: verifying purchases safely
currentEntitlements, signature verification, and the offline case — without a backend.
RevenueCat, Adapty, or rolling your own
When a paywall SDK earns its cut, and when it doesn't.
A remote-config paywall you can A/B test without shipping a build
Driving layout and price from the server, and measuring lift honestly.
Subscription metrics that matter
LTV and retention over the day-1 conversion number that flatters you.
Live Activities and the Dynamic Island for a live workout
ActivityKit, update budgets, and designing for a 2 cm island.
A WidgetKit timeline that stays fresh inside Apple's budget
Timeline policies, relevance, and not getting throttled.
Mixing UIKit and SwiftUI in an app older than SwiftUI
Interop without a rewrite, and which direction to bridge.
Migrating a real app to Swift 6 strict concurrency
Actors, @MainActor, and the data races the compiler finally caught.
Writing a custom Core Image kernel for a camera filter
CIKernel and Metal, color management, and keeping it real-time.
On-device Vision + Core ML without shipping a 200 MB model
Quantization, Vision requests, and staying in the app-size budget.
AVCaptureSession bugs that only show up on real devices
Orientation, interruptions, and the simulator's lies.
Migrating from Core Data to SwiftData on a shipping app
The model-mapping reality, and a safe rollout.
A Python-on-Firebase backend for an iOS app
Firestore and Cloud Functions in Python — and when a client-only app should grow a backend.
Core Bluetooth in production: talking to flaky BLE hardware
State restoration, reconnection, and designing around dropouts.
Attribution without creeping people out
AppsFlyer, Adjust, and SKAdNetwork after ATT.
A release pipeline for a solo dev
Fastlane and Xcode Cloud, end to end.