diff --git a/README.md b/README.md index d58bd85..7ac41a2 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,61 @@ quicprochat/ - **Dynamic plugins** — load `.so`/`.dylib` at runtime via `--plugin-dir` (6 hook points) - **Mesh networking** — iroh P2P, mDNS discovery, store-and-forward, broadcast channels +### Mesh & P2P Features + +The `quicprochat-p2p` crate provides a full **serverless mesh networking stack**: + +| Feature | Module | Description | +|---------|--------|-------------| +| **P2P Transport** | `P2pNode` | Direct QUIC connections via iroh with NAT traversal | +| **Mesh Identity** | `MeshIdentity` | Ed25519 keypairs with 16-byte truncated addresses | +| **Mesh Envelope** | `MeshEnvelope` | Encrypted, signed, TTL-aware message containers | +| **Store-and-Forward** | `MeshStore` | Queue messages for offline recipients | +| **Multi-Hop Routing** | `MeshRouter` | Distributed routing table, forward through intermediaries | +| **Announce Protocol** | `MeshAnnounce` | Signed peer discovery with capability flags | +| **Broadcast Channels** | `BroadcastManager` | Pub/sub with symmetric key encryption | +| **Transport Abstraction** | `TransportManager` | Iroh, TCP, LoRa — route by address type | +| **LoRa Transport** | `transport_lora` | Duty-cycle aware, fragmentation, SF12 support | +| **MLS-Lite** | `mls_lite` | Lightweight symmetric mode for constrained links | +| **FAPP** | `fapp` + `fapp_router` | Free Appointment Propagation Protocol (see below) | + +#### FAPP — Decentralized Appointment Discovery + +**Problem:** In Germany, finding a psychotherapist takes 3–6 months due to artificial slot visibility limits. + +**Solution:** FAPP lets licensed therapists announce free slots into the mesh. Patients discover and reserve slots anonymously — no central registry. + +```rust +// Therapist publishes slots +let announce = SlotAnnounce::new( + &therapist_identity, + vec![Fachrichtung::Verhaltenstherapie], + vec![Modalitaet::Praxis, Modalitaet::Video], + vec![Kostentraeger::GKV], + "80331", // PLZ only, never exact address + slots, + approbation_hash, + sequence, +); +fapp_router.broadcast_announce(announce)?; + +// Patient queries anonymously +let query = SlotQuery { + fachrichtung: Some(Fachrichtung::Verhaltenstherapie), + plz_prefix: Some("803".into()), + kostentraeger: Some(Kostentraeger::GKV), + ..Default::default() +}; +fapp_router.send_query(query)?; +``` + +**Privacy model:** +- Therapist identity is **public** (bound to Approbation hash) +- Patient queries are **anonymous** (no identifying information) +- Reservations use **E2E encryption** to therapist's key + +See [`docs/specs/fapp-protocol.md`](docs/specs/fapp-protocol.md) for the full protocol spec. + ### Client SDKs | Language | Location | Transport | Notes |