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.
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.
| Terminal | Version | Platform | Display | Ran | Run time |
|---|---|---|---|---|---|
| Contour | 0.7.0-lead-out-aef659b5 | linux | x11 | ✓ | 32.0s |
| kitty | 0.47.1 | linux | x11 | ✓ | 172.1s |
| Ghostty | 1.3.1 | linux | x11 | ✓ | 8.0s |
| WezTerm | wezterm 20260716_195552_76b606ec | linux | x11 | ✓ | 53.0s |
| Konsole | 26.04.3 | linux | x11 | ✓ | 5.5s |
| GNOME Terminal (VTE) | 3.60.0 | linux | x11 | ✓ | 66.0s |
| Alacritty | 0.17.0 | linux | x11 | ✓ | 5.5s |
| Rio | 0.4.10 | linux | x11 | ✓ | 7.0s |
| xterm | 406 | linux | x11 | ✓ | 6.0s |
| foot | 1.27.0 | linux | wayland | ✓ | 7.0s |
| Terminal | Why |
|---|---|
| Windows Terminal | Windows only. Run the harness on Windows to fill this row. |
| Mintty | Cygwin/MSYS2 on Windows. Run the harness there to fill this row. |
| iTerm2 | macOS only. Driven through AppleScript; run the harness on macOS. |
| Terminal.app | macOS 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.
Share of measurements whose cursor advance matched the expected column width. Higher is better.
| Terminal | Wide | Narrow | VS16 | VS15 | ZWJ | Flags (RI) | Lone RI | Skin tone | Overall |
|---|---|---|---|---|---|---|---|---|---|
| Contour | 100.0% | ||||||||
| Ghostty | 94.7% | ||||||||
| kitty | 93.7% | ||||||||
| Konsole | 93.1% | ||||||||
| foot | 92.6% | ||||||||
| WezTerm | 90.7% | ||||||||
| Rio | 45.2% | ||||||||
| xterm | 43.3% | ||||||||
| Alacritty | 42.8% | ||||||||
| GNOME Terminal (VTE) | 36.5% |
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.
| Capability | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm |
|---|---|---|---|---|---|---|---|---|---|---|
| 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) | ✓ | — | — | — | — | — | — | — | — | ✓ |
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.
| Mode | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm |
|---|---|---|---|---|---|---|---|---|---|---|
2027 Grapheme clustering | ✓ | — | ✓ | ✓ | ✓ | n/a | — | — | — | — |
2026 Synchronized output | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | — | ✓ | ✓ | — |
2048 In-band resize notification | ✓ | ✓ | ✓ | ✓ | — | n/a | — | — | — | — |
2004 Bracketed paste | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1049 Alternate screen buffer | ✓ | ✓ | ✓ | ✓ | — | n/a | ✓ | ✓ | ✓ | ✓ |
7 Auto-wrap (DECAWM) | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
| Mode | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm |
|---|---|---|---|---|---|---|---|---|---|---|
9 X10 compatibility mouse reporting | ✓ | — | ✓ | — | — | n/a | ✓ | — | — | ✓ |
1000 VT200 mouse — report button press and release | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1001 Highlight mouse tracking | ✓ | — | — | — | — | n/a | ✓ | — | — | ✓ |
1002 Button-event tracking (motion while pressed) | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1003 Any-event tracking (motion always) | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1004 Focus in/out events | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1005 UTF-8 extended coordinates | ✓ | ✓ | ✓ | — | ✓ | n/a | — | ✓ | ✓ | ✓ |
1006 SGR extended coordinates | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1007 Alternate-scroll mode | ✓ | — | ✓ | ✓ | — | n/a | ✓ | ✓ | ✓ | ✓ |
1015 urxvt extended coordinates | ✓ | — | ✓ | ✓ | — | n/a | — | — | — | ✓ |
1016 SGR-pixel coordinates | ✓ | ✓ | ✓ | ✓ | ✓ | n/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 | — | — | — | — |
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.
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm |
|---|---|---|---|---|---|---|---|---|---|---|
| DECXCPR (extended cursor position report) | ✓ | ✓ | — | — | — | — | ✓ | — | — | ✓ |
| Reports a page number | ✓ | — | — | — | — | — | ✓ | — | — | ✓ |
| DEC page memory (more than one page) | ✓ | — | — | — | — | — | — | — | — | — |
| Pages reached | 15 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| NP / PP (next and preceding page) | ✓ | — | — | — | — | — | — | — | — | — |
| DEC locator (DECELR / DECRQLP) | ✓ | — | — | — | — | — | — | — | — | — |
| Locator reports a position | ✓ | — | — | — | — | — | — | — | — | — |
| Glyph Protocol | — | — | — | — | — | — | — | — | ✓ | — |
| Glyph payload formats accepted | — | — | — | — | — | — | — | — | glyf, colrv0, colrv1 | — |
| Glyph registration is stored | — | — | — | — | — | — | — | — | ✓ | — |
| DECRLM actually moves the cursor leftwards | — | — | — | — | — | — | — | — | — | — |
105 modes, collected from the measurements rather than a hand-kept list. Modes that no terminal recognised are omitted.
| Mode | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm |
|---|---|---|---|---|---|---|---|---|---|---|
1 Cursor Keys Mode | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
2 ANSI/VT52 Mode | ✓ | — | — | — | ✓ | n/a | ✓ | — | — | ✓ |
3 Column Mode | ✓ | ✓ | ✓ | — | ✓ | n/a | ✓ | — | — | ✓ |
4 Scrolling Mode | ✓ | — | ✓ | — | — | n/a | — | — | — | ✓ |
5 Screen Mode (light or dark screen) | ✓ | ✓ | ✓ | ✓ | — | n/a | ✓ | — | — | ✓ |
6 Origin Mode | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
7 Auto Wrap Mode | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
8 Auto Repeat Mode | ✓ | ✓ | ✓ | — | — | n/a | ✓ | — | — | — |
9 Interlace Mode / Mouse X10 tracking | ✓ | — | ✓ | — | — | n/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 Feed | ✓ | — | — | — | — | n/a | — | — | — | ✓ |
19 Printer Extent | ✓ | — | — | — | — | n/a | — | — | — | ✓ |
25 Text Cursor Enable Mode | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
30 Show scrollbar (rxvt) | ✓ | — | — | — | — | n/a | — | — | — | ✓ |
34 Cursor Right to Left Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
35 Hebrew (Keyboard) Mode / Enable font-shifting functions (rxvt) | ✓ | — | — | — | — | n/a | — | — | — | ✓ |
36 Hebrew Encoding Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
38 Tektronix 4010/4014 Mode | — | — | — | — | — | n/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 Mode | ✓ | — | — | — | — | n/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 Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
59 Kanji/Katakana Display Mode | — | — | — | — | — | n/a | ✓ | — | — | — |
61 Vertical Cursor Coupling Mode | ✓ | — | — | — | — | n/a | ✓ | — | — | — |
64 Page Cursor Coupling Mode | ✓ | — | — | — | — | n/a | ✓ | — | — | — |
66 Numeric Keypad Mode | ✓ | — | ✓ | ✓ | — | n/a | ✓ | — | — | ✓ |
67 Backarrow Key Mode | ✓ | — | — | — | — | n/a | — | — | — | ✓ |
68 Keyboard Usage Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
69 Vertical Split Screen Mode / DECLRMM - Left Right Margin Mode | ✓ | — | ✓ | — | ✓ | n/a | ✓ | — | — | ✓ |
73 Transmission Rate Limiting | ✓ | — | — | — | — | n/a | — | — | — | — |
80 Sixel Display Mode | ✓ | — | — | ✓ | ✓ | n/a | ✓ | — | — | ✓ |
81 Key Position Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
95 No Clearing Screen on Column Change Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
96 Right to Left Copy Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
97 CRT Save Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
98 Auto Resize Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
99 Modem Control Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
100 Auto Answerback Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
101 Conceal Answerback Message Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
102 Ignore Null Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
103 Half Duplex Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
104 Secondary Keyboard Language Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
106 Overscan Mode | ✓ | — | — | — | — | n/a | — | — | — | — |
112 Review Previous Lines Mode | — | — | — | — | — | n/a | ✓ | — | — | — |
1000 Send Mouse X & Y on button press | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1001 Use Hilite Mouse Tracking | ✓ | — | — | — | — | n/a | ✓ | — | — | ✓ |
1002 Use Cell Motion Mouse Tracking | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1003 Use All Motion Mouse Tracking | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1004 Send FocusIn/FocusOut events | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1005 Enable UTF-8 Mouse Mode | ✓ | ✓ | ✓ | — | ✓ | n/a | — | ✓ | ✓ | ✓ |
1006 Enable SGR Mouse Mode | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
1007 Enable Alternate Scroll Mode | ✓ | — | ✓ | ✓ | — | n/a | ✓ | ✓ | ✓ | ✓ |
1010 Scroll to bottom on tty output | — | — | — | — | — | n/a | — | — | — | ✓ |
1011 Scroll to bottom on key press | — | — | — | — | — | n/a | — | — | — | ✓ |
1014 Enable fastScroll resource | — | — | — | — | — | n/a | — | — | — | ✓ |
1015 Enable urxvt Mouse Mode | ✓ | — | ✓ | ✓ | — | n/a | — | — | — | ✓ |
1016 Enable SGR Mouse PixelMode | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | — | — | — | ✓ |
1021 Bold/italic implies high intensity | — | — | — | — | — | n/a | ✓ | — | — | — |
1034 Interpret "meta" key | — | — | — | ✓ | — | n/a | — | — | — | ✓ |
1035 Enable special modifiers for Alt and NumLock keys | — | — | ✓ | ✓ | — | n/a | — | — | — | ✓ |
1036 Send ESC when Meta modifies a key | — | — | ✓ | ✓ | — | n/a | ✓ | — | — | ✓ |
1037 Send DEL from the editing-keypad Delete key | — | — | — | — | — | n/a | — | — | — | ✓ |
1039 Send ESC when Alt modifies a key | — | — | ✓ | — | — | n/a | — | — | — | ✓ |
1040 Keep selection even if not highlighted | — | — | — | — | — | n/a | — | — | — | ✓ |
1041 Use the CLIPBOARD selection | — | — | — | — | — | n/a | — | — | — | ✓ |
1042 Enable Urgency window manager hint when Control-G is received | — | — | — | ✓ | — | n/a | — | ✓ | ✓ | ✓ |
1043 Enable raising of the window when Control-G is received | — | — | — | — | — | n/a | — | — | — | ✓ |
1044 Reuse the most recent data copied to CLIPBOARD | — | — | — | — | — | n/a | — | — | — | ✓ |
1045 Extended Reverse-wraparound mode (XTREVWRAP2) | ✓ | — | ✓ | — | — | n/a | — | — | — | ✓ |
1046 Enable switching to/from Alternate Screen Buffer | — | — | — | — | — | n/a | ✓ | — | — | ✓ |
1047 Use Alternate Screen Buffer | ✓ | — | ✓ | ✓ | — | n/a | ✓ | — | — | ✓ |
1048 Save cursor as in DECSC | ✓ | — | ✓ | — | — | n/a | ✓ | — | — | ✓ |
1049 Save cursor as in DECSC and use alternate screen buffer | ✓ | ✓ | ✓ | ✓ | — | n/a | ✓ | ✓ | ✓ | ✓ |
1050 Set terminfo/termcap function-key mode | — | — | — | — | — | n/a | — | — | — | ✓ |
1051 Set Sun function-key mode | — | — | — | — | — | n/a | — | — | — | ✓ |
1060 Set legacy keyboard emulation, i.e, X11R6 | — | — | — | — | — | n/a | — | — | — | ✓ |
1061 Set VT220 keyboard emulation | — | — | — | — | — | n/a | — | — | — | ✓ |
1070 Use private color registers for each graphic | ✓ | — | — | ✓ | ✓ | n/a | ✓ | — | — | ✓ |
1243 Arrow keys swapping (BiDi) | — | — | — | — | — | n/a | ✓ | — | — | — |
2001 Enable readline mouse button-1 | — | — | — | — | — | n/a | — | — | — | ✓ |
2002 Enable readline mouse button-2 | — | — | — | — | — | n/a | — | — | — | ✓ |
2003 Enable readline mouse button-3 | — | — | — | — | — | n/a | — | — | — | ✓ |
2004 Set bracketed paste mode | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | ✓ | ✓ | ✓ | ✓ |
2005 Enable readline character-quoting | — | — | — | — | — | n/a | — | — | — | ✓ |
2006 Enable readline newline pasting | — | — | — | — | — | n/a | — | — | — | ✓ |
2026 Synchronized Output | ✓ | ✓ | ✓ | ✓ | ✓ | n/a | — | ✓ | ✓ | — |
2027 Grapheme Clustering | ✓ | — | ✓ | ✓ | ✓ | n/a | — | — | — | — |
2028 Text reflow | ✓ | — | — | — | — | n/a | — | — | — | — |
2029 Passive Mouse Tracking | ✓ | — | — | — | — | n/a | — | — | — | — |
2030 Report grid cell selection | ✓ | — | — | — | — | n/a | — | — | — | — |
2031 Color palette updates | ✓ | ✓ | ✓ | ✓ | — | n/a | ✓ | — | — | — |
2048 In-Band Window Resize Notifications | ✓ | ✓ | ✓ | ✓ | — | n/a | — | — | — | — |
2500 Mirror box drawing characters | — | — | — | — | — | n/a | ✓ | — | — | — |
2501 BiDi autodetection | — | — | — | — | — | n/a | ✓ | — | — | — |
5522 Bracketed Paste MIME | ✓ | ✓ | — | — | — | n/a | — | — | — | — |
8452 Sixel scrolling leaves cursor to right of graphic | ✓ | — | — | ✓ | ✓ | n/a | — | — | — | ✓ |
9001 win32-input-mode | ✓ | — | — | — | ✓ | n/a | — | — | — | — |
737769 Input Method Editor (IME) mode | ? | — | ? | ✓ | ? | n/a | ? | ? | ? | ? |
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.
| Mode | Terminal | DECRQM says | Behaviour |
|---|---|---|---|
34 DECRLM (right-to-left mode) | Contour | ✓ | — |
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.
| Feature | Terminal | Measured | Documented |
|---|---|---|---|
| OSC 52 clipboard set/query | Alacritty | — | ✓ |
| OSC 52 clipboard set/query | xterm | — | ✓ |
| SGR 58/59 underline color | Konsole | — | ✓ |
| SGR 58/59 underline color | GNOME Terminal (VTE) | — | ✓ |
| SGR 58/59 underline color | Alacritty | — | ✓ |
| SGR 58/59 underline color | Rio | — | ✓ |
| 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 | — | ✓ |
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.
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
24-bit true color (SGR 38;2 / 48;2)CSI 38;2;r;g;b m / CSI 48;2;r;g;b mUniversal 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 styleCSI Ps SP qUniversally 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 dashedOriginated 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 colorCSI 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. | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Sixel graphicsDCS Pmacro ; Pback ; Pgrid q ... sixel-data STGNOME 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 STGhostty 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 protocolAPC G <key>=<value>,... ; <payload> STFoot'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 ] STA 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 graphicsDCS Pmode p ... STReGIS 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. | ✓ | — | — | — | — | — | — | — | — | ✓ | — | — | — | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OSC 8 hyperlinksOSC 8 ; params ; URI ST text OSC 8 ; ; STKonsole gates hyperlink recognition behind an opt-in extractor that is off by default in most shipped profiles. | ✓ | ✓ | ✓ | ✓ | ✓ | ~ | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ | ? |
OSC 52 clipboard set/queryOSC 52 ; Pc ; base64-or-? STRead (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 STGhostty parses the wire format but the handler is an explicit no-op stub, so it doesn't count as working support yet. | ✓ | ✓ | — | — | — | — | — | — | — | — | — | — | — | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kitty keyboard protocolCSI > 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 modifyOtherKeysCSI > 4 ; Pv m (set), CSI ? 4 m (query); reported keys use CSI27;mod;codepoint~ or CSI codepoint;mod ukitty 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 pasteDECSET/DECRST 2004; pasted text wrapped in CSI 200~ ... CSI 201~ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ? |
Focus in/out reportingDECSET/DECRST 1004; reports CSI I (focus in) / CSI O (focus out) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ? |
SGR extended mouse reportingDECSET/DECRST 1006; reports CSI < Cb ; Cx ; Cy M/m | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ? |
SGR-Pixel mouse reportingDECSET/DECRST 1016; like 1006 but coordinates are in pixels, not cellsThis 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 / lThe 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 / lUniversally supported; the baseline every application can assume. | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ? |
Highlight mouse tracking (mode 1001)CSI ? 1001 h / lThe 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 / lMotion reported while a button is held. kitty calls it MOUSE_MOTION_TRACKING. | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ? |
Any-event tracking (mode 1003)CSI ? 1003 h / lMotion reported unconditionally. kitty calls it MOUSE_MOVE_TRACKING. | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ? |
SGR-pixel coordinates (mode 1016)CSI ? 1016 h / lReports pixel rather than cell coordinates. | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ~ | — | — | ✓ | — | ✓ | ✓ | ? |
Passive mouse tracking (mode 2029)CSI ? 2029 h / lContour'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. | ✓ | — | — | — | — | — | ~ | — | — | — | — | — | — | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DECSCL (select conformance level)CSI Ps ; Pc " pghostty 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 $ yghostty'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 STThis 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 " qSame modern-vs-legacy split as the rectangular-area ops: kitty/foot/wezterm/alacritty/konsole skip this VT220 legacy feature entirely. | ✓ | — | ✓ | — | — | — | ✓ | — | — | ✓ | ✓ | ✓ | ✓ | ? |
OSC 22 mouse pointer shapeOSC 22 ; shape-name(s) STxterm'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 STmintty is a rare case of an EXPLICIT, documented non-implementation rather than silent absence. | ✓ | — | ✓ | ✓ | ✓ | — | — | — | ✓ | ✓ | — | — | ✓ | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OSC 7 current working directoryOSC 7 ; file://host/path STKonsole 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 marksOSC 133 ; A|B|C|D[;params] STAlacritty 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 STSeveral 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. | ✓ | ✓ | ✓ | ✓ | ✓ | ~ | — | — | ✓ | — | ~ | — | ~ | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DEC mode 2027 (grapheme clustering)CSI ? 2027 h / lkitty, 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 / lWidely 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 STThis 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. | ✓ | — | — | — | ✓ | ✓ | — | — | — | ✓ | ✓ | ✓ | ✓ | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
In-band window resize notifications (DEC mode 2048)CSI ? 2048 h/l ; reports as CSI 48 ; height ; width ; pxheight ; pxwidth tA 2023-era community proposal (not yet a ratified terminal-wg standard); contour and kitty are the two reference implementations most others cite. | ✓ | ✓ | ✓ | ✓ | — | — | — | — | — | — | — | — | ✓ | ? |
XTWINOPS window manipulationCSI Ps ; Ps ; Ps tNearly 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 RThree 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. | ✓ | ~ | — | — | — | — | ✓ | — | — | ✓ | ✓ | ~ | ✓ | ? |
Compiled from official documentation and source.
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.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. | ✓ | — | ~ | — | — | ✓ | ✓ | — | — | — | ✓ | — | ? | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Configuration format | YAML (contour.yml) | Custom key-value kitty.conf | Custom flat key = value text format | INI (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 file | TOML (alacritty.toml) | TOML, at ~/.config/rio/config.toml | X resources (~/.Xresources, app-defaults / XrmDatabase) | JSON (settings.json) | Flat key=value text file (.minttyrc) | plist (native Preferences); profiles also as Dynamic Profiles JSON/XML | Property List (.plist / .terminal) |
| Live config reload | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ | ✓ | ✓ | — | ✓ | ~ | ✓ | — |
| GUI settings panel | ✓ | ~ | — | — | — | ✓ | ✓ | — | — | ~ | ✓ | ✓ | ✓ | ✓ |
| Per-profile settings | ✓ | ~ | — | ~ | ~ | ✓ | ✓ | — | — | — | ✓ | ✓ | ✓ | ✓ |
| Theming / colour-scheme support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.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 | ✓ | ~ | ~ | — | ✓ | — | — | ✓ | ✓ | — | ~ | ~ | ✓ | — |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Tabs | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ | — | ✓ | — | ✓ | ✓ | ✓ | ✓ |
| Split panes | ✓ | ✓ | ✓ | — | ✓ | ✓ | — | — | ✓ | — | ✓ | — | ✓ | ✓ |
| Tab/pane detach & reorder | ✓ | ✓ | ✓ | — | ~ | ✓ | ✓ | — | ~ | — | ✓ | ~ | ✓ | ~ |
| Quake/dropdown mode | — | ✓ | ✓ | — | — | — | — | — | — | — | ✓ | ✓ | ✓ | — |
| Fullscreen mode | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sixel image display | ✓ | — | — | ✓ | ✓ | ✓ | ~ | — | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| Kitty graphics protocol support | ✓ | ✓ | ✓ | — | ✓ | ~ | — | — | ✓ | — | — | — | ~ | — |
| Desktop notification support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ~ | — | ✓ | ~ | ✓ | ~ | ✓ | — |
| Ligature-aware cursor rendering | ? | ✓ | ✓ | — | ~ | ✓ | — | — | ✓ | — | ✓ | ✓ | ✓ | — |
| Blurred background / transparency | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | ~ | ✓ | — | ✓ | ~ | ✓ | ✓ |
| Tab colouring | ✓ | ✓ | ~ | — | ✓ | ✓ | — | — | ✓ | — | ✓ | ~ | ✓ | — |
| Undercurl / styled underlines | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ | — |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Linux/X11 | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | — | — | — |
| Linux/Wayland | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | — | — | — | — |
| macOS | ✓ | ✓ | ✓ | — | ✓ | ~ | — | ✓ | ✓ | ~ | — | — | ✓ | ✓ |
| Windows | ✓ | — | — | — | ✓ | ~ | — | ✓ | ✓ | — | ✓ | ✓ | — | — |
| BSD | ✓ | ✓ | ~ | ~ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — | — | — | — |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.app |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| GPU-accelerated rendering | ✓ | ✓ | ✓ | — | ✓ | — | ~ | ✓ | ✓ | — | ✓ | — | ✓ | — |
| GPU rendering API | Qt 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 fallback | none - 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 fallback | none (Xlib/Xft, CPU-rendered) | Direct3D 11 (AtlasEngine) | None — GDI raster (CPU); DirectWrite only for glyph-existence probing | Metal | none (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 | ? | ✓ | ✓ | ? | ~ | ? | ✓ | ✓ | ~ | ? | ✓ | ? | ? | ? |
| Feature | Contour | kitty | Ghostty | foot | WezTerm | Konsole | GNOME Terminal (VTE) | Alacritty | Rio | xterm | Windows Terminal | Mintty | iTerm2 | Terminal.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) | — | — | — | — | ✓ | — | — | — | — | — | — | — | ~ | — |