CopilotKit/OpenBotPublic

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.

AI summary: Open-source AI coworkers that each get a computer of their own: a browser, files and tools, with every action decided be

Stars
7.8K
Forks
1K
Watchers
30
Open issues
24
Open PRs
21
Contributors
~46
Commits
587
Branches
21

TypeScriptMITCreated Aug 17, 2026Last push todayLatest release v0.2.0

Quick answers

What is OpenBot?
Open-source AI coworkers that each get a computer of their own: a browser, files and tools, with every action decided be
What does OpenBot do?
CopilotKit/OpenBot is an open-source project written primarily in TypeScript, published under the MIT license. 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.
How do I get started with OpenBot?
Visit the repository README on GitHub for installation and usage instructions.
How popular is OpenBot on GitHub?
CopilotKit/OpenBot has 7,757 stars and 1,030 forks on GitHub.
What license does OpenBot use?
CopilotKit/OpenBot is released under the MIT license.

Star history

since Oct 29, 2026

Star history is still being collected for this repository.

Contribution activity

commits per day, last 52 weeks
NovDecJanFebMarAprMayJunJulAugSepOctMonWedFri2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 0 commits2026-07-02: 0 commits2026-07-03: 0 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 0 commits2026-07-08: 0 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 0 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 0 commits2026-08-10: 0 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 1 commit2026-08-15: 0 commits2026-08-16: 1 commit2026-08-17: 0 commits2026-08-18: 2 commits2026-08-19: 6 commits2026-08-20: 18 commits2026-08-21: 46 commits2026-08-22: 32 commits2026-08-23: 11 commits2026-08-24: 14 commits2026-08-25: 3 commits2026-08-26: 17 commits2026-08-27: 6 commits2026-08-28: 8 commits2026-08-29: 0 commits2026-08-30: 0 commits2026-08-31: 1 commit2026-09-01: 15 commits2026-09-02: 3 commits2026-09-03: 5 commits2026-09-04: 22 commits2026-09-05: 18 commits2026-09-06: 14 commits2026-09-07: 7 commits2026-09-08: 14 commits2026-09-09: 9 commits2026-09-10: 10 commits2026-09-11: 19 commits2026-09-12: 6 commits2026-09-13: 18 commits2026-09-14: 12 commits2026-09-15: 23 commits2026-09-16: 14 commits2026-09-17: 9 commits2026-09-18: 11 commits2026-09-19: 11 commits2026-09-20: 7 commits2026-09-21: 9 commits2026-09-22: 0 commits2026-09-23: 1 commit2026-09-24: 0 commits2026-09-25: 0 commits2026-09-26: 5 commits2026-09-27: 3 commits2026-09-28: 10 commits2026-09-29: 7 commits2026-09-30: 4 commits2026-10-01: 4 commits2026-10-02: 21 commits2026-10-03: 21 commits2026-10-04: 0 commits2026-10-05: 5 commits2026-10-06: 5 commits2026-10-07: 9 commits2026-10-08: 2 commits2026-10-09: 2 commits2026-10-10: 0 commits2026-10-11: 2 commits2026-10-12: 10 commits2026-10-13: 6 commits2026-10-14: 2 commits2026-10-15: 1 commit2026-10-16: 3 commits2026-10-17: 0 commits2026-10-18: 0 commits2026-10-19: 2 commits2026-10-20: 6 commits2026-10-21: 4 commits2026-10-22: 3 commits2026-10-23: 1 commit2026-10-24: 0 commits2026-10-25: 1 commit2026-10-26: 2 commits2026-10-27: 8 commits2026-10-28: 13 commits2026-10-29: 1 commit2026-10-30: 0 commits2026-10-31: 0 commits
586 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Breakout launch

    7,757 stars in 73 days

  • Very active

    586 commits in 52 weeks

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

What OpenBot does

CopilotKit/OpenBot is an open-source project written primarily in TypeScript, published under the MIT license. 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.

Where teams use it

ag ui

Projects involving ag ui.

agent governance

Projects involving agent governance.

ai agents

Projects involving ai agents.

browser automation

Projects involving browser automation.

Getting started: Visit the repository README on GitHub for installation and usage instructions.

README

main branch

OpenBot

