100% free AI setup guides — no credit card needed
← GitHub Projects
ADVANCED1 views

OpenDots: AI Agent Workspace

OpenDots is a MIT-licensed template for persistent AI agents that each get their own computer, workspace and permissions. 5,579 stars. Covers per-Dot sandboxing, human-in-the-loop approval gates, MCP and Composio tools, voice calls and Slack.

TypeScriptReactCopilotKitAG-UITanStack AINode.js 24WebRTCMCPComposioSlack Channels SDKSQLiteOpenBot

Always-on AI coworkers that move between text, calls, and Slack — an open-source template for persistent AI agents, each with its own computer.

Verified facts: 5,579 stars · 803 forks · TypeScript · MIT licence · 77 open issues · created 29 Sep 2026 · last pushed 15 Oct 2026.

Read this first. OpenDots is a template, not a hosted product, and the README labels it alpha. You run it yourself. Crucially, conversations require CopilotKit Intelligence — their hosted service, or a licensed self-hosted deployment. You can create Spaces, pages and Dots locally before connecting anything, but the agent chat does nothing until you provide an Intelligence project and a model key.


What OpenDots Actually Is

Most "AI agent" repos are a prompt and a while loop. OpenDots is closer to an operating system for a team of agents.

The unit of work is a Dot: a named specialist with its own role, its own instructions, its own permissions, and — optionally — its own computer. A researcher can browse and take notes; a writer can turn findings into a draft. You inspect their work and decide what each one is allowed to touch.

Around that sits a document workspace called Spaces. Ask a Dot to research something, review the draft it produces, approve it, and the approved draft becomes an editable page in a Space.

The three headline interactions are:

SurfaceWhat it does
TextStreaming chat with tool calls and live agent state
CallsWebRTC voice sessions paired with a separate compute agent
SlackMention a Dot in a channel and continue the conversation in its thread

The same conversation continues across all three. That continuity is the actual idea, and it is what separates this from a chatbot with a voice mode bolted on.


The Part Most People Miss: Agents With Their Own Computer

Each Dot can be given its own computer, powered by OpenBot's container supervisor and computer service. The browser profile and workspace files persist across stop/start, so an agent can be interrupted and resume with its context intact.

The Computer panel exposes browser control, files, terminal output and activity, with browser, file and shell permissions granted per Dot. Service credentials stay server-side, and the app derives a different computer credential for each Dot.

Two details in that design are worth stealing even if you never run OpenDots:

  1. Per-agent credentials. A compromised researcher Dot cannot escalate into the writer Dot's privileges, because they are not the same credential.
  2. Persistence across restarts. Most agent frameworks lose the thread when a container dies. Here the workspace is durable and the container is disposable.

The README is also explicit that an unconfigured template does not execute commands on your host. Computer tools require those services to be running. That is a reassuring sentence to find in an agent framework's README.


Review Before Saving

This is the most important idea in the codebase, and it is not about AI at all.

Ask a Dot to show you a draft before it saves it. A human-in-the-loop card pauses the conversation and waits for Approve & save or Decline. On approval, the page is created in an authorised Space and a link comes back. Retries with the same draft recover the already-saved page, so a flaky connection never produces duplicate documents. A changed draft requires a fresh review — the agent cannot sneak in new content under an old approval.

The same model extends to tools. Read-only tools run on their own. Anything else pauses for an Approve & run card, and only your approval executes it. You can toggle every tool per Dot.

This is what separates an agent workspace you would trust with a real account from a demo that deletes something at 3am.


Connections and Connected Apps

  • Any MCP server. Email, calendar, GitHub, or your own services. Tools can be switched on or off per Dot.
  • Composio for connected apps, so a Dot can work with the owner's real email and calendar. Limit each Dot to specific toolkit slugs such as gmail or google_calendar; a blank list allows everything in the project.

The project identity is pinned via OWNER_ID, and when a tool needs authentication the Dot returns a Connect link in chat for the owner to complete sign-in.

⚠️ These tools act on real accounts. The README's own advice is to start with a read-only request and use a test account before any write action. CopilotKit's demo video is not a place to test a write against your primary Gmail.


Architecture

AG-UI carries streamed messages, tool calls and agent state between the backend and the interface. Computer activity appears inline while the agent works, and human-in-the-loop cards pause a tool call for your decision before it continues.

