Vol. XVI · 16 years of native mobileCharlottesville, Virginia

Vivienne Fosh

Founder and engineer at LanternApps

Work

Platforms that shipped, and what they changed.

Platforms I built for other teams, most recent first: what was at stake, what I did, and the outcome where it was measured. I led mobile teams from 2014, up to VP of Engineering, then went back to hands-on staff work on purpose, to go deep on Kotlin Multiplatform and build engineering.

Ascendion

Zero to production in 3 months for Charter Communications’ Kotlin platform.

A legacy Android app, built by more than 70 engineers, had to be replaced by one Kotlin codebase that delivers Android and a web companion, for field technicians across the country to use every day. The web target ran on a toolchain so new that some of its problems had no public answers.

What I did

  • Architected the shared Kotlin platform that delivers the Android app and its web companion from one codebase.
  • Defined the org-wide MVI standard with explicit State/Event/Effect contracts. I couldn’t sit in every review across those time zones, so I made the standard the easy path: ADRs that explain the why, reference implementations to copy, and review rules that make a violation a fact, not a taste.
  • Co-built the Gradle convention-plugin hierarchy. A new feature module gets its whole setup (KMP targets, Compose, DI, coverage, lint) from one plugin ID, with the configuration cache on.
  • Shipped one of the first enterprise production Kotlin/Wasm web apps through blockers nobody had solved publicly: an async SQLDelight driver for browser web workers, patched webpack loaders, Datadog observability through JS interop, and CVE fixes in the Kotlin/JS toolchain.

Outcome

  • First production release in 3 months; the web app 2 months later.
  • Used daily by field technicians nationwide.
  • Bi-weekly releases with automated quality gates on every merge. Web ships via Helm to Kubernetes; Android ships to Google Play and managed corporate devices.
  • Scope delivered on schedule. The standard held after I rolled off.

Swiftly

Build waits of up to half a day became 15 minutes, never queuing.

Every build ran well over an hour on four on-prem Mac Studios. When several retailers released on the same day, builds stacked and the last one waited up to half a day. Nobody owned the problem, so I took it.

What I did

  • Wrote the self-hosted-versus-cloud cost analysis. Then I built the Bitrise MVP on my own initiative, proved it in a head-to-head test (it beat my own projections), and drove the enterprise contract to signature.
  • Re-platformed CI for 40+ repos twice, migrating every secret, pipeline and script, and collapsed 30 pipelines into one self-service system.
  • Co-created the app factory that generates complete Android and iOS retailer apps from templates. Wrote the Gradle codegen plugin that keeps every screen on one pattern. Shipped the whole shared platform to iOS as one Swift-native framework (SKIE).

Outcome

  • 15-minute builds, fully parallel, never queuing. Several releases on the same day became routine.
  • Roughly 50 engineer-hours of build waiting gone every day: six engineers’ worth of capacity.
  • Direct CI spend down $50K a year.
  • ~25 white-label grocery apps in the App Store and Play Store, with 40% less platform-specific code.

Luxoft (DXC Technology)

A stalled, safety-critical United Airlines release, shipped in two months.

The release was already late, in a safety-critical domain. The build was the bottleneck, and the architecture made every change risky.

What I did

  • Spent the first week mapping the blockers, not changing code.
  • Modularized the codebase and moved it from MVC to unidirectional data flow one screen at a time, not as a big-bang rewrite.
  • Rebuilt networking as a type-safe async/await layer with actor isolation and Sendable types, and led shared-code adoption across iOS and Android.

Outcome

  • Shipped in 2 months.
  • Build times cut by 75%.
  • Zero regressions from the architecture migration, and zero data races under strict concurrency.
  • The team kept the patterns after I rolled off.

LIQUIDSports

iOS shipped from zero in 6 months; promoted from architect to VP.

What I did

  • Founded the iOS platform and led architecture, hiring and releases across iOS, the back end and the shared Kotlin layer.
  • Built a vertical video feed with prefetch (AVQueuePlayer), server-driven UI and Core Bluetooth hardware pairing, with WCAG 2.1 AA through every core flow.
  • Bet on Kotlin Multiplatform in its 2021 alpha. I shared the risky part first (data models and C/C++ video decoding) and kept the boundary thin, so breaking changes stayed contained.

Outcome

  • iOS shipped in 6 months, with the shared Kotlin layer in production years before KMP went mainstream.

PlayWithStakes

UIKit to SwiftUI with no release disruption, before the company’s acquisition by Napster.

A UIKit app on an aggressive release schedule, with no room for a big-bang rewrite.

What I did

  • Migrated UIKit to SwiftUI screen by screen, behind stable interfaces.
  • Solved the hard part, navigation: a queue-based system that handles any number of sequential full-screen views without corrupting state.
  • Open-sourced it as SwiftUI-Flows, a type-safe navigation library used in production.

Outcome

  • No release disruption through the whole migration.
  • The rewrite preceded the company’s acquisition by Napster in April 2024.
  • SwiftUI-Flows is public: the code, not a description of it.

Shopmonkey

One of the first production SwiftUI apps: in the App Store, December 2019.

What I did

  • Shipped SwiftUI to the App Store six months after the framework launched, on unidirectional data flow with Combine and RxSwift.
  • Profiled with Instruments and cut view-hierarchy depth and redundant redraws to hit scroll-performance targets.
  • Built a type-safe API response parser shared between web and mobile. Led code reviews and ran internal talks on reactive programming.

Outcome

  • In production in December 2019, with scroll-performance targets met.

Basket

Objective-C to Swift through three breaking Swift versions, without interrupting a release.

What I did

  • Moved the codebase from Objective-C to Swift across Swift 1.0, 2.0 and 3.0, while supporting iOS 6 through 12 in production.
  • Grew the native team from 8 to 12. I paired each new hire with a migration area so they learned the language on real code, then led ReactiveCocoa to RxSwift the same way.
  • Built the cross-retailer pricing engine, interactive map routes and multi-store synchronized shopping lists.

Outcome

  • Three breaking language versions absorbed with zero release disruption.
  • Four engineers who joined mid-migration became owners of the areas they migrated.

Mamba

10M+ installs at 99% crash-free, when one memory slip crashed the app for millions.

What I did

  • Redesigned the app’s architecture and memory use, then migrated the whole project to ARC.
  • Built a server-driven UI form-builder before server-driven UI was an industry pattern.
  • Got photo feeds to 60 fps with image caching and asynchronous layout.

Outcome

  • 10M+ installs at 99% crash-free.

Earlier

Ciklum
I led a hybrid iOS and Android team from 3 to 12 on enterprise retail, medicine and security projects, writing Swift from its first beta in 2014. The project spun out as Basket, and I moved with it as Head of Mobile.
SoftTechnics · Intersog · Hostopia
Java back ends, then mobile in its first years: Android, iOS, and Windows Phone from launch day.

Open source and side work

SwiftUI-Flows
Type-safe, queue-based navigation for SwiftUI. Open source, used in production at PlayWithStakes.
bsharp-cville.com
A production Compose/Wasm site for a local business, live since July 2025: an SEO shell around a canvas-rendered app, images cut from 67 MB to 2.8 MB, and Stripe checkout.