Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView 0.1.0-preview.11.26317.2

Prefix Reserved
This is a prerelease version of Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView.
dotnet add package Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView --version 0.1.0-preview.11.26317.2
                    
NuGet\Install-Package Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView -Version 0.1.0-preview.11.26317.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView" Version="0.1.0-preview.11.26317.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView" Version="0.1.0-preview.11.26317.2" />
                    
Directory.Packages.props
<PackageReference Include="Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView --version 0.1.0-preview.11.26317.2
                    
#r "nuget: Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView, 0.1.0-preview.11.26317.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView@0.1.0-preview.11.26317.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView&version=0.1.0-preview.11.26317.2&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView&version=0.1.0-preview.11.26317.2&prerelease
                    
Install as a Cake Tool

Microsoft.Maui.Platforms.Linux.Gtk4

A .NET MAUI backend for Linux, powered by GTK4. Run your .NET MAUI applications natively on Linux desktops with GTK4 rendering via GirCore bindings.

Status: Early / experimental — contributions and feedback are welcome!

https://github.com/user-attachments/assets/70f2a910-94b3-437c-945a-6b71223c5cd3

Screenshots

<table> <tr> <td><img src="docs/screenshots/home.png" alt="Home" width="400"/><br/><b>Home & Sidebar Navigation</b></td> <td><img src="docs/screenshots/controls.png" alt="Controls" width="400"/><br/><b>Interactive Controls</b></td> </tr> <tr> <td><img src="docs/screenshots/collectionview.png" alt="CollectionView" width="400"/><br/><b>CollectionView (Virtualized)</b></td> <td><img src="docs/screenshots/fontawesome.png" alt="FontAwesome Icons" width="400"/><br/><b>FontAwesome Icons</b></td> </tr> <tr> <td><img src="docs/screenshots/shapes.png" alt="Shapes" width="400"/><br/><b>Shapes & Graphics</b></td> <td><img src="docs/screenshots/layouts.png" alt="Layouts" width="400"/><br/><b>Layouts</b></td> </tr> <tr> <td><img src="docs/screenshots/controltemplate.png" alt="ControlTemplate" width="400"/><br/><b>ControlTemplate & ContentPresenter</b></td> <td><img src="docs/screenshots/pickers.png" alt="Pickers" width="400"/><br/><b>Pickers & Search</b></td> </tr> <tr> <td><img src="docs/screenshots/formattedtext.png" alt="FormattedText" width="400"/><br/><b>FormattedText & Spans</b></td> <td><img src="docs/screenshots/transforms.png" alt="Transforms" width="400"/><br/><b>Transforms & Effects</b></td> </tr> <tr> <td colspan="2"><img src="docs/screenshots/graphics.png" alt="Graphics" width="400"/><br/><b>GraphicsView (Cairo)</b></td> </tr> </table>

Features

Controls and handlers

Category Controls
Basic Controls Label, Button, Entry, Editor, CheckBox, Switch, Slider, Stepper, ProgressBar, ActivityIndicator, Image, ImageButton, BoxView, RadioButton
Input & Selection Picker, DatePicker, TimePicker, SearchBar
Collections CollectionView (virtualized Gtk.ListView), ListView, TableView, CarouselView, SwipeView, RefreshView, IndicatorView
Layouts StackLayout, Grid, FlexLayout, AbsoluteLayout, ScrollView, ContentView, Border, Frame
Pages & Navigation ContentPage, NavigationPage, TabbedPage, FlyoutPage, Shell (flyout, tabs, route navigation)
Shapes Rectangle, Ellipse, Line, Path, Polygon, Polyline — Cairo-rendered with fill, stroke, dash patterns
Other GraphicsView (Cairo), WebView (WebKitGTK)

Layout architecture: StackLayout, Grid, FlexLayout, and AbsoluteLayout all share a single LayoutHandler — the MAUI Layout base class is mapped once, and all concrete layout types resolve through it.

