Skip to content

Releases: directvt/vtm

v2026.03.19

19 Mar 20:17
5d34d42

Choose a tag to compare

GitHub all current

Changes

  • Switch to FT+HB from DirectWrite (GUI mode, Win32 only). #571

v2026.03.07

07 Mar 18:10
304d7b7

Choose a tag to compare

GitHub all current

Changes

  • Built-in terminal:
    • Blend the semi-transparent foreground color with the global foreground color (instead of the global background).
      Tinting the global foreground color with a translucent color (with an alpha channel) allows colored text to be displayed independently of the color scheme.
image image

v2026.03.06

06 Mar 14:08
4f4dbcb

Choose a tag to compare

GitHub all current

Known Issues

  • Powershell text background is not completely fixed.
    UPDATE: I re-uploaded Windows builds that fixed 97795fc the black text on a black background in powershell.
    Workaround (microsoft/terminal#15452, PowerShell/PSReadLine#3702):
    Set-PSReadLineOption -Colors @{
        ContinuationPrompt = "`e[39m"
        Default            = "`e[39m"
        Member             = "`e[39m"
        Number             = "`e[39m"
        Type               = "`e[39m"
    }
    

Changes

  • Built-in terminal:
    • Fix powershell text background.
    • Remove the default translucency of non-scrolling regions (top/bottom/left/right).

v2026.03.05

05 Mar 20:16
1afa9ea

Choose a tag to compare

GitHub all current

Changes

  • Built-in terminal:
    • Fix line input mode when preprocessing is disabled (allow Ctrl+Z to be read by ReadFile). xlink: microsoft/terminal#19940
    • Fix palette loading from settings ('/config/terminal/colors/color*')
    • Fix OSC 10/11 request (default fg/bg).
    • Drop '/config/terminal/colors/bground' from settings.xml (in favor of '/config/terminal/colors/default').
    • Fix OSC 104 (reset palette record).

v2026.03.04

04 Mar 21:57
d5ed8da

Choose a tag to compare

GitHub all current

Changes

  • Built-in terminal: Fix DECCOLM toggle between 80/132 modes.
  • Fix GUI window layout restoring after Win+D (Win32).
  • Workaround for the 'HWND_TOPMOST win32' bug (after Win+D pressed twice) (Win32).

v2026.03.03

03 Mar 13:56
e1bebee

Choose a tag to compare

GitHub all current

Changes

  • Built-in terminal:
    • Implement color blending in linear RGB space with correction of color intensity deviations and applying dynamic contrast.
image image image
settings.xml
  • ~/.config/vtm/settings.xml:
    <config>
        <terminal>
            <menu>
                <item*/>
                <item label=" Clear " script=TerminalClearScrollback|OnLeftClick/>
                <item label=" \e[38:2::0:255:0mPrint Test\e[m " tooltip=" Click to print a test page ">
                    <script=OnLeftClick>
                        terminal.LineWrapMode(0)
                        terminal.Print("\\n\\nBlending Test\\n\\n")
                        local function print_color_row(start_code)
                            terminal.Print("    ")
                            for i = 0, 7 do
                                local code = start_code + i
                                terminal.Print("\\x1b["..code.."m  \\x1b[m")
                            end
                        end
                        print_color_row(40)
                        terminal.Print("\\n")
                        print_color_row(100)
                        terminal.Print("\\n\\n")
                        local function colored_text(r1, g1, b1, a1, r2, g2, b2, a2)
                            local text = "  Some Text Fragment  "
                            local len = #text
                            local result = "    "
                            for i = 1, len do
                                local ratio = (len > 1) and ((i - 1) / (len - 1)) or 0
                                local r = math.floor(r1 + (r2 - r1) * ratio)
                                local g = math.floor(g1 + (g2 - g1) * ratio)
                                local b = math.floor(b1 + (b2 - b1) * ratio)
                                local a = math.floor(a1 + (a2 - a1) * ratio)
                                local char = text:sub(i, i)
                                result = result .. string.format("\\x1b[48:2:%d:%d:%d:%dm%s", r, g, b, a, char)
                            end
                            local tail = 64
                            for i = 1, tail do
                                local ratio = (i - 1) / (tail - 1)
                                local a = math.floor(a2 * (1 - ratio))
                                result = result .. string.format("\\x1b[48:2:%d:%d:%d:%dm ", r2, g2, b2, a)
                            end
                            result = result.."\\x1b[m\\n"
                            return result
                        end
                        local alpha = 64
                        terminal.Print(colored_text(255, 255, 0,   alpha,  255, 0,   0,   alpha), '\\n')
                        terminal.Print(colored_text(255, 0,   255, alpha,  0,   0,   255, alpha), '\\n')
                        terminal.Print(colored_text(0,   255, 255, alpha,  0,   255, 0,   alpha), '\\n')
                        terminal.Print(colored_text(128, 128, 128, alpha,  255, 255, 255, alpha), '\\n')
                        alpha = 128
                        terminal.Print(colored_text(255, 255, 0,   alpha,  255, 0,   0,   alpha), '\\n')
                        terminal.Print(colored_text(255, 0,   255, alpha,  0,   0,   255, alpha), '\\n')
                        terminal.Print(colored_text(0,   255, 255, alpha,  0,   255, 0,   alpha), '\\n')
                        terminal.Print(colored_text(128, 128, 128, alpha,  255, 255, 255, alpha), '\\n')
                        alpha = 254
                        --terminal.Print(colored_text(255, 255, 0,   alpha,  255, 0,   0,   alpha), '\\n')
                        --terminal.Print(colored_text(255, 0,   255, alpha,  0,   0,   255, alpha), '\\n')
                        --terminal.Print(colored_text(0,   255, 255, alpha,  0,   255, 0,   alpha), '\\n')
                        --terminal.Print(colored_text(128, 128, 128, alpha,  255, 255, 255, alpha), '\\n')
                        terminal.LineWrapMode(1)
                    </script>
                </item>
                <item=Green/>
                <item=Red/>
                <item=Blue/>
                <item=GreenLt/>
                <item=RedLt/>
                <item=BlueLt/>
                <item=WhiteLt/>
                <item=Yellow/>
                <item=Magenta/>
                <item=Cyan/>
                <item=YellowLt/>
                <item=MagentaLt/>
                <item=CyanLt/>
                <item=CGA/>
                <item=Ubuntu24/>
                <item=CampbellPowershell/>
                <item=OneHalfLight/>
                <item=OneHalfDark/>
                <item=SolarizedLight/>
                <item=SolarizedDark/>
                <item=TangoLight/>
                <item=TangoDark/>
                <item=VSCodeLightModern/>
                <item=VSCodeDarkModern/>
                <item=Dimidium/>
                <item=Ottosson/>
                <item=Campbell/>
                <item=Vintage/>
                <item=DarkPlus/>
                <item=IBM5153/>
            </menu>
        </terminal>
    </config>
    <Dimidium label=" Dimidium ">
        <script=OnLeftClick>
            terminal.Print("\\x1b]10;rgb:BA/B7/B6\\x07")
            terminal.Print("\\x1b]11;rgb:14/14/14\\x07")
            terminal.Print("\\x1b]12;rgb:37/E5/7B\\x07")
            terminal.Print("\\x1b]4;0;rgb:00/00/00;1;rgb:CF/49/4C;2;rgb:60/B4/42;3;rgb:DB/9C/11;4;rgb:05/75/D8;5;rgb:AF/5E/D2;6;rgb:1D/B6/BB;7;rgb:BA/B7/B6;8;rgb:81/7E/7E;9;rgb:FF/64/3B;10;rgb:37/E5/7B;11;rgb:FC/CD/1A;12;rgb:68/8D/FD;13;rgb:ED/6F/E9;14;rgb:32/E0/FB;15;rgb:DE/E3/E4\\x07")
        </script>
    </Dimidium>
    <Ottosson label=" Ottosson ">
        <script=OnLeftClick>
            terminal.Print("\\x1b]10;rgb:BE/BE/BE\\x07")
            terminal.Print("\\x1b]11;rgb:00/00/00\\x07")
            terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07")
            terminal.Print("\\x1b]4;0;rgb:00/00/00;1;rgb:BE/2C/21;2;rgb:3F/AE/3A;3;rgb:BE/9A/4A;4;rgb:20/4D/BE;5;rgb:BB/54/BE;6;rgb:00/A7/B2;7;rgb:BE/BE/BE;8;rgb:80/80/80;9;rgb:FF/3E/30;10;rgb:58/EA/51;11;rgb:FF/C9/44;12;rgb:2F/6A/FF;13;rgb:FC/74/FF;14;rgb:00/E1/F0;15;rgb:FF/FF/FF\\x07")
        </script>
    </Ottosson>
    <Campbell label=" Campbell ">
        <script=OnLeftClick>
            terminal.Print("\\x1b]10;rgb:CC/CC/CC\\x07")
            terminal.Print("\\x1b]11;rgb:0C/0C/0C\\x07")
            terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07")
            terminal.Print("\\x1b]4;0;rgb:0C/0C/0C;1;rgb:C5/0F/1F;2;rgb:13/A1/0E;3;rgb:C1/9C/00;4;rgb:00/37/DA;5;rgb:88/17/98;6;rgb:3A/96/DD;7;rgb:CC/CC/CC;8;rgb:76/76/76;9;rgb:E7/48/56;10;rgb:16/C6/0C;11;rgb:F9/F1/A5;12;rgb:3B/78/FF;13;rgb:B4/00/9E;14;rgb:61/D6/D6;15;rgb:F2/F2/F2\\x07")
        </script>
    </Campbell>
    <CampbellPowershell label=" Campbell Powershell ">
        <script=OnLeftClick>
            terminal.Print("\\x1b]10;rgb:CC/CC/CC\\x07")
            terminal.Print("\\x1b]11;rgb:01/24/56\\x07")
            terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07")
            terminal.Print("\\x1b]4;0;rgb:0C/0C/0C;1;rgb:C5/0F/1F;2;rgb:13/A1/0E;3;rgb:C1/9C/00;4;rgb:00/37/DA;5;rgb:88/17/98;6;rgb:3A/96/DD;7;rgb:CC/CC/CC;8;rgb:76/76/76;9;rgb:E7/48/56;10;rgb:16/C6/0C;11;rgb:F9/F1/A5;12;rgb:3B/78/FF;13;rgb:B4/00/9E;14;rgb:61/D6/D6;15;rgb:F2/F2/F2\\x07")
        </script>
    </CampbellPowershell>
    <Vintage label=" Vintage ">
        <script=OnLeftClick>
            terminal.Print("\\x1b]10;rgb:C0/C0/C0\\x07")
            terminal.Print("\\x1b]11;rgb:00/00/00\\x07")
            terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07")
            terminal.Print("\\x1b]4;0;rgb:00/00/00;1;rgb:80/00/00;2;rgb:00/80/00;3;rgb:80/80/00;4;rgb:00/00/80;5;rgb:80/00/80;6;rgb:00/80/80;7;rgb:C0/C0/C0;8;rgb:80/80/80;9;rgb:FF/00/00;10;rgb:00/FF/00;11;rgb:FF/FF/00;12;rgb:00/00/FF;13;rgb:FF/00/FF;14;rgb:00/FF/FF;15;rgb:FF/FF/FF\\x07")
        </script>
    </Vintage>
    <OneHalfDark label=" One Half Dark ">
        <script=OnLeftClick>
            terminal.Print("\\x1b]10;rgb:DC/DF/E4\\x07")
            terminal.Print("\\x1b]11;rgb:28/2C/34\\x07")
            terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07")
            terminal.Print("\\x1b]4;0;rgb:28/2C/34;1;rgb:E0/6C/75;2;rgb:98/C3/79;3;rgb:E5/C0/7B;4;rgb:61/AF/EF;5;rgb:C6/78/DD;6;rgb:56/B6/C2;7;rgb:DC/DF/E4;8;rgb:5A/63/74;9;rgb:E0/6C/75;10;rgb:98/C3/79;11;rgb:E5/C0/7B;12;rgb:61/AF/EF;13;rgb:C6/78/DD;14;rgb:56/B6/C2;15;rgb:DC/DF/E4\\x07")
        </script>
    </OneHalfDark>
    <OneHalfLight label=" One Half Light ">
        <script=OnLeftClick>
            terminal.Print("\\x1b]10;rgb:38/3A/42\\x07")
            terminal.Print("\\x1b]11;rgb:FA/FA/FA\\x07")
            terminal.Print("\\x1b]12;rgb:4F/52/5D\\x07")
            terminal.Print("\\x1b]4;0;rgb:38/3A/42;1;rgb:E4/56/49;2;rgb:50/A1/4F;3;rgb:C1/83/01;4;rgb:01/84/BC;5;rgb:A6/26/A4;6;rgb:09/97/B3;7;rgb:FA/FA/FA;8;rgb:4F/52/5D;9;rgb:DF/6C/75;10;rgb:98/C3/79;11;rgb:E4/C0/7A;12;rgb:61/AF/EF;13;rgb:C5/77/DD;14;rgb:56/B5/C1;15;rgb:FF/FF/FF\\x07")
        </script>
    </OneHalfLight>
    <SolarizedDark label=" Solarized Dark ">
        <script=OnLeftClick>
            terminal.Print("\\x1b]10;rgb:83/94/96\\x07")
            terminal.Print("\\x1b]11;rgb:00/2B/36\\x07")
            terminal.Print("\\x1b]12;rgb:FF/FF/FF\\x07")
            terminal.Print("\\x1b]4;0;rgb:00/2B/36;1;rgb:DC/32/2F;2;rgb:85/99/00;3;rgb:B5/89/00;4;rgb:26/8B/D2;5;rgb:D3/36/82;6;rgb:2A/A1/98;7;rgb:EE/E8/D5;8;rgb:07/36/42;9;rgb:CB/4B/16;10;rgb:58/6E/75;11;rgb:65/7B/83;12;rgb:83/94/96;13;rgb:6C/71/C4;14;rgb:93/A1/A1;15;rgb:FD/F6/E3\\x07")
        </sc...
Read more

v2026.02.28

28 Feb 17:46
3026871

Choose a tag to compare

GitHub all current

Changes

  • Allow to store index colors (0-255) in the built-in terminal as is.

v2026.02.27

27 Feb 23:04
89a9eab

Choose a tag to compare

GitHub all current

Changes

  • Implement new transparency support logic for the built-in terminal:
    • Store an alpha channel for colors:
      • Foreground of each scrollback cell (SGR 38:2::R:G:B:A, A=255 by default)
      • Background of each scrollback cell (SGR 48:2::R:G:B:A, A=255 by default)
    • Inherit the foreground alpha for underline colors (set by SGR 58:2::R:G:B).
    • Handle the terminal window rendering by:
      • Blending the semi-transparent background color of the scrollback rows with the global background color (set by OSC 11).
      • Blending the semi-transparent foreground (and underline) color of the scrollback rows with the final background color calculated in the previous step.

An example of using color brushes that are independent of the global background:

printf "\e[m
 \e[35b\n  \e[48:2::0:0:255:128m Some Text Fragment \e[m  
 \e[35b\n  \e[48:2::0:255:0:128m Some Text Fragment \e[m  
 \e[35b\n  \e[48:2::255:0:0:128m Some Text Fragment \e[m  
 \e[35b\n  \e[48:2::0:255:255:128m Some Text Fragment \e[m  
 \e[35b\n  \e[48:2::255:255:0:128m Some Text Fragment \e[m  
 \e[35b\n  \e[48:2::255:0:255:128m Some Text Fragment \e[m  
 \e[36b\n"

v2026.02.20

20 Feb 16:03
61d0366

Choose a tag to compare

GitHub all current

Changes

  • Fix 256-color palette change via OSC 4.
  • Introduce an interactive session token. #877
ObjectID/ClassID Role Methods Method description
terminal vtm.terminal.RequestInteractiveSessionToken() Request an interactive session token. The token will be sent to the requesting app via APC in the following format:
\e_event=session;token=b4514088589a99e3\e\\.

Terminal control using Lua scripts via APC

The built-in terminal is capable of executing Lua scripts received via APC (Application Program Command) vt-sequences. The format of the vt-sequence is as follows:

ESC _ lua: <script body> ST

or

ESC _ lua:FFFFFFFFFFFFFFFF: <script body> ST

where:

  • ESC_: APC vt-sequence prefix.
  • lua:: case-insensitive APC payload marker.
  • <script body>: Lua script body.
  • ST: ESC``\ or BEL - APC sequence terminator.
  • FFFFFFFFFFFFFFFF:: 16-hexadecimal-digit interactive session token ending with a colon. This token can be obtained using the following APC request: \e_lua:terminal.RequestInteractiveSessionToken()\a - The terminal will respond with an APC sequence containing the 16 digits of the required interactive token: \e_event=session;token=FFFFFFFFFFFFFFFF\e\\.

Note: Without specifying an interactive session token, calls to functions related to interactive interaction (moving/sizing windows, mouse, keyboard, focus, etc.) will be silently ignored.

Usage examples:

Note: The global variable terminal (in the Lua namespace) is an alias for vtm.terminal.

  • bash:
    # Print the current scrollback buffer limits
    printf "\e_lua: local n,m,q=terminal.ScrollbackSize(); terminal.PrintLn('size=', n, ' growstep=', m, ' maxsize=', q)\e\\"
    
    # Set the scrollback buffer limit to 10K lines
    printf "\e_lua: terminal.ScrollbackSize(10000)\a"
    
    # Maximize the terminal window
    ## 1. Get a session token:
    printf "\e_lua:terminal.RequestInteractiveSessionToken()\a"
    ## 2. Use the received token when requesting to maximize the window:
    printf "\e_lua:0000000000000000: vtm.applet.Maximize()\e\\"
    

v2026.02.16

16 Feb 15:19
4606eb8

Choose a tag to compare

GitHub all current

Changes

  • Improve control over locked windows. #872
    • Suppress window manager closing by non-owner using the keyboard (Esc+W; or by script).