- Persistent sessions — panes, tabs, and workspaces survive detach; reattach anytime.
- Live agent sidebar — every agent's state at a glance: blocked · working · done · idle.
- Zero-config resume — reopens each agent's native session where you left off (Claude Code, Copilot).
- Built-in git tab — branches, commit flow, PRs, issues, and a repo overview via
git+gh. - Worktrees as workspaces — work on several branches at once; the sidebar nests them per repo.
- Remote over SSH — run a session on another machine, drive it from your laptop. No port-forwarding.
- Agent API — every UI action is a shell command; agents can
waiton output/status andattachinto a pane. - Make it yours — 10 themes, fully remappable keys, an extension system, and a UI in 8 languages.
- Lean & native — mouse-driven, zero idle redraws, pure Rust, on macOS / Linux / Windows.
# macOS / Linux — prebuilt binary, no Rust needed
curl -fsSL https://raw.githubusercontent.com/RizRiyz/bohay/main/install.sh | sh
# Homebrew
brew install --HEAD RizRiyz/bohay/bohay
# Cargo (Rust ≥ 1.82) — any platform
cargo install --git https://github.com/RizRiyz/bohay# Windows — prebuilt binary, no Rust needed (run in PowerShell)
irm https://raw.githubusercontent.com/RizRiyz/bohay/main/install.ps1 | iexUse bohay in Windows Terminal. (Live cwd tracking and the bash hook are unavailable there, but
agent resume still works.) Prefer not to pipe a script? Download the
…-x86_64-pc-windows-msvc.zip from the Releases page
and put bohay.exe on your PATH.
bohay # launch — or reattach to — your sessionbohay spawns a background server that owns your panes and attaches a thin client. Detach with
Ctrl+Space then q — panes keep running; run bohay again to reattach. bohay server stop
ends everything.
Press Ctrl+Space, then a key. Everything is mouse-driven too, and Ctrl+Space ? opens
the full cheat-sheet.
| Key | Action | Key | Action |
|---|---|---|---|
←↓↑→ / hjkl |
focus pane | c |
new tab |
v / s |
split right / down | n p ⇥ |
cycle tabs |
x |
close pane | N |
new workspace (pick a folder) |
z |
zoom pane | w W |
cycle workspaces |
b |
toggle sidebar | g / G |
git tab / new worktree |
, |
open Settings | q d |
detach |
Every shortcut is remappable in Settings → Keys.
Copy text by dragging across a pane — release copies the selection to your system clipboard
and flashes a Copied toast. It writes the native clipboard (pbcopy / wl-copy / xclip /
clip) and emits OSC 52, so it works locally and over SSH.
Every TUI action is a scriptable command over a local socket — what you do in the UI, an agent can do from a shell:
bohay pane split --down # split the focused pane
bohay pane run 7 cargo test # run a command in pane 7
bohay wait output 7 --match ok # block until text appears (exit 0; 2 on timeout)
bohay agent list # every agent, everywhere
bohay events # stream agent-status changesFull command reference — every CLI & agent-API command (or run bohay help)
workspaces
workspace list list workspaces
workspace new create a workspace in the current directory
workspace focus <i> focus workspace i (0-based)
workspace close [<i>] close a workspace (default: active)
tabs
tab list | new | focus <n> | close [<n>]
panes
pane list list panes in the current tab
pane split [<id>] [--down] split a pane (default: side by side)
pane focus <id> focus a pane (jumps to its workspace/tab)
pane run [<id>] <cmd...> run a command in a pane
pane send [<id>] <text> send raw text to a pane
pane read [<id>] print a pane's recent output
pane status [<id>] print a pane's agent status (any workspace)
pane close [<id>] close a pane
agents
agent list every agent across all workspaces/tabs
agent sessions resumable sessions found on disk
agent resume <id> reopen a resumable session into a pane
wait output <id> --match <text> [--timeout <s>] block until output appears
wait agent-status <id> --status done|blocked|working|idle [--timeout <s>]
attach <id> open the TUI into one fullscreen pane
git
git status | branches | log [--limit N] | open [<workspace>]
worktrees
worktree list list the current repo's worktrees
worktree create <branch> create a worktree + workspace for <branch>
worktree open <path> open an existing worktree as a workspace
worktree remove <path> remove a worktree (its branch is kept)
modules (extensions)
module search [<query>] find modules on the `bohay-module` GitHub topic
module list | info <id> | actions
module link <path> register a local module dir
module install <owner>/<repo>[/sub] [--ref REF] [--yes]
module unlink <id> | uninstall <id> | enable <id> | disable <id>
module run <id> <action> invoke an action (captures + logs output)
module pane open <id> <entrypoint> [--placement split|overlay|tab]
module pane focus <pane> | close <pane>
module log [<id>] [--limit N] | config-dir <id>
appearance / events / server
ui sidebar --width <n> | --hide | --show
events stream live status changes
--remote <host> [ssh args] attach to a session on <host> over plain ssh
ping | server stop | integration install claude
When a command runs inside a bohay pane it defaults to that pane (via the injected
$BOHAY_PANE_ID), so bohay pane split just works without an id.
Git tab — click a workspace's branch (or Ctrl+Space g) for a keyboard-driven dashboard:
Commits · Flow · Branches · PRs · Issues · Status. Open a PR's full detail (checks, reviews,
mergeability) and merge / approve / checkout without leaving the terminal. GitHub data comes from
the gh CLI; it degrades to a local-git viewer without it.
Remote — bohay --remote my-server bridges a remote session over plain SSH; only the cells
that change are sent each frame, so it stays snappy. Detach and reattach across machines.
Worktrees — Ctrl+Space G (or the folder picker's Open with new worktree row) creates a git
worktree for a branch and opens it as its own workspace, nested under the repo.
Modules — extend bohay with a bohay-module.toml manifest declaring argv commands that call
back through the same socket API — any language, no SDK. bohay module search to discover,
bohay module install owner/repo. See the module guide.
State lives in ~/.bohay/ ($BOHAY_HOME overrides). Theme, layout, notifications, keys,
language, and modules are all in the Settings menu (the Menu button, or Ctrl+Space ,)
and persist to config.json.
cargo build # the whole build — pure Rust, no C toolchain
cargo test # unit + off-screen render tests (no tty needed)
cargo clippy && cargo fmt --check
cargo run -- --local # client + server in one processA headless server renders frames into an off-screen buffer and streams them to a thin client; state is pure and separated from the runtime (one event loop). Issues and PRs welcome.

