đ The Avalonia port is GnollHack's modern .NET MAUI client running on Avalonia UI instead of the platform UI frameworks of Android, iOS and Windows. It brings the modern client to Linux, the Steam Deck and macOS, and it also runs on Windows for development and testing.
âšī¸ Overview
GnollHack's modern client is a single .NET MAUI app, GnollHackM. On Android, iOS and Windows, .NET MAUI draws it with each platform's own UI framework, such as WinUI 3 on Windows. .NET MAUI has no Linux backend of its own, so the Linux version uses Avalonia.Controls.Maui, which implements .NET MAUI's controls on top of Avalonia UI. Avalonia runs on Linux, Windows and macOS, so the same build also runs as a native Mac app, and on Windows.
The Avalonia port is not a separate code base. It is the same GnollHackM.csproj, the same C# code and the same XAML pages, built with the MSBuild property GnhAvalonia=true. Code that only the Avalonia port needs is in win\win32\xpl\GnollHackM\Platforms\Avalonia\, and files that only the Linux, macOS or Windows version uses are in Platforms\Linux\, Platforms\MacOS\ and Platforms\WindowsAvalonia\.
đĨī¸ Flavors
The Avalonia port is built in three flavors, one for each operating system:
|  | đ§ Linux | đ macOS | đĒ Windows |
|---|---|---|---|
| Purpose | Released to players | Released to players | Development and testing; an alternative Windows version, not released yet |
| Distribution | Steam (also on the Steam Deck), and an AppImage on GitHub | Steam, as a signed and notarized GnollHack.app
|
A self-contained folder for testers; Windows players get the WinUI 3 version |
| Runtime identifier | linux-x64 |
osx-arm64 (Apple Silicon only) |
win-x64 |
| Game engine | libgnollhacklinux.so |
libgnollhackmac.dylib |
gnollhackwin.dll, the same as the WinUI 3 version |
Game data (nhdat) |
The Linux-format file of the Android version | The same file as the Linux version | The Windows-format file of the WinUI 3 version |
| Sound banks | Desktop | Desktop | Desktop |
| Window system | X11, and XWayland on Wayland desktops | Avalonia's macOS backend | Avalonia's Windows backend |
| Rendering | OpenGL through GLX, with a software fallback | Metal, then OpenGL, then software; the Metal Rendering setting chooses OpenGL | Direct3D 11 through ANGLE, on the window's DXGI swap chain |
| In-game web pages | Chromium (CEF), built into the game; WebKitGTK as a fallback | WKWebView, built into macOS | Microsoft Edge WebView2 |
| Game controllers | evdev, and Steam Input on the Steam Deck | Apple's GameController framework | XInput |
| Crash reporting | Sentry, including native crashes | Sentry, including native crashes | Sentry, including native crashes |
| Saved games and settings | ~/.local/share/GnollHack |
~/Library/Application Support/GnollHack |
%LOCALAPPDATA%\GnollHack-Avalonia |
| Build instructions | Build Instructions for Avalonia Linux Version on Windows | Build Instructions for Avalonia macOS Version on Windows | Build Instructions for Avalonia Windows Version on Windows |
All three flavors are built on Windows. The Linux flavor also needs WSL, which compiles the game engine and the game data, assembles the packages, and can run the game for testing. The macOS flavor needs WSL for the game data and a Mac reached over SSH, which compiles the game engine, builds, signs and notarizes the app, and runs it for testing.
The macOS version was released on Steam on November 5, 2026, in version 3.37. Players' information is on macOS Version.
đ§âđģ Building
The Avalonia port uses a newer .NET SDK than the other modern clients. Its SDK and .NET MAUI workload versions are pinned in Platforms\Avalonia\global.json, and every dotnet command for the Avalonia port must run in that folder, for example:
cd win\win32\xpl\GnollHackM\Platforms\Avalonia
dotnet build ..\..\GnollHackM.csproj -p:GnhAvalonia=true
Without -r, the build targets the operating system it runs on, so this command builds the Windows flavor. The Linux flavor is published with -r linux-x64, which Build-LinuxPackages.ps1 does for you, and the macOS flavor with -r osx-arm64, which Build-MacPackage.ps1 does. The native libraries and the game data come from the native solution GnollHack.sln, as for the other modern clients; see Overview of Building GnollHack with .NET MAUI. The tile sets and sound banks are read straight from win\win32\tileset and win\win32\bank\Desktop, so no flavor needs them staged.
đ§ Linux Packages
The Linux version comes in three packages, all made from one self-contained publish:
- AppImage â A single file for the GitHub releases, which runs on most 64-bit Linux distributions without installation. Players' instructions: Installing the AppImage on Linux.
- Steam depot content â For the Steam Linux Runtime 4.0 by default, or 3.0 (sniper) on request.
- tar.gz â The game as a plain folder, for testers.
The packages run on Ubuntu 18.04, Debian 10, RHEL 8 and newer distributions: every Linux binary is built against an old glibc, and the packaging script refuses files that need anything newer. The player-facing requirements are in Linux System Requirements, and how the floor is kept in Binary Compatibility.
đī¸ Design Details
How the port is built inside, and why, is on five pages of its own:
- Design Details of Avalonia Port â The design that all flavors share: the build, startup, rendering, the frame loop, input, the Essentials replacements, files, web views, crash reporting, and the shared files.
- Design Details of Linux Avalonia Port â The Linux version's own parts: X11 and GLX, Steam Input, the built-in Chromium web view (CEF), native crash handling, binary compatibility and the packages.
- Design Details of macOS Avalonia Port â The macOS version's own parts: Metal rendering, the menu bar, the Option key, Apple's game controllers, WKWebView and the signed and notarized app bundle.
- Design Details of Windows Avalonia Port â The Windows flavor: the swap chain the Steam overlay needs, its own executable and log, and how it compares with the WinUI 3 version.
- Design Details of Native Crash Reporting â How GnollHack reports native crashes to Sentry on every desktop client, and how its libraries follow a Sentry update.
Avalonia.Controls.Maui is younger than .NET MAUI's own backends, and GnollHack works around a number of its defects. The workarounds are recorded with their symptoms and removal conditions in the GnollHack repository's workaround register.