Skip to main content

Arlecchino documentation

Arlecchino is a terminal UI framework for .NET. A view is a plain class, navigation keeps a history, and every part of the machinery is a service in Microsoft.Extensions.DependencyInjection.

dotnet add package Arlecchino

New here? Getting started is the smallest application that runs, and Lexicon is every term these pages use — including the ones this framework deliberately does not have.

Start here

PageWhat it covers
Getting startedInstalling the package, the smallest app that runs, the first view
Tutorial: your first appA todo list from an empty project: a store of atoms, a list, two modals and a status bar
ShowcaseThe applications built on the framework and what each one demonstrates
LexiconEvery term, in one place

The application

PageWhat it covers
Hosting and optionsAddArlecchino, every option, the builder API, running without the hosted service
The frame loopWhen a frame is drawn, which thread draws it, and how work gets back onto it
Views and navigationIArlecchinoView, ViewRoute, the navigator, history, view registration
Source generatorHow ViewKind, the factories and the registrations are emitted, MSBuild switches

Drawing

PageWhat it covers
RenderingSurface: what a frame costs, geometry, headless rendering
LayoutThe flow cursor, absolute calls, regions and clipping
Text and widthWhy measurement is in columns, and the TextWidth calls that do it
ColorsTermColor, RgbTermColor, and what the terminal can actually show
ThemingTheme, ThemePalette, and the framework's own palette

Input

PageWhat it covers
KeyboardHow a key travels, the keymap, the keys screen, layouts, paste and copy
CommandsIArlecchinoCommand, ViewCommand, the palette, the conflict check
MouseMouseEvent, hit-testing, and why Windows is different
FocusFocusRing and IArlecchinoFocusable
ANSI and the terminalWhat goes out, what comes in, and IArlecchinoTerminal

State

PageWhat it covers
AtomsTrackedAtom and LocalAtom, computed values, undo
StoresA class of atoms that registers itself
Async atomsLoading in the background, and tying work to a screen
FormsForm and Field
Application stateArlecchinoState, the output line, notifications
ModalsEvery dialog that ships, plus stacking and validation

Widgets

PageWhat it covers
Widgets overviewThe two interfaces, and writing one of your own
ListBoxA scrolling, selectable, clickable list
TableColumns that size themselves, and sorting
TreeA hierarchy that fills its children in on demand
TabsA strip of titles across a pane
ScrollingScrollPane, ScrollWindow and ScrollBar
TextViewA block of text, wrapped and cached
Status bar and indicatorsStatusBar, ProgressBar, Spinner
ChartsSparkline, BarChart, Gauge
File pickerRequesting a path, the places sidebar, filters and keys

Guides

PageWhat it covers
LocalizationThe generator that gives every string a name, and ArlecchinoStrings for the chrome
DiagnosticsThe log overlay, notifications, and the report to attach to a bug
TestingArlecchinoTestHost, FakeTerminal, FrameText
Packages and buildingWhat ships in which package, versioning, CI, benchmarks

Releases

PageWhat it covers
Migrating to 2026.8.1What a 5.0 application edits: the notification, and the switch that showed the keys
Migrating to 5.0The keys a 4.x application reads, now that a binding is not a ConsoleKeyInfo
What's new in 4.0Every string gets a name, a dialog draws itself, namespaces follow their folders
Migrating to 4.0The using lines a 3.x application needs, and one quiet behavior change
What's new in 3.0Pictures, a terminal that is asked what it can do, panes that share a line
Migrating to 3.0The five members 2.x lost, all of them about typing
What's new in 2.0The three breaking changes, and what came with them
Migrating to 2.0The edits an application written against 1.x needs
API referenceEvery public type, generated from the assemblies

Where things live

AssemblyNamespacesContents
Arlecchino.CoreArlecchino, Arlecchino.Rendering, Arlecchino.Input, Arlecchino.AtomsSurface, SurfaceRegion, Atom, KeyText, IArlecchinoTerminal — the renderer, no DI
ArlecchinoArlecchino.Hosting, Arlecchino.Navigation, Arlecchino.Commands, Arlecchino.Modals, Arlecchino.State, Arlecchino.Views, Arlecchino.Forms, Arlecchino.Focus, Arlecchino.Widgets, Arlecchino.Diagnosticsviews, navigation, modals, commands, forms, widgets, hosting, the file picker
Arlecchino.PicturesArlecchino.PicturesPictureFormats, PictureLimits — PNG, JPEG, BMP, Netpbm, QOI and Targa read into pixels
Arlecchino.TestingArlecchino.TestingArlecchinoTestHost, FakeTerminal, FrameText — the headless host for tests
Arlecchino.Generatorsthe incremental generator, shipped inside the Arlecchino package

Four of those namespaces hold enough to be worth dividing, and since 4.0.0 the divisions are real namespaces rather than folders nobody outside the repository can see:

NamespaceDivided into
Arlecchino.Modals.Asking (text, number), .Choosing (choice, palette), .Setting (slider, toggle, color, date, time), .Telling (message, notification)
Arlecchino.Widgets.Lists (list, table, tree, tabs, scrolling), .Pictures, .Readouts (charts, indicators, status bar, text view)
Arlecchino.Rendering.Colors (theme, palette, color types), .Text (widths, joinery, symbols), .Terminals (capabilities, probe, image protocol)
Arlecchino.Atoms.Local, .Tracked, .Collections

What each of them keeps is the vocabulary every file reaches for anyway: Modal and ModalFrame, Surface and SurfaceRegion, Margin and Align, Atom and the store interfaces.

What changed between versions is in the changelog.