Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 0 additions & 97 deletions .github/workflows/build-ghostty.yml

This file was deleted.

28 changes: 7 additions & 21 deletions .github/workflows/build-terminal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@ on:
- "**"
tags:
- "v*"
paths-ignore:
- ".github/workflows/build-ghostty.yml"
pull_request:
paths-ignore:
- ".github/workflows/build-ghostty.yml"
workflow_dispatch:
inputs:
version:
Expand Down Expand Up @@ -142,12 +138,10 @@ jobs:
with:
path: |
artifacts/tools
artifacts/ghostty-src
native/ghostty/*/*
native/linux-pty/*/dt-pty-host
native/noto-emoji/NotoColorEmoji.ttf
# Never restore native sources or reuse binaries built from different inputs.
key: native-v2-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/ghostty/ghostty-upstream.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}
key: native-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/zig.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}

- name: Set up .NET
uses: actions/setup-dotnet@v4
Expand Down Expand Up @@ -199,7 +193,7 @@ jobs:
uses: actions/cache@v4
with:
path: artifacts/tools
key: zig-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/Zig.ps1', 'native/ghostty/ghostty-upstream.json') }}
key: zig-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/Zig.ps1', 'native/zig.json') }}

- name: Build dt-pty-host for every Unix RID
shell: pwsh
Expand Down Expand Up @@ -233,7 +227,7 @@ jobs:
with:
path: |
native/noto-emoji/NotoColorEmoji.ttf
key: native-v2-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/ghostty/ghostty-upstream.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}
key: native-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/zig.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}

- name: Set up .NET
uses: actions/setup-dotnet@v4
Expand Down Expand Up @@ -337,11 +331,9 @@ jobs:
with:
path: |
artifacts/tools
artifacts/ghostty-src
native/ghostty/*/*
native/linux-pty/*/dt-pty-host
native/noto-emoji/NotoColorEmoji.ttf
key: native-v2-${{ runner.os }}-${{ runner.arch }}-${{ matrix.rid }}-${{ hashFiles('native/**/*.ps1', 'native/ghostty/ghostty-upstream.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}
key: native-v3-${{ runner.os }}-${{ runner.arch }}-${{ matrix.rid }}-${{ hashFiles('native/**/*.ps1', 'native/zig.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}

- name: Set up .NET
uses: actions/setup-dotnet@v4
Expand Down Expand Up @@ -378,11 +370,9 @@ jobs:
with:
path: |
artifacts/tools
artifacts/ghostty-src
native/ghostty/*/*
native/linux-pty/*/dt-pty-host
native/noto-emoji/NotoColorEmoji.ttf
key: native-v2-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/ghostty/ghostty-upstream.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}
key: native-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/zig.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}

- name: Set up .NET
uses: actions/setup-dotnet@v4
Expand Down Expand Up @@ -411,11 +401,9 @@ jobs:
with:
path: |
artifacts/tools
artifacts/ghostty-src
native/ghostty/*/*
native/linux-pty/*/dt-pty-host
native/noto-emoji/NotoColorEmoji.ttf
key: native-v2-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/ghostty/ghostty-upstream.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}
key: native-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/zig.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}

- name: Set up .NET
uses: actions/setup-dotnet@v4
Expand Down Expand Up @@ -460,11 +448,9 @@ jobs:
with:
path: |
artifacts/tools
artifacts/ghostty-src
native/ghostty/*/*
native/linux-pty/*/dt-pty-host
native/noto-emoji/NotoColorEmoji.ttf
key: native-v2-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/ghostty/ghostty-upstream.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}
key: native-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/zig.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}

- name: Set up .NET
uses: actions/setup-dotnet@v4
Expand Down
6 changes: 2 additions & 4 deletions .github/workflows/test-iseberg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,9 @@ jobs:
with:
path: |
artifacts/tools
artifacts/ghostty-src
native/ghostty/*/*
native/linux-pty/*/dt-pty-host
native/noto-emoji/NotoColorEmoji.ttf
key: native-v2-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/ghostty/ghostty-upstream.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}
key: native-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('native/**/*.ps1', 'native/zig.json', 'native/linux-pty/dt-pty-host.c', 'native/noto-emoji/noto-emoji.json') }}

