Terminal emulator comparison

Unicode, VT sequence and GUI feature support across terminal emulators — measured, not asserted. Every number below is reproduced by the harness in this repository.

Generated 2026-07-19 21:03:50 +0200 · ucs-detect pinned at ea4510a4bc6e + 0001-vs15-must-not-narrow.patch.

A note on VS15

Variation Selector-15 (U+FE0E) selects text presentation. Per terminal-unicode-core it must not change a grapheme cluster's width: VS16 may promote a cluster to two columns, but VS15 may not shrink one back. The asymmetry is mechanical — a terminal reaches the selector only after the base character has been placed and the cursor advanced, so giving a column back means un-wrapping a line that has already wrapped, or un-scrolling content that has already left the screen.

The upstream ucs-detect VS15 test expected the opposite, scoring a conforming terminal at 0%. This repository pins a patched oracle that expects the base character's own width. Measured against xterm, which has no grapheme-clustering mode and can only report the unchanged width, the correction moves the score from 0/158 to 158/158.

How this was produced

TerminalVersionPlatformDisplayRanRun time
Contour0.7.0-lead-out-aef659b5linuxx1132.0s
kitty0.47.1linuxx11172.1s
Ghostty1.3.1linuxx118.0s
WezTermwezterm 20260716_195552_76b606eclinuxx1153.0s
Konsole26.04.3linuxx115.5s
GNOME Terminal (VTE)3.60.0linuxx1166.0s
Alacritty0.17.0linuxx115.5s
Rio0.4.10linuxx117.0s
xterm406linuxx116.0s
foot1.27.0linuxwayland7.0s

Not measured here

TerminalWhy
Windows TerminalWindows only. Run the harness on Windows to fill this row.
MinttyCygwin/MSYS2 on Windows. Run the harness there to fill this row.
iTerm2macOS only. Driven through AppleScript; run the harness on macOS.
Terminal.appmacOS only. Driven through AppleScript; run the harness on macOS.

These rows are filled by running the same harness on macOS or Windows and committing the results.

Unicode support (measured)

Share of measurements whose cursor advance matched the expected column width. Higher is better.

TerminalWideNarrowVS16VS15ZWJFlags (RI)Lone RISkin toneOverall
Contour100.0%100.0%100.0%100.0%100.0%100.0%100.0%100.0%100.0%
Ghostty99.8%100.0%100.0%0.0%100.0%100.0%100.0%100.0%94.7%
kitty100.0%87.7%97.9%0.0%100.0%100.0%100.0%100.0%93.7%
Konsole72.7%93.0%100.0%100.0%96.0%100.0%100.0%100.0%93.1%
foot94.9%93.0%100.0%0.0%100.0%100.0%0.0%100.0%92.6%
WezTerm94.9%92.5%50.0%100.0%100.0%100.0%0.0%100.0%90.7%
Rio94.9%93.0%100.0%10.8%0.0%100.0%0.0%100.0%45.2%
xterm94.9%95.7%50.0%100.0%0.7%100.0%0.0%100.0%43.3%
Alacritty94.9%87.2%50.0%100.0%0.7%100.0%0.0%100.0%42.8%
GNOME Terminal (VTE)54.9%93.0%50.0%100.0%0.7%100.0%0.0%100.0%36.5%

Capabilities (measured by probe)

Answered by the terminal during the run. A dash can mean not supported, not enabled by default, or the probe asked the wrong question; caveats follow the table.

CapabilityContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxterm
Sixel graphics
Kitty graphics protocol
Kitty keyboard protocol????
Kitty clipboard (OSC 5522)
Kitty notifications
Kitty pointer shapes (OSC 22)
OSC 52 clipboard
Styled underlines (CSI 4:x)
Underline colour (SGR 58)
DECRQSS (request selection or setting)
DECRQCRA (checksum of rectangular area)

Caveats

DEC private modes (DECRQM)

n/a marks a terminal that answers no DECRQM at all, which is a fact about it rather than a gap in the measurement: Konsole can set and reset modes but never report one, so no mode row can be filled in for it by query. The documented matrix below covers those features instead.

ModeContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxterm
2027 Grapheme clusteringn/a
2026 Synchronized outputn/a
2048 In-band resize notificationn/a
2004 Bracketed pasten/a
1049 Alternate screen buffern/a
7 Auto-wrap (DECAWM)n/a

