No description
  • Swift 96.3%
  • Shell 3.7%
Find a file
Ethan Lee 53c7cd6741
Some checks failed
Checks / Detect changes (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Release / build (push) Has been cancelled
Checks / Format (push) Has been cancelled
Checks / Lint (push) Has been cancelled
Checks / Test (push) Has been cancelled
Release / release (push) Has been cancelled
Release / bump-cask (push) Has been cancelled
format CLAUDE.md
2026-06-02 09:55:03 -04:00
.github refactor: consolidate ci:* mise tasks into a --verbose flag 2026-05-28 14:44:44 -04:00
assets update screenshot 2026-05-22 23:59:37 -04:00
Macterm docs: give shell integration its own README heading and link the banner to it 2026-06-02 09:55:03 -04:00
MactermTests refactor: trim the missing-CLI banner to a README link 2026-06-02 09:55:03 -04:00
scripts fix: ship resources in Ghostty.app layout so libghostty derives TERMINFO right 2026-06-02 09:41:13 -04:00
.gitignore fix: ship resources in Ghostty.app layout so libghostty derives TERMINFO right 2026-06-02 09:41:13 -04:00
.swiftformat chore: exclude correct build dir from swiftformat/swiftlint 2026-05-13 20:03:33 -04:00
.swiftlint.yml chore: exclude correct build dir from swiftformat/swiftlint 2026-05-13 20:03:33 -04:00
CLAUDE.md format CLAUDE.md 2026-06-02 09:55:03 -04:00
CONTRIBUTING.md docs: add contribution guidelines 2026-05-13 13:03:29 -04:00
LICENSE Initial commit: macterm rebranding 2026-04-12 00:16:07 -04:00
mise.toml refactor: consolidate ci:* mise tasks into a --verbose flag 2026-05-28 14:44:44 -04:00
project.yml fix: ship resources in Ghostty.app layout so libghostty derives TERMINFO right 2026-06-02 09:41:13 -04:00
README.md docs: give shell integration its own README heading and link the banner to it 2026-06-02 09:55:03 -04:00


Macterm

A native macOS terminal with vertical tabs and persistent multiplexing, built on libghostty

Latest version Total downloads CI status License macOS 26+

screenshot

Features

  • Vertical Project Sidebar: Native macOS sidebar for organizing projects and tabs vertically.
  • Persistent Multiplexing: Projects, tabs, and panes are saved and restored automatically on relaunch.
  • Ghostty Config Compatibility: Macterm reads your existing ~/.config/ghostty/config. Theme, font, palette, keybinds — all of it just works.
  • Keyboard-first Navigation: Customizable keybinds for navigating projects, tabs, and panes.
  • Command Palette: Versatile command palette to interact with multiplexing and manage projects
  • Quick terminal: Global terminal accessible from anywhere with a hotkey.

Install

Homebrew

brew install --cask thdxg/tap/macterm

The cask strips the Gatekeeper quarantine xattr on install, so the app launches without any extra prompts. Updates are delivered via Sparkle inside the app.

From Releases

Download the latest .dmg from Releases, open it, and drag Macterm to Applications.

Since the app isn't signed with an Apple Developer certificate, macOS will block it on first launch. To allow the app to launch, run this command in another terminal (you only need to do this once):

xattr -cr /Applications/Macterm.app

Demos

Keybinds

Macterm is very keyboard-oriented, so you can perform the majority of actions without lifting your hand.

https://github.com/user-attachments/assets/42b2dce8-1d6d-41d6-a4c8-2e0c1339810b

Window Opacity & Blur

Macterm's window appearance is highly customizable and hot-reloaded.

https://github.com/user-attachments/assets/1486ed55-e653-43ce-98aa-232a61d234a7

For Ghostty Users

Macterm uses libghostty as its terminal engine and reads your existing ~/.config/ghostty/config on launch. Themes, fonts, palettes, keybinds, scrollback, cursor style, shell integration, mouse behavior — everything Ghostty supports works the same in Macterm.

If your config lives somewhere else, point Macterm at it in Settings → General → Ghostty Config. Click Reload there after saving external edits — Macterm doesn't auto-detect them.

What's different from Ghostty.app

A handful of settings either don't apply or are overridden, because Macterm renders some of the chrome itself instead of letting Ghostty do it. If you have these in your Ghostty config, they'll be parsed without errors but won't change anything in Macterm:

Setting Status Why
background-opacity Overridden to 0 Macterm composites window translucency at the AppKit level. Use Settings → General → Window → Background Opacity instead.
background-blur Overridden to 0 Same reason. Use the Background Blur slider in Settings.
unfocused-split-opacity Ignored Macterm draws its own dim overlay on unfocused panes.
split-divider-color Ignored Divider color comes from the theme's foreground.
window-padding-color Ignored Padding follows the SwiftUI background stack.
macos-titlebar-*, macos-window-buttons, window-decoration Ignored Macterm has its own titlebar implementation.
quick-terminal-* family Ignored Macterm has its own quick terminal. Size lives in Settings → Quick Terminal.

Macterm-specific settings (window opacity/blur, quick terminal dimensions, hotkeys, auto-tile) live in Macterm → Settings. Everything else belongs in your Ghostty config.

Macterm bundles Ghostty's terminfo, shell-integration scripts, and themes, so TERM=xterm-ghostty, named themes, and shell integration all work standalone — no Ghostty.app install required.

Shell integration

The one exception is the ssh-env, ssh-terminfo, and path shell-integration features, which need the ghostty CLI to do anything useful, and Macterm doesn't ship one. If Ghostty.app is installed alongside in /Applications, Macterm points the wrappers at its binary and they work normally. Otherwise these features are disabled — ssh and sudo still work, they just skip Ghostty's terminfo-forwarding tricks for remote hosts. Install Ghostty.app if you want them. When the CLI is missing, Settings → General shows a banner that links here.

Keybinds

Most of your keybind = ... lines in Ghostty config work the same as in Ghostty.app. The one rule to know: on conflict, Macterm wins. If a keystroke matches one of Macterm's app-level shortcuts (new tab, splits, focus moves, command palette, etc.), Macterm handles it and Ghostty never sees the event. If it doesn't conflict, the keystroke flows through to libghostty and your Ghostty keybind fires normally.

Every conflicting combo is rebindable in Settings → Keymaps, so if you'd rather a particular shortcut belong to your Ghostty config, clear or remap it there.

One caveat: Ghostty keybinds that drive app-level actions (new_split, new_tab, goto_tab, goto_split, etc.) currently do nothing in Macterm — Macterm only triggers those actions through its own keybinds in Settings → Keymaps. Terminal-level Ghostty bindings (copy/paste, scroll, font size, etc.) work normally.

First-launch defaults

If you don't have a ~/.config/ghostty/config, Macterm starts with the Rose Pine theme at 16pt, 16px window padding, and macos-option-as-alt = true (so Option+letter sends Alt to your shell instead of typing special characters). Everything else falls through to Ghostty's own defaults. Any of these can be overridden by adding the corresponding line to your Ghostty config.

Contributing

See CONTRIBUTING.md for setup, build, and PR guidelines.

License

MIT