The project's README from github.com/CopilotKit/OpenBot. As one markdown file: README.md.
AI coworkers you can hand real work to, and actually trust with the access. Each gets a computer of its own: a real browser with its own logins, its own files, and only the tools you grant. Every action decided before it happens and recorded after.
copilotkit.ai/openbot · Quick start · Features · Bring your own agent · Architecture · Docs
https://github.com/user-attachments/assets/535ef7ee-1631-4a69-b839-564c56cf90b4
Bring any AG-UI agent, written on a framework or by hand, and it arrives as a coworker with a channel of its own. Watch it work on its own screen, take the wheel when it reaches something it should not do alone, then hand it back. It answers with components rather than only prose, and the whole thing runs on your own machine.
A template, not a product. OpenBot is meant to be cloned and made your own. There is no hosted version to sign up for, and nothing here is published as a package to depend on: every workspace in this repository is private. You take the repository, replace the example tenant package under
examples/with your own coworkers, channels and skills, and run it. Everything below describes a starting point, not a finished thing somebody operates for you.
Alpha, and under active development. OpenBot is early. Expect rough edges and bugs, and expect things to move. Issues and pull requests are welcome.
Runs on your machine. Everything below is written for a laptop.
.env.examplecarriesOPENBOT_SINGLE_USER=true, which admits every request as one administrator, so a fresh clone reaches the product without registering an OAuth client first. Sign-in turns that off, and is required before anybody else can reach the deployment.
An agent platform that runs inside your own infrastructure. Docker Compose brings up every part of it, the data sits in your PostgreSQL, and the model is yours to choose: no model ships in the box, and an administrator supplies the credential, which is encrypted at rest and never logged.
Three coworkers ship in the example package, and they are configuration rather than code: General Assistant for everyday work, Knowledge for company questions, Risk Analyst for risk and compliance. Add your own by editing agents.yaml or from /agents in the UI.
Anything a Bot does to a computer, a file, an MCP server or a component goes through one gateway that decides and records it. That is the difference between an agent that can use your tools and an agent you can let near them.
More at copilotkit.ai/openbot.
A Bot is any endpoint speaking AG-UI, the open protocol for agent-to-user interaction, so OpenBot is not tied to a framework and neither are you. Agents built with LangGraph, Mastra, CrewAI, Pydantic AI, Google ADK or written by hand all arrive the same way, and the governance rides the protocol rather than the framework.
Setting up with an AI assistant? Paste
prompt.txtinto it first. It carries the same steps as below plus the things that are easy to get wrong: which of the ten blank keys in.env.exampleare actually yours to fill (three), which the start script generates for you, and what each start-up refusal means. Every claim in it is checked against this repository.
Create .env:
cp .env.example .env
Get CopilotKit Intelligence credentials:
npx --yes copilotkit@latest login
npx --yes copilotkit@latest project select
Put the cpk-... runtime key from project select in .env as
INTELLIGENCE_API_KEY. That is the only Intelligence credential you need:
managed Intelligence derives entitlement from the project key, so there is
no separate licence token to fetch.
Fill the remaining required values:
OPENAI_API_KEYKeep the managed Intelligence URLs from .env.example unless you run Intelligence yourself. The example KEY_ENCRYPTION_KEY is public and fine locally; generate your own with:
openssl rand -base64 32
Install and run:
bun install
bash scripts/start.sh
Open http://localhost:3010.
scripts/start.sh starts Docker services, applies migrations, starts the API server on port 3001, starts the app on port 3010, and checks that the services answer their own health routes before printing next steps.
scripts/stop.sh takes the same things down, including each Bot's computer, which compose does not own. Nothing is deleted: the database, the Bots' files and their browser profiles are volumes.
One image carries the app, the API, the browser the Bots drive, and optionally PostgreSQL. Same
.env, no Kubernetes.
docker build -t openbot .
docker run -p 3001:3001 --env-file .env \
-e EMBEDDED_POSTGRES=on -v openbot-data:/var/lib/postgresql openbot
Leave EMBEDDED_POSTGRES off and set DATABASE_URL to point at a database you already run.
docs/deployment.md has the minimum sizes, the platform notes, and how it behaves behind more than one replica.
/bot and ask: Open news.ycombinator.com and tell me the top story./admin/audit./admin/boundaries, add a deny rule or preset, and retry the same browser action./agents, give it a standing role, and start a channel with it.| Route | Purpose |
|---|---|
/ |
Start and browse channels. |
/agents |
Create, edit, duplicate, hide, delete, and launch coworkers. |
/channel/:id |
Converse with one coworker, watch its screen, and see what it ran. |
/bot |
Direct chat with a Bot; ?agent=<id> selects one. |
/skills |
Create and enable personal skills. |
/settings |
User preferences. |
/admin/credentials |
Store write-only encrypted credentials. |
/admin/computers |
View, stop, and reset Bot computers. |
/admin/boundaries |
Configure browser/file/MCP action policy. |
/admin/components |
Publish components and govern which Bots may use them. |
/admin/playground |
Draft and publish sandboxed components in the browser. |
/admin/plugins |
Configure MCP servers, MCP grants, and deployment skills. |
/admin/audit |
Review permitted, refused, and failed actions. |
/workspace volume and its own browser profile. Set COMPUTER_RUNTIME=runsc to run them under gVisor where the host supports it.tool.name, intent, bot.id, actor.id, page.url, page.host, element.*, key, file.* and mcp.*. Deny is evaluated before allow, a missing policy permits nothing, and a broken rule refuses rather than opens.computer.help_requested, computer.control_taken and computer.control_released. While a person is driving, Bot actions are refused rather than queued.app/src/components/gallery/, sandboxed ones are authored in /admin/playground and published with no deployment. Every call asks the server whether the component exists, is published, and is not withheld from that Bot. Data functions are granted per component./ in the composer. A Bot granted the shipped skill-creator skill can write one with you in the conversation, and saves it only when you press the button on the card./admin/people lists everybody who has signed in, promotes and demotes them, and removes access, which ends the session they are using and stops the next sign-in. Every change is on the audit trail./admin/audit lists what was permitted, what was refused and what failed, and every refusal carries the rule that caused it./admin/credentials, never returned by an API, and redacted from audit events.127.0.0.1 and require a per-container token, so nothing reaches a logged-in browser by knowing its port. The supervisor binds there too, because it holds the Docker socket and its token is a shared secret rather than a network boundary.Any AG-UI endpoint can be a Bot.
From /agents, create a coworker with:
The server validates agent endpoints with the same target checks used for browser navigation, at registration and again on every redirect the endpoint answers with. If no custom endpoint is set, product-created coworkers use MANAGED_AGENT_AG_UI_URL when it is configured, and are refused when it is not.
A private address is refused unless it is listed in AGENT_ENDPOINT_ALLOWED_HOSTS:
AGENT_ENDPOINT_ALLOWED_HOSTS=agents.internal,10.0.0.42:9000
A host on its own covers any port on that host; a host with a port pins that port. Matching is exact: no wildcards, no suffixes. An entry written as a URL, or containing *, stops startup and names that entry.
The list covers agent endpoints only. Browsing is unaffected, the addresses holding a deployment's own cloud credentials are refused whatever is listed, and listing an address permits registering an agent there rather than granting that agent anything.
Tenant package agents are declared in agents.yaml as either:
built-in, with a system prompt; orremote-ag-ui, with an endpoint.See docs/configuration.md and docs/coworkers.md.
.env.example is the source template. The API server refuses to start without:
DATABASE_URLKEY_ENCRYPTION_KEYINTELLIGENCE_API_URLINTELLIGENCE_GATEWAY_WS_URLINTELLIGENCE_API_KEYCOPILOTKIT_LICENSE_TOKEN is optional. A self-hosted Intelligence with its own
licence can still set it and it is forwarded to the runtime; managed Intelligence
does not issue one and startup no longer asks for it.
Settings worth knowing:
| Variable | Use |
|---|---|
OPENBOT_SINGLE_USER |
Admits every request as one administrator. Required when no identity provider is configured; .env.example ships it on. |
OPENAI_BASE_URL |
Answers the OpenAI-shaped calls from somewhere else: a gateway, a proxy. |
ANTHROPIC_BASE_URL, GOOGLE_GENERATIVE_AI_BASE_URL |
The same, for those two APIs. |
COMPUTER_TOKEN |
Secret every Bot computer request must present. start.sh sets one. |
SUPERVISOR_TOKEN |
Secret the supervisor requires. start.sh sets one. |
AGENT_TOOL_TOKEN |
Secret a Bot presents to call a granted tool back. start.sh sets one. Without it no Bot may call tools. |
COMPUTER_SUPERVISOR_URL |
Gives each Bot a computer of its own instead of one shared computer. |
COMPUTER_RUNTIME |
Set to runsc to run computers under gVisor, where the host has it. |
COMPUTER_SANDBOX |
Set to on for Chromium's own sandbox, where the host permits it. |
EMBEDDED_POSTGRES |
Set to on for a database inside the deployment container. |
AGENT_COMPUTER_POLICY |
JSON action policy. Malformed JSON stops server startup. |
AGENT_COMPUTER_ALLOW_PRIVATE_HOSTS |
Lets a Bot reach this machine's own services. Local only, and refused under NODE_ENV=production. |
AGENT_ENDPOINT_ALLOWED_HOSTS |
Private addresses an agent may be registered at, comma separated. A host, optionally with a port. |
TENANT_PACKAGE_DIR |
Directory containing tenant YAML. Defaults to ../examples/fintech. |
DEPLOYMENT_ID |
Names this deployment when two share one Intelligence project. |
Full reference: docs/configuration.md.
| Service | Port | Purpose |
|---|---|---|
app |
3010 | React/Vite UI. |
server |
3001 | Hono API, CopilotKit runtime, auth, policy, audit, plugins, components, coworkers, and channels. |
agent-computer |
4100 | Chromium plus /workspace and browser profile. |
agent-bot |
4200 | Proof-of-concept AG-UI Bot. |
agent-langgraph |
4201 | LangGraph AG-UI Bot. |
supervisor |
4500 host / 4300 container | Creates and manages one computer per Bot. |
| PostgreSQL with pgvector | 5432 | Product data, policy, audit, credentials, grants, channels, and component metadata. |
| CopilotKit Intelligence | external | Durable threads and memory. |
The server gateway is the product/API path for Bot browser and file tool calls.
It resolves the target, evaluates policy, writes an audit row, and then calls
agent-computer. The computer also exposes lower-level token-protected service
endpoints; keep them private and do not use them to bypass the gateway.
More detail: docs/architecture.md.
.env.example ships OPENBOT_SINGLE_USER=true, which is one administrator and no sign-in: how a
fresh clone reaches the product without registering an OAuth client first. Delete that line and
configure any one of Google, Microsoft or Okta before anybody else can reach the deployment.
With neither, it refuses to start rather than admitting e