Now
Leading KMP/CMP at GeoKrishi Farm Aalekh, a Gradle plugin that enforces architecture at build time Nepali Date Picker ships to Kotlin, Swift, Flutter, JavaScript and Python KMP-Logger, lightweight structured logging for every target Publishing to Maven Central, the Gradle Plugin Portal, pub.dev, npm and PyPI Writing long-form KMP engineering on Medium and dev.to Coding by day, crafting verses by night

KMP / CMP Lead Developer, Kathmandu, Nepal

ShivaThapa

I build Android and iOS from one Kotlin codebase, Compose UI included, then publish the reusable parts: libraries on Maven Central, a Gradle plugin, and long-form engineering writing.

The flagship case study: GeoKrishi Farm, a production app rebuilt as Compose Multiplatform and shipped to existing users on the App Store and Play Store.

93%
shared code, production app, live on both stores
6
registries: Maven Central, Gradle Plugin Portal, pub.dev, npm, PyPI, Play Store
2+ years
production KMP across Android and iOS

Now: leading KMP/CMP at GeoKrishi

Work

One employer,
many products.

Pathway Technologies, Kathmandu. May 2024 – Present

Feb 2026 – Present

TripTurbo

Android and KMP developer. Owned the international flight vertical, and wrote both the Kotlin and the Swift halves of the shared analytics layer.

  • Shipped the international flight-booking vertical end to end: search, dynamic fare repricing, PNR creation with multipart document upload, validated passenger forms, promo codes, and payment integration. Around 80 files across the shared Kotlin data layer and the Compose UI.
  • Android and iOS now report into one KMP tracking layer covering GA4 and Meta App Events.
  • Every API error maps to a typed case. The sealed response hierarchy replaced scattered per-status handling across 87 files and removed roughly 2,500 net lines.
  • Existing users kept their sessions through an upgrade that R8 obfuscation would otherwise have broken, because encrypted-storage keys got a legacy migration path first.
  • Three production releases cut. Payment-gateway callbacks are deduped, so a retry can no longer fire a duplicate verification call.
  • Compose Multiplatform is progressively replacing the remaining SwiftUI surface. I oversee feature delivery and mentor the developers doing it.

Apr 2025 – Present

GeoKrishi Global

KMP/CMP lead developer. Sole author from an empty repository: 596 of 615 commits, roughly 97% of the code.

  • Leads mobile, owning both the feature roadmap and the architecture. Around 90% of the code is shared across Android and iOS.
  • Wrote the shared infrastructure solo: Ktor networking with typed errors and token refresh, a WebSocket real-time layer, Koin DI, type-safe navigation, encrypted key-value storage, and a single expect/actual boundary for all platform code.
  • Built real-time crop-health chat over WebSockets with cross-platform audio recording and playback and streamed file uploads. An upload OOM got found and fixed along the way.
  • Localized for multi-country use: three-language UI with per-app language preferences, language propagated to HTTP and WebSocket headers, country-code login, currency-aware pricing.

May 2024 – Present

GeoKrishi Farm

Android developer and KMP lead. Sole architect and implementer of the Compose Multiplatform rebuild, and release owner on both stores.

  • Swapped the entire codebase for the Compose Multiplatform rebuild under the same two store listings, one version to the next, with no user-visible migration.
  • The module graph holds at 52 since the rebuild (46 at ship) with compile-time-checked boundaries, so a dependency violation fails the build rather than review.
  • One shared Material 3 component kit serves both platforms, including a Compose build of iOS Liquid Glass so native surfaces still feel platform-correct.
  • Crash monitoring, mapping and native-symbol uploads, release health: Crashlytics is mine.
  • Cold start dropped about 18% on the low-end hardware farmers actually carry, benchmarked with Macrobenchmark rather than estimated.
  • AdMob integration and monetization experiments grew in-app ad revenue.
  • Liaison between the mobile work and the other product teams.

The case study below is this role's centerpiece.

May 2024 – Present

Internal & field products

  • Built multiple internal apps greenfield, first commit through to internal distribution.
  • Field teams collect data beyond reliable connectivity, so a day's work survives a day without signal: local persistence, deferred sync, conflict-tolerant uploads.
  • Internally distributed and maintained alongside the store-published products.

Case study: GeoKrishi Farm, May 2024 – Present

Same app, same listing,
new architecture.

GeoKrishi Farm is a farming app for Nepali farmers, in production on the Play Store and the App Store. I rebuilt it as Compose Multiplatform and shipped that rebuild to existing users as an ordinary store update: same listing, next versionCode.

