MewUI
A cross-platform and lightweight, code-first .NET GUI framework aimed at NativeAOT.
Install / Use
/learn @aprillz/MewUIREADME

😺 MewUI is a cross-platform and lightweight, code-first .NET GUI framework aimed at NativeAOT.
🧪 Experimental Prototype
[!IMPORTANT]
This project is a proof-of-concept prototype for validating ideas and exploring design directions.
As it evolves toward v1.0, APIs, internal architecture, and runtime behavior may change significantly.
Backward compatibility is not guaranteed at this stage.
🤖 AI-Assisted Development
[!NOTE] This project was developed using an AI prompt–driven workflow.
Design and implementation were performed through iterative prompting without direct manual code edits,
with each step reviewed and refined by the developer.
🚀 Try It Out
No clone. No download. No project setup.
You can run MewUI immediately with a single command on Windows, Linux or macOS. (.NET 10 SDK required)
[!TIP] This is the quickest way to try MewUI without going through the usual repository and project setup steps.
curl -sL https://raw.githubusercontent.com/aprillz/MewUI/refs/heads/main/samples/FBASample/fba_gallery.cs -o - | dotnet run -
[!WARNING] This command downloads and executes code directly from GitHub.
Video
https://github.com/user-attachments/assets/fc2d6ad8-3317-4784-a6e5-a00c68e9ed3b
Screenshots
| Light | Dark |
|---|---|
|
|
|
✨ Highlights
- 📦 NativeAOT + trimming first
- 🪶 Lightweight by design (small EXE, low memory footprint, fast first frame)
- 🧩 Fluent C# markup (no XAML)
🚀 Quickstart
-
NuGet: https://www.nuget.org/packages/Aprillz.MewUI/
Aprillz.MewUIis a metapackage that bundles Core, all platform hosts, and all rendering backends.- Platform-specific packages are also available:
Aprillz.MewUI.Windows,.Linux,.MacOS - Install:
dotnet add package Aprillz.MewUI - See: Installation & Packages
-
Single-file app (VS Code friendly)
-
Minimal header (without AOT/Trim options):
#:sdk Microsoft.NET.Sdk #:property OutputType=Exe #:property TargetFramework=net10.0 #:package Aprillz.MewUI@0.10.3 // ...
-
Run:
dotnet run your_app.cs
🧪 C# Markup at a Glance
-
Sample source: https://github.com/aprillz/MewUI/blob/main/samples/MewUI.Sample/Program.cs
var window = new Window() .Title("Hello MewUI") .Size(520, 360) .Padding(12) .Content( new StackPanel() .Spacing(8) .Children( new Label() .Text("Hello, Aprillz.MewUI") .FontSize(18) .Bold(), new Button() .Content("Quit") .OnClick(() => Application.Quit()) ) ); Application.Run(window);
🎯 Concept
MewUI is a code-first GUI framework with four priorities:
- NativeAOT + trimming friendliness
- Small footprint, fast startup, low memory usage
- Fluent C# markup for building UI trees (no XAML)
- AOT-friendly binding
Non-goals (by design):
- WPF-style animations, visual effects, or heavy composition pipelines
- A large, “kitchen-sink” control catalog (keep the surface area small and predictable)
- Complex path-based data binding
- Full XAML/WPF compatibility or designer-first workflows
✂️ NativeAOT / Trim
- The library aims to be trimming-safe by default (explicit code paths, no reflection-based binding).
- Windows interop uses source-generated P/Invoke (
LibraryImport) for NativeAOT compatibility. - On Linux, building with NativeAOT requires the AOT workload in addition to the regular .NET SDK (e.g. install
dotnet-sdk-aot-10.0). - If you introduce new interop or dynamic features, verify with the trimmed publish profile above.
To check output size locally:
- Publish:
dotnet publish .\samples\MewUI.Gallery\MewUI.Gallery.csproj -c Release -p:PublishProfile=win-x64-trimmed - Inspect:
.artifacts\publish\MewUI.Gallery\win-x64-trimmed\
Reference (Aprillz.MewUI.Gallery.exe @v0.10.0)
- win-x64: ~3,545 KB
- osx-arm64: ~2,664 KB
- linux-arm64: ~3939 KB
🔗 State & Binding (AOT-friendly)
Bindings are explicit and delegate-based (no reflection):
using Aprillz.MewUI.Binding;
using Aprillz.MewUI.Controls;
var percent = new ObservableValue<double>(
initialValue: 0.25,
coerce: v => Math.Clamp(v, 0, 1));
var slider = new Slider()
.BindValue(percent);
var label = new Label()
.BindText(percent, v => $"Percent ({v:P0})");
🧱 Controls / Panels
Controls (Implemented):
ButtonLabel,ImageTextBox,MultiLineTextBoxCheckBox,RadioButton,ToggleSwitchComboBox,ListBox,TreeView,GridViewSlider,ProgressBar,NumericUpDownTabControl,GroupBoxMenuBar,ContextMenu,ToolTip(in-window popups)ScrollViewerWindow,DispatcherTimer
Panels:
Grid(rows/columns withAuto,*, pixel)StackPanel(horizontal/vertical)DockPanel(dock edges + last-child fill)UniformGrid(equal cells)WrapPanel(wrap + item size)SplitPanel(drag splitter)
All panels except
SplitPanelsupportSpacing.
🎨 Theme
MewUI uses a Theme object (colors + metrics) and ThemeManager to control defaults and runtime changes.
- Configure defaults before
Application.Run(...)viaThemeManager.Default* - Change at runtime via
Application.Current.SetTheme(...)/Application.Current.SetAccent(...)
See: docs/Theme.md
🖌️ Rendering Backends
Rendering is abstracted through:
IGraphicsFactory/IGraphicsContext
Backends:
| Backend | Platform | Package |
|---------|----------|---------|
| Direct2D | Windows | Aprillz.MewUI.Backend.Direct2D |
| GDI | Windows | Aprillz.MewUI.Backend.Gdi |
| MewVG | Windows | Aprillz.MewUI.Backend.MewVG.Win32 |
| MewVG | Linux/X11 | Aprillz.MewUI.Backend.MewVG.X11 |
| MewVG | macOS | Aprillz.MewUI.Backend.MewVG.MacOS |
MewVG is a managed port of NanoVG, using OpenGL on Windows/Linux and Metal on macOS.
Backends are registered by the referenced backend packages (Trim/AOT-friendly). In app code you typically either:
- call
*Backend.Register()beforeApplication.Run(...), or - use the builder chain:
Application.Create().Use...().Run(...)
When using a metapackage (e.g., Aprillz.MewUI.Windows), you can select a single backend at publish time with -p:MewUIBackend=Direct2D. See Installation & Packages for details.
🪟 Platform Abstraction
Windowing and the message loop are abstracted behind a platform layer.
Currently implemented:
- Windows (
Aprillz.MewUI.Platform.Win32) - Linux/X11 (
Aprillz.MewUI.Platform.X11) - macOS (
Aprillz.MewUI.Platform.MacOS)
Linux dialogs dependency
On Linux, MessageBox and file dialogs are currently implemented via external tools:
zenity(GNOME/GTK)kdialog(KDE)
If neither is available in PATH, MewUI throws:
PlatformNotSupportedException: No supported Linux dialog tool found (zenity/kdialog).
📄Docs
- Installation & Packages
- C# Markup
- Binding
- Items and Templates
- Theme
- Application Lifecycle
- Layout
- RenderLoop
- Hot Reload
- Custom Controls
🧭 Roadmap (TODO)
Platforms
- [ ] Linux/Wayland
- [x] macOS
Tooling
- [x] Hot Reload
- [ ] Design-time preview
Related Skills
node-connect
342.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
85.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
342.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
342.5kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
