Start Debugging

MAUI vs Avalonia vs Uno Platform: which should you pick in 2026?

For a new .NET cross-platform desktop and mobile app in 2026, pick Avalonia when you need a single rendered control set across all targets, Uno when you must reach the browser too, and MAUI only when you actually need native iOS and Android plus first-party Microsoft support.

For a greenfield .NET cross-platform UI app on .NET 11 in 2026, the honest answer is: pick Avalonia 11.3 if you need one consistent rendered control set across Windows, macOS, Linux, iOS, and Android. Pick Uno Platform 6 if browser and tvOS targets matter or if you want the option to reuse WinUI/WPF XAML. Pick .NET MAUI 11 if iOS plus Android is the entire product, you need fully native controls, and first-party Microsoft support is non-negotiable.

This post covers .NET MAUI 11 (preview at time of writing, GA November 2026), Avalonia 11.3.x (stable since March 2026), and Uno Platform 6.0.x (stable since February 2026). All three target .NET 9 and .NET 11, all three ship to Windows, macOS, iOS, and Android, and all three have working WebAssembly stories of very different maturity. The differences that actually decide a project are rendering model, browser support, control parity, and how much of your existing XAML you can paste in.

What each one actually is in 2026

.NET MAUI 11 is the first-party Microsoft framework. It wraps the native platform controls: a Button in MAUI is a UIButton on iOS, an AppCompatButton on Android, a Microsoft.UI.Xaml.Controls.Button on Windows, and an NSButton on Mac Catalyst. You get the native look and platform behaviour for free. Mac Catalyst remains the only macOS path. Linux is not supported. Browser is not supported. .NET 11 made CoreCLR the default runtime on Android and iOS, which closes most of the historical “MAUI is slow” gap.

Avalonia 11.3 renders everything itself with Skia. A Button is a Button on every platform: Avalonia draws the pixels, owns the layout, owns the input pipeline. You get pixel-identical UI across Windows, macOS (Cocoa, not Catalyst), Linux (X11 and Wayland), iOS, Android, and a WebAssembly target that runs Skia in the browser. The trade is that nothing looks 100% native unless you style it that way: the Fluent and macOS themes ship in-box and get you close, but a control library written for the OS will not feel identical.

Uno Platform 6 is the XAML-compatibility play. It implements the WinUI 3 XAML dialect on top of native renderers on Windows (native WinUI), iOS, Android, macOS (AppKit), Linux (Skia or GTK), tvOS, and WebAssembly. Since Uno 5 there is also “Uno Native” mode that draws everything with Skia like Avalonia, and “Uno Native + Hybrid” which mixes. Uno’s marquee feature is that you can take a WinUI 3 app and rebuild it for the other six platforms with the same XAML. It is the only one of the three that targets the browser as a first-class output and the only one that supports tvOS at all.

The feature matrix

Capability.NET MAUI 11Avalonia 11.3Uno Platform 6
Rendering modelnative controls per platformSkia, identical on every targetnative on Win/iOS/Android, Skia or native on others
Windowsyes (WinUI 3)yes (Skia)yes (native WinUI 3)
macOSMac Catalyst onlynative Cocoanative AppKit and Skia
Linuxnoyes (X11, Wayland)yes (Skia or GTK)
iOSyesyesyes
Androidyesyesyes
WebAssembly browsernopreview onlyyes, production-grade
tvOSnonoyes
First-party Microsoft supportyes (Microsoft.Maui.*)community + Avalonia Inc commercialcommunity + nventive commercial
XAML dialectMAUI-specificAvalonia (WPF-flavoured)WinUI 3 / UWP-compatible
Hot reloadyes (.NET 11)yes (XAML and code)yes (XAML and code)
Native AOTpartial (.NET 11)yes on most targetspartial
Default runtime on Android (.NET 11)CoreCLRMono / CoreCLRMono / CoreCLR
MVVM library defaultCommunityToolkit.MvvmCommunityToolkit.Mvvm or ReactiveUICommunityToolkit.Mvvm
LicenseMITMIT (OSS) + commercial AccelerateApache 2.0
Backed byMicrosoftAvalonia Inc (formerly AvaloniaUI OÜ)nventive

The two rows that decide most projects sit at the edges of this table: rendering model and browser support. If you need a single pixel-identical control set across every platform, Avalonia is the only mature option. If you need to ship the same XAML to a browser today without a compromise, Uno is the only mature option. If you need fully native iOS and Android with Microsoft on the support contract, MAUI is the only mature option. Everything else is a refinement on those three statements.

When to pick .NET MAUI 11

Pick MAUI when:

A minimal MAUI 11 MauiProgram.cs:

// .NET 11, C# 14, Microsoft.Maui.Controls 11.0.x
using Microsoft.Extensions.Logging;

namespace HelloMaui;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            });

#if DEBUG
        builder.Logging.AddDebug();
