Run agentic coding workflows in a fully native desktop app for Git worktrees, terminals, and diffs.
Run agentic coding workflows in a fully native desktop app for Git worktrees, terminals, and diffs.
Arbor is a fully native app for agentic coding built with Rust and GPUI. It gives you one place to manage repositories, issue-driven worktrees, embedded terminals, managed processes, diffs, PR context, AI coding agent activity, and a shared daemon that also powers Arbor's web UI, CLI, and MCP server.
[branch] in arbor.tomlxterm-256color supportlibghostty-vt engine behind a compile-time feature flag, used by default when availableProcfile and arbor.toml[[tasks]] from arbor.toml, with optional Claude or Codex triggers/v1/chat/completions endpoint/v1/models at startup for configured providers~/.config/arbor/config.toml [[providers]] sectionsarbor-httpd serves the remote daemon API and bundled web UIarbor-cli exposes daemon-backed health, repo, worktree, terminal, process, and task commandsarbor-mcp binary backed by Arbor's daemon APIARBOR_DAEMON_URL and ARBOR_DAEMON_AUTH_TOKEN for remote authenticated daemonsarbor-httpdarbor-gui and arbor-web-ui~/.config/arbor/config.toml with hot reloadbrew install penso/arbor/arborDownload the latest build from Releases.
Release bundles ship the desktop app plus arbor-httpd, arbor-mcp, and arbor-cli.
git clone https://github.com/penso/arbor
cd arbor
just runTo run the MCP server against a local dev daemon:
just run-mcpThe live docs site is available at penso.github.io/arbor/docs.
The in-repo mdBook sources live under docs/src, and you can build them locally with:
just docs-build| Crate | Description |
|---|---|
arbor-benchmarks |
CodSpeed and local benchmark targets |
arbor-cli |
CLI for Arbor's daemon API (arbor-cli binary) |
arbor-daemon-client |
Typed client and shared API DTOs for arbor-httpd |
arbor-core |
Worktree primitives, change detection, agent hooks |
arbor-gui |
GPUI desktop app (arbor binary) |
arbor-httpd |
Remote HTTP daemon (arbor-httpd binary) |
arbor-mcp |
MCP server exposing Arbor via stdio (arbor-mcp binary) |
arbor-mosh |
Mosh transport for remote outposts |
arbor-ssh |
SSH transport for remote outposts |
arbor-symphony |
Optional workflow orchestration runtime |
arbor-terminal-emulator |
Embedded terminal engine glue and Ghostty integration |
arbor-web-ui |
TypeScript dashboard assets + helper crate |
Repo-local behavior is configured with /arbor.toml.
Arbor currently reads repo presets, managed processes, worktree scripts, scheduled tasks, branch naming rules, agent defaults, and notification routing from that file.
Example:
…Task templates for the command palette default to /.arbor/tasks/*.md.
Arbor also ships arbor-cli for daemon-backed scripting:
cargo run -p arbor-cli -- health
cargo run -p arbor-cli -- worktrees list --json
cargo run -p arbor-cli -- processes list --json
cargo run -p arbor-cli -- tasks list --jsonArbor ships a dedicated arbor-mcp binary from the arbor-mcp crate. The stdio server is enabled by the crate's default stdio-server feature and talks to arbor-httpd, so the daemon must be reachable first.
Enable it in a normal build:
cargo build -p arbor-mcpEnvironment variables:
ARBOR_DAEMON_URL overrides the daemon base URL. Default: http://127.0.0.1:8787ARBOR_DAEMON_AUTH_TOKEN sends a bearer token for remote authenticated daemonsRemote access:
[daemon] auth_token = "your-secret" in ~/.config/arbor/config.toml.arbor-httpd. When an auth token is configured, Arbor binds remotely by default on 0.0.0.0:8787 unless ARBOR_HTTPD_BIND overrides it.arbor-mcp at that daemon with ARBOR_DAEMON_URL=http://HOST:8787.ARBOR_DAEMON_AUTH_TOKEN=your-secret.Loopback requests are allowed without a token. Non-loopback requests require Authorization: Bearer .
Example client config:
{
"mcpServers": {
"arbor": {
"command": "/path/to/arbor-mcp",
"env": {
"ARBOR_DAEMON_URL": "http://127.0.0.1:8787"
}
}
}
}The arbor-mcp binary is feature-gated. To disable the stdio server binary in a build, use:
cargo build -p arbor-mcp --no-default-featuresSee docs/mcp.md for the full MCP setup guide.
nightly-2025-11-30 (install via rustup)just setup-macosOr manually:
xcode-select --install
xcodebuild -downloadComponent MetalToolchain
brew install --cask font-caskaydia-cove-nerd-fontjust setup-linuxOr manually:
sudo apt-get install -y libxcb1-dev libxkbcommon-dev libxkbcommon-x11-devThen install the CaskaydiaMono Nerd Font to ~/.local/share/fonts/.
Arbor can also be built with an experimental embedded Ghostty terminal engine. This is opt-in, disabled by default, and currently expects:
vendor/ghostty submodule checked outzig on PATHarbor_ghostty_vt_bridge shared library in target/ghostty-vt-bridge/libARBOR_GHOSTTY_SRC=/path/to/ghostty to override the pinned submoduleARBOR_GHOSTTY_TARGET / ARBOR_GHOSTTY_CPU to force a safer Zig target in CIWith a build that includes --features ghostty-vt-experimental, Arbor defaults
to the embedded Ghostty engine. You can still choose the embedded engine in
~/.config/arbor/config.toml:
embedded_terminal_engine = "ghostty-vt-experimental"Example:
git submodule update --init --recursive vendor/ghostty
just ghostty-vt-bridge
RUSTFLAGS="-L native=$(pwd)/target/ghostty-vt-bridge/lib -C link-arg=-Wl,-rpath,$(pwd)/target/ghostty-vt-bridge/lib" \
cargo +nightly-2025-11-30 run -p arbor-gui --features ghostty-vt-experimentalTo run Arbor with both embedded engines available and let config.toml choose:
git submodule update --init --recursive vendor/ghostty
just run-configured-embedded-engineTo run the experimental checks:
git submodule update --init --recursive vendor/ghostty
just test-ghostty-vt
just check-ghostty-vt-gui
just check-ghostty-vt-httpdTo compare the embedded engine performance:
git submodule update --init --recursive vendor/ghostty
just bench-embedded-terminal-enginesTo build the daemon with the same terminal engine:
git submodule update --init --recursive vendor/ghostty
just ghostty-vt-bridge
RUSTFLAGS="-L native=$(pwd)/target/ghostty-vt-bridge/lib -C link-arg=-Wl,-rpath,$(pwd)/target/ghostty-vt-bridge/lib" \
cargo +nightly-2025-11-30 run -p arbor-httpd --features ghostty-vt-experimentalThanks to Zed for building and open-sourcing GPUI, the GPU-accelerated UI framework that powers Arbor.
No open issues yet, or sync has not completed.