0.1.0-alpha.1 for .NET 10
XtermSharp
A pure C# terminal engine with ordered async input, immutable snapshots, and native controls from Avalonia to WinUI. Built against the behavior of xterm.js, without bringing the browser into your application.
$ dotnet add package XtermSharp.Core --prerelease
info : Installed XtermSharp.Core 0.1.0-alpha.1
$ dotnet run
XtermSharp / VT500 / Unicode 15
OK 1,307 upstream bindings verified
OK ordered write committed at revision 42
terminal>
The terminal pipeline
One engine from incoming bytes to the frame on screen.
The headless core owns terminal semantics. Rendering and platform packages stay optional, so services, tests, and desktop applications can all use the same state model.
Ordered writes
Streaming UTF-8 and UTF-16 enter one bounded asynchronous queue.
VT500 parsing
One production parser mutates modes, cursors, and terminal buffers.
Immutable snapshots
Consumers read stable viewport or full-buffer state by revision.
Native presentation
Retained Skia rows reach the UI through platform-native controls.
Composable packages
Take the core. Add only the integration you own.
UI frameworks, graphics libraries, link detection, search, progress, and clipboard policy remain outside the common package boundary.
XtermSharp
Parser, buffers, snapshots, input encoding, selection, links, and addon contracts.
HeadlessXtermSharp.Rendering
Backend-neutral themes, geometry, selection, damage tracking, and display lists.
NeutralXtermSharp.Rendering.Skia
HarfBuzz shaping, font fallback, retained row pictures, and render telemetry.
BackendPlatform controls
Avalonia, .NET MAUI, Windows Forms, WPF, and WinUI adapters with software fallback.
OptionalAddons
Web links, buffer search, OSC 9;4 progress, and policy-controlled OSC 52 clipboard.
OptionalHeadless first
Parse output. Inspect stable state.
Writes complete after parsing, and snapshots never expose live mutable buffers. Connect the
Data event to an application-owned PTY or transport when the terminal emits input or a response.
- No browser or DOM dependency
- No built-in process, PTY, or SSH ownership
- Cancellation only before queue admission
using XtermSharp;
using XtermSharp.Options;
using XtermSharp.Snapshots;
await using var terminal = new Terminal(new TerminalOptions
{
Columns = 80,
Rows = 24,
Scrollback = 1000
});
terminal.Data += (_, e) => pty.Write(e.Data);
await terminal.WriteAsync(
"\x1b[32mhello from XtermSharp\x1b[0m\r\n");
TerminalSnapshot snapshot =
await terminal.GetSnapshotAsync();
Documentation
Start with the boundary you are integrating.
Each guide names ownership, threading, fallback, and security constraints where they matter.
Getting started
Install the core, process terminal output, and connect a transport.
Open guide → 02Platform controls
Choose Avalonia, MAUI, WinForms, WPF, or WinUI and assign terminal ownership.
Compare controls → 03Addons
Add links, search, progress, or clipboard behavior without changing the core.
Browse addons → 04Core architecture
Understand queue ordering, parser execution, revisions, and immutable snapshots.
Read architecture → 05Rendering
Follow display lists through retained Skia pictures to native presentation.
Read rendering guide → 06Compatibility status
Review implemented behavior, verified upstream coverage, and current limits.
Review status →Build on the terminal engine, not around it.
Start headless, then attach the renderer or platform control your application needs.