CheapAvaloniaBlazor 3.4.1
dotnet add package CheapAvaloniaBlazor --version 3.4.1
NuGet\Install-Package CheapAvaloniaBlazor -Version 3.4.1
<PackageReference Include="CheapAvaloniaBlazor" Version="3.4.1" />
<PackageVersion Include="CheapAvaloniaBlazor" Version="3.4.1" />
<PackageReference Include="CheapAvaloniaBlazor" />
paket add CheapAvaloniaBlazor --version 3.4.1
#r "nuget: CheapAvaloniaBlazor, 3.4.1"
#:package CheapAvaloniaBlazor@3.4.1
#addin nuget:?package=CheapAvaloniaBlazor&version=3.4.1
#tool nuget:?package=CheapAvaloniaBlazor&version=3.4.1
CheapAvaloniaBlazor
Build cross-platform desktop applications using Blazor Server, Avalonia, and Photino.
Combines Blazor Server + MudBlazor + Avalonia + Photino to create native desktop apps with full file system access across Windows, Linux, and macOS using familiar Razor pages and C# components.
PRE-ALPHA HOBBY PROJECT This is an experimental project developed as a personal hobby. Expect breaking changes, incomplete features, and limited support. Use at your own risk in non-production environments.
Why CheapAvaloniaBlazor?
Use your existing web development skills (HTML, CSS, Blazor, C#) to build desktop applications with native capabilities — no platform-specific UI frameworks, no complex native interop. Good fits: web developers moving to desktop, rapid prototyping, line-of-business tools needing file system access, and Blazor apps that outgrew the browser sandbox.
Quick Start
# Install the project templates
dotnet new install CheapAvaloniaBlazor.Templates
# Create a minimal app (MudBlazor + basic window)
dotnet new cheapblazor -n MyDesktopApp
# Or a full-featured app (tray, notifications, settings, hotkeys, menu bar, multi-window, drag-drop)
dotnet new cheapblazor-full -n MyDesktopApp
cd MyDesktopApp
dotnet run
Prefer manual setup? Add the package to a Razor SDK project and call the fluent builder:
using CheapAvaloniaBlazor.Extensions;
using CheapAvaloniaBlazor.Hosting;
class Program
{
[STAThread]
public static void Main(string[] args)
{
new HostBuilder()
.WithTitle("My Desktop App")
.WithSize(1200, 800)
.AddMudBlazor()
.RunApp(args);
}
}
The Getting Started guide walks through every file of a working app.
Features
- System tray — icon, context menu, minimize/close-to-tray
- Notifications — desktop toasts (Avalonia overlay) + OS notification center (Web Notification API)
- Settings persistence — JSON key-value and typed-section APIs with auto-save
- App lifecycle events — minimize/maximize/restore/focus events, close cancellation
- Theme detection — OS dark/light mode with runtime change events
- Global hotkeys — system-wide shortcuts on Windows (Win32) and Linux (D-Bus portal / X11)
- Native menu bar — Win32 menu with mnemonics, accelerators, checkable items (Windows)
- Multi-window — child windows, modal dialogs, inter-window messaging
- Drag-and-drop files — HTML5 drag events bridged to C#
- Desktop interop — file dialogs, window management, clipboard, system paths
- Splash screen — enabled by default, fully customizable
- Diagnostics — comprehensive startup and operation logging
Every feature with code samples: Features guide.
Documentation
- Installation — requirements, installation methods, troubleshooting
- Getting Started — step-by-step first app tutorial
- Features — all desktop features with code samples
- Desktop Interop API — file dialogs, window management, clipboard
- Advanced Configuration — full HostBuilder reference
- Splash Screen — customization options
- Diagnostics & Debugging — logging and common issues
- Architecture — how the pieces fit together, platform compatibility
Also browsable on the project wiki.
Samples
- MinimalApp — the absolute minimum code to run a Blazor desktop app
- DesktopFeatures — every desktop feature demonstrated
- TemplateApp — exactly what
dotnet new cheapblazorscaffolds (CI-verified) - CheapShotcutRandomizer — a real-world app built on the framework
Contributing & Support
Found a bug? Open an issue. Testing on Linux/macOS and documentation feedback are especially welcome. This is a hobby project — support is best-effort.
License
MIT — use freely in personal and commercial projects. Built on Avalonia, Blazor, MudBlazor, and Photino.
| Product | Versions 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. |
-
net10.0
- Avalonia (>= 12.1.1)
- Avalonia.Desktop (>= 12.1.1)
- Avalonia.Fonts.Inter (>= 12.1.1)
- Avalonia.Themes.Fluent (>= 12.1.1)
- CheapHelpers (>= 3.0.0)
- Microsoft.AspNetCore.App.Internal.Assets (>= 10.0.11)
- MudBlazor (>= 9.8.0)
- Photino.NET (>= 4.0.16)
- Tmds.DBus.Protocol (>= 0.95.0)
- Velopack (>= 1.2.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on CheapAvaloniaBlazor:
| Package | Downloads |
|---|---|
|
CheapHelpers.Avalonia.Bridge
Bridge package integrating CheapAvaloniaBlazor desktop notifications with CheapHelpers notification system. Provides DesktopNotificationChannel adapter allowing desktop OS notifications to participate in the unified notification system. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.4.1 | 63 | 8/26/2026 |
| 3.4.0 | 88 | 8/22/2026 |
| 3.3.1 | 82 | 8/22/2026 |
| 3.3.0 | 80 | 8/21/2026 |
| 3.2.0 | 547 | 6/11/2026 |
| 3.1.2 | 122 | 6/10/2026 |
| 3.1.1 | 160 | 5/9/2026 |
| 3.1.0 | 122 | 5/9/2026 |
| 3.0.0 | 543 | 2/27/2026 |
| 2.1.1 | 205 | 2/12/2026 |
| 2.0.2 | 174 | 1/29/2026 |
| 2.0.1 | 142 | 1/29/2026 |
| 2.0.0 | 151 | 1/28/2026 |
| 1.2.4 | 146 | 1/27/2026 |
| 1.2.2 | 135 | 1/27/2026 |
| 1.2.0 | 222 | 1/24/2026 |
| 1.1.5 | 141 | 1/22/2026 |
| 1.1.4 | 288 | 1/10/2026 |
Version 3.4.1 - Fixes a blank white window on machines that never had the .NET SDK. blazor.web.js and cheap-blazor-interop.js now travel with the app instead of being resolved out of the build machine's NuGet cache: both reach wwwroot as content that survives dotnet publish, and both are embedded in the library assembly as a fallback that cannot go missing. A static web assets manifest pointing at paths that no longer exist no longer kills the process at startup, and the host now checks its own page at startup and logs any script or stylesheet that comes back failing or empty - including the 200-with-zero-bytes case that reports as healthy everywhere else. Previous release: private update feeds via WithVelopackUpdates(repoUrl, accessToken).