English | 한국어
A macOS fork of Ghostty that replaces native window tabs with an in-window Workspace → Tab → Pane hierarchy, driven from a left sidebar.
Upstream gives every tab its own NSWindow inside an NSWindowTabGroup. That
is the right default for a terminal, but it makes a set of related shells a
property of the window manager rather than of the app: there is no grouping
above a tab, the group is invisible when the window is not frontmost, and
anything that wants to reason about "the session I was working in" has to go
through AppKit.
Chostty keeps one physical window and owns the hierarchy itself. Workspaces
group tabs, tabs own a split tree of panes, and the sidebar shows all of it at
once. AppKit tabbing is not hidden or worked around — it is removed, and
macos/scripts/native-tab-audit.sh fails the build if any of it comes back.
Everything below the window model is stock Ghostty: the same renderer, the same config file, the same terminfo, the same shell integration.
Download the DMG from Releases and drag Chostty to Applications. Releases are signed with a Developer ID and notarized, so they open without extra steps. Universal binary, macOS 13 and later.
Chostty updates itself through Sparkle, against this repository's signed
appcast and never upstream's. Set auto-update = off to stop automatic checks,
or auto-update = download to fetch updates in the background. Installs of
0.2.12 or older have no updater and need one manual upgrade.
Chostty's version numbers are its own. 1.0.0 is the first stable Chostty
release, not a build of Ghostty 1.0; the upstream revision it carries is
whatever scripts/upstream-sync.sh reports as the merge base.
0.2.16 changed the bundle identifier from com.chostty.app to
kr.co.devch.chostty and replaced the inherited Ghostty icon with Chostty's
own. On first launch the app copies the old preferences and saved session
across, leaving the originals in place. macOS ties privacy permissions —
Accessibility, Automation, notifications, Full Disk Access — to the bundle
identifier, so grant them again when prompted.
⌘B toggles the sidebar, or use the buttons next to the traffic lights — the
toggle, + for a new workspace, and the workspace actions menu. ⌘N makes a
workspace, ⌘T a tab inside the current one, ⌘⇧N a separate physical window.
Right-click a workspace, a tab, or empty sidebar space for the rest. The full
chord table is in FORK.md.
Configuration is unchanged from Ghostty — ~/.config/ghostty/config, the same
keybind and theme syntax, TERM=xterm-ghostty. An existing Ghostty setup works
as-is, and the two can be installed side by side.
Configuration can also be edited without touching text: ⌘, (Preferences…)
opens a built-in editor for the common settings — fonts, colors, cursor,
window behavior, keybinds — with inline help per setting. It rewrites only the
lines it changes, so comments, ordering and keys it does not know survive a
save untouched. Save & Apply writes the file and reloads immediately;
Edit in External Editor opens the same file as plain text. Themes are
picked from a previewed gallery, values that come from a theme or an included
file are shown with their source, and All Settings reaches every Ghostty
key. The open_config action and keybinding open this editor too.
Shortcuts this fork reserves are taken only from chords upstream left unbound or
already broken; live Ghostty bindings such as ⌘⌥←/→ and ⌘0 are untouched.
Needs Xcode 26 (macOS 26 SDK) and Zig 0.16. Nix is not required.
zig build -Demit-macos-app=false # GhosttyKit, the Zig core the app links
./macos/build.nu --configuration Release --action buildVerify with the audit gate and the affected test suites:
./macos/scripts/native-tab-audit.sh
xattr -cr macos/build/Debug/Chostty.app
./macos/build.nu --configuration Debug --action testThe whole suite in one invocation can wedge on accumulated live terminal
surfaces; run it as -only-testing: batches of a few suites each, as described
in AGENTS.md.
If a build fails with no error: line, it is usually a stale signature — remove
macos/build/<Configuration> and rebuild. Running the app re-adds quarantine
attributes to the build output, so re-run xattr -cr on the bundle before
testing.
The app icon and every alternate icon are generated by
macos/scripts/generate-icons.py (needs Pillow); edit the script and re-run it
rather than editing the PNGs.
The Linux and GTK trees are inherited from upstream and carried unmodified. They are not built or tested here.
This is a fork, not a snapshot. scripts/upstream-sync.sh reports what upstream
changed since the last merge, sorted by how likely it is to hurt:
./scripts/upstream-sync.shIt groups changes into files this fork also modified (real conflicts), files it deleted (delete/modify stops), macOS code it has not touched (merges cleanly but lands in the restructured app), and the Zig core (usually uneventful). It does not merge. The fork's actual risk is a merge git resolves without complaint that restores a window-level assumption removed on purpose, and only reading the list catches that. A scheduled workflow posts the same report to a tracking issue.
The sync point is the git merge base with upstream/main, so there is no
recorded revision to fall out of date.
Chostty is an independent fork. It is not affiliated with, endorsed by, or supported by the Ghostty project; report problems here, not upstream. The name Ghostty and the Ghostty logo belong to their owners, and Chostty ships its own icon.
Ghostty is MIT licensed. LICENSE keeps the upstream copyright notice verbatim
and adds this fork's line beneath it; ship it with any copy. See
FORK.md for what changed, what is deliberately kept compatible, and
the known gaps.