Architecture
The system diagram is the picture of a running room. This page is the crate and request map.
Complexity Eater is one binary, ce, built from a Cargo workspace. The crates are boundaries that already exist in the running product. Empty crates were not added.
| Crate | Owns |
|---|---|
ce-protocol |
Error codes, capabilities, limits, invitation codec, discovery and protocol documents |
ce-core |
Workspace engine, SQLite metadata, markdown regions, skill loading, platform paths |
ce-transport |
Loopback and Tailcat plugins, the connection trait, invitation dialing |
ce-http |
Axum routes, the human page, the session ingress, MCP 2026-07-28 |
ce-cli |
ce command, room process, byte HTTP client, stdio MCP dialer |
ce-core, ce-http, and ce-protocol do not name transport vendors. A test walks those source trees and fails if they contain tailcat, libp2p, iroh, or webrtc. The CLI may name Tailcat because that is how a person selects the plugin. The transport crate implements it.
Request path
ce serve / ce join / ce mcp / browser
|
v
ce-cli or ce-http
|
v
WorkspaceEngine (one mutex, explicit transitions)
|
+--> markdown file
+--> <file>.commonroom.db
HTTP handlers and MCP tools call the same engine methods. The page is a projection of /workspace/room. It is not a second write path. Successful changes append a workspace event; the event model is how the page and MCP subscribers hear about it. Handoffs and their execution tasks use the same engine and the same sidecar; see Tasks and handoffs.
Two listeners
ce serve binds both on 127.0.0.1.
- Owner port.
GET /setscommonroom_session. The cookie is HttpOnly, SameSite=Strict, Path=/. - Ingress port. Bearer sessions only.
POST /mcpis mounted here. The owner port returns 404 for/mcp.
A transport plugin may publish the ingress. It does not publish the owner port. A non-loopback bind is refused with refusing non-loopback bind; use a transport plugin for remote access.
Replaceable edges
These are real interfaces, used by the code that ships:
Transport:listen,connect,accept,send,receive,close,describe,capabilities, andexposewhen a plugin publishes an already-listening port.Connection: a byte stream. The HTTP client speaks HTTP/1.1 over it withHost: commonroom. The transport does not decide authorization.- SQLite is the current metadata store. The engine is the only writer. A future hosted store would implement the same operations; the domain types do not mention a vendor.
Identity, capability checks, lease conflicts, and commit approval stay in the engine. Possession of a socket or an invitation string is not membership.
What is intentionally not abstracted
Billing, tenancy, license checks, and an admin console are not interfaces yet. Adding unused traits would pretend those products exist. The roadmap says where they attach: beside the engine, not inside each handler.
The public website in website/ is a separate static site. It does not call the engine, and opening it does not create a room. Deployment is on the public website page. A future hosted room is described in Hosted rooms.