Platform Features

  • Native GTK4 rendering — Every control maps to a real GTK4 widget, styled via GTK CSS.
  • Blazor Hybrid — Host Blazor components inside a native GTK window via WebKitGTK.
  • Gestures — Tap, Pan, Swipe, Pinch, and Pointer gesture recognizers via GTK4 event controllers.
  • AnimationsTranslateTo, FadeTo, ScaleTo, RotateTo via GtkPlatformTicker + Gsk.Transform at ~60fps.
  • Transforms — TranslationX/Y, Rotation, Scale via Gsk.Transform; Shadow (CSS box-shadow), Clip, ZIndex.
  • VisualStateManager — Normal, PointerOver, Pressed, Disabled, Focused states via GTK4 event controllers.
  • ControlTemplate — Full ContentPresenter and TemplatedView support via IContentView handler mapping.
  • Font icons — Embedded font registration with fontconfig/Pango, FontImageSource rendering via Cairo. FontAwesome and custom icon fonts work out of the box.
  • FormattedText — Rich text via Pango markup: Span colors, fonts, sizes, bold/italic, underline/strikethrough, character spacing.
  • Alerts & DialogsDisplayAlert, DisplayActionSheet, DisplayPromptAsync via native GTK4 modal windows.
  • Modal PagesPushModalAsync presents pages as native GTK4 dialog windows by default, with attached properties for custom sizing, content-fit sizing, and inline (legacy) presentation via GtkPage.
  • Brushes & Gradients — SolidColorBrush, LinearGradientBrush, RadialGradientBrush via CSS gradients.
  • MenuBarMenuBarItem / MenuFlyoutItem via Gtk.PopoverMenuBar, integrated into Window and NavigationPage handlers via GtkMenuBarManager (not a standalone handler).
  • Tooltips & Context MenusToolTipProperties.Text and ContextFlyout via Gtk.PopoverMenu.
  • Theming — Automatic light/dark theme detection via GtkThemeManager.
  • Lifecycle EventsConfigureLifecycleEvents().AddGtk() hooks for OnWindowCreated and OnMauiApplicationCreated.
  • Desktop integration — App icons via hicolor icon theme, .desktop file generation, MauiImage/MauiFont/MauiAsset resource processing.

Essentials (21 of 36 services)

Status Services
Done (21) AppInfo, AppActions, Battery (UPower), Browser (xdg-open), Clipboard (Gdk.Clipboard), Connectivity (NetworkManager), DeviceDisplay, DeviceInfo, Email (xdg-open mailto:), FilePicker (Gtk.FileDialog), FileSystem (XDG dirs), Launcher, Map, MediaPicker, Preferences (JSON), Screenshot, SecureStorage, SemanticScreenReader (AT-SPI), Share (XDG Portal), TextToSpeech (espeak-ng), VersionTracking
⚠️ Partial (2) Geolocation (GeoClue — basic location only), WebAuthenticator (basic OAuth via system browser)
Stub (13) Accelerometer, Barometer, Compass, Contacts, Flashlight, Geocoding, Gyroscope, HapticFeedback, Magnetometer, OrientationSensor, PhoneDialer, SMS, Vibration — sensors and phone-specific APIs not applicable to desktop Linux

Implementation Parity

Category Coverage Notes
Core Infrastructure 100% Dispatcher, handler factory, rendering pipeline
Pages 100% ContentPage, NavigationPage, TabbedPage, FlyoutPage, Shell
Layouts 100% All layout types including FlexLayout and AbsoluteLayout
Basic Controls 100% All 14 standard controls
Input Controls 100% Picker, DatePicker, TimePicker, SearchBar
Collection Controls 100% Virtualized CollectionView, ListView, TableView, CarouselView, SwipeView
Navigation & Routing 100% Push/pop, Shell routes, query parameters
Alerts & Dialogs 100% All three dialog types + native modal dialog windows
Gesture Recognizers 100% All 5 gesture types
Graphics & Shapes 100% GraphicsView + all 6 shape types
Font Management 100% Registrar, manager, FontImageSource, named sizes
WebView 100% URL, HTML, JavaScript, navigation events
Animations 100% All animation types via GtkPlatformTicker
VisualStateManager 100% All visual states + triggers + behaviors
ControlTemplate 100% ContentPresenter, TemplatedView
Base View Properties 100% Opacity, visibility, transforms, shadow, clip, automation
FormattedText 100% All Span properties via Pango markup
MenuBar 100% MenuBarItem, MenuFlyoutItem, popover menus — integrated into Window and NavigationPage handlers
Essentials 64% 21 done + 2 partial of 36 total; 13 stubs (sensors/phone N/A on desktop)

