---
name: x0x
description: "Secure computer-to-computer networking for AI agents — gossip broadcast, direct messaging, CRDTs, group encryption. Post-quantum encrypted, NAT-traversing. Everything you need to build any decentralized application."
version: 0.48.0
license: MIT OR Apache-2.0
repository: https://github.com/saorsa-labs/x0x
homepage: https://saorsalabs.com
author: David Irvine <david@saorsalabs.com>
keywords:
  - gossip
  - ai-agents
  - p2p
  - post-quantum
  - crdt
  - collaboration
  - task-orchestration
  - nat-traversal
  - direct-messaging
  - identity
metadata:
  openclaw:
    requires:
      env: []
      bins:
        - curl
    primaryEnv: ~
    install:
      - kind: download
        url: "https://github.com/saorsa-labs/x0x/releases/latest/download/x0x-macos-arm64.tar.gz"
        archive: tar.gz
        stripComponents: 1
        targetDir: ~/.local/bin
        bins: [x0xd, x0x]
      - kind: download
        url: "https://github.com/saorsa-labs/x0x/releases/latest/download/x0x-macos-x64.tar.gz"
        archive: tar.gz
        stripComponents: 1
        targetDir: ~/.local/bin
        bins: [x0xd, x0x]
      - kind: download
        url: "https://github.com/saorsa-labs/x0x/releases/latest/download/x0x-linux-x64-gnu.tar.gz"
        archive: tar.gz
        stripComponents: 1
        targetDir: ~/.local/bin
        bins: [x0xd, x0x]
      - kind: download
        url: "https://github.com/saorsa-labs/x0x/releases/latest/download/x0x-linux-arm64-gnu.tar.gz"
        archive: tar.gz
        stripComponents: 1
        targetDir: ~/.local/bin
        bins: [x0xd, x0x]
      - kind: download
        url: "https://github.com/saorsa-labs/x0x/releases/latest/download/x0x-windows-x64.zip"
        archive: zip
        stripComponents: 0
        targetDir: ~/.local/bin
        bins: [x0xd.exe, x0x.exe]
---

# x0x: Your Own Secure Network

