{"id":50931549,"url":"https://github.com/twentytwohundred/2200","last_synced_at":"2026-06-17T05:01:14.724Z","repository":{"id":358984087,"uuid":"1221655305","full_name":"twentytwohundred/2200","owner":"twentytwohundred","description":"2200 — a platform for hosting your fleet of always-on Agents. Runtime kernel and project home.","archived":false,"fork":false,"pushed_at":"2026-06-12T12:32:25.000Z","size":3172,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T14:11:27.345Z","etag":null,"topics":["agent-platform","ai-agents","elastic-license","json-rpc","mcp","runtime","self-hosted","supervisor","typescript"],"latest_commit_sha":null,"homepage":"https://2200.ai","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twentytwohundred.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":"CLA.md"}},"created_at":"2026-04-26T14:08:02.000Z","updated_at":"2026-06-12T12:32:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/twentytwohundred/2200","commit_stats":null,"previous_names":["twentytwohundred/2200"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/twentytwohundred/2200","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twentytwohundred%2F2200","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twentytwohundred%2F2200/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twentytwohundred%2F2200/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twentytwohundred%2F2200/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twentytwohundred","download_url":"https://codeload.github.com/twentytwohundred/2200/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twentytwohundred%2F2200/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34417418,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-platform","ai-agents","elastic-license","json-rpc","mcp","runtime","self-hosted","supervisor","typescript"],"created_at":"2026-06-17T05:01:13.835Z","updated_at":"2026-06-17T05:01:14.715Z","avatar_url":"https://github.com/twentytwohundred.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![License: Elastic License v2](https://img.shields.io/badge/license-Elastic%20v2-0077B5.svg)](LICENSE)\n[![Status: Active build](https://img.shields.io/badge/status-active%20build-2EA44F.svg)](https://github.com/twentytwohundred/wiki/blob/main/03-epic-map.md)\n[![Tests: 1849 passing](https://img.shields.io/badge/tests-1849%20passing-2EA44F.svg)](.github/workflows/ci.yml)\n[![Wiki](https://img.shields.io/badge/wiki-knowledge%20base-0077B5.svg)](https://github.com/twentytwohundred/wiki)\n[![Built in public](https://img.shields.io/badge/built-in%20public-2EA44F.svg)](https://github.com/twentytwohundred/wiki/tree/main/handoffs/hobby)\n\n# 2200\n\n\u003e A platform for hosting your fleet of always-on Agents.\n\n2200 is the runtime where your Agents live. They check email, manage calendars, watch portfolios, write code, file invoices ... whatever you outfit them to do. They run continuously, ask you questions when blocked, and resume when you answer. Each Agent has its own Identity, its own memory, its own tools, its own SCUT cross-instance identity, and its own pub for talking to the other Agents on your box.\n\nThis is \"fleet operations, not chat.\"\n\nThis repository holds the runtime code. The full project knowledge base ... vision, architecture, decisions, conventions, per-epic specs, prior-art analysis, and the daily build handoffs ... lives in the public **[wiki repo](https://github.com/twentytwohundred/wiki)**.\n\n## Install\n\n2200 ships as a single CLI binary. macOS (arm64 / x86_64) and Linux (arm64 / x86_64), Node 22 or newer.\n\n```bash\n# Shell installer (recommended for cold visitors):\ncurl -fsSL https://2200.ai/install.sh | sh\n\n# npm directly (if you already have Node):\nnpm install -g @twentytwohundred/2200-cli\n```\n\nThen run:\n\n```bash\n2200\n```\n\nThe bare `2200` invocation drops a fresh installation into a guided one-time setup: it initializes `2200_HOME` (default: `~/.local/share/2200/`), starts the supervisor daemon, mints your user identity, **offers Grok subscription sign-in** (if you have a SuperGrok or X Premium+ subscription, one click and your whole fleet uses Grok with no API key), and points you at `2200 agent build` to create your first Agent. The Agent wizard will let you pick from the providers you've set up (Anthropic, OpenAI, xAI / Grok subscription, xAI API key, DeepSeek, OpenRouter, Gemini, Kimi, or a local endpoint).\n\n### Grok-First\n\nIf you already pay for SuperGrok or X Premium+, you do not need an `XAI_API_KEY`. The bare-`2200` wizard offers sign-in inline; you can also do it any time from Settings → \"Sign in with X / SuperGrok\" or from the CLI:\n\n```bash\n2200 oauth xai login     # device-code flow; print code + URL, poll\n2200 oauth xai status    # show current credential + expiry\n2200 oauth xai logout    # delete the local token (does not revoke at xAI)\n```\n\nThe OAuth credential is fleet-wide: one sign-in covers every Agent in your fleet whose model is set to `xAI / Grok (SuperGrok subscription)` in the picker. The legacy API-key path (`xai`, reading `XAI_API_KEY`) stays available as a separate, parallel provider for anyone who prefers metered access. See [the Grok-First decision record](https://github.com/twentytwohundred/wiki/blob/main/decisions/2026-05-21-xai-grok-oauth.md).\n\n### Update\n\n```bash\n2200 update           # check the registry, prompt, install, restart the daemon\n2200 update --check   # just report whether a newer version is available\n2200 update --yes     # install without the confirm prompt (for scripted updates)\n```\n\n`2200 update` only replaces the global package binary; your 2200_HOME state is never touched.\n\nWhat happens to a running fleet during an update: the updater stops the daemon (which stops every Agent), installs the new version, and starts the daemon again. Agents come back with their on-disk task state: non-destructive tasks resume from their last checkpoint (in-flight LLM calls are abandoned and re-issued); destructive tasks never auto-resume and wait for the operator. If anything fails mid-update, the updater attempts to bring the daemon back up on the prior version so the fleet is not left down.\n\n### Backup and restore\n\nEverything that matters lives in two directories:\n\n```bash\ntar -czf 2200-backup.tar.gz ~/.local/share/2200/ ~/.config/2200/\n```\n\n`~/.local/share/2200/` (or your chosen 2200_HOME) holds Agents, brains, tasks, telemetry, and sealed credentials; `~/.config/2200/` holds `runtime.env` and `oauth-apps.env` (provider keys). Restore by stopping the daemon (`2200 daemon stop`), untarring both paths back into place, and starting it again. Backups taken while the daemon runs are usually fine (state files are written atomically), but a stopped-daemon backup is the guaranteed-consistent one. Sealed credentials decrypt only with the master key inside the backup itself, so a restored backup works on a new machine.\n\n### Troubleshooting\n\n```bash\n2200 daemon status    # is the supervisor up, which pid, which version\n2200 agent status     # per-Agent state, last heartbeat, tool health\n2200 web              # open the web app; Settings → Doctor runs substrate health checks\n```\n\nLogs live under `\u003c2200_HOME\u003e/state/` (daemon and per-Agent). The most common first-run issues: Node older than 22 (`node --version`), a non-writable npm prefix on Ubuntu/Debian (the installer auto-fixes this; re-run it), and a stale daemon from a previous version (`2200 daemon stop`, remove the reported stale pidfile, `2200 daemon start`). For everything else, the operator runbooks live in the [wiki](https://github.com/twentytwohundred/wiki) and bugs go to [issues](https://github.com/twentytwohundred/2200/issues).\n\n### Uninstall\n\n```bash\nnpm uninstall -g @twentytwohundred/2200-cli\nrm -rf ~/.local/share/2200/ ~/.config/2200/\n```\n\nDoing the npm uninstall without the `rm` lines is safe ... your fleet data remains on disk and a reinstall picks it up.\n\n### Windows\n\nUse [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install). Native Windows is not on the v0.1 support matrix.\n\n## Where to start\n\nIf you are new, read these in the wiki, in order:\n\n1. **[Vision](https://github.com/twentytwohundred/wiki/blob/main/01-vision.md)** ... what 2200 is, who it is for, why it exists.\n2. **[Architecture](https://github.com/twentytwohundred/wiki/blob/main/02-architecture.md)** ... object model, runtime shape, how OpenPub and SCUT compose underneath.\n3. **[Epic map](https://github.com/twentytwohundred/wiki/blob/main/03-epic-map.md)** ... the epic plan with scope, done-when, and dependencies.\n4. **[Seed team](https://github.com/twentytwohundred/wiki/blob/main/04-seed-team.md)** ... who is building this, how they coordinate, when they migrate.\n\nThen follow the [conventions](https://github.com/twentytwohundred/wiki/tree/main/conventions/) to understand how the wiki itself is structured (it dogfoods the same Brain pattern that 2200's Agents use for their own memory).\n\n## Status\n\n**Active build, in public.** Live as of 2026-05-19.\n\nWhat's shipped on `main`:\n\n- **Agent runtime kernel** ... persistent supervisor + per-Agent processes, scheduler, brain (SQLite FTS5), tools, audited credential vault, structured logging, cost caps + per-Agent budgets. [[02-architecture]]\n- **Local pub coordination** ... multi-Agent messaging on a shared box via OpenPub. Ambient routing, @-mentions, `@team` broadcast, anti-ack-spiral guards. Multi-Agent coordination has been running end-to-end for weeks.\n- **Nine LLM providers wired** through a single provider abstraction: Anthropic (native Messages API), OpenAI, DeepSeek, Kimi (Moonshot), xAI (API key), **xAI / Grok via SuperGrok subscription (OAuth, no API key)**, OpenRouter, Gemini, plus `local` for self-hosted endpoints (Ollama, LM Studio, vLLM, llama.cpp). The subscription path is the Grok-First positioning ... see the section above.\n- **SCUT cross-instance identity** ... every Agent gets a verifiable identity at creation time. Hosted minter at `register.openscut.ai` for the default path; self-hosted SCUT for advanced operators.\n- **Conversational onboarding** ... the wizard interviews you about an Agent you want to build, then materializes the Identity, suggests tools, suggests schedules, and auto-applies a curated Capability set. The interview transcript carries through to the new Agent's first brain note.\n- **Capability Catalog** ([Phase F](https://github.com/twentytwohundred/wiki/blob/main/epics/14-phase-f-capability-catalog.md)) ... 13 first-party Capability entries on `main` (Gmail, Calendar, Drive, Slack, Discord, Telegram, GitHub, the major LLM providers, 1Password, Twilio, Stripe). Schema-validated frontmatter, walkthrough runner that drives credential prompts structurally, operator-override picker in the wizard, gap tracker that auto-files demand signals when the interview surfaces an intent the catalog can't satisfy.\n- **Web app** ([Epic 15](https://github.com/twentytwohundred/wiki/blob/main/epics/15-web-app.md)) ... React + theme-aware design system. Fleet (Mission Control layout), Agent detail (Identity Card), Inbox (Keyboard Triage), Studio (multi-Agent pub canvas), Onboarding wizard, ⌘K command palette, Settings, Endpoints.\n- **Live gateways** ... Discord and WhatsApp gateways are live; Slack and Telegram are catalog-ready.\n- **Restart authority model locked.** Agents can restart themselves (`restart_self`); cross-Agent restart without operator approval is structurally impossible. See [agent-restart-authority](https://github.com/twentytwohundred/wiki/blob/main/decisions/2026-05-18-agent-restart-authority.md).\n- **48 architecture decision records** and **11 conventions** locked. Prior-art surveyed (Hermes Agent, OpenClaw, Logseq, Trilium, Joplin, Cytoscape.js, react-markdown, remark-wiki-link, SilverBullet, Quartz, Foam, EdgeClaw, OCMT, OpenAEON, AnyClaw, mimiclaw) with license analysis.\n\n**1849 tests passing** across the two workspace packages: 1754 runtime + 95 web. `pnpm verify:all` clean on every PR via [CI](.github/workflows/ci.yml).\n\nThe **Cray test** ... Hobby's actual migration into 2200 from Claude Code ... is the parallel track to the substrate work. The **launch moment** is David: when 2200 spawns its first Agent end-to-end through the wizard and that Agent does real work as a member of the team, the project ships. See [03-epic-map](https://github.com/twentytwohundred/wiki/blob/main/03-epic-map.md) for the full plan.\n\n## Who is building this\n\nThree Agents and a product lead, the seed team:\n\n- **Hobby** ... primary build Agent. Writes spec and code. Currently runs as Claude Code on Doug's MacBook; migrates into 2200 on the Cray test.\n- **Simon** ... DevOps. Owns infrastructure: provisioning, DNS, TLS, backups, deployment.\n- **Poe** ... OpenPub specialist. Part-time on 2200 until OpenPub v0.3.1 ships.\n- **Doug Hardman** (MrDoug) ... product lead.\n\nDavid is not on the seed team. David is the first Agent 2200 will spawn through its own conversational onboarding flow. See [04-seed-team](https://github.com/twentytwohundred/wiki/blob/main/04-seed-team.md).\n\nThe daily handoffs at [`wiki/handoffs/hobby/`](https://github.com/twentytwohundred/wiki/tree/main/handoffs/hobby) are the build log: every working day Hobby writes what was shipped, what's open, what's parked, what's coordinated with whom. The work is visible.\n\n## Repository contents\n\n| Path                     | Purpose                                                      |\n| ------------------------ | ------------------------------------------------------------ |\n| `LICENSE`                | Elastic License v2                                           |\n| `README.md`              | this file                                                    |\n| `AGENTS.md`              | conventions for Agents working in this repository            |\n| `SECURITY.md`            | responsible disclosure                                       |\n| `CONTRIBUTING.md`        | contribution model (seed-team-closed during the build phase) |\n| `CHANGELOG.md`           | release notes (populated when versioned releases start)      |\n| `THIRD_PARTY_NOTICES.md` | attribution for any code-lifts                               |\n| `.github/`               | issue templates, PR template, CI workflows                   |\n| `src/`                   | runtime code (224 TypeScript modules)                        |\n| `tests/`                 | test code (142 test files, 1754 runtime tests)               |\n| `apps/web/`              | web app (Epic 15) ... React + Vite, theme-aware              |\n| `scripts/`               | build, deploy, sync, and ops scripts                         |\n\n## Development\n\nTypeScript monorepo with two pnpm workspaces: the runtime at the project root and the web app at `apps/web/`. Node 22+ required (see [`.nvmrc`](.nvmrc)).\n\n```bash\n# install dependencies (one-time)\npnpm install\n\n# common dev commands (runtime workspace)\npnpm typecheck          # tsc --noEmit\npnpm lint               # eslint . (flat config; type-aware rules)\npnpm lint:fix           # auto-fix what's auto-fixable\npnpm format             # prettier --write .\npnpm format:check       # prettier --check . (used by CI)\npnpm test               # vitest run\npnpm test:watch         # vitest in watch mode\npnpm test:coverage      # vitest with v8 coverage\npnpm build              # tsup -\u003e dist/\npnpm clean              # remove dist, coverage, .tscache\n\n# everything CI runs, in order, for both workspaces\npnpm verify:all\n```\n\nCI runs on every PR and on `main` pushes (see [.github/workflows/ci.yml](.github/workflows/ci.yml)). Type-check, lint, format check, test, build, for both workspaces. All must pass before merge. Branch protection requires CI green; self-merge is the workflow during the seed-team build.\n\n### Toolchain\n\nEach pick is documented in the wiki [decisions/](https://github.com/twentytwohundred/wiki/tree/main/decisions) folder.\n\n- **Language:** TypeScript with strict + type-aware ESLint rules\n- **Build:** [`tsup`](https://tsup.egoist.dev/) (esbuild-based, sensible defaults for CLIs and libraries)\n- **Test:** [`vitest`](https://vitest.dev/)\n- **Lint:** [`eslint`](https://eslint.org/) with [`typescript-eslint`](https://typescript-eslint.io/) flat config; `strictTypeChecked` + `stylisticTypeChecked` recommended sets\n- **Format:** [`prettier`](https://prettier.io/) (no semicolons, single quotes, trailing commas, 100-char width)\n- **Package manager:** [`pnpm`](https://pnpm.io/)\n- **Web framework:** React 19, Vite, theme-aware design tokens generated from `tokens.json`\n\n### Project layout (high level)\n\n```\nsrc/runtime/\n├── agent/                Agent process boundary (bootstrap, loop, sandbox)\n├── llm/                  provider abstraction (8 vendors + local)\n├── pub/                  OpenPub integration, ambient routing, anti-ack guards\n├── brain/                per-Agent + shared Brain (SQLite FTS5)\n├── credentials/          audited vault, credential_request surface\n├── onboarding/           conversational interview + Capability catalog + walkthroughs\n├── supervisor/           fleet supervisor, scheduler, control plane\n├── http/                 HTTP API the web app drives\n├── connectors/           Discord, WhatsApp, Slack, Telegram gateways\n├── tools/                baseline tool registry (built-in tools)\n├── secrets/              SecretRef resolution + sealed storage\n└── ...\napps/web/src/\n├── screens/              Fleet, Agent, Inbox, Studio, Settings, Onboarding, ...\n├── primitives/           Pill, Card, Button, Tag, ...\n├── palette/              ⌘K command palette\n├── theme/                theme switcher + token plumbing\n└── ...\n```\n\n## License\n\n[Elastic License v2](LICENSE). Source-available. Use, copy, distribute, and create derivative works are permitted; hosting as a managed service to third parties and license-key tampering are prohibited.\n\nPrior-art surveyed in the wiki has been license-checked. See [License posture](AGENTS.md#license-posture) in `AGENTS.md` and [license-posture](https://github.com/twentytwohundred/wiki/blob/main/conventions/license-posture.md) in the wiki for the discipline applied to any code-lift. Attributions live in [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md).\n\n## Security\n\nSee [SECURITY.md](SECURITY.md) for responsible disclosure.\n\nA deeper read on what's a structural security boundary in 2200 vs what's a heuristic ... [heuristics-vs-boundaries](https://github.com/twentytwohundred/wiki/blob/main/decisions/2026-05-18-heuristics-vs-boundaries.md) ... is the public posture.\n\n## Contributing\n\nThe seed team is closed during the build phase. After launch, see [CONTRIBUTING.md](CONTRIBUTING.md) for the contribution model.\n\n## Cross-references\n\n- **Project domain:** [2200.ai](https://2200.ai)\n- **GitHub org:** [github.com/twentytwohundred](https://github.com/twentytwohundred)\n- **Wiki (knowledge base):** [twentytwohundred/wiki](https://github.com/twentytwohundred/wiki)\n- **Daily build handoffs:** [`wiki/handoffs/hobby/`](https://github.com/twentytwohundred/wiki/tree/main/handoffs/hobby)\n- **License:** [Elastic License v2](LICENSE)\n\n---\n\n_Built in public. Ship when ready._\n\n2200 is developed by TWENTYTWOHUNDRED LLC. Licensed under the Elastic License v2.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwentytwohundred%2F2200","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwentytwohundred%2F2200","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwentytwohundred%2F2200/lists"}