
ZenTerm is a modern macOS terminal built on a libghostty core. Native panes and windows, hideable drawers and floats, tools bound to the keys you pick, and workspaces you define.
The terminal emulation is Ghostty's own, from
libghostty, built from a pinned vendor/ghostty
submodule. The layout, input routing, scroll mode, theming, and chrome are
ZenTerm's. All of it exists so you can reach your toolchain without stopping to
find somewhere to run it.
Release notes, documentation, and guides live at zenterm.io.

One tab, three shells. ⌘B opens the drawer along the bottom, ⌘\ opens the one down the right side, and each runs its own shell with its chord printed in the corner. Hiding a drawer doesn't stop its process. The dev server here keeps running while the drawer is hidden. The numbered tabs along the bottom are ⌘1 through ⌘9.
Download ZenTerm-<version>-arm64.dmg from the
releases page, open it, and drag
ZenTerm onto Applications. The app is signed and notarized, so macOS opens
it without an "unidentified developer" warning.
Apple Silicon, macOS 14 or later. There is no Intel build.
ZenTerm expects JetBrains Mono Nerd Font, which macOS does not ship:
brew install --cask font-jetbrains-mono-nerd-font
ZenTerm updates itself from then on. docs/onboarding.md walks
through the first hour.
hjkl, w/b/e, and {/}. v and V select, y copies.ctrl+hjkl to the
nav_* actions and install
zen-navigator.nvim:
nvim walks its own splits and hands off to ZenTerm at the edge.Defaults. Every one is rebindable in the config, and the command palette lists your current shortcut for each action.
| Action | Default |
|---|---|
| Split right | ⌘D |
| Split down | ⌘⇧D |
| Move focus by direction | ⌘⌥ + arrow |
| Toggle bottom drawer | ⌘B |
| Toggle right drawer | ⌘\ |
| Select tab 1 through 9 | ⌘1 – ⌘9 |
| Workspaces | ⌘P |
| Command palette | ⌘⇧P |
| Scroll mode | ⌘⇧S |
| Settings | ⌘, |
Tool floats have no defaults. Each one takes the chord you give it in the config.

Three panes in one tab. The focused pane carries the halo, so you can see where the next keystroke lands without hunting for a cursor. The gap between panes and the padding around them are both yours to set.

The same window on Catppuccin Latte. A theme colors the terminal, the tab bar,
the toolbar, the focus halo, and Settings itself, so a light theme stays light
through the whole app. 17 ship, each marked Dark or Light in the picker, and a
theme = line pointed at any Ghostty theme file works the same way.

The palette filters as you type and runs the selection on Enter. Each row carries the shortcut that runs it, read from your config, so a rebind shows up here right away.

The workspaces you named, each one a folder plus a layout. ZenTerm does not scan directories to fill this list, so it holds only what you put there.

A float is one float = line in the config: a title, a command, and the chord
that toggles it. It opens over the work instead of taking a pane, so the panes
and drawers underneath keep their places. persist:dir keeps one warm per
repository. The first open is cold and every reopen is instant.
One file, ~/.config/zen-term/config, in Ghostty's config syntax. Settings
writes the same file, so the two never disagree.
docs/config/config is the annotated reference: every key,
its default, and what a bad line does.

Picking a theme here writes the theme = line you would have typed. The row says
it applies instantly, and it recolors the terminal, the tabs, and the chrome
while the pane is still open. The pane and the file hold the same keys, so
editing either one gives you the same result.
git clone https://github.com/praxis-labs-io/zen-term.git && cd zen-term
bin/build-ghosttykit # inits the vendor/ghostty submodule, fetches Zig,
# builds GhosttyKit.xcframework + runtime resources
brew install swiftlint # bin/check needs it
bin/run
bin/build-ghosttykit takes a few minutes and reruns only when the ghostty pin
or the script changes. You need Xcode 26 or later: the package manifest declares
swift-tools-version: 6.2, and the Metal compiler is not in the Command Line
Tools alone.
docs/onboarding.md walks through the app for someone
opening it for the first time.docs/config/config and
docs/config/workspaces are the reference files.docs/architecture.md is how the app fits together.docs/swift-conventions.md collects the AppKit
traps that cost us a release each.docs/releasing.md is how a build gets released.docs/release-notes/ is every version, curated.Read docs/CONTRIBUTING.md. The short version: bin/check
is the gate, one branch is one pull request, and CLAUDE.md holds the rules an
agent working in this repo follows.
Report a vulnerability privately. SECURITY.md says how.
MIT. See LICENSE. Third-party notices ship inside the app and live in
Sources/ZenTerm/Resources/THIRD-PARTY-NOTICES.md.
353 commits
Swift
97.4%
Shell
1.9%

