Hex1b
September 2, 2026 ยท View on GitHub
Hex1b is a .NET library for building rich, interactive terminal user interfaces (TUI) with a React-inspired declarative API. Create beautiful console applications with widgets, layouts, theming, and more.
โจ Features
- Declarative UI - Build UIs using a widget tree pattern inspired by React and Flutter
- Widget Library - TextBlock, TextBox, Button, List, VStack, HStack, Splitter, and more
- Layout System - Flexible constraint-based layout with size hints (Fill, Content, Fixed)
- Theming - Built-in themes with customizable colors and styles
- Input Handling - Keyboard navigation, focus management, and shortcut bindings
- Reconciliation - Efficient diff-based updates to minimize terminal redraws
๐ฆ Installation
dotnet add package Hex1b
๐ Quick Start
Here's a simple "Hello World" application:
using Hex1b;
using Hex1b.Widgets;
using var cts = new CancellationTokenSource();
Console.CancelKeyPress += (_, e) => { e.Cancel = true; cts.Cancel(); };
using var app = new Hex1bApp(
ctx => Task.FromResult<Hex1bWidget>(
new VStackWidget([
new TextBlockWidget("Hello, Terminal!"),
new ButtonWidget("Exit", () => cts.Cancel())
])
)
);
await app.RunAsync(cts.Token);
๐จ Widgets
Hex1b provides a variety of built-in widgets:
| Widget | Description |
|---|---|
TextBlockWidget | Display static or dynamic text |
TextBoxWidget | Editable text input with cursor and selection |
ButtonWidget | Clickable button with label and action |
ListWidget | Scrollable list with selection |
VStackWidget | Vertical layout container |
HStackWidget | Horizontal layout container |
SplitterWidget | Resizable split pane layout |
๐ Layout System
Hex1b uses a constraint-based layout system with size hints:
// Children with size hints: first fills available space, second sizes to content
new VStackWidget(
[contentWidget, statusBarWidget],
[SizeHint.Fill, SizeHint.Content]
);
Size Hints:
SizeHint.Fill- Expand to fill available spaceSizeHint.Content- Size to fit contentSizeHint.Fixed(n)- Fixed size of n units
๐น Input Bindings
Define keyboard bindings at any level of your widget tree:
var widget = new SplitterWidget(left, right, 25) with
{
InputBindings = [
InputBinding.Ctrl(Hex1bKey.S, Save, "Save"),
InputBinding.Ctrl(Hex1bKey.Q, Quit, "Quit"),
]
};
Picking portable bindings. Different terminals intercept different combos before they reach Hex1b (e.g. Windows Terminal eats
Ctrl+Shift+โ/โfor scroll, GNOME Terminal eatsCtrl+Shift+T/N/Wfor tab/window management). See Keybinding Portability on hex1b.dev for the per-terminal interception matrix and recommendations, and use theKeyBindingTestersample to confirm what actually fires on your target terminals.
๐จ Theming
Apply built-in themes or create your own:
using var app = new Hex1bApp(builder, new Hex1bAppOptions { Theme = Hex1bThemes.Sunset });
๐๏ธ Architecture
Hex1b follows a widget/node separation pattern:
- Widgets - Immutable configuration objects describing what to render
- Nodes - Mutable render objects that manage state and layout
- Reconciliation - Efficient diffing to update nodes when widgets change
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Hex1bApp.RunAsync() โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ 1. Build widget tree (your code) โ
โ 2. Reconcile โ Update node tree โ
โ 3. Layout โ Measure and arrange nodes โ
โ 4. Render โ Draw to terminal โ
โ 5. Wait for input โ Dispatch to focused node โ
โ 6. Repeat from step 1 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐งช Samples
The samples/ directory contains example applications demonstrating various features:
- Cancellation - Master-detail contact editor with save/cancel functionality
- RemoteTerminalAuthDemo - Connects a client to a bearer-protected remote terminal server
Running Samples with Aspire
This repository is set up with Aspire to make it easy to run and test sample applications:
dotnet run --project apphost.cs
Note: Aspire doesn't natively support interactive terminal applications, but this project explores techniques to make TUI app development and testing in Aspire possible.
๐ ๏ธ Development
Prerequisites
- .NET 10.0 SDK (preview)
- A terminal emulator with good ANSI support
Building
dotnet build
Running Tests
dotnet test
Project Structure
hex1b/
โโโ src/
โ โโโ Hex1b/ # Main library
โ โโโ Layout/ # Constraint-based layout system
โ โโโ Nodes/ # Render nodes (mutable, stateful)
โ โโโ Widgets/ # Widget definitions (immutable config)
โ โโโ Theming/ # Theme system and built-in themes
โ โโโ Input/ # Keyboard input and bindings
โโโ samples/ # Example applications
โโโ docs/ # Architecture & reference documentation
โโโ tests/
โ โโโ Hex1b.Tests/ # Unit tests
โโโ apphost.cs # Aspire app host for running samples
๐ Documentation
Full documentation lives at hex1b.dev. Highlights:
- Input Handling โ focus, routing, declarative bindings, and Vim/Emacs-style remap walkthrough.
- Keybinding Portability โ per-terminal interception matrix (Windows Terminal, ConPTY, macOS Terminal.app, iTerm2, Ghostty, kitty, GNOME Terminal, Ptyxis, xterm, tmux, ssh) plus cross-cutting ANSI protocol limits.
- Terminal Emulator โ using the embedded terminal widget.
- API Reference โ generated namespace docs.
In-repo design / architecture notes (not on the website):
docs/terminal.mdโ Presentation/workload adapter architecture.docs/child-process-arch.mdโ Child process / PTY architecture.docs/muxer-protocol.mdโ Muxer wire protocol.
For the manual portability harness used to generate the per-terminal data,
see samples/KeyBindingTester.
๐ค Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
For AI coding agents, see AGENTS.md for context and conventions.
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Related Projects
- Spectre.Console - Beautiful console output
- Terminal.Gui - Cross-platform terminal UI toolkit
- Aspire - Cloud-ready stack for .NET