<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/leiu4cdzp" -->

---
title: How Major Metros Run on Kotlin Multiplatform | Talking...
description: Masabi, a mobility-as-a-service platform powering public transit ticketing for major cities including New York's MTA, shares how they migrated a decade-old...
canonical: https://daily.dev/posts/leiu4cdzp
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: How Major Metros Run on Kotlin Multiplatform | Talking Kotlin #145 | daily.dev
og:description: Masabi, a mobility-as-a-service platform powering public transit ticketing for major cities including New York's MTA, shares how they migrated a decade-old...
og:url: https://daily.dev/posts/leiu4cdzp
og:image: https://api.daily.dev/og/posts/leiU4cdzP.png
og:image:alt: Post cover image
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# How Major Metros Run on Kotlin Multiplatform | Talking Kotlin #145

**[Just Kotlin](https://daily.dev/sources/justkotlin)** · [@giorgishalvashvili](https://daily.dev/giorgishalvashvili) · 1 upvotes · 0 comments

## Summary

Masabi, a mobility-as-a-service platform powering public transit ticketing for major cities including New York's MTA, shares how they migrated a decade-old Java codebase to Kotlin Multiplatform. The system spans embedded gate validators, Android/iOS mobile apps, and backend services. The migration moved away from J2ObjC (Java-to-Objective-C transpilation) to KMP, driven by concerns about J2ObjC's stagnating support and the desire to unify the tech stack. The team took an incremental approach: first modularizing the monorepo, then migrating small helper libraries as safe proving grounds, keeping Java tests in place to validate Kotlin production code before migrating tests themselves. The translation process evolved through three eras—manual/IntelliJ converter, early ChatGPT copy-paste, and finally agentic IDE tools like JetBrains AI and Junie—dramatically accelerating the work. Challenges included nullability decisions, lack of parameterized test support in common Kotlin tests (solved with a custom KSP processor), and replacing Java standard library APIs like java.time with kotlinx-datetime and HTTP clients with Ktor.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.youtube.com/watch?v=Wze7qsDl4BM>

## Similar posts on daily.dev

- [Why Kotlin, Jetpack Compose, and Kotlin Multiplatform Succeeded: The Power of Incremental Adoption](https://daily.dev/posts/why-kotlin-jetpack-compose-and-kotlin-multiplatform-succeeded-the-power-of-incremental-adoption-zp4lwtskz) · Medium · 3 upvotes · 0 comments
- [Helping Decision-Makers Say Yes to Kotlin Multiplatform \(KMP\)](https://daily.dev/posts/helping-decision-makers-say-yes-to-kotlin-multiplatform-kmp--ts09b63zw) · JetBrains · 1 upvotes · 0 comments
- [Why we love multiplatform with Kotlin and Compose](https://daily.dev/posts/why-we-love-multiplatform-with-kotlin-and-compose-ygw5twyaa) · Q42 Engineering · 0 upvotes · 0 comments
- [Kotlin Multiplatform Is Not Cross-Platform: Understanding the Real Difference](https://daily.dev/posts/kotlin-multiplatform-is-not-cross-platform-understanding-the-real-difference-feksv6re1) · Medium · 0 upvotes · 0 comments

---

Tags: [#kotlin](https://daily.dev/tags/kotlin), [#ktor](https://daily.dev/tags/ktor), [#mobile](https://daily.dev/tags/mobile)

[View this post on daily.dev](https://daily.dev/posts/leiu4cdzp)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"DiscussionForumPosting","mainEntityOfPage":"https://daily.dev/posts/leiu4cdzp","headline":"How Major Metros Run on Kotlin Multiplatform | Talking Kotlin #145","text":"Shared: How Major Metros Run on Kotlin Multiplatform | Talking Kotlin #145","url":"https://daily.dev/posts/leiu4cdzp","datePublished":"2026-02-23T14:54:16.276Z","dateModified":"2026-06-25T02:12:48.558Z","author":{"@type":"Person","name":"Giorgi Shalvashvili","url":"https://daily.dev/giorgishalvashvili","image":"https://lh3.googleusercontent.com/a/ACg8ocIwuIzmwaSYq8PEmOWByDg7J5ZxDHoG2lH-05--GDMIH4LQQ1tM=s96-c","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"EndorseAction"},"userInteractionCount":2300}},"image":"https://media.daily.dev/image/upload/s--CxzD6vbw--/f_auto/v1722860399/public/Placeholder%2005","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"sharedContent":{"@type":"WebPage","url":"https://api.daily.dev/r/v9E3fXNyh"},"isPartOf":{"@type":"WebPage","url":"https://daily.dev/squads/justkotlin","name":"Just Kotlin"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Just Kotlin","item":"https://daily.dev/squads/justkotlin"},{"@type":"ListItem","position":3,"name":"How Major Metros Run on Kotlin Multiplatform | Talking Kotlin #145"}]}
```

