Product guides and code maps.View source

00 · Ensemble overview

Ensemble is a shared workspace for a person and their agents: tasks, pages, projects, people, files, meetings and code in one place. The web app, desktop app, CLI and editor bridge share the same work context. It is source available under FSL-1.1-MIT.

This page maps what works today and its limits; each row links to the guide that owns the details.

Principles

  1. Work keeps its context. A task links a project, repositories, people, files, meeting notes and skills; its page and run history stay with it.
  2. The person chooses what comes in. Connecting an app imports nothing. Content arrives only through explicit search, attach, upload or import.
  3. Several ways to work. The Hub assistant operates the app, assigned agents do research or code work, and the CLI and editors read the same context.
  4. Model choice is explicit. Personal API keys, subscriptions on a paired computer, or included models with a monthly allowance.
  5. Changes are reviewable. Apply and Undo, run permissions, publishing approvals, revision checks and run evidence each have a job. A chat reply is not proof that an action succeeded.

1. Where Ensemble runs

Form Storage and execution Guide
Local development pnpm dev: Hub :3000, API :4000, Python model/plot runtime :5055; Postgres and Redis in Docker README, 01 §3
Hosted web Public signup, per-account data. The API runs on a home server behind a Cloudflare Tunnel (infra/deploy/home); file originals and plot tables are in private Azure Blob storage (ENSEMBLE_FILE_STORAGE=azure-blob). Code and the terminal run on the person's paired computer 01 §8, 32 §2
Desktop Tauri app for macOS, Windows and Linux: the account's web app in a native window with this computer as its runner, or local only (static Hub export on a local Node API with embedded PGlite, no Ensemble servers); a local-only app can move its data into an account once DESKTOP
CLI Terminal UI on the same local runtime: tasks, chat, a read-only Ensemble Node tab, pairing, profiles, runner service, updates, editor MCP setup, and ensemble capture for the runtime's browser and screenshot and video capture 26, 25 §10
Ensemble Node A separate website (ensemblework/ensemble-node, node.ensemblework.com; testing node-test.ensemblework.com) for persistent AI teammates in direct chats, crews of the person's own nodes, and rooms with other people and their nodes. Its backend is hub-api's node module: same account, workspace tools, included models and credits. A node acts for its owner in every space they can open, their own and those shared with them, with their current role in each, and lists their work across them. Nodes run the owner's own coding agents on their paired computer as agent sessions they start, queue, steer and stop, each node only its own; that work stays off the board unless the owner asks for a task. In a crew one node answers its person (the one they mention, else the lead); the lead hands work to the others as one plan whose steps run in order without chat between nodes, and reports once. A plan names every requirement and an independent check for each; a failed check repairs the build and checks it again before anything that depends on it, and the lead reports once with the checked screenshots and videos. A node does quick work itself, takes Ensemble tasks its person gives it or its crew from a task's owner field (deciding itself how to do them, a crew's lead by its members' roles), brings in temporary helpers for side tasks, makes nodes and crews when asked, runs routines on a schedule or an event, and hands an agent session to another node. Secrets and sign-ins are typed into a secure box, sealed in the browser for the computer's own key, and used there without a model seeing them; the owner can sign in on the computer or take the browser over from the web, end to end encrypted. A command-line sign-in a node starts (az login, gh auth login) reaches the owner too: its code on a card only they see, or its page in that remote view. A node keeps terminals open on the computer, and its owner watches a node's terminal or browser tab live from the web, types in it and takes control. A node and its coding agents browse and capture screenshots and video on the owner's computer; a model checks a picture shows what was asked before it is sent, and a capture the computer cannot clear waits for the owner's preview. A node sends files of any kind and whole folders (zipped, up to 100 MB) into the chat, and puts files its owner attaches onto the computer. In a room each person's lead answers within that person's sharing rules and asks before sharing anything else; a room can link a shared space whose board, events, contracts and decisions log the leads follow. Needs me is in the Node chat, in the CLI and in the Hub, which shows of Node only what a node's sessions ask for; a reply in the chat answers a session's request everywhere 35
Context Bridge MCP over stdio, local HTTP or hosted /mcp with an ens_ key or OAuth consent, in every space the key's account owns: a task's brief with where it came from and who is involved, the context graph around any record, ranked search, reads of everything the assistant reads, and files themselves (inline up to 20 MB, or saved into the editor's folder through the CLI); a key made with changes allowed also runs Ensemble's changes from the assistant's own tools (tasks, pages, boards, diagrams, plots, new files, projects, people, deliverables, meeting notes, comments, skills, routines, reminders, desk lists, imports), and one made with apps allowed uses the person's connected apps through Ensemble. Settings, model choice and layout changes, stopping or deleting runs, starting the assistant, agents, workflows or watchers, deleting routines or files and editing a file's original stay with the person; agent runs Ensemble starts get the everyday changes under their job's lease CONTEXT_BRIDGE
Quick capture Tauri tray app with a global shortcut; needs a running local API and capture authentication 20_QUICK_CAPTURE
Public documentation Static site built from tracked docs/ for docs.ensemblework.com, readable without an account; the existing Context Bridge's ensemble_docs read tool searches its published pages with an ens_ key 40

Hosted MCP OAuth is authorization-code/PKCE with DCR/CIMD, one-hour access tokens, refresh rotation by default and account-owned-space consent. Its catalog offers the same allowed capabilities through named tools; legacy editor keys and stdio retain their existing names. Connect your apps shows OAuth connections separately from manually created keys and disconnects the entire token family. Client/plugin distribution assets are in ensemblework/ensemble-integrations; vendor approval is separate (Context Bridge §4.1).

  • The desktop app with an account shows the account itself, so it and the web are always in sync. Pairing a desktop or CLI does not replicate the hosted database into the computer: the paired computer claims jobs, answers Code and terminal requests and runs subscription calls; its included-model calls go through the hosted account (25). A local-only desktop app keeps its own database and never contacts Ensemble's servers (DESKTOP §1).
  • Original source files are read from the computer and relayed without being kept as cloud originals. Code/Node editor buffers stay in browser memory; file lines a person explicitly quotes and sends are part of their chat history (16, 35 §8.18).
  • Node's session inventory includes exact recorded node/crew usage and original-file references across each session's run chain. Its compact list opens originals beside the session without a work-description feed (35 §8.9).
  • Owner-confirmed session deletion stops active work and removes the underlying coding agent's saved history on its computer before hiding it from session inventories. Project files stay; nodes request deletion through an owner-only chat confirmation (35 §8.9).
  • Root release.json sets the version of every surface. Desktop updates are signed; OS code signing is not configured.

2. How work flows

Person adds work / explicitly imports content
    → tasks, pages, files and linked context
    → Hub assistant action OR an assigned research/code job
    → Apply / review / Needs me when required
    → saved result, run evidence and history

The scheduler runs product jobs (reminders, retention, device leases) and the person's assistant routines. Morning brief is one editable built-in routine (05 §2).

3. Accounts, spaces and profiles

Area What works Boundary
Accounts Signup, password and social login, email verification, recovery, profile, export, deletion; independent three-place limits for Ensemble and Ensemble Node, each with a fourth-window chooser Ensemble's web and hosted desktop windows share one pool; Node windows have their own. CLI/editor keys are uncapped. Hosted model, app and agent features need a verified email (02 §16)
Google data Public access/use/storage/sharing/deletion and Limited Use disclosure; notice in Google connector details Separate Workspace grants; selected providers/settings must honor Limited Use (07)
Spaces Separate owned spaces, switching, settings copy/sync, export, deletion Each space is its own content scope (28)
Sharing Space and item roles, shares, public links, live presence, page co-editing Settings, credentials and reminders stay private (29)
Profiles Onboarding sets a profession profile, desk and modules. Engineer and Builder profiles can turn on Code, Agent queue, Runs and Skills; every profile keeps Diagrams, Plots and Metrics (packages/shared-types/src/modules.ts). Queue and history share the Runs page The onboarding profile is set once; Settings cannot switch it. Hiding a module keeps its data
Appearance Brand assets, light/dark/system, fonts, text scale, reduced motion, circular pixel avatars shared by every profile, backgrounds; contextual AI motion, structural loading and static waiting-for-you states BRAND

4. Work surfaces

Surface What works Limits Guide
Today Profession desk with a day-at-a-glance header, briefing, focus and triage, reminders; pins visible above every native desk; add, move and resize tiles (including Focus now, Your week, Agents at work) Profile desk and alternate widget layout are separate systems 02 §3.1
Board Collapsible Ensemble Kanban with live agent-start status updates; custom page boards with named columns and board-scoped overview tiles, using the Ensemble board's cards, drag motion, hover delete and side peek 1–20 columns per custom board; at most four overview tiles per board 02 §3.2
Tasks and pages Structured editor, nested notes, board/column assignment, collapsed board groups in Pages, mentions, links, compact comment overlays, AI blocks, embeds, co-editing, downloads (PDF, Word, Markdown, web page, text) with plots, diagrams and images drawn in One custom board per page; custom columns do not change task execution status; embedded resources keep their own access rules 02 §13
Testing Isolated live Hub/API and ensemble-test CLI, open signup, fast checks and testing → main promotion Test CLI uses only the test backend with separate state/updates; no testing native, landing or Node website 36
Page history and templates Blank-page creation, checkpoints, restore and duplicate; private templates through the API 30 checkpoints per page, five-minute coalescing; 50 API templates per space and profile; owner-only 02 §13
Context and projects People and identities with their relationship to you and a side panel of everything linked to them, projects created like pages (untitled, names may repeat) with a block-editor body, members with roles, and in-place tasks, deliverables and meeting notes, shared by full pages and peeks; repositories, preferences, profession records; a graph with find, focus within one or two links and a side panel that walks from record to record The graph shows saved data only 03, 02 §3.5
Meeting notes Notes linked to calendar meetings, their people and a project; transcripts from files, pastes, Teams, Google Meet, Zoom and meeting-notes apps, searchable by speaker and time; decisions and action items to tasks; a model's read of each meeting proposing the work it asked for with the words it was asked in; meetings of a series share a project, and Today shows last time and a prep brief before the next one Only work whose words are found in the meeting is proposed; imported notes are read-only apart from their project; Teams transcripts download only with the organizer's account; no recording or transcription 03 §7, §2.4
Files Private originals, previews, text extraction, hash-checked text/Office/sheet edits, conversion to pages, page export into Files Edits are format-specific 32
Node original files Chat-side editor, independent list, direct-change cards, owned agent-session changes, hash-checked autosave, account-persistent editor themes, Markdown/document previews and floating selected-line questions routed to the last node or directly into its editing session Online Code API 3 runtime; text up to 1 MB; safe downloads up to 100 MB; original access stays owner-only; precise last-editor metadata needs runtime 0.6.5 35 §8.18
Images in pages /image, drop and paste (screenshots, HTML with data: images) with upload progress; resize handles with a keyboard slider, alignment, width presets, alt text, remove; kept as Files and shown on shared pages and public links; read by agents and kept through Markdown rewrites 2 MB (2,097,152 bytes) per image, PNG, JPEG, GIF or WebP; no SVG; nothing is compressed; left out of Download 32 §6
Diagrams Source language, layout, visual editing, Mermaid import, SVG export Editing needs a 1024 × 640 CSS-pixel window; smaller windows get a read-only preview 21
Plots Datasets, figure specs, code, exports; browser runtime on the web, server/native worker elsewhere Uploads up to 20 MB 20
Skills Versioned personal instructions and completed-work learning Learning writes validated versions after a notice; no review-first flow 04
Routines and morning brief Scheduled assistant turns with editable instructions and cadence, pause, delete, one conversation and bell results; Today reads the latest morning brief At most 50 routines including the built-in brief; all use the account's default assistant model 02 §3.10a
Runs, Code, Needs me Runs combines Up next, Working now and Needs you above run history and evidence. Task-named, unique run checkout folders; Code review with quick open and a command palette, source control, passkey-unlocked terminal; stacked phone queues, wrapping answers, full-width run sheets and switchable Code panels §9 06, 16, 02 §4
Completed and Trash Review, reopen, restore, pin; retirement and purge Separate retention windows 07 §1.1
Metrics Model calls, credits and recorded events, filtered by provider and date Calls without token reports stay visible; external plan balances are not read 07
Search and navigation Compact search, Jump to, shortcuts, phone navigation Bounded, access-scoped results 02
Connect and Settings App grants, MCP connections, models, run profiles, automations (each with a switch and model tier), appearance, devices, data controls; Settings search that jumps to a row and highlights it, grouped tabs and an On this page list Guarded saves merge disjoint fields; overlapping saves keep both values and ask which to save 02, 31

5. Assistant

The Hub assistant operates the app through typed tools. Its instructions stay the same through a chat; each message brings only its own context (date, view, open item, mentions), and records, playbooks and app details come from tools when needed. Built-in playbooks (apps/hub-api/src/assistant/skills/*.md) route each request to a small toolset; saved personal skills add instructions. On the person's own AI subscription, one chat is one session of that agent. Settings → Prompts shows every prompt Ensemble sends. 11 explains the loop; 34 maps every tool.

Capability What works
Tasks and records Create and update tasks, people, projects, repositories and profession records; comments, Trash, conversions, history. Clearing the board or a filtered set is one hub_delete_tasks call with one Undo
Custom boards List and read a board by its link, id or title; make, change and delete boards and their columns; put, move and take off tasks and notes. Deleting a board always waits for Apply
Agent assignment Assign to Ensemble's agent, Claude Code, Codex, Cursor's agent, GitHub Copilot, Grok Build, OpenCode, Gemini CLI, Antigravity, Mistral Vibe, Qwen Code or Kimi Code on a paired computer or this server, with a run profile; waits for Apply, then queues
Open workspace Reads surface IDs, selected and visible records, filters and document selection
Layouts and documents Today desks, Context panels, Board overview, widget layouts; block-level page edits after revision and schema checks
Dependent actions hub_run_workflow: 2–12 ordered writes, one Apply, references to earlier results, durable per-step receipts
Connected apps Each prompt names the space's connected apps; hub_list_connections lists them without tokens; naming an app loads its tools. Guests in a shared space see none
Connected items and imports Search, read, attach, refresh, make tasks, import or merge people, link project containers; preview, start, follow, cancel or undo board imports
Files Read text, hash-checked original and sheet edits, convert to pages, export pages into Files
Skills, settings, models Versioned skill edits; allowlisted settings; provider, model and effort choice
Calendars Google and Outlook: list, create, update, cancel, RSVP, invites, recurrence, availability
  • Hub writes run at once by default (Settings → Assistant → "Just do it (undoable)"); Preview makes them wait. Connected-app writes, settings, workflows and agent assignments always wait for Apply.
  • An interrupted workflow step with an unknown outcome is not replayed. Starting an import is not finishing it.
  • There is no native email, Slack or Teams send. Calendar invitations can notify guests; some connected-item updates and vendor MCP tools write after Apply.
  • Surface context is structured app state, not screenshots or DOM access. Neither the assistant nor Ensemble Node ever opens Ensemble's own web app in a browser (39). Credentials, account deletion, sharing permissions and folder trust are human-only.
  • Connected-app content is read only when the person asks for remote content or gives an item link (assistant/apps.ts). The attachment button uploads into Files or lists saved Files and searches no connector.
  • Files attached in chat, in Ensemble Node or to a task go to the model as the files themselves, whatever their kind; a provider that refuses one gets the request again without it. A person's own subscription agent gets them in its own input form. Ensemble's extracted text of a file is not given to models; plots on a task page arrive as settings and data (38).
  • Replies, receipts and previews name records by title and link to them; ids stay in tool data and link targets, and show only when the person asks (11 §4.1).

6. Connected apps and imports

Path What works Guide
Connect an account Saves the person's grant or token; imports nothing. The store lists connected apps first and guides each way of connecting 31 §3
Sync people Bounded contact metadata from Gmail, Outlook, calendars, Slack, Teams and GitHub; filters service identities; no bodies, no tasks 03 §2
Scheduled fetch Reads nothing: fetchAll(…, "schedule") in connectors/sync.ts returns at once 05 §2
Today calendar Google Calendar, Outlook (Teams meetings included) and calendar links (ICS) as one calendar, read every 30 minutes; the same event from several calendars shows once (fixed rules, no model) 03 §2.5
Native connected items Explicit search/read, attach, add task, people, supported write-backs (for example Zotero notes) 31
Vendor MCP The vendor's enabled tools with schema, approval and access checks. A server holding personal data needs sign-in or a token; one that answers without an account shows "Connected · public data only". AWS Knowledge, Context7 and Exa need no account 03 §2.2
Board imports Native board sources and uploaded exports; preview, mapping, background progress, rerun, undo 27
Meeting imports API-key adapters or vendor tools; transcript files and pastes read without a model; one meeting at a time from Teams, Google Meet and Zoom; source attribution; bounded batches 03 §2.3, §2.4

A catalog entry is a connection option, not a promise of native search, an importer or sync.

7. Core domain model (shared across modules)

apps/hub-api/prisma/schema.prisma and packages/shared-types/src/ are authoritative. Roles:

Records Role
User, Session, ActivePlace, AuthIdentity, EmailToken, AuthFlow Account and profile, hashed sessions, account window leases (three Ensemble and three Node places independently, 60-second expiry), login identities, recovery and verification
Extra User rows with ownerId Spaces. Request userId is the open space; accountId is the signed-in person
SpaceMember, Share, Contact, SpaceTransfer, PublicLink Membership, item shares, contacts, ownership transfer, public links
Task, TaskPage, PageBoard, PageRevision, PageTemplate Work and its documents, page-board/column membership, board-specific overview tiles, nesting, revisions, private templates
Person, PersonIdentity, Project, Repo, Deliverable, project links Saved context; external identities are separate from display names
Artifact, ArtifactChunk, Extraction, ContextSuppression Saved source content, extracted metadata, deletion suppressions. Vector/tsvector columns are unused
Skill, SkillVersion, SkillFeedback Current personal instruction (authoritative), versions, feedback
WorkspaceJob, Run, RunStep, Approval, AgentDecision Assignment, attempts, evidence, exact continuations
AssistantConversation, AssistantMessage, AssistantWorkflow Chat, tool proposals and receipts, dependent-write checkpoints
AssistantRoutine Scheduled assistant work, instruction, cadence, latest status and conversation; nullable builtInKey is unique per owner
ModelCredential, ConnectorApp, McpConnection, ApiToken, Device, DevicePairing Encrypted keys and grants, API tokens, paired computers
McpOAuthClient, McpOAuthRequest, McpOAuthGrant, McpOAuthRefreshToken Hosted MCP client metadata, browser-bound consent/codes, account-owned-space grants and rotating credentials; OAuth access keys reference their grant in ApiToken
Document, MeetingNote, PlotDataset, Plot, BlockDiagram, WidgetLayout, desk records Feature content; storage and limits are in the owning guide
AuditLedger, MetricEvent, InteractionEvent, IncludedUsage, IncludedCreditBalance, IncludedPeriod Action history, observations, interaction log, included-model usage and allowance

Content is scoped by the open space's userId; sharing policy limits what a guest may read or write. Credentials, reminders and personal settings never become shared with an item (28, 29).

Migration 20261006010000_account_data_lifetime adds SQL foreign keys that stop writes after account deletion. They are NOT VALID (existing rows are not checked) and absent from Prisma's relation model. Never accept generated migrations that drop them; src/workspace/constraints.integration.test.ts checks the allowed difference. This is not row-level security.

8. Models and credits

  • Personal API keys are checked and stored encrypted per account. Provider discovery is cached with explicit refresh. Provider and model are always named together; effort levels are validated.
  • Included AI defaults to GPT-5 mini and GPT-4.1 mini, with 20,000 credits per account per UTC month (DEFAULT_MONTHLY_CREDITS), within each environment's operator ceiling and a per-call reservation. Hosted dev/test uses Visual Studio Azure credits. Luna, Sol and Grok are not currently included; eligible deployments can be explicitly enabled later. Azure paid grounding is opt-in; free web search remains available (33).
  • Included models work on the web, on Ensemble Node and on a paired desktop or CLI, from one list and one allowance per account. A local-only desktop app has none (it uses the person's own keys and AI subscriptions); no Azure key is ever copied to a computer.
  • Subscriptions on paired computers are a separate source. External coding engines use their own local sign-in.
  • Run usage separates reported tokens, included credits, estimated prices and unknown prices.

Details: 01 §6, 30, 33.

9. Assigned agents and Code

  • Assignment creates a durable workspace job that the API or a paired computer claims and runs. The person picks only the agent (or Auto, the agent their Settings → Models names for the task's complexity) in one picker with model, thinking level and context window; where it runs decides the rest: work in a folder or checkout, or research and writing on the server. Branch, Git, instructions, sandbox and limits sit under More options. Continuing an earlier task resumes the coding agent's own session (one conversation across the tasks continued in it); the assistant lists sessions and assigns into one. Engines: Ensemble, Claude Code, Codex, Cursor, GitHub Copilot, Grok Build, OpenCode, Gemini CLI, Antigravity (30).
  • Run profiles hold model, thinking level, context window, mode, sandbox, network and git permissions, destination and budgets. Engines: Claude Code, Codex, Cursor, GitHub Copilot, and through one ACP runner Grok Build, OpenCode, Gemini CLI and Google Antigravity (installed by Ensemble). Each coding agent's menus list the models its computer reports, with that model's own levels, windows and fast mode (Claude's 1M window and fast mode, Codex's levels and fast tier, Copilot's long context), and Settings shows Claude's and Codex's 5-hour and weekly usage. Conflicting jobs run one at a time, and a run that starts changing a folder another run on that computer is changing waits for it, works in a git worktree or goes alongside, as the person chooses (Run unattended waits). Needs me holds exact pending decisions; no mode needs a trusted folder, reading never asks, Review only asks once per other folder it changes, Run unattended never waits and works across the workspace, and only keys, system files, Ensemble's own code and limits the person chose are refused. A folder the person trusts is trusted in the engine too. Publishing uses saved approvals.
  • A stop or restart keeps partial work and marks the interruption instead of claiming success; a paired computer that comes back reattaches a run that kept going and carries on one it lost to a restart, at most twice. Runs keep Results, Files (including those changed outside the run's folder) and Traces, with readable tool JSON, an exact raw view and copy, and incomplete-content warnings (02 §3.4).
  • On the web, code review, editing, source control and the passkey-unlocked terminal go through a paired computer; ordinary accounts cannot reach the server's filesystem or terminal.
  • OS sandbox: Seatbelt (macOS), bubblewrap or Landlock (Linux), the sandbox-runtime account (Windows).

Details: 05, 06, 16, 24, 25.

10. Data controls and measurement

  • Settings → Data → Danger zone: type a scope-specific phrase, then confirm again. Deletion and its receipt are one transaction. Everything erases usage details, metrics, baselines and audit payloads; used credits stay charged (07 §6).
  • IncludedCreditBalance is keyed by an HMAC of the account email, so erasing a workspace or recreating the account does not renew the allowance.
  • Metrics uses recorded events and says when observations are too few. Included credits are metered apart from provider cost estimates.
  • The Hub logs how signed-in people use it (screens, active time, named actions; never content) for the operator's dashboards (07 §1.3).

11. Not supported

Area Boundary
Recurring workflows Fixed product schedules only
Semantic retrieval Vector fields are unused; retrieval is ranked word search plus links between saved records (03 §5)
Skill Forge mining apps/skill-forge is a stub; no bulk mining of past work
Audio, video, scans No OCR, transcription or visual understanding
File redesign Format-specific edits only
Record and settings control Registered operations and allowlisted settings only; no SQL, secret or permission changes
MCP OAuth server Ensemble is an OAuth client of vendor MCP servers; external MCP clients use ens_ keys
Audit hardening Hash-linked ledger only: no INSERT-only role, full content-hash verifier, OpenTelemetry export or eval/ corpus

12. Source map

Area Main implementation Guide
Hub apps/hub-web/app, components, lib 02
Context and connected apps apps/hub-api/src/context, connectors, people, projects 03, 31
Personal skills apps/hub-api/src/routes/skills.ts, jobs/skill-mining.ts, cowork/morning-skill.ts 04
Agent execution apps/hub-api/src/workspace, devices, remote 05, 06
Access, audit, retention apps/hub-api/src/lib, sharing, spaces, jobs 07
Assistant apps/hub-api/src/assistant 11
Ensemble Node apps/hub-api/src/node, apps/cli/src/tui/node.ts; the website in ensemblework/ensemble-node 35
Files apps/hub-api/src/files, apps/hub-web/components/files 32
Editor context apps/context-bridge, apps/hub-api/src/bridge CONTEXT_BRIDGE

Directory map: 17. Configuration, development and CI: 01. Setup: root README. Which docs move with which code: AGENTS.md. All guides: index.