MJ Stories
Mobile craftsmanship stories
Your upload path is a translation layer whether you planned one or not. What your device stores and what your write endpoint accepts are rarely the same shape, and every difference is work that has to happen somewhere: inlining junction tables, dropping updates that must flow through events, stripping server-owned columns. Treat it as declarative, testable code, and watch which 'cosmetic' schema declarations secretly drive the wire.

Series · 6 parts
Offline-First KMP
When your mobile app must work without internet as a standard, not an edge case, the sync layer is just the first decision. What comes after — preserving user intent offline, trusting a "success" your server never actually confirmed, resolving conflicts as a human decision — is where offline-first actually gets hard. Field notes from a production KMP winery app.
More Stories
Your API key is not a secret
We have been hiding API keys in Android apps for a decade — with BuildConfig tricks, NDK, obfuscation libraries. None of it works. The fix is not better hiding; it is treating the key as a public identifier and proving the app is genuine instead.

Share iOs string resources with Android
There might be a requirement for mobile string resources to be defined or adjusted by management or copywriters. There also might be a requirement to add localization later by those roles. And on top of that strings should be synced across platforms.










