Releases: ensemblr-hq/ensemblr
Release list
Ensemblr 0.1.0-beta.4
Notifications you can act on, a delegation switch for Claude Code, and a quit that asks first. Signed, notarized, Apple silicon.
Added
- Pick how Claude Code delegates (#277). A first-class Claude Code chat held two ways to fan out — the runtime's own sub-agent tool and
ensemblr_start_conversation, which opens a real chat tab you can watch, steer, and audit — and nothing arbitrated between them. Settings → Providers → Claude Code → Sub-agents now picks one, and both directions are enforced so the mechanism you did not pick is absent rather than discouraged. The choice is fixed when a chat opens, so it reaches the next chat rather than the running one. Pi and every spawned child always delegate through chat tabs. - Quitting with agents running asks first (#278). A native confirmation names the chats about to be interrupted, with Quit Anyway and Cancel, in all three languages.
- A chime when a chat needs you (#287). A notification-sound setting (default on) plays a bundled chime alongside the desktop notification. The OS notification is posted silent, so switching the chime off buys silence rather than the system tone back.
- A planning workspace is named before the agent gets there (#280). Ensemblr derives a provisional name from your opening prompt when a plan-mode session opens or submits — no model in the loop — and marks it provisional, so the agent's own naming call still lands as a first naming and replaces it for free.
- Preview files agents write outside the workspace (#281). Clicking a
/tmp,~/.claude/, or sibling-worktree path in a chat now opens it in the read-only viewer, badged Outside workspace. This widens preview only: the attachment store stays workspace-only, symlink containment intact.
Changed
- Public copy leads with Ensemblr Control and the two runtimes (#274, #275), and the README hero is a video of Ensemblr Control driving the app rather than a static board screenshot.
- react-doctor is back at 100, by fixing the code rather than muting it (#289). Thirty suppressions became seven: four settings routes split so each component owns a file (762 lines rehomed), a pure helper moved out of a component file, the settings debounce window hoisted into its own hook, and the three environment layers assembled in parallel. Adds
knip.jsonc. - Behaviour change: every Claude Code session now carries
disallowedTools: ['Agent', 'Task']under the defaultensemblrsub-agent mechanism, includingbypassPermissionssessions that previously carried none.
Fixed
- Notifications are per chat, not per app (#276). The gate was app focus alone, so any focused window swallowed the notification for every other chat. It is now suppressed only when that exact chat is on screen in a focused window, and clicking a notification opens the chat it was about. A chat hosting somebody's sub-agent stays silent, an
idlethat is only the tail of a stop you asked for stays silent, and an agent blocked on a questionnaire now notifies. - The follow-up queue drains even when the composer was not watching (#288). The flush rode the falling edge of
isStreamingand so needed the composer mounted at the moment a turn ended; it now reads the agent's standing state.
Full changelog: https://github.com/ensemblr-hq/ensemblr/blob/master/CHANGELOG.md
Ensemblr 0.1.0-beta.3
Terminal shutdown fixes on top of beta.2. Signed, notarized, Apple silicon.
Fixed
- Quit no longer abandons a dying PTY child.
TerminalService.disposeAll()signalled each shell and returned immediately, so a child could report its exit while Electron was already destroying the JS environment — node-pty dispatches that callback from a native thread-safe function, and node-addon-api aborts the process (SIGABRT) rather than surfacing it. Quit now waits for each child to actually exit, bounded by a SIGHUP → 1s → SIGKILL → 1s escalation that fits inside the app's quit window, and a PTY stream listener can no longer throw across the native boundary. - An agent tab exiting just before quit no longer kills every other terminal. Agent sessions finalize asynchronously, so for up to two seconds after the child is gone the session row still reads
running. Shutdown took that as a live child and waited on an exit event that had already fired, stalling both grace windows and then SIGKILLing terminals that were seconds away from exiting cleanly. - A terminal created during the quit grace is wound down with the rest instead of surviving as an orphaned child with a live exit handler.
Full changelog: https://github.com/ensemblr-hq/ensemblr/blob/master/CHANGELOG.md
Ensemblr 0.1.0-beta.2
Dependency maintenance on top of beta.1 — no behaviour change. Signed with a Developer ID certificate, hardened runtime, notarized by Apple, and stapled. macOS on Apple silicon.
Changed
- Dependency updates (#267, #269–#273): TypeScript 6 → 7, Electron 43.1 → 43.3, Vite 8.1 → 8.2,
ai7.0.17 → 7.0.58,radix-ui1.6.2 → 1.6.7,lucide-react1.23 → 1.31,jotai-family1.0.2 → 1.1.0,@testing-library/jest-dom6 → 7, plus the rest of the dev-dependency group. CI actions moved toactions/checkout@v7andactions/setup-node@v7. @types/nodeheld at^24— Electron 43 embeds Node 24, so typing against^26buys a compiler that accepts APIs the runtime does not have.- README wordmark: the loop runs 16s instead of 4s and sits on GitHub's
#0d1117canvas.
Verified before release: npm run check, npm run typecheck (TypeScript 7), and 3737 Vitest tests, all against the combined dependency set.
Download the .dmg — open it and drag Ensemblr to Applications.
Ensemblr 0.1.0-beta.1
First public build of Ensemblr — a macOS workbench for isolated, multi-agent coding workflows.
This is a beta. Pre-1.0, Apple silicon only.
Install
Download Ensemblr-0.1.0-arm64.dmg, open it, drag Ensemblr to Applications.
The build is code-signed with a Developer ID certificate, hardened-runtime, notarized by Apple, and stapled — so it opens without a Gatekeeper prompt and validates offline.
Requirements
git, the GitHub CLI (gh, authenticated), and at least one agent runtime — the Pi CLI or the Claude Code CLI. Ensemblr checks all of this at first launch and offers a fix per failing check.
Notes
The app reports its version as 0.1.0; the -beta.1 suffix marks the release, not the build.
What's Changed
- chore: disable Claude co-author attribution in project settings by @psoldunov in #91
- feat(icon): shrink wordmark "E" 20% and add borderless social avatar by @psoldunov in #92
- fix(deps): patch tar, tmp, linkify-it to close 10 Dependabot alerts by @psoldunov in #93
- refactor: apply fallow and react-doctor codebase audit fixes by @psoldunov in #94
- docs: add JSDoc blocks to functions across the codebase by @psoldunov in #95
- refactor: organize types into concern-owned type modules by @psoldunov in #96
- Use workspace settings for setup scripts and unblock chat closes by @psoldunov in #97
- Sync base branch before creating workspaces by @psoldunov in #98
- Support pasted image attachments in composer by @psoldunov in #99
- Render inline workspace references as actionable chat chips by @psoldunov in #100
- Redirect archived workspaces to Welcome by @psoldunov in #101
- Restore welcome sidebar toggle and tidy tool UI states by @psoldunov in #102
- Add image previews and file-type icons to file tabs by @psoldunov in #103
- Skip workspace setup when dependencies are current by @psoldunov in #104
- Keep composer drafts scoped to chat tabs by @psoldunov in #105
- Redirect workbench launch to the last active workspace by @psoldunov in #106
- Refresh PR snapshots after GitHub PR creation by @psoldunov in #107
- Add merged PR header actions to continue or archive workspaces by @psoldunov in #108
- Show pending workspaces instantly during creation by @psoldunov in #109
- Fix merged sidebar header purple tint by @psoldunov in #110
- feat(workbench): refresh PR header instantly on created PR URL by @psoldunov in #111
- feat(workbench): draggable session tab ordering by @psoldunov in #112
- Refine Experimental settings and wire auto-run defaults by @psoldunov in #113
- Document current settings wiring status by @psoldunov in #114
- Show true workspace file counts after setup by @psoldunov in #115
- Show dock tab activity for terminal output by @psoldunov in #116
- Sync workspace pull request state in the workbench by @psoldunov in #117
- Show running dock activity on workspace rows by @psoldunov in #118
- Document shipped parity and runtime decisions by @psoldunov in #119
- fix(terminal): inherit shell-derived env for setup and run scripts by @psoldunov in #120
- Use workspace toolchain PATH for scripts by @psoldunov in #121
- Show setup status and bundle terminal font by @psoldunov in #122
- Fix session tab close controls during reorder by @psoldunov in #123
- Fix session tab selection after drag reorder by @psoldunov in #124
- Add draggable workspace dashboard board by @psoldunov in #125
- fix(workspace): address React Doctor findings by @psoldunov in #127
- Add dashboard workspace card action menus by @psoldunov in #128
- Fix dashboard availability while setup is pending by @psoldunov in #129
- Fix dashboard board drop targeting by @psoldunov in #130
- Avoid reusing generated workspace names by @psoldunov in #131
- Restore collapsed sidebar triggers across shell screens by @psoldunov in #132
- Keep dashboard accessible when no workspaces remain by @psoldunov in #133
- Refresh product docs to reflect shipped dashboard updates by @psoldunov in #134
- Add runtime-aware workspace setup state by @psoldunov in #135
- Fix dock tab close overlay border overlap by @psoldunov in #136
- Show live PR check statuses in the Checks panel by @psoldunov in #137
- Persist action prompts and preserve app detection cache by @psoldunov in #138
- Improve pull request editing and collapsed header actions by @psoldunov in #139
- Remove inactive workspace dead ends and stabilize tabs by @psoldunov in #140
- Prevent workspace creation race failures by @psoldunov in #141
- Improve pull request action color contrast by @psoldunov in #142
- Refine workspace services and renderer state handling by @psoldunov in #143
- Fix workspace removal layout animations by @psoldunov in #144
- feat(settings): wire app & repository settings to persistence and live config reload by @psoldunov in #145
- refactor(renderer): extract shared OpenInTargetsSubmenu and PanelMessage by @psoldunov in #146
- feat(renderer): preserve per-chat model, remove Help nav and deferred settings rows by @psoldunov in #147
- feat(build): sign and notarize macOS DMG builds by @psoldunov in #148
- Consolidate session naming and preserve stopped chat tabs by @psoldunov in #149
- THE-152: Rich diff viewer with inline review comments by @psoldunov in #151
- feat(agents): add harness launch and session tabs by @psoldunov in #152
- feat(agents): derive Codex and Vibe conversation titles by @psoldunov in #153
- Add session tab keyboard shortcuts and launcher tooltips by @psoldunov in #154
- Restore agent terminal tabs by @psoldunov in #155
- Serialize exclusive script launches by @psoldunov in #156
- Harden workspace worktree creation by @psoldunov in #157
- fix(models): stabilize startup catalog by @psoldunov in #158
- Fix unavailable summaries in transcript picker by @psoldunov in #159
- Harden Pi RPC startup and workbench recovery by @psoldunov in #160
- Audit install scripts and remove desktop activation by @psoldunov in #161
- Preserve resumable agent sessions and improve tab switching by @psoldunov in #162
- Prevent duplicate app instances during shell environment loading by @psoldunov in #163
- fix(main): harden single-instance lock and quit on last window by @psoldunov in #164
- fix(terminal): restore dock terminal sessions across restart with clean scrollback by @psoldunov in #165
- Add agent-to-app control layer by @psoldunov in #166
- Add role-aware agent orchestration guidance by @psoldunov in #168
- feat(agent-control): support sub-agent naming and board status sync by @psoldunov in #169
- build(deps): bump dompurify from 3.4.11 to 3.4.12 by @dependabot[bot] in #167
- feat(session-tabs): mark subagent tabs with top...