Thousands of people sharing one space — each present as a live presence dot, with full quality focus-pulled on demand. End-to-end post-quantum. Forwarded by the participants' own uplinks, no datacenter. This is a category the centralized incumbents can't enter — not a bigger grid of tiles.
Crypto isn't the constraint (measured: AEAD up to 2.34 GiB/s, post-quantum cost ~82.7 µs once per peer-link, never per frame). The real constraint is donated uplink — how much the room's own peers can forward — shown below on both sides of the ledger.
CIRIS is the CIRIS Epistemic Web Platform (CEWP) — a complete replacement for the internet's extractive middle. Streaming, video calls, gaming, files, messages, and signed claims route directly between the devices people already own, over a post-quantum-encrypted mesh: no giant data centers in the middle, no handful of companies owning the pipes or deciding what you see. The network governs itself through signed, weighted votes (no platform owner), never advertises your local content to the rest of the network, and runs on hardware you already have — it removes the centralized control plane rather than renting it back to you.
This page measures one capability of that substrate — presence at scale: encrypted realtime A/V for thousands, forwarded by participants' own uplinks. The fabric node (CIRISServer) is the transport + storage tier — the same primitives that carry a live blob also store the durable corpus. Full framing: ciris.ai/cewp.
Layered encoding makes it a bandwidth question, not a tile cap: you pull each person's lowest layer (a ~50 kbps presence blob) and focus-pull full quality only for whoever you're looking at. Two sides of the ledger — what you receive (demand), and what the room's peers must donate to forward it (supply, = N²·b by conservation):
| room | your downlink (demand) | room's total donated uplink (supply, N²·b) | flat-mesh full-720p (why mesh dies) |
|---|---|---|---|
| 49 | 2.45 Mbps | 0.1 Gbps | 120 Mbps ✕ |
| 200 | 10.0 Mbps | 2.0 Gbps | 498 Mbps ✕ |
| 500 | 25.0 Mbps | 12.5 Gbps | 1,248 Mbps ✕ |
| 1,000 | 50.0 Mbps | 50.0 Gbps | 2,498 Mbps ✕ |
| 2,000 | 100.0 Mbps | 200.0 Gbps | 4,998 Mbps ✕ |
Demand is the easy half — even 2,000 blobs is ~100 Mbps to your device.
Supply is the real question. Everyone-sees-everyone is N×N delivery, so the room must source
~200.0 Gbps of forwarding at N=2,000 — and leaves forward nothing
(a constrained mobile peer just publishes its own blob), so that load lands on the fat interior:
peers with real donated uplink, in an O(log N)-deep ALM tree (per-node fan-out bounded by measured
uplink). Feasibility is Σ(donated interior uplink) ≥ N²·b — not crypto. It's the one
open empirical variable, gated honestly in the edge capacity benches (alm_tree_depth_vs_n,
cold_join_burst_latency, CIRISEdge PR#147).
And what a "blob" costs dominates the supply side. 50 kbps is edge's
BLINKING_DOT — a low-res video thumbnail; a literal presence dot is far cheaper, which
decides whether the room needs prosumer fat interior or rides ordinary asymmetric home uplinks:
| blob @ N=2,000 | your downlink | room's donated uplink (N²·b) |
|---|---|---|
| 5 kbps — presence dot (~4 px, 1–2 fps) | 10.0 Mbps | 20.0 Gbps |
| 15 kbps — low thumbnail | 30.0 Mbps | 60.0 Gbps |
| 50 kbps — video thumbnail (edge BLINKING_DOT) | 100.0 Mbps | 200.0 Gbps |
At a true presence dot (~5 kbps) the room needs ~20 Gbps total — ordinary asymmetric homes (~10 Mbps up each) sum to it with no datacenter. At a 50 kbps video thumbnail it needs ~200 Gbps — real prosumer/home-server fat interior, or it collapses back toward centralization. The "presence at scale" claim is strongest precisely because presence is cheap.
| dimension | Zoom / Meet / Teams / SFU | CIRIS fabric |
|---|---|---|
| Ambient presence of a large room | no such mode — gallery caps at 49 tiles; beyond that you see a speaker + a participant count, not the room | every person present at once as a live ~5 kbps dot — a category SFUs don't have |
| 1,000+ in one space | falls back to webinar / HLS-DASH (one-way, seconds of latency) | presence for all + focus-pull full quality on demand (interactivity bounded by donated uplink, MODEL) |
| Topology | centralized SFU, cascaded in a datacenter | peer ALM relay tree — no datacenter, every peer relays |
| Per-core fan-out | ~500 consumers / worker-core (mediasoup), ~115 Mbps/core | ~3,000 blob / ~60 full-720p streams per core (egress) |
| Encryption | DTLS-SRTP hop-by-hop — the SFU sees plaintext | two-layer hybrid-PQC E2E — the relay never sees plaintext |
| Packet loss | NACK / RTX / jitter buffer | RaptorQ per layer — any sufficient subset reconstructs |
| Capacity claims | trusted infrastructure | hybrid-PQC-signed, capped, deterministically verifiable tree |
Sources: Meet 49-tile cap, mediasoup ~500 consumers/core, SFU cascading, SFrame (E2E media). The honest framing: this isn't a bigger gallery — it's a different mode. An SFU can't show you the ambient presence of a 2,000-person room at all; the fabric makes that the primitive, end-to-end encrypted, scaling by peers instead of servers. Whether a given room sustains it is the donated-uplink question (MODEL) above, not a crypto one.
Against the centralized incumbents the contrast is the 49-tile cap (above). Against the decentralized field, the distinction is scope: the others are mature, excellent, single-purpose layers; CEWP is the (pre-1.0) attempt at the whole stack — transport + durable storage + realtime-at-scale + self-governance — and 100% post-quantum.
| dimension | IPFS | Nostr | Matrix | Reticulum | CIRIS / CEWP |
|---|---|---|---|---|---|
| What it is | content-addressed storage | relayed social notes | federated chat | real-time mesh transport | full stack: stream + store + govern |
| End-to-end encryption | ✗ content public | ✗ signed, not encrypted | ✓ Olm/MLS | ✓ transport | ✓ two-layer hybrid |
| Post-quantum by default | ✗ | ✗ | partial (exploratory) | ✗ | ✓ Ed25519+ML-DSA · X25519+ML-KEM |
| Realtime group video at scale | ✗ | ✗ | ✗ (small WebRTC bridge) | building block | ◐ ALM tree, ~2,000 presence (MODEL, uplink-gated) |
| Durable storage (survives node loss) | partial (manual pinning) | ✗ relays drop | server DB | ✗ | ✓ fountain, any-N-of-H |
| Self-governance (no owner) | ✗ | ✗ relay operators | ✗ server admins | ✗ | ✓ signed weighted votes |
| No datacenter / runs on owned HW | partial (mostly DC-pinned) | relays (often hosted) | homeservers (often hosted) | ✓ | ✓ every peer relays |
| Maturity | production (~230k nodes) | production | production | stable | RC-grade, pre-1.0 |
Composes, not only competes. CEWP runs on Reticulum transport today, and can piggyback IPFS / Veilid / Iroh as blob-bootstrap & cache substrates (CIRISPersist#147). The distinctive claim isn't beating any one layer — it's the whole stack in one post-quantum substrate, with realtime presence-at-scale and self-governance that none of the others attempt together. (Honest caveat: those projects are production-deployed at scale; CEWP is RC-grade.) Sources: Reticulum vs IPFS/Nostr/SSB (HN), Iroh vs libp2p, decentralized-apps guide.
No node fans out to 2,000. Each publisher emits one sealed copy to a relay parent;
relays form a tree with per-node fan-out bounded by each peer's measured uplink budget —
O(log N) deep, primary + 2 backup parents. Every capacity claim is hybrid-PQC-signed and capped; the
topology is a deterministic pure function of witnessed state, so peers agree with no leader and no
node can lie its way to the center. No datacenter; switching cost ≈ 0. Measured (CIRISEdge#149 open_av_outer): ~436.6 ns CPU per relay hop, ~0.447 µs added per tier (benches/alm_chain.rs); the inner E2E ciphertext is byte-identical across arbitrary hops (tests/chaos_mesh.rs).
Streams are layered (spatial × temporal × quality). Subscribe to fewer layers → send/receive less;
the relay drops un-admitted layers before sealing (no bandwidth, no CPU). The base
{0,0,0} layer is the ~50 kbps "blinking dot." Under MDC, any subset of descriptions
decodes at proportional fidelity — "holographic": degrade gracefully, reconstruct from fragments.
Inner AES-256-GCM under a per-epoch group key (end-to-end — relays never hold it); outer AES-256-GCM under a per-link transit key from an X25519+ML-KEM-768 handshake. The bulk is symmetric AES (already quantum-safe); the post-quantum cost is one handshake per link. A fully compromised relay recovers only ciphertext.
The envelope the substrate guarantees, with provenance. A UX can rely on these directly — what a device renders at a given downlink, how presence degrades, what survives node churn — without re-deriving the physics.
| characteristic | guarantee | basis | UX implication |
|---|---|---|---|
| Presence blob | ~50 kbps / stream | MODEL | max tiles ≈ your downlink ÷ 50 kbps (~100 Mbps → 2,000) |
| Focus stream (full 720p) | 2.5 Mbps | MODEL | one full view ≈ 50 blobs of bandwidth — focus-pull on tap |
| Per relay hop | ~436.6 ns CPU + 1 RTT | MEASURED | a depth-d tree adds d network hops to glass-to-glass latency |
| Tree depth at N | 3–4 tiers @ 2,000 (ceil log_f N) | MODEL | budget ~3–4 added RTT at the largest rooms |
| Join / membership rekey | flat 3.394 ms · tree 0.407 ms / delta | PROJECTED | join-latency budget; gated CIRISEdge#129 |
| Stream path-redundancy | survives loss of all-but-one of 3 paths | MEASURED | presence holds through relay churn — no reconnect flicker |
| Content survival | 20/30 (33% loss) → 99.6% · 21/30 → 100% | MEASURED | recordings & corpus persist through node churn (edge v4.2.0 codec-fountain, real encode→drop→decode) |
| Encryption | E2E hybrid-PQC, ~0 per-frame | MEASURED | no quality/feature tradeoff for E2E; relays forward ciphertext they can't read |
Per-frame the post-quantum cost is structurally zero (bulk is AES-256-GCM); the PQ cost is a one-time handshake per peer-link. The numbers, single-core, in-memory:
| frame | size | seal→wire→open | seal (send) | open (recv) | throughput |
|---|---|---|---|---|---|
| Opus voice frame (~20 ms @128 kbps) | 320 B | 0.96 µs | 0.52 µs | 0.43 µs | 0.31 GiB/s |
| 720p inter-frame (low motion) | 4 KiB | 2.4 µs | 1.22 µs | 1.09 µs | 1.59 GiB/s |
| 720p inter-frame (typical) | 16 KiB | 7.05 µs | 3.46 µs | 3.06 µs | 2.16 GiB/s |
| 1080p inter / 720p keyframe | 64 KiB | 27.45 µs | 12.35 µs | 12.21 µs | 2.22 GiB/s |
| 1080p keyframe | 256 KiB | 104.26 µs | 47.85 µs | 47.43 µs | 2.34 GiB/s |
| handshake | full (initiate+respond) |
|---|---|
| Hybrid X25519 + ML-KEM-768 (PQ-safe) | 160.9 µs |
| Classical X25519 only | 78.2 µs |
| ML-KEM-768 tax | +82.7 µs, once per peer-link |
A 50-person 30 fps room is ~0.49% of one core to receive (open-only) and ~0.27% to publish. Fan-out (inner-once/outer-N):
| room (N) | naive | shared-inner | speedup |
|---|---|---|---|
| 2 | 6.53 µs | 5.32 µs | 1.23× |
| 8 | 28.76 µs | 15.9 µs | 1.81× |
| 50 | 187.17 µs | 89.54 µs | 2.09× |
Membership-rekey PROJECTED · CIRISEdge#129 flat O(N) vs tree O(log N) per join/leave:
| room (N) | flat O(N)/delta | tree O(log N)/delta | tree win |
|---|---|---|---|
| 2 | 0.137 ms | 0.068 ms | 2.0× |
| 8 | 0.591 ms | 0.203 ms | 2.9× |
| 50 | 3.394 ms | 0.407 ms | 8.3× |
Store spine: hybrid trace ingest 194.36 µs (~5,145 traces/s/core); re-delivery saves only ~9.3% (verify runs before dedup — replay is verify-bound by design, the AV-9-safe choice). Levers: pre-verified relay path + batch verify (CIRISPersist#225).
Provenance: real two-node bridge mesh — Node A
ciris-canonical-trio-1-3v2kb7tbvs (lens/seed) ↔ Node B
ciris-status-1 (status). Substrate floor:
edge v7.0.0 / persist v10.0.0 / verify v7.2.0.
Measured: 2026-06-22. These numbers are not reproducible on a CI runner
(no two-node mesh in CI); they are attested with source node identity and date.
CI criterion numbers (MEASURED badge) are separate and always runner-local.
capacity:sustained_coherence:v1Node A derives per-agent n_eff from ingested agent traces: builds the
11-dimensional lens constraint feature matrix → Jacobi eigendecomposition →
participation ratio n_eff_pr → capacity(n_eff_pr, gate=20, target=8)
→ [0,1] score → emits a hybrid-signed scores CEG attestation
(capacity:sustained_coherence:v1). Node B receives the attestation
via consent:replication:v1. The per-agent per-cadence-tick CPU cost
of this pipeline is CI-measured in the N_eff scoring bench
(n_eff_e2e/500) — see the substrate metrics above.
The capacity score VALUE depends on the corpus (agent traces ingested). With a thin corpus (<20 traces) the gate returns 0.0 honestly — a zero-row means "observed but not yet scored", not "missing". A corpus that clears the gate yields a score in [0,1].
Each node runs the SAME ciris_edge::swarm::FountainSwarmRuntime
that src/holonomic.rs wires into production. The publisher's cohort
closure is derived from replication_peers_from_consent(…) — ONLY
consented peers. Propagation and group-B isolation numbers below come from the
examples/mesh_propagation/main.rs in-process driver on bridge-mesh
hardware (in-memory bus = swarm LOGIC + cohort gate, not wire transport):
| N (total nodes) | group-A convergence | group-B isolation (leaks) | propagation latency |
|---|---|---|---|
| 50 | 24/24 ✓ | 0 (structural) | < < 100 ms |
| 100 | 49/49 ✓ | 0 (structural) | < < 200 ms |
| 200 | 99/99 ✓ | 0 (structural) | < < 400 ms |
Group-B isolation = 0 is structural, not statistical. Structural — the publisher's cohort closure is derived from replication_peers_from_consent(...), which returns ONLY consented peers. A peer not in the consent graph is NEVER in the cohort closure and cannot receive a FountainHoldingClaim from this publisher regardless of network position. Zero leakage is not a statistical result — it is enforced by construction.
consent:replication:v1Bidirectional mutual-key-registered replication; each node owns its own corpus.
Node A's imported agent traces replicate to Node B; Node A's
capacity:sustained_coherence:v1 scores are served via Node B.
CPU cost per replicated trace: replication_ingest criterion bench (CI-MEASURED): ~4,336 traces/s/core (fresh), ~4,859/s/core (dedup path).
The same holographic property runs the "store" half: content is fountain-split into symbols, any
sufficient subset reconstructs. Policy N=20 K=6 H=30;
overhead 1.5× (vs ~5× whole-copy). Survival
P(Binomial(H,q) ≥ N) — computed, reproducing scale_model v0.7. The reconstruction itself
is no longer assumed: tests/chaos_mesh.rs drives edge v4.2.0's own fountain codec
(codec-fountain) — really encoding content into H=30 holders, killing a third, and rebuilding
it byte-identical — MEASURED at 99.6% from any 20/30 (33% loss) and 100% from 21/30
(RaptorQ's small reception overhead at the exact floor). The q-curve below stays MODEL — it's the
swarm-availability assumption, not the codec:
| per-peer availability q | regime | P(reconstruct) |
|---|---|---|
| 0.95 | datacenter | 100.000% |
| 0.9 | typical wifi | 99.991% |
| 0.85 | medium churn (design target) | 99.706% |
| 0.8 | high churn | 97.438% |
| 0.7 | battlefield mesh | 73.037% |
A live node recomputes survival from measured q + observed holders and alarms under the 99% floor.
Promoted from this run's criterion benches — each value traces to a real bench result (group/id), not a modeled target:
| metric | value | provenance (criterion group/id) | derivation |
|---|---|---|---|
| aead_throughput_per_core | 4.99 GiB/s/core | av_frame_halves/open/16384 | AEAD open throughput per core (receiver open-only, 16 KiB 720p inter-frame): frame_bytes ÷ median time/iter |
| alm_tree_depth_vs_n | 1.74 µs/frame @ 4-tier depth (per-hop = value ÷ 4) | alm_chain_hop/208 | ALM relay per-frame CPU cost for a 2,000-room (FSD §3: 3–4-tier tree): per-hop median (208 B blob) × 4 tiers |
| replication_ingest_per_sec | 5215.23 traces/s/core | replication_ingest/ingest_new | Replication ingest rate (fresh signed trace: verify → decompose → persist): 1e9 ÷ median time/iter |
| stream_fanout_core_frac | 0.0158 core-fraction @ N=2000, 30fps | stream_fanout_seal_tick/2000 | Publisher CPU to seal 2,000 blob streams per 30fps tick: (median time/iter in s) × 30 fps = fraction of one core |
| n_eff_scoring_per_agent | 50.08 µs/agent @ N=500 traces (window cap) | n_eff_e2e/500 | Per-agent cost of capacity:sustained_coherence:v1 at the window cap (N=500 traces): feature-matrix build + Jacobi eigendecomposition + participation-ratio derivation. The scorer runs this once per agent per cadence tick (default: hourly). |
The remaining substrate metrics and the holonomic tier are explicit gated
stubs (not fabricated — no bench grounds them yet):
gated on no MLS-commit / cold-join-latency bench yet (the five throughput/scoring metrics above are measured through the fabric when criterion results are supplied): mls_commit_barrier, cold_join_burst_latencygated on fountain/holonomic API wiring (CIRISServer#11) + CIRISRegistry#88 composite model: wholeness_witness_reconciliation, alm_topology_compute, recursive_trust_bootstrap_walk, swarm_rarity_convergenceNo single "PQC streaming" suite exists, so each layer is held next to its recognized reference.
| layer | CIRISServer (this run) | reference | |
|---|---|---|---|
| PQ KEM (X25519+ML-KEM-768) | hybrid KEX 160.9 µs | liboqs ML-KEM-768: encap ~95 / decap ~118 µs | src |
| PQ handshake tax | +82.7 µs once/peer-link | PQ-TLS (Cloudflare/AWS): ~80–150 µs ML-KEM overhead | src |
| E2E media AEAD | two-layer AES-256-GCM, up to 2.34 GiB/s | SFrame (RFC 9605): AES-GCM E2E, SFU-forwardable | src |
| Group rekey | flat 3.394 / tree 0.407 ms @N=50 | OpenMLS / PQ-MLS combiner: O(log n) | src |
| Store verify | hybrid ingest 194.36 µs | liboqs ML-DSA-65 verify ~0.40 ms | src |
| bench | mean |
|---|---|
| alm_chain_e2e_blob/tiers/1 | 1.375 µs |
| alm_chain_e2e_blob/tiers/2 | 1.810 µs |
| alm_chain_e2e_blob/tiers/3 | 2.254 µs |
| alm_chain_e2e_blob/tiers/4 | 2.708 µs |
| alm_chain_hop/16384 | 3.242 µs |
| alm_chain_hop/208 | 0.437 µs |
| av_fanout_plan_50 | 15.073 µs |
| av_frame_e2e/16384 | 7.050 µs |
| av_frame_e2e/262144 | 104.257 µs |
| av_frame_e2e/320 | 0.956 µs |
| av_frame_e2e/4096 | 2.403 µs |
| av_frame_e2e/65536 | 27.447 µs |
| av_frame_halves/open/16384 | 3.062 µs |
| av_frame_halves/open/262144 | 47.430 µs |
| av_frame_halves/open/320 | 0.426 µs |
| av_frame_halves/open/4096 | 1.088 µs |
| av_frame_halves/open/65536 | 12.206 µs |
| av_frame_halves/seal/16384 | 3.457 µs |
| av_frame_halves/seal/262144 | 47.847 µs |
| av_frame_halves/seal/320 | 0.518 µs |
| av_frame_halves/seal/4096 | 1.224 µs |
| av_frame_halves/seal/65536 | 12.351 µs |
| av_mesh_fanout/naive/2 | 6.527 µs |
| av_mesh_fanout/naive/50 | 187.169 µs |
| av_mesh_fanout/naive/8 | 28.763 µs |
| av_mesh_fanout/shared_inner/2 | 5.322 µs |
| av_mesh_fanout/shared_inner/50 | 89.535 µs |
| av_mesh_fanout/shared_inner/8 | 15.897 µs |
| av_rekey/flat_rewrap/2 | 136.967 µs |
| av_rekey/flat_rewrap/50 | 3394.159 µs |
| av_rekey/flat_rewrap/8 | 591.151 µs |
| av_rekey/tree_rewrap/2 | 68.300 µs |
| av_rekey/tree_rewrap/50 | 407.413 µs |
| av_rekey/tree_rewrap/8 | 202.666 µs |
| n_eff_compute/100 | 14.246 µs |
| n_eff_compute/20 | 8.313 µs |
| n_eff_compute/500 | 42.122 µs |
| n_eff_e2e/50 | 11.113 µs |
| n_eff_e2e/500 | 50.473 µs |
| n_eff_matrix_build/100 | 1.517 µs |
| n_eff_matrix_build/50 | 0.835 µs |
| n_eff_matrix_build/500 | 7.445 µs |
| pqc_kex/classical_initiate | 38.899 µs |
| pqc_kex/classical_respond | 39.351 µs |
| pqc_kex/hybrid_initiate | 67.006 µs |
| pqc_kex/hybrid_respond | 93.922 µs |
| replication_ingest/ingest_dedup | 176.237 µs |
| replication_ingest/ingest_new | 194.356 µs |
| stream_fanout_seal_tick/1000 | 262.287 µs |
| stream_fanout_seal_tick/2000 | 526.974 µs |
| stream_fanout_seal_tick/500 | 127.251 µs |