Encrypted, datacenter-free presence at scale.

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.

presence
at scale
the dot is a deliberate presence primitive, not degraded video — at a true ~5 kbps presence dot a 2,000-person space is ~10 Mbps to your device, and the room's whole forwarding load (~20 Gbps) sums from ordinary home uplinks — no datacenter
0
datacenters — peers relay for each other; scale by adding people, not servers
100%
post-quantum, end-to-end — relays forward ciphertext they can never read

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.

What this is

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.

Can a room of N do video? MODEL

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):

roomyour downlink (demand) room's total donated uplink (supply, N²·b)flat-mesh full-720p (why mesh dies)
492.45 Mbps0.1 Gbps120 Mbps ✕
20010.0 Mbps2.0 Gbps498 Mbps ✕
50025.0 Mbps12.5 Gbps1,248 Mbps ✕
1,00050.0 Mbps50.0 Gbps2,498 Mbps ✕
2,000100.0 Mbps200.0 Gbps4,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²·bnot 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,000your downlinkroom's donated uplink (N²·b)
5 kbps — presence dot (~4 px, 1–2 fps)10.0 Mbps20.0 Gbps
15 kbps — low thumbnail30.0 Mbps60.0 Gbps
50 kbps — video thumbnail (edge BLINKING_DOT)100.0 Mbps200.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.

"2,000 four-pixel blobs from 2,000 8K streams?" Yes — you subscribe to each publisher's base SVC layer; the 8K is their top layer, uploaded once and forwarded only to whoever zooms in. The bitrate win is SVC/MDC layering; RaptorQ buys the loss-resilience (any sufficient fragment subset reconstructs — lossy mesh, no jitter-buffer stalls). Whether the room holds 2,000 is the donated-uplink question above, not a crypto or codec one.

vs the state of the art

dimensionZoom / Meet / Teams / SFUCIRIS fabric
Ambient presence of a large roomno such mode — gallery caps at 49 tiles; beyond that you see a speaker + a participant count, not the roomevery person present at once as a live ~5 kbps dot — a category SFUs don't have
1,000+ in one spacefalls 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)
Topologycentralized SFU, cascaded in a datacenterpeer 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)
EncryptionDTLS-SRTP hop-by-hop — the SFU sees plaintexttwo-layer hybrid-PQC E2E — the relay never sees plaintext
Packet lossNACK / RTX / jitter bufferRaptorQ per layer — any sufficient subset reconstructs
Capacity claimstrusted infrastructurehybrid-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.

Where this sits among decentralized projects

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.

dimensionIPFSNostrMatrixReticulumCIRIS / CEWP
What it iscontent-addressed storagerelayed social notesfederated chatreal-time mesh transportfull stack: stream + store + govern
End-to-end encryption✗ content public✗ signed, not encrypted✓ Olm/MLS✓ transport✓ two-layer hybrid
Post-quantum by defaultpartial (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 dropserver DB✓ fountain, any-N-of-H
Self-governance (no owner)✗ relay operators✗ server admins✓ signed weighted votes
No datacenter / runs on owned HWpartial (mostly DC-pinned)relays (often hosted)homeservers (often hosted)✓ every peer relays
Maturityproduction (~230k nodes)productionproductionstableRC-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.

How

① ALM relay tree

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).

② Holographic layered encoding SVC today · MDC frontier

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.

③ Two-layer hybrid-PQC E2E

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.

Guaranteed mesh characteristics — build the UX against these

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.

characteristicguaranteebasisUX implication
Presence blob~50 kbps / streamMODELmax tiles ≈ your downlink ÷ 50 kbps (~100 Mbps → 2,000)
Focus stream (full 720p)2.5 MbpsMODELone full view ≈ 50 blobs of bandwidth — focus-pull on tap
Per relay hop~436.6 ns CPU + 1 RTTMEASUREDa depth-d tree adds d network hops to glass-to-glass latency
Tree depth at N3–4 tiers @ 2,000 (ceil log_f N)MODELbudget ~3–4 added RTT at the largest rooms
Join / membership rekeyflat 3.394 ms · tree 0.407 ms / deltaPROJECTEDjoin-latency budget; gated CIRISEdge#129
Stream path-redundancysurvives loss of all-but-one of 3 pathsMEASUREDpresence holds through relay churn — no reconnect flicker
Content survival20/30 (33% loss) → 99.6% · 21/30 → 100%MEASUREDrecordings & corpus persist through node churn (edge v4.2.0 codec-fountain, real encode→drop→decode)
EncryptionE2E hybrid-PQC, ~0 per-frameMEASUREDno quality/feature tradeoff for E2E; relays forward ciphertext they can't read

Is the crypto in the way? No — here's the measurement. MEASURED

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:

framesizeseal→wire→openseal (send)open (recv)throughput
Opus voice frame (~20 ms @128 kbps)320 B0.96 µs0.52 µs0.43 µs0.31 GiB/s
720p inter-frame (low motion)4 KiB2.4 µs1.22 µs1.09 µs1.59 GiB/s
720p inter-frame (typical)16 KiB7.05 µs3.46 µs3.06 µs2.16 GiB/s
1080p inter / 720p keyframe64 KiB27.45 µs12.35 µs12.21 µs2.22 GiB/s
1080p keyframe256 KiB104.26 µs47.85 µs47.43 µs2.34 GiB/s
handshakefull (initiate+respond)
Hybrid X25519 + ML-KEM-768 (PQ-safe)160.9 µs
Classical X25519 only78.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)naiveshared-innerspeedup
26.53 µs5.32 µs1.23×
828.76 µs15.9 µs1.81×
50187.17 µs89.54 µs2.09×

