MAUI Native to Blazor Hybrid — Migration Estimate

Updated: 2026-08-08 · Audited: 2026-06-26 · Analysis date: 2026-03-12

Historical LOE analysis — kept for the record, not for planning. This is the pre-decision level-of-effort analysis dated 2026-03-12; the Blazor Hybrid decision resolved 2026-06-08 and the migration has since been executed — ~55 Razor pages exist under ALPAMobile.Presentation/Components/Pages/, including LoginPage and the Jumpseat suite. The estimates, codebase measurements, and tier assignments below describe the codebase as of 2026-03-12. The live state of the UI is the ALPAMobile.Presentation project.
Status: Planning / Analysis — Decision resolved 2026-06-08: proceeding with Blazor Hybrid straggler migration

Codebase Profile

This is an upper-moderate / borderline large enterprise application.

DimensionMeasurement
Screens/Pages52 XAML pages + 7 custom controls = 59 UI elements
ViewModels69 files, ~15,000–20,000 LOC
Services17 files, ~8,000–10,000 LOC
Business Logic4 files (regulatory FTDT calculations)
Data Models40+ model files, 3 databases (LiteDB)
Helpers14 files, ~2,000–3,000 LOC
Platform-specific18 files across Android/iOS
DI Registrations~60+ singletons/transients
Shell Routes47 registered routes
Total estimated LOC30,000–40,000
Converters6

Migration Approach

The recommended approach is a straggler migration: keep the MAUI app shell and native integrations, then progressively replace XAML pages and view logic with Razor components hosted inside BlazorWebView.

Guiding Principles

  1. MAUI stays the host. Platform projects, startup, lifecycle, permissions, and packaging remain unchanged initially.
  2. Extract logic into services first. Business logic must move out of ViewModels and code-behind before UI is replaceable.
  3. Introduce BlazorWebView beside existing XAML. Mixed app during the transition.
  4. Keep native capabilities behind service abstractions. Razor components call injected interfaces; MAUI provides implementations.
  5. Replace MVVM bindings with component state. Component parameters, injected services, event handlers, and shared state containers replace bindings, converters, and commands.
  6. Two-layer navigation during transition. MAUI Shell for app-level routing; Blazor routing inside hybrid sections.
  7. Redesign at the component level. Preserve branding and UX intent, rebuild layout in HTML/CSS.

Complexity Factors

Authentication — Very High

Jumpseat Flight Search — High

FTDT (Flight/Duty Time) — High

Document Center — Medium-High

Phase Breakdown

Phase 0: Prerequisites

ItemComplexityEffort
Extract logic from ViewModels into servicesFoundational3–4 weeks
Fix .NET 10 blockers (AB#1809 StackLayout, bugs)In-progress2–3 weeks
Set up BlazorWebView infrastructureLow1 week

Phase 1: Simple Screens

ItemPagesComplexityEffort
Settings, Profile, Card pages~6Low1–2 weeks
Contact/Directory pages~4Low1 week
Member Resources, Advocacy~3Low-Med1 week
Info/content pages (etiquette, emergency)~5Low1 week

Phase 2: List/Detail Screens

ItemPagesComplexityEffort
Document Center (list, detail, PDF)4Med-High2 weeks
Pilot Group pages6Medium1.5 weeks
Push Notification list/settings2Medium1 week
KCM pages (airlines, airports, details)4Medium1.5 weeks

Phase 3: Complex Screens

ItemPagesComplexityEffort
Jumpseat Flight Search suite8Very High3–4 weeks
FTDT duty period suite6High2–3 weeks
Home page (dashboard, drag-drop)1High1–2 weeks

Phase 4: Auth and Native (Stay MAUI)

ItemComplexityEffort
Login page / AutoLogin WebViewVery HighKeep native + wrap
Auth service abstraction for BlazorHigh2 weeks
Navigation dual-routing designMedium1–2 weeks

Phase 5: Cross-cutting

ItemComplexityEffort
Styling/CSS design systemMedium2–3 weeks
Testing (Blazor component tests)Medium2–3 weeks
Integration testing, regression, polishMedium2–3 weeks

Total LOE Estimate

ScenarioEffortAssumptions
Straggler migration (recommended)7–10 person-monthsKeep native shell, migrate UI progressively, auth stays native
Aggressive migration (all UI to Blazor)9–13 person-monthsEverything to Razor except auth, push, platform integrations
Conservative (only simple screens)4–5 person-monthsMigrate ~20 simple pages, keep complex screens native
Team SizeDuration
1 senior developer8–12 months
2 developers (1 senior + 1 mid)4–6 months
3 developers3–4 months

What Stays Native (Should Not Migrate)

Key Traps Specific to This Codebase

  1. Service Locator anti-pattern — heavy use of Shell.Current?.Handler?.MauiContext?.Services.GetService<T>() needs refactoring before Blazor components can consume services.
  2. WeakReferenceMessenger coupling — Blazor components need a different state notification pattern (cascading parameters, shared state containers).
  3. Custom ObservableRangeCollection — all list-binding logic assumes MAUI collection change notifications. Blazor uses StateHasChanged() instead.
  4. AutoLogin JS bridge — current Android [JavascriptInterface] and iOS WKScriptMessageHandler patterns break inside BlazorWebView.
  5. StackLayout deprecation (AB#1809, 1,042 warnings) — irrelevant for migrated pages, but any page staying native still needs them fixed.

Summary

Bottom line: ~7–10 person-months for the recommended straggler migration path. This maps to the upper-moderate / borderline large range (6–9 months), pushed higher by auth complexity, regulatory logic, and screen count (59 vs the typical 10–25 moderate benchmark). The effort is roughly 50–65% of original build cost given the broad UI migration scope and service extraction work.

The practical model is: native shell + hybrid UI + shared services — not a hard switch from MAUI to Blazor.