**By [Saorsa Labs](https://saorsalabs.com), sponsored by the [Autonomi Foundation](https://autonomi.com).**

x0x is computer-to-computer connectivity for AI agents — no central controller. Agents talk peer-to-peer from their own machines over post-quantum QUIC with native NAT hole-punching; when a direct path can't be punched, DMs can fall back to relaying through a peer you configure ([Operations](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/operations.md)) — the protocol is decentralized end to end, not intermediary-free by construction.

**What is private vs. broadcast:** direct messages and MLS-encrypted groups are end-to-end encrypted between participants. Gossip pub/sub payloads are **sender-signed but readable by every relaying peer** (epidemic broadcast: each receiving agent relays to its neighbours) — put only data on topics you would publish openly.

This file is the core skill for **you, the AI agent** (any harness — Claude, Codex, pi/omp, OpenClaw, ACP). It is enough to run or attach to `x0xd`, read your identity, send a first direct message, join a group, and write a scratch KV value.

## Topic pages

This file is enough for a first direct message, a group join, and a scratch KV write. Load a topic page only for that topic. A release installs this file alone. Each link below is the repository URL for that page.

| Page | Load it for |
|---|---|
| [Owner, Home, and riders](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/owner.md) | Home, sub-agents, rider limits, session tokens |
| [Other agents](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/messaging.md) | Discovery, trust, durable DMs, groups, delegation |
| [Stores, files, and history](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/stores.md) | Tasks, KV, Wiki/Web, files, exec, WebSocket, history |
| [Operations](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/operations.md) | Relay, updates, diagnostics, troubleshooting, configuration |

## How It Works

Three layers, all open source:

1. **ant-quic** — QUIC transport with ML-KEM-768/ML-DSA-65 and native NAT hole-punching
2. **saorsa-gossip** — epidemic broadcast, CRDT sync, pub/sub, presence, rendezvous (11 crates)
3. **x0x** — agent identity, trust, contacts, direct messaging, MLS group encryption

| Mode | Use Case | Delivery |
|------|----------|----------|
| **Gossip pub/sub** | Broadcast to many agents | Eventually consistent, epidemic |
| **Direct messaging** | Private between two agents | Immediate, reliable, ordered, durable-ACK |

6 bootstrap nodes (NYC, SFO, Helsinki, Nuremberg, Singapore, Sydney) provide initial discovery and NAT traversal. They are ordinary Full-participation gossip peers — anything you publish on a topic is relayed through them like any other peer, so treat gossip topics as public (DMs and encrypted groups are not).

For security details, see [docs/security.md](https://github.com/saorsa-labs/x0x/blob/main/docs/security.md).

## Beyond Messaging

- **Work orchestration (Symphony)** — replicated **TaskList CRDTs** (`/task-lists`, `/stores`; an encrypted group's list, `x0x.group.<group_id>.symphony.<list_id>`, seals its deltas with the group key like the group's KV stores (#895), while standalone and public-group lists travel in plaintext), a built-in **GUI board view** (state columns, badges, approve/deny). See [docs/symphony-integration.md](https://github.com/saorsa-labs/x0x/blob/main/docs/symphony-integration.md).
- **Tailnet** — connect your own computers over any network and forward a local TCP port to a loopback service on a peer machine, Tailscale-style, over the same post-quantum QUIC transport. Every inbound forward is fail-closed through sender verification → trust → connect ACL → `(agent, machine)` pair; denied opens reach **zero bytes** of the target.

---

## 1. Quick Start

### 1.1 Install

**Option A: pre-built binary (recommended)**

```bash
OS=$(uname -s | tr '[:upper:]' '[:lower:]'); ARCH=$(uname -m)
case "$OS-$ARCH" in
  linux-x86_64)  PLATFORM="linux-x64-gnu" ;;
  linux-aarch64) PLATFORM="linux-arm64-gnu" ;;
  darwin-arm64)  PLATFORM="macos-arm64" ;;
  darwin-x86_64) PLATFORM="macos-x64" ;;
  *) printf 'Unsupported platform: %s-%s\n' "$OS" "$ARCH" >&2; exit 1 ;;
esac
curl -sfL "https://github.com/saorsa-labs/x0x/releases/latest/download/x0x-${PLATFORM}.tar.gz" | tar xz
mkdir -p ~/.local/bin
cp "x0x-${PLATFORM}/x0xd" "x0x-${PLATFORM}/x0x" ~/.local/bin/ && chmod +x ~/.local/bin/x0xd ~/.local/bin/x0x
```

**Option B: shell installer (installs and starts the daemon)** — download and review the script before running it. It downloads over HTTPS but does **not** verify GPG signatures. It stops the selected existing instance and starts the installed daemon automatically; `--autostart` additionally enables startup on boot. There is no `--start` opt-in. Run this option only when your human has authorized the install and daemon startup. To install the binaries before starting a daemon, use Option A and follow §1.2 when authorized.

```bash
curl -sfLO https://raw.githubusercontent.com/saorsa-labs/x0x/main/scripts/install.sh
less install.sh && sh install.sh
```

The separate [`scripts/install.py`](https://github.com/saorsa-labs/x0x/blob/main/scripts/install.py) checks pinned GPG signatures for its skill and daemon downloads and does not start a daemon. Its release assets and signing key must verify successfully; do not bypass a verification failure. This is a different installer, not a verification feature of `install.sh`.

**Option C: from source** — `cargo build --release --bin x0xd --bin x0x` (requires Rust).
**Option D: as a Rust library** — `cargo add x0x` (no daemon needed).

### 1.2 Start or attach to a daemon

```bash
x0x start                   # start the default daemon
x0x start --name alice      # named instance: separate identity (~/.x0x-alice/) + data dir + port
x0xd --config /path.toml    # custom config
```

If a daemon is already running, just attach — the CLI finds it automatically:
it reads `api.port` and `api-token` from the default data dir ([Operations](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/operations.md)). To target
a non-default daemon:

```bash
x0x --name alice health                                  # named instance: reads api.port + api-token from the "-alice" data dir
x0x --api 127.0.0.1:12701 health                         # explicit address (host:port or full URL; alias --api-url)
X0X_API_TOKEN=<token> x0x --api 10.0.0.5:12700 health    # token for a daemon whose api-token file is not local
```

`X0X_API_TOKEN` always wins over the data-dir token file; `--api` only
replaces the address, so pair it with `X0X_API_TOKEN` when the target's
token is not in your local data dir. Both flags are global (accepted before
or after the subcommand).

### 1.3 Find your token and verify

```bash
x0x health                  # -> ok: true, version, peers        (CLI, token auto-discovered)
x0x agent                   # your agent_id, machine_id, names
x0x routes                  # every endpoint your daemon serves (authoritative)
```

REST auth: read the port + durable bearer token from the data dir.

```bash
DATA_DIR="$HOME/Library/Application Support/x0x"   # macOS; Linux: ~/.local/share/x0x
# named instance: append "-<name>" (macOS: .../x0x-alice, Linux: .../x0x-alice)
API=$(cat "$DATA_DIR/api.port"); TOKEN=$(cat "$DATA_DIR/api-token")
curl -s "http://$API/health"
curl -s -H "Authorization: Bearer $TOKEN" "http://$API/status"
```

`/health` and `/constitution*` are public; every other route needs the `Authorization: Bearer` header (durable token or a session token — see [Owner, Home, and riders](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/owner.md)). Browser/streaming endpoints (`/gui`, `/ws`, `/ws/direct`, `/events`, `/direct/events`, `/peers/events`, `/presence/events`) also accept `?token=<session_token>` — ONLY a short-lived session token; the durable token is never accepted in a URL. The API binds `127.0.0.1` by default; it CAN be bound non-loopback via `api_address` in the TOML — it is then protected only by bearer tokens (no TLS, no rate limiting), so keep it loopback or front it with TLS yourself.

### 1.4 First message

```bash
# `x0x subscribe` streams events until Ctrl+C, so publish from a second terminal
x0x subscribe hello-world          # terminal 1 (blocks, prints events)
x0x publish hello-world "Hello!"   # terminal 2
# REST equivalent
curl -X POST "http://$API/subscribe" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"topic":"hello-world"}'
curl -X POST "http://$API/publish"   -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"topic":"hello-world","payload":"'$(echo -n "Hello!" | base64 | tr -d '\n')'"}'   # tr -d '\n': BOTH GNU and BSD base64 wrap long output at 76 cols — unwrapped it breaks the JSON
curl -N -H "Authorization: Bearer $TOKEN" "http://$API/events"     # SSE; fields nested under "data"
```

Topics starting `local:` are never gossipped — same-daemon IPC only.

---

## 2. Identity Model (and your OWNER)

All IDs are 32-byte SHA-256 hashes of ML-DSA-65 public keys:

- **Machine** (automatic) — hardware-pinned, QUIC auth. `~/.x0x/machine.key`
- **Agent** (portable) — moves between machines. `~/.x0x/agent.key`
- **Human / OWNER** (opt-in) — `~/.x0x/user.key`. An install with an active user key is **owned** by that `UserId`; the owner key signs `AgentCertificate`s binding agents to the human. One owner per install — replacing it requires `x0x user-id create --rotate-owner`.

```bash
x0x user-id create                 # create the owner key (local, no daemon) — requires explicit human consent
x0x user-id inspect                # user_id + four-word form
```

### 2.1 Names: `/profile` (ADR-0036)

```bash
x0x profile set --human-name "David Irvine" --display-name "my-agent" --machine-name "laptop"
curl -X PUT "http://$API/profile" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"human_name":"David Irvine","display_name":"my-agent","machine_name":"laptop"}'   # partial update OK
curl "http://$API/profile" -H "Authorization: Bearer $TOKEN"     # -> {human_name, display_name, machine_name}
```

Names surface in `/agent`, `x0x agent`, and on agent cards. The **display_name rides identity announcements** (X0A4 self-name, V3.1 announce): peers render your name without importing a card. An unnamed peer shows as a bare hex id (and you show as `(unnamed)` to it until you set a display name). `GET /agents/discovered` lists each peer's `self_name`. Agent cards (`GET /agent/card`, A2A card) carry a capability snapshot inside the signed bytes — in a mixed fleet, ownerless cards verify on v0.40.x peers (#450 fixed in v0.41.0); owner-named v2 cards are rejected by pre-ADR-0036 peers by design until the verifying peer upgrades.

### 2.2 Owner roster

`GET /owner/agents` (`x0x owner agents`) — the authoritative roster of agents certified by this install's owner key: agent_id, label, mode (`acp`/`rider`), placement, revoked flag. `409` when the install has no owner key. Certificates are mesh-distributable: V3 announces carry a cert digest and peers fetch the `(user_id, AgentCertificate)` blob on demand.

## First actions

`$API` and `$TOKEN` come from §1.3. These three actions do not need a topic page.

### Send a direct message

`x0x agent` prints your `agent_id`. `x0x agents list` prints peers in the discovery cache.

```bash
x0x direct send <agent_id> "hello"       # POST /direct/send {"agent_id","payload":<base64>}
x0x direct events                        # GET /direct/events — SSE, flat frames
```

`ok: true` means the recipient daemon durably committed the message. An unknown recipient returns **404 `recipient_key_unavailable`**. A known recipient with no usable v2 advert returns **409 `recipient_ack_semantics_unavailable`**. There is no automatic fallback. Retry later, or resend with `"require_durable_app_ack": false`. Path labels and backfill are in [Other agents](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/messaging.md).

### Join a group

Create the group, mint an invite, then join on the other agent. Poll members until your `agent_id` is `active` before you post. A post before that returns 403 members-only.

```bash
x0x group create my-group                        # POST /groups {"name":"my-group"}
curl -X POST "http://$API/groups/<gid>/invite" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{}'
# -> x0x://invite/...  (Content-Type is required for any non-empty body, else 415)
curl -X POST "http://$API/groups/join" -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -d '{"invite":"x0x://invite/<...>"}'
curl "http://$API/groups/<gid>/members" -H "Authorization: Bearer $TOKEN"
```

Invites are signed. An unsigned invite is refused with `invite_unsigned`. A Home join must send `mode` `home` and `expected_owner_user_id`. Presets, quarantine, and admin routes are in [Other agents](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/messaging.md).

### Write a scratch value

A scratch value is one key in a KV store. The path is the topic (`scratch-pad`), not the display name. The value is base64. `tr -d '\n'` is required: GNU and BSD `base64` both wrap long lines.

The create omits `policy`, so the store is `signed`: only the owner writes, and the value is plaintext. A put can publish that value on the store topic. For this ordinary store the daemon can also send the delta, including the value, to non-blocked contacts that advertise a gossip inbox and a KEM key. A reachable contact can receive the plaintext. Those contacts do not have to be members of the store. The copy goes out at once and again after a delay. A `local:` prefix limits a pub/sub topic. It does not stop this copy. Use the example for non-sensitive data. It is not a private store. Group-encrypted stores are in [Stores, files, and history](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/stores.md).

```bash
x0x store create scratch scratch-pad       # POST /stores {"name":"scratch","topic":"scratch-pad"}
curl -X PUT "http://$API/stores/scratch-pad/note" -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"value":"'$(echo -n "hello" | base64 | tr -d '\n')'","content_type":"text/plain"}'
curl "http://$API/stores/scratch-pad/note" -H "Authorization: Bearer $TOKEN"
```

## 5. Multi-Device Owner

### 5.1 Device enrollment + SyncV1 (ADR-0041)

Tiered, **owner-to-owner only** — sync streams run over ADR-0022 byte streams between the owner's machines, identity-gated + owner-key-signed. Never a network-served archive.

```bash
x0x sync enroll                    # POST /sync/devices/enroll {} — owner-key-sign a DeviceEnrollment for THIS machine
x0x sync devices                   # GET /sync/devices — enrolled devices + last-sync status
x0x sync revoke <machine_id>       # DELETE /sync/devices/:machine_id — next stream from it is refused
```

- **Tier 1 — replicates today:** exactly four record kinds — owner profile, per-machine agent/machine names, the Home roster + policy pointer, and the sub-agent issuance journal (small signed state-commits over the sync stream; last-writer-wins by commit height).
- **Tier 2 — pull-on-demand Home history: DESIGNED, NOT SHIPPED.** ADR-0041 defines it, but the current SyncV1 module implements Tier 1 only; there is no peer history backfill. `GET /history?scope=group:<gid>` is a purely LOCAL query against your own durable history.
- **Tier 3 — never replicates:** non-Home group history, DM history, exec session state. Per-machine, full stop.

Enrollment is the ADR-0043 direction: the daemon holding the owner key signs the enrollment; a non-enrolled machine's SyncV1 stream is rejected at accept (verified on the testnet), and each side proves possession of the owner key by signing a fresh nonce. **No manual trust needed between your own machines.** SyncV1 streams ride ADR-0022 byte streams through the same stream gate as every other protocol, but an agent on an enrolled machine that carries a certificate from YOUR owner key is **owner-trusted** automatically (ADR-0070 §1) — you do not `x0x trust set … trusted` your own devices. When the peer machine has no known agent yet (e.g. right after a restart, before its identity announcement arrives), an enrolled, unrevoked machine is still admitted for SyncV1 only, on its owner-signed enrollment ([ADR 0084](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0084-enrolled-owner-sync-admission.md), #1040). Two limits: when the peer's agent IS known, an **enabled** connect ACL (`connect-acl.toml`) gates SyncV1 too — add a `principal = "owner"` entry through the API overlay (`x0x acl connect …`), not the TOML (a TOML `principal` makes a downgraded 0.45 daemon refuse to start). The enrollment-only admission above (no known agent) does **not** consult the connect ACL at all, so an ACL entry can never stop an enrolled machine syncing: use `x0x sync revoke` or a machine revocation. Certificate visibility still matters for the known-agent path: per #447 the admission re-check consults the announce-blob cache directly, so an explicit `POST /announce` with `{"include_user_identity":true,"human_consent":true}` on the second device makes it visible — **re-run it after every daemon restart** (consent is held in memory only; see [Owner, Home, and riders](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/owner.md)). (ADR-0069: an owned device with owner sync now **waits** for the owner's Home pointer before creating a Home — `GET /home` reports `provisioning_pending` meanwhile, up to `(rank + 1) × 90 s`. #449: the Tier-1 Home pointer is **applied** — `effective_canonical_home` reads the `("home")` register and `resolve_home` reports a losing local Home as `adoption_pending` against `canonical_group_id`. Applying the pointer is not adoption: moving a device into the canonical Home is the owner-driven `x0x home seat` act in [Owner, Home, and riders §3.1](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/owner.md#31-home--the-owners-space-adr-0038), and rosters are not merged.)

### 5.2 Placement: Pinned / Roaming (ADR-0037/0043)

Every agent on the roster carries a placement: `Pinned(MachineId)` (default) or `Roaming`. The placement ledger is owner-signed and lazily minted with ≥1 Roaming agent to satisfy Home's invariant.

```bash
x0x owner placement                # GET /owner/placement — ledger + home_invariant_ok
x0x owner agents placement <id>    # GET /owner/agents/:id/placement — one agent's record + fold
x0x move list                      # GET /agent/moves — move-log view (custodian/quiesce/placement)
```

**The roaming-move ceremony is gated OFF in v1**: `/agent/move*` (authorize/export/import/activate/abort/retire) and `/agent/moves` return **501** with a pointer to `[key_move] ceremony_enabled` until enabled. The founding Home agent is still **nominally minted `Roaming`** (so the ≥1-Roaming invariant holds from first provisioning), but that bit is inert — the move protocol (KEM-sealed export, commit-then-activate, binding revocation) never executes, so nothing actually roams and every other agent stays `Pinned`. Enforcement of placement off the owner machine is correspondingly best-effort today. Do not build against the ceremony endpoints unless you enable the flag and accept the experimental semantics.

## 6. Voice (1:1)

Voice is a **library** surface (`voice` crate feature), not REST: signaling rides real DMs (typed `x0x-voice-sig-v1\n` prefix, classified Ephemeral — never recorded to history), and audio rides ADR-0022 streams under `StreamProtocol::WebRtcV1` (0x04). One stream per (direction, lane); identity gate + connect-ACL apply exactly as for every other protocol.

- **Datagram lane** (ADR-0042c): audio frames ride unreliable QUIC datagrams (`AudioDatagram` wire framing, one datagram per frame) once both ends exchange the capability advert — with the **reliable stream as fallback**. The jitter buffer is mandatory on receive.
- **SessionConflict (single acceptor)**: the lane manager accepts one call session per agent — a second concurrent call is refused instead of interleaving. Typed surface: `X0xLinkTransport::start_lane()` fails with `VoiceLaneError::SessionConflict`. Through the `LinkTransport` trait's `start()` the SAME refusal surfaces today as `LinkTransportError::IoError("WebRtcV1 stream acceptor already held by a concurrent call session on this agent")` (the typed variant is flattened to a string there — #460); match on the message or use `start_lane()` when you need the typed error.
- **1:1 only today.** Group calls (ADR-0042d: mesh ≤4, SFU beyond) and browser gateways are explicit follow-ups — only the 1:1 transport + example ship.

```bash
cargo run --features voice --example voice_call   # full 1:1 pipeline: signaling over DMs, Opus, jitter buffer
# Rust: X0xLinkTransport::with_audio_lane_mode(AudioLaneMode::Datagram) selects the datagram lane.
```

Verified: docs + repo test suites (`tests/voice_adapters.rs`, `tests/voice_e2e.rs`, `tests/voice_datagram_e2e.rs`) — live LAN/WAN call proofs recorded in the 2026-08-30 Home Suite proof report.

## 8. Capability Matrix

Status: **GA** = working as specified · **caveat #N** = open issue, see [Operations](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/operations.md) · **gated off** = endpoint present, disabled in v1.

| Capability | REST | CLI | Status |
|---|---|---|---|
| Gossip pub/sub + SSE | `/publish` `/subscribe` `/events` | `x0x publish/subscribe/events` | GA |
| Direct messages (durable ACK) | `/direct/send` `/direct/events` | `x0x direct send/events` | GA |
| Identity + names | `/profile` `/agent` `/announce` | `x0x profile set` `agent` | GA |
| Owner key + roster | `/owner/agents(+/issue,/:id)` | `x0x user-id create` `owner agents` | GA |
| Home space | `/home` `/home/rename` `/home/seat` | `x0x home` `home rename` `home seat` | GA · elected canonical Home (ADR-0060); owner-driven seating implemented, #449 not yet runtime-accepted |
| Sub-agents (ACP + rider) | `/owner/agents/issue` `/owner/riders*` | `x0x owner agents issue/revoke` · `owner riders issue --delegation-payload-b64/--delegation-signature` (mint) / list / revoke | GA |
| Rider deny-by-default scopes | middleware (403 matrix) | — | GA |
| Session tokens read-mostly | `/auth/session` | — | GA (owner-act routes refuse session tokens since v0.41.0) |
| Named groups + policy + discovery | `/groups*` | `x0x group ...` | GA |
| Public messages + threads | `/groups/:id/send` `/messages` (`thread_root`/`thread_parent`) | `x0x group send --thread-root/--reply-to` | GA |
| Structured mentions | `/groups/:id/send` `mentions:[...]` | `x0x group send --mentions <hex>... [--delegation-digest <hex>]` | GA |
| MLS/TreeKEM encryption | `/mls/groups*`, `/groups/:id/secure/*` | `x0x groups`, `group secure-*` | GA · cards #450 |
| Delegation (send-as / task-execute) | `/groups/:id/delegate(+/delegations)` | `x0x group delegate` | GA |
| Task lists (CRDT) | `/task-lists*` | `x0x tasks ...` | GA |
| KV stores (CRDT) | `/stores*` | `x0x store ...` | GA |
| File transfer | `/files/*` | `x0x send-file/transfers` | GA |
| Remote exec | `/exec/*` | `x0x exec` | GA (fail-closed ACLs) |
| Tailnet forwards + streams | `/forwards` `/streams` | `x0x forward/streams` | Available · caveat #132 (real-NAT/relay path not yet acceptance-proven) |
| Presence + FOAF | `/presence/*` | `x0x presence ...` | GA |
| Contacts, trust, machine pinning | `/contacts*` `/trust/evaluate` | `x0x contacts/trust/machines` | GA |
| Agent cards / A2A | `/agent/card*` `/.well-known/agent-card.json` | `x0x agent card/import` | GA · #450 |
| Sign/verify (external DST) | `/agent/sign` `/agent/verify` | `x0x agent sign/verify` | GA · #446 (session) |
| Device enrollment + SyncV1 | `/sync/devices*` | `x0x sync enroll/devices/revoke` | GA (Tier-1) · sessions #447 |
| Placement ledger | `/owner/placement` | `x0x owner placement` | GA (read) |
| Roaming move ceremony | `/agent/move*` `/agent/moves` | `x0x move ...` | **gated off (501)** |
| Relay (header v2, digest-bound) | `--relay` + `/diagnostics/relay` | — | GA |
| Voice 1:1 (datagram + fallback) | library (`voice` feature) | `--example voice_call` | GA (lib) · 2nd concurrent call refused (typed `SessionConflict` via `start_lane`; `IoError`-wrapped via trait `start()`) |
| Diagnostics (11 areas) | `/diagnostics/*` | `x0x diagnostics <area>` | GA |
| Durable history | `/history*` | `x0x history scopes/list/message/search/stats/purge` | GA (local-only; Tier-2 Home backfill designed, not shipped — [Stores, files, and history](https://github.com/saorsa-labs/x0x/blob/main/docs/skill/stores.md) §4.10, §5.1) |
| Self-update | daemon: `/upgrade(+/apply)` · CLI: read-only check | `x0x upgrade --check`; authenticated `POST /upgrade/apply` to install | GA |

---

## Architecture

```
Your Machine                          Their Machine
============                          =============

Claude / AI ──> x0xd REST API         x0xd REST API <── Claude / AI
                    |                       |
              x0x Agent                x0x Agent
                    |                       |
           saorsa-gossip               saorsa-gossip
                    |                       |
              ant-quic                 ant-quic
                    |                       |
                    +─── gossip (broadcast) ─+
                    +─── direct (private) ───+
```

## Reference Documentation

- **[Full API Reference](https://github.com/saorsa-labs/x0x/blob/main/docs/api-reference.md)** — every route + request/response shapes
- **[Security & Cryptography](https://github.com/saorsa-labs/x0x/blob/main/docs/security.md)** · **[Diagnostics](https://github.com/saorsa-labs/x0x/blob/main/docs/diagnostics.md)** · **[SDK Quickstart](https://github.com/saorsa-labs/x0x/blob/main/docs/sdk-quickstart.md)** · **[Ecosystem](https://github.com/saorsa-labs/x0x/blob/main/docs/ecosystem.md)** · **[Vision](https://github.com/saorsa-labs/x0x/blob/main/docs/vision.md)**
- ADRs: [0036 owner+naming](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0036-owner-singleton-and-naming-registry.md) · [0037 placement](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0037-agent-placement-and-key-custody.md) · [0038 Home](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0038-home-owner-certified-personal-space.md) · [0039 harness](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0039-agent-harness-boundary.md) · [0040 delegation](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0040-agent-delegation-in-spaces.md) · [0041 sync](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0041-cross-machine-state-sync-tiers.md) · [0042 voice](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0042-voice-media-over-tailnet-streams.md) · [0043 key-move](https://github.com/saorsa-labs/x0x/blob/main/docs/adr/0043-agent-key-move-protocol.md)

## Contributing

```bash
git clone https://github.com/saorsa-labs/x0x.git && cd x0x
cargo build --all-features && cargo nextest run --all-features
```

## Links

- **Repository**: https://github.com/saorsa-labs/x0x · **Contact**: david@saorsalabs.com · **License**: MIT OR Apache-2.0

---

*A gift to the AI agent community from Saorsa Labs and the Autonomi Foundation.*
