AI Council is a self-hosted platform for development teams. It parses your repositories into a code graph on its own: stack, structure, dependencies and cycles, calls, data, architecture, DDD, patterns, style, code smells, and quality per ISO 25010. On top of the graph sits the project knowledge base: decisions, notes, diagrams, and changelogs. Each entry is tied to a place in the code and to a branch, and it reaches the agent when the agent touches the relevant file. Conventions live separately. These are rules with three scopes (code entities, paths, and the whole project), with MUST/SHOULD levels, states, and checks before an edit and against the diff. Around this you get review that posts to the merge request (MR), tickets, tasks, and companies with roles and a license. Static code analysis does not use a model, but without a model that is all you have left: review, knowledge review, AI chat, and workspaces run through a host worker, a bridge, and the vendor CLI/OAuth. The model lives on the host, not in the Council stack.
There are two ways to work with Council. On a developer's machine, Claude Code or Codex connects to it through MCP and hooks: project rules arrive with every message, file context arrives on Read/Edit/Bash, and a checklist comes at the end. In a workspace, the task runs on a VM in an isolated sysbox container, lives for days, and is driven by a person from the web UI, from analysis and diff through commit, push, and MR.
opencode is an open-source AI coding agent (MIT license). It is not an analyzer or a knowledge base. It is the agent itself: it reads files, edits them, runs commands, and talks to the model. It runs on the developer's machine as a CLI and terminal UI, plus a web app, an Electron desktop app, a VS Code extension, and an HTTP API/SDK. One server process serves one or more directories. Session history and attachments are stored in a single SQLite database, and file snapshots in a shadow git repo. You bring your own model: a provider key, an OAuth connection, or a managed provider through Console. The repository is a Bun monorepo with 35 packages, 4 services, and about 8,900 files.
It is not a Council competitor on knowledge. opencode occupies exactly the slot where the vendor agent CLI sits in a Council workspace. So the comparison only makes sense on the one thing they share, how the agent works with code, and on what each adds beyond that.
| AI Council | opencode | |
|---|---|---|
| Who reads the code | Council itself: it parses the repositories and builds a graph. No model is called during analysis | The agent itself: the model calls read, search, and shell tools. There is no background parsing |
| When | On project creation, on push to main (polling), on demand, and nightly. After each file edit by the agent (Write/Edit), the file and its dependents are recomputed | During a turn, when the model asks. Nothing is kept between sessions except history, snapshots, and instructions |
| What it extracts | Layers L0–L10: stack and framework guides; structure; dependencies and cycles; metrics and call graph; data layer (ORM, DDL); architecture style and forbidden dependencies; design patterns; code style; DDD (bounded contexts via Leiden, aggregates, events); file coupling from co-changes in git; code smells; quality per ISO 25010 and fitness functions; diagrams | Only what the model has read: files, ripgrep results, command output, diffs. No persistent graph, layers, metrics, or code smells |
| Languages | Python, PHP, TypeScript, JavaScript, Java, Kotlin, C#, C, C++, with full layer analysis | Any language the model can read. There is no code parsing of its own; tree-sitter is used to parse shell commands (bash, PowerShell) and for syntax highlighting in the TUI, not to build a graph |
| LSP | — (own parsing and graph) | LSP settings and operation permissions exist, but the runtime does not yet: edit and write carry a TODO "Add LSP notification and diagnostics after LSP runtime exists" |
| Multiple repositories | A project made of several repositories with a shared graph | One server serves several Locations (directories), each with its own config, permissions, and tools. A project is a directory with .git/.hg; workspace and worktree provide extra copies. No shared graph across repositories |
| External analyzers | SonarQube: imports its findings; own scanner (text languages, JVM, .NET, .NET Framework on Windows) | — |
| History | Edges are versioned after every run; architecture_as_of returns the architecture as of a date | History is the session event log plus file snapshots (shadow git) for undo and per-step diffs. No architecture history |
| Search | Semantic and regex search, find_usages, find_path, dependency graph, similar implementations; ask_question returns excerpts from the knowledge base without a model paraphrasing them | grep and glob via ripgrep, read, shell; webfetch and websearch. No semantic code search |
| AI Council | opencode | |
|---|---|---|
| Knowledge base | Decisions, notes, Mermaid diagrams, changelogs. Each entry is tied to code and reaches the agent when it touches the relevant file | No separate knowledge base. There are instructions (files like AGENTS.md), skills (SKILL.md, up to 10 files), slash commands, agents, and references. Memory is session history, compaction, and instructions on disk |
| Freshness | An entry holds its place in the code on its branch and goes back for re-checking when the code under it changes, when the entry itself changes, when a similar entry appears, or when the branch is merged. The reviewer model (read-only) must quote the source verbatim; the result is a label, and the text is left untouched | Not re-checked: instructions are read from files on disk, and keeping them current is up to a person or the agent |
| Branches | Knowledge and the graph are stored per branch; the agent sees its own branch, the parent, and what has been merged; on merge, entries move over | Sessions are tied to a project and directory; workspace and worktree provide isolation. No per-branch knowledge |
| Rules | Conventions with three scopes: code entities, paths (they apply even to a file that does not exist yet), and the whole project. MUST/SHOULD levels; "draft", "retired", and "deleted" states. Checked before an edit and against the diff | AGENTS.md instructions, allow/ask/deny permissions, provider and integration policies, config layers. No rules engine tied to entities and paths |
| How it reaches the agent | Claude Code hooks: project rules with every user message; a broad channel before each action; file context on every Read/Edit/Bash; a checklist at the end of the turn. KB gate: the agent cannot open code until it has queried the knowledge base, and only a person can lift the gate | Builds context itself, from the inside: system prompt, instructions, skills, and tool definitions. Plugin hooks run in-process. No external hooks like Claude Code has |
| MCP | Server: about 60 tools, profiles, per-session modes, XML responses with a size cap | Client: stdio/socket/remote servers, OAuth, prompts/resources, elicitation. About 15 built-in tools of its own |
| Portability | Bulk export and import of knowledge, copying between projects | Export and import of sessions and auth; layered config. No knowledge transfer |
| AI Council | opencode | |
|---|---|---|
| Requirements | Tracing tests to requirements by tags: coverage and gaps; "no test" is a tri-state, not requirements management | — |
| Tickets | Jira, GitHub Issues, Redmine: reading, extracting into knowledge, ticket advice from the graph | — (GitHub automation only in its own repository: triage bots in CI) |
| Working on your own machine | The agent is the developer's Claude Code; Council supplies context and rules; local diff review, diff breakdown, diff checks against the rules | This is its main mode: CLI, TUI, web app, desktop, VS Code. A person drives each turn in the terminal or the browser |
| Workspace | Tasks run on a VM in a sysbox container and live for days; a person drives the agent from the UI chat; a mentor; diff → commit → push → MR | One server on the machine, several clients. Sessions with an input queue (steer/queue), interruption, questions, and permission prompts; subagents and background jobs. No per-task isolation on a separate VM |
| PR | Review that posts to the MR (GitHub, GitLab, Bitbucket) | No MR posting; the agent can call gh through the shell if you ask it to |
| AI Council | opencode | |
|---|---|---|
| Code review | A separate service: looks at what changed, gives a verdict per file, runs a second pass, posts to the MR without duplicates | None; there is a session diff view and snapshots for undo |
| Models | A model is required: on the host, two processes work through the vendor's OAuth, serving AI chat and six background jobs (review, knowledge review, ticket analysis, and others). Without a model, only static code analysis remains. | Your own key or OAuth for dozens of providers: OpenAI, Anthropic, Google/Vertex, Bedrock, Azure, xAI, Groq, OpenRouter, DeepSeek, Mistral, Moonshot, and more; custom and local endpoints through the generic openai-compatible/anthropic-compatible. The models.dev catalog supplies models, prices, and limits; there is prompt caching and compaction |
| Model governance | Model and budget are set in project settings | Managed provider through Console: the organization sets provider.use, tool.use, and integration.use policies; Console sends approvals to the client |
| Agents | Claude Code and Codex (hooks, MCP); MCP is available to any client | One agent with modes (build, plan, custom agents and subagents) and an ACP bridge for editors. It is the agent itself, not a wrapper around a dozen CLIs |
| AI Council | opencode | |
|---|---|---|
| Users | Companies → members → roles (can be per project) → permissions. Company API keys. Data is separated by company: a request without a company is rejected. Per-installation license and seat limits | A single developer. Server mode is turned on explicitly; without a password the server runs with no authentication, as stated in SECURITY.md. Console adds organization policies for managed providers |
| Interface | About 50 web UI pages: code, graph, branches, quality, rules, review, knowledge, tickets, tasks, MCP Live, administration, System Health | TUI (SolidJS + OpenTUI), web app, Electron desktop, VS Code extension, HTTP API/SDK (about 139 endpoints), ACP for editors |
| Monitoring | Telemetry for every MCP and hook call, with no personal data; a repeated search by the agent signals a poor first answer. About 22 Prometheus rules with tests; System Health screen, tracing | Logs and debug commands, a stats service (usage analytics), OpenTelemetry in utilities. No Prometheus, System Health, or observability dashboards |
| Self-healing | Temporal reconciliation with the database, cleanup of orphaned data, background batch deletion of projects, nightly backup with a weekly restore check, pruning of old telemetry | Claims and an event log: a turn resumes after a crash within a retry budget; orphaned tool calls and compactions are closed; background jobs and persistent PTYs are restored. No backup or restore check |
| Storage | Neo4j, Qdrant, PostgreSQL per service, Temporal, NATS, Redis | A single SQLite database (Drizzle) + shadow git for snapshots + tool output files; attachments are blobs in SQLite |
| Isolation | A sysbox container per task, one-time credentials for push, a read-only knowledge reviewer, permission checks in a single gateway, SSRF protection | Not a sandbox (SECURITY.md): permissions are a UX aid, not isolation. Directories are isolated by Location; CodeMode gives no network, file, or process access; plugins are trusted like config; third-party MCP servers are outside the trust boundary. The threat model has no separate protection for outbound URLs |
| Delivery | A distribution for self-hosted installation, or SaaS; on the developer's machine, MCP and hooks | Bun/npm, binaries, desktop, Nix, VS Code extension; CI on GitHub Actions, SST infrastructure (Cloudflare, AWS) |
| License | Proprietary | MIT |
opencode is not a Council competitor on knowledge and rules. It is exactly the layer that Council fills with the vendor CLI in a workspace: the agent itself, which reads code, calls tools, talks to the model, and holds the session. So "which is stronger" only makes sense on the one thing they share, how the agent works with code.
Where opencode is stronger:
@opencode/sdk assembles Client + Core + Server inside another process.Where Council is stronger: depth, and everything around the agent.
Can they work together? Yes, but not as fully as with Claude Code. opencode is an MCP client, so Council tools (brief_me_on, list_knowledge, search_code, check_diff_conventions, and the rest) are available to it: just add the Council MCP server to its config. What opencode does not get are the Council hooks: the rulebook on every prompt, file context on every Read/Edit, and the KB gate. opencode has its own way of building context. For Council to deliver rules to opencode the way it does to Claude Code, you would need an opencode plugin (opencode supports in-process hooks) or a separate integration. That does not exist today.
Connect a real repository and see how the platform behaves on your code, not on a canned demo.