Appearance
vt100.js
Headless Backend
Pure TypeScript VT100 emulator. Zero dependencies, fastest backend.
See also: VT100 standard features · DEC VT100 (historical)
vt100.js is a lightweight, zero-dependency terminal emulator written in pure TypeScript. It covers approximately 58% of the terminfo.dev feature matrix — SGR styling (bold, italic, underline, 256-color, truecolor), cursor positioning and visibility, scroll regions, alternate screen buffer, and basic character set handling. The coverage is a deliberate tradeoff: by focusing on the most commonly used features, vt100.js stays small, fast, and easy to reason about.
vt100.js was originally designed as the default backend for Termless (headless terminal testing). vterm.js has since replaced it as the default, offering near-100% feature coverage. The two libraries are complementary: vt100.js for speed in CI pipelines where only common features matter, vterm.js for thoroughness when standards compliance is the goal.
Pure TypeScript, zero dependencies, runs on any JavaScript runtime (Bun, Node.js, Deno, browsers).
Backend: Pure TypeScript VT100 emulator. Zero dependencies, fastest backend. (js) · v0.2.1
46%
107 passed · 126 failed of 233 features
Tested: April 10, 2026
Analysis2026-04-06
vt100.js scores 50% (114/227) on the terminfo.dev feature matrix, with gaps in the Core TUI, Modern TUI, Rich TUI, Unicode baselines. Ranks #12 of 12 tested terminals. Missing 113 features.
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 | ✗ no | CUP with DECOM not implemented — pure TypeScript emulator |
| CUU stops at top | ✓ yes | |
| Hide cursor (DECTCEM) | ✓ yes | |
| Cursor horizontal absolute (CHA) | ✓ yes | |
| HPA horizontal position absolute (CSI `) | ✗ no | HPA (horizontal position absolute) not implemented in vt100.js baseline emulator |
| 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) | ✓ yes | No output stream — pure TypeScript emulator |
| Reverse Wrap (Mode 45) | ✓ yes | |
| Save/restore cursor (DECSC) | ✓ yes | |
| Cursor shape (DECSCUSR) | ✗ no | Not implemented — pure TypeScript emulator |
| VPA vertical position absolute (CSI d) | ✓ yes |
Device Status
| Feature | Support | Notes |
|---|---|---|
| Mode Report (DECRPM) | ✗ no | No output stream — pure TypeScript emulator |
| Request Setting (DECRQSS) | ✗ no | No output stream — pure TypeScript emulator |
| DSR ?996 — color scheme query | ? unknown | |
| COLORTERM env variable | ? unknown | |
| KITTY_* env variables | ? unknown | |
| LC_TERMINAL env variable | ? unknown | |
| NO_COLOR env variable | ? unknown | |
| TERM env variable | ? unknown | |
| TERM_PROGRAM env variable | ? unknown | |
| VTE_VERSION env variable | ? unknown | |
| WEZTERM_* env variables | ? unknown | |
| WT_SESSION env variable | ? unknown | |
| Primary device attributes (DA1) | ✓ yes | No output stream — pure TypeScript emulator |
| Secondary Device Attributes (DA2) | ✗ no | No output stream — pure TypeScript emulator |
| Device status report (DSR 5) | ✓ yes | No output stream — pure TypeScript emulator |
| Feature Reporting (TERM_FEATURES) | ? unknown | |
| Tertiary Device Attributes (DA3) | ✗ no | No output stream — pure TypeScript emulator |
| Query Terminfo (XTGETTCAP) | ✗ no | No output stream — pure TypeScript emulator |
| XTGETXRES — query resource value (DCS + Q) | ✗ no | XTGETXRES resource query — xterm-specific |
| XTREPORTCOLORS — report color capabilities (CSI # R) | ✗ no | XTREPORTCOLORS (xterm patch 401+) not yet adopted outside xterm |
| Terminal Version (XTVERSION) | ✗ no | No output stream — pure TypeScript emulator |
| Report window size in pixels (CSI 14 t) | ✗ no | XTWINOPS not implemented — post-dates VT220 baseline |
| Report cell size in pixels (CSI 16 t) | ✗ no | XTWINOPS not implemented — post-dates VT220 baseline |
| Report text area size in chars (CSI 18 t) | ✗ no | XTWINOPS not implemented — post-dates VT220 baseline |
| Report icon label (CSI 20 t) | ✗ no | XTWINOPS not implemented — post-dates VT220 baseline |
| Report window title (CSI 21 t) | ✗ no | XTWINOPS not implemented — post-dates VT220 baseline |
| Push title/icon stack (CSI 22 ; 0 t) | ✓ yes | |
| Pop title/icon stack (CSI 23 ; 0 t) | ✓ yes |
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) | ✗ no | DCH (delete characters) not implemented in vt100.js baseline emulator |
| Delete lines (DL) | ✗ no | DL (delete lines) not implemented in vt100.js baseline emulator |
| Insert characters (ICH) | ✗ no | ICH (insert characters) not implemented in vt100.js baseline emulator |
| Insert lines (IL) | ✗ no | IL (insert lines) not implemented in vt100.js baseline emulator |
| Repeat character (REP) | ✗ no | REP not implemented — pure TypeScript emulator |
| 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) | ✗ no | ECH (erase character) not implemented in vt100.js baseline emulator |
| ED at scroll region boundary | ✓ yes | |
| EL erases with bg color | ✗ no | EL doesn't preserve SGR background — pure TypeScript emulator |
| 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) | ✗ no | DECSED not implemented — pure TypeScript emulator |
Extensions
| Feature | Support | Notes |
|---|---|---|
| System clipboard paste | ? unknown | |
| Font ligatures | ? unknown | |
| iTerm2 Inline Images (OSC 1337) | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty graphics protocol | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty graphics: animation | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty graphics: display | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty graphics: transmit | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty graphics: Unicode placeholders | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty keyboard protocol | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty keyboard: DISAMBIGUATE (flag 1) | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty keyboard: REPORT_ALL_KEYS (flag 8) | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty keyboard: REPORT_ALTERNATE (flag 4) | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty keyboard: REPORT_EVENTS (flag 2) | ✗ no | Not implemented — pure TypeScript emulator |
| Kitty keyboard: REPORT_TEXT (flag 16) | ✗ no | Not implemented — pure TypeScript emulator |
| Desktop Notifications (OSC 9/777) | ✗ no | Not implemented — pure TypeScript emulator |
| 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 | Not implemented — pure TypeScript emulator |
| Reset color palette (OSC 104) | ✗ no | Not implemented — pure TypeScript emulator |
| Background color query (OSC 11) | ✗ no | Not implemented — pure TypeScript emulator |
| Reset foreground color (OSC 110) | ✗ no | Not implemented — pure TypeScript emulator |
| Reset background color (OSC 111) | ✗ no | Not implemented — pure TypeScript emulator |
| Reset cursor color (OSC 112) | ✗ no | Not implemented — pure TypeScript emulator |
| 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 | Not implemented — pure TypeScript emulator |
| 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 implemented — pure TypeScript emulator |
| iTerm2 Cell Size Reporting (OSC 1337) | ✗ no | iTerm2-specific protocol not implemented — pure TypeScript emulator |
| Highlight background (OSC 17) | ✗ no | Not implemented — pure TypeScript emulator |
| Set Wayland app-id (OSC 176) | ? unknown | |
| Highlight foreground (OSC 19) | ✗ no | Not implemented — pure TypeScript emulator |
| Window title (OSC 2) | ✓ yes | |
| Kitty color protocol (OSC 21) | ✗ no | Kitty color protocol (OSC 21) not implemented — post-dates VT220 baseline |
| 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 | Not implemented — pure TypeScript emulator |
| Audio sound (OSC 440) | ? unknown | |
| Special color (OSC 5) | ✗ no | Not implemented — pure TypeScript emulator |
| Clipboard access (OSC 52) | ✗ no | Not implemented — pure TypeScript emulator |
| OSC 52 clipboard read | ✗ no | Not implemented — pure TypeScript emulator |
| OSC 52 clipboard write | ✓ yes | |
| OSC 5522 advanced clipboard | ✗ no | Not implemented — pure TypeScript emulator |
| 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 | Not implemented — pure TypeScript emulator |
| VTE termprop (OSC 666) | ? unknown | |
| Current directory (OSC 7) | ✗ no | Not implemented — pure TypeScript emulator |
| 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) | ✗ no | Not implemented — pure TypeScript emulator |
| OSC 9;4 progress bar | ? unknown | |
| Desktop notifications (OSC 99) | ? unknown | |
| Text reflow on resize | ✗ no | Not implemented — pure TypeScript emulator |
| Semantic prompts (OSC 133) | ✗ no | Not implemented — pure TypeScript emulator |
| Sixel graphics | ✗ no | Not implemented — pure TypeScript emulator |
| Sixel support in DA1 | ✗ no | Not implemented — pure TypeScript emulator |
| Sixel geometry report (CSI ? Pi;Pa;Pv S) | ✓ yes | |
| 24-bit truecolor | ✗ no | Not in VT100/VT220 — only 8 standard colors supported |
Input Protocols
| Feature | Support | Notes |
|---|---|---|
| Button-Event Mouse (1002) | ✗ no | Not in VT100/VT220 — xterm extension |
| CSI u Key Encoding | ✗ no | CSI u keyboard protocol not implemented |
| Kitty click events | ? unknown | |
| modifyOtherKeys | ✗ no | Not implemented — pure TypeScript emulator |
| modifyOtherKeys mode 3 | ✗ no | Not implemented — pure TypeScript emulator |
| Pixel Mouse Reporting (1016) | ✗ no | SGR pixel mouse mode not implemented — pure TypeScript emulator |
| urxvt Mouse Reporting (1015) | ✗ no | urxvt mouse mode (?1015) not implemented |
| X10 Mouse Tracking (9) | ✗ no | X10 mouse mode (?9) not implemented |
Modes
Reset
| Feature | Support | Notes |
|---|---|---|
| DECALN screen alignment (ESC # 8) | ✗ no | DECALN not implemented in vt100.js baseline emulator |
| Backend reset() method | ✓ yes | |
| Full reset (RIS) | ✓ yes | |
| SGR reset clears attributes | ✓ yes | |
| Soft reset (DECSTR) | ✗ no | DECSTR (soft reset) not implemented in vt100.js baseline emulator |
Scrollback
| Feature | Support | Notes |
|---|---|---|
| Scrollback accumulates | ✓ yes | |
| Alt screen separate scrollback | ✗ no | Not in VT100/VT220 — no alternate screen buffer |
| DECSTBM constrains scrolling | ✓ yes | |
| DECSTBM reset to full screen | ✓ yes | |
| Reverse index (RI) | ✓ yes | |
| Scroll down (SD) | ✓ yes | |
| Scroll up (SU) | ✓ yes | |
| Scroll region (DECSTBM) | ✓ yes | |
| Total line count | ✓ yes |
SGR (Text Styling)
| Feature | Support | Notes |
|---|---|---|
| 256-color bg (SGR 48;5) | ✗ no | Not in VT100/VT220 — only 8 standard colors supported |
| Bright bg colors (SGR 100-107) | ✗ no | Not in VT100/VT220 — only 8 standard colors supported |
| Default bg color (SGR 49) | ✓ yes | |
| Standard bg colors (SGR 40-47) | ✗ no | Standard background colors (SGR 40–47) not implemented in vt100.js baseline emulator |
| 24-bit bg (SGR 48;2) | ✗ no | Not in VT100/VT220 — only 8 standard colors supported |
| Blink (SGR 5) | ✓ yes | |
| Bold (SGR 1) | ✓ yes | |
| Faint/dim (SGR 2) | ✗ no | Not in VT100/VT220 — use vterm.js for modern SGR |
| 256-color fg (SGR 38;5) | ✗ no | Not in VT100/VT220 — only 8 standard colors supported |
| Bright fg colors (SGR 90-97) | ✗ no | Not in VT100/VT220 — only 8 standard colors supported |
| Default fg color (SGR 39) | ✓ yes | |
| Standard fg colors (SGR 30-37) | ✗ no | Standard foreground colors (SGR 30–37) not implemented in vt100.js baseline emulator |
| 24-bit fg (SGR 38;2) | ✗ no | Not in VT100/VT220 — only 8 standard colors supported |
| Hidden/invisible (SGR 8) | ✗ no | SGR 8 (hidden/invisible) not implemented in vt100.js baseline emulator |
| Inverse video (SGR 7) | ✓ yes | |
| Italic (SGR 3) | ✗ no | Not in VT100/VT220 — use vterm.js for modern SGR |
| 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) | ✗ no | Not in VT100/VT220 — use vterm.js for modern SGR |
| Underline color, indexed (SGR 58;5) | ✗ no | Colored underline (SGR 58) post-dates VT220 — not implemented in vt100.js baseline |
| Reset underline color (SGR 59) | ✗ no | Colored underline (SGR 59) post-dates VT220 — not implemented in vt100.js baseline |
| Underline color, truecolor (SGR 58;2) | ✗ no | Colored underline (SGR 58) post-dates VT220 — not implemented in vt100.js baseline |
| Underline color (SGR 58) | ✗ no | Not implemented — pure TypeScript emulator |
| Curly underline (SGR 4:3) | ✗ no | Not in VT100/VT220 — only single underline supported |
| Dashed underline (SGR 4:5) | ✗ no | Not in VT100/VT220 — only single underline supported |
| Dotted underline (SGR 4:4) | ✗ no | Not in VT100/VT220 — only single underline supported |
| Double underline (SGR 21) | ✗ no | Not in VT100/VT220 — only single underline supported |
| Underline (SGR 4) | ✓ yes |
Text
| Feature | Support | Notes |
|---|---|---|
| Backspace (BS) | ✓ yes | |
| Basic text rendering | ✓ yes | |
| CBT backward tab (CSI Z) | ✗ no | Tab stop manipulation not implemented in vt100.js |
| CHT forward tab (CSI I) | ✗ no | Tab stop manipulation not implemented in vt100.js |
| Combining characters (0 cols) | ✗ no | Combining characters not implemented — pure TypeScript emulator |
| Carriage return | ✓ yes | |
| HTS set tab stop (ESC H) | ✗ no | Tab stop manipulation not implemented in vt100.js |
| 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 manipulation not implemented in vt100.js |
| CJK wide chars (2 cols) | ✗ no | Not in VT100/VT220 — ASCII only, no Unicode width |
| Emoji wide chars (2 cols) | ✗ no | Not in VT100/VT220 — ASCII only, no Unicode 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 | ✗ no | Not in VT100/VT220 — ASCII only, no Unicode width |