ddidderr 325288b7ee fix-deviant(terminal): no panics on input-reachable terminal states
Intentional deviation from Ghostty 1.3.1 (DEVIANT_FIXES.md entry 10).
Two terminal inputs reach states that Zig handles only by assertion
(Debug/ReleaseSafe abort; ReleaseFast continues):
- Toggling mode 2027 around a BOM before a wide character hits
  `assert(!b)` in print_grapheme. This repository's release profile
  keeps debug assertions, so terminal output could crash a release
  build. The assertion is removed and the path behaves like Zig
  ReleaseFast.
- A grapheme (e.g. a Devanagari conjunct) at the right margin on the
  bottom row with scrolling margins returned InvalidCoordinate and left
  a grapheme flag without data, panicking later in the formatter. The
  grapheme now moves from the cell that actually holds it and no cell is
  flagged without data.

tools/difftest gains a Rust-only panic hunt (`difftest_fuzz panics`,
lenient driver): ~60k debug-build cases now run without any panic, and
3000 Zig differential cases show 0 divergences.

Test Plan:
- cargo test -p ghostty-terminal difftest_mode_2027_toggle_with_bom_does_not_panic
  difftest_grapheme_wrap_scrolling_margins_keeps_grapheme
- cargo run -p difftest --bin difftest_fuzz -- panics
2026-10-12 16:53:27 +02:00
2026-10-11 21:27:49 +02:00
2026-10-11 21:27:49 +02:00
2026-10-11 21:27:49 +02:00
2026-10-11 21:27:49 +02:00
2026-10-11 21:27:49 +02:00

ghostty-rs

A Rust rewrite of the Ghostty 1.3.1 terminal emulator for Linux (GTK4 + libadwaita, OpenGL).

It aims for behavioural parity with Ghostty: the same configuration file format, options, defaults and documentation; the same keybindings and actions; the same ghostty +action CLI; the same terminal emulation (including kitty keyboard/graphics protocols, OSC 8 hyperlinks, semantic prompts, synchronized output, tmux control mode); the same shell integration, themes and terminfo.

Out of scope: macOS, Windows, WASM, the embedded libghostty C API, and Sentry crash reporting (disabled by default on Linux upstream).

Building and running

Requirements: Rust (edition 2024), GTK ≥ 4.14, libadwaita ≥ 1.5, fontconfig, freetype, harfbuzz, Oniguruma, libepoxy, blueprint-compiler and glib-compile-resources at build time.

cargo run                      # open a terminal window running your shell
cargo run -- -e htop           # run a command
cargo run -- +list-themes      # CLI actions work like Ghostty's
cargo run --profile production # optimized build (LTO, no debug assertions)

Development builds find resources/ (shell integration, themes, terminfo) automatically. Your existing Ghostty config (~/.config/ghostty/config[.ghostty]) is used as-is.

Installing

just install /usr/local          # binary, share/ghostty, terminfo, desktop files,
                                 # completions, man pages, translations, icons
just install /usr false true     # system-package layout (lib/systemd/user)

Testing

just test      # cargo test --workspace (~3000 tests)
just clippy    # clippy with -D warnings

Every Zig test block of the ported files was ported to a Rust test. crates/ghostty-core/tests holds end-to-end tests that drive the real core, terminal and a real pty through a fake app runtime. ghostty-bench mirrors Ghostty's benchmark tool; terminal stream throughput is on par with the Zig build (see docs/rewrite/notes/perf-P1.md).

Documentation

  • docs/rewrite/ARCHITECTURE.md – top-down decomposition, crate map, key design decisions, intentional omissions
  • docs/rewrite/STATUS.md – work package history
  • docs/rewrite/notes/ – per-crate porting notes, deviations from Zig, audits and verification reports

License

MIT, like Ghostty. Bundled fonts and themes carry their own licenses (see crates/ghostty-font/res/ and resources/themes/).

S
Description
No description provided
Readme
36 MiB
0 Stars 1 Watchers 0 Forks
Languages
Rust 95%
C 1.5%
Shell 1.4%
HTML 0.6%
GLSL 0.3%
Other 1.1%