The AI assistant your company can actually own. Same shape as ChatGPT, Claude or Grok, with one difference that matters: it runs on your infrastructure and you can change anything about it. Any agent stack, through AG-UI.

Each coworker 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.

Talk to an engineer · Have us build it with you · copilotkit.ai/openbot · Quick start · Docs

CI security License: MIT Beta

Trendshift: #3 Repository Of The Day

demo-openbot.mp4

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.

Beta, 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.example carries OPENBOT_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.

We can build this for you, or with you, at your company. Our engineers will stand OpenBot up inside your infrastructure, customize it into something that looks like your own product, and hand it back to you to keep changing. Start the conversation.

In the meantime, run all of it on your laptop, Intelligence included: CopilotKit's free Developer plan covers running Intelligence locally in Docker on a Mac.

What it is

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.

A deployment starts with two coworkers, and they are configuration rather than code: General Assistant for everyday work and Knowledge for company questions. A Risk Analyst joins them once its endpoint is configured, and ten more wait in examples/fintech/catalog/, each doing one job — reading an expense claim against the policy as written, turning a meeting note into the follow-ups actually in it, drafting release notes from what shipped, triaging a ticket, answering a new starter from the handbook, writing a brief that names what it could not find, writing up an interview, handing an on-call shift over, assembling what is known before a renewal, and grouping customer feedback into themes it can cite. Copy one into examples/fintech/agents/ to add it, write your own there or in agents.yaml, or make one from /bots 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.

Built on AG-UI

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.

You talk to the server, which sends the turn to a Bot over AG-UI. Every tool call the Bot makes comes back through the gateway, which resolves the target, decides it against your policy, records an audit row, and only then acts, or refuses and names the rule. Allowed browser and file actions reach that Bot's own computer, one container each with its own Chromium, logins and workspace, built by the supervisor. Decisions land in PostgreSQL and threads in CopilotKit Intelligence.

Requirements

  • Docker, for PostgreSQL and the shipped Bots.
  • Bun 1.4+, for the app, the API server and the tests (some tests fail on 1.3).
  • A CopilotKit Intelligence project and license. A free plan is available, and Intelligence can be self-hosted.
  • A model key. The proof-of-concept Bot uses OpenAI; the LangGraph Bot can use OpenAI, Anthropic, or Google.

Quick start

Setting up with an AI assistant? Paste prompt.txt into it first. It carries the same steps as below plus the things that are easy to get wrong: which of the blank keys in .env.example are actually yours to fill (the CopilotKit key and a model key), which the start script fills for you, and what each start-up refusal means. Every claim in it is checked against this repository.

  1. Create .env:

    cp .env.example .env
    bun install
  2. Connect a fresh managed Intelligence project:

    npx --yes copilotkit@latest login
    npx --yes copilotkit@latest project select
    bun scripts/setup-learning.ts

    The helper provisions the selected project's runtime key, creates or reuses its openbot Learning container, then writes both settings to .env. It preserves custom container assignments and never replaces an existing OpenBot key; with one set, it only creates openbot in that key's project if it is missing. For fresh self-hosted setup, set INTELLIGENCE_API_URL to that deployment's HTTPS API origin (or http://localhost for a local one) and run the helper without the two npx commands. It opens an isolated Chrome or Edge window for your usual sign-in and project choice; install either browser first. For CLI-managed local evaluation installs, it discovers the matching dashboard with the newest installed or cached CopilotKit CLI and uses that dashboard for login and session requests. Discovery runs offline with Bun, without downloading the CLI or requiring npx on your PATH. If no CLI is available, manually hosted deployments use their API origin for sign-in. Complete the local auth approval shown in the browser when prompted. The runtime API URL stays unchanged. It writes the API URL, the key and the container, not INTELLIGENCE_GATEWAY_WS_URL, so set that one to the same deployment yourself. Once openbot exists, the server assigns it as the default by itself unless Admin → Automatic Learning has a saved setting. Managed Intelligence needs no separate licence token.

  3. Fill the remaining required values:

    • OPENAI_API_KEY

    Keep 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
  4. Run:

    bash scripts/start.sh
  5. Open http://localhost:3010.

scripts/start.sh starts Docker services, applies migrations, starts the API server on port 3001, starts the routine worker, 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; --keep-computers leaves the computers running. Nothing is deleted: the database, the Bots' files and their browser profiles are volumes.

Intelligence on your own machine

To try Intelligence on one Mac instead of the managed service, follow Evaluate Intelligence locally. The free Developer plan qualifies. The local licence lasts 30 days and npx copilotkit@latest local renew renews it as often as you need, while your account is in good standing. It is a preview for macOS with Docker Desktop, not a production installation. Run its npx copilotkit@latest local connect from the OpenBot root, where .env is.

That command writes INTELLIGENCE_API_URL, INTELLIGENCE_GATEWAY_WS_URL and CPK_INTELLIGENCE_API_KEY to .env. OpenBot reads those settings directly; no key copying or renaming is needed. INTELLIGENCE_API_KEY remains supported for older configurations. When both are set, the non-empty CLI key takes precedence so reconnecting uses the new project's key.

To give the Bots a Learning container on that stack, see Automatic Learning.

Deploy it

One image carries the app, the API, the browser the Bots drive, and optionally PostgreSQL. Same .env, no Kubernetes.

# The published image. Nothing to clone and nothing to build.
docker run -p 3001:3001 --env-file .env \
  -e EMBEDDED_POSTGRES=on -v openbot-data:/var/lib/postgresql \
  ghcr.io/copilotkit/openbot:latest

# Or the tree you have in front of you.
docker build -t openbot .
docker run -p 3001:3001 --env-file .env \
  -e EMBEDDED_POSTGRES=on -v openbot-data:/var/lib/postgresql openbot

Everything is on 3001 here, the app included, rather than the 3010 the clone uses. latest is the most recent release and a version tag such as :v0.0.9 pins one.

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.

Try it

  • Open /bot and ask: Open news.ycombinator.com and tell me the top story.
  • Ask the Bot to fill out https://httpbin.org/forms/post, then inspect /admin/audit.
  • Open /admin/boundaries, add a deny rule or preset, and retry the same browser action.
  • Create a Bot from /bots, give it a standing role, and start a channel with it.

Main surfaces

Route Purpose
/ Start and browse channels.
/channel/new Start a conversation; two or more Bots in To: start a group.
/channel/:id Converse with one coworker, watch its screen, and see what it ran.
/bot Direct chat with a Bot; ?agent=<id> selects one.
/bots Every Bot you can reach; create one, and open its page to change it.
/bots/:id One Bot: what it waits on you for, what it is doing, and how it is set up.
/bots/:id/responsibilities Give the Bot a lasting goal, follow its progress, and decide when it should work.
/bots/:id/reach Continue a conversation with the Bot in Slack, Microsoft Teams, or by text message.
/bots/:id/memory Which connected apps feed the Bot facts, and its background research.
/bots/:id/approvals What the Bot may do without asking you first.
/connections Connect your apps so your Bots can work with them.
/capabilities/skills Create and enable personal skills.
/capabilities/memory What your Bots remember about you, and facts you tell them.
/routines See the routines that are standing, and stop one.
/settings User preferences.
/settings/passwords Logins you saved when signing a Bot in to a website.
/settings/notifications Where updates go, your devices, and recent deliveries.
/settings/approvals Whether your Bots ask before acting, and rules for every Bot.
/admin/credentials Store write-only encrypted credentials.
/admin/approvals Team approval settings, team rules, and shared account requests.
/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 and grant their tools to Bots.
/admin/skills Write deployment skills and grant them to Bots.
/admin/learning Assign Learning containers to Bots, or pause Automatic Learning.
/admin/people List, promote, demote, and remove people who have signed in.
/admin/identity-providers Register a company SAML or OIDC provider, routed by email domain.
/admin/enterprise What members may use, how Bot computers reach the network, and what is recorded about it.
/admin/audit Review permitted, refused, and failed actions.

