{"id":46631185,"url":"https://github.com/penso/arbor","last_synced_at":"2026-03-15T18:54:58.448Z","repository":{"id":342347033,"uuid":"1172374944","full_name":"penso/arbor","owner":"penso","description":"Desktop Git worktree manager in Rust (arbor-core + GPUI app).","archived":false,"fork":false,"pushed_at":"2026-03-05T16:42:00.000Z","size":778,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-05T19:33:45.008Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/penso.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-04T08:33:26.000Z","updated_at":"2026-03-05T16:28:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/penso/arbor","commit_stats":null,"previous_names":["penso/arbor"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/penso/arbor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/penso%2Farbor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/penso%2Farbor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/penso%2Farbor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/penso%2Farbor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/penso","download_url":"https://codeload.github.com/penso/arbor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/penso%2Farbor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30238079,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T23:52:25.683Z","status":"ssl_error","status_checked_at":"2026-03-07T23:52:25.373Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-08T00:00:46.360Z","updated_at":"2026-03-15T18:54:58.440Z","avatar_url":"https://github.com/penso.png","language":"Rust","funding_links":[],"categories":["🚀 AI Tools for Vim, Neovim, and Terminal","Apps"],"sub_categories":["Developer Tools"],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"assets/screenshot.png\"\u003e\n    \u003cimg src=\"assets/screenshot.png\" alt=\"Arbor UI screenshot\" width=\"1100\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n# Arbor\n\n[![CI](https://github.com/penso/arbor/actions/workflows/ci.yml/badge.svg)](https://github.com/penso/arbor/actions/workflows/ci.yml)\n[![Rust Nightly](https://img.shields.io/badge/rust-nightly--2025--11--30-orange?logo=rust)](https://rust-lang.org)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![GitHub Release](https://img.shields.io/github/v/release/penso/arbor?label=release)](https://github.com/penso/arbor/releases)\n[![macOS](https://img.shields.io/badge/macOS-supported-brightgreen)](#install)\n[![Linux](https://img.shields.io/badge/Linux-supported-brightgreen)](#install)\n[![Windows](https://img.shields.io/badge/Windows-supported-brightgreen)](#install)\n[![CodSpeed](https://img.shields.io/endpoint?url=https://codspeed.io/badge.json)](https://codspeed.io/penso/arbor?utm_source=badge)\n\nArbor is a **fully native app for agentic coding** built with Rust and [GPUI](https://gpui.rs).\nIt 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.\n\n## Why Arbor\n\n- Fully native desktop app, UI and terminal stack included, optimized for long-running local workflows\n- One daemon-backed model for the desktop app, web UI, CLI, and MCP server\n- Built for parallel coding sessions across local repos, issue queues, and remote outposts\n\n## Core Capabilities\n\n### Repositories, Worktrees, and Issues\n- List, create, and delete worktrees across multiple repositories\n- Create managed worktrees directly from GitHub or GitLab issues\n- Preview sanitized worktree names, branch names, and target paths before creation\n- Repo-local branch naming rules via `[branch]` in `arbor.toml`\n- Delete confirmation with unpushed commit detection\n- Optional branch cleanup on worktree deletion\n- Worktree navigation history (back/forward)\n- Last git activity timestamp per worktree\n- Automatic issue linking to existing branches and open PRs / MRs\n\n### Embedded Terminal, Processes, and Tasks\n- Built-in PTY terminal with truecolor and `xterm-256color` support\n- Multiple terminal tabs per worktree\n- Experimental embedded `libghostty-vt` engine behind a compile-time feature flag, used by default when available\n- Persistent daemon-based sessions (survive app restarts)\n- Session attach/detach and signals (interrupt/terminate/kill)\n- Managed processes from both `Procfile` and `arbor.toml`\n- Process restart state, memory metrics, and terminal-session linkage\n- Scheduled `[[tasks]]` from `arbor.toml`, with optional Claude or Codex triggers\n- Bell-aware terminal activity and completion notifications\n\n### Diff, PR, and Review Context\n- Side-by-side diff display with addition/deletion line counts\n- Changed file listing per worktree\n- File tree browsing with directory expand/collapse\n- Multi-tab diff sessions\n- PR summary and detail cards in the changes pane\n- Native inline PR comment actions and review-comment refresh support\n\n### AI Agent Visibility\n- Detects running coding agents: Claude Code, Codex, OpenCode\n- Working/waiting state indicators with color-coded dots\n- Real-time updates over WebSocket streaming in both the desktop and web UI\n- Legacy session compatibility and targeted clear events for long-lived daemon sessions\n\n### Remote Daemon and Companion Binaries\n- `arbor-httpd` serves the remote daemon API and bundled web UI\n- `arbor-cli` exposes daemon-backed health, repo, worktree, terminal, process, and task commands\n- Dedicated `arbor-mcp` binary backed by Arbor's daemon API\n- Structured MCP tools for repositories, worktrees, terminals, processes, tasks, and agent activity\n- MCP resources for daemon snapshots and prompts for common Arbor workflows\n- Supports `ARBOR_DAEMON_URL` and `ARBOR_DAEMON_AUTH_TOKEN` for remote authenticated daemons\n- Create and manage remote worktrees over SSH\n- Multi-host configuration with custom ports and identity files\n- Mosh support for better connectivity\n- Remote terminal sessions via `arbor-httpd`\n- Outpost status tracking (available, unreachable, provisioning)\n- Optional Symphony runtime endpoints when the feature is enabled\n\n### UI and Config\n- Automatic PR detection and linking per worktree\n- Git actions in the UI: commit, push\n- Three-pane layout across `arbor-gui` and `arbor-web-ui`\n- Command palette coverage for actions, repos, worktrees, issues, presets, and task templates\n- Resizable panes, collapsible sidebar, desktop notifications\n- 38 themes shared between the desktop app and web UI, with live sync when switching themes\n- Branch-aware window titles and daemon / rate-limit status polish\n- TOML config at `~/.config/arbor/config.toml` with hot reload\n\n## Install\n\n### Homebrew (macOS)\n\n```bash\nbrew install penso/arbor/arbor\n```\n\n### Prebuilt Binaries\n\nDownload the latest build from [Releases](https://github.com/penso/arbor/releases).\nRelease bundles ship the desktop app plus `arbor-httpd`, `arbor-mcp`, and `arbor-cli`.\n\n### Quick Start from Source\n\n```bash\ngit clone https://github.com/penso/arbor\ncd arbor\njust run\n```\n\nTo run the MCP server against a local dev daemon:\n\n```bash\njust run-mcp\n```\n\n## Documentation\n\nThe live docs site is available at [penso.github.io/arbor/docs](https://penso.github.io/arbor/docs/).\nThe in-repo mdBook sources live under [`docs/src`](docs/src), and you can build them locally with:\n\n```bash\njust docs-build\n```\n\n## Crates\n\n| Crate | Description |\n|-------|-------------|\n| `arbor-benchmarks` | CodSpeed and local benchmark targets |\n| `arbor-cli` | CLI for Arbor's daemon API (`arbor-cli` binary) |\n| `arbor-daemon-client` | Typed client and shared API DTOs for `arbor-httpd` |\n| `arbor-core` | Worktree primitives, change detection, agent hooks |\n| `arbor-gui` | GPUI desktop app (`arbor` binary) |\n| `arbor-httpd` | Remote HTTP daemon (`arbor-httpd` binary) |\n| `arbor-mcp` | MCP server exposing Arbor via stdio (`arbor-mcp` binary) |\n| `arbor-mosh` | Mosh transport for remote outposts |\n| `arbor-ssh` | SSH transport for remote outposts |\n| `arbor-symphony` | Optional workflow orchestration runtime |\n| `arbor-terminal-emulator` | Embedded terminal engine glue and Ghostty integration |\n| `arbor-web-ui` | TypeScript dashboard assets + helper crate |\n\n## Repo Config\n\nRepo-local behavior is configured with `\u003crepo\u003e/arbor.toml`.\nArbor currently reads repo presets, managed processes, worktree scripts, scheduled tasks, branch naming rules, agent defaults, and notification routing from that file.\n\nExample:\n\n```toml\n[[presets]]\nname = \"Review\"\nicon = \"R\"\ncommand = \"codex --prompt-file .arbor/tasks/review.md\"\n\n[[processes]]\nname = \"web\"\ncommand = \"npm run dev\"\nworking_dir = \"app\"\nauto_start = true\nauto_restart = true\nrestart_delay_ms = 2000\n\n[scripts]\nsetup = [\"cp .env.example .env\"]\nteardown = [\"rm -f .env\"]\n\n[branch]\nprefix_mode = \"github-user\"\n\n[agent]\ndefault_preset = \"codex\"\nauto_checkpoint = true\n\n[notifications]\ndesktop = true\nevents = [\"agent_started\", \"agent_finished\", \"agent_error\"]\nwebhook_urls = [\"https://example.com/hook\"]\n\n[[tasks]]\nname = \"triage-prs\"\nschedule = \"0 */30 * * * * *\"\ncommand = \"./scripts/triage-prs\"\nenabled = true\n\n[tasks.trigger]\non_exit_code = 0\non_stdout = true\nagent = \"codex\"\nprompt_template = \"Review this output and prepare a follow-up plan:\\n\\n{stdout}\"\n```\n\nTask templates for the command palette default to `\u003crepo\u003e/.arbor/tasks/*.md`.\n\n## CLI\n\nArbor also ships `arbor-cli` for daemon-backed scripting:\n\n```bash\ncargo run -p arbor-cli -- health\ncargo run -p arbor-cli -- worktrees list --json\ncargo run -p arbor-cli -- processes list --json\ncargo run -p arbor-cli -- tasks list --json\n```\n\n## MCP\n\nArbor 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.\n\nEnable it in a normal build:\n\n```bash\ncargo build -p arbor-mcp\n```\n\nEnvironment variables:\n\n- `ARBOR_DAEMON_URL` overrides the daemon base URL. Default: `http://127.0.0.1:8787`\n- `ARBOR_DAEMON_AUTH_TOKEN` sends a bearer token for remote authenticated daemons\n\nRemote access:\n\n1. On the daemon host, set `[daemon] auth_token = \"your-secret\"` in `~/.config/arbor/config.toml`.\n2. Start `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.\n3. Point `arbor-mcp` at that daemon with `ARBOR_DAEMON_URL=http://HOST:8787`.\n4. Pass the same secret with `ARBOR_DAEMON_AUTH_TOKEN=your-secret`.\n\nLoopback requests are allowed without a token. Non-loopback requests require `Authorization: Bearer \u003ctoken\u003e`.\n\nExample client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"arbor\": {\n      \"command\": \"/path/to/arbor-mcp\",\n      \"env\": {\n        \"ARBOR_DAEMON_URL\": \"http://127.0.0.1:8787\"\n      }\n    }\n  }\n}\n```\n\nThe `arbor-mcp` binary is feature-gated. To disable the stdio server binary in a build, use:\n\n```bash\ncargo build -p arbor-mcp --no-default-features\n```\n\nSee [docs/mcp.md](docs/mcp.md) for the full MCP setup guide.\n\n## Building from Source\n\n### Prerequisites\n\n- **Rust nightly** — the project uses `nightly-2025-11-30` (install via [rustup](https://rustup.rs/))\n- **[just](https://github.com/casey/just)** — task runner\n- **A Caskaydia / Cascadia Nerd Font variant** — icons in the UI use Nerd Font glyphs\n\n#### macOS\n\n```\njust setup-macos\n```\n\nOr manually:\n\n```\nxcode-select --install\nxcodebuild -downloadComponent MetalToolchain\nbrew install --cask font-caskaydia-cove-nerd-font\n```\n\n#### Linux (Debian/Ubuntu)\n\n```\njust setup-linux\n```\n\nOr manually:\n\n```\nsudo apt-get install -y libxcb1-dev libxkbcommon-dev libxkbcommon-x11-dev\n```\n\nThen install the [CaskaydiaMono Nerd Font](https://www.nerdfonts.com/font-downloads) to `~/.local/share/fonts/`.\n\n### Experimental Ghostty VT Engine\n\nArbor can also be built with an experimental embedded Ghostty terminal engine.\nThis is opt-in, disabled by default, and currently expects:\n\n- the pinned `vendor/ghostty` submodule checked out\n- `zig` on `PATH`\n- a prebuilt `arbor_ghostty_vt_bridge` shared library in `target/ghostty-vt-bridge/lib`\n- optionally, `ARBOR_GHOSTTY_SRC=/path/to/ghostty` to override the pinned submodule\n- optionally, `ARBOR_GHOSTTY_TARGET` / `ARBOR_GHOSTTY_CPU` to force a safer Zig target in CI\n\nWith a build that includes `--features ghostty-vt-experimental`, Arbor defaults\nto the embedded Ghostty engine. You can still choose the embedded engine in\n`~/.config/arbor/config.toml`:\n\n```toml\nembedded_terminal_engine = \"ghostty-vt-experimental\"\n```\n\nExample:\n\n```bash\ngit submodule update --init --recursive vendor/ghostty\njust ghostty-vt-bridge\nRUSTFLAGS=\"-L native=$(pwd)/target/ghostty-vt-bridge/lib -C link-arg=-Wl,-rpath,$(pwd)/target/ghostty-vt-bridge/lib\" \\\n  cargo +nightly-2025-11-30 run -p arbor-gui --features ghostty-vt-experimental\n```\n\nTo run Arbor with both embedded engines available and let `config.toml` choose:\n\n```bash\ngit submodule update --init --recursive vendor/ghostty\njust run-configured-embedded-engine\n```\n\nTo run the experimental checks:\n\n```bash\ngit submodule update --init --recursive vendor/ghostty\njust test-ghostty-vt\njust check-ghostty-vt-gui\njust check-ghostty-vt-httpd\n```\n\nTo compare the embedded engine performance:\n\n```bash\ngit submodule update --init --recursive vendor/ghostty\njust bench-embedded-terminal-engines\n```\n\nTo build the daemon with the same terminal engine:\n\n```bash\ngit submodule update --init --recursive vendor/ghostty\njust ghostty-vt-bridge\nRUSTFLAGS=\"-L native=$(pwd)/target/ghostty-vt-bridge/lib -C link-arg=-Wl,-rpath,$(pwd)/target/ghostty-vt-bridge/lib\" \\\n  cargo +nightly-2025-11-30 run -p arbor-httpd --features ghostty-vt-experimental\n```\n\n## Similar Tools\n\n- [Superset](https://superset.sh) — terminal-based worktree manager\n- [Jean](https://jean.build) — dev environment for AI agents with isolated worktrees and chat sessions\n- [Conductor](https://www.conductor.build) — macOS app to orchestrate multiple AI coding agents in parallel worktrees\n\n## Acknowledgements\n\nThanks to [Zed](https://zed.dev) for building and open-sourcing [GPUI](https://gpui.rs), the GPU-accelerated UI framework that powers Arbor.\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=penso/arbor\u0026type=date\u0026legend=top-left)](https://www.star-history.com/#penso/arbor\u0026type=date\u0026legend=top-left)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpenso%2Farbor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpenso%2Farbor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpenso%2Farbor/lists"}