OpenDots: self-hosted AI agent workspace template with browser-equipped Dots
Your always-on AI coworkers that move between text, calls, and Slack.
At a glance
- What is it?
- OpenDots is a self-hosted TypeScript template for building an AI agent workspace where each agent (called a Dot) can have its own browser, terminal, and file access. It is in alpha and requires CopilotKit Intelligence for conversation threads.
- Who is it for?
- OpenDots is the right starting point if you want a self-hosted AI agent workspace where each agent has browser and file access, and you plan to connect CopilotKit Intelligence for conversation threads. Skip it if you need a stable release, since the current version is 0.1.0 with alpha status and no tagged GitHub releases.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 11, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A template for self-hosted AI agent workspaces, not a hosted product
OpenDots is an open-source TypeScript template for building an AI agent workspace that you host yourself. Its README is direct: this is a template, not a hosted product. You run the application, configure its infrastructure, and adapt the interface and tools to your requirements. The agents are called Dots, and each is a specialist you define with a name, role, instructions, and a set of permitted tools.
Status is alpha, indicated by the badge in the README and the version 0.1.0 in package.json. OpenDots is built on CopilotKit and AG-UI, with Hono as the server framework (@hono/node-server at ^2.1.3), Vite and React for the frontend, TipTap for rich text editing, and SQLite for local document storage.
What distinguishes this from a general chat interface is the Dot computer feature: each Dot can be granted its own container-backed browser, terminal, and file workspace through OpenBot's container supervisor and computer service. Computer tools require additional setup documented in docs/COMPUTERS.md, and an unconfigured template does not execute commands on the host.
Docker Compose setup, port 4310, and the required OWNER_TOKEN
For development, start the server and Vite frontend together with:
npm run devThe dev script in package.json runs concurrently a tsx-watched Node server and a Vite dev server. A comment in .env.example notes that `npm run dev` allows http://localhost:5173 and http://127.0.0.1:5173 as origins.
For production, compose.yml builds the application image from the Dockerfile, which uses node:24-bookworm-slim as its base and sets PORT=4310 and DATABASE_PATH=/data/opendots.sqlite as environment defaults. The application container binds port 4310 to 127.0.0.1.
compose.yml sets `OWNER_TOKEN: ${OWNER_TOKEN:?Set a 24+ character OWNER_TOKEN in .env}`, which means Docker Compose exits with an error if OWNER_TOKEN is missing or shorter than 24 characters. Beyond that, the key variables to configure in .env before first run are:
INTELLIGENCE_API_KEY=
OPENAI_API_KEY=
OPENAI_BASE_URL=https://api.openai.com/v1The .env.example notes that the UI opens in setup state until the fields are configured. INTELLIGENCE_API_KEY connects to CopilotKit Intelligence for conversation threads. OPENAI_API_KEY is listed as optional for direct OpenAI access alongside the Intelligence endpoint.
Dots as configurable agents with browser computers and isolated credentials
A Dot is configured with four properties: a name, a role, a set of instructions, and the tools it may use. The README gives the example of a researcher investigating a topic and a writer producing a draft from those findings, with the user inspecting work and controlling permissions per Dot.
Computer access goes beyond chat responses. Each Dot can be assigned a container-backed browser, terminal, and file workspace through OpenBot's container supervisor and computer service. Its browser profile and workspace files persist across stop and start cycles. The Computer panel in the interface exposes browser control, human takeover, files, terminal output, and activity logs. Browser, file, and shell permissions are set per Dot rather than globally, so a research Dot can have browser access without granting it shell access.
Credential isolation is part of the design: service credentials stay on the server side, and the application derives a different computer credential for each Dot. Setting up computer access requires building the pinned container images and connecting them to the deployment, with full instructions in docs/COMPUTERS.md. An unconfigured template does not execute any commands on the host, as the README explicitly states.
Spaces and SQLite pages, with a human review card before any Dot saves content
A Space is a document workspace. Multiple Spaces can exist in the same installation, and a Dot can be granted access to more than one in its settings. Each Dot also has a default destination Space where it saves pages. Pages can be organized as nested subpages, browsed in a searchable library, and viewed in either grid or list mode. A visual editor with formatting, slash commands, and undo/redo handles direct editing.
Pages are stored in a local SQLite database at the path set by DATABASE_PATH, defaulting to data/opendots.sqlite. Conversations about pages use CopilotKit Threads, with a separate thread for each page and each specialist Dot. Manual editing works even before conversation services are connected.
Before a Dot saves a draft as a page, a human-in-the-loop review card pauses the conversation with Approve & save or Decline options. Approval creates the page in an authorized Space and returns a link. Retrying with the same draft recovers the saved page rather than creating a duplicate. A changed draft requires a new review cycle, and a revision check prevents stale edits from overwriting newer content.
Voice calls require VOICE_API_KEY and Slack needs four environment variables
Voice call support pairs real-time speech with a separate compute agent. Both text and voice share the same conversation context and tool permissions. The call interface shows a live timer, separate user and Dot captions, microphone mute, speaker mute, and a minimized view for returning to chat. Voice needs provider configuration through VOICE_API_KEY and VOICE_MODEL in the .env file. In compose.yml, VOICE_NAME defaults to "marin" when not set.
Slack integration connects a Dot to a workspace through the Channels SDK (@copilotkit/channels at ^0.11.0). Mentioning a Dot in a configured Slack channel routes the message to its thread, with the conversation continuing there. Four environment variables gate the integration in compose.yml: SLACK_CHANNEL_NAME, SLACK_TEAM_ID, SLACK_USER_IDS, and SLACK_DOT_ID. An explicit workspace and user allowlist is required. Setup instructions are in docs/SETUP.md#slack.
Neither feature activates from a default installation. Voice and Slack each fail silently or remain inactive until their respective credentials are configured.
CopilotKit Intelligence as the required conversation engine, with three access paths
OpenDots routes all AI conversations through CopilotKit Intelligence, which is a separate service from the application itself. Three paths exist for connecting it. The hosted CopilotKit service is configured through INTELLIGENCE_API_KEY or CPK_INTELLIGENCE_API_KEY in the .env file, with the server preferring a non-empty CPK_INTELLIGENCE_API_KEY when both are set. A local Docker evaluation mode is documented in docs/SETUP.md#local-intelligence-evaluation. A licensed self-hosted deployment is described at docs.copilotkit.ai/intelligence/self-hosting.
Without any of these configured, the .env.example notes that the UI opens in setup state and conversations do not run. This dependency is the main reason OpenDots cannot function as a fully local, offline workspace out of the box: there is no mode that runs inference on the host without an Intelligence endpoint.
SDK telemetry is enabled by default, with the SDK sending usage data linked to CPK_TELEMETRY_ID to connect the installation's usage to its Intelligence account. Two opt-out mechanisms are available: DO_NOT_TRACK=1 or COPILOTKIT_TELEMETRY_DISABLED=true. COPILOTKIT_TELEMETRY_SAMPLE_RATE defaults to 1 and can be overridden. Details are in docs/TELEMETRY.md.
Alpha badge, MIT licence, and dependency versions in package.json
OpenDots carries an alpha status badge in its README and has version 0.1.0 in package.json. No GitHub releases are tagged, meaning there is no stable version to pin or refer to in issue reports. Last push to the repository was on 2026-10-05, and the repository is not archived.
Licence is MIT, from the LICENSE file at the repository root.
Runtime dependency versions from package.json: @copilotkit/core, @copilotkit/react-core, and @copilotkit/runtime at ^1.75.0; @copilotkit/channels at ^0.11.0; @ag-ui/client and @ag-ui/core at ^0.0.59; @modelcontextprotocol/sdk at ^1.31.0; @tanstack/ai at ^0.63.0 and @tanstack/ai-openai at ^0.25.1; @tiptap/core at 3.31.3 (pinned without a range operator). Node 24 is the base in the Dockerfile, using node:24-bookworm-slim.
Because the CopilotKit packages are at ^1.75.0 and the AG-UI packages at ^0.0.59, patch and minor updates within those ranges can arrive through npm update without any code changes on the template side. Anyone who clones and later runs npm update should verify the CopilotKit changelog beforehand, since the Intelligence API endpoint and Threads format could change between minor versions.
Editorial conclusion
OpenDots is the right starting point if you want a self-hosted AI agent workspace where each agent has browser and file access, and you plan to connect CopilotKit Intelligence for conversation threads. Skip it if you need a stable release, since the current version is 0.1.0 with alpha status and no tagged GitHub releases. Before deploying, set OWNER_TOKEN to at least 24 characters in the .env file, confirm that INTELLIGENCE_API_KEY resolves to a working endpoint, and decide whether to opt out of SDK telemetry with DO_NOT_TRACK=1.
Frequently asked questions
What is OpenDots?
OpenDots is a self-hosted TypeScript template for building an AI agent workspace where agents called Dots can have browser, terminal, and file access. It is a starting point you clone and adapt, not a hosted product.
How do I start OpenDots in development?
Run `npm run dev`, which starts the Node server and the Vite dev server concurrently. The frontend defaults to http://localhost:5173 in development. You need INTELLIGENCE_API_KEY and OWNER_TOKEN in the .env file before conversations will work.
What is CopilotKit Intelligence in OpenDots?
It is the conversation engine that OpenDots requires to run AI threads. Three access paths exist: the hosted CopilotKit service, a local Docker evaluation documented in docs/SETUP.md, or a licensed self-hosted deployment. Without it configured, the UI opens in setup state.
What environment variables are required to run OpenDots?
OWNER_TOKEN must be at least 24 characters and is required by compose.yml. INTELLIGENCE_API_KEY or CPK_INTELLIGENCE_API_KEY is needed for conversations. OPENAI_API_KEY, VOICE_API_KEY, and the Slack variables are optional and enable those respective features.
Does OpenDots support voice calls?
Yes. Voice pairs real-time speech with a compute agent that shares conversation context with the text interface. Voice needs a VOICE_API_KEY and VOICE_MODEL in the .env file; the call interface includes separate mute controls for microphone and speaker.
Official sources
Where developers are discussing it
Posts on Hacker News, dev.to and Lobsters that link to this repository, found by our scan of those communities. 1 in the last 30 days; newest first.
- OpenDotsHacker News · Oct 2, 2026 · 2 points · 0 comments
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/copilotkit-opendots)