Features

  • A computer per Bot: the supervisor gives each Bot its own container, its own /workspace volume and its own browser profile. Set COMPUTER_RUNTIME=runsc to run them under gVisor where the host supports it.
  • A shell, not just a browser: a Bot can run a command in its workspace, install what it needs, and process a file it saved. Through the same gate as everything else, so a rule can refuse a shell outright or refuse particular commands, and the command is on the record either way. The command inherits PATH, locale, terminal and proxy variables, not the rest of the deployment's environment.
  • The gateway is the only way in: it resolves the target from a server-held snapshot, evaluates the policy, writes the audit row, and only then calls the computer. There is no path that acts without the record existing first.
  • CEL policy, fail closed: rules can inspect tool.name, intent, bot.id, actor.id, page.url, page.host, element.*, key, command, file.*, mcp.* and initiator.* (what started the run, so a rule can refuse a scheduled routine what it would allow a person). Deny is evaluated before allow, a missing policy permits nothing, and a broken rule refuses rather than opens.
  • Watch what it is doing: the screen shows what a Bot is looking at, and the Activity tab beside it shows what it ran, read and saved, with the output. A command line in the transcript opens to the same thing. A saved file shows its path and size, never its contents.
  • Take the wheel: a Bot that hits a login wall or a 2FA prompt asks for help. Control is handed over in the same panel and recorded as computer.help_requested, computer.control_taken and computer.control_released. While a person is driving, Bot actions are refused rather than queued.
  • Secrets never enter the transcript: the trail records that a secret was requested and how long it was, not what it said.
  • Bring your own agent: any AG-UI endpoint is a Bot, on a framework or hand-written. Endpoints are validated with the same target checks used for browser navigation, and an auth header is stored write-only.
  • Components instead of prose: compiled React components live in 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.
  • Governed MCP: Google Drive, Notion and the public-web research providers Parallel, Exa and Firecrawl ship in the catalogue, and Composio brokers a few hundred more apps behind one account, each reached as the person asking. The catalogue carries only vendors this deployment stands behind, so adding one is a review of that vendor. Custom servers must pass URL checks; unknown tools and custom-server tools are treated as writes, and a catalogue tool the server advertises but does not name as a write classifies as a read. A Bot is told which connectors exist here and which it holds, so it says it has not been granted one rather than browsing to the vendor's website.
  • Skills are instructions, not capabilities: personal skills attach only to Bots their author owns, deployment skills are admin-owned, and both are invoked with / 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.
  • Sign in with what your company already has: Google, Microsoft or Okta from the environment, or a company's own SAML or OpenID Connect provider registered while the deployment runs and routed by email domain. Any one turns sign-in on; several may be configured at once.
  • Decide who gets in: /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.
  • An audit trail you can read: /admin/audit lists what was permitted, what was refused and what failed, and every refusal carries the rule that caused it.
  • Credentials encrypted at rest: stored through /admin/credentials, never returned by an API, and redacted from audit events.
  • Loopback by default: computers bind to 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.
  • Durable threads and memory: conversations survive restarts through CopilotKit Intelligence, and each deployment stamps the threads it owns.
  • Routines: ask a Bot to do something on a schedule and it does, running as you, in the channel you asked in. A 15-minute floor and a cap of 20 enabled routines keep a sentence from scheduling more than a person meant, and ten failures in a row switch a routine off rather than burn model spend forever. Needs a worker process, which scripts/start.sh starts locally; see docs/routines.md.

Bring your own agent

Any AG-UI endpoint can be a Bot.

From /bots, create a Bot with:

  • name, title, and role description;
  • private or public visibility;
  • optional AG-UI endpoint;
  • optional write-only authorization header.

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 the package's own agents.yaml, in the directory TENANT_PACKAGE_DIR names (examples/fintech by default), or each in a file of its own under that package's agents/ directory, as either:

  • built-in, with a system prompt; or
  • remote-ag-ui, with an endpoint.

See docs/configuration.md and docs/coworkers.md.

Configuration

.env.example is the source template. The API server refuses to start without:

  • DATABASE_URL
  • KEY_ENCRYPTION_KEY
  • INTELLIGENCE_API_URL
  • INTELLIGENCE_GATEWAY_WS_URL
  • INTELLIGENCE_API_KEY

COPILOTKIT_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. A self-hosted Intelligence also needs the licence on its own deployment, or it refuses memory; OpenBot logs intelligence-entitlement-not-ready at boot when that is missing.

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 falls back to a fixed dev value.
SUPERVISOR_TOKEN Secret the supervisor requires. start.sh falls back to a fixed dev value.
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.
OPENBOT_SELF_HOST_BANNER Set false to hide the bar offering CopilotKit's help self-hosting OpenBot. It never shows on a paid Intelligence plan.