The challenge

The old codebase was KMP in name only. One Gradle module, a token slice of Kotlin compiling for iOS, and the entire iOS UI duplicated in SwiftUI. Two codebases drifting apart, one feature at a time. The constraint: none of it could be visible to a user. No new listing, no forced re-login, no broken deep link, no lost notification.

My role

  • Sole architect and implementer of the rebuild.
  • Full migration, both platforms, shipped in place.
  • Play Store and App Store releases, Crashlytics, release health.
  • Liaison across product teams, mentoring the developers on the rollout.
Codebase before and after the rebuild
Metric Old New
Gradle modules 1 46
Kotlin compiled for iOS 848 lines (of ~215,000) 119,742 of 128,801 in commonMain, 93%, UI included
Swift 64,690 lines (fully duplicated UI) 993 lines
Codebases Two (Kotlin + SwiftUI) One, live on the App Store and Play Store, same listings

Shipping in place

  • Existing users kept their sessions. Credentials migrated across an R8 obfuscation boundary with no forced re-login on update.
  • Fresh iOS installs start clean. Keychain items outlive the app, so a reinstall must not inherit stale secrets.
  • Backward compatibility for years of accumulated deep-link and push-payload formats.

Measured, not estimated

Cold start on a Redmi Note 11 (Android 13), 10 iterations each: 1,359 ms median without a baseline profile, 1,118 ms with one, about 18% faster. Baseline and startup profiles are generated on real low-end hardware, because that is what the users have.

Under the hood

Biometric vaults, matched semantics

AndroidKeyStore AES/GCM cipher bound to the prompt ↔ iOS Keychain kSecAccessControlBiometryCurrentSet; both invalidate on biometry change.

Firebase via CInterop

A 16-line hand-written Objective-C header; the Kotlin klib carries no Firebase dependency.

Swift implements Kotlin

A Kotlin interface implemented in Swift bridges Google Maps/Places.

Payment SDKs, one Kotlin interface

Same pattern as Maps. Each platform's native payment SDK sits behind a shared Kotlin interface, so checkout call sites don't branch on platform.

One push/deep-link resolver

FCM push and deep links unified through a single shared Kotlin resolver on both OSes.

37 expect/actual seams

The full platform boundary, counted.

What I would tell the next person

  • R8 renames more than you expect. Encrypted storage keyed on anything R8 can rewrite passes every debug test and then fails on the first release build a real user installs. The migration path has to exist before that build ships, not after the reports arrive.
  • A baseline profile generated on a development machine describes a phone nobody in your install base owns. Generate it on the cheapest device you actually support, or the improvement you report is fiction.

Open Source

If I solve a problem twice,
it becomes a library.

Every entry below links to the registry it is published on.

Nepali Calendar Utils

Python, since Dec 2024

The Python port of the same calendar tables, for backends and scripts that need Bikram Sambat without a JVM.

Tallyo

Android app, since Jul 2025

Game utility app: score tracking, a chess timer with Fischer increment, dice rolling, random number generation, coin flipping, and a lap-enabled stopwatch.

Earlier, 2020 to 2023: a dual neural-network waste classifier, a desktop music manager with metadata editing, an Android music player, a parts-ordering web app. Music Tag Editor, demo lab → github.com/shivathapaa

Plus 5+ internal libraries maintained at work, alongside the public ones above

“When fingers dance on keys, I code with all my might
But when a pen is in my hand, I craft verses through the night.”

Shiva Thapa, developer and poet, Kathmandu

Writing

Notes from
production.

All articles → medium.com/@shivathapaa · dev.to/shivathapaa

About

The developer
behind the code

KMP/CMP lead in Kathmandu. I build Android and iOS from one Kotlin codebase, Compose UI included, and lead mobile at Pathway Technologies across its products.

I publish libraries to Maven Central, the Gradle Plugin Portal, and PyPI; write on Medium and dev.to; and mentor the team I lead.

The iOS side stays Swift wherever the platform genuinely requires it: the @objc Firebase bridge, the Maps integration, the app shell. Everywhere else, shared Kotlin wins on maintenance cost.

Languages

KotlinSwiftDartJavaScriptPython

UI & Frameworks

Jetpack ComposeCompose MultiplatformSwiftUIFlutterKtorWebSocketsKoinFirebase

Tooling & Publishing

Gradle convention pluginsMaven Central publishing

Contact

Building for both platforms
from one codebase?

buildwith.shivathapaa@gmail.com

Open to KMP and CMP consulting, lead roles, and open-source collaboration. I read everything sent here.