Mouse reporting modes (DECRQM)

ModeContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxterm
9 X10 compatibility mouse reportingn/a
1000 VT200 mouse — report button press and releasen/a
1001 Highlight mouse trackingn/a
1002 Button-event tracking (motion while pressed)n/a
1003 Any-event tracking (motion always)n/a
1004 Focus in/out eventsn/a
1005 UTF-8 extended coordinatesn/a
1006 SGR extended coordinatesn/a
1007 Alternate-scroll moden/a
1015 urxvt extended coordinatesn/a
1016 SGR-pixel coordinatesn/a
2029 Passive mouse tracking (Contour extension)
Lets an application receive mouse position without taking the mouse away from the user's selection. Contour's own extension; no other terminal implements it yet.
n/a

What DECRQM cannot answer (measured by probe)

Page memory, the DEC locator, right-to-left cursor movement and Glyph Protocol are not DEC private modes, so DECRQM cannot answer for them. These rows come from harness/vt_probe.py, which uses the sequence inside the terminal and reads the reply.

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxterm
DECXCPR (extended cursor position report)
Reports a page number
DEC page memory (more than one page)
Pages reached15111111111
NP / PP (next and preceding page)
DEC locator (DECELR / DECRQLP)
Locator reports a position
Glyph Protocol
Glyph payload formats acceptedglyf, colrv0, colrv1
Glyph registration is stored
DECRLM actually moves the cursor leftwards

Caveats

Every DEC private mode any terminal supports

105 modes, collected from the measurements rather than a hand-kept list. Modes that no terminal recognised are omitted.

ModeContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxterm
1 Cursor Keys Moden/a
2 ANSI/VT52 Moden/a
3 Column Moden/a
4 Scrolling Moden/a
5 Screen Mode (light or dark screen)n/a
6 Origin Moden/a
7 Auto Wrap Moden/a
8 Auto Repeat Moden/a
9 Interlace Mode / Mouse X10 trackingn/a
10 Editing Mode / Show toolbar (rxvt)n/a
12 Katakana Shift Mode / Blinking cursor (xterm)n/a
13 Space Compression/Field Delimiter Mode / Start blinking cursor (xterm)n/a
14 Transmit Execution Mode / Enable XOR of blinking cursor control (xterm)n/a
18 Print Form Feedn/a
19 Printer Extentn/a
25 Text Cursor Enable Moden/a
30 Show scrollbar (rxvt)n/a
34 Cursor Right to Left Moden/a
35 Hebrew (Keyboard) Mode / Enable font-shifting functions (rxvt)n/a
36 Hebrew Encoding Moden/a
38 Tektronix 4010/4014 Moden/a
40 Carriage Return/New Line Mode / Allow 80⇒132 mode (xterm)n/a
41 Unidirectional Print Mode / more(1) fix (xterm)n/a
42 National Replacement Character Set Moden/a
44 Graphics Print Color Mode / Turn on margin bell (xterm)n/a
45 Graphics Print Color Syntax / Reverse-wraparound mode (xterm)n/a
46 Graphics Print Background Mode / Start logging (xterm)n/a
47 Graphics Rotated Print Mode / Use Alternate Screen Buffer (xterm)n/a
57 Greek/N-A Keyboard Mapping Moden/a
59 Kanji/Katakana Display Moden/a
61 Vertical Cursor Coupling Moden/a
64 Page Cursor Coupling Moden/a
66 Numeric Keypad Moden/a
67 Backarrow Key Moden/a
68 Keyboard Usage Moden/a
69 Vertical Split Screen Mode / DECLRMM - Left Right Margin Moden/a
73 Transmission Rate Limitingn/a
80 Sixel Display Moden/a
81 Key Position Moden/a
95 No Clearing Screen on Column Change Moden/a
96 Right to Left Copy Moden/a
97 CRT Save Moden/a
98 Auto Resize Moden/a
99 Modem Control Moden/a
100 Auto Answerback Moden/a
101 Conceal Answerback Message Moden/a
102 Ignore Null Moden/a
103 Half Duplex Moden/a
104 Secondary Keyboard Language Moden/a
106 Overscan Moden/a
112 Review Previous Lines Moden/a
1000 Send Mouse X & Y on button pressn/a
1001 Use Hilite Mouse Trackingn/a
1002 Use Cell Motion Mouse Trackingn/a
1003 Use All Motion Mouse Trackingn/a
1004 Send FocusIn/FocusOut eventsn/a
1005 Enable UTF-8 Mouse Moden/a
1006 Enable SGR Mouse Moden/a
1007 Enable Alternate Scroll Moden/a
1010 Scroll to bottom on tty outputn/a
1011 Scroll to bottom on key pressn/a
1014 Enable fastScroll resourcen/a
1015 Enable urxvt Mouse Moden/a
1016 Enable SGR Mouse PixelModen/a
1021 Bold/italic implies high intensityn/a
1034 Interpret "meta" keyn/a
1035 Enable special modifiers for Alt and NumLock keysn/a
1036 Send ESC when Meta modifies a keyn/a
1037 Send DEL from the editing-keypad Delete keyn/a
1039 Send ESC when Alt modifies a keyn/a
1040 Keep selection even if not highlightedn/a
1041 Use the CLIPBOARD selectionn/a
1042 Enable Urgency window manager hint when Control-G is receivedn/a
1043 Enable raising of the window when Control-G is receivedn/a
1044 Reuse the most recent data copied to CLIPBOARDn/a
1045 Extended Reverse-wraparound mode (XTREVWRAP2)n/a
1046 Enable switching to/from Alternate Screen Buffern/a
1047 Use Alternate Screen Buffern/a
1048 Save cursor as in DECSCn/a
1049 Save cursor as in DECSC and use alternate screen buffern/a
1050 Set terminfo/termcap function-key moden/a
1051 Set Sun function-key moden/a
1060 Set legacy keyboard emulation, i.e, X11R6n/a
1061 Set VT220 keyboard emulationn/a
1070 Use private color registers for each graphicn/a
1243 Arrow keys swapping (BiDi)n/a
2001 Enable readline mouse button-1n/a
2002 Enable readline mouse button-2n/a
2003 Enable readline mouse button-3n/a
2004 Set bracketed paste moden/a
2005 Enable readline character-quotingn/a
2006 Enable readline newline pastingn/a
2026 Synchronized Outputn/a
2027 Grapheme Clusteringn/a
2028 Text reflown/a
2029 Passive Mouse Trackingn/a
2030 Report grid cell selectionn/a
2031 Color palette updatesn/a
2048 In-Band Window Resize Notificationsn/a
2500 Mirror box drawing charactersn/a
2501 BiDi autodetectionn/a
5522 Bracketed Paste MIMEn/a
8452 Sixel scrolling leaves cursor to right of graphicn/a
9001 win32-input-moden/a
737769 Input Method Editor (IME) mode???n/a????

Modes a terminal declares but does not honour

DECRQM reports what a terminal recognises; a functional probe reports what it does. Where this report has both for the same feature, the two are compared. A terminal listed here answers a mode query affirmatively and then does not act on the mode — the one failure a mode query cannot detect by construction, and worse for an application than an honest “not recognised”, because there is nothing left to test.

ModeTerminalDECRQM saysBehaviour
34 DECRLM (right-to-left mode)Contour

Where measurement and documentation disagree

9 of the features covered by both a runtime probe and the documented matrix disagree. Every case runs the same way — the source says yes, the running terminal says no — and each has a reason worth knowing. Some are shipped disabled: xterm and Alacritty gate OSC 52 behind a setting. The rest are implemented but not advertised: the underline probes ask XTGETTCAP, and VTE, Konsole, Alacritty and Rio draw styled or coloured underlines perfectly well without answering the capability query. Two former entries are gone because the harness now launches xterm correctly — Sixel is gated on its graphics ID and DECRQCRA on a window-op permission, neither of which is a conformance level. Where they still differ, the documented column is the better guide to what the terminal can do, and the measured column to what it will admit to.

FeatureTerminalMeasuredDocumented
OSC 52 clipboard set/queryAlacritty
OSC 52 clipboard set/queryxterm
SGR 58/59 underline colorKonsole
SGR 58/59 underline colorGNOME Terminal (VTE)
SGR 58/59 underline colorAlacritty
SGR 58/59 underline colorRio
Extended underline styles via CSI 4:Ps m (curly/dotted/dashed/double)Konsole
Extended underline styles via CSI 4:Ps m (curly/dotted/dashed/double)GNOME Terminal (VTE)
Extended underline styles via CSI 4:Ps m (curly/dotted/dashed/double)Alacritty