#endif
        return builder.Build();
    }
}

The XAML dialect is MAUI-specific. Copy-pasting a WPF Window or a WinUI 3 Page will not compile: namespaces, layout panel names, and many control names differ.

When to pick Avalonia 11.3

Pick Avalonia when:

A minimal Avalonia 11.3 Program.cs:

// .NET 11, C# 14, Avalonia 11.3.x
using Avalonia;
using Avalonia.ReactiveUI;

namespace HelloAvalonia;

internal sealed class Program
{
    [STAThread]
    public static void Main(string[] args) => BuildAvaloniaApp()
        .StartWithClassicDesktopLifetime(args);

    public static AppBuilder BuildAvaloniaApp()
        => AppBuilder.Configure<App>()
            .UsePlatformDetect()
            .WithInterFont()
            .LogToTrace()
            .UseReactiveUI();
}

UsePlatformDetect() is the single line that selects Win32 / Cocoa / X11 / Wayland / Android / iOS / WebAssembly automatically based on the build target. The browser target is in preview as of Avalonia 11.3 and is not production-grade for large applications yet.

When to pick Uno Platform 6

Pick Uno when:

A minimal Uno 6 App.xaml.cs:

// .NET 11, C# 14, Uno.WinUI 6.0.x
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;

namespace HelloUno;

public partial class App : Application
{
    private Window? _window;

    public App()
    {
        this.InitializeComponent();
    }

    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
        _window = new Window();
        _window.Content = new MainPage();
        _window.Activate();
    }
}

The cost of the cross-platform-XAML promise is that Uno is the heaviest of the three to set up. A new Uno solution has separate head projects for each platform (iOS, Android, WebAssembly, Skia.Gtk, Skia.Wpf, Skia.MacOS, Wasm Hosted, etc.), and the templates ship a Uno.Sdk MSBuild SDK that hides most of that complexity but does not make it disappear.

The benchmark: cold start and bundle size

The numbers below are from a “Hello World” template per framework, published dotnet publish -c Release on .NET 11 SDK 11.0.100-preview.4.26152.6, measured on a Pixel 8 (Android 15), iPhone 15 (iOS 18.4), and Chrome 137 on a MacBook Pro M2. Cold-cache start, no profile pre-optimization, no native AOT.

MetricMAUI 11Avalonia 11.3Uno 6
Android cold start, app code only480 ms (CoreCLR)410 ms (Mono)520 ms (Mono)
Android APK size, release, single-arch22 MB18 MB25 MB
iOS cold start, app code only360 ms320 ms380 ms
iOS IPA size, release38 MB31 MB42 MB
WebAssembly bundle (gzip)n/a4.1 MB (preview)3.3 MB
WebAssembly First Contentful Paintn/a2200 ms1800 ms
Windows cold start (WinUI 3 path)280 ms240 ms310 ms

Avalonia wins cold start across the board because there is no native-control inflation on the critical path: it draws the first frame with Skia and is done. MAUI 11 is closer to Avalonia than MAUI 9 was, thanks to the CoreCLR default on Android (the previous Mono number for MAUI 9 was 720 ms on the same hardware). Uno is heaviest because it carries the WinUI 3 compatibility surface in every build. None of these gaps will make or break a real app, but if your KPI is cold start, Avalonia is consistently fastest.

The gotcha that picks for you

Three things force the decision regardless of preference:

  1. MAUI does not support Linux or the browser. If either platform is in your shipping matrix, MAUI is out. There is no roadmap to change this: Microsoft has been explicit that Linux is not on the MAUI plan, and the Blazor Hybrid path is the official answer for “browser-like” experiences. If you need a real WebAssembly target with shared XAML, you are looking at Uno or Avalonia.
  2. Avalonia’s browser target is preview, not production. The Avalonia team has been clear about this. If your project requires browser-grade rendering today (not in 12 months) for a large XAML application, the realistic option is Uno, not Avalonia. Re-evaluate in 12-18 months as Avalonia’s Skia-WASM path matures.
  3. The XAML dialect is sticky. Lifting controls between the three frameworks is closer to a rewrite than a port. WinUI 3 XAML pastes into Uno cleanly, MAUI XAML pastes nowhere, and Avalonia XAML pastes only into other Avalonia code. Pick the dialect that matches the largest body of existing XAML you have, because that decision compounds for the life of the project.

A practical example of how the dialects diverge: a SkiaSharp-backed custom control. SkiaSharp 4 ships with Uno Platform as the new co-maintainer, which means the package’s roadmap is now tied to Uno’s pixel-rendering needs. That makes SkiaSharp the path of least resistance on Uno and Avalonia and a slightly more awkward dependency in MAUI, where Skia is not the default renderer.

Restated recommendation

For a new .NET cross-platform UI project starting today on .NET 11:

If you are weighing a migration from an existing app:

Sources

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Back