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.

1,307verified upstream bindings
76 / 76escape fixtures matching
5native UI adapters
4optional addons

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.

01 / INPUT

Ordered writes

Streaming UTF-8 and UTF-16 enter one bounded asynchronous queue.

02 / ENGINE

VT500 parsing

One production parser mutates modes, cursors, and terminal buffers.

03 / STATE

Immutable snapshots

Consumers read stable viewport or full-buffer state by revision.

04 / DISPLAY

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.

Headless

XtermSharp.Rendering

Backend-neutral themes, geometry, selection, damage tracking, and display lists.

Neutral

XtermSharp.Rendering.Skia

HarfBuzz shaping, font fallback, retained row pictures, and render telemetry.

Backend

Platform controls

Avalonia, .NET MAUI, Windows Forms, WPF, and WinUI adapters with software fallback.

Optional

Addons

Web links, buffer search, OSC 9;4 progress, and policy-controlled OSC 52 clipboard.

Optional

Headless 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
Read the core walkthrough
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();

Build on the terminal engine, not around it.

Start headless, then attach the renderer or platform control your application needs.

Documentation

Search XtermSharp

Start typing to search the documentation.