Skip to content

Remove the Ghostty engine - #63

Merged
Marc-André Moreau (mamoreau-devolutions) merged 1 commit into
masterfrom
claude/ghostty-1-4-upgrade-985c2c
Oct 28, 2026
Merged

Marc-André Moreau (mamoreau-devolutions) merged 1 commit into
masterfrom
claude/ghostty-1-4-upgrade-985c2c

Conversation

@mamoreau-devolutions

Copy link
Copy Markdown
Contributor

Summary

Removes the optional Ghostty (libghostty-vt) terminal engine. The builtin engine is now the only engine.

Why

  • Builtin already covers it. Ghostty advertised only Vt52Keyboard. Builtin advertises that plus grapheme clusters, row rendition, DRCS, kitty keyboard, modifyOtherKeys, Win32 input, and Sixel/iTerm2/ConEmu/kitty images (see docs/parity-status.md). On all 13 vt benchmark workloads the two engines produced identical screens except one styled row, which is a builtin bug (a combining mark after a space is dropped) and is not fixed here.
  • Ghostty was opt-in only. It sat behind experimental.terminalEngine; builtin was the default.
  • Upgrading to 1.4 would have been a regression. libghostty-vt 1.4.0 makes Windows ingest about 6x slower on any workload that fills scrollback (scrolling: 29 → 5 MB/s). The cause is upstream commit 60b43068c ("reclaim pooled and compressed page memory on Windows"), which calls DiscardVirtualMemory on every recycled page. Disabling that one change brought 1.4 back to 35 MB/s.

What changed

  • Code: deleted src/Devolutions.Terminal.Ghostty, tests/Devolutions.Terminal.Ghostty.Tests, native/ghostty, .github/workflows/build-ghostty.yml and docs/ghostty-engine.md.
  • Settings: removed experimental.terminalEngine (global and per profile) and the two engine pickers in the settings editor. A settings file that still selects "ghostty" loads as builtin, and saving leaves the key untouched because saves are diff-based. Tests cover this.
  • Packaging: ghostty-vt.dll/libghostty-vt.so/.dylib and THIRD-PARTY-NOTICES-GHOSTTY.txt are no longer shipped or checked in the MSIX, Linux, macOS or NuGet payloads. GHOSTTY_LIBRARY is gone from macos/package.env.
  • Native restore: NativeLibraries.targets and Restore-NativeLibraries.ps1 now only build dt-pty-host, for Linux/macOS RIDs; Windows builds skip the restore step entirely. The Zig pin (unchanged at 0.16.0) moves to native/zig.json.
  • CI: cache keys now hash native/zig.json and are bumped to native-v3, so old caches containing Ghostty sources and binaries aren't restored.
  • Benchmarks: the vt suite replaces the ghostty-vt/ghostty targets with a control target. It runs FNV-1a over the same bytes, a serial loop whose speed follows the core clock, and -Baseline now gates on builtin/control. -RequireBeatGhostty, -GhosttyBench, --no-gate and the screen-equivalence check are removed.
  • Docs: the Ghostty comparison moved to docs/history/ghostty-comparison-benchmarks.md, with a shorter current docs/performance-benchmarks.md in its place. README, AGENTS, CONTRIBUTING, NOTICE, parity-status, release, macOS and renderer docs are updated.

Testing

  • Build and tests: dotnet build Devolutions.Terminal.slnx -c Release gives 0 warnings and 0 errors. dotnet test passes 3,170 tests with 11 skipped (Windows x64).
  • Package self-tests: Test-ConPtyPublishLayout.ps1, Test-MacOsLegalNotices.ps1 and Test-PackageBuild.ps1 pass locally.
  • Native restore: a forced linux-x64 restore downloads Zig 0.16.0 from native/zig.json and builds dt-pty-host. A win-x64 restore is a no-op.
  • Bench: a -Baseline comparison between two runs works. Absolute builtin speed moved −3.4% while builtin/control moved +2.1%, so the control absorbs machine drift.

Reviewer notes

  • macOS and Linux packaging scripts were syntax-checked only (bash -n, PowerShell parser). This PR's CI is their first real run, and Test-MacOsPackagingMetadata.ps1 needs plutil.
  • Intentional "ghostty" mentions: the bench workload descriptions still credit ghostty-gen as the source of the corpus shapes, and the corpus bytes are unchanged so saved baselines stay comparable. winterm-ghostty comments refer to an unrelated prior-art project.
  • Branch name: it still says "1.4 upgrade" because the work started as that upgrade. The upgrade edits were discarded in favor of the removal.

🤖 Generated with Claude Code

The builtin engine already covers everything the optional Ghostty engine
offered: Ghostty advertised only VT52 keyboard support, while builtin adds
grapheme clusters, row rendition, DRCS, kitty keyboard, modifyOtherKeys,
Win32 input, and Sixel/iTerm2/ConEmu/kitty images. libghostty-vt 1.4 also
regressed Windows scrollback ingest about 6x (DiscardVirtualMemory on every
recycled page), so upgrading it was not worth carrying.

- Delete Devolutions.Terminal.Ghostty, its tests, native/ghostty and the
  build-ghostty workflow; stop shipping libghostty-vt and its notice in the
  MSIX, Linux, macOS and NuGet payloads.
- Drop experimental.terminalEngine and the engine pickers. Settings files
  that still select "ghostty" load as builtin and keep the key untouched.
- Native restore now only builds dt-pty-host for Unix RIDs; Windows builds
  skip it. The Zig pin (0.16.0) moves to native/zig.json and CI cache keys
  follow it.
- The vt bench replaces the ghostty-vt control with an FNV-1a clock
  control; -Baseline gates on builtin/control. -RequireBeatGhostty and
  -GhosttyBench are removed.
- Move the Ghostty comparison write-up to docs/history and update the docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
publish-dry-run — cf900227 Deployed Oct 28, 2026 by mamoreau-devolutions via MSIX packages #384
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant