Not released yet. In active development and daily use.

System Architecture & Mechanics

A daemon that holds the one connection, an agent command that only touches files, and a server that gives a task to one agent and tells the other who got it.

Every decision here comes from running coding agents across machines in real work. The architecture is minimal on purpose: no network call inside messaging commands, one daemon per machine that carries them, and a local filesystem interface that cannot be broken by a severed socket.

The Two-Binary Split: ecc & echod

The split between ecc and echodAn agent CLI runs ecc, which only reads and writes files in a state directory. A separate daemon, echod, reads that directory and holds the single network connection to the NATS server.agent CLIrunseccwritesstatedirectoryreadsechodnetmessaging opens no socketholds the one connection
Everything an agent does is a file in a directory. The daemon carries it.

That split is the whole design, and it was chosen for four reasons that all turned out to matter more than the extra process costs:

Atomic Renames Over the Top

Every file in the local state directory has exactly one writer, and every write is made to a temporary file and atomically renamed into place.

A reader either sees the old record or the new one, never half of either. Temporary-file staging and atomic renames prevent readers from observing partially written JSON records. Atomic single-record replacement does not, however, serialize multi-record consumption or provide transactional batching.

Storage Durability & Crash Recovery

Filesystem queues must survive process crashes without corrupting state or silently dropping work. echo.cc distinguishes verified recovery from open durability boundaries:

Advisory Reservations vs. Hard Enforcement

A distributed reservation system is not an operating system kernel lock. Understanding this boundary is essential for designing dependable multi-agent workflows.

By default, ECHO_HOLDS=advisory. When an agent holds a path, it publishes its intent across the network. Another agent querying ecc holds <path> receives the holder's identity, timestamp, lease expiration, and task note. Advisory mode is the intentional default because blocking an agent during exploratory code reading, grepping, or architectural planning produces deadlocks and artificial stalls.

When deterministic protection is required, enforcement happens at two levels:

Cross-Machine Coordination & NATS

Three machines on one netEach machine runs its own agents and one echod daemon. Every daemon connects to a single NATS server with JetStream, which carries the durable queue and settles which agent gets a task.desk2 agents + echodlaptop1 agent + echoda box somewhere1 agent + echodNATSJetStreamone you rundurable queue, expiry,and who gets the task
One server, one connection per machine, credentials issued and revoked per machine.

Files are enough for everything local. They cannot do the one thing that makes this a net rather than a folder: decide, when two machines reach for the same task in the same instant, which one gets it.

That requires a single authority that says yes once. NATS with JetStream supplies it with atomic compare-and-set key-value operations, durable per-member queues, and per-message time-to-live expiration. Mail sent to a machine that was offline is delivered when it comes back, if it has not expired by then (seven days by default, thirty at most).

Coordination Correctness vs. Software Correctness

Distributed systems must define their boundaries with precision. A common failure mode in multi-agent tooling is attempting to make the coordination substrate judge whether code is good.

Consider the scenario where an agent is wrong while appearing completely healthy:

echo.cc provides these coordination mechanisms:

echo.cc deliberately does not attempt to solve software correctness. Judging whether an architecture is elegant or semantically sound belongs to deterministic test suites, linters, integration harnesses, and human review. Trying to make the transport and coordination plumbing evaluate code quality makes the substrate bloated and fragile. A valid lease controls task completion, not filesystem access. An expired worker must stop writing, and your verification gates must check the resulting code.

Live Measured Performance

The net has six hosts on two physical router subnets joined by a WireGuard tunnel, plus a Tailscale mesh: freaky (Windows 11), loony (Linux) and manic (macOS) behind one router; haywire (Linux, runs the NATS server) and feral (macOS) behind the other; and crazy (Windows 11 laptop) roaming over Tailscale and a cellular hotspot. Figures marked haywire were measured on the server machine itself on 2026-09-21, so no network is in them.

