Open-source AI coworkers that each get a computer of their own: a browser, files and tools, with every action decided before it happens and recorded after. Bring any AG-UI agent.
4,724
stars
165
commits
TypeScript
primary language
Sep 11, 2026
updated
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.
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.
Create .env:
cp .env.example .env
Get CopilotKit Intelligence credentials:
npx --yes copilotkit@latest login
npx --yes copilotkit@latest project select
npx --yes copilotkit@latest license --write
Put the cpk-... runtime key from project select in .env as
INTELLIGENCE_API_KEY. license --write writes
COPILOTKIT_LICENSE_TOKEN into the existing .env.
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.
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/data 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./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_TOKENSettings 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 everybody as an administrator. Configure
more than one provider and the sign-in screen offers each of them.
These four are needed whichever you pick:
BETTER_AUTH_URL=http://localhost:3001 # where OAuth callbacks come back to
BETTER_AUTH_SECRET= # openssl rand -base64 32
TRUSTED_ORIGINS=http://localhost:3010 # where the app is served from
INITIAL_ADMIN_EMAILS=you@example.com # comma separated
Then the provider. Register the redirect URI shown beside it.
# Google — http://localhost:3001/api/auth/callback/google
GOOGLE_OAUTH_CLIENT_ID=
GOOGLE_OAUTH_CLIENT_SECRET=
# Microsoft — http://localhost:3001/api/auth/callback/microsoft
MICROSOFT_OAUTH_CLIENT_ID=
MICROSOFT_OAUTH_CLIENT_SECRET=
MICROSOFT_OAUTH_TENANT_ID=common # your directory GUID for staff only
# Okta — http://localhost:3001/api/auth/callback/okta
OKTA_OAUTH_CLIENT_ID=
OKTA_OAUTH_CLIENT_SECRET=
OKTA_OAUTH_ISSUER=https://example.okta.com/oauth2/default
Restart. Accounts, sessions and roles are stored in the same PostgreSQL database as everything else.
A company's own SAML or OpenID Connect provider is registered while the deployment runs, under
Admin → Identity providers, and routed by email domain. An OIDC registration needs every host in the
provider's discovery document listed in TRUSTED_ORIGINS, not only the issuer.
INITIAL_ADMIN_EMAILS is required, because nothing else grants the administrator role and no
screen can promote somebody afterwards. It is re-read on every sign-in, so editing it takes effect
the next time that person signs in.MICROSOFT_OAUTH_TENANT_ID defaults to common, which admits personal Microsoft accounts as well
as work ones. On a multi-tenant app registration Entra may send no email claim at all, so
OpenBot falls back to upn and then preferred_username. If none of the three arrives the
sign-in is refused and the reason is logged: add email as an optional claim, or use your
directory GUID here.http:// on anything but
localhost is not a secure context, and sign-in cookies want Secure.agent-computer drives a browser holding real logins. docker-compose.yml binds it to loopback; leave it there./admin/credentials, which encrypts them. Do not put credential values in tenant YAML or in committed files.AGENT_COMPUTER_ALLOW_PRIVATE_HOSTS lets a Bot reach services on this machine. It ships commented out in .env.example, is for a laptop only, and a deployment running with NODE_ENV=production refuses to start while it is set.AGENT_ENDPOINT_ALLOWED_HOSTS instead. That permits the one address, where the switch above permits the network.bun run format:check
bun run lint
bun run typecheck
bun run test
bun run build
After changing the Drizzle schema:
bun run --filter server db:generate
bun run --filter server db:migrate
Use bash scripts/start.sh for the whole stack. Use bun run dev only when you want the app and server without the Docker Bots and computers.
MIT © CopilotKit
TypeScript
97.8%
Open-source AI coworkers that each get a computer of their own: a browser, files and tools, with every action decided before it happens and recorded after. Bring any AG-UI agent.
4,724
stars
165
commits
TypeScript
primary language
Sep 11, 2026
updated
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.
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.
Create .env:
cp .env.example .env
Get CopilotKit Intelligence credentials:
npx --yes copilotkit@latest login
npx --yes copilotkit@latest project select
npx --yes copilotkit@latest license --write
Put the cpk-... runtime key from project select in .env as
INTELLIGENCE_API_KEY. license --write writes
COPILOTKIT_LICENSE_TOKEN into the existing .env.
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.
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/data 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./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_TOKENSettings 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 everybody as an administrator. Configure
more than one provider and the sign-in screen offers each of them.
These four are needed whichever you pick:
BETTER_AUTH_URL=http://localhost:3001 # where OAuth callbacks come back to
BETTER_AUTH_SECRET= # openssl rand -base64 32
TRUSTED_ORIGINS=http://localhost:3010 # where the app is served from
INITIAL_ADMIN_EMAILS=you@example.com # comma separated
Then the provider. Register the redirect URI shown beside it.
# Google — http://localhost:3001/api/auth/callback/google
GOOGLE_OAUTH_CLIENT_ID=
GOOGLE_OAUTH_CLIENT_SECRET=
# Microsoft — http://localhost:3001/api/auth/callback/microsoft
MICROSOFT_OAUTH_CLIENT_ID=
MICROSOFT_OAUTH_CLIENT_SECRET=
MICROSOFT_OAUTH_TENANT_ID=common # your directory GUID for staff only
# Okta — http://localhost:3001/api/auth/callback/okta
OKTA_OAUTH_CLIENT_ID=
OKTA_OAUTH_CLIENT_SECRET=
OKTA_OAUTH_ISSUER=https://example.okta.com/oauth2/default
Restart. Accounts, sessions and roles are stored in the same PostgreSQL database as everything else.
A company's own SAML or OpenID Connect provider is registered while the deployment runs, under
Admin → Identity providers, and routed by email domain. An OIDC registration needs every host in the
provider's discovery document listed in TRUSTED_ORIGINS, not only the issuer.
INITIAL_ADMIN_EMAILS is required, because nothing else grants the administrator role and no
screen can promote somebody afterwards. It is re-read on every sign-in, so editing it takes effect
the next time that person signs in.MICROSOFT_OAUTH_TENANT_ID defaults to common, which admits personal Microsoft accounts as well
as work ones. On a multi-tenant app registration Entra may send no email claim at all, so
OpenBot falls back to upn and then preferred_username. If none of the three arrives the
sign-in is refused and the reason is logged: add email as an optional claim, or use your
directory GUID here.http:// on anything but
localhost is not a secure context, and sign-in cookies want Secure.agent-computer drives a browser holding real logins. docker-compose.yml binds it to loopback; leave it there./admin/credentials, which encrypts them. Do not put credential values in tenant YAML or in committed files.AGENT_COMPUTER_ALLOW_PRIVATE_HOSTS lets a Bot reach services on this machine. It ships commented out in .env.example, is for a laptop only, and a deployment running with NODE_ENV=production refuses to start while it is set.AGENT_ENDPOINT_ALLOWED_HOSTS instead. That permits the one address, where the switch above permits the network.bun run format:check
bun run lint
bun run typecheck
bun run test
bun run build
After changing the Drizzle schema:
bun run --filter server db:generate
bun run --filter server db:migrate
Use bash scripts/start.sh for the whole stack. Use bun run dev only when you want the app and server without the Docker Bots and computers.
MIT © CopilotKit
TypeScript
97.8%