A native macOS session manager for Claude Code. Every Claude Code
conversation gets its own real terminal in one window. A sidebar lists the sessions grouped by
repository, and each row shows a status derived from Claude Code's own session descriptors and
hooks: working, done, or NEEDS YOU when a permission prompt or an unattended answer is
waiting. The terminal is a from-scratch Metal renderer driving
libghostty-vt, the project's only third-party dependency.
Sessions survive a quit: screen and scrollback are snapshotted, and a restored row reopens under a
fresh shell with claude --resume a keystroke away.
A personal project, built for one person's workflow, developed in the open. It is not a supported product: no roadmap, no compatibility promise, no commitment to answer issues. Use it if it helps you, fork it if it nearly does.
- macOS 26 (Tahoe) or later, Apple Silicon only.
- Claude Code installed and working in your shell.
zsh,bashorfishas your login shell, for the shell integration.- Optional: the GitHub CLI (
gh), authenticated, for the PR badge.
brew tap tkz0/tap
brew trust --cask tkz0/tap/tkzmux
brew install --cask tkzmuxSince Homebrew 6.0 a cask from a third-party tap must be trusted before it is loaded; without the
brew trust step, brew tap fails with invalid syntax in tap!. See
Tap Trust. The app is signed with a Developer ID and notarized,
so it opens with no Gatekeeper prompt.
git clone https://github.com/tkz0/tkzmux
cd tkzmux
make app # release build, ad-hoc signed → build/tkzmux.app
open build/tkzmux.appEverything else is plain SwiftPM, no .xcodeproj: swift build, swift test, swift run tkzmux.
make app compiles the shaders with xcrun metal, which on Xcode 26 is a separate download:
xcodebuild -downloadComponent MetalToolchainA real (non-ad-hoc) signature is one variable: SIGN_IDENTITY="Developer ID Application: …" make app adds the
hardened runtime and a secure timestamp. make notarize notarizes and staples an already-signed app,
and make dist cuts a tagged, notarized release.
No telemetry, analytics or crash reporting. tkzmux makes one network request of its own: a release
build periodically asks GitHub for the latest release, sending nothing about you or your sessions.
The PR badge shells out to gh pr view, under your own credentials and only for GitHub origins.
~/.claude is read, never written; everything tkzmux writes lives under
~/Library/Application Support/tkzmux. The one exception is the status line integration, which
you opt into and which sets the statusLine key in Claude Code's settings.json.
Terminal snapshots contain your screen and scrollback verbatim, unencrypted, in that support directory. They are deleted with the session.
The full accounting, file by file, is in docs/privacy.md.
- Usage and context need the status line installed. Claude Code publishes that data nowhere else. The integration is offered once at startup and lives in the app menu.
- The PR badge needs
ghand a GitHub origin. Branch, diff stats, ahead/behind and ports work without it. - Shell integration differs a little per shell. bash runs as a non-login shell with
--rcfile; shells other than zsh, bash and fish only getbin/prepended toPATH. Details in docs/privacy.md. - One Claude per session. Splits and tabs share the row's Claude session and status.
MIT — see LICENSE.
- libghostty-vt (MIT), vendored as a prebuilt
xcframework under
vendor/ghostty-vt, used only through its public C API. Ghostty is a separate project and is not affiliated with this one. - JetBrains Mono, bundled under the SIL Open Font
License 1.1 (
Resources/Fonts/OFL.txt). - Claude and Claude Code are products of Anthropic. This project is not affiliated with, endorsed by, or supported by Anthropic.