ZONILY_JAME Work with me?

1-1START

    ARTICLE // ON_SITE

    Why We Rebuilt Wookie: From KMP to Flutter

    KMP works great until Xcode needss an update and breaks your build on a Tuesday. Here's the math we used to justify throwing away 2 years of code.

    Published
    Read
    5 MIN
    Author
    Zonily Jame
    • #kotlin-multiplatform
    • #flutter
    • #architecture
    • #refactoring

    Note: Some names and company-specific details have been generalized to protect confidentiality.

    Wait, why did we even start this in the first place?

    Kotlin Multiplatform (KMP) works great… right until the math stops working.

    It was mid-2024. I was looking at our roadmap and realized we had a problem. The original KMP team was about to be pulled for a high-priority client project

    This left me with a tough problem, KMP required developers who had KMP experience to maintain the shared code. There would be no one left behind?

    So we started the rebuild in advance. It wasn’t a panic move yet. I had one senior and one junior (who had just trained in Flutter) start the migration as a background task. “Just in case,” I told myself.

    Then the Tuesday morning from hell happened… 💀

    We were right to start early. Because late in 2024, Xcode, requiring a yearly update, broke the codebase

    We were preparing a routine release for Wookie. Suddenly, our build pipeline was NOT WORKING. The KMP bindings for iOS were broken.

    • To fix it, we needed to update the Kotlin version.
    • But updating Kotlin required updating KMP.
    • But updating KMP required migrations which would then result to refactoring our shared business logic layers.

    I stared at the error logs halfway through migration and realized: We were stuck halfway between a broken KMP app and an unfinished Flutter app.

    The pivot (asking for the cavalry)

    This was the catalyst

    I didn’t use the breakage to start the rebuild - we’d already done that. I used it to get resources.

    I sent an urgent message straight to the HR and CTO. “KMP is dead, the migration requires resources we don’t have. The Flutter rebuild is 40% done. If you want this app to survive, I need dedicated developers to finish the Flutter port ASAP.”

    Because the breakage was so visible (and painful), I got the go signal. We got a new team, and what started as a “nice to have” background task became the main priority

    Okay, let’s look at the math

    In 2023, choosing KMP made sense. We had native mobile developers who needed to upskill in Kotlin and SwiftUI and wanted to share logic but keep their native UI tools (SwiftUI and Compose). Fair enough.

    But by 2024, the constraints had completely shifted:

    • Resource Crunch: We didn’t have a dedicated team anymore. We had a rotating cast of juniors and maintainers.
    • Maintenance Cost: Every feature had to be implemented twice in the UI layer. One screen for iOS. One screen for Android. Bugs happened separately or twice.
    • Onboarding Speed: Teaching a junior Swift and Kotlin and the KMP bridge took is impossible without prior native experience. Teaching them Flutter? several weeks.

    I literally did the math,

    FactorKMP (Reality)Flutter (Projection)
    Codebases 3 (Shared, iOS UI, Android UI)1 (Everything)
    Devs Needed 2 (1 iOS, 1 Android)1 (Cross-platform)
    Onboarding 3-4 Weeks1 Week
    Stability Fragile (OS updates break things)Stable (Own rendering engine)

    Codebases

    KMP (Reality)
    3 (Shared, iOS UI, Android UI)
    Flutter (Projection)
    1 (Everything)

    Devs Needed

    KMP (Reality)
    2 (1 iOS, 1 Android)
    Flutter (Projection)
    1 (Cross-platform)

    Onboarding

    KMP (Reality)
    3-4 Weeks
    Flutter (Projection)
    1 Week

    Stability

    KMP (Reality)
    Fragile (OS updates break things)
    Flutter (Projection)
    Stable (Own rendering engine)

    The decision was painful but clear: Throw away the code.

    The unplanned lucky break

    We didn’t just stop development. We actually caught a huge break.

    Not only did we get a client, we also got to rebuild the product in a more future proof manner

    Why? Because it forced our hand. Without the developers who could debug obscure Gradle/Xcode interop issues, KMP was unsustainable. It proved my earlier fear If the tool requires specialized expertise to maintain, it’s the wrong tool for a rotating team.

    How we migrated 10,000 lines of code without dying

    We didn’t do a “Big Bang” rewrite. We went smart

    We kept the backend exactly the same. Because we used Supabase, the database, auth, and real-time logic were already decoupled from the client.

    Phase 1: The Zombie App. We kept the KMP app running in maintenance mode. No new features.

    Phase 2: The Shadow Build. We onboarded 4 new trainees from our internship program (started in 2024). Their first task? “Test the codebase and check for issues against the current Production app”

    One of the original leads (Geremy Ubaldo) and a team member (Margaux Padiwan) volunteered to guide the new team while still on their client project. Their knowledge sharing and PR reviews made the transition significantly faster.

    Phase 3: The Swap. Because the backend logic was identical, we could switch all the users by just releasing a new build with the same package identities

    So, did Flutter win?

    Yes. But not because it’s “better technology.”

    KMP is nice if you have a large, stable team of native engineers who need deep OS integration and a fully native UI/UX. But for a tool maintained by a rotating team? Flutter is king.

    Today, Wookie runs from a single repository. They can pull a random junior off the bench, give them a Dart crash course, and have them shipping features and fixes in days, not weeks.

    The honest truth

    Tech stack decisions aren’t about “Right vs. Wrong.” They’re about “Matches your constraints” vs. “Doesn’t.”

    In 2023, KMP matched our team. In 2024, it didn’t.

    The best engineers aren’t loyal to tools. They’re loyal to reality.


    Related:

    Written by

    Zonily Jame

    About me

    [01]RELATED

    All articles

    [02]COMMENTS

    Discussion

    Questions, corrections or war stories. Sign in with GitHub to join in.

    Loading comments…

    [ READY_TO_BUILD? ]

    Let's Build Something Great

    Start with a 30-minute discovery call to assess if we're a good fit. No commitment, just clarity.

    or write to hello@zonilyjame.dev