Web frontends.C# backends.Native desktop apps.
A cross-platform .NET 8+ desktop framework on the OS WebView. Write commands in C# and call them from your frontend.
One codebase, three desktops
- Windowsx64 · WebView2
- Linuxx64 · WebKitGTK
- macOSarm64 · WKWebView
Early development. Not on NuGet.org yet. Provided as is, without support commitments.
[Command]public static Greeting Greet( string name, State<GreetingCounter> counter) => new($"Hello, {name}!", counter.Value.Next());import { commands } from './generated/commands.js';const greeting = await commands.greet({ name: 'World' });// { message: 'Hello, World!', count: 1 }Why NetWiv
Your backend stays .NET.
NuGet packages, dependency injection, configuration and logging work the way they do in an ASP.NET Core app.
var builder = NetWivApplication.CreateBuilder(args);builder.Services.AddSingleton<GreetingCounter>();builder.Services.Configure<GreetingOptions>(...);Types follow your C#.
Records become TypeScript interfaces at build time, and a Blazor frontend gets a typed C# client, so the compiler catches a renamed field.
public sealed record Greeting( string Message, int Count);export interface GreetingOutput { "message": string; "count": number;No browser engine inside.
Pages render in the OS WebView. Your package carries your app, not a copy of Chromium.
In your packageYour app.NET runtime or NativeAOTFrom the OSWebViewChoose how it ships.
Three ways to publish, one flag apart.
- NativeAOTOne native executable · AOT-safe dependencies12.4–14.8 MiB
- Self-containedThe default · .NET included76.0–81.8 MiB
- Installed runtimeSmallest download · needs .NET installed7.7–8.4 MiB
React starter release build, without installers. Bars run from Windows x64 to macOS arm64.
How it fits together
Frontend
React, Vue, Svelte, Angular, or Blazor as WebAssembly or Hybrid
Your UI. Calls C# through generated bindings and the desktop SDK, @netwiv/api.
.NET
NetWiv.Core, managed or NativeAOT
Commands, state, events, permissions and plugins. Every call is validated here.
Native
wry, tao, muda, tray-icon
Event loop, windows, WebViews, menus and tray.
OS
WebView2, WebKitGTK, WKWebView
Renders the page. Your app ships no browser engine.
Where it runs today
| App runs | Packaging | Signed release | |
|---|---|---|---|
| Windows x64WebView2 | |||
| Linux x64WebKitGTK 4.1 | |||
| macOS arm64WKWebView |
- Checked
- Partly checked
- Not yet
- Not applicable
Windows x64 · App runs Checked
A package-only NativeAOT React app runs.
Focused checks, not full conformance. Intel Macs are no longer a supported target. Details
One desktop SDK
- @netwiv/apiCore modulesWindows, webviews, events, menus, tray, paths and more. Generated bindings use it. Mobile APIs are left out.
- @netwiv/api/plugins/*Plugin modules21 desktop plugins. Each still needs its .NET plugin package and a permission.
Apps reach windows, events, menus, the tray and plugins through @netwiv/api. Underneath, the native layer reuses the wry, tao, muda and tray-icon libraries. Where this API comes from and how much of it is implemented: Compatibility
- wry
- tao
- muda
- tray-icon