Files
ghostty-rs/docs/rewrite/STATUS.md
T
ddidderr 452b782149 feat(macos): port Ghostty's macOS code paths (Metal, CoreText, Darwin)
Ports the macOS-specific Zig code behind cfg(target_os = "macos"):
- renderer: a GraphicsApi trait with generic::Renderer<G>; Metal backend
  (all renderer/metal/* files, shaders.metal verbatim, runtime library
  compile, IOSurface layer, CVDisplayLink), shadertoy -> MSL via naga;
  OpenGL remains the backend elsewhere.
- font: CoreText face, shaper and discovery with build.rs backend
  selection (coretext default; coretext-freetype / coretext-harfbuzz /
  coretext-noshape features), no fontconfig/freetype/harfbuzz on Apple.
- input: KeymapDarwin via UCKeyTranslate, option-as-alt, mac keycodes.
- os: macos, mach, cf_release_thread, NSProcessInfo args and macOS
  branches; config: macOS defaults, keybinds, Application Support paths.
- termio/core: login(1) wrapping, openpty/execvpe, Darwin child exit
  handling, os_log logging.

Compile-checked for aarch64/x86_64-apple-darwin (clippy -D warnings
clean) using the cross setup in docs/rewrite/notes/macos-M1.md; cannot
run here. The embedded runtime/C API (embedded.zig) is the next step.

Also includes the cross-platform integration edits shared by the crash,
verification, Windows and macOS work (Cargo target-gating, thread
crash-context hooks, apprt-gtk surface/IME refactor, termio/os cfg
gates), a cfg fix so ghostty-config builds on wasm32, and an allow for
the intentional recursion in the crash overflow test.

Test Plan:
- cargo test --workspace (3224 passed)
- cargo clippy --workspace --all-targets -- -D warnings
- cargo check --target aarch64-apple-darwin -p ghostty-renderer (with
  the documented cross env)
2026-10-12 06:02:39 +02:00

6.6 KiB
Raw Blame History

Status

Overall: Linux/GTK port complete and verified (3038 tests). Phase 8 in progress: libghostty C API, libghostty-vt C API, WASM, macOS Zig paths, Windows, crash handling, GTK compat fallbacks, remaining verification + perf.

Legend: ⬜ todo · 🟨 in progress · ✅ done (gate passed, committed) · ⚠️ done with gaps

WP Scope Owner State Notes
P0 scaffolding opus ✅
W1 vt: parser/osc/color sonnet ✅
W2 vt: csi/sgr/modes/kitty/apc/dcs sonnet ✅
W3 unicode + datastruct sonnet ✅
W4 os sonnet ⚠️ ensure_locale no-op, flatpak untested
W5 input sonnet ✅
W6 config sonnet ✅
W7 font: metrics + sprite sonnet ✅
S1 vt: stream.zig + simd sonnet ✅
T1 terminal: size/point/style/hyperlink/rcset/page/PageList codex astra ✅ full parity; open API requests in notes/ghostty-terminal-pagelist-requests.md
F1 font engine (freetype/fontconfig/harfbuzz, Collection, SharedGrid) sonnet ✅ run.zig + SharedGridSet deferred (F2)
IO1 termio: pty, Command, shell integration, terminfo sonnet ✅
C1 cli actions sonnet ✅ list-fonts, show-face, new-window deferred
T2 terminal: Screen, ScreenSet, Tabstops, Selection sonnet ✅
R1 renderer: OpenGL base, shaders, shadertoy, size, cursor sonnet ✅
A0 apprt contract types sonnet ✅
G1 apprt-gtk (GTK4/libadwaita app) sonnet ✅ against CoreApp/CoreSurface traits; untested interactively
T3 terminal: Terminal + stream_readonly + StringMap sonnet ✅ tmux viewer not wired
F2 font: run.zig, SharedGridSet, config integration, terminal shaper tests sonnet ✅
K1 terminal: kitty graphics image/storage/unicode/render/exec sonnet ✅ wired (TI)
T4 terminal: render state, highlight, formatter sonnet ✅
T5 terminal: search + tmux viewer sonnet ✅ tmux viewer not wired to termio yet
IO2 termio: Exec, Termio, Thread, stream_handler sonnet ✅
R2 renderer: generic, cell, row, link, State, Overlay, image, Thread sonnet ✅ kitty update_kitty stub
TI terminal integration: kitty wiring + PageList requests, remove workarounds codex astra ✅ 1252 tests
CORE core App/Surface, trait move, state unification, root main, run app sonnet ✅ app runs; input untested at runtime
V1 headless e2e tests (input/mouse/clipboard/actions) + GTK input replay, fix bugs sonnet ⚠️ stalled twice; 81 e2e tests pass; handed to V1b
V2 resources bundling (themes, terminfo), INTEGRATION_TODO cleanup sonnet ✅ termio/gtk parts commit with V1
RV1 Codex read-only audit core Surface vs Zig codex astra ✅ 9 findings (notes/review-core-codex.md) → handed to V1
P1 ghostty-bench port, Zig baseline, perf tuning sonnet ✅ stream at Zig parity; screen-clone 2.6x
V1b finish V1: clippy, audit fixes, GTK replay check sonnet ✅ GTK typing/tabs/splits/copy-paste/font-size verified
P2 perf: screen-clone, osc-parser sonnet ✅ clone at parity; render 2.4x
I1 inspector (ImGui) crate + GTK widgets + core hooks sonnet ✅ verified in real app
RV2 Codex completeness audit (every Zig file → Rust) codex astra ✅ 319 full / 28 partial / 7 missing → X1, X2
X1 distribution: completions, vim/bat, man pages, translations, install modes, build metadata sonnet ✅ byte-identical to installed Ghostty
X2 correctness gaps from RV2 (flatpak, env bytes, case folding, ...) sonnet ✅ all 10 items
V3 real-app verification: nvim/htop/less/tmux, mouse, unicode, kitty images, paste dialog sonnet ✅ no product bugs found
DOC README, CHANGELOG, ARCHITECTURE decomposition opus ✅

Phase 8 — full scope

WP Scope Owner State Notes
L2 libghostty-vt C API (lib_vt.zig, terminal/c/, vt.h) + run example/c-vt + wasm examples sonnet ✅ ABI-checked, examples run
W1 WASM: main_wasm, config/Wasm, os/wasm, font web_canvas face+shaper sonnet ✅ W1b aligning zig-js ABI
CR crash/* (sentry envelope, local crash reports, thread context hooks) sonnet ✅ uncommitted (shared files with VR)
PF perf: RenderState render 2.4x, parser SGR 1.5x sonnet ✅ all benches ≤ Zig
VR verify IME, paste dialog confirm/deny, quick terminal (niri layer-shell), Flatpak via mock D-Bus sonnet 🟨 batch A
L1 libghostty C API (apprt/embedded.zig, main_c.zig, config CApi/c_get, ghostty.h ABI) – ⬜ batch B
M1 macOS: Metal renderer, CoreText face/shaper/discovery, KeymapDarwin, os macos/mach sonnet 🟨
WIN Windows: ConPTY pty, os/windows, Command sonnet 🟨
W1b wasm: align JS imports with zig-js ABI sonnet ✅
GC GTK/adw compat fallbacks, bench wcwidth/uucode modes, helpgen generators – ⬜ batch B

Log

  • 2026-10-11: Phase 0 complete; Phase 1 launched.
  • 2026-10-11: vt (W1+W2) and font sprite (W7) committed; S1 + T1 launched.
  • 2026-10-11: Phase 1 done (vt, unicode, datastruct, os, input, config, font sprite). F1, IO1, C1 launched; T1 (Codex) still running.
  • 2026-10-11: termio IO1 + font F1 committed. T1 partial (snapshot reflow, head-walking pins) → Codex round 2 in worktree. T2, R1 launched.
  • 2026-10-11: cli, apprt contract, renderer base committed. G1 (GTK) launched.
  • 2026-10-11: Screen committed. T3, F2 launched.
  • 2026-10-11: F2 committed; K1 launched.
  • 2026-10-11: Terminal committed (849 tests). T4, T5, IO2 launched.
  • 2026-10-11: PageList parity merged (913 tests, 0 ignored). T4 committed; R2 launched.
  • 2026-10-11: T5, K1 committed (1243 terminal tests). Codex TI launched.
  • 2026-10-11: GTK runtime committed; terminal integration pass done (1252 tests, 0 ignored).
  • 2026-10-11: IO2, R2 committed. CORE integration launched (Phase 6).
  • 2026-10-12: CORE committed — cargo run opens a working terminal (2890 tests). Phase 7 verification: V1, V2, RV1 launched.
  • 2026-10-12: P1 (perf parity on terminal-stream) and V2 cleanup committed.
  • 2026-10-12: V1 stalled (large transcript); restarted fresh as V1b. P2 launched.
  • 2026-10-12: V1b + P2 committed (2983 tests). I1 inspector + RV2 completeness audit launched.
  • 2026-10-12: I1, X1, X2 committed (3037 tests). Docs written. V3 real-app verification running.
  • 2026-10-12: V3 verification passed, final polish (nightly fmt) done. Rewrite complete.
  • 2026-10-12: Stop-hook review: 'full end-to-end' not met → Phase 8 (full scope) started.