The stack:

  • CopilotKit — React SDK and runtime
  • AG-UI — the agent-to-UI protocol
  • TanStack AI — model streaming and server-side tool execution
  • CopilotKit Intelligence / Threads — durable conversation state
  • Channels SDK — Slack
  • OpenBot — container supervisor and agent computers
  • Composio — optional connected apps
  • WebRTC — realtime speech

Pages, application metadata and background-work state are stored separately from conversation history — SQLite holds pages, workspace metadata and thread bindings. That separation is what lets a page survive independently of the chat that created it.

Calls use a compute bridge: speech runs while a separate agent does the long work, both sharing the same conversation context and tool permissions.


How to Set Up OpenDots Locally

Node.js 24 and npm:

git clone https://github.com/CopilotKit/OpenDots.git
cd OpenDots
npm ci
cp .env.example .env
npm run dev

Open http://127.0.0.1:5173. You can create Spaces, write pages and configure Dots at this point — before connecting any service.

To enable chat, connect an Intelligence project and a model:

npx copilotkit@latest login
npx copilotkit@latest project select

project select writes CPK_INTELLIGENCE_API_KEY into .env. Keep CPK_TELEMETRY_ID alongside that key, because the SDK uses it to resolve usage against your account. Then add OPENAI_API_KEY and OPENAI_MODEL and restart.

⚠️ Do not run copilotkit onboard in this folder. OpenDots already contains its CopilotKit integration; onboarding adds a second, generic one. This is called out in the README and it will cost you an hour.

There is also a local Docker evaluation of Intelligence if you want conversations without sending them to CopilotKit's cloud — but note the README's warning that local Intelligence does not make a remote model local.


Data and Privacy — Actually Worth Reading

This is the section most project READMEs skip. OpenDots does not.

  • Conversation messages, tool calls and run events are persisted in whichever Intelligence deployment you configure. The hosted setup sends them to CopilotKit's cloud; the local Docker setup keeps them on your machine.
  • The model provider receives conversation context, including authorised page content and tool results.
  • Public-web research sends queries and selected URLs to Parallel by default. Disable with WEB_SEARCH_PROVIDER=disabled.
  • When connected apps are enabled, tool arguments and results pass through Composio and the app provider.
  • Installing or renewing local Intelligence still requires CopilotKit sign-in and internet access.

Telemetry can be switched off with COPILOTKIT_TELEMETRY_DISABLED=true or DO_NOT_TRACK=1, which also purges pending setup events.

The pattern to notice: the app keeps credentials on the server and never asks the browser to hold them. An agent workspace that ships secrets to the client is an agent workspace that leaks.


Who Should Actually Use This

Use it if you are building a multi-agent workspace, you want human approval gates on real side effects, you want agents that survive restarts, or you need one agent's work to flow into a document another agent can continue.

Skip it if you just need a chatbot, you want something battle-tested in production, or you cannot accept an alpha with 77 open issues and a hard dependency on a commercial intelligence service. For a personal assistant that runs on your own hardware with no vendor relationship, this is the wrong shape of tool.


Verdict

A genuinely ambitious template that treats agents as persistent team members rather than request handlers. The per-Dot computer model, the durable workspaces and the approve-before-saving flow are the ideas worth taking even if you never deploy it.

The caveats are real, though: alpha, template not product, and conversations gated behind CopilotKit Intelligence. Read the Data and Privacy section before you connect a real account, because this thing is explicitly built to act on your email and calendar.

Worth an afternoon to clone and read the source, even if you install nothing.


Want a self-hosted agent workspace evaluated against your infrastructure, with the vendor dependencies mapped out? I build and configure AI agent systems, MCP servers, and deployment pipelines for teams and businesses. Contact: steven@growths.dev

OpenDotsCopilotKitAG-UIAI agentsmulti-agent systemsagent workspaceAI coworkersautonomous agentsagent orchestrationhuman-in-the-loopMCPModel Context ProtocolComposioWebRTCvoice AISlack botsTypeScriptReactNode.jsTanStack AIcontainer isolationsandboxingopen-sourceMIT licensetemplateagent computerpersistenceNext.js

See it in action

View Demo

Want to learn more about this project?

Have questions or want to understand this technology more deeply? Send me a message.

Related Projects

Discussion

Leave a Comment

Loading comments...