Full reference: docs/configuration.md.

Architecture

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.
worker none Fires due routines by handing each run to the server.
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.

Sign in

.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
[email protected]         # 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 it is what grants the first administrator. After that /admin/people can promote others, but an address named here stays an administrator and cannot be demoted or removed from that screen. 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.
  • A half-configured provider is refused at start-up rather than at somebody's first attempt to sign in: a client id with no secret, a BETTER_AUTH_SECRET shorter than 32 characters, or an Okta issuer with no credentials behind it.
  • SAML and OIDC are registered while the deployment runs rather than configured here. Sign in as an administrator and go to Admin → Identity providers with the metadata your identity team gave you. People then sign in by typing their email address, and the domain decides which provider they are sent to.
  • Put TLS in front of any deployment. A page served over plain http:// on anything but localhost is not a secure context, and sign-in cookies want Secure.

Organization sign-in for desktop installations

For an employee desktop, provision an OpenBot authority using the Google, Microsoft or Okta settings above (your Kubernetes OpenBot can serve this role). Set Organization OpenBot URL in the desktop connection screen, or OPENBOT_ORGANIZATION_AUTH_URL=https://openbot.company.example in its public configuration. Use an HTTPS origin; HTTP is accepted only on loopback for local tests. Provider client secrets stay on that authority. Template and white-label deployments can supply the same setting without changing their Intelligence endpoint.

This optional URL is separate from INTELLIGENCE_API_URL, INTELLIGENCE_GATEWAY_WS_URL and INTELLIGENCE_API_KEY. Local, managed and customer-hosted Intelligence all retain their project credential. A Google ID token is not an Intelligence project key. Leave the organization URL empty for a standalone desktop.

Desktop sign-in uses the system browser and Better Auth's single-use PKCE exchange. The authority verifies the employee and current role; organization mode never substitutes [email protected]. Employees do not need project-key administration privileges. Installation happens once: reopening or refreshing an expired organization, Intelligence or model connection preserves the installed runtime and data and opens the relevant connection screen.

Keeping it to your machine

  • agent-computer drives a browser holding real logins. docker-compose.yml binds it to loopback; leave it there.
  • Store credentials through /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.
  • To reach an agent on your own network from a deployment, list its address in AGENT_ENDPOINT_ALLOWED_HOSTS instead. That permits the one address, where the switch above permits the network.

Development

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 and bash scripts/stop.sh to take it down. Use bun run dev only when you want the app and server without the Docker Bots and computers.

Documentation

Contributing

  • Open an issue or coordinate before starting substantial work.
  • Keep changes focused and update docs when setup, configuration, architecture, or user behavior changes.
  • Keep secrets, service-account JSON, customer data, and local transcripts out of the repository.
  • Run the checks in Development before opening a pull request.

License

MIT © CopilotKit

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

