Appearance
xterm.js
Headless Backend
@xterm/headless — JS-only, no DOM rendering.
See also: Xterm Extensions standard · xterm (historical)
xterm.js is the most widely deployed terminal emulator in the world. It powers the integrated terminal in VS Code, Cursor, and thousands of web-based terminals, cloud IDEs, and development tools. If you've used a terminal in a browser, you've almost certainly used xterm.js.
Originally a port of the xterm X11 terminal to JavaScript, xterm.js has evolved into a mature, GPU-accelerated terminal renderer with Canvas and WebGL backends. It supports truecolor, Unicode, mouse tracking, bracketed paste, and link detection.
VS Code pioneered shell integration via the OSC 633 protocol using xterm.js, enabling command decorations, run-recent-command, and sticky scroll. The xterm.js headless package (@xterm/headless) provides the parser without rendering — used by Termless as a backend.
Backend: @xterm/headless — JS-only, no DOM rendering. (js) · v5.5.0
⚠ Headless mode doesn't expose cursor visibility or underline variants
66%
154 passed · 15 partial · 64 failed of 233 features
Tested: April 10, 2026
Analysis2026-04-06
Version History
| Version | Support | Score | Features |
|---|---|---|---|
| 6.1.0-beta.195 | 77% | 113 / 147 | |
| 6.0.0 | 76% | 112 / 147 | |
| 5.5.0 | 66% | 154 / 233 | |
| 5.4.0 | 76% | 112 / 147 |
Character Sets
| Feature | Support | Notes |
|---|---|---|
| DEC line drawing character set | ✓ yes | |
| DEC Special Graphics | ✓ yes | |
| G0/G1 character set switching | ✓ yes | |
| UTF-8 mode | ✓ yes |
Cursor
| Feature | Support | Notes |
|---|---|---|
| ANSI restore cursor (CSI u) | ✓ yes | |
| ANSI save cursor (CSI s) | ✓ yes | |
| CPL cursor preceding line (CSI F) | ✓ yes | |
| CUD stops at bottom | ✓ yes | |
| CUP at screen boundaries | ✓ yes | |
| CUP with DECOM | ✓ yes | |
| CUU stops at top | ✓ yes | |
| Hide cursor (DECTCEM) | ~ partial | Parser handles DECTCEM but headless mode doesn't expose visibility state |
| Cursor horizontal absolute (CHA) | ✓ yes | |
| HPA horizontal position absolute (CSI `) | ✓ yes | |
| Cursor position (CUP) | ✓ yes | |
| Cursor back (CUB) | ✓ yes | |
| Cursor down (CUD) | ✓ yes | |
| Cursor forward (CUF) | ✓ yes | |
| Cursor home | ✓ yes | |
| Cursor up (CUU) | ✓ yes | |
| Cursor next line (CNL) | ✓ yes | |
| Cursor position report (DSR 6) | ~ partial | Headless mode has no output stream for DSR responses |
| Reverse Wrap (Mode 45) | ✓ yes | |
| Save/restore cursor (DECSC) | ✓ yes | |
| Cursor shape (DECSCUSR) | ~ partial | Parser handles DECSCUSR but headless mode doesn't expose cursor shape |
| VPA vertical position absolute (CSI d) | ✓ yes |
Device Status
Editing
| Feature | Support | Notes |
|---|---|---|
| DECCARA — change attrs in rectangle | ✗ no | VT420 rectangular area operations not implemented — legacy DEC features omitted by most modern terminals |
| DECCRA — copy rectangular area | ✗ no | VT420 rectangular area operations not implemented — legacy DEC features omitted by most modern terminals |
| DECDC — delete columns (CSI Ps ' ~) | ✗ no | Column editing (SL/SR/DECIC/DECDC) not implemented — rarely needed by modern TUI apps |
| DECERA — erase rectangular area | ✗ no | VT420 rectangular area operations not implemented — legacy DEC features omitted by most modern terminals |
| DECFRA — fill rectangular area | ✗ no | VT420 rectangular area operations not implemented — legacy DEC features omitted by most modern terminals |
| DECIC — insert columns (CSI Ps ' }) | ✗ no | Column editing (SL/SR/DECIC/DECDC) not implemented — rarely needed by modern TUI apps |
| DECRARA — reverse attrs in rectangle | ✗ no | VT420 rectangular area operations not implemented — legacy DEC features omitted by most modern terminals |
| DECRQCRA — checksum rectangular area | ✗ no | VT420 rectangular area operations not implemented — legacy DEC features omitted by most modern terminals |
| DECSACE — select attribute-change extent | ✓ yes | |
| DECSERA — selective erase rectangular area | ✗ no | VT420 rectangular area operations not implemented — legacy DEC features omitted by most modern terminals |
| Delete characters (DCH) | ✓ yes | |
| Delete lines (DL) | ✓ yes | |
| Insert characters (ICH) | ✓ yes | |
| Insert lines (IL) | ✓ yes | |
| Repeat character (REP) | ✓ yes | |
| SL — shift left (CSI Ps SP @) | ✗ no | Column editing (SL/SR/DECIC/DECDC) not implemented — rarely needed by modern TUI apps |
| SR — shift right (CSI Ps SP A) | ✗ no | Column editing (SL/SR/DECIC/DECDC) not implemented — rarely needed by modern TUI apps |
Erase
| Feature | Support | Notes |
|---|---|---|
| Erase character (ECH) | ✓ yes | |
| ED at scroll region boundary | ✓ yes | |
| EL erases with bg color | ✓ yes | |
| Erase line (EL 2) | ✓ yes | |
| Erase to BOL (EL 1) | ✓ yes | |
| Erase to EOL (EL 0) | ✓ yes | |
| Erase above (ED 1) | ✓ yes | |
| Erase screen (ED 2) | ✓ yes | |
| Erase below (ED 0) | ✓ yes | |
| Erase scrollback (ED 3) | ✓ yes | |
| Selective Erase (DECSED) | ✓ yes |
Extensions
| Feature | Support | Notes |
|---|---|---|
| System clipboard paste | ? unknown | |
| Font ligatures | ? unknown | |
| iTerm2 Inline Images (OSC 1337) | ✗ no | iTerm2 inline images not implemented in xterm.js |
| Kitty graphics protocol | ✗ no | Not implemented in xterm.js |
| Kitty graphics: animation | ✗ no | Kitty graphics protocol not implemented in xterm.js |
| Kitty graphics: display | ✗ no | Kitty graphics protocol not implemented in xterm.js |
| Kitty graphics: transmit | ✗ no | Kitty graphics protocol not implemented in xterm.js |
| Kitty graphics: Unicode placeholders | ✗ no | Kitty graphics protocol not implemented in xterm.js |
| Kitty keyboard protocol | ✗ no | Not implemented in xterm.js |
| Kitty keyboard: DISAMBIGUATE (flag 1) | ✗ no | Kitty keyboard protocol not implemented in xterm.js |
| Kitty keyboard: REPORT_ALL_KEYS (flag 8) | ✗ no | Kitty keyboard protocol not implemented in xterm.js |
| Kitty keyboard: REPORT_ALTERNATE (flag 4) | ✗ no | Kitty keyboard protocol not implemented in xterm.js |
| Kitty keyboard: REPORT_EVENTS (flag 2) | ✗ no | Kitty keyboard protocol not implemented in xterm.js |
| Kitty keyboard: REPORT_TEXT (flag 16) | ✗ no | Kitty keyboard protocol not implemented in xterm.js |
| Desktop Notifications (OSC 9/777) | ✗ no | OSC 9 notifications not implemented in xterm.js |
| VS Code Shell Integration (OSC 633) | ✗ no | VS Code shell integration (OSC 633) not supported |
| Icon and title (OSC 0) | ✓ yes | |
| Icon name (OSC 1) | ✓ yes | |
| Foreground color query (OSC 10) | ✗ no | OSC 10 foreground color query not implemented in xterm.js |
| Reset color palette (OSC 104) | ✗ no | OSC 104 color reset requires a real display — headless backends have no color palette to reset |
| Background color query (OSC 11) | ✗ no | OSC 11 background color query not implemented in xterm.js |
| Reset foreground color (OSC 110) | ✗ no | OSC 110 foreground reset requires a real display — headless backends have no color palette to reset |
| Reset background color (OSC 111) | ✗ no | OSC 111 background reset requires a real display — headless backends have no color palette to reset |
| Reset cursor color (OSC 112) | ✗ no | OSC 112 cursor color reset requires a real display — headless backends have no color palette to reset |
| Reset pointer fg color (OSC 113) | ? unknown | |
| Reset pointer bg color (OSC 114) | ? unknown | |
| Reset highlight background (OSC 117) | ✓ yes | |
| Reset highlight foreground (OSC 119) | ✓ yes | |
| Cursor color (OSC 12) | ✗ no | OSC 12 cursor color query requires a real display — headless backends have no color palette to query |
| OSC 133;A prompt start (FTCS_PROMPT) | ✓ yes | |
| OSC 133;B command start (FTCS_COMMAND_START) | ✓ yes | |
| OSC 133;C command executed (FTCS_COMMAND_EXECUTED) | ✓ yes | |
| OSC 133;D command finished (FTCS_COMMAND_FINISHED) | ✓ yes | |
| OSC 133;P properties | ✓ yes | |
| iTerm2 Capability Reporting (OSC 1337) | ✗ no | iTerm2-specific protocol not supported |
| iTerm2 Cell Size Reporting (OSC 1337) | ✗ no | iTerm2-specific protocol not supported |
| Highlight background (OSC 17) | ✗ no | OSC 17 highlight background query requires a real display — headless backends have no color palette to query |
| Set Wayland app-id (OSC 176) | ? unknown | |
| Highlight foreground (OSC 19) | ✗ no | OSC 19 highlight foreground query requires a real display — headless backends have no color palette to query |
| Window title (OSC 2) | ✓ yes | |
| Kitty color protocol (OSC 21) | ✗ no | Kitty color protocol (OSC 21) not implemented in xterm.js |
| Pointer shape (OSC 22) | ? unknown | |
| Kitty color stack push (OSC 30001) | ? unknown | |
| Systemd context (OSC 3008) | ? unknown | |
| Kitty color stack pop (OSC 30101) | ? unknown | |
| Color palette (OSC 4) | ✗ no | OSC 4 color query requires a real display — headless backends have no color palette to query |
| Audio sound (OSC 440) | ? unknown | |
| Special color (OSC 5) | ✗ no | OSC 5 special color query requires a real display — headless backends have no color palette to query |
| Clipboard access (OSC 52) | ✗ no | OSC 52 clipboard not implemented in xterm.js |
| OSC 52 clipboard read | ✗ no | OSC 52 clipboard read not implemented in xterm.js |
| OSC 52 clipboard write | ✓ yes | |
| OSC 5522 advanced clipboard | ✗ no | OSC 5522 not implemented in xterm.js |
| Screen flash (OSC 555) | ? unknown | |
| OSC 633;A prompt start | ✓ yes | |
| OSC 633;B prompt end | ✓ yes | |
| OSC 633;C pre-execution | ✓ yes | |
| OSC 633;D command finished | ✓ yes | |
| OSC 633;E set commandline | ✓ yes | |
| OSC 633;P properties | ✓ yes | |
| OSC 66 text sizing | ✗ no | OSC 66 text sizing not implemented in xterm.js |
| VTE termprop (OSC 666) | ? unknown | |
| Current directory (OSC 7) | ✗ no | OSC 7 not implemented in xterm.js headless |
| Locale query/set (OSC 701) | ? unknown | |
| Version query (OSC 702) | ? unknown | |
| Set normal font (OSC 710) | ? unknown | |
| Scroll view up (OSC 720) | ? unknown | |
| Cell size report (OSC 776) | ? unknown | |
| Notifications (OSC 777) | ? unknown | |
| Font size query/set (OSC 7770) | ? unknown | |
| Font + window size (OSC 7777) | ? unknown | |
| Hyperlinks (OSC 8) | ✓ yes | |
| OSC 9;4 progress bar | ? unknown | |
| Desktop notifications (OSC 99) | ? unknown | |
| Text reflow on resize | ✓ yes | |
| Semantic prompts (OSC 133) | ✗ no | Not implemented in xterm.js |
| Sixel graphics | ✗ no | Not implemented in xterm.js |
| Sixel support in DA1 | ✗ no | Sixel not implemented in xterm.js |
| Sixel geometry report (CSI ? Pi;Pa;Pv S) | ✓ yes | |
| 24-bit truecolor | ✓ yes |
Input Protocols
| Feature | Support | Notes |
|---|---|---|
| Button-Event Mouse (1002) | ✓ yes | |
| CSI u Key Encoding | ✗ no | CSI u keyboard protocol not implemented |
| Kitty click events | ? unknown | |
| modifyOtherKeys | ✗ no | modifyOtherKeys not implemented in xterm.js |
| modifyOtherKeys mode 3 | ✗ no | modifyOtherKeys mode 3 not implemented in xterm.js |
| Pixel Mouse Reporting (1016) | ✗ no | SGR pixel mouse mode not implemented in xterm.js |
| urxvt Mouse Reporting (1015) | ✗ no | urxvt mouse mode (?1015) not implemented |
| X10 Mouse Tracking (9) | ✓ yes |
Modes
Reset
| Feature | Support | Notes |
|---|---|---|
| DECALN screen alignment (ESC # 8) | ✓ yes | |
| Backend reset() method | ✓ yes | |
| Full reset (RIS) | ✓ yes | |
| SGR reset clears attributes | ✓ yes | |
| Soft reset (DECSTR) | ✓ yes |
Scrollback
| Feature | Support | Notes |
|---|---|---|
| Scrollback accumulates | ✓ yes | |
| Alt screen separate scrollback | ✓ yes | |
| DECSTBM constrains scrolling | ✓ yes | |
| DECSTBM reset to full screen | ✓ yes | |
| Reverse index (RI) | ✓ yes | |
| Scroll down (SD) | ✓ yes | |
| Scroll up (SU) | ~ partial | Headless API reads from buffer, not viewport after scroll |
| Scroll region (DECSTBM) | ✓ yes | |
| Total line count | ✓ yes |
SGR (Text Styling)
Text
| Feature | Support | Notes |
|---|---|---|
| Backspace (BS) | ✓ yes | |
| Basic text rendering | ✓ yes | |
| CBT backward tab (CSI Z) | ✓ yes | |
| CHT forward tab (CSI I) | ✓ yes | |
| Combining characters (0 cols) | ✓ yes | |
| Carriage return | ✓ yes | |
| HTS set tab stop (ESC H) | ✓ yes | |
| Index (IND) | ✓ yes | |
| Line feed | ✓ yes | |
| Next line (NEL) | ✓ yes | |
| Overwrite at cursor | ✓ yes | |
| Reverse Index at Scroll Top | ✓ yes | |
| Tab stops | ✓ yes | |
| TBC clear tab stop (CSI g) | ✗ no | Tab stop clear (TBC) not implemented in xterm.js headless mode |
| CJK wide chars (2 cols) | ✓ yes | |
| Emoji wide chars (2 cols) | ✗ no | Headless mode reports emoji as single-width |
| Regional indicator flags (2 cols) | ✗ no | Emoji flag sequences not rendered as wide characters |
| Variation selector 16 (emoji presentation) | ✗ no | VS16 emoji variation selectors not handled |
| Emoji ZWJ sequences (2 cols) | ✓ yes | |
| Text wraps at width | ✓ yes |
Unicode
| Feature | Support | Notes |
|---|---|---|
| East Asian Ambiguous Width | ✓ yes | |
| Grapheme Cluster Cursor Movement | ✓ yes | |
| Tab Stops (HT) | ✓ yes | |
| Wide Char at Line Wrap | ✓ yes |