- name: Set up .NET
uses: actions/setup-dotnet@v4
Expand All @@ -72,7 +70,7 @@ jobs:
shell: pwsh
run: ./scripts/Install-IsebergTestPowerShell.ps1

# A native cache miss downloads Zig and compiles Ghostty; keep that out of the test budget.
# A native cache miss downloads Zig and compiles dt-pty-host; keep that out of the test budget.
- name: Restore native libraries
timeout-minutes: 30
shell: pwsh
Expand Down
4 changes: 0 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@ Thumbs.db
.DS_Store

## Native libraries built from source (see native/Restore-NativeLibraries.ps1)
native/ghostty/**/*.dll
native/ghostty/**/*.so
native/ghostty/**/*.dylib
native/ghostty/**/*.sha256
native/linux-pty/**/dt-pty-host
native/linux-pty/**/dt-pty-host.exe
native/noto-emoji/NotoColorEmoji.ttf
6 changes: 3 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ already the primary scripting language for Windows packaging in this repo
## Native helpers

- Linux/macOS PTY host: `native/linux-pty` (`dt-pty-host.c`)
- Ghostty VT library: `native/ghostty`
- Windows Explorer/toast helpers: `native/windows-shell`

`dotnet build` restores these for the host RID automatically
(`-p:SkipNativeRestore=true` to skip).
`dotnet build` restores `dt-pty-host` for Linux/macOS host RIDs automatically
(Zig version pinned in `native/zig.json`; `-p:SkipNativeRestore=true` to
skip). Windows builds have nothing to restore.

## Platform packaging entry points

Expand Down
12 changes: 6 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,13 @@ Do not point that tool at this repository.
## Native helpers

- Linux/macOS PTY host: `native/linux-pty` (`dt-pty-host.c`; Zig `cc` on Linux, Apple clang on macOS)
- Ghostty VT library: `native/ghostty` (Zig build of pinned Ghostty)
- Windows Explorer/toast helpers: `native/windows-shell` (MSVC, gitignored `bin/`)

`dotnet build` restores Ghostty and `dt-pty-host` for the host RID (Zig is
downloaded into `artifacts/tools` on first use; a system `zig` of a different
minor version than the pinned one is ignored, so it does not break the build). See
[`native/ghostty/README.md`](native/ghostty/README.md). Pass
`dotnet build` restores `dt-pty-host` for Linux/macOS host RIDs; Windows builds
have nothing to restore. The Zig version is pinned in
[`native/zig.json`](native/zig.json); Zig is downloaded into `artifacts/tools`
on first use, and a system `zig` of a different minor version than the pinned
one is ignored, so it does not break the build. Pass
`-p:SkipNativeRestore=true` to skip.

