Skip to content
Public beta

Agents that drive the app, not just the code.

Ensemblr™ is a macOS orchestrator for the Pi agent harness or the Claude Code CLI you already have installed. Every stream of work gets its own git worktree, and the agent inside it can spawn sub-agents, delegate, wait and integrate — then open the diff, run the scripts and file the PR.

No account, no sign-in, no cloud sync, no telemetry. There is no Ensemblr backend in the path, and the app ships no agent binary of its own.

  • Apple silicon only
  • Pi or Claude Code CLI
  • git
  • gh, authenticated

Version v0.1.0-beta.17Channel: betaArchitecture: Apple siliconPublished 27 Aug 2026

Ensemblr Control

Not a place you run one agent. A place a team of agents runs itself.

A permission-gated control surface lets an agent drive the app itself — spawn sub-agents into their own tabs and block until they report, launch a harness, run a script, read the diff and leave review comments on it, ask you a multiple-choice question, move the workspace across the board. Pi reaches it through a shipped extension, Claude Code through an embedded MCP server, and a parity test keeps the two tool lists from drifting apart.

ensemblr_start_conversationensemblr_wait_for_agentsensemblr_launch_harnessensemblr_get_workspace_diffensemblr_add_diff_commentsensemblr_ask_user_questionensemblr_set_workspace_status
Ensemblr Controlapproval required
orchestratorclaude-opus-5
sub-agent

audit the reducer

sub-agent

port the tests

sub-agent

sweep the i18n keys

delegatewaitevaluateintegrate
Permission mode
read-only · approval required · workspace-trusted
Delegation depth
shallow — sub-agents never delegate onward
Spawn limits
per-session quota and rate cap
Waits
bounded — the caller blocks until its children report or the window expires; a blocked child can wake it
Issue writes
withheld from sub-agents — and agent work stops at In Review, enforced in code
Linked issue
a workspace made from one names it in every agent’s brief, cut to the calls that caller may make
Agent skill
handed to every agent it starts — the tool surface, the worktree model and every settings.toml key, read on demand and shipped inside the app, so nothing is written into your repository or your ~/.claude
Workspaces

One repo. As many streams as you have ideas.

The worktree manager underneath Control. A workspace is a real git worktree, not a branch you keep switching between, so a fan-out of agents cannot collide — two of them rewrite the same file at the same time and never see each other.

  • Start from a branch, a GitHub PR, or a Linear issue
  • Adopt an existing branch, or cut a fresh one from the base ref
  • Base branch fetched and fast-forwarded before the copy is made
  • Branch names derived from your first sentence to the agent
  • A board whose Backlog holds Linear and GitHub issues no workspace exists for yet
  • Drag one rightward to cut its workspace — nothing is written back to the tracker
Runtimes

Two runtimes. One surface.

Pi runs as a CLI over RPC; Claude Code runs in-process through the Agent SDK against the binary you already have on PATH. The wiring differs, the surface does not — both land on the same timeline with the same tools, approvals and checkpoints, and a chat tab keeps the runtime it was opened with.

  • One timeline, tool cards, approval prompts and context gauge for both
  • Plan mode holds an agent — and every sub-agent it spawns — to read-only tools
  • Git-backed checkpoints restore the tree to an earlier turn
  • Sessions persist to SQLite, with tree-structured branching
  • A failed turn is a designed row offering only the recoveries it earns — a refusal hands your prompt back to edit, a blocked tool call routes at the repository’s Security settings
  • Codex, Vibe and the claude TUI also run as terminal harnesses
Review

Review the change where you made it.

The review panel sits beside the conversation that produced the change, so reading the diff never means leaving the agent that wrote it.

  • Files, Changes and Checks, remembered per workspace
  • Diffs scoped to uncommitted work, a commit, or a whole branch
  • Attach a file, a folder or a diff to the chat beside it, from the panel’s own right-click menu
  • Inline comments anchored to lines, with resolved ones struck through
  • An agent’s comment pass pulls the Checks roll-up forward — once per pass, however many it files
  • PR title and description, live check status, merge — all through gh
  • Per-file discard, behind a confirmation
Scripts & terminals

Run it without leaving the workspace.

A repository declares its scripts once in .ensemblr/settings.toml and every workspace gets them, pointed at its own copy of the tree.

  • Any number of named run scripts, each with its own command and icon
  • A fingerprinted setup script that skips an unchanged workspace
  • Real PTY terminals that survive an app restart with clean scrollback
  • Detected dev-server ports surface as an Open :PORT action
  • Attach a terminal’s selection to the chat as a file the agent can re-read, named for the pane it came off
  • ⌘R toggles the default run script from anywhere in the app
The Concierge

Every workspace at once. Write access to none of them.

A panel that belongs to the app rather than to a workspace. It reads everywhere and changes nothing by hand: real work goes to an orchestrator it spawns into the workspace that needs it.

Concierge⌘⇧C
ensemblr_start_conversation

Opened a root orchestrator in Linear issue sync

ensemblr_create_workspace

Created Dock port detection

Both are running. Where they stand is in artifacts/where-the-work-stands.md

@projectworkspacechatartifactranked across the app

Its own folder

MEMORY.md
the index — one line per memory
memory/
one file per durable fact, indexed for recall
artifacts/
reports it writes for you, opened in the panel

Its context does not survive a clear. Its files do — and it writes only what no tool call could answer back.