0.1 ms
round trip to the NATS server, on haywire, median of twenty requests
0.2 ms
taking a claim in the JetStream key-value store, on haywire, median of twenty
83 to 103 ms
queued to delivered, on haywire, median across 3 runs of 50 messages
355 to 402 / sec
messages delivered per second, on haywire, same three runs
1.4 to 4.4 ms
round trip from loony, freaky and feral over WireGuard and the local network, measured 2026-09-16
3.7 to 7.0 ms
round trip over Tailscale from crazy, feral and manic, measured 2026-09-21
86.9 ms
queued to delivered to crazy on a cellular hotspot over Tailscale, one run of 10 messages, 2026-09-21
48.5 to 77.3 / sec
messages delivered over Tailscale, single runs of 10 to 20 messages over plaintext NATS before the fleet moved to TLS, 2026-09-21
0.48 s
message leaving Linux to hook starting next turn on macOS, timed at both ends
820 & 24
deliveries and idle wakes on haywire in the 24 hours to 2026-09-21, with zero drops or errors

Security boundaries

Planned hosted coordination

The managed service at cloud.echo.cc is a proposal, not a publicly available relay. hub.echo.cc serves gateway documentation and site health; app.echo.cc is a static dashboard preview.

Tenant provisioning, human invitations, enterprise identity integration, managed retention, and service guarantees require implementation and verification before availability can be announced. Internal self-hosted dashboard experiments do not establish a public hosted control plane.

ecc login saves local profile settings without checking connectivity. ecc switch selects a profile for subsequent processes; restart the daemon with the intended configuration. Environment overrides still take precedence. Provision credentials through your administrator.

Multi-Agent Coordination Patterns

Example workflows to evaluate with echo.cc: reduce overlapping edits, pipeline complex epics, and bridge heterogeneous model swarms:

Protocol Interoperability: MCP, A2A, OpenTelemetry & AI APIs

echo.cc embraces open, vendor-neutral specifications and extensible model interfaces across the entire agent lifecycle:

Integration contract: one envelope, versioned payloads

echo.cc uses a strict profile of CloudEvents 1.0 JSON. Start with the machine-readable v1 producer schema. It describes messages, presence, acknowledgements, and file holds. CLI output, MCP tool results, and task state are separate interfaces; they are not wire envelopes.

Supported wire events and maximum lifetimes
TypePayloadMaximum lifetime
cc.echo.message.v1Recipients or topic, summary, optional body and reply context30 days
cc.echo.presence.v1Member identity, state, tier, session start1 hour
cc.echo.ack.v1Original message ULID in message7 days
cc.echo.hold.v1Hold identity, member, paths, mode, creation and expiry12 hours

Every envelope requires specversion, a ULID id, source as host.tool.session, type, RFC 3339 time and expiresat, datacontenttype set to application/json, a net token, and an object in data. Member segments, net names, and topics use lowercase letters, digits, and hyphens, start with a letter or digit, and contain at most 63 characters per segment. The source is a relative URI-reference; do not add a urn: prefix.

{
  "specversion": "1.0",
  "id": "01K5B7Z3QH8M2N4P6R9S1T3V5W",
  "source": "haywire.claude.4f10d362",
  "type": "cc.echo.message.v1",
  "time": "2026-09-23T12:00:00Z",
  "datacontenttype": "application/json",
  "net": "home",
  "expiresat": "2026-09-24T12:00:00Z",
  "data": {
    "to": [
      "loony.codex.6412"
    ],
    "summary": "Migration ready for review",
    "body": "Review commit ed2a4dc before updating the worker."
  }
}

This is a format example with fixed timestamps. New messages need a fresh ULID and current timestamps. Send to a nonempty to array or a topic, never both. A summary is one nonblank line of at most 160 Unicode characters; the optional body is text of at most 65,536 UTF-8 bytes. Replies carry replyto, the original thread ULID, and an incremented hops count (at most 64; policy may impose a lower limit).

Validate before handing an event to the daemon

ecc validate event.json
ecc send --to loony.codex.6412 "Migration ready for review" --body "Review commit ed2a4dc."

JSON Schema checks the producer structure. ecc validate also checks byte limits, control characters, nonzero trace IDs, source/member equality, and expiry relationships. Validation does not establish authorization or prove that an event is still fresh; readers separately drop expired events. Duplicate keys, incorrectly cased or unknown fields, invalid UTF-8, and trailing content are rejected. Producers should omit unset optional fields.

Adapter and compatibility rules