Writing
Blog
How to Detect and Redact Personal Data in Plain Text on Android
How Security Sentinel finds emails, phone numbers, ID numbers, IP addresses, API keys and passwords in plain text with regex, libphonenumber and ML Kit, then redacts exactly what you choose.
Remove Metadata from PDF and DOCX Files Without Changing What You See
How Security Sentinel finds and removes author names, file paths, comments, tracked changes, hidden text and auto-run scripts from PDF and Word documents on Android, without redrawing the pages.
Remove Photo Metadata on Android Without Re-encoding the Image
Strip EXIF, XMP, and IPTC metadata from JPEG and HEIC photos in Kotlin without recompressing pixels, while keeping orientation. A technical case study of Security Sentinel.
Countdown Widgets with Kotlin Multiplatform, WidgetKit, and Glance
Build native countdown widgets with shared Kotlin date logic, iOS WidgetKit timelines, and Android Glance updates. A technical case study of Near & Dear.
Procedural Adventure Level Generation in Kotlin
Build a deterministic adventure level generator in Kotlin with seeded randomness, progressive unlocks, and Compose retry state, using PickPerfect as a case study.
Building an Offline-First App — No Backend, No Auth, No Cloud
BoxIndex is a home inventory app with no login screen, no server, and no subscription. Here's what that forces you to think about as a developer.
End-to-End QR Deep Linking in a Kotlin Multiplatform App
How we wired QR code generation, custom URL schemes, and cross-platform deep link routing in BoxIndex — a KMP app built with Compose Multiplatform.
Why I Threw Away Material Slider — and the Stale Closure Bug That Made Me
Building a custom gradient slider in Jetpack Compose Multiplatform, and the one-liner that fixed a subtle, maddening bug.
Cross-Platform Haptics in Kotlin Multiplatform: One Interface, Two Engines
How PickPerfect calls hapticTick() from shared Compose code while each platform does its own thing under the hood.