VT sequences and extensions (documented)

Compiled from each terminal's source tree and documentation rather than measured, so it also covers terminals this machine cannot run. Where a row overlaps the measured tables above -- the DEC mode rows especially -- the two were derived independently and can be read against each other.

colors

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
24-bit true color (SGR 38;2 / 48;2)
CSI 38;2;r;g;b m / CSI 48;2;r;g;b m
Universal among actively-developed terminals; the only real variance historically was VTE's early days, long since resolved.
?
OSC 4/10/11 dynamic palette, foreground, background color (set + query)
OSC 4;i;spec ST | OSC 10;spec ST | OSC 11;spec ST (spec="?" queries)
Konsole marked partial: OSC 4 (256-color palette) set+query is implemented, but OSC 10/11 (dynamic default foreground/background) is not wired to any handler in the source tree -- Konsole's colors are controlled only via profiles, not by these two escapes specifically.
~?
DECSCUSR set cursor style
CSI Ps SP q
Universally supported; DECSCUSR is a VT520-era sequence that xterm adopted early and every modern terminal has followed.
?
Extended underline styles via CSI 4:Ps m (curly/dotted/dashed/double)
CSI 4:0m none, 4:1m single, 4:2m double, 4:3m curly, 4:4m dotted, 4:5m dashed
Originated informally (kitty/VTE coordinated on the CSI 4:Ps encoding), now adopted almost everywhere except xterm, which deliberately keeps its SGR set minimal.
?
SGR 58/59 underline color
CSI 58:2::r:g:b m (set) / CSI 58:5:idx m (256-color) / CSI 59 m (reset)
Rarer than curly underline but still widely adopted; xterm is again the notable holdout. Konsole's implementation (setULColor) predates most others.
?

graphics

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Sixel graphics
DCS Pmacro ; Pback ; Pgrid q ... sixel-data ST
GNOME Terminal/VTE support is real but opt-in at build time, so most distro binaries ship without it. Kitty and Ghostty deliberately do not implement Sixel, favoring their own graphics protocols; Alacritty's maintainers have repeatedly declined graphics support.
~?
iTerm2 inline images (OSC 1337 File=)
OSC 1337 ; File = [args] : base64-data ST
Ghostty explicitly logs OSC 1337 File= as unimplemented in its iterm2.zig OSC parser as of this checkout — it is not a rendering gap, the code path is a stub. Windows Terminal's OSC 1337 support is unrelated to images (shell-integration marks only).
???
Kitty graphics protocol
APC G <key>=<value>,... ; <payload> ST
Foot's non-support is a deliberate upstream design decision (Sixel only), not an oversight — see codeberg.org/dnkl/foot/issues/481.
??
Glyph Protocol (runtime glyph registration)
APC 25a1 ; <verb> [ ; key=value ]* [ ; base64-payload ] ST
A 2026 protocol for shipping a vector glyph to the terminal at runtime and rendering it from a Private Use Area codepoint, so a TUI need not ask the user to install a patched font. Rio, whose author designed it, is the first implementation and carries the spec. Ghostty is the case worth reading closely: the implementation is on main but landed after v1.3.1, so this documented "yes" and the measured "no" in the probe table above are both correct and describe different artefacts — the source and the shipped binary. Ghostty also advertises only fmt=glyf, so its answer would be monochrome-only where Rio accepts the two colour payloads as well.
ReGIS vector graphics
DCS Pmode p ... ST
ReGIS is effectively a two-terminal feature today: xterm (VT330/340 heritage) and Contour, which built a fairly complete rasterizer including its own font/text renderer for ReGIS canvases.
?

hyperlinks

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
OSC 8 hyperlinks
OSC 8 ; params ; URI ST text OSC 8 ; ; ST
Konsole gates hyperlink recognition behind an opt-in extractor that is off by default in most shipped profiles.
~?
OSC 52 clipboard set/query
OSC 52 ; Pc ; base64-or-? ST
Read (querying clipboard contents back into the app) is a well-known exfiltration vector, so most terminals default to write-only or gate reads behind an explicit opt-in; gnome-terminal refuses the whole sequence outright.
~~~?
Kitty clipboard protocol (OSC 5522)
OSC 5522 ; metadata ; base64-payload ST
Ghostty parses the wire format but the handler is an explicit no-op stub, so it doesn't count as working support yet.
?