19 total
  1. v0.2.0v0.2.0Oct 12, 2026357 downloads

    **Before upgrading.** Two things change for an existing deployment: - Migration `0052_shared_brokered_accounts` copies every Composio connection into a new `brokered_connections` table and leaves `composio_connections` in place, unwritten. Rolling back to 0.1.2 works, but accounts connected after the upgrade are invisible to it. - A handoff now records what started the run it came from. Older remote Bots' signed runs carry no such record for up to ten minutes after the upgrade, and calls they make to a Shared app in that window are refused. ### The desktop asks before every command that can edit a folder When a Bot runs a command in a folder shared from the desktop app, the person sees a prompt that can offer "Always allow in this folder". That choice now covers commands that only read the folder. A command that can change or delete files in it shows the prompt every time, without the "Always allow" option. Folders already set to "Always allow" work as before for read-only commands. ### One Bots list, and one page per Bot Agents, Team Bots and Bots were three lists of the same Bots. `/bots` is now the only one — pinned, yours, shared with you, and the ones you hid — wi

  2. v0.1.2v0.1.2Oct 7, 202681 downloads

    ### CopilotKit 1.77 and AG-UI 1.0 OpenBot now runs on CopilotKit 1.77.0 (`@copilotkit/runtime`, `react-core` and `a2ui-renderer`, from 1.73.1), which carries the Intelligence client, and on AG-UI 1.0 (`@ag-ui/core` and `@ag-ui/client` 1.0.1, from 0.0.59). A managed Intelligence project needs nothing changed; it is the client in the server that moved. Among what comes with it: thread naming falls back to the first message, the realtime connection keeps its place across a repeated checkpoint, an interrupt resume gets a run id of its own, and generated A2UI controls no longer submit the page's own forms. Bots served from their own endpoint keep working as they are. AG-UI 1.0 still accepts the earlier event shapes, so `agent-bot`, `agent-langgraph` and the Python Bots were not changed. A tool result's `error` field is gone from the `TOOL_CALL_RESULT` event, because AG-UI 1.0 does not define one. The refusal is still in the result's text and on the tool message, which is where a Bot's next turn reads it.

  3. v0.1.1v0.1.1Oct 6, 202613 downloads

    - A password given to `curl` as `-uuser:password`, `--user=user:password` or `-u "user:pass word"` is now redacted in a Bot's recorded shell command. Only `-u user:password` with a space and no quotes was recognised, so the other spellings kept the password in the command that was stored or exported. - A password, token or API key sent as a JSON field in a shell command is now redacted before the command is kept or exported. `curl -d '{"password":"x"}'` was recorded with the secret in clear, because only `NAME=value` and `--name value` forms were recognised and a quoted JSON key was neither. The key is still shown, so the command reads the same. - A Bot's browser is now refused names under `.localhost`, such as `http://admin.localhost:5432`, the same as bare `localhost`. The whole `.localhost` zone is loopback and Chromium resolves it without DNS, but only the exact name `localhost` was on the refused list, so a deployment that had not opted into private hosts could still be pointed at its own services this way. - `OPENBOT_SINGLE_USER` is now refused with a public name that starts with `127.`, such as `https://127.example.com` or `https://127.0.0.1.nip.io`. The

  4. v0.1.0v0.1.0Oct 3, 202661 downloads

    **Before upgrading.** Six things change for an existing deployment: - Automatic Learning is on unless an administrator saved it off. It does nothing until a Learning container is assigned; see below. - A Bot's computer refuses the network until the server pushes its policy. A computer run without an API server can set `EGRESS_POLICY_REQUIRED=0` for the old behaviour. - The upgrade runs migrations `0042_user_preferences`, `0043_plugin_logos`, `0044_voice_sessions`, `0045_channel_activity_source`, `0046_automatic_learning`, `0047_agent_pinning`, `0048_coworker_parity`, `0049_coworker_parity_lanes`, `0050_review_fixes` and `0051_routine_enabled_at`. - An existing Windows clone checks text files out with LF only after `git rm -r --cached . && git reset --hard` on a clean tree. - The signed-in app shows a bar offering CopilotKit's help self-hosting OpenBot, unless the deployment is on a paid Intelligence plan. Set `OPENBOT_SELF_HOST_BANNER=false` to remove it for everybody. - An egress rule with a malformed IP range, such as `10.0.0.5/`, used to be read as `/0` and allow every IPv4 address. It is now refused, and a saved network policy that contains one is refused as

  5. v0.0.15v0.0.15Sep 22, 2026268 downloads

    ### A model provider's own sign-in can stand in for an API key `OPENBOT_MODEL_OAUTH_FILE` names a credential file holding a Google or xAI OAuth grant. Set it and the server mounts `POST /api/model-provider/v1/chat/completions`, which answers an ordinary Chat Completions request using that grant, refreshing the access token 120 seconds before it expires and again on a provider 401, and persisting the rotation under a lock the writer and the desktop share. Leave it unset, which is every deployment that does not set it, and the route does not exist. The caller authenticates with a separate local bearer taken from that file, compared in constant time, never with the provider's own token: a refresh token never leaves the server process. The file itself is refused unless it is a regular file under 64KB owned readable by nobody else, and a Google grant must name a quota project. The upstream host, path and headers are fixed, so nothing a caller sends can redirect the request. Google is reached through its native generation API rather than a compatibility endpoint, with a translation layer that carries streaming, tool calls and their results, inline images and function-call thought sig

