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
77%
113 passed · 10 partial · 24 failed of 147 features
Tested: March 26, 2026
Analysis2026-03-26
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 |
|---|---|---|
| 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 | |
| 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 |
Device Status
| Feature | Support | Notes |
|---|---|---|
| Mode Report (DECRPM) | ✓ yes | |
| Request Setting (DECRQSS) | ✓ yes | |
| Primary device attributes (DA1) | ~ partial | Headless mode has no output stream for DA1 responses |
| Secondary Device Attributes (DA2) | ✓ yes | |
| Device status report (DSR 5) | ~ partial | Headless mode has no output stream for DSR responses |
| Feature Reporting (TERM_FEATURES) | ? unknown | |
| Tertiary Device Attributes (DA3) | ✗ no | DA3 not implemented in xterm.js |
| Query Terminfo (XTGETTCAP) | ✗ no | XTGETTCAP not implemented in xterm.js |
| Terminal Version (XTVERSION) | ✓ yes | XTVERSION not implemented in xterm.js |
Editing
| Feature | Support | Notes |
|---|---|---|
| Delete characters (DCH) | ✓ yes | |
| Delete lines (DL) | ✓ yes | |
| Insert characters (ICH) | ✓ yes | |
| Insert lines (IL) | ✓ yes | |
| Repeat character (REP) | ✓ yes |
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 |
|---|---|---|
| iTerm2 Inline Images (OSC 1337) | ✗ no | iTerm2 inline images not implemented in xterm.js |
| Kitty graphics protocol | ✗ no | Not implemented in xterm.js |
| Kitty keyboard protocol | ✗ no | 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 | |
| Foreground color query (OSC 10) | ✗ no | not supported |
| Background color query (OSC 11) | ✗ no | not supported |
| iTerm2 Capability Reporting (OSC 1337) | ✗ no | iTerm2-specific protocol not supported |
| iTerm2 Cell Size Reporting (OSC 1337) | ✗ no | iTerm2-specific protocol not supported |
| Window title (OSC 2) | ✓ yes | |
| Clipboard access (OSC 52) | ✗ no | not supported |
| OSC 5522 advanced clipboard | ? unknown | OSC 5522 not implemented in xterm.js |
| OSC 66 text sizing | ? unknown | OSC 66 text sizing not implemented in xterm.js |
| Current directory (OSC 7) | ✗ no | OSC 7 not implemented in xterm.js headless |
| Hyperlinks (OSC 8) | ✓ yes | |
| OSC 9;4 progress bar | ? 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 |
| 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 |
| modifyOtherKeys | ✗ no | modifyOtherKeys not implemented in xterm.js |
| modifyOtherKeys mode 3 | ? unknown | 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
| Feature | Support | Notes |
|---|---|---|
| Enter alt screen (DECSET 1049) | ✓ yes | |
| Exit alt screen (DECRST 1049) | ✓ yes | |
| App cursor keys (DECCKM) | ✓ yes | |
| Application keypad (DECKPAM) | ✓ yes | |
| Auto-wrap (DECAWM) | ✓ yes | |
| Bracketed paste (DECSET 2004) | ✓ yes | |
| Mode 2031 color scheme reporting | ? unknown | Mode 2031 not implemented in xterm.js |
| Focus tracking (DECSET 1004) | ✓ yes | |
| Insert/replace mode (IRM) | ✓ yes | |
| Left/Right Margins (DECLRMM, Mode 69) | ✗ no | DECLRMM not implemented in xterm.js |
| All motion mouse (DECSET 1003) | ✓ yes | |
| SGR mouse mode (DECSET 1006) | ~ partial | SGR mouse encoding not exposed in xterm.js headless mode |
| Mouse tracking (DECSET 1000) | ✓ yes | |
| Origin mode (DECOM) | ✓ yes | |
| Reverse video (DECSCNM) | ~ partial | Parser handles DECSCNM but headless mode doesn't expose the state |
| Synchronized output (DECSET 2026) | ✓ yes |
Reset
| Feature | Support | Notes |
|---|---|---|
| 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)
| Feature | Support | Notes |
|---|---|---|
| 256-color bg (SGR 48;5) | ✓ yes | |
| Bright bg colors (SGR 100-107) | ✓ yes | |
| Default bg color (SGR 49) | ✓ yes | |
| Standard bg colors (SGR 40-47) | ✓ yes | |
| 24-bit bg (SGR 48;2) | ✓ yes | |
| Blink (SGR 5) | ~ partial | Parser handles SGR 5 but headless mode doesn't expose blink attribute |
| Bold (SGR 1) | ✓ yes | |
| Faint/dim (SGR 2) | ✓ yes | |
| 256-color fg (SGR 38;5) | ✓ yes | |
| Bright fg colors (SGR 90-97) | ✓ yes | |
| Default fg color (SGR 39) | ✓ yes | |
| Standard fg colors (SGR 30-37) | ✓ yes | |
| 24-bit fg (SGR 38;2) | ✓ yes | |
| Hidden/invisible (SGR 8) | ~ partial | Parser handles SGR 8 but headless mode doesn't expose hidden attribute |
| Inverse video (SGR 7) | ✓ yes | |
| Italic (SGR 3) | ✓ yes | |
| Overline (SGR 53) | ✓ yes | |
| Reset all (SGR 0) | ✓ yes | |
| Reset bold/dim (SGR 22) | ✓ yes | |
| Reset inverse (SGR 27) | ✓ yes | |
| Reset italic (SGR 23) | ✓ yes | |
| Reset underline (SGR 24) | ✓ yes | |
| Strikethrough (SGR 9) | ✓ yes | |
| Underline color (SGR 58) | ✓ yes | |
| Curly underline (SGR 4:3) | ✓ yes | |
| Dashed underline (SGR 4:5) | ✓ yes | |
| Dotted underline (SGR 4:4) | ✓ yes | |
| Double underline (SGR 21) | ✓ yes | |
| Underline (SGR 4) | ✓ yes |
Text
| Feature | Support | Notes |
|---|---|---|
| Backspace (BS) | ✓ yes | |
| Basic text rendering | ✓ yes | |
| Combining characters (0 cols) | ✓ yes | |
| Carriage return | ✓ yes | |
| Index (IND) | ✓ yes | |
| Line feed | ✓ yes | |
| Next line (NEL) | ✓ yes | |
| Overwrite at cursor | ✓ yes | |
| Reverse Index at Scroll Top | ✓ yes | |
| Tab stops | ✓ yes | |
| 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 |