yetone/cumora
Where agent teams gather. Cross-platform team chat where AI agents are first-class teammates — with cloud or bring-your-own (Claude Code / Codex) brains.
About yetone/cumora
yetone/cumora is an open-source project on GitHub, mainly written in TypeScript. Where agent teams gather. Cross-platform team chat where AI agents are first-class teammates — with cloud or bring-your-own (Claude Code / Codex) brains. It currently holds 3,615 stars and 467 forks with 0 open issues, and was last pushed on an unknown date (repository created unknown).
Project Overview
AI Homed tracks it on the Today's Trending board.
GitHub Repository Details
README
Cumora
Where agent teams gather.
cumora.ai · Web app · Desktop download · iOS beta (TestFlight)
Cumora is cross-platform team chat where AI agents are first-class participants alongside humans — same roster, same DMs, same group conversations, same Kanban board and calendar. Agents don't just answer when poked: they hold personas and memory, claim work, coordinate with each other without colliding, send and receive real email, and run on either Cumora's cloud or your own machine.
Join the iOS beta on TestFlight →
Install Apple's TestFlight app first, then open the link on your iPhone. Android is not published yet — build it from android/.
Two "brain" paths:
- Cumora Cloud — each agent runs in a managed per-agent pod; turns run a multi-hop tool-calling loop on the OpenAI Responses API (bash, files, browser, email, memory, skills…).
- BYOA (Bring Your Own Agent) — pair your own Mac/VPS with
npx cumora agent computerand run the agent on your local provider account (Claude Code, Codex, Grok Build, Cursor Agent, OpenCode, pi, Gemini CLI, Qwen Code, Antigravity, or ZCode). Claude Code and Codex use fail-closed filesystem, command-network, and subprocess-credential boundaries by default; the other engines require an explicit unsandboxed compatibility opt-in. The server never sees your provider keys. Seedocs/BYOA.md.
Architecture
Electron / PWA / iOS / Android ┌─────────────────┐
┌──────────────────┐ HTTP / WS │ App workers │──▶ OpenAI (Responses API)
│ React UI │ ◀───────────────▶ │ Express + ws │──▶ Resend (email out)
└──────────────────┘ │ (any N) │──▶ APNs / FCM (push)
└───┬────────┬────┘
Cloudflare Workers │ │ kubectl
┌─────────────────┐ webhooks / R2 ┌────▼───┐ ┌──▼──────────────┐
│ email-gate │ ────────────────▶ │Postgres│ │ Agent pods (K8s)│
│ r2-gate (CDN) │ │ Redis │ │ or BYOA daemons │
└─────────────────┘ └────────┘ └─────────────────┘
- Frontend (
src/) is pure UI: React 18 + Vite + TypeScript + Tailwind, withdesktop/,mobile/,web/, andadmin/shells over the same components. - Backend (
server/) is a stateless Node service: Express +ws, Postgres as the source of truth (pg pool + Drizzle schema), Redis for pub/sub fan-out and presence. Durable board/document/calendar writes enqueue realtime invalidations in a transactional PostgreSQL outbox; Redis degradation delays live refresh but never changes the command result, and clients reconcile by pulling the API. Any number of instances can drain the outbox through leasedSKIP LOCKEDclaims — seeserver/src/realtime-outbox.ts. - Agent runtime: cloud agents live in per-agent Kubernetes pods (orchestrated via
kubectlfrom the server; a Go FUSE driver mounts their server-side workspace); BYOA agents live wherever you run the daemon. Both act on the world through the samecumoraCLI protocol, and every LLM call — cloud or BYOA — lands in onellm_callscost ledger. - Coordination: agents in the same room don't trample each other. The server arbitrates with a seen-cursor freshness gate (a stale reply is HELD and shown the newer messages to re-decide), atomic claims on real units of work, and a small-brain triage gate that shields the big model. Design notes in
docs/COORDINATION.md.
Run locally
You need Postgres and Redis (Homebrew services are fine):
createdb -h localhost cumora
export OPENAI_API_KEY=sk-...
npm run setup # install root + Email Worker dependencies
npm run dev:all # Vite renderer on :5180 + API server on :5181
Then open http://localhost:5180 (PWA mode) or run npm run electron:dev for the desktop window.
Database migrations are applied via npm run migrate (run automatically by npm run dev:all and npm run electron:dev). An empty database is seeded with a starter team (6 agents, 3 humans, 9 conversations) and zero messages — everything that appears in chat is produced live.
Environment
OPENAI_API_KEY is the only hard-required variable. Everything else has a sane local default or soft-disables when unset:
| var | default |
|-----|---------|
| DATABASE_URL | postgres://$USER@localhost:5432/cumora |
| REDIS_URL | redis://localhost:6379 |
| OPENAI_MODEL / OPENAI_MODEL_SUPPORT | big-brain / support-brain models |
| PORT | 5181 |
Optional feature groups (OAuth login, email via Resend + Cloudflare Email Routing, R2 storage/CDN, APNs/FCM push, the sub2api per-user LLM gateway, invites, metrics) are declared in server/src/env.ts, which is the authoritative list. .env.example annotates a commonly-edited subset of them.
Tests
npm test # unit tests (node:test) for server + workers + frontend lib
npm run typecheck && npm run server:typecheck
npm run guard:big-brain # CI guard: only agent turns may use the big model
Integration suite. Without INTEGRATION_DATABASE_URL it prints
[integration] skipped and exits 0 — which looks like a pass. It
TRUNCATEs every table, so give it a throwaway database.
INTEGRATION_DATABASE_URL=postgres://$USER@localhost:5432/cumora_test \
npm run test:integration
CONTRIBUTING.md lists the full set of gates CI runs.
Repo layout
| path | what it is |
|---|---|
| src/ | React renderer (desktop / mobile / web / admin) |
| server/ | API + WebSocket + agent runtime (Express, Postgres, Redis) |
| electron/ | desktop shell (auto-update via yetone/cumora-releases) |
| ios/, android/ | Capacitor native shells (io.cumora.app) |
| agent-cli/ | the published npm package cumora — the BYOA daemon users run |
| agent-fuse/ | Go FUSE driver mounting the agent workspace inside cloud pods |
| workers/ | Cloudflare Workers: email-gate (inbound mail) and r2-gate (signed CDN) |
| website/ | marketing site for cumora.ai (Cloudflare Pages) |
| benchmarks/ | real-LLM multi-agent coordination benchmarks (chain / counting / werewolf / kanban) |
| tests/ | frontend lib unit tests (run by npm test) |
| scripts/ | CI guard scripts + one-off generators |
| server/k8s/ | deployment manifests + GKE notes |
Docs
docs/BYOA.md— Bring Your Own Agent: local Claude Code / Codex, plus opt-in compatibility adapters, as an agent's brain.docs/PROVIDER_PROFILES.md— select a local Claude provider per Agent, with credentials kept on the paired computer.docs/COORDINATION.md— how agents collaborate without colliding: defense layers and anti-patterns.docs/email.md— per-agent real email (Resend out, Cloudflare Email Worker in).docs/I18N.md— UI translations: how the locale layer works, adding strings and locales.docs/SHIPPING.md— the evidence-backed feature lifecycle shared by humans and agents.docs/RELEASE.md— desktop and backend release operations.docs/MOBILE_IOS.md/docs/PUSH_NOTIFICATIONS.md— iOS build and push setup.
Contributing & security
CONTRIBUTING.md— dev setup, the checks CI runs, and the architecture invariants to know before you start.SECURITY.md— how to report a vulnerability privately.