Skip to content
Sushants-GitPublic

About

The terminal for humans who run agents.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

Rune

The terminal for humans who run agents.

Built on libghostty · rune.sushant.tech · latest release

Rune's ⌘K switcher: a pinned Claude workspace waiting on you, a Codex one and an opencode one at work with their clocks, a plain shell you are in, and the rename, pin, notify, detach, close and dismiss keys along the bottom

Install

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.app

Or open it and use System Settings → Privacy & Security → Open Anyway. It updates itself after that.

What it does

  • ⌘K opens the switcher.
  • ⌘N makes a new workspace.
  • ⌘W closes the highlighted one, with every tab and split in it.
  • ⌘P pins it to the top. Pinned rows stay in the order you pinned them.
  • ⌘R renames 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–⌘9 jump straight to one without opening the list.
A Rune window with four tabs in a Chrome-style strip: a Claude Code task, a Codex task, a pi session and a plain shell, each with its agent's mark

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.

Keys

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.

The ⌘J picker over a split terminal: two windows on the left, and the five workspaces of the highlighted one on the right
The ⌘; picker over a split terminal, listing Finder, Google Chrome, OrbStack and Slack, with switch to, quit and dismiss along the bottom

⌘; lists every other app with a Dock icon. Enter switches to one; → asks it to quit, and if it ignores that, → again forces it.

The ⌘L picker on its pi tab: saved pi sessions on the left, and the transcript of the highlighted one previewed on the right

⌘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.

The rune command

./scripts/install-cli.sh     # symlinks `rune` onto your PATH
rune                       # 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 --version

install-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.

Build

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.app

If 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.

Credit

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.

About

The terminal for humans who run agents.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages