Managing an app localized into 36 languages: automation is non-negotiable
My 12 iOS apps are localized into 36+ languages. Manual management isn't an option. String management, release workflow, and translation services.
Read replica strategy: when it earns its keep, when it’s just complexity
A read replica is the classic database scaling tool. On some projects it creates more problems than it solves. When to add…
Migrating from WatchKit to a native watchOS app: lessons from two apps
watchOS 9 deprecated the old WatchKit extensions. I ran the migration on two apps and a few surprises showed up along the…
REST vs GraphQL: when GraphQL actually wins
GraphQL gets pitched as the default for modern APIs. On most projects REST ends up winning. Here's where GraphQL really pays off.
Apple Watch companion apps: five decisions that actually matter
I added a Watch app to Dentii, and syncing with the iPhone app was trickier than I expected. Five decisions that actually…
Database connection pool sizing: why the defaults are wrong
Every framework picks a different connection pool default, and most of them are wrong. How I size pools from real production experience.
iOS deep linking in 2025: URL schemes, Universal Link, App Clip
Deep linking on iOS has had three generations: URL scheme, Universal Link, App Clip. Which one when, and how to set them…
API versioning: URL, header, content negotiation, which one ships?
/api/v1/users versus header-based negotiation. What holds up in production, and what looks clean on paper but bites you in production.
Universal Links: four things Apple’s docs skip over
Universal Link setup looks simple in the docs and gets messy in production. Four real problems I hit across five apps.
Cache invalidation: two hard problems and the patterns that work
Phil Karlton's old joke: "Two hard problems in computer science: cache invalidation and naming things." Here are the patterns for the first.
Push notifications: the retry and dedupe strategy that actually holds up
Some users get the same push twice, others get nothing. The retry and dedupe patterns I've pulled from 12 apps in production.
JWT vs Session: real decision criteria, not tribal debate
The internet is split down the middle on this. A clear framework for the questions that actually matter when you pick.