<!-- The same file runs on every host. -->
<TuiWindow>
<Border BoxStyle="Double">
<StackPanel>
<TextBlock Text="System status" />
<ProgressBar Value="{Binding Progress}" />
<Button Content="Cancel" />
</StackPanel>
</Border>
</TuiWindow>
Cross-platform terminal UI library for .NET 10
One control tree.
Every surface.
Define a terminal user interface in XAML or C#. Render the same character-cell grid in terminals, browsers, desktop frameworks, native SDL2 windows, or any SkiaSharp canvas.
- MIT licensed
- XAML and C# authoring
- WPF-inspired control model
.NET 10Current target framework
8 host familiesTerminal, web, desktop, and native
50+ controlsLayouts, inputs, data, and overlays
MITOpen-source library
Start with the core and one host
Install only the packages your application requires.
The core package contains controls, layout, binding, routed events, templates, and XAML loading. Add a platform package for each required rendering target.
dotnet add package Tedd.TUIdotnet add package Tedd.TUI.Platform.ConsoleThe console host selects the appropriate terminal backend at run time. Other host packages can be installed independently.
Platform-independent by construction
Application logic stops at the cell grid.
Tedd.TUI resolves layout and state before a host renders the result. Platform adapters remain thin and application code remains portable.
var window = new TuiWindow
{
Content = new Border
{
BoxStyle = BoxStyle.Double,
Child = new StackPanel
{
// Add controls or load XAML.
}
}
};
new TuiApp(window).Run();
Eight host families
Select a renderer without redesigning the interface.
Each host consumes the same resolved character-cell grid and returns keyboard, pointer, and wheel input in cell coordinates.
Terminal
Truecolor VT output, diff-based updates, keyboard and pointer input, and automatic backend selection.
Tedd.TUI.Platform.ConsoleBlazor
Canvas or DOM rendering in the browser, with Razor components and XAML loading.
Tedd.TUI.Platform.BlazorWPF
Character-cell rendering inside WPF, including live preview in the Visual Studio XAML designer.
Tedd.TUI.Platform.WpfAvalonia
SkiaSharp-backed hosting for Windows, macOS, and Linux applications.
Tedd.TUI.Platform.AvaloniaWinUI 3
A Windows App SDK control backed by the shared Skia cell renderer.
Tedd.TUI.Platform.WinUI.NET MAUI
A cross-platform view for Android, iOS, Mac Catalyst, and Windows.
Tedd.TUI.Platform.MauiSkiaSharp
Direct rendering to any SKCanvas, including headless PNG generation.
Tedd.TUI.Platform.SkiaSDL2
A native SDL2 window or integration with an existing SDL render loop.
Tedd.TUI.Platform.Sdl2WPF-inspired composition
Controls, layout, and interaction use one coherent model.
Dependency properties, inherited data context, templates, triggers, routed events, focus management, and overlays support composable application interfaces.
Rich content within the grid
Text cells are the base layer, not the limit.
Render documents, source code, and decoded images through the same host-independent control tree.

Markdown
MarkdownView renders headings, emphasis, lists, quotations, tables, links, code fences, and images. Themes control every semantic style.

Source code
CodeDocument provides Prism-style tokenization with 76 bundled language grammars and configurable token colors.

Images
The Image control uses Sixel, Kitty, or iTerm2 graphics where available and a truecolor half-block representation elsewhere.
Deterministic rendering contract
Built for long-running interactive applications.
The rendering pipeline computes a virtual character grid. Terminal renderers compare consecutive frames and emit only changed cells. Event-driven terminal hosts remain idle until input or invalidation requires work.
- Layout: recursive measure and arrange passes with clipping.
- Rendering: double-buffered cell output and differential updates.
- Input: tunneled and bubbling routed events with mouse capture.
- State: dependency properties, binding, templates, and triggers.
Reference material
Proceed from installation to host-specific integration.
Tedd.TUI for .NET 10
Define the interface once.
Select the host for each target.
Install the core library and the host package required by your application.