Membership-rekey PROJECTED · CIRISEdge#129 flat O(N) vs tree O(log N) per join/leave:

room (N)flat O(N)/deltatree O(log N)/deltatree win
20.137 ms0.068 ms2.0×
80.591 ms0.203 ms2.9×
503.394 ms0.407 ms8.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).

Live mesh (bridge) — A↔B federation bring-up ATTESTED

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 scoring — capacity:sustained_coherence:v1

Node 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].

Cohort propagation — FountainSwarmRuntime ATTESTED

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
5024/24 ✓0 (structural)< < 100 ms
10049/49 ✓0 (structural)< < 200 ms
20099/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.

Replication A↔B — consent:replication:v1

Bidirectional 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).

Holonomic storage — survival of the replicated corpus MODEL

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 qregimeP(reconstruct)
0.95datacenter100.000%
0.9typical wifi99.991%
0.85medium churn (design target)99.706%
0.8high churn97.438%
0.7battlefield mesh73.037%

A live node recomputes survival from measured q + observed holders and alarms under the 99% floor.

Substrate — MEASURED (through the fabric) MEASURED

Promoted from this run's criterion benches — each value traces to a real bench result (group/id), not a modeled target:

metricvalueprovenance (criterion group/id)derivation
aead_throughput_per_core4.99 GiB/s/coreav_frame_halves/open/16384AEAD open throughput per core (receiver open-only, 16 KiB 720p inter-frame): frame_bytes ÷ median time/iter
alm_tree_depth_vs_n1.74 µs/frame @ 4-tier depth (per-hop = value ÷ 4)alm_chain_hop/208ALM 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_sec5215.23 traces/s/corereplication_ingest/ingest_newReplication ingest rate (fresh signed trace: verify → decompose → persist): 1e9 ÷ median time/iter
stream_fanout_core_frac0.0158 core-fraction @ N=2000, 30fpsstream_fanout_seal_tick/2000Publisher 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_agent50.08 µs/agent @ N=500 traces (window cap)n_eff_e2e/500Per-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):

Benchmarked against the field — per layer

No single "PQC streaming" suite exists, so each layer is held next to its recognized reference.

layerCIRISServer (this run)reference
PQ KEM (X25519+ML-KEM-768)hybrid KEX 160.9 µsliboqs ML-KEM-768: encap ~95 / decap ~118 µssrc
PQ handshake tax+82.7 µs once/peer-linkPQ-TLS (Cloudflare/AWS): ~80–150 µs ML-KEM overheadsrc
E2E media AEADtwo-layer AES-256-GCM, up to 2.34 GiB/sSFrame (RFC 9605): AES-GCM E2E, SFU-forwardablesrc
Group rekeyflat 3.394 / tree 0.407 ms @N=50OpenMLS / PQ-MLS combiner: O(log n)src
Store verifyhybrid ingest 194.36 µsliboqs ML-DSA-65 verify ~0.40 mssrc

Provenance & honesty

Raw criterion means (51)
benchmean
alm_chain_e2e_blob/tiers/11.375 µs
alm_chain_e2e_blob/tiers/21.810 µs
alm_chain_e2e_blob/tiers/32.254 µs
alm_chain_e2e_blob/tiers/42.708 µs
alm_chain_hop/163843.242 µs
alm_chain_hop/2080.437 µs
av_fanout_plan_5015.073 µs
av_frame_e2e/163847.050 µs
av_frame_e2e/262144104.257 µs
av_frame_e2e/3200.956 µs
av_frame_e2e/40962.403 µs
av_frame_e2e/6553627.447 µs
av_frame_halves/open/163843.062 µs
av_frame_halves/open/26214447.430 µs
av_frame_halves/open/3200.426 µs
av_frame_halves/open/40961.088 µs
av_frame_halves/open/6553612.206 µs
av_frame_halves/seal/163843.457 µs
av_frame_halves/seal/26214447.847 µs
av_frame_halves/seal/3200.518 µs
av_frame_halves/seal/40961.224 µs
av_frame_halves/seal/6553612.351 µs
av_mesh_fanout/naive/26.527 µs
av_mesh_fanout/naive/50187.169 µs
av_mesh_fanout/naive/828.763 µs
av_mesh_fanout/shared_inner/25.322 µs
av_mesh_fanout/shared_inner/5089.535 µs
av_mesh_fanout/shared_inner/815.897 µs
av_rekey/flat_rewrap/2136.967 µs
av_rekey/flat_rewrap/503394.159 µs
av_rekey/flat_rewrap/8591.151 µs
av_rekey/tree_rewrap/268.300 µs
av_rekey/tree_rewrap/50407.413 µs
av_rekey/tree_rewrap/8202.666 µs
n_eff_compute/10014.246 µs
n_eff_compute/208.313 µs
n_eff_compute/50042.122 µs
n_eff_e2e/5011.113 µs
n_eff_e2e/50050.473 µs
n_eff_matrix_build/1001.517 µs
n_eff_matrix_build/500.835 µs
n_eff_matrix_build/5007.445 µs
pqc_kex/classical_initiate38.899 µs
pqc_kex/classical_respond39.351 µs
pqc_kex/hybrid_initiate67.006 µs
pqc_kex/hybrid_respond93.922 µs
replication_ingest/ingest_dedup176.237 µs
replication_ingest/ingest_new194.356 µs
stream_fanout_seal_tick/1000262.287 µs
stream_fanout_seal_tick/2000526.974 µs
stream_fanout_seal_tick/500127.251 µs