Prerequisites

Requirement Version
.NET SDK 10.0+
GTK 4 libraries 4.x (system package)
WebKitGTK (Blazor only) 6.x (system package)

Install GTK4 & WebKitGTK (Debian / Ubuntu)

sudo apt install libgtk-4-dev libwebkitgtk-6.0-dev \
  gobject-introspection libgirepository1.0-dev \
  gir1.2-gtk-4.0 gir1.2-webkit-6.0 pkg-config

Install GTK4 & WebKitGTK (Fedora)

Note: Fedora package names below are unverified. Please open an issue if they need correction.

sudo dnf install gtk4-devel webkitgtk6.0-devel \
  gobject-introspection-devel pkg-config

On Fedora versions where these package names apply, gtk4-devel and webkitgtk6.0-devel typically include the GObject Introspection typelibs, so separate gir1.2-* packages are usually not needed.

Quick Start

# Install the template
dotnet new install Microsoft.Maui.Platforms.Linux.Gtk4.Templates --prerelease

# Create a new Linux MAUI app
dotnet new maui-linux-gtk4 -n MyApp.Linux
cd MyApp.Linux
dotnet run

Option 2: Add to an existing project manually

Add the NuGet package:

dotnet add package Microsoft.Maui.Platforms.Linux.Gtk4 --prerelease
dotnet add package Microsoft.Maui.Platforms.Linux.Gtk4.Essentials --prerelease   # optional

Then set up your entry point:

Program.cs

using Microsoft.Maui.Platforms.Linux.Gtk4.Platform;
using Microsoft.Maui.Hosting;

public class Program : GtkMauiApplication
{
    protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

    public static void Main(string[] args)
    {
        var app = new Program();
        app.Run(args);
    }
}

MauiProgram.cs

using Microsoft.Maui.Platforms.Linux.Gtk4.Hosting;
using Microsoft.Maui.Hosting;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp
            .CreateBuilder()
            .UseMauiAppLinuxGtk4<App>();

        return builder.Build();
    }
}

XAML Support

Microsoft.Maui.Platforms.Linux.Gtk4 relies on MAUI's normal transitive build assets for XAML. In Linux head projects, *.xaml files are still collected as MauiXaml and compiled by MAUI's XAML build pipeline without extra package-specific overrides.

Resource Item Support