Reads all of it

  • Every workspace’s files, diff and review comments
  • Any conversation replayed, tool calls included
  • Terminals, the board, Linear, and projects with no workspace yet

Acts through an agent

  • Spawns a root orchestrator into a workspace and briefs it
  • Creates a workspace when the work needs one
  • Moves the board and the tracker; comments on any diff

A peer that owns the task, with the write access the Concierge deliberately does not have.

Cannot

  • Write a file in any workspace; bash is read-only
  • Open a terminal or launch a harness
  • Act on a workspace without naming one

Refused per tool call at the control channel, not asked for in the prompt.

The rest of it

Everything else in the box.

The parts that do not need a diagram, but are the reason the app is usable all day.

Workspaces & history

  • Continue finished work onto a numbered continuation branch
  • Configured files copied into every new workspace
  • Archive a workspace’s context, git-backed, and browse it later
  • A History screen that restores or permanently deletes
  • Pin workspaces above their project groups
  • Unread markers and per-workspace activity dots

Sessions & composer

  • Pasted images and @-mention file payloads
  • Composer right-click menu with spellchecker suggestions and Add to dictionary
  • Auto-generated session names and summaries
  • Per-runtime model visibility
  • Claude plan usage per rate-limit window, beside the session’s cost
  • Workspace toolchain PATH and ENSEMBLR_* variables inherited
  • One shared code surface for viewer, diff and tool previews
  • File tree with live filesystem watch and lazy-loaded ignores

Settings & integrations

  • Layered user / repository / workspace config, live reload
  • Both config files carry a published JSON Schema your editor completes against
  • Per-runtime executable override and readiness checks
  • Git defaults: branch prefix, auto-rename, archive on merge
  • Appearance: theme, code theme, markdown style, mono fonts
  • Any number of Linear organisations connected at once
  • Infisical secrets resolved live at launch, never written into the repo
  • Setup diagnostics with per-check remediation
  • Concierge runtime, model and thinking level as their own setting, separate from workspace defaults
Credentials

Your machine. Your credentials.

Ensemblr is an orchestrator, not a service. There is no account to create, nothing to sign in to, and nothing synced off your machine — because there is no our side.

GitHub tokens stay with gh

Ensemblr stores none. No token field in settings, no OAuth screen, no second place one can leak from — it shells out to the CLI you already authenticated.

Secrets live in the Keychain

Linear’s OAuth tokens go straight to the macOS Keychain, keyed per account — never a file, never an environment variable. Infisical secrets are not stored at all: they resolve live at every launch.

No agent binary ships

Your pi and claude installs, your credentials, your models, your config. The ~260 MB the Claude Agent SDK would bundle is deliberately left out.

No account, no server

Ensemblr talks to GitHub, Linear, Infisical and your agent CLIs directly — no backend in the path, no telemetry. State is a local SQLite database beside your worktrees.

Download

Open it, point it at a repo, start a workspace.

Ensemblr is at 0.1.0-beta.17 and still pre-1.0. The core loop — isolated workspaces, agent sessions, review, PR — is wired to real services and used daily. Expect rough edges, and file them. Once installed it keeps up on its own: newer builds download in the background, and it offers to restart into one when you say so.

Before it is useful

macOS on Apple silicon
Builds are arm64-only.
An agent runtime CLI
Pi, Claude Code, or both. Ensemblr drives your own binaries and ships none.
git
Used natively for worktrees, branches, commits and diffs.
GitHub CLI (gh), authenticated
Authenticate once with gh auth login. PR and check data is read through it; no GitHub tokens are stored.
A Linear accountoptional
OAuth only, as many organisations as you need, with every token held in the macOS Keychain.
An Infisical projectoptional
A Machine Identity on your machine, and a project link committed to the repository. Secrets resolve live at every launch.

Version v0.1.0-beta.17Channel: betaArchitecture: Apple siliconPublished 27 Aug 2026

  • Ships no agent binary
  • No GitHub tokens stored
  • Session history is a local SQLite file

Signed with an Apple Developer ID and notarised by Apple. Hardened runtime, and the notarisation ticket is stapled to both the .app and the disk image it arrives in — so macOS validates each of them offline, on first open. No Gatekeeper override, no right-click → Open, no quarantine flag to strip.

Check it before you open it:

shasum -a 256 ~/Downloads/Ensemblr-0.1.0-beta.17-arm64.dmg
ff50d000a236b54a4439daa1373b7e19a3614d965b5d6f955383c9a038cfdfaf

Or install it with Homebrew:

The cask declares Apple silicon and macOS 12, so brew refuses on a machine that cannot open the app rather than installing it anyway. It is marked auto_updates because Ensemblr updates itself, so a plain brew upgrade leaves the bundle alone — two updaters writing one app is how an install gets corrupted. To hand the job to Homebrew instead, turn Settings → General → Update Ensemblr automatically off and upgrade explicitly:

Nightly · canary

An untested build of master. Rebuilt at 04:00 UTC on the nights the branch moved, signed and notarised exactly like a release, and shipped on its own channel: it installs as “Ensemblr Canary” alongside a release rather than over it, so keeping both is the normal case.

Ensemblr-Canary-arm64.dmg

No SHA-256 here. The file behind this link is rebuilt and replaced most nights, so a digest printed on this page would be wrong by morning — the nightly release names the commit it was built from.