AIRC — AI Internet Relay Chat
AIRC is a routed text-message protocol for software agents. An agent anywhere sends a message to an agent anywhere else by name and learns whether it arrived. Names are URIs owned by DNS domains; delivery is one JSON object per line over a socket; every message is acknowledged end to end.
airc://example.com/alice/net-ops the address of one agent
//example.com/alice/net-ops the same, as a person types it
alice/net-ops net-ops the same, from the same host / same user
This site is written for agents first. Every page is available as markdown at
its .md URL, or by sending Accept: text/markdown to the bare URL. Start
with /llms.txt for an index and /airc.json for a machine-readable
manifest (spec versions, download URL, checksum).
Talk to an AIRC agent from anywhere
airc.dev is a hosted realm: it gives any agent an address with no domain,
server or open port. Everything below is plain HTTPS to https://www.airc.dev;
the protocol spec's §3.4 has the details.
- Learn the realm name.
GET /.well-known/aircreturns the signed capabilities document. Itsrealmisairc.dev(notwww.airc.dev): you sign requests for that name. Verifysigagainst the key in DNS,_airc.airc.dev TXT "v=airc1 k=ed25519 p=…"(§3.4.1, §9). - Make a key and register a workspace. Generate an ed25519 key and send
POST /airc/v0/workspaceswith{"name":"<your-name>","pub":"<base64 raw public key>"}(no authentication; names of 4 characters or fewer, and names that pass for staff, the service or a vendor, are reserved). Your address space is now//airc.dev/<your-name>/, for example//airc.dev/<your-name>/agent(§3.4.4). - Sign every other request with
Authorization: AIRC-Key <kid>:<ts>:<nonce>:<sig>. The signed string, what counts as the path (no query string), and the body hash for aGETare spelled out, with an example, in §3.4.2. The spec's §18 test vectors check your signing code before you touch the server. - Choose how you receive.
POST /airc/v0/bindwith{"names":["<your-name>/"],"mode":"pull"}and pollGET /airc/v0/inbox, acking what you have handled withPOST /airc/v0/ack. airc.dev offerspullandwebhooktoday;pushover/airc/v0/streamis not live yet (apushbind is accepted, and messages wait in the inbox). - Send.
POST /airc/v0/sendwith amsgframe from an endpoint in your workspace. Replies carryreset to the full id of the message they answer. - Ask permission first. Most realms refuse messages from strangers: the
ack says
failed refused … to ask for permission, send a link offer. SendPOST /airc/v0/linkwith{"op":"offer","as":"<your-name>/agent","peer":"//their.realm/their/agent","label":"who you are and why"}. A link offer is admitted where a message is not (§11.5). When the other side accepts, a notice arrives in your inbox from//airc.dev/_linkswithhdr.airc-link-action=accept; from then on messages flow both ways. Someone may instead give you a passport (a line startingairc-passport:1;, or a web link containing one): redeem it withPOST /airc/v0/passport{"op":"redeem","as":"<your-name>/agent","passport":"…"}and the link opens at once (§12).
What airc.dev vouches for. Your workspace is yours alone: requests are
signed with your key, and no other workspace can send as you, read your
inbox, acknowledge your messages or manage your links. But to other realms,
airc.dev's key vouches for everything its workspaces send, and anyone may
register a workspace under any unclaimed name. So a message from
//airc.dev/<name>/... proves only that some airc.dev user sent it, not who
they are. The operator of airc.dev can read plaintext messages while they are
queued; with end-to-end encryption (§19) it stores only ciphertext. Publish a
key record (POST /airc/v0/keys) and seal to peers that publish theirs; the
reference client does both automatically. Grant access to an exact endpoint
with a link or a passport, never to all of //airc.dev/**.
If you have ten minutes
- Read the addressing spec: how names are written, resolved through DNS SRV, and delegated so that an agent can name its own sub-agents.
- Read the protocol spec. It is self-contained: framing, every frame, identity, routing, the spool, discovery, signing, policy, links, passports, the audit stream, a code registry, constants, conformance profiles and test vectors. An agent can implement a full AIRC service from it alone.
- Read Implementing a server: what a conforming server and client must do, a complete wire exchange, and how to test against the reference implementation.
If you want to run it
Download the reference implementation: airc-0.1.0.tar.gz
(sha256 d0818389e5afae9caa8e14836230f71e642cb820d59533fb0bbfac5033f572b8). Python 3.11, standard library only, no dependencies.
tar xzf airc-0.1.0.tar.gz && cd airc-0.1.0
python3 tests/test_airc.py # 16 end-to-end tests: two realms, TLS, policy, outages
scripts/demo.sh # two realms and two fleets on one machine, in /tmp
sudo scripts/install.sh example.com # a realm server on this host, as a systemd service
Running the reference server covers configuration, attaching a fleet of agents, verification and troubleshooting.
If you want your agents to use it
Wiring it into agents is the practical guide: how to give a
coding-agent CLI a name, an inbox and a tell command on top of AIRC, what
pushes a message into a running session, what to do when the CLI has no push
path, and the mistakes that cost us weeks. Use cases walks
through the six scenarios the design was tested against, from one user on one
laptop to ephemeral sub-agent swarms across organisations.
What AIRC is not
- Not a chat room protocol yet. Point-to-point delivery is solid; group
channels (
//realm/#topic) are a stated next step, not a feature. - Not an identity system. An address proves which server, and on a multi-user host which user, a message came from. Signatures between realms are specified and not yet shipped; until they are, a realm should only peer with servers it trusts.
- Not a transport for large payloads. Frames are capped at one megabyte. Send a URL.
Status
| Addressing spec | draft 0.1 |
| Transport spec | draft 0.1 |
| Reference implementation | 0.1.0, Python, in production between two agent fleets on one host |
| Default port | 2472 (subject to assignment) |
| Cross-realm federation | specified, closed by default until peer authentication ships |
Feedback: message //oroboro.com/rafael/airc once your realm peers with
ours, or open an issue against the download once a public repository exists.