input

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Kitty keyboard protocol
CSI > Ps u (push) / CSI < Ps u (pop) / CSI = Ps ; Ps u (set) / CSI ? u (query)
wezterm gates it behind an opt-in config flag (enable_kitty_keyboard), off by default. mintty and xterm have no evidence of support anywhere in source. iTerm2 has an OPEN GitLab feature request (#10017 'Implement Kitty's keyboard protocol') contradicting some blog posts that list it as supported -- verify before publishing.
?
xterm modifyOtherKeys
CSI > 4 ; Pv m (set), CSI ? 4 m (query); reported keys use CSI27;mod;codepoint~ or CSI codepoint;mod u
kitty is a deliberate 'no': it recognizes and parses the sequence but refuses to act on it, logging a warning that steers applications to the kitty keyboard protocol instead. Windows Terminal and VTE-based terminals (GNOME Terminal, Tilix, ...) have no implementation at all, relying on their own alternative protocols (win32-input-mode, kitty protocol respectively). Independently corroborated by measurement: kitty parses `CSI > 4 m` but only logs a warning and stores nothing, matching the source-level finding exactly.
?
Bracketed paste
DECSET/DECRST 2004; pasted text wrapped in CSI 200~ ... CSI 201~
?
Focus in/out reporting
DECSET/DECRST 1004; reports CSI I (focus in) / CSI O (focus out)
?
SGR extended mouse reporting
DECSET/DECRST 1006; reports CSI < Cb ; Cx ; Cy M/m
?
SGR-Pixel mouse reporting
DECSET/DECRST 1016; like 1006 but coordinates are in pixels, not cells
This is the row with the most 'no's -- 1016 is much newer/rarer than the other input modes. GNOME/vte's own source explicitly distinguishes 'recognized' from 'implemented' via a WRITABLE flag, which is strong primary evidence for its 'no'.
?
DEC locator (DECELR / DECSLE / DECRQLP)
CSI Ps ; Ps ' z (DECELR) / CSI Ps ' { (DECSLE) / CSI Ps ' | (DECRQLP)
mintty implements the locator unconditionally. xterm implements it in source but behind a configure option that is off by default, so a stock xterm answers nothing; that is why its measured and documented rows differ. Windows Terminal lists all three sequences in its documentation catalogue while affirmatively reporting no locator device.
~?
X10 mouse reporting (mode 9)
CSI ? 9 h / l
The oldest protocol, and the least uniformly kept. Several terminals recognise the mode number and deliberately do nothing with it.
?
VT200 mouse reporting (mode 1000)
CSI ? 1000 h / l
Universally supported; the baseline every application can assume.
?
Highlight mouse tracking (mode 1001)
CSI ? 1001 h / l
The interesting row. xterm is the only full implementation. Contour and VTE both answer DECRQM affirmatively while emitting nothing, so a mode query is not sufficient to detect it -- which is why the measured table reports Contour as supporting a mode it does not honour.
~~?
Button-event tracking (mode 1002)
CSI ? 1002 h / l
Motion reported while a button is held. kitty calls it MOUSE_MOTION_TRACKING.
?
Any-event tracking (mode 1003)
CSI ? 1003 h / l
Motion reported unconditionally. kitty calls it MOUSE_MOVE_TRACKING.
?
SGR-pixel coordinates (mode 1016)
CSI ? 1016 h / l
Reports pixel rather than cell coordinates.
~?
Passive mouse tracking (mode 2029)
CSI ? 2029 h / l
Contour's own extension: lets an application read mouse position without taking the mouse away from the user's selection. VTE has catalogued Contour's whole extension range -- 2026 batched rendering, 2027 unicode core, 2028 text reflow, 2029 passive tracking, 2030 grid cell selection, 2031 colour palette reports -- naming them after Contour, though only some are wired up.
~?

other

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
DECSCL (select conformance level)
CSI Ps ; Pc " p
ghostty and wezterm both only fake a DECRQSS reply about DECSCL (or a static DA field) without actually implementing the set command — a case where surface-level string search would have produced a false positive.
?
DECRQM (request DEC/ANSI mode)
CSI ? Ps $ p (DEC) / CSI Ps $ p (ANSI); reply CSI ? Ps ; Pm $ y
ghostty's gap is real but narrow: it answers DEC-private DECRQM queries but not the plainer ANSI-mode form.
~?
DECRQCRA (checksum of rectangular area)
CSI Pid ; Pg ; Pt ; Pl ; Pb ; Pr * y -> DCS Pid ! ~ xxxx ST
This is the single most consistent security-gating pattern found across the whole survey: wezterm, VTE, konsole and Windows Terminal all implement the real checksum but disable it by default (or entirely outside debug builds) because it lets a program read screen contents cell-by-cell; only contour, mintty and xterm ship it unconditionally, and iTerm2 requires an explicit trust decision.
~~~~?
Rectangular area ops (DECCRA copy / DECFRA fill / DECERA erase)
CSI ... $ v (DECCRA) / CSI ... $ x (DECFRA) / CSI ... $ z (DECERA)
A clean split: every terminal with a genuine VT420-lineage legacy-DEC implementation (contour, foot, VTE, Windows Terminal, mintty, iTerm2, xterm) has all three; every 'clean-slate' modern terminal (kitty, ghostty, wezterm, alacritty) has none of them, and konsole — despite being KDE's legacy-minded emulator — has none either.
?
Scroll margins — DECSTBM (top/bottom) and DECLRMM (left/right)
CSI Pt ; Pb r (DECSTBM) / CSI Pl ; Pr s (DECSLRM, gated by DEC private mode 69 = DECLRMM)
DECSTBM (VT100-era) is universal. DECLRMM (VT420 left/right margins) is the rarer half: kitty, foot, konsole and alacritty all stop at top/bottom-only.
~~~~~?
DECSCA (select character protection attribute)
CSI Ps " q
Same modern-vs-legacy split as the rectangular-area ops: kitty/foot/wezterm/alacritty/konsole skip this VT220 legacy feature entirely.
?
OSC 22 mouse pointer shape
OSC 22 ; shape-name(s) ST
xterm's OSC 22 handling is the original (narrower) proposal; kitty later published a richer, system-independent spec (named shapes, push/pop stack, query) that contour, ghostty and foot all implement. gnome-terminal/konsole/wezterm/iTerm2/alacritty/windows-terminal implement no protocol-level pointer-shape control (only local hover-cursor config).
?
XTGETTCAP (request termcap/terminfo string)
DCS + q Pt ST -> DCS 1 + r Pt = Pv ST
mintty is a rare case of an EXPLICIT, documented non-implementation rather than silent absence.
?

shell

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
OSC 7 current working directory
OSC 7 ; file://host/path ST
Konsole deliberately gets the cwd from /proc/<pid>/cwd (src/ProcessInfo.cpp) rather than parsing OSC 7 -- a platform-specific mechanism outside the escape-sequence protocol, so it is scored 'no' here even though the end-user feature (open-new-tab-in-same-dir) exists.
?
OSC 133 semantic prompt marks
OSC 133 ; A|B|C|D[;params] ST
Alacritty deliberately keeps the OSC surface minimal; OSC 133 has been requested since 2022 but is not implemented.
?
Desktop notifications (OSC 9 / OSC 777)
OSC 9 ; message ST | OSC 777 ; notify ; title ; body ST
Several terminals implement the two codes asymmetrically: gnome-terminal, konsole and Windows Terminal each treat OSC 9 as ConEmu progress/cwd plumbing rather than a message popup, while giving OSC 777 (or, for gnome-terminal, neither) the actual notification behavior.
~~~?

unicode

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
DEC mode 2027 (grapheme clustering)
CSI ? 2027 h / l
kitty, Windows Terminal and mintty each reuse the wire compatibility surface without implementing the real negotiable-mode semantics: kitty is always-on with no mode at all, WT is always-on but answers DECRQM correctly as permanent, and mintty repurposes the number for plain emoji-width toggling. Independently corroborated by measurement: kitty does full grapheme segmentation unconditionally (its ZWJ handling scores 100%), but a live DECRQM probe against kitty reports mode 2027 as unsupported -- confirming there is no negotiation, only always-on behavior.
~~~?
DEC mode 2026 (synchronized/batched output)
CSI ? 2026 h / l
Widely adopted; xterm and VTE/GNOME Terminal are the two holdouts among the twelve. VTE has the mode number catalogued for correct DECRQM bookkeeping but never wires it to rendering.
?
Kitty text-sizing protocol (OSC 66)
OSC 66 ; key=value:... ; text ST
This is a 2024/2025-era kitty-originated protocol; outside kitty, only ghostty and Contour implement it fully, and foot implements a deliberately reduced subset.
~?
DECDWL / DECDHL (double-width / double-height lines)
ESC # 6 (DECDWL), ESC # 3 / ESC # 4 (DECDHL top/bottom)
A genuine three-way split: xterm/Windows Terminal/mintty/Konsole/iTerm2 keep this VT100-era feature; every GPU-accelerated 2020s terminal in this set (kitty, ghostty, foot, alacritty) has dropped it outright; wezterm and Contour are the exceptions that still render it. VTE recognizes the syntax (so it won't desync the parser) but the handlers are intentionally empty.
?

window

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
In-band window resize notifications (DEC mode 2048)
CSI ? 2048 h/l ; reports as CSI 48 ; height ; width ; pxheight ; pxwidth t
A 2023-era community proposal (not yet a ratified terminal-wg standard); contour and kitty are the two reference implementations most others cite.
?
XTWINOPS window manipulation
CSI Ps ; Ps ; Ps t
Nearly every terminal deliberately refuses application-driven resize/iconify/raise as a security/UX decision; mintty and iTerm2 are the two that actually perform it (both gated by user config/trust).
~~~~~~~~~?
DECSLPP (set lines per page)
CSI Ps t (Ps >= 24, sharing the XTWINOPS opcode space)
Almost universally dropped by modern terminals (resize-by-line-count from an application is considered a UX/security footgun); only mintty, iTerm2, xterm and VTE/gnome-terminal still honour it.
?
Alternate screen buffer (DEC private modes 47 / 1047 / 1049)
CSI ? 1049 h/l (also 47, 1047)
The one universally-supported row in this whole batch — every terminal surveyed implements at least mode 1049.
~?
DEC page memory (more than one page)
CSI Ps U (NP) / CSI Ps V (PP) / CSI Ps SP P (PPA)
Contour and Windows Terminal are the only two here with a real page model. Windows Terminal's is capped at six pages and resizes background pages without reflowing them, but they are genuinely distinct addressable buffers, and paging is bypassed on the alt buffer, which rules out scrollback relabelled as pages. xterm recognises the page sequences and discards them, which is why it reports a page number while having a single page. kitty is the one to be careful with: `CSI Ps SP P` is not rejected but misdispatched as delete-character.
?
DECXCPR (extended cursor position report)
CSI ? 6 n -> CSI ? Pr ; Pc ; Pp R
Three distinct behaviours hide behind one row. Contour and Windows Terminal answer with a live page number. xterm, GNOME Terminal and iTerm2 answer with the page field present but fixed at 1, which is correct for a terminal that has one page. kitty and mintty answer the private form without the field at all, recorded as partial. Ghostty, foot and Alacritty do not implement the private form and answer nothing -- a rejection rather than a short reply, so an application polling with `CSI ? 6 n` waits rather than reading a degraded answer.
~~?

GUI and user-facing features (documented)

Compiled from official documentation and source.

accessibility

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Screen-reader / a11y support
Accessibility is broadly weak across GPU-native terminals: kitty and wezterm have no screen-reader integration at all (kitty Discussion #9202; wezterm issue #913, open since 2021). ghostty is macOS-only (real VoiceOver support via AppKit's accessibility protocol) with no Linux/GTK implementation. Konsole (QAccessible) and gnome-terminal/VTE (GTK4 GtkAccessibleText, since GTK 4.14) are the most complete on Linux.
~~~
Caret (cursor) position reporting to a11y APIs
Follows the same pattern as screen-reader support: present only where a full a11y stack exists (contour, konsole, gnome-terminal/VTE); ghostty's caret reporting is macOS-only and on-demand rather than a proactive AX notification.
~??

config

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Configuration formatYAML (contour.yml)Custom key-value kitty.confCustom flat key = value text formatINI (foot.ini, [section] key=value)Lua (~/.wezterm.lua)KConfig INI-style (konsolerc + per-profile .profile files)GSettings/dconf (binary key-value database under the org.gnome.Terminal schema), not a text config fileTOML (alacritty.toml)TOML, at ~/.config/rio/config.tomlX resources (~/.Xresources, app-defaults / XrmDatabase)JSON (settings.json)Flat key=value text file (.minttyrc)plist (native Preferences); profiles also as Dynamic Profiles JSON/XMLProperty List (.plist / .terminal)
Live config reload~
GUI settings panel~~
Per-profile settings~~~
Theming / colour-scheme support

interaction

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Search in scrollback
URL/hyperlink click~~
Copy-on-select
Rectangular (block) selection~
Mouse reporting toggles
IME / dead-key support~
Keyboard-driven vi mode / copy mode~~~~

layout

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Tabs
Split panes
Tab/pane detach & reorder~~~~
Quake/dropdown mode
Fullscreen mode

other

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Sixel image display~
Kitty graphics protocol support~~
Desktop notification support~~~
Ligature-aware cursor rendering?~
Blurred background / transparency~~
Tab colouring~~
Undercurl / styled underlines

platform

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Linux/X11
Linux/Wayland
macOS~~
Windows~
BSD~~

rendering

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
GPU-accelerated rendering~
GPU rendering APIQt RHI (OpenGL, Vulkan, Metal, or Direct3D 11, selected by Qt's backend at runtime)OpenGL 3.1+ (Linux, w/ extensions) / OpenGL 3.3 core (macOS)Metal (macOS), OpenGL 4.3+ (Linux/BSD), WebGL (wasm)none (software rendering via pixman + Wayland shm buffers)OpenGL (default); optional WebGpu via wgpu (Vulkan/Metal/DX12); Software fallbacknone - CPU/software rasterization via QWidget+QPainter (Qt raster paint engine)GTK4 GSK scene graph (OpenGL 'NGL' renderer; Vulkan by default on Wayland since GTK 4.16)OpenGL 3.3 core (GLES 2.0 fallback)Native Metal (macOS) and native Vulkan via ash (Linux) by default; wgpu (Vulkan/Metal/DX12/GL) required on Windows and WASM, optional elsewhere; CPU/softbuffer fallbacknone (Xlib/Xft, CPU-rendered)Direct3D 11 (AtlasEngine)None — GDI raster (CPU); DirectWrite only for glyph-existence probingMetalnone (CoreGraphics/CoreText, CPU)
Font ligatures~~
Bitmap/emoji font support~~
COLRv1 colour font rendering
COLRv0 and COLRv1 are different formats and this row is only about the second. v0 is a flat list of coloured layers and is a decade old; v1 is a paint graph with gradients, transforms and composite modes, and is what Noto Color Emoji ships today. "Partial" here means the terminal renders coloured fonts — v0 layers, CBDT/sbix bitmap strikes, or both — but not the v1 paint graph, which is the common case rather than the exception. The verdict tracks which rasterizer API the terminal actually calls: FT_LOAD_COLOR alone reaches v0 and bitmaps, whereas v1 needs FT_Get_Color_Glyph_Paint, hb_font_paint_glyph, or a toolkit that calls one of them. Note Rio's split: it accepts fmt=colrv1 payloads over Glyph Protocol yet renders ordinary COLRv1 text through swash, which reads v0 only — two separate code paths, and the protocol capability measured in the probe table says nothing about the font one.
~~~~~~~~
Subpixel (LCD) antialiasing~~~
Variable font support??~?~????

session

FeatureContourkittyGhosttyfootWezTermKonsoleGNOME Terminal (VTE)AlacrittyRioxtermWindows TerminalMinttyiTerm2Terminal.app
Shell integration (semantic prompt marks)~~
Session restore~~~
Remote/SSH integration
Two different things share this row. Contour embeds an SSH client (libssh2) and connects directly, so the terminal itself is the SSH client. kitty's ssh kitten and WezTerm's ssh_domains instead wrap or drive a connection in order to bootstrap terminfo and shell integration on the far end. Both are real integration; they solve different halves of the problem, and neither subsumes the other.
~~
Built-in multiplexer (detachable, tmux-like)~