Linux head projects can use MAUI resource item groups for common Resources/* paths:

  • MauiImage from Resources/Images/**
  • MauiFont from Resources/Fonts/**
  • MauiAsset from Resources/Raw/** (with LogicalName defaulting to %(RecursiveDir)%(Filename)%(Extension))
  • MauiIcon from explicit items, or default Resources/AppIcon/appicon.{svg|png|ico}

These are copied into build/publish output so image/file lookups can resolve at runtime. When MauiIcon is present, Linux builds emit hicolor icon-theme files in output and runtime sets the GTK window default icon name from that icon.

Adding Linux to a Multi-Targeted MAUI App

Since there is no official -linux TFM (Target Framework Moniker) from Microsoft, MAUI projects can't conditionally include the Linux backend via TargetFrameworks the way they do for Android/iOS/Windows. Instead, use the "Linux head project" pattern:

MyApp/                              ← Your existing multi-targeted MAUI project
├── MyApp.csproj                       (net10.0-android;net10.0-ios;...)
├── App.cs
├── MainPage.xaml
├── ViewModels/
├── Services/
└── Platforms/
    ├── Android/
    ├── iOS/
    └── ...

MyApp.Linux/                        ← New Linux-specific project
├── MyApp.Linux.csproj                 (net10.0, references Microsoft.Maui.Platforms.Linux.Gtk4)
├── Program.cs                         (GtkMauiApplication entry point)
└── MauiProgram.cs                     (builder.UseMauiAppLinuxGtk4<App>())

Setup

  1. Create the Linux head project next to your MAUI project:
dotnet new maui-linux-gtk4 -n MyApp.Linux
  1. Reference your shared code — add a project reference from MyApp.Linux.csproj to your MAUI project (or a shared class library):

<ItemGroup>
  <ProjectReference Include="../MyApp/MyApp.csproj" />
</ItemGroup>
  1. Run on Linux:
dotnet run --project MyApp.Linux

Why a separate project?

The platform-specific TFMs (net10.0-android, net10.0-ios, etc.) are powered by .NET workloads that Microsoft ships. Creating a custom net10.0-linux TFM would require building and distributing a full .NET workload — complex infrastructure that's unnecessary for most use cases.

The separate project approach works with standard dotnet build/dotnet run, is NuGet-distributable, and keeps your existing MAUI project unchanged.

DevFlow Integration

The GTK4 backend supports DevFlow for AI-assisted UI inspection, automation, and debugging, including the Blazor CDP bridge. To enable it, set EnableMauiDevFlow=true in Directory.Build.props (or pass it as an MSBuild property):


<PropertyGroup>
  <EnableMauiDevFlow>true</EnableMauiDevFlow>
</PropertyGroup>

When enabled, the sample project (samples/Linux.Gtk4.Sample) conditionally references the DevFlow agent and Blazor projects:

<ItemGroup Condition="'$(EnableMauiDevFlow)' == 'true'">
  <ProjectReference Include="..\..\..\..\src\DevFlow\Microsoft.Maui.DevFlow.Agent.Gtk\Microsoft.Maui.DevFlow.Agent.Gtk.csproj" />
  <ProjectReference Include="..\..\..\..\src\DevFlow\Microsoft.Maui.DevFlow.Blazor.Gtk\Microsoft.Maui.DevFlow.Blazor.Gtk.csproj" />
</ItemGroup>

Building from Source

git clone https://github.com/dotnet/maui-labs.git
cd maui-labs/platforms/Linux.Gtk4
dotnet restore
dotnet build

Run the sample app

# Sample app (includes native controls, Blazor Hybrid, essentials, and more)
dotnet run --project samples/Linux.Gtk4.Sample

Project Structure

Linux.Gtk4.slnx                                            # Platform-local solution file
├── src/
│   ├── Linux.Gtk4/                                         # Core MAUI backend
│   │   ├── Handlers/                     # GTK4 handler implementations
│   │   ├── Hosting/                      # AppHostBuilderExtensions (UseMauiAppLinuxGtk4)
│   │   └── Platform/                     # GTK application, context, layout, theming
│   ├── Linux.Gtk4.Essentials/                             # MAUI Essentials for Linux (clipboard, etc.)
│   └── Linux.Gtk4.BlazorWebView/                          # BlazorWebView support via WebKitGTK
├── samples/
│   └── Linux.Gtk4.Sample/                                 # Sample app (controls, Blazor, essentials)
├── templates/                            # dotnet new templates
└── docs/                                 # Documentation

NuGet Packages

Package Purpose
Microsoft.Maui.Platforms.Linux.Gtk4 Core GTK4 backend — handlers, hosting, platform services
Microsoft.Maui.Platforms.Linux.Gtk4.Essentials MAUI Essentials (clipboard, preferences, device info, etc.)
Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView Blazor Hybrid support via WebKitGTK
Microsoft.Maui.Platforms.Linux.Gtk4.Templates dotnet new project templates

Key Dependencies

Package Purpose
GirCore.Gtk-4.0 GObject introspection bindings for GTK4
GirCore.WebKit-6.0 WebKitGTK bindings (Blazor support)
Microsoft.Maui.Controls .NET MAUI framework
Tmds.DBus.Protocol D-Bus client for Linux platform services

License

This project is licensed under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Microsoft.Maui.Platforms.Linux.Gtk4.BlazorWebView:

Repository Stars
Redth/MAUI.Sherpa
Let MAUI Sherpa guide you through all your .NET MAUI dev environment needs!
Version Downloads Last Updated
0.1.0-preview.11.26317.2 38 6/17/2026
0.1.0-preview.10.26274.3 83 5/24/2026
0.1.0-preview.9.26258.5 95 5/11/2026
0.1.0-preview.8.26256.5 58 5/6/2026
0.1.0-preview.7.26229.11 62 4/29/2026
0.1.0-preview.6.26229.7 61 4/29/2026