macOS 13+, Apple Silicon and Intel. Download the dmg from
Releases and drag Rune
into /Applications. It's signed with Rune's own certificate rather than an
Apple Developer ID and isn't notarized, so macOS will call it damaged. It
isn't. Clear the flag once:
xattr -dr com.apple.quarantine /Applications/Rune.appOr open it and use System Settings → Privacy & Security → Open Anyway. It updates itself after that.
⌘Kopens the switcher.⌘Nmakes a new workspace.⌘Wcloses the highlighted one, with every tab and split in it.⌘Ppins it to the top. Pinned rows stay in the order you pinned them.⌘Rrenames it, in place.→rings you when that workspace's agent stops. Press it twice and it keeps ringing every time, rather than once. A bell appears on the row, and the notification takes you back there when you click it.←twice detaches the highlighted workspace into a window of its own. The first press arms it and says so; the second moves it. Nothing restarts.⌘1–⌘9jump straight to one without opening the list.
Inside a workspace, ⌘T adds a tab and ⌘D / ⌘⇧D splits the pane right or
down. Tabs sit in a strip drawn the way Chrome draws one, each with its
program's mark and its agent's state on it. Split panes get a header naming what each one is running, with the
controls that act on that pane — split, zoom, close — on it. A single pane
doesn't: there is nothing to tell apart, so it keeps the row.
Every row says what its agent is doing — Claude Code, Codex, opencode and pi —
working with a clock, your turn when it stops, nothing when there's nothing
worth saying. If you'd rather not watch
the list, arm a row with → and go do something else. Rune tells you when that
one finishes.
Only what Rune adds. Copy, paste and font size work as they do anywhere else.
| Chord | What it does |
|---|---|
⌘K |
switch workspace |
⌘N |
new workspace |
⌘W |
close the terminal, or the ⌘K row |
⌘P |
pin a workspace to the top of ⌘K |
→ |
in ⌘K, notify me when this agent stops. Twice: every time |
⌘1–⌘9 |
workspace by position |
⌘R |
rename a workspace, in place |
⌥1–⌥9 |
tab by position |
⌘T |
new tab |
⌘D / ⌘⇧D |
split right / down |
⌘F |
find in the scrollback |
⌘G / ⌘⇧G |
next / previous match |
⌘⌥←↑↓→ |
focus the pane that way |
⌘⇧[ / ⌘⇧] |
previous / next tab |
⌘⇧↵ |
zoom a pane, or put it back |
⌘⌥= |
equalize splits |
⌘⇧N / ⌘⇧W |
new / close window |
← |
in ⌘K, twice: detach this workspace into its own window |
⌘J |
windows on the left, workspaces and tabs on the right |
⌘L |
agent sessions |
⌘; |
open apps |
⌘⇧, |
reload the Ghostty config and Rune's settings |
Rebind any of them in Settings → Shortcuts. In ⌘J, ← / → chooses
the pane and ↑ / ↓ chooses a row. Windows, workspaces and tabs preview
behind the picker. Enter commits; Escape restores where you started.
Existing custom window shortcuts are retained. If a custom binding already
uses ⌘L, assign Agent Sessions a free shortcut in Settings.
⌘; lists every other app with a Dock icon. Enter switches to one; → asks
it to quit, and if it ignores that, → again forces it.
⌘L lists every agent session it can find, live ones first. Enter jumps to a
live one, or resumes a saved one in a new workspace. Typing searches titles,
folders and accounts straight away, then — as soon as you pause — everything
said in the transcripts too: sessions found only by their contents are listed
below the rest, and the preview opens on the matching lines.
The row you are on is picked out in grey; Settings ▸ Appearance ▸ Highlight offers Clay, Blue, Green, Purple, Cyan and Amber instead.
Tabs across the top narrow it to one agent — ⇥/⇧⇥ move between all,
Claude, Codex, OpenCode and pi. Second accounts are found too: a ~/.claude-<name>
or ~/.codex-<name> home (the one you point CLAUDE_CONFIG_DIR or
CODEX_HOME at) marks its sessions with the account's name, and resuming one starts
the agent in that account. Matching is telescope-style — intersection also
finds interhihellosection — and the preview highlights what matched.
Transcript search runs on fff.
./scripts/install-cli.sh # symlinks `rune` onto your PATHrune # open Rune, or bring it to the front
rune <directory> # open a workspace there
rune install-opencode-hook # teach opencode to report what it's doing
rune --versioninstall-opencode-hook writes ~/.config/opencode/plugin/rune.js and adds it
to the plugin list in opencode.json, editing that file rather than replacing
it. Restart any running opencode session to pick it up.
Needs macOS 13+, Zig 0.16.0 (brew install zig) and Xcode.
git clone https://github.com/Sushants-Git/Rune.git && cd Rune
./scripts/fetch-ghostty.sh # the pinned ghostty checkout
./scripts/build-libghostty.sh # GhosttyKit.xcframework (slow, once)
./scripts/bundle.sh # build/Rune.appIf it stops on cannot execute tool 'metal', run
xcodebuild -downloadComponent MetalToolchain and try again. Releases are cut
by pushing a tag: git tag v0.31.2 && git push origin v0.31.2.
Design notes cover why it's built this way, and the parts that cost real debugging time.
Key translation, dead keys and IME composition in GhosttySurfaceView and
GhosttyInput are adapted from Ghostty's own macOS embedding layer (MIT,
Mitchell Hashimoto and Ghostty contributors), which is the reference for getting
that right. Ghostty's licence ships with Rune: see NOTICE and
licenses/ghostty-MIT.txt.




