The iOS App Abandoned for Flutter

Sunk cost fallacy vs platform expansion. A working iOS app was rewritten in Flutter. Here's the decision framework that was used - and whether it was worth it.

H
Hub4Apps
6 min read ยท Oct 2025

This post reflects personal learning and experimentation. It does not represent commercial offerings or services.

The Xcode project sat there on a Sunday night. Four months of work. SwiftUI views that had finally been gotten right after countless Stack Overflow searches. CoreData models. A published app with 50 actual users.

And it was about to be deleted.

Not archived. Not "maybe someday." Deleted. Starting over in a language where no production code had been written before.

Was this insane? The app worked. People were using it. Four months of learning SwiftUI, finally paying off - and it was about to be thrown away?

Then the analytics dashboard revealed something. Half the website visitors were on Android. Every single one of them clicked "Get it on Google Play" and found... nothing.

Xcode was closed. A new terminal opened. flutter create gitawisdom was typed.

It was the scariest engineering decision that had ever been made. It was also the best one.

The Decision: Rewrite vs Maintain

๐Ÿ”ง
Engineering View

Two codebases = double maintenance

Option 1: Keep iOS native, build Android native. Every feature ships twice. Every bug is fixed twice. Every UI change is made twice.

  • SwiftUI + Kotlin = 2x work forever
  • Feature drift between platforms
  • Testing complexity doubles
vs
๐Ÿ“ฆ
Product View

Half the market is unreachable

The iOS app was working, but it was capped. It could only ever reach iOS users. Half the potential audience was clicking "Get it on Google Play" and finding nothing.

  • Android users = lost opportunity
  • India market is Android-heavy
  • Every day without Android = lost users
The Question

One critical question was considered: Does this unlock a new market? The answer was clearly yes. Flutter rewrite meant one codebase, both platforms, double the reach without double the work.

The Options That Were Considered

Three Paths Forward

Option 1: Keep iOS native, build Android native
  โ†’ 2x codebases, 2x maintenance forever

Option 2: Keep iOS native, build Android in Flutter
  โ†’ Weird split, inconsistent architecture

Option 3: Rewrite everything in Flutter
  โ†’ Throw away working code, but 1x maintenance

On paper, option 1 seems "right" - keep what's working, add what's missing. But as a solo developer, two native codebases means every feature ships twice, every bug is fixed twice.

The Sunk Cost Question

๐Ÿ”ง
Engineering View

3-4 months of iOS work

The iOS app was real work. SwiftUI views, CoreData models, Combine state management. Walking away felt like waste.

  • Working authentication
  • Complete UI implementation
  • Published in App Store
vs
๐Ÿ“ฆ
Product View

Prototype, not product

Reframe: The iOS app wasn't wasted - it was a prototype that proved the concept. Now it was time to scale the learnings.

  • Product knowledge carries over
  • UX decisions are validated
  • Backend stays the same

What Actually Happened

๐Ÿ”ง
What Was Rebuilt

The technical translation

6 weeks of focused work. Not starting from zero - translating concepts that were already understood.

  • SwiftUI โ†’ Flutter widgets
  • Combine โ†’ Riverpod (upgrade)
  • CoreData โ†’ Hive (simpler)
  • Supabase client โ†’ same
vs
๐Ÿ“ฆ
What Carried Over

The product foundation

Everything that matters for users transferred directly. The rewrite was faster because it wasn't about inventing - it was about translating.

  • Same backend (zero changes)
  • Same UX flows
  • Same content structure
  • Same brand/colors

The Results

6 weeks Rewrite Time
50/50 iOS/Android Split
1x Development Effort (was 2x)

Within a month of the Flutter version launching on both stores, Android downloads caught up to iOS. Every feature built now reaches twice as many users with the same effort.

When NOT to Rewrite

๐Ÿ”ง
Engineering Reasons to Stay Native

Platform-specific features

  • Heavy HealthKit/ARKit usage
  • Custom platform widgets
  • Deep OS integration
  • Performance-critical graphics
vs
๐Ÿ“ฆ
Product Reasons to Stay Native

Wrong timing

  • Still finding product-market fit
  • Have a team (2 native devs = fine)
  • iOS-only market (enterprise)
  • No Android demand signal
The Situation

GitaWisdom is a content app with standard UI. There's no reason it needs to be platform-specific. The decision was clear once the right question was asked.

Key Lessons

๐Ÿ”ง
Engineering Takeaway

Framework choice is a force multiplier

The right framework decision echoes forever. One codebase vs two is not 2x difference - it's the difference between sustainable and exhausting.

vs
๐Ÿ“ฆ
Product Takeaway

Reach beats perfection

A Flutter app on both platforms reaches more users than a "perfect" native app on one. The question isn't "how much was invested?" It's "what does the future require?"

The Moment That Made It Worth It

Three weeks into the rewrite, a wall was hit. Flutter's widget tree made no sense. Hot reload kept crashing. SwiftUI's declarative syntax that had finally been understood was missed.

A text was sent to a developer friend: "I think I made a huge mistake."

He replied: "Probably. But you're 3 weeks in. Might as well see it through."

Not exactly inspirational. But he was right. The emotional cost of starting over had already been paid. Quitting now meant having neither a working iOS app nor a Flutter app.

Week 4, something clicked. Flutter's composition model started making sense. By week 5, progress was faster than it ever had been in SwiftUI. Week 6, submissions were made to both app stores.

The moment that made everything worth it came a month after launch. The analytics showed: iOS downloads and Android downloads were nearly equal. 50/50 split.

Every feature built now reaches twice as many users with the same effort. Every bug fix. Every improvement. That's not a one-time win - it compounds forever.

Was the rewrite scary? Yes. Were there doubts? Constantly. Would it be done again?

In a heartbeat.

The sunk cost fallacy is powerful. Months had been spent on the iOS app and it was hard to walk away from. But this wasn't walking away - it was moving forward. Sometimes the best decision is to start over with everything learned.

* * *

Next: Once the Flutter app was ready, it needed approval. That took 6 rejections and was nearly a breaking point . And for the full origin story: how GitaWisdom came to be.

H

Hub4Apps

Building cross-platform apps with Flutter. The rewrite doubled reach without doubling work. Sometimes the best decision is to start over with what has been learned.

Related Insights

MVP means actually minimum

First GitaWisdom had 100 hardcoded scenarios. Users didn't care about the backend.

MVP Strategy

Users want answers, not options

Settings screens are admission of uncertainty. Pick defaults that work for 80%.

UX Design

Try GitaWisdom

The Flutter app that doubled the reach. Now available on iOS and Android.

App Store Learn More