varinomics/vnm_terminal

Cross-platform Qt terminal emulator for Windows, macOS, and Linux (GPL-3.0-only).

C++

1

356 commits

updated Sep 20, 2026

See the code
conpty
cpp
linux
macos
msdf
pty
qml
qt
qt6
terminal
terminal-emulator
windows

See what people are saying (1)

SourceMessageScoreDate

a terminal emulator for a few recurring inconveniences (r/commandline)

I have been working on vnm\_terminal, a GPU-rendered terminal emulator. Some of its features: \- Output timestamps - to see when long-running commands finished. \- Direct window renaming and PID display on the window. \- An always-on-top toggle - keeps popping windows from covering the terminal. \-…

1

Sep 20, 2026

README

vnm_terminal

CI Linux CI Windows CI macOS

Latest release: Windows installer and other platform downloads

The primary Windows package is vnm_terminal_v<version>_windows_x64.exe.

vnm_terminal is a focused, single-session terminal emulator for Windows, macOS, and Linux. Each window hosts the platform's default shell or one explicit command. Tabs, splits, and connection management are outside the application's scope.

The application is built on vnm_terminal_surface, which owns terminal parsing, ConPTY/PTY process hosting, screen state, and GPU-accelerated rendering.

https://github.com/user-attachments/assets/8e9f8d95-cac4-434f-8612-d7b36ef34d94

An interactive vnm_terminal session, including appearance and behavior settings.

Highlights

  • Native ConPTY/PTY hosting with alternate-screen applications, keyboard and mouse reporting, bracketed paste, selection, and IME input.
  • GPU glyph-atlas text rendering with automatic MSDF and glyph-renderer selection, including LCD subpixel modes.
  • Reproducible terminal-cell widths based on an owned Unicode 16.0 policy.
  • Built-in window chrome, color schemes, font controls, scrollback settings, and persisted appearance and window configuration.
  • Retained-output search with result navigation and synchronized-output-safe publication semantics.
  • Explicit OSC 8 hyperlink interaction with host-side HTTP, HTTPS, and mailto scheme validation.
  • Safe clipboard defaults: terminal-originated OSC 52 writes remain denied unless the application policy explicitly allows them.

Release packages

All published packages are available from the latest release.

PlatformPackagesNotes
Windows x64EXE, portable ZIPThe signed Qt Installer Framework EXE installs under Program Files and includes Start Menu integration. The portable ZIP contains a top-level launcher.
Linux x64RUN, DEB, RPM, AppImageThe graphical RUN installer uses Qt Installer Framework. DEB and RPM integrate with native package managers; AppImage is the portable option.
macOS x64Application ZIPThe application bundle is ad-hoc signed but not Apple-notarized. Gatekeeper may quarantine it on first launch.

Windows and Linux packages include their private Qt runtime. Release source archives are available on the same page.

The Linux Qt Installer Framework package installs under /opt/vnm_terminal, adds the vnm_terminal command under /usr/local/bin, and registers a desktop launcher. Run its installed vnm_terminal_maintenance tool to uninstall it. Build it from a staged CMake install tree with:

tools/build_linux_ifw_installer.sh \
  --payload AppDir \
  --ifw-root /path/to/QtInstallerFramework/4.7

Cutting a release starts with refreshing the dependency lock. The procedure is in docs/releasing.md.

Windows CI produces an explicitly named vnm_terminal_v<version>_windows_x64_unsigned.exe verification artifact. It is not a release installer. A release EXE has the _unsigned suffix removed only after the payload, maintenance tool, and final installer have been successfully signed as Varinomics Ltd and timestamped.

Interaction

ActionDefault interaction
SearchCtrl+F (Cmd+F on macOS) opens the search overlay. Enter or F3 advances; the corresponding Shift chord selects the previous result.
Explicit hyperlinkCtrl+left-click requests activation. Only absolute HTTP, HTTPS, and mailto targets are dispatched.
PasteCtrl+V and Ctrl+Shift+V; the exact policy is configurable.
Copy on selectionDisabled by default and available under Settings > Behavior.
Custom window titleAlt+left-click the built-in titlebar, edit the title, then press Enter or click elsewhere.
Native titlebarOn Windows and Linux, --native-titlebar selects the platform frame; built-in chrome is the default. Other platforms use the native frame by default.

Command line

Without an explicit command after --, the platform's default shell starts.

vnm_terminal [application options] [-- command [arguments...]]

Common application options:

