libghostty-vt
Zero-dependency VT sequence parser from Ghostty. Mitchell Hashimoto's embeddable terminal core.
NOT YET RELEASED (as of 2025-09) - Zig API available for testing, C API coming.
libghostty-vt extracts Ghostty's proven VT parsing into a standalone library:
Raw Bytes → UTF8Decoder → Parser (DFA) → Stream → Actions
│
State Machine
(14 states)
| State | Purpose |
|---|---|
ground |
Normal text printing |
escape |
ESC detected (0x1B) |
csi_entry |
CSI sequence start |
csi_param |
Parsing CSI parameters |
osc_string |
OSC data collection |
dcs_passthrough |
DCS data collection |
const Action = union(enum) {
print: u21, // Unicode codepoint
execute: u8, // C0/C1 control
csi_dispatch: CSI, // Control Sequence Introducer
esc_dispatch: ESC, // Escape sequence
osc_dispatch: *osc.Parser,
dcs_hook: DCS,
dcs_put: u8,
dcs_unhook: void,
};
src/terminal/Parser.zig # State machine
src/terminal/stream.zig # Stream wrapper + SIMD
src/terminal/osc.zig # OSC parser
src/terminal/parse_table.zig # Compile-time transition table
src/simd/vt.zig # SIMD acceleration
| Optimization | Impact |
|---|---|
| Pre-computed state table | O(1) transitions |
| SIMD text processing | 10-100x for plain text |
| Fast-path CSI parsing | Skips state machine |
| Fixed-size buffers | No allocation |
# Future installation (not yet available)
# Zig
zig fetch --save git+https://github.com/ghostty-org/libghostty-vt
# C (when released)
# pkg-config --cflags --libs libghostty-vt
const vt = @import("libghostty-vt");
var parser = vt.Parser.init();
var stream = vt.Stream(MyHandler).init(&parser, &handler);
// Process bytes
for (input) |byte| {
if (stream.next(byte)) |action| {
switch (action) {
.print => |cp| handler.print(cp),
.csi_dispatch => |csi| handler.handleCSI(csi),
// ...
}
}
}
Trit: +1 (PLUS) - Generator/Parser
Hue: 180° (cyan - terminal green vibes)
Triads:
libghostty-vt (+1) × vterm (0) × terminfo (-1) = 0 ✓libghostty-vt (+1) × tmux (0) × escape-sequence-validator (-1) = 0 ✓