Zig parses config values (cli/args.zig, Config.zig field parsers, config/string.zig) from raw byte slices, and each field type decides whether it requires UTF-8 (InvalidValue otherwise) or stores bytes. The port escape-encoded raw bytes into Strings at the line reader and let fields parse the escaped text, so fields could observe encoding artifacts; successive audits kept finding such leaks (RV5-RV8). Field parsers now receive the original bytes: text fields validate UTF-8 where Zig does, byte/path fields store bytes (EncodedOs/OsString). This resolves all 9 RV8 findings (docs/rewrite/notes/review-rv8-codex.md), each with a regression test: Windows path conversion fails with BadPathName instead of substituting U+FFFD; Windows process launch uses strict UTF-8 like Zig's Command; the WTF-8 decoder accepts paired- surrogate encodings like Zig; literal U+FDD0 Unicode key triggers; selection-word-chars and clipboard-codepoint-map reject invalid UTF-8; font style / codepoint-map family names use original bytes; C title actions forward bytes; D-Bus new-window/Flatpak conversions match Zig. Design, sweep and validation: docs/rewrite/notes/final-bytes-refactor.md. Also moves the bundled iTerm2-Color-Schemes license out of resources/themes/ so +list-themes no longer lists it as a theme (output is now byte-identical to Ghostty 1.3.1). Done by Codex (gpt-6-astra), reviewed and verified by the orchestrator. Test Plan: - cargo test --workspace --no-fail-fast (3428 passed, exit 0) - just check-macos (both), just check-windows, just check-wasm - +show-config --default --docs, +list-keybinds, +list-actions --docs, +list-themes --plain compared with /usr/bin/ghostty
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 omissionsdocs/rewrite/STATUS.md– work package historydocs/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/).