Flutter Migration · at ANNA Money

Move one surface. Keep the product shipping.

A production add-to-app migration that embedded Flutter chat, accounting and tax experiences without replacing mature native accounting capabilities.

FlutterNative AndroidPigeonMigration strategy
Flutter add-to-app product visual
SpecialtyFlutter Migration
Formal role or capacityContractor · offer title: Android Developer
Personal scopeFlutter transition proposal, workshops, chat core, platform patterns, and native integration
SystemPigeon · FlutterEngineGroup · feature flags

A migration problem, not a greenfield Flutter app.

The product needed to move selected surfaces without duplicating mature accounting capabilities or freezing delivery.

Constraint

A rewrite would expand risk

A wholesale replacement would duplicate authentication, navigation and platform behaviour while delaying product work.

Target

A controlled host boundary

Flutter needed to own selected features while Android remained authoritative for platform and accounting services.

The contribution sits at the platform boundary.

Earlier experiments predated this work. The defensible scope is the later production integration and migration mechanism.

I OWNED

Production integration

  • Interop and routing
  • Engine and lifecycle handling
  • Feature switching
  • Flutter chat integration
NATIVE HOST

Platform authority

  • Authenticated requests
  • Files and analytics
  • Native-only actions
  • Accounting and security capabilities
FLUTTER MODULE

Selected experiences

  • Chat and BDUI
  • Accounting and tax
  • Bookkeeping and invoicing
  • Flutter-specific presentation

Explicit APIs connect two independently owned runtimes.

The architecture preserves native guarantees while letting Flutter features evolve behind a stable host contract.

ANDROID HOST

Route and lifecycle

Creates engines and screens, owns services, and remains the containing application.

→
PIGEON BOUNDARY

Generated host contract

Requests, navigation, lifecycle and actions cross a typed interoperability layer.

→
FLUTTER MODULE

Feature delivery

Owns selected UI and state, then calls the host at platform boundaries.

Progressive by construction.

Each decision reduces migration coupling and preserves a rollback path.

01

Package Flutter as add-to-app

Use an embeddable production module instead of creating a separate replacement application.

02

Centralise engine lifecycle

Use FlutterEngineGroup and one host integration layer rather than letting screens create ad hoc engines.

03

Keep native services native

Delegate authentication, files, analytics and native actions instead of duplicating platform behaviour.

04

Roll out behind feature flags

Move one surface at a time and retain native fallback paths.

05

Allow evolutionary state models

Bloc and MobX coexist; chat uses an explicit intent/state/effect model.

Public product surfaces, private-source architecture.

Public store visuals establish the accounting and tax domain; the technical narrative stays within NDA boundaries.

A migration mechanism adopted beyond its core.

The team migrated chat to Flutter and launched a closed test. Other engineers then delivered additional Flutter features using the established platform patterns.

PRESERVED

Native ownership of accounting, security, routing and platform services.

ENABLED

Independent Flutter delivery for chat, accounting and tax experiences.

BOUNDARY

Android integration and host responsibilities are described without claiming unverified iOS implementation details.

Evidence & NDA boundaryThis case uses approved public visuals and a sanitised technical narrative. Private source, endpoints, credentials, configuration, customer data, and proprietary schemas are excluded.

Explore a role or project

Target role · Staff Mobile Engineer (Android + Flutter)
Worldwide remote · English / Russian
Novi Sad, Serbia · hybrid possible