Compatibility
Terminal compatibility and benchmarks
Which terminal sequences Wormhole supports, where support is partial, and what our recorded tests measured.
01/Overview
Compatibility at a glance
Supported behavior
- Cursor movement, scrolling regions, alternate screens and bracketed paste.
- True color, styled underlines, hyperlinks and shell integration.
- Unicode character widths and grapheme clusters, with results from ucs-detect below.
- Inline images through kitty, iTerm2 and Sixel protocols, with the limits listed alongside.
Known limits
- kitty graphics: no animation, file or shared-memory transfers, or relative placements.
- Sixel: no private palettes. Images are not restored after restarting the app.
- kitty keyboard protocol: no key-release, repeat or standalone modifier events.
- Screen checksums and window operations require opt-in settings.
The results below were recorded on October 15, 2026 using Mac17,8, Apple M5 Pro, macOS 27.0.1. Wormhole was a 1.0 pre-release build. These are results for the listed builds and settings, not measurements of the latest releases.
02/Test suites
Terminal behavior tests
esctest2 tests terminal control sequences, including cursor movement, erasing and scrolling, against xterm behavior. ucs-detect compares reported cursor positions with the widths expected by the wcwidth library. Neither suite establishes that every application or font renders correctly.
esctest2
Some esctest2 cases require screen checksums or other query responses. Cases that a terminal cannot expose to the suite are marked unmeasurable, not failed. The percentages therefore use different denominators. Use the Common cases column to compare the 323 cases measured in every completed run. Wormhole’s screen-checksum setting was enabled for this run; it is off by default. Wormhole failures by area: Reports: 2 of 30; Colors, titles, selection: 21 of 51; Window operations: 5 of 28.
The same test subset for each completed run. Bars show passed cases; interrupted runs have no score.
- Wormhole295/323
- Ghostty141/323
- Alacritty121/323
- kitty135/323
- WezTerm174/323
- iTerm2Not measured
- Terminal.app111/323
Scroll horizontally to see all columns.
| Terminal | Common cases (323) | Version | Passed | Failed | Unmeasurable | Measured | Pass rate |
|---|---|---|---|---|---|---|---|
| Wormhole | 295/323 (91.3%) | 1.0 pre-release | 538 | 28 | 0 | 566 | 95.1% |
| Ghostty | 141/323 (43.7%) | 1.3.1 | 141 | 185 | 240 | 326 | 43.3% |
| Alacritty | 121/323 (37.5%) | 0.17.0 | 121 | 215 | 230 | 336 | 36.0% |
| kitty | 135/323 (41.8%) | 0.49.2 | 135 | 194 | 237 | 329 | 41.0% |
| WezTerm | 174/323 (53.9%) | 20240203-110809-5046fc22 | 340 | 226 | 0 | 566 | 60.1% |
| iTerm2 | – | 3.7.4 | Not measured yet | – | – | – | – |
| Terminal | 111/323 (34.4%) | 2.15 | 111 | 217 | 238 | 328 | 33.8% |
October 15, 2026 · Mac17,8, Apple M5 Pro, macOS 27.0.1 · esctest2 2798f12149a1 (Thomas Dickey, GPL-2.0) · 80 x 25 cells, Menlo 13 pt · load average at the start 4.01 3.53 3.48
esctest2 query support and results by area
Scroll horizontally to see all columns.
| Terminal | cursor position (DSR 6) | DA1 | text area size (CSI 18 t) | CSI 14 t | CSI 16 t | checksum of a rectangle (DECRQCRA) | checksum form |
|---|---|---|---|---|---|---|---|
| Wormhole | Yes | Yes | Yes | Yes | Yes | Yes | positive |
| Ghostty | Yes | Yes | Yes | Yes | Yes | No | - |
| Alacritty | Yes | Yes | Yes | Yes | No | No | - |
| kitty | Yes | Yes | Yes | Yes | Yes | No | - |
| WezTerm | Yes | Yes | Yes | Yes | Yes | Yes | positive |
| iTerm2 | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| Terminal | Yes | Yes | Yes | Yes | No | No | - |
Scroll horizontally to see all columns.
| Area (tests) | Wormhole | Ghostty | Alacritty | kitty | WezTerm | Terminal |
|---|---|---|---|---|---|---|
| Cursor movement (132) | 132/132 | 75/95 | 57/104 | 72/95 | 131/132 | 67/96 |
| Erasing and editing (129) | 129/129 | 4/8 | 1/8 | 4/8 | 79/129 | 3/8 |
| Rectangular operations (32) | 32/32 | 4/4 | 3/4 | 4/4 | 8/32 | 4/4 |
| Margins (9) | 9/9 | 1/1 | 1/1 | 1/1 | 9/9 | 1/1 |
| Modes and resets (120) | 120/120 | 29/89 | 24/90 | 25/92 | 63/120 | 22/90 |
| Tabs (6) | 6/6 | 3/6 | 5/6 | 5/6 | 6/6 | 5/6 |
| Cursor save and restore (22) | 22/22 | 12/14 | 9/14 | 8/14 | 20/22 | 8/14 |
| Reports (30) | 28/30 | 5/30 | 1/30 | 4/30 | 3/30 | 0/30 |
| Colors, titles, selection (52) | 30/51 | 8/51 | 20/51 | 12/51 | 14/51 | 0/51 |
| Strings (APC, DCS, PM, SOS) (7) | 7/7 | - | - | - | 7/7 | - |
| Window operations (28) | 23/28 | 0/28 | 0/28 | 0/28 | 0/28 | 1/28 |
ucs-detect
Percentages show how often reported widths matched the suite’s expected widths. Italic rows are results published by the ucs-detect author on other machines and versions. They are reference data, not controlled comparisons with this run. WezTerm's run did not finish (no result within 1800s), so it has no row.
Scroll horizontally to see all columns.
| Terminal | wide | narrow | ZWJ emoji | VS16 | VS15 | flags (RI pairs) | lone RI | lone skin tone | languages | grapheme clustering (mode 2027) | ambiguous width | seconds |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Wormhole | 100.0% (506/506) | 100.0% (5595/5595) | 100.0% (1445/1445) | 100.0% (426/426) | 100.0% (158/158) | 100.0% (262/262) | 100.0% (26/26) | 100.0% (5/5) | 100.0% (6589/6589) | enabled | narrow | 0 |
| Ghostty | 99.8% (505/506) | 99.9% (5590/5595) | 100.0% (1445/1445) | 100.0% (426/426) | 100.0% (158/158) | 100.0% (262/262) | 100.0% (26/26) | 100.0% (5/5) | 98.4% (6485/6589) | enabled | narrow | 1 |
| Ghostty published (1.3.1-arch2, Linux) | 99.8% (505/506) | 99.9% (5524/5529) | 100.0% (1445/1445) | 100.0% (426/426) | 100.0% (158/158) | 100.0% (262/262) | 100.0% (26/26) | 100.0% (5/5) | 99.5% (6490/6522) | enabled | narrow | 7 |
| Alacritty | 94.9% (480/506) | 99.6% (5570/5595) | 0.7% (10/1445) | 50.0% (213/426) | 0.0% (0/158) | 100.0% (262/262) | 0.0% (0/26) | 100.0% (5/5) | 84.4% (5558/6589) | no | narrow | 1 |
| Alacritty published (, Linux) | 94.9% (480/506) | 99.5% (4975/5000) | 1.0% (10/1010) | 50.0% (213/426) | 0.0% (0/158) | 100.0% (262/262) | 0.0% (0/26) | 100.0% (5/5) | 85.3% (5563/6522) | no | narrow | 2 |
| kitty | 99.0% (501/506) | 99.6% (5570/5595) | 100.0% (1445/1445) | 97.9% (417/426) | 100.0% (158/158) | 100.0% (262/262) | 100.0% (26/26) | 0.0% (0/5) | 45.4% (2990/6589) | no | narrow | 47 |
| kitty published (0.48.2, Linux) | 97.8% (43587/44568) | 99.9% (36227/36254) | 100.0% (1445/1445) | 97.9% (417/426) | 100.0% (158/158) | 100.0% (262/262) | 100.0% (26/26) | 0.0% (0/5) | 79.5% (19898/25043) | no | narrow | 629 |
| iTerm2 | Not measured yet | – | – | – | – | – | – | – | – | – | – | – |
| iTerm2 published (3.7.3, Darwin) | 97.8% (43591/44568) | 100.0% (36237/36254) | 17.2% (249/1445) | 100.0% (426/426) | 0.0% (0/158) | 100.0% (262/262) | 100.0% (26/26) | 100.0% (5/5) | 93.7% (23462/25043) | no | narrow | 22377 |
| Terminal | 94.9% (480/506) | 98.3% (5500/5595) | 0.0% (0/1445) | 50.0% (213/426) | 0.0% (0/158) | 98.9% (259/262) | 0.0% (0/26) | 100.0% (5/5) | 81.0% (5334/6589) | no | narrow | 9 |
| Terminal published (488, Darwin) | 97.8% (43566/44568) | 99.7% (36159/36254) | 0.0% (0/1445) | 50.0% (213/426) | 0.0% (0/158) | 98.9% (259/262) | 0.0% (0/26) | 100.0% (5/5) | 93.4% (23400/25043) | no | narrow | 37 |
October 15, 2026 · Mac17,8, Apple M5 Pro, macOS 27.0.1 · ucs-detect 50f011d991a2 (Jeff Quast, MIT), its default run (the contested codepoints and graphemes), wcwidth 0.8.4 · 80 x 25 cells, Menlo 13 pt · load average at the start 4.01 3.53 3.48
Completed, interrupted and failed suite runs
Scroll horizontally to see all columns.
| Suite | Terminal | Result | Version | Seconds |
|---|---|---|---|---|
| esctest | Wormhole | ok | 1.0 pre-release | 87 |
| esctest | Ghostty | ok | 1.3.1 | 134 |
| esctest | Alacritty | ok | 0.17.0 | 96 |
| esctest | kitty | ok | 0.49.2 | 106 |
| esctest | WezTerm | ok | 20240203-110809-5046fc22 | 278 |
| esctest | iTerm2 | Not measured yet | 3.7.4 | – |
| esctest | Terminal.app | ok | 2.15 | 267 |
| ucs-detect | Wormhole | ok | 1.0 pre-release | 21 |
| ucs-detect | Ghostty | ok | 1.3.1 | 7 |
| ucs-detect | Alacritty | ok | 0.17.0 | 8 |
| ucs-detect | kitty | ok | 0.49.2 | 165 |
| ucs-detect | WezTerm | failed: no result within 1800s | 20240203-110809-5046fc22 | 1930 |
| ucs-detect | iTerm2 | Not measured yet | 3.7.4 | – |
| ucs-detect | Terminal.app | ok | 2.15 | 57 |
iTerm2’s suite results are excluded because permission prompts interrupted the run. Its benchmark results are included in the next section. Load average at the start: 4.01 3.53 3.48.
03/Benchmarks
Performance benchmarks
In the app
ttystorm, our benchmark tool, sends workloads to each running app and waits for terminal responses. It does not measure keypress-to-pixel latency or frames actually displayed. Higher values are better except for roundtrip, where lower is better. Wormhole led 14 of 17 workloads in this run. Other workload leaders: iTerm2 on agentstream; Alacritty on stylestorm and linkstorm.
Approximate geometric mean across the recorded workloads. The vertical marker is Terminal.app at 1×; higher scores are better. This is not a measure of typing latency.
- Wormhole≈ 6.3×
- Ghostty≈ 3.6×
- Alacritty≈ 4.8×
- kitty≈ 2.9×
- WezTerm≈ 1.2×
- iTerm2≈ 0.5×
- Terminal.app≈ 1.0×
Scroll horizontally to see all columns.
| Test | Wormhole | Ghostty | Alacritty | kitty | WezTerm | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|
| buildlogA cargo-style build log: colored lines and a progress bar redrawn in place. | 188 MB/s | 109 MB/s | 171 MB/s | 109 MB/s | 29.9 MB/s | 22.0 MB/s | 44.3 MB/s |
| agentstreamAn agent's answer in 2 to 16 byte writes, with a spinner redrawn under it. | 9.0 MB/s | 8.9 MB/s | 9.5 MB/s | 9.0 MB/s | 9.6 MB/s | 9.8 MB/s | 8.2 MB/s |
| agentredrawA coding agent's main-screen UI, a dozen styled rows redrawn in full every frame. | 90006 fps | 46689 fps | 55055 fps | 41699 fps | 14557 fps | 10415 fps | 17809 fps |
| agentscreenThe same agent's full-screen UI: many tiny positioned writes. | 201502 fps | 98994 fps | 103473 fps | 73654 fps | 33001 fps | 17536 fps | 31470 fps |
| diffscrollPaging through a colored diff in a pager. | 188 MB/s | 104 MB/s | 166 MB/s | 97.7 MB/s | 24.7 MB/s | 26.1 MB/s | 46.1 MB/s |
| editstormAn editor at work: scroll region, insert and delete lines and characters, repaints. | 189 MB/s | 114 MB/s | 180 MB/s | 90.7 MB/s | 51.4 MB/s | 17.1 MB/s | 32.7 MB/s |
| logfloodPlain log lines, like cat of a big file. | 227 MB/s | 129 MB/s | 183 MB/s | 160 MB/s | 50.1 MB/s | 68.4 MB/s | 48.1 MB/s |
| glyphstormCJK, emoji, combining marks, box drawing. | 166 MB/s | 130 MB/s | 101 MB/s | 92.4 MB/s | 9.6 MB/s | 11.5 MB/s | 25.2 MB/s |
| colorfloodEvery character with its own 24-bit foreground and background. | 272 MB/s | 97.7 MB/s | 163 MB/s | 119 MB/s | 146 MB/s | 39.0 MB/s | 3.1 MB/s |
| scrollstormLines pushed through a scroll region with reverse index. | 221 MB/s | 126 MB/s | 170 MB/s | 161 MB/s | 46.6 MB/s | 9.9 MB/s | 46.7 MB/s |
| cursorstormRandom cursor moves with short colored writes. | 192 MB/s | 111 MB/s | 175 MB/s | 105 MB/s | 36.5 MB/s | 26.2 MB/s | 21.3 MB/s |
| longlinesLines of 5 to 50 thousand characters that wrap. | 231 MB/s | 136 MB/s | 178 MB/s | 162 MB/s | 51.1 MB/s | 108 MB/s | 49.9 MB/s |
| stylestormEvery SGR attribute, densely mixed. | 143 MB/s | 85.3 MB/s | 152 MB/s | 85.2 MB/s | 54.0 MB/s | 17.9 MB/s | 25.8 MB/s |
| linkstormOSC 8 hyperlinks on short spans, thousands of distinct URLs. | 152 MB/s | 44.0 MB/s | 178 MB/s | 105 MB/s | 69.5 MB/s | 16.3 MB/s | 41.5 MB/s |
| framerateFull-screen redraws in synchronized output, in frames per second. | 1101 fps | 568 fps | 560 fps | 680 fps | 828 fps | 115 fps | 35.3 fps |
| screenswapOpening and closing a full-screen program over and over. | 28922 /s | 18251 /s | 17576 /s | 13454 /s | 4487 /s | 93.1 /s | 5491 /s |
| roundtrip1,000 cursor-report round trips on an idle terminal (lower is better). | 12 µs | 16 µs | 20 µs | 678 µs | 3785 µs | 14239 µs | 45 µs |
| Geometric mean, Terminal.app = 1× | 6.3× | 3.6× | 4.8× | 2.9× | 1.2× | 0.5× | 1.0× |
The summary is a geometric mean of relative results, with latency ratios inverted. Displayed ratios are approximate because the source table rounds its summary values. This score describes these workloads, not overall responsiveness.
App versions, settings and benchmark conditions
Scroll horizontally to see all columns.
| App | Result | Version | Grid seen | In front | Load at start |
|---|---|---|---|---|---|
| Wormhole | ok | 1.0 pre-release | 40x120 | yes | 3.90 |
| Ghostty | ok | 1.3.1 | 40x120 | yes | 3.91 |
| Alacritty | ok | 0.17.0 | 40x120 | yes | 3.87 |
| kitty | ok | 0.49.2 | 40x120 | yes | 3.81 |
| WezTerm | ok | 20240203-110809-5046fc22 | 40x120 | yes | 3.77 |
| iTerm2 | ok | 3.7.4 | 40x120 | yes | 3.61 |
| Terminal.app | ok | 2.15 | 40x120 | yes | 3.35 |
Apps ran one at a time in the foreground, without custom settings where the harness could disable them. It requested the same grid and font; iTerm2 and Terminal.app retained their profile fonts. The table records the actual grids. Wormhole was a 1.0 pre-release build. iTerm2 and Terminal.app ran later the same day.
October 15, 2026 · Mac17,8, Apple M5 Pro, macOS 27.0.1 · load average at the start 4.24 10.19 11.40 · asked for 120 x 40 cells, Menlo 13 pt (an app that can't be told from the command line has its own)
Engine throughput and memory allocations
Engine throughput
These tests feed output directly to each engine without rendering a window. Each workload contains 8 MiB each, sent in 64 KiB pieces. Results use the fastest of 5 passes. Higher throughput is better; the largest value in each row is bold. Wormhole led 7 of 9 workloads. Other workload leaders: Ghostty on unicode-mix and payloads.
Scroll horizontally to see all columns.
| MB/s | Alacritty | Wormhole | WezTerm | vt100 | Ghostty |
|---|---|---|---|---|---|
| ascii-floodPrintable ASCII with no line breaks: the terminal wraps it. | 233 | 2764 | 67 | 257 | 1800 |
| log-linesTimestamped log lines of varying length, some colored. | 248 | 1528 | 66 | 241 | 1207 |
| sgr-churn256-color and true-color foregrounds and backgrounds, attributes and underline styles changing every few characters. | 232 | 379 | 49 | 253 | 165 |
| unicode-mixCJK, emoji (ZWJ, flags, skin tones, VS16), combining marks and box drawing among ASCII. | 207 | 330 | 70 | 212 | 414 |
| tui-redrawA full-screen program redrawing with cursor addressing on the alternate screen. | 244 | 754 | 42 | 210 | 465 |
| scroll-regionOutput scrolling inside scroll regions with IL, DL, SU, SD and RI. | 212 | 809 | 57 | 220 | 648 |
| osc8-linksOSC 8 hyperlinks, titles, working directories and prompt marks. | 191 | 469 | 70 | 299 | 27 |
| payloadsLong OSC, DCS and APC strings (kitty graphics chunks, Sixel, clipboard) between lines of text. | 422 | 569 | 291 | 389 | 1008 |
| agent-sessionA coding agent's session: streamed markdown, spinners, diffs, boxes, progress bars, an image. | 320 | 534 | 71 | 353 | 231 |
| vs the first engine | 1.00x | 2.85x | 0.29x | 1.06x | 1.62x |
Allocation counts show allocator calls per megabyte on the first and second passes. They do not measure stuttering or total memory use. Wormhole recorded zero calls on the second pass for 5 of 9 workloads; Ghostty did so for 6. Ghostty’s direct memory mappings are not included, so the counts do not cover the same allocation mechanisms for every engine.
Scroll horizontally to see all columns.
| Calls per MB | Alacritty | Wormhole | WezTerm | vt100 | Ghostty |
|---|---|---|---|---|---|
| ascii-flood | 1193 / 0 | 19 / 0 | 25211 / 25214 | 12499 / 12500 | 0 / 0 |
| log-lines | 1193 / 0 | 56 / 0 | 29234 / 29238 | 11165 / 11168 | 0 / 0 |
| sgr-churn | 2810 / 1617 | 173 / 0 | 467143 / 490230 | 13381 / 13383 | 0 / 0 |
| unicode-mix | 18075 / 16882 | 1212 / 50 | 49829 / 49832 | 10319 / 10320 | 0 / 0 |
| tui-redraw | 0 / 0 | 1 / 0 | 112 / 77 | 5 / 0 | 1 / 0 |
| scroll-region | 119 / 0 | 0 / 0 | 48625 / 48635 | 21633 / 21633 | 0 / 0 |
| osc8-links | 71995 / 70802 | 13806 / 13560 | 285969 / 285972 | 8306 / 8308 | 18912 / 18908 |
| payloads | 687 / 566 | 1673 / 1641 | 6356 / 6374 | 160 / 162 | 483 / 483 |
| agent-session | 4324 / 3131 | 1421 / 1210 | 35370 / 36211 | 4298 / 4300 | 1301 / 1301 |
October 15, 2026 · Mac17,8, Apple M5 Pro, macOS 27.0.1 · aarch64, 18 cores · load average at the start 3.89 11.22 11.83
Background load, settings and benchmark variation can affect both values and rankings. The results shown here do not include confidence intervals.
04/Engine tests
Engine tests: 758 of 758 passed
We wrote these tests while developing Wormhole. They are useful regression checks, but they are not an independent assessment of compatibility. 655 cases follow published specifications; 103 cover behavior we chose where the documentation did not specify an outcome.
The references include xterm, DEC manuals, ECMA-48, Unicode and individual protocol specifications. Each engine runs as a library without its app or renderer. n/a means the test cannot be applied through that engine’s interface; it is not counted as a failure.
Results by area and engine versions
Scroll horizontally to see all columns.
| Area | Cases | Wormhole | Ghostty | WezTerm | Alacritty | vt100 |
|---|---|---|---|---|---|---|
| altscreen | 17 | 17/17 | 16/17 | 16/17 | 13/17 | 11/17 |
| charsets | 44 | 44/44 | 22/44 | 16/44 | 13/44 | 5/41 (+3 n/a) |
| checksum | 17 | 17/17 | 2/17 | 2/17 | 2/17 | 0/0 (+17 n/a) |
| conformance-levels | 14 | 14/14 | 1/14 | 2/14 | 0/14 | 0/4 (+10 n/a) |
| cursor | 56 | 56/56 | 55/56 | 53/56 | 45/56 | 41/56 |
| edit | 33 | 33/33 | 27/33 | 23/33 | 22/33 | 17/33 |
| erase | 31 | 31/31 | 30/31 | 19/31 | 18/31 | 17/31 |
| graphics | 11 | 11/11 | 10/11 | 5/11 | 5/11 | 4/8 (+3 n/a) |
| margins | 31 | 31/31 | 23/31 | 25/31 | 5/31 | 5/31 |
| modes | 13 | 13/13 | 10/13 | 9/13 | 9/13 | 6/6 (+7 n/a) |
| origin | 12 | 12/12 | 12/12 | 12/12 | 9/12 | 8/11 (+1 n/a) |
| osc | 29 | 29/29 | 22/29 | 20/29 | 26/29 | 8/11 (+18 n/a) |
| parser | 27 | 27/27 | 26/27 | 24/27 | 25/27 | 25/27 |
| rect-attributes | 45 | 45/45 | 8/45 | 8/45 | 9/45 | 10/34 (+11 n/a) |
| rect | 56 | 56/56 | 15/56 | 15/56 | 15/56 | 15/55 (+1 n/a) |
| reports | 70 | 70/70 | 47/70 | 33/70 | 30/70 | 1/1 (+69 n/a) |
| reset | 22 | 22/22 | 22/22 | 19/22 | 14/22 | 14/20 (+2 n/a) |
| resize | 12 | 12/12 | 11/12 | 11/12 | 11/12 | 4/12 |
| save-restore | 16 | 16/16 | 14/16 | 15/16 | 14/16 | 9/14 (+2 n/a) |
| scroll | 28 | 28/28 | 27/28 | 28/28 | 28/28 | 21/28 |
| sgr | 65 | 65/65 | 65/65 | 65/65 | 62/65 | 42/46 (+19 n/a) |
| tabs | 23 | 23/23 | 23/23 | 22/23 | 21/23 | 10/23 |
| unicode | 52 | 52/52 | 46/52 | 20/52 | 29/52 | 26/50 (+2 n/a) |
| window | 12 | 12/12 | 3/12 | 3/12 | 3/12 | 0/0 (+12 n/a) |
| wrap | 22 | 22/22 | 21/22 | 19/22 | 19/22 | 14/22 |
| all | 758 | 758/758 | 558/758 | 484/758 | 447/758 | 313/581 (+177 n/a) |
| spec | 655 | 655/655 | 470/655 | 411/655 | 378/655 | 267/491 (+164 n/a) |
| convention | 103 | 103/103 | 88/103 | 73/103 | 69/103 | 46/90 (+13 n/a) |
October 15, 2026 · Mac17,8, Apple M5 Pro, macOS 27.0.1
The engines
- Wormhole: Wormhole engine used in this test run
- Ghostty: libghostty-vt @ad97d331 (Ghostty's terminal)
- WezTerm: wezterm-term @e2a98e1b (WezTerm's terminal model)
- Alacritty: alacritty_terminal 0.26.0
- vt100: vt100 0.16.2
WezTerm's engine runs with its default settings, as in the app. Alacritty's engine is the one Wormhole used until 1.0.
05/Protocol reference
Terminal protocol reference
05.01/7 features
Cursor and text
Cursor positioning, tab stops, wrapping and saved cursor state.
Related development tests: 56 cursor, 12 origin, 22 wrap, 23 tabs, 16 save-restore, 27 parser cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Cursor movement | CUU CUD CUF CUB CNL CPL CHA CUP VPA VPR HPR HPA HVP | Yes | |
| Index, reverse index, next line | IND NEL RI HTS DECBI DECFI | Yes | |
| Save and restore the cursor | DECSC DECRC SCOSC SCORC | Yes | CSI s is DECSLRM instead while margins are on. |
| Tab stops | HT CHT CBT TBC DECST8C | Yes | |
| Origin mode, autowrap, reverse wrap | modes 6, 7, 41, 45, 1045 | Yes | |
| Cursor shape and blink | DECSCUSR, modes 12, 25 | Yes | Block, bar or underline, blinking or not. |
| Screen alignment test | DECALN | Yes |
05.02/4 features
Erase, insert and delete
Sequences for clearing cells, inserting text and deleting lines or columns.
Related development tests: 31 erase, 33 edit cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Erase and edit | ED EL ECH ICH DCH IL DL SU SD REP | Yes | ED 3 clears scrollback. On the main screen, ED 2 moves non-empty lines into scrollback before clearing, unless immediately preceded by ED 3. |
| Selective erase and protection | DECSED DECSEL DECSCA | Yes | Erases skip protected cells. |
| Insert and delete columns | DECIC DECDC | Yes | |
| Guarded areas | SPA EPA | Yes | ED, EL and ECH preserve cells written between SPA and EPA. |
05.03/3 features
Scrolling and margins
Vertical scroll regions and left and right margins.
Related development tests: 28 scroll, 31 margins cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Scrolling region | DECSTBM | Yes | |
| Left and right margins | DECLRMM (mode 69), DECSLRM | Yes | Scrolling, insert and delete, and wrapping stay inside them. |
| Shift columns | SL SR | Yes | Shifts columns within the margins on each line of the scroll region. Newly exposed cells use the current background color. |
05.04/5 features
Rectangular editing
Operations on rectangular screen areas, including attribute changes and checksums.
Related development tests: 56 rect, 45 rect-attributes, 17 checksum cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Erase a rectangle | DECERA DECSERA | Yes | DECSERA leaves protected cells alone. |
| Fill a rectangle | DECFRA | Yes | |
| Copy a rectangle | DECCRA | Partial | Only pages 0 and 1 are accepted. Other source or destination pages are ignored. |
| Change or reverse attributes in an area | DECCARA DECRARA DECSACE | Partial | Bold, underline, blink, negative and hidden; other attributes are ignored. |
| Checksum of a rectangle | DECRQCRA | Opt-in | Enable in Settings → Terminal → Privacy. Screen-checksum queries can reveal terminal contents to local or remote programs. Some test suites require them. |
05.05/11 features
Modes
Terminal modes that programs can set, reset and query.
Related development tests: 13 modes, 17 altscreen, 22 reset, 12 resize, 14 conformance-levels cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Alternate screen | modes 47, 1047, 1048, 1049 | Yes | Each screen keeps its own pictures and keyboard flags. |
| Bracketed paste | mode 2004 | Yes | |
| Synchronized output | mode 2026 | Yes | An unfinished synchronized update times out rather than leaving output hidden indefinitely. |
| Application cursor keys and keypad | modes 1, 66, 67 | Yes | |
| Reverse video, insert, new line | modes 5, ANSI 4, ANSI 20 | Yes | |
| 132 columns | DECCOLM, modes 3, 40, 95 | Partial | Clears the screen and moves the cursor home without changing the pane’s column count. |
| Save and restore modes | XTSAVE XTRESTORE | Yes | |
| Soft and full reset | DECSTR, RIS | Yes | RIS clears program status records; a soft reset preserves them. |
| Conformance level | DECSCL | Yes | VT100 through VT500 levels. The selected level changes DA1 and DA2 replies and disables capabilities from higher levels. |
| 7-bit and 8-bit controls | S7C1T S8C1T | Yes | Replies use 8-bit control characters when requested. |
| Recorded, with no effect | modes 4, 8, 9, 1010, 1011, 1015, 1016, 1036, 1039, 1042, 1070, 2031, and the VT510's set-up modes | No | Set and reset are remembered and DECRQM reports them; nothing changes. Modes 60, 1001, 1034, 1035, 1037 and 1038 report as permanently reset. |
05.06/11 features
Reports and queries
Responses to queries about cursor position, terminal state and supported capabilities.
Related development tests: 70 reports, 12 window cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Device attributes and version | DA1 DA2 DA3 XTVERSION | Yes | DA1 answers as a VT520: Sixel, selective erase, rectangular editing, the locator, color and clipboard access. |
| Status and cursor position | DSR 5, 6, ?6 and the other ? reports | Yes | |
| Mode reports | DECRQM | Yes | ANSI and DEC private modes. |
| Setting reports | DECRQSS | Yes | SGR, margins, cursor style, protection, conformance level, rows and columns, attribute extent. |
| Terminfo capabilities | XTGETTCAP | Partial | Reports a limited set: names, colors, true color, underline styles, bracketed paste, focus reports and synchronized output. Other capabilities receive a negative response. |
| Sixel graphics attributes | XTSMGRAPHICS | Yes | 256 color registers, the screen's size in pixels. |
| Terminal state reports | DECRQPSR DECRQTSR DECRQDE | Yes | Cursor information, tab stops, the terminal state and the displayed extent, from the VT300 and VT400 levels. |
| Window state and size reports | CSI 11 t, 13 t to 16 t, 18 t, 19 t | Yes | State, position, text area and screen in pixels, cell size, text area in cells, and the largest it could be. |
| Push and pop the title | CSI 22 t, 23 t | Yes | Kept per terminal. |
| Title reports | CSI 20 t, 21 t | Opt-in | Answered only when window operations are allowed. A title is text the previous program chose, and the answer would land in the next program's input. |
| Window movement, resizing, minimizing and full screen | XTWINOPS, DECSLPP, DECSNLS, DECCOLM | Opt-in | Enable in Settings → Terminal → Privacy. Local and remote programs can then move or resize the window. Cell-size requests resize the window to fit the requested pane dimensions. |
05.07/3 features
Character sets
Box-drawing characters and the older national character sets some programs still use.
Related development tests: 44 charsets cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| ASCII, UK, DEC special graphics, Technical and Supplemental, Latin-1 | ESC ( ) * + - . / with B, A, 0, >, % 5 | Yes | G0 to G3; locking and single shifts invoke them. |
| National replacement sets | DECNRCM (mode 42), SCS | Yes | The eleven VT200 national replacement sets, as listed in the VT510 manual. Designation requires DECNRCM. |
| Right-hand set (GR) and the VT500's Greek, Hebrew, Turkish and Cyrillic | LS1R LS2R LS3R | No | The GR designation is stored and reported by DECCIR but is not used to render UTF-8 input. |
05.08/6 features
Color and text style
Text attributes, indexed and true color, and underline styles.
Related development tests: 65 sgr cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Bold, dim, italic, underline, inverse, hidden, strikethrough | SGR 1 2 3 4 7 8 9 | Yes | |
| 16, 256 and true color | SGR 30–37 38 48 90–107, with ; or : | Yes | |
| Underline styles | SGR 4:0 to 4:5, 21 | Yes | None, single, double, curly, dotted, dashed. |
| Underline color | SGR 58, 59 | Yes | |
| Overline | SGR 53, 55 | Yes | In the underline color when one is set. |
| Blink | SGR 5, 6 | Partial | Text fades once a second; rapid and slow blink are identical. Text stays steady in background windows or with Reduce Motion enabled. Underlines and overlines do not blink. |
05.09/10 features
Titles, folders, links and clipboard
Window titles, the current folder, clickable links, copy and paste, notifications.
Related development tests: 29 osc cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Window title | OSC 0, OSC 2 | Yes | The terminal's name in its row, until it is renamed. |
| Current folder | OSC 7, OSC 9;9 | Yes | A host other than this Mac, or a folder that isn't there, is ignored. |
| Hyperlinks | OSC 8 | Yes | Web and mail links open with ⌘-click, a file: link on this Mac shows in the Finder, any other scheme is left alone. |
| Clipboard | OSC 52 | Yes | Programs can write to the clipboard and query its contents. |
| Notifications | OSC 9, OSC 99, OSC 777 | Yes | Under the app's notification settings. Chunked OSC 99 is joined. |
| Progress | OSC 9;4 | Partial | Parsed and stored per terminal, but not displayed. |
| Prompt marks | OSC 133 A B C D | Yes | Command blocks, exit codes, busy or at the prompt. |
| Set, query and reset colors | OSC 4, 5, 10–19, 104, 105, 110–119 | Yes | Overrides theme colors for the current terminal until reset. Queries return the active color. Named colors and CIE color formats are not supported. |
| Program status | OSC 7501 | Yes | Wormhole's own protocol: idle, working, blocked, done or error becomes the terminal's status. |
| Pointer shape, systemd context, iTerm2 badges and marks | OSC 22, OSC 3008, OSC 1337 other than File=, OSC 21337 | No | Ignored. |
05.10/4 features
Graphics
Inline images using kitty, Sixel and iTerm2 protocols. Support differs by protocol.
Related development tests: 11 graphics cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| kitty graphics | APC G | Partial | Direct transfers (RGB, RGBA, PNG; zlib; chunked), placements with size and crop, deleting, queries, virtual placements with Unicode placeholders. Not supported: animation, file or shared-memory transfers, and relative placements. |
| Sixel | DCS q, modes 80, 8452 | Partial | RGB and HLS colors, repeats, bands, raster attributes. Always starts with the VT340's colors: private palettes (mode 1070) are not read. ReGIS is not read. |
| iTerm2 inline images | OSC 1337 File= | Yes | PNG, JPEG, GIF's first frame; the multipart form. A file without inline=1 is a download, which the terminal does not do. |
| Limits on pictures | Yes | Pictures are untrusted input: at most 10,000 pixels on a side and 16 million per image, 32 MiB per command, 1,024 images in 128 MiB per terminal. A restored session brings back its text, not its pictures. |
05.11/9 features
Unicode
Character widths and grapheme handling, using Unicode 18 data. Percentages below describe the recorded ucs-detect cases.
Related development tests: 52 unicode cases.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| Wide characters | East Asian Width | Yes | ucs-detect: 100.0% (506/506). |
| Narrow characters and combining marks | Yes | ucs-detect: 100.0% (5595/5595). | |
| Invalid UTF-8 | Yes | One U+FFFD per maximal subpart; a character split between two reads is joined. | |
| Grapheme clusters | mode 2027 | Yes | On from the start. CSI ? 2027 l turns it off for a program that counts code points; CSI ? 2027 $ p reports it. |
| ZWJ emoji | Yes | ucs-detect: 100.0% (1445/1445). | |
| Emoji presentation (VS16) | U+FE0F | Yes | ucs-detect: 100.0% (426/426). |
| Text presentation (VS15) | U+FE0E | Yes | ucs-detect: 100.0% (158/158). |
| Flags (regional indicator pairs) | Yes | ucs-detect: 100.0% (262/262). | |
| Scripts and languages | Yes | ucs-detect: 100.0% (6589/6589). |
05.12/7 features
Keyboard and mouse
How your keys, mouse, scroll wheel and pastes reach the program.
Scroll horizontally to see all columns.
| Feature | Sequence | Status | Notes |
|---|---|---|---|
| kitty keyboard protocol | CSI > u, < u, = u, ? u | Partial | Key encoding follows the flags requested by the program, with a separate stack per screen. Key-release, repeat and standalone modifier events are not sent. |
| DEC locator | DECELR DECSLE DECRQLP DECEFR | Yes | The mouse as a locator, for programs that ask for it. It replaces the xterm mouse reports while on. |
| Mouse click, drag and motion | modes 1000, 1002, 1003 | Yes | |
| UTF-8 and SGR mouse coordinates | modes 1005, 1006 | Yes | |
| Urxvt and pixel mouse coordinates, X10 mouse | modes 1015, 1016, 9 | No | Recorded and reported by DECRQM, with no effect. |
| Focus reports | mode 1004 | Yes | |
| Alternate scroll | mode 1007 | Yes | The wheel sends arrow keys on the alternate screen. |
06/Terminal comparison
Terminal comparison
Unknown means we couldn't find it documented either way (we checked on October 15, 2026), not that it's missing. Terminal.app’s column uses only our measurements. iTerm2’s interrupted suite runs are marked Unknown. Documentation entries were checked on that date and may differ from current releases.
Scroll horizontally to see all columns.
| Feature | Wormhole | Ghostty | kitty | WezTerm | iTerm2 | Alacritty | Terminal |
|---|---|---|---|---|---|---|---|
| kitty graphics protocol | PartialNo animation, files or shared memory. | YesSource | YesSource | Unknown | YesSource | Unknown | Unknown |
| Sixel | PartialNo private palettes. | Unknown | Unknown | Unknown | Unknown | Unknown | |
| iTerm2 inline images | Yes | Unknown | Unknown | YesSource | YesSource | Unknown | Unknown |
| Hyperlinks (OSC 8) | Yes | YesSource | YesSource | YesSource | YesSource | YesSource | Unknown |
| Clipboard (OSC 52) | Yes | YesSource | Unknown | Unknown | YesSource | Unknown | |
| kitty keyboard protocol | PartialNo key-release, repeat or standalone modifier events. | YesSource | YesSource | YesSource | YesSource | Unknown | |
| Synchronized output (mode 2026) | Yes | Unknown | YesSource | Unknown | YesSource | Unknown | |
| Grapheme clusters (mode 2027)Measured in this run | YesOn by default. | YesOn by default. | Noucs-detect finds no mode 2027. | UnknownNot measured: failed, no result within 1800s. | UnknownNot measured yet. | Noucs-detect finds no mode 2027. | Noucs-detect finds no mode 2027. |
| Desktop notifications | YesOSC 9, 99, 777. | Unknown | Unknown | ||||
| Prompt marks (OSC 133) | Yes | Unknown | Unknown | YesSource | YesSource | Unknown | Unknown |
| Progress (OSC 9;4) | PartialParsed but not displayed. | YesSource | Unknown | Unknown | Unknown | Unknown | Unknown |
| Underline styles and colors | Yes | Unknown | YesSource | YesSource | Unknown | ||
| ZWJ emoji widths (ucs-detect)Measured in this run | Yes100.0% (1445/1445) | Yes100.0% (1445/1445) | Yes100.0% (1445/1445) | UnknownNot measured: failed, no result within 1800s. | UnknownNot measured yet. | Partial0.7% (10/1445) | No0.0% (0/1445) |
| Emoji presentation (VS16)Measured in this run | Yes100.0% (426/426) | Yes100.0% (426/426) | Partial97.9% (417/426) | UnknownNot measured: failed, no result within 1800s. | UnknownNot measured yet. | Partial50.0% (213/426) | Partial50.0% (213/426) |
| Flags (regional indicators)Measured in this run | Yes100.0% (262/262) | Yes100.0% (262/262) | Yes100.0% (262/262) | UnknownNot measured: failed, no result within 1800s. | UnknownNot measured yet. | Yes100.0% (262/262) | Partial98.9% (259/262) |
| Screen checksums (DECRQCRA)Measured in this run | YesOff by default: an opt-in setting. | No | No | Yes | UnknownNot measured yet. | No | No |
| Text-area size (CSI 18 t)Measured in this run | Yes | Yes | Yes | Yes | UnknownNot measured yet. | Yes | Yes |