OptionValuesPurpose
--window-size<width>x<height>Initial window dimensions.
--native-titlebarOn Windows and Linux, use the platform-provided window frame.
--text-rendererauto, msdf, glyphTerminal text-renderer policy.
--lcd-subpixelauto, none, rgb, bgr, vrgb, vbgrMSDF LCD sampling policy.
--paste-shortcut<mode>Configurable paste-shortcut policy.
--synchronized-output-scroll-policydefer, immediate-publicScroll behavior during DEC synchronized output.

Example:

.\build\Release\vnm_terminal.exe --window-size 1000x640 -- cmd.exe

Source build

The release dependency layout places vnm_terminal_surface, vnm_qml_chrome and vnm_fonts beside this repository. Custom locations are supported through VNM_TERMINAL_SURFACE_SOURCE_DIR, VNM_QML_CHROME_SOURCE_DIR and VNM_FONTS_SOURCE_DIR; vnm_fonts is cloned from its master branch when no checkout is found.

vnm_terminal_surface must provide the vnm_terminal_surface::vnm_terminal_surface embedded-surface API target; its release version is independent of the application version. vnm_qml_chrome requires the same major version and at least the 1.8 top-frame stacking and default PID-reveal titlebar contracts. The validated Qt baseline is Qt 6.11.1 or newer.

cmake -S . -B build -DBUILD_TESTING=ON
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failure

Automated runs must not write the user's persisted settings. Defining VNM_TERMINAL_SETTINGS_NO_PERSIST disables window and appearance persistence for the process. The check is on the variable being defined, not on its value: any value disables persistence, including 0 and the empty string. Re-enable persistence by removing the variable from the environment. The offscreen Qt platform disables persistence as well, and the test registrations define the variable themselves.

The Windows build target deploys the required Qt DLLs and platforms plugin beside vnm_terminal.exe. The executable and its deployed runtime form one launchable build artifact.

Transcript capture/replay is excluded from normal builds. Local diagnostic builds expose it through -DVNM_TERMINAL_ENABLE_TRANSCRIPT_CAPTURE_REPLAY=ON; distribution builds use -DVNM_TERMINAL_DISTRIBUTION_BUILD=ON and reject transcript capture.

License

GNU General Public License version 3 only. LICENSE contains the full license text.

Contributors

imakris

345 commits

claude

11 commits

varinomics/vnm_terminal

Cross-platform Qt terminal emulator for Windows, macOS, and Linux (GPL-3.0-only).

C++

1

356 commits

updated Sep 20, 2026

See the code
conpty
cpp
linux
macos
msdf
pty
qml
qt
qt6
terminal
terminal-emulator
windows

See what people are saying (1)

SourceMessageScoreDate

a terminal emulator for a few recurring inconveniences (r/commandline)

I have been working on vnm\_terminal, a GPU-rendered terminal emulator. Some of its features: \- Output timestamps - to see when long-running commands finished. \- Direct window renaming and PID display on the window. \- An always-on-top toggle - keeps popping windows from covering the terminal. \-…

1

Sep 20, 2026

README

vnm_terminal

CI Linux CI Windows CI macOS

Latest release: Windows installer and other platform downloads

The primary Windows package is vnm_terminal_v<version>_windows_x64.exe.

vnm_terminal is a focused, single-session terminal emulator for Windows, macOS, and Linux. Each window hosts the platform's default shell or one explicit command. Tabs, splits, and connection management are outside the application's scope.

The application is built on vnm_terminal_surface, which owns terminal parsing, ConPTY/PTY process hosting, screen state, and GPU-accelerated rendering.

https://github.com/user-attachments/assets/8e9f8d95-cac4-434f-8612-d7b36ef34d94

An interactive vnm_terminal session, including appearance and behavior settings.

Highlights

  • Native ConPTY/PTY hosting with alternate-screen applications, keyboard and mouse reporting, bracketed paste, selection, and IME input.
  • GPU glyph-atlas text rendering with automatic MSDF and glyph-renderer selection, including LCD subpixel modes.
  • Reproducible terminal-cell widths based on an owned Unicode 16.0 policy.
  • Built-in window chrome, color schemes, font controls, scrollback settings, and persisted appearance and window configuration.
  • Retained-output search with result navigation and synchronized-output-safe publication semantics.
  • Explicit OSC 8 hyperlink interaction with host-side HTTP, HTTPS, and mailto scheme validation.
  • Safe clipboard defaults: terminal-originated OSC 52 writes remain denied unless the application policy explicitly allows them.

Release packages

All published packages are available from the latest release.