Code frequency

additions and deletions
+273.4K-273.4KWeek of 2026-08-09: +28,279 linesWeek of 2026-08-09: -0 linesWeek of 2026-08-16: +113,344 linesWeek of 2026-08-16: -15,152 linesWeek of 2026-08-23: +70,058 linesWeek of 2026-08-23: -3,968 linesWeek of 2026-08-30: +29,775 linesWeek of 2026-08-30: -1,934 linesWeek of 2026-09-06: +126,422 linesWeek of 2026-09-06: -3,497 linesWeek of 2026-09-13: +98,211 linesWeek of 2026-09-13: -2,742 linesWeek of 2026-09-20: +56,691 linesWeek of 2026-09-20: -3,784 linesWeek of 2026-09-27: +118,102 linesWeek of 2026-09-27: -1,419 linesWeek of 2026-10-04: +36,216 linesWeek of 2026-10-04: -8,593 linesWeek of 2026-10-11: +86,081 linesWeek of 2026-10-11: -21,270 linesWeek of 2026-10-18: +105,667 linesWeek of 2026-10-18: -6,498 linesWeek of 2026-10-25: +273,366 linesWeek of 2026-10-25: -9,895 linesAug 9, 2026Oct 25, 2026
+1.1M lines added, -78.8K removed over the last year.

Commits per week

