Inspiration

Every retirement calculator asks you for one "expected return" and a retirement age, then gives you a number that stops being true the moment your life stops being a straight line. Moving countries breaks them completely. The tax treatment of a Norwegian pension is nothing like the tax treatment of a UK one, and I couldn't find anything that would tell me what my plan looked like if I retired somewhere else. So I built the planner I wanted: one that starts as simple as those calculators and only gets deeper when your actual situation demands it.

What it does

Runway is a cross-border FIRE (Financial Independence / Retire Early) planner. The onboarding adapts to you, asking only what your situation needs, and gives you the headline number: the date you can stop working.

  • 18 country packs. 10 native-capable, 8 destination-only, each one verified against primary sources for income year 2026. "What if I retire in Portugal" gets a real answer instead of a guess.
  • The opportunity engine ranks the levers actually available to you by how many months each one pulls your date forward.
  • Bank statement import with on-device categorisation. No statement ever leaves the phone.
  • Plan history and snapshots, mirrored through iCloud, so you can watch your date move over time.
  • Lifetime tax readout, a household mode that merges two profiles, widgets, Siri and Spotlight.

How we built it

The money math lives in RunwayEngine, a headless pure-Swift package with no UI dependency at all. 902 tests, behind an eight-class model-fidelity audit series that had to fully converge before Norway was allowed to ship. The app itself is SwiftUI on iOS 26, riding a shared in-house AppCore factory that provides the design system, widgets, localisation and the paywall.

Monetisation is RevenueCat end to end. Offerings drive the paywall's pricing carousel, entitlements gate Pro. That is the reason Pro could be gated identically on the Android port without writing entitlement logic a second time.

Challenges we ran into

The tax packs are the hard part and there is no shortcut for them. All 18 got verified against primary sources for income year 2026, with dated re-check triggers written down for the figures that are known to move.

Here is the kind of bug that process catches. Sweden's schablonavdrag was widely reported as going from 40k to 50k. It was never actually enacted, so 40,000 is still correct. That is a plausible, well-sourced-looking number that would have quietly mispriced every Swedish plan in the app.

Localisation was the other slog. 4,291 keys swept for naturalness in Norwegian instead of machine-translated, which meant rewriting 350 values across 20 catalogues by hand.

Accomplishments that we're proud of

  • 175 of 175 App Store territories open at launch.
  • Zero of the six dated tax re-check triggers have fired since verification.
  • The engine ported to Kotlin cleanly, which proved keeping it UI-free was the right call.

What we learned

Keeping the money engine completely free of UI wasn't just good hygiene. It is what made a second platform tractable, and it is what made the correctness audits possible in the first place. The other lesson was that a paywall is a product surface like any other. The pricing carousel and the founding-member offer went through as many revisions as the onboarding did.

What's next for Runway

Android on Google Play, day-one iOS 27 support, and a web companion if the waitlist's "Want Android?" checkbox says there is demand for it.

Built With

  • app-intents
  • cloudkit
  • ios
  • kotlin
  • revenuecat
  • storekit
  • swift
  • swiftui
  • widgetkit
Share this project:

Updates

Submission history