Writing

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 Jun 2026 · 8 min 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 May 2026 · 7 min Treating the watch as the primary screen changes nearly every UI decision. Fifty apps in: what actually makes iOS code last Apr 2026 · 9 min Lessons from a decade of shipping — and, harder, maintaining — App Store apps. ASO for a tiny app: 200 keywords and what moved installs Mar 2026 · 8 min A small currency app as a sandbox for keywords, icons and custom product pages. Keeping a watchOS workout alive without wrecking the battery Feb 2026 · 8 min HKWorkoutSession lifecycle, extended runtime, and what actually drains the battery on a long run. Streaming live heart rate from watch to phone Jan 2026 · 7 min The real-time channel, throttling, and what to do when the phone is asleep. One-tap Strava export over OAuth 2.0 Jan 2026 · 8 min The token dance, PKCE, and keeping refresh tokens out of trouble. A GPS route on MapKit that doesn't stutter when you pan Dec 2025 · 7 min MKPolyline, overlay renderers, and why point count is everything. StoreKit 2 with no server: verifying purchases safely Nov 2025 · 8 min currentEntitlements, signature verification, and the offline case — without a backend. RevenueCat, Adapty, or rolling your own Oct 2025 · 7 min 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 Oct 2025 · 8 min Driving layout and price from the server, and measuring lift honestly. Subscription metrics that matter Sep 2025 · 7 min LTV and retention over the day-1 conversion number that flatters you. Live Activities and the Dynamic Island for a live workout Aug 2025 · 8 min ActivityKit, update budgets, and designing for a 2 cm island. A WidgetKit timeline that stays fresh inside Apple's budget Aug 2025 · 7 min Timeline policies, relevance, and not getting throttled. Mixing UIKit and SwiftUI in an app older than SwiftUI Jul 2025 · 8 min Interop without a rewrite, and which direction to bridge. Migrating a real app to Swift 6 strict concurrency Jun 2025 · 9 min Actors, @MainActor, and the data races the compiler finally caught. Writing a custom Core Image kernel for a camera filter Jun 2025 · 8 min CIKernel and Metal, color management, and keeping it real-time. On-device Vision + Core ML without shipping a 200 MB model May 2025 · 8 min Quantization, Vision requests, and staying in the app-size budget. AVCaptureSession bugs that only show up on real devices Apr 2025 · 7 min Orientation, interruptions, and the simulator's lies. Migrating from Core Data to SwiftData on a shipping app Mar 2025 · 8 min The model-mapping reality, and a safe rollout. A Python-on-Firebase backend for an iOS app Mar 2025 · 8 min 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 Feb 2025 · 8 min State restoration, reconnection, and designing around dropouts. Attribution without creeping people out Jan 2025 · 7 min AppsFlyer, Adjust, and SKAdNetwork after ATT. A release pipeline for a solo dev Jan 2025 · 7 min Fastlane and Xcode Cloud, end to end.