last 52 weeks
1050Week of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 0 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 0 commitsWeek of 2026-05-03: 0 commitsWeek of 2026-05-10: 0 commitsWeek of 2026-05-17: 0 commitsWeek of 2026-05-24: 0 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 0 commitsWeek of 2026-06-14: 0 commitsWeek of 2026-06-21: 0 commitsWeek of 2026-06-28: 0 commitsWeek of 2026-07-05: 0 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 0 commitsWeek of 2026-07-26: 0 commitsWeek of 2026-08-02: 0 commitsWeek of 2026-08-09: 1 commitsWeek of 2026-08-16: 105 commitsWeek of 2026-08-23: 59 commitsWeek of 2026-08-30: 64 commitsWeek of 2026-09-06: 79 commitsWeek of 2026-09-13: 98 commitsWeek of 2026-09-20: 22 commitsWeek of 2026-09-27: 70 commitsWeek of 2026-10-04: 23 commitsWeek of 2026-10-11: 24 commitsWeek of 2026-10-18: 16 commitsWeek of 2026-10-25: 25 commitsNov 2, 2025Oct 25, 2026
586 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 0 commitsSun 1:00 — 2 commitsSun 2:00 — 0 commitsSun 3:00 — 4 commitsSun 4:00 — 2 commitsSun 5:00 — 0 commitsSun 6:00 — 1 commitsSun 7:00 — 2 commitsSun 8:00 — 1 commitsSun 9:00 — 0 commitsSun 10:00 — 4 commitsSun 11:00 — 1 commitsSun 12:00 — 3 commitsSun 13:00 — 1 commitsSun 14:00 — 1 commitsSun 15:00 — 3 commitsSun 16:00 — 1 commitsSun 17:00 — 4 commitsSun 18:00 — 3 commitsSun 19:00 — 3 commitsSun 20:00 — 7 commitsSun 21:00 — 11 commitsSun 22:00 — 3 commitsSun 23:00 — 0 commitsMon 0:00 — 1 commitsMon 1:00 — 7 commitsMon 2:00 — 0 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 1 commitsMon 6:00 — 0 commitsMon 7:00 — 3 commitsMon 8:00 — 2 commitsMon 9:00 — 6 commitsMon 10:00 — 3 commitsMon 11:00 — 6 commitsMon 12:00 — 5 commitsMon 13:00 — 2 commitsMon 14:00 — 3 commitsMon 15:00 — 1 commitsMon 16:00 — 2 commitsMon 17:00 — 1 commitsMon 18:00 — 3 commitsMon 19:00 — 9 commitsMon 20:00 — 3 commitsMon 21:00 — 3 commitsMon 22:00 — 6 commitsMon 23:00 — 6 commitsTue 0:00 — 1 commitsTue 1:00 — 7 commitsTue 2:00 — 1 commitsTue 3:00 — 1 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 6 commitsTue 7:00 — 10 commitsTue 8:00 — 1 commitsTue 9:00 — 2 commitsTue 10:00 — 6 commitsTue 11:00 — 5 commitsTue 12:00 — 2 commitsTue 13:00 — 6 commitsTue 14:00 — 3 commitsTue 15:00 — 7 commitsTue 16:00 — 2 commitsTue 17:00 — 1 commitsTue 18:00 — 4 commitsTue 19:00 — 4 commitsTue 20:00 — 3 commitsTue 21:00 — 2 commitsTue 22:00 — 8 commitsTue 23:00 — 7 commitsWed 0:00 — 8 commitsWed 1:00 — 6 commitsWed 2:00 — 3 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 0 commitsWed 7:00 — 0 commitsWed 8:00 — 12 commitsWed 9:00 — 5 commitsWed 10:00 — 8 commitsWed 11:00 — 6 commitsWed 12:00 — 3 commitsWed 13:00 — 0 commitsWed 14:00 — 7 commitsWed 15:00 — 5 commitsWed 16:00 — 1 commitsWed 17:00 — 3 commitsWed 18:00 — 2 commitsWed 19:00 — 2 commitsWed 20:00 — 6 commitsWed 21:00 — 3 commitsWed 22:00 — 2 commitsWed 23:00 — 0 commitsThu 0:00 — 1 commitsThu 1:00 — 7 commitsThu 2:00 — 6 commitsThu 3:00 — 1 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 0 commitsThu 7:00 — 6 commitsThu 8:00 — 2 commitsThu 9:00 — 7 commitsThu 10:00 — 2 commitsThu 11:00 — 2 commitsThu 12:00 — 5 commitsThu 13:00 — 1 commitsThu 14:00 — 1 commitsThu 15:00 — 4 commitsThu 16:00 — 1 commitsThu 17:00 — 3 commitsThu 18:00 — 3 commitsThu 19:00 — 0 commitsThu 20:00 — 2 commitsThu 21:00 — 4 commitsThu 22:00 — 1 commitsThu 23:00 — 0 commitsFri 0:00 — 4 commitsFri 1:00 — 11 commitsFri 2:00 — 0 commitsFri 3:00 — 1 commitsFri 4:00 — 6 commitsFri 5:00 — 1 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 3 commitsFri 9:00 — 8 commitsFri 10:00 — 5 commitsFri 11:00 — 8 commitsFri 12:00 — 7 commitsFri 13:00 — 6 commitsFri 14:00 — 6 commitsFri 15:00 — 3 commitsFri 16:00 — 7 commitsFri 17:00 — 9 commitsFri 18:00 — 7 commitsFri 19:00 — 5 commitsFri 20:00 — 7 commitsFri 21:00 — 18 commitsFri 22:00 — 7 commitsFri 23:00 — 5 commitsSat 0:00 — 12 commitsSat 1:00 — 11 commitsSat 2:00 — 17 commitsSat 3:00 — 2 commitsSat 4:00 — 0 commitsSat 5:00 — 1 commitsSat 6:00 — 1 commitsSat 7:00 — 1 commitsSat 8:00 — 1 commitsSat 9:00 — 7 commitsSat 10:00 — 5 commitsSat 11:00 — 6 commitsSat 12:00 — 6 commitsSat 13:00 — 4 commitsSat 14:00 — 2 commitsSat 15:00 — 1 commitsSat 16:00 — 2 commitsSat 17:00 — 3 commitsSat 18:00 — 0 commitsSat 19:00 — 1 commitsSat 20:00 — 0 commitsSat 21:00 — 1 commitsSat 22:00 — 9 commitsSat 23:00 — 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Oct 29, 2026daily#5+240
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    458.2K stars · TypeScript

  • morluto/rea

    Reverse engineer anything with agents, from app behavior down to native binaries.

    405.3K stars · TypeScript

  • openclaw/openclaw

    The AI that really does things. Any OS. Any Platform. The lobster way. 🦞

    393.3K stars · TypeScript

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    292.2K stars · JavaScript

  • NousResearch/hermes-agent

    The agent that grows with you

    258.3K stars · Python

  • anomalyco/opencode

    The open source coding agent.

    222.9K stars · TypeScript