ZenTerm is a modern macOS terminal built on a libghostty core. Native panes and windows, hideable drawers and floats, tools bound to the keys you pick, and workspaces you define.
The terminal emulation is Ghostty's own, from
libghostty, built from a pinned vendor/ghostty
submodule. The layout, input routing, scroll mode, theming, and chrome are
ZenTerm's. All of it exists so you can reach your toolchain without stopping to
find somewhere to run it.
Release notes, documentation, and guides live at zenterm.io.

One tab, three shells. ⌘B opens the drawer along the bottom, ⌘\ opens the one down the right side, and each runs its own shell with its chord printed in the corner. Hiding a drawer doesn't stop its process. The dev server here keeps running while the drawer is hidden. The numbered tabs along the bottom are ⌘1 through ⌘9.
Download ZenTerm-<version>-arm64.dmg from the
releases page, open it, and drag
ZenTerm onto Applications. The app is signed and notarized, so macOS opens
it without an "unidentified developer" warning.
Apple Silicon, macOS 14 or later. There is no Intel build.
ZenTerm expects JetBrains Mono Nerd Font, which macOS does not ship:
brew install --cask font-jetbrains-mono-nerd-font
ZenTerm updates itself from then on. docs/onboarding.md walks
through the first hour.
hjkl, w/b/e, and {/}. v and V select, y copies.ctrl+hjkl to the
nav_* actions and install
zen-navigator.nvim:
nvim walks its own splits and hands off to ZenTerm at the edge.Defaults. Every one is rebindable in the config, and the command palette lists your current shortcut for each action.
| Action | Default |
|---|---|
| Split right | ⌘D |
| Split down | ⌘⇧D |
| Move focus by direction | ⌘⌥ + arrow |
| Toggle bottom drawer | ⌘B |
| Toggle right drawer | ⌘\ |
| Select tab 1 through 9 | ⌘1 – ⌘9 |
| Workspaces | ⌘P |
| Command palette | ⌘⇧P |
| Scroll mode | ⌘⇧S |
| Settings | ⌘, |
Tool floats have no defaults. Each one takes the chord you give it in the config.

Three panes in one tab. The focused pane carries the halo, so you can see where the next keystroke lands without hunting for a cursor. The gap between panes and the padding around them are both yours to set.

The same window on Catppuccin Latte. A theme colors the terminal, the tab bar,
the toolbar, the focus halo, and Settings itself, so a light theme stays light
through the whole app. 17 ship, each marked Dark or Light in the picker, and a
theme = line pointed at any Ghostty theme file works the same way.

The palette filters as you type and runs the selection on Enter. Each row carries the shortcut that runs it, read from your config, so a rebind shows up here right away.

The workspaces you named, each one a folder plus a layout. ZenTerm does not scan directories to fill this list, so it holds only what you put there.

A float is one float = line in the config: a title, a command, and the chord
that toggles it. It opens over the work instead of taking a pane, so the panes
and drawers underneath keep their places. persist:dir keeps one warm per
repository. The first open is cold and every reopen is instant.
One file, ~/.config/zen-term/config, in Ghostty's config syntax. Settings
writes the same file, so the two never disagree.
docs/config/config is the annotated reference: every key,
its default, and what a bad line does.

Picking a theme here writes the theme = line you would have typed. The row says
it applies instantly, and it recolors the terminal, the tabs, and the chrome
while the pane is still open. The pane and the file hold the same keys, so
editing either one gives you the same result.
git clone https://github.com/praxis-labs-io/zen-term.git && cd zen-term
bin/build-ghosttykit # inits the vendor/ghostty submodule, fetches Zig,
# builds GhosttyKit.xcframework + runtime resources
brew install swiftlint # bin/check needs it
bin/run
bin/build-ghosttykit takes a few minutes and reruns only when the ghostty pin
or the script changes. You need Xcode 26 or later: the package manifest declares
swift-tools-version: 6.2, and the Metal compiler is not in the Command Line
Tools alone.
docs/onboarding.md walks through the app for someone
opening it for the first time.docs/config/config and
docs/config/workspaces are the reference files.docs/architecture.md is how the app fits together.docs/swift-conventions.md collects the AppKit
traps that cost us a release each.docs/releasing.md is how a build gets released.docs/release-notes/ is every version, curated.Read docs/CONTRIBUTING.md. The short version: bin/check
is the gate, one branch is one pull request, and CLAUDE.md holds the rules an
agent working in this repo follows.
Report a vulnerability privately. SECURITY.md says how.
MIT. See LICENSE. Third-party notices ship inside the app and live in
Sources/ZenTerm/Resources/THIRD-PARTY-NOTICES.md.
353 commits
Swift
97.4%
Shell
1.9%