## macOS
Expand All @@ -88,7 +88,7 @@ dotnet test Devolutions.Terminal.slnx
pwsh scripts/Build-MacOsPackage.ps1 osx-arm64 2026.3.0 artifacts/packages
```

`dotnet build` restores Ghostty and `dt-pty-host` for `osx-arm64` / `osx-x64`.
`dotnet build` restores `dt-pty-host` for `osx-arm64` / `osx-x64`.
The PTY host is compiled with Apple clang against the macOS 13 SDK. App-bundle
packaging is Darwin-only; release builds are signed and notarized with a
Developer ID identity (see [docs/macos.md](docs/macos.md) and
Expand Down
2 changes: 0 additions & 2 deletions Devolutions.Terminal.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
<Project Path="src/Devolutions.Terminal.Connection/Devolutions.Terminal.Connection.csproj" />
<Project Path="src/Devolutions.Terminal.Control/Devolutions.Terminal.Control.csproj" />
<Project Path="src/Devolutions.Terminal.Core/Devolutions.Terminal.Core.csproj" />
<Project Path="src/Devolutions.Terminal.Ghostty/Devolutions.Terminal.Ghostty.csproj" />
<Project Path="src/Devolutions.Terminal.Render/Devolutions.Terminal.Render.csproj" />
<Project Path="src/Devolutions.Terminal.Settings/Devolutions.Terminal.Settings.csproj" />
<Project Path="src/Devolutions.Terminal.Broker/Devolutions.Terminal.Broker.csproj" />
Expand All @@ -27,7 +26,6 @@
<Project Path="tests/Devolutions.Terminal.Connection.Tests/Devolutions.Terminal.Connection.Tests.csproj" />
<Project Path="tests/Devolutions.Terminal.Control.Tests/Devolutions.Terminal.Control.Tests.csproj" />
<Project Path="tests/Devolutions.Terminal.Core.Tests/Devolutions.Terminal.Core.Tests.csproj" />
<Project Path="tests/Devolutions.Terminal.Ghostty.Tests/Devolutions.Terminal.Ghostty.Tests.csproj" />
<Project Path="tests/Devolutions.Terminal.Render.Tests/Devolutions.Terminal.Render.Tests.csproj" />
<Project Path="tests/Devolutions.Terminal.Settings.Tests/Devolutions.Terminal.Settings.Tests.csproj" />
<Project Path="tests/Devolutions.Terminal.Broker.Tests/Devolutions.Terminal.Broker.Tests.csproj" />
Expand Down
5 changes: 0 additions & 5 deletions NOTICE.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,6 @@ See the license in the Cascadia Code repository.
Vendored under `native/noto-emoji/`. Licensed under the SIL Open Font License
1.1. See `native/noto-emoji/LICENSE`.

## Ghostty (`libghostty-vt`)

Pinned native VT engine binaries under `native/ghostty/`. See
`native/ghostty/LICENSE` and `docs/ghostty-engine.md`.

## AppImage type-2 runtime

Linux AppImage packages embed a pinned type-2 runtime. See
Expand Down
7 changes: 1 addition & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ as a self-contained **NativeAOT** desktop app, and rendered with **Avalonia 12**

- **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
- a built-in VT engine written in C#
- Windows Terminal-compatible `settings.json`, actions, keybindings, and `dt` CLI
- source-integrated **Iseberg** PowerShell ISE profiles, with execution in an
owned PowerShell subprocess and a NativeAOT desktop
Expand Down Expand Up @@ -104,18 +104,13 @@ windows is unavailable, and persisted layouts are neither restored nor saved.
It is the per-launch equivalent of Windows Terminal's
`compatibility.isolatedMode` setting, which Windows Terminal 1.23 removed.

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](docs/settings-editor.md).

## Architecture

```
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 + browser shell
Devolutions.Terminal.Settings Layered Windows Terminal-compatible JSON settings
Expand Down
6 changes: 2 additions & 4 deletions docs/advanced-vt-protocols.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
> [!NOTE]
> Windows local sessions use the bundled Microsoft ConPTY runtime, including
> `OpenConsole.exe`, rather than the OS copy that filters Sixel on some Windows
> builds. With the built-in engine, Sixel producers such as `Get-XKCD -Show`
> can render inline images. Other transports must likewise preserve graphics
> payloads; the optional Ghostty engine does not expose image resources.
> builds. Sixel producers such as `Get-XKCD -Show` can therefore render inline
> images. Other transports must likewise preserve graphics payloads.

`Devolutions.Terminal.Core` parses advanced string protocols without depending on Avalonia,
Skia, Win32, or an image codec. It exposes decoded Sixel pixels and bounded
Expand Down Expand Up @@ -140,7 +139,6 @@ delete or reset does not paint stale cached pixels.
- kitty cell/z-index/number-targeted deletes (`d=c/x/y/z/n`) — silent no-op;
the cursor for `f=100` images without `r` stays put because Core retains codec
bytes without decoding dimensions
- Ghostty image projection (the pinned C ABI exposes no image resources)

These gaps avoid remote I/O and renderer/input dependencies while keeping every
implemented parser and downloadable resource path bounded.
1 change: 0 additions & 1 deletion docs/browser.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ Devolutions Terminal can run as a static Avalonia WebAssembly app. This is a
| Desktop capability | Why it is out of scope |
| --- | --- |
| ConPTY / `forkpty` inside the page | No process or PTY APIs in the WASM sandbox. A loopback host process can own the PTY and bridge it over WebSocket. |
| Ghostty (`libghostty-vt`) | Native library, not compiled to WASM |
| `dt` CLI, broker, multi-window | Separate OS processes and named endpoints |
| Package identity, toasts, jump lists, global hotkeys | Windows / desktop shell |
| Native file dialogs, unrestricted filesystem | Browser sandbox (MEMFS only) |
Expand Down
Loading
Loading