A cross-platform terminal emulator implemented in C# on .NET 10, published with NativeAOT, and rendered with Avalonia 12 / Skia:
- ConPTY on Windows and a real forkpty transport on Linux and macOS
- Azure Cloud Shell for remote Azure sessions
- selectable built-in or Ghostty VT engine
- Windows Terminal-compatible
settings.json, actions, keybindings, anddtCLI
This is the Devolutions Terminal
source tree. Projects, namespaces, and the GUI host use Devolutions.Terminal.*.
The CLI executable is dt.
dotnet test Devolutions.Terminal.slnx
dotnet run --project src/Devolutions.Terminaldotnet publish src/Devolutions.Terminal -c Release -r win-x64 --self-containedThe native executable is written to
src/Devolutions.Terminal/bin/Release/net10.0/win-x64/publish/Devolutions.Terminal.exe.
macOS NativeAOT app bundles (Darwin only):
scripts/Build-MacOsPackage.sh osx-arm64 0.1.0 artifacts/packages
bash scripts/Test-MacOsPackage.sh osx-arm64 artifacts/packages/*.zipLinux x64 and ARM64 NativeAOT packages are built on Linux with:
scripts/Build-LinuxPackage.sh linux-x64 0.1.0 artifacts/packages all
scripts/Build-LinuxPackage.sh linux-arm64 0.1.0 artifacts/packages all
bash scripts/Test-LinuxPackage.sh linux-x64 artifacts/packages/*-linux-x64.*The builder emits .tar.gz, .deb, .rpm, .AppImage, and .sha256 files.
Every format consumes the same normalized /opt/devolutions-terminal payload
and /usr desktop integration layout. SOURCE_DATE_EPOCH controls package
timestamps.
After extracting a tarball at the filesystem root:
sudo /opt/devolutions-terminal/linux/Install-LinuxDesktopIntegration.sh install
/opt/devolutions-terminal/linux/Install-LinuxDesktopIntegration.sh register-protocol
/opt/devolutions-terminal/linux/Install-LinuxDesktopIntegration.sh set-default-terminal.\src\Devolutions.Terminal.Package\Scripts\Build-Packages.ps1Development signing, trust, install, validation, and uninstall commands are in
src/Devolutions.Terminal.Package/README.md.
Settings are stored at %LOCALAPPDATA%\Devolutions\Terminal\settings.json on
Windows, under $XDG_CONFIG_HOME/devolutions-terminal on Linux (usual
~/.config fallback), and at
~/Library/Application Support/Devolutions/Terminal/ on macOS.
Set WT_BASE_SETTINGS_PATH to use a directory for settings.json and
state.json (same contract as Devolutions' Windows Terminal distribution).
Set DTERM_SETTINGS_PATH (or WT_DOTNET_SETTINGS_PATH) to load a specific
settings file. On Windows, WT_PARENT_WINDOW_HANDLE embeds the window as a
child of that HWND. alwaysShowTabs: false hides the tab row when only one
tab is open.
Set "experimental.terminalEngine": "ghostty" to use the pinned
libghostty-vt engine globally. A profile can override it with "builtin" or
"ghostty". ConPTY remains the Windows process transport for both engines.
The compiled-XAML settings editor is documented in docs/settings-editor.md.
Devolutions.Terminal.Core VT parser + text buffer + terminal engine
Devolutions.Terminal.Ghostty NativeAOT-safe libghostty-vt engine adapter
Devolutions.Terminal.Render Immutable plans + HarfBuzz/Skia glyph renderer
Devolutions.Terminal.Connection ConPTY + Linux PTY + Azure Cloud Shell
Devolutions.Terminal.Settings Layered Windows Terminal-compatible JSON settings
Devolutions.Terminal.Control Avalonia TermControl renderer
Devolutions.Terminal.App Tabs, title bar, panes, actions, window behavior
Devolutions.Terminal NativeAOT executable and composition root
The measured remaining parity contract is in docs/parity-status.md. Architecture decisions are recorded in docs/decisions. Renderer contracts are documented in docs/renderer.md. Control, clipboard, IME, and accessibility contracts are documented in docs/control-accessibility.md. Advanced VT protocols are documented in docs/advanced-vt-protocols.md. Azure Cloud Shell is documented in docs/azure-cloud-shell.md. Build and release gates are documented in docs/release.md.
The port tracks Windows Terminal settings, actions, VT dispatch, command line,
and settings-page surfaces in
compat/windows-terminal.json. Tests use that
checked-in snapshot. Regenerating it requires a separate Microsoft Windows
Terminal C++ checkout:
dotnet run --project tools/Devolutions.Terminal.PortInventory -- <windows-terminal-checkout> compat/windows-terminal.json