workforest
A Rust terminal UI inspired by the layout of conductor.build, wired to real git repositories and worktrees.
Install
Prereqs:
- Rust (stable) + Cargo
git- Optional:
gitui(for the Diff panel hotkeyd)
Install from GitHub (recommended)
cargo install --git https://github.com/nikhilshinday/workforest --locked --bin workforest workforest
Install from a local checkout
git clone https://github.com/nikhilshinday/workforest cd workforest cargo install --path . --locked --bin workforest workforest
Run (dev)
Self-test (non-interactive)
macOS app bundle (opens Terminal.app)
This is still a terminal UI, but you can build a clickable .app that opens Terminal.app and runs workforest.
./scripts/build-macos-app.sh open dist/Workforest.app
Usage
Ato add a repo (mount / clone / init)aon a repo to create a new worktree (city-named, next to the repo under<repo>-worktrees/<city>)
Keys
F6: cycle focus (Sidebar / Terminal / Diff)Tab/Shift+Tab: cycle focus (outside Terminal)- Sidebar:
↑/↓orj/k,Enterselects worktree,Spacetoggles repo,aadds worktree (on repo),xunmount/remove,Xdelete repo,Rrefresh - Sidebar:
nrename a worktree based on current diff (picks a city, renames branch + moves dir) - Terminal:
F2new terminal,F3close,F7/F8prev/next (other keys go to the shell) - Terminal:
F4rename current terminal - Terminal:
Shift+PageUp/PageDownscrollback,Shift+Endback to live - Diff:
dopengitui,rrefresh - Panels:
F9/F10collapse sidebar / diff,Ctrl+F9/F10widen,Shift+F9/F10narrow - Mouse: click sidebar rows/tabs, wheel scroll (terminal scrollback), drag dividers to resize
F1help,Ctrl+Qquit (q/Escalso quit outside Terminal)
Harness notifications (Codex + Claude)
Workforest marks a terminal tab with ● when the terminal emits a bell (BEL, \a).
You can configure Codex TUI and Claude Code to emit a bell when they finish a turn or need attention.
Auto-configure (user-scoped)
Options:
--dry-runprints changes without writing--printprints minimal snippets only--codex/--claudeconfigure just one
Manual snippets
Codex (~/.codex/config.toml):
[tui] notifications = ["agent-turn-complete", "approval-requested"] notification_method = "bel"
Claude Code (~/.claude/settings.json):
{
"hooks": {
"Stop": [{ "matcher": "*", "hooks": [{ "type": "command", "command": "printf '\\a'" }] }],
"PermissionRequest": [{ "matcher": "*", "hooks": [{ "type": "command", "command": "printf '\\a'" }] }],
"Notification": [{ "matcher": "permission_prompt|elicitation_dialog", "hooks": [{ "type": "command", "command": "printf '\\a'" }] }]
}
}