PlatformPackagesNotes
Windows x64EXE, portable ZIPThe signed Qt Installer Framework EXE installs under Program Files and includes Start Menu integration. The portable ZIP contains a top-level launcher.
Linux x64RUN, DEB, RPM, AppImageThe graphical RUN installer uses Qt Installer Framework. DEB and RPM integrate with native package managers; AppImage is the portable option.
macOS x64Application ZIPThe application bundle is ad-hoc signed but not Apple-notarized. Gatekeeper may quarantine it on first launch.

Windows and Linux packages include their private Qt runtime. Release source archives are available on the same page.

The Linux Qt Installer Framework package installs under /opt/vnm_terminal, adds the vnm_terminal command under /usr/local/bin, and registers a desktop launcher. Run its installed vnm_terminal_maintenance tool to uninstall it. Build it from a staged CMake install tree with:

tools/build_linux_ifw_installer.sh \
  --payload AppDir \
  --ifw-root /path/to/QtInstallerFramework/4.7

Cutting a release starts with refreshing the dependency lock. The procedure is in docs/releasing.md.

Windows CI produces an explicitly named vnm_terminal_v<version>_windows_x64_unsigned.exe verification artifact. It is not a release installer. A release EXE has the _unsigned suffix removed only after the payload, maintenance tool, and final installer have been successfully signed as Varinomics Ltd and timestamped.

Interaction

ActionDefault interaction
SearchCtrl+F (Cmd+F on macOS) opens the search overlay. Enter or F3 advances; the corresponding Shift chord selects the previous result.
Explicit hyperlinkCtrl+left-click requests activation. Only absolute HTTP, HTTPS, and mailto targets are dispatched.
PasteCtrl+V and Ctrl+Shift+V; the exact policy is configurable.
Copy on selectionDisabled by default and available under Settings > Behavior.
Custom window titleAlt+left-click the built-in titlebar, edit the title, then press Enter or click elsewhere.
Native titlebarOn Windows and Linux, --native-titlebar selects the platform frame; built-in chrome is the default. Other platforms use the native frame by default.

Command line

Without an explicit command after --, the platform's default shell starts.

vnm_terminal [application options] [-- command [arguments...]]

Common application options:

OptionValuesPurpose
--window-size<width>x<height>Initial window dimensions.
--native-titlebarOn Windows and Linux, use the platform-provided window frame.
--text-rendererauto, msdf, glyphTerminal text-renderer policy.
--lcd-subpixelauto, none, rgb, bgr, vrgb, vbgrMSDF LCD sampling policy.
--paste-shortcut<mode>Configurable paste-shortcut policy.
--synchronized-output-scroll-policydefer, immediate-publicScroll behavior during DEC synchronized output.

Example:

.\build\Release\vnm_terminal.exe --window-size 1000x640 -- cmd.exe

Source build

The release dependency layout places vnm_terminal_surface, vnm_qml_chrome and vnm_fonts beside this repository. Custom locations are supported through VNM_TERMINAL_SURFACE_SOURCE_DIR, VNM_QML_CHROME_SOURCE_DIR and VNM_FONTS_SOURCE_DIR; vnm_fonts is cloned from its master branch when no checkout is found.

vnm_terminal_surface must provide the vnm_terminal_surface::vnm_terminal_surface embedded-surface API target; its release version is independent of the application version. vnm_qml_chrome requires the same major version and at least the 1.8 top-frame stacking and default PID-reveal titlebar contracts. The validated Qt baseline is Qt 6.11.1 or newer.

cmake -S . -B build -DBUILD_TESTING=ON
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failure

Automated runs must not write the user's persisted settings. Defining VNM_TERMINAL_SETTINGS_NO_PERSIST disables window and appearance persistence for the process. The check is on the variable being defined, not on its value: any value disables persistence, including 0 and the empty string. Re-enable persistence by removing the variable from the environment. The offscreen Qt platform disables persistence as well, and the test registrations define the variable themselves.

The Windows build target deploys the required Qt DLLs and platforms plugin beside vnm_terminal.exe. The executable and its deployed runtime form one launchable build artifact.

Transcript capture/replay is excluded from normal builds. Local diagnostic builds expose it through -DVNM_TERMINAL_ENABLE_TRANSCRIPT_CAPTURE_REPLAY=ON; distribution builds use -DVNM_TERMINAL_DISTRIBUTION_BUILD=ON and reject transcript capture.

License

GNU General Public License version 3 only. LICENSE contains the full license text.

Contributors

imakris

345 commits

claude

11 commits

Languages

C++

42.2%

PowerShell

18.9%

C#

14.5%

CMake

11.9%

JavaScript

7.1%

C

1.7%

Qt Script

1.6%

Batchfile

1.4%