MAUI Essentials implementations for Linux — clipboard, preferences, device info, connectivity, and more using GTK4, DBus, and freedesktop.org APIs.
$ dotnet add package Platform.Maui.Linux.Gtk4.EssentialsA community-driven .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
![]() Home & Sidebar Navigation | ![]() Interactive Controls |
![]() CollectionView (Virtualized) | ![]() FontAwesome Icons |
![]() Shapes & Graphics | ![]() Layouts |
![]() ControlTemplate & ContentPresenter | ![]() Pickers & Search |
![]() FormattedText & Spans | ![]() Transforms & Effects |
![]() GraphicsView (Cairo) | |
| 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), MenuBar (Gtk.PopoverMenuBar) |
TranslateTo, FadeTo, ScaleTo, RotateTo via GtkPlatformTicker + Gsk.Transform at ~60fps.Gsk.Transform; Shadow (CSS box-shadow), Clip, ZIndex.IContentView handler mapping.DisplayAlert, DisplayActionSheet, DisplayPromptAsync via native GTK4 modal windows.PushModalAsync presents pages as native GTK4 dialog windows by default, with attached properties for custom sizing, content-fit sizing, and inline (legacy) presentation via GtkPage.ToolTipProperties.Text and ContextFlyout via Gtk.PopoverMenu.GtkThemeManager.ConfigureLifecycleEvents().AddGtk() hooks for OnWindowCreated and OnMauiApplicationCreated..desktop file generation, MauiImage/MauiFont/MauiAsset resource processing.| Status | Services |
|---|---|
| ✅ Done | AppInfo, AppActions, Battery (UPower), Browser (xdg-open), Clipboard (Gdk.Clipboard), Connectivity (NetworkManager), DeviceDisplay, DeviceInfo, FilePicker (Gtk.FileDialog), FileSystem (XDG dirs), Launcher, Map, MediaPicker, Preferences (JSON), SecureStorage, Screenshot, SemanticScreenReader (AT-SPI), Share (XDG Portal), TextToSpeech (espeak-ng), VersionTracking |
| ⚠️ Partial | Geolocation (GeoClue — basic location only), WebAuthenticator (basic OAuth via system browser) |
| ❌ Stub | Vibration, PhoneDialer, SMS, Contacts — not applicable to desktop Linux |
| 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 |
| Essentials | 81% | 20 done + 2 partial, 4 stubs (desktop N/A) |
| Requirement | Version |
|---|---|
| .NET SDK | 10.0+ |
| GTK 4 libraries | 4.x (system package) |
| WebKitGTK (Blazor only) | 6.x (system package) |
sudo apt install libgtk-4-dev libwebkitgtk-6.0-dev
sudo dnf install gtk4-devel webkitgtk6.0-devel
# Install the template
dotnet new install Platform.Maui.Linux.Gtk4.Templates
# Create a new Linux MAUI app
dotnet new maui-linux-gtk4 -n MyApp.Linux
cd MyApp.Linux
dotnet run
Add the NuGet package:
dotnet add package Platform.Maui.Linux.Gtk4 --prerelease
dotnet add package Platform.Maui.Linux.Gtk4.Essentials --prerelease # optional
Then set up your entry point:
Program.cs
using Platform.Maui.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 Platform.Maui.Linux.Gtk4.Hosting;
using Microsoft.Maui.Hosting;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp
.CreateBuilder()
.UseMauiAppLinuxGtk4<App>();
return builder.Build();
}
}
Platform.Maui.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.
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.
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 Platform.Maui.Linux.Gtk4)
├── Program.cs (GtkMauiApplication entry point)
└── MauiProgram.cs (builder.UseMauiAppLinuxGtk4<App>())
dotnet new maui-linux-gtk4 -n MyApp.Linux
MyApp.Linux.csproj to your MAUI project (or a shared class library):<!-- MyApp.Linux.csproj -->
<ItemGroup>
<ProjectReference Include="../MyApp/MyApp.csproj" />
</ItemGroup>
dotnet run --project MyApp.Linux
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 is the same pattern used by OpenMaui and MauiAvalonia. It works with standard dotnet build/dotnet run, is NuGet-distributable, and keeps your existing MAUI project unchanged.
git clone https://github.com/Redth/Platform.Maui.Linux.Gtk4.git
cd Platform.Maui.Linux.Gtk4
dotnet restore
dotnet build
# Sample app (includes native controls, Blazor Hybrid, essentials, and more)
dotnet run --project samples/Platform.Maui.Linux.Gtk4.Sample
Platform.Maui.Linux.Gtk4.slnx # Solution file
├── src/
│ ├── Platform.Maui.Linux.Gtk4/ # Core MAUI backend
│ │ ├── Handlers/ # GTK4 handler implementations
│ │ ├── Hosting/ # AppHostBuilderExtensions (UseMauiAppLinuxGtk4)
│ │ └── Platform/ # GTK application, context, layout, theming
│ ├── Platform.Maui.Linux.Gtk4.Essentials/ # MAUI Essentials for Linux (clipboard, etc.)
│ └── Platform.Maui.Linux.Gtk4.BlazorWebView/ # BlazorWebView support via WebKitGTK
├── samples/
│ └── Platform.Maui.Linux.Gtk4.Sample/ # Sample app (controls, Blazor, essentials)
├── templates/ # dotnet new templates
└── docs/ # Documentation
| Package | Purpose |
|---|---|
Platform.Maui.Linux.Gtk4 | Core GTK4 backend — handlers, hosting, platform services |
Platform.Maui.Linux.Gtk4.Essentials | MAUI Essentials (clipboard, preferences, device info, etc.) |
Platform.Maui.Linux.Gtk4.BlazorWebView | Blazor Hybrid support via WebKitGTK |
Platform.Maui.Linux.Gtk4.Templates | dotnet new project templates |
| 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 |
This project is licensed under the MIT License.