# Prior-Art Research Index — Entry Point

Cross-cut indexes over 12 mapper-produced index files covering the prior-art corpus behind
`docs/research/SPT Networked Messaging Research Brief.md`. The Brief ranks 5 candidate stacks
(Iroh, rust-libp2p+DCUtR, Iroh+mdns-sd, Veilid, Mainline DHT + Magic Wormhole) for SPT's
single-binary Rust inter-agent messaging on Windows + Unix with no central operator and no
credentials. This dir reduces those 12 mapper files into top-level navigation aids.

## Repo layout

| Path | Lines | Purpose |
|---|---|---|
| `articles/INDEX.md` | 213 | Blog posts, news coverage, vendor pages (12 files) |
| `docs/INDEX.md` | 525 | Crate API docs (docs.rs, lib.rs), project sites, libp2p docs (44 files) |
| `forums-wikis-videos/INDEX.md` | 185 | Forum threads, Wikipedia, CCC talk on Noise (14 files; 3 gated by bot walls) |
| `papers/INDEX.md` | 106 | 6 arxiv papers + Ford bford.info reprint (NAT traversal evidence trail) |
| `rfcs-specs/INDEX.md` | 298 | 12 docs: RFC 6762/4795/8489/8656/8445/9420 + Noise + Syncthing + XEP-0174 + did:key + SSDP |
| `repos/iroh.md` | 324 | n0-computer/iroh @ 1.0.0-rc.0 — Rank 1 candidate workspace map |
| `repos/rust-libp2p.md` | 177 | libp2p/rust-libp2p @ 0.57.0 — Rank 2 candidate (DCUtR+Kad+gossipsub) |
| `repos/quinn.md` | 155 | quinn-rs/quinn — pure-Rust QUIC stack (powers iroh + libp2p-quic) |
| `repos/magic-wormhole.md` | 195 | magic-wormhole.rs @ 0.8.1 — SPAKE2 short-code pairing ceremony |
| `repos/veilid.md` | 165 | veilid-core @ 0.5.3 — Rank 4 (privacy-first, all-nodes-relay) |
| `repos/vpn-cluster.md` | 514 | nebula + innernet + headscale — coordinator patterns (NOT VPN model for SPT) |
| `repos/low-priority.md` | 161 | min-sized-rust (BORROW) + 8 SKIP/REFERENCE repos |
| `README.md` | this file | Entry point + decision tree + caveats |
| `topics.md` | — | Topic-keyed cross-cut (NAT, identity, DHT, transport, LAN, etc.) |
| `tags.md` | — | Unified tag taxonomy + counts |
| `citations.md` | — | Brief footnote [^N] reverse-index |
| `themes.md` | — | Opinionated read-orders by cluster |

## Start here for X

- **Implementing iroh dial-by-pubkey?** → `repos/iroh.md` §Dial by pubkey + `docs/INDEX.md` §iroh + `papers/INDEX.md` arxiv-2408-01791 (QUIC HP)
- **Symmetric NAT / CGNAT fallback strategy?** → `papers/INDEX.md` arxiv-2510-27500 (70% real rate) + `forums-wikis-videos/INDEX.md` HN P2P-QUIC thread + `articles/INDEX.md` oneuptime UDP hole-punch walkthrough
- **Self-host the relay?** → `repos/iroh.md` §Relay self-hosting + `docs/INDEX.md` `docs-iroh-computer-add-a-relay.html`
- **SPAKE2 short-code pairing UX?** → `repos/magic-wormhole.md` (cheat sheet at bottom) + `articles/INDEX.md` vlaicu-io-posts-wormhole
- **Noise handshake (XX or IK)?** → `rfcs-specs/INDEX.md` §noise-protocol + `docs/INDEX.md` `docs-rs-snow.html` + `forums-wikis-videos/INDEX.md` 34c3 Trevor Perrin talk
- **LAN mDNS discovery wire format?** → `rfcs-specs/INDEX.md` RFC 6762 §11/§18/§8 + XEP-0174 §3 + `docs/INDEX.md` `docs-rs-mdns-sd-latest.html`
- **Mainline DHT rendezvous (no central server)?** → `forums-wikis-videos/INDEX.md` wiki/mainline + `docs/INDEX.md` `docs-rs-mainline.html` + `papers/INDEX.md` arxiv-2402-09993 (Kademlia churn at scale)
- **Pubkey-as-identity prior art?** → `rfcs-specs/INDEX.md` §syncthing-device-ids + `repos/veilid.md` §Identity + `docs/INDEX.md` `ssbc-github-io-ssb-db.html`
- **Binary-size shrinking?** → `repos/low-priority.md` §min-sized-rust + `articles/INDEX.md` dev-to-ahaoboy bloaty-metafile + `repos/iroh.md` §Binary size knobs + `repos/quinn.md` §Binary size knobs + `repos/rust-libp2p.md` §Binary size knobs
- **Windows Firewall first-bind UX?** → `docs/INDEX.md` `learn-microsoft-com-...windows-firewall-rules.html` + `forums-wikis-videos/INDEX.md` reddit/sysadmin (gated) + Brief §2.8
- **DCUtR (relay-coordinated hole punch) protocol?** → `docs/INDEX.md` `libp2p-io-docs-dcutr.html` + `repos/rust-libp2p.md` §DCUtR + `forums-wikis-videos/INDEX.md` discuss-libp2p forum thread
- **QUIC hole punching in libp2p?** → `repos/rust-libp2p.md` §Hole punching (PR #3964) + `repos/quinn.md` §Hole-punching
- **Coordinator-pattern reference (NOT for SPT)?** → `repos/vpn-cluster.md` (headscale NodeStore copy-on-write, innernet invitation-TOML, nebula punch signaling)
- **MLS for >2-perch rooms?** → `rfcs-specs/INDEX.md` RFC 9420 §6 framing + §17.2 wire formats
- **Mesh VPN comparison & why all fail?** → `articles/INDEX.md` (Yggdrasil, Tailscale stub), `docs/INDEX.md` (tailscale/zerotier/wireguard/yggdrasil), `forums-wikis-videos/INDEX.md` (Tailscale vs ZT debates), Brief §2.6 + §3
- **arxiv evidence trail for the Brief?** → `papers/INDEX.md` (all 6 papers + bford reprint, with section pointers and per-paper relevance)
- **Anonymity-mode fallback (Tor / Veilid)?** → `repos/veilid.md` + `docs/INDEX.md` `docs-rs-tor-hsservice-latest.html` + `articles/INDEX.md` `forum-torproject-...arti.html`

## Major caveats (mapper-surfaced contradictions / upstream changes)

1. **`iroh::NodeId` → `EndpointId` rename (Brief uses obsolete names).** Brief §5 and most prior literature say `NodeId` / `NodeAddr`. As of `iroh = 1.0.0-rc.0` these are renamed `EndpointId` / `EndpointAddr` (`repos/iroh.md` §Endpoint + identity, gotcha #last). SPT code must use the new names.

2. **`discovery-local-network` feature flag no longer exists.** Brief §5 recipe says `iroh = { version = "0.90", features = ["discovery-local-network"] }`. In 1.0-rc this is factored out into the external crate `iroh-mdns-address-lookup`; the in-tree subsystem is `address_lookup` (`repos/iroh.md` lines 10-14 + 102-118). SPT must pull the companion crate or implement the `AddressLookup` trait.

3. **DCUtR success rate: 60% vs 70% vs 82%.** Brief §1 Rank 2 cites 60% (libp2p forum thread). Brief §2.2 cites 82% (Ford 2005). `papers/INDEX.md` arxiv-2510-27500 (2025 production measurement) says **70% ± 7.1%** is current — Ford's 82% reflects NATs of that era; today's CGNAT/symmetric prevalence drops it. Plan capacity accordingly.

4. **TCP vs QUIC for hole punching: statistically equal.** Brief §2.2 implicitly favors UDP/QUIC. `papers/INDEX.md` arxiv-2510-27500 finds TCP and QUIC traversal success rates "statistically indistinguishable" (~70% each). Don't dismiss TCP fallback for QUIC-blocked networks (corp firewalls, some carriers).

5. **`noq` (n0's vendored quinn fork) is required for iroh 1.0.** Workspace pins `noq` / `noq-proto` / `noq-udp` to `n0-computer/noq` git `main`. SPT must add the same `[patch.crates-io]` block or cargo resolves to nonexistent crates.io versions (`repos/iroh.md` gotcha #7).

6. **Iroh `Endpoint::online()` pends forever with no relays AND no WAN.** SPT's offline-first / LAN-only paths must skip `online()` or set a timeout (`repos/iroh.md` lines 47-48, gotcha #3).

7. **Veilid `Target::NodeId` is rejected by default.** Without the `footgun` feature, `app_call`/`app_message` to a `NodeId` fail. SPT integration must always exchange `RouteBlob`s (`repos/veilid.md` §App-level send/recv + gotcha #5).

8. **Veilid app payload cap is 32 KiB, not 64 KiB.** Brief §1 Rank 4 says "64 KB per RPC frame." `repos/veilid.md` §Frame cap clarifies: 64 KiB is the envelope; the app-visible `app_message`/`app_call` cap is **32768 bytes**. App must shard above that.

9. **libp2p-quic ships independently from the libp2p meta-crate.** `libp2p = 0.57.0` but `libp2p-quic = 0.14.0`; breaking changes in `libp2p-quic` don't block meta releases. SPT must pin both (`repos/rust-libp2p.md` gotcha #1).

10. **iroh public relays vs n0 dependency.** Brief §1 Rank 1 says "default relays are operated by n0.computer ... trivially self-hosted." `repos/iroh.md` recommends `presets::Minimal` over `presets::N0` so SPT never silently phones home to `iroh.link` (the n0-operated pkarr/DNS lookup). Self-hosting path is real but requires explicit config.

11. **Magic Wormhole rendezvous is plain `ws://` by default.** Cleartext channel (PAKE-encrypted contents are safe regardless), but a censoring middlebox blocking port 4000 breaks pairing. `wss://` requires picking a `tls` feature (`repos/magic-wormhole.md` gotcha #1).

12. **Magic Wormhole `tls` feature is deprecated.** Prefer `futures-rustls-platform-verifier` or `native-tls` (`repos/magic-wormhole.md` gotcha #2).

13. **3 forum URLs + 1 wiki are bot-walled.** `forums-wikis-videos/INDEX.md` saved-HTML for reddit/opensource (Veilid sentiment, Brief [^27]), reddit/sysadmin (Windows Firewall UX, [^76]), reddit/WebRTC (OpenRelay TURN, [^37]), and icannwiki RFC 6762 ([^78]) are verification interstitials. Refetch with a real browser if quotes needed; Brief's summaries remain valid citation anchors.

14. **`articles/INDEX.md` Tailscale article is a 502 stub** (15 bytes). Brief [^58] citation needs refetch if Tailscale-specific evidence is required; Brief's existing disqualification (SSO account required) stands without it.

15. **Veilid bootstrap key V0 (unsigned) is deprecated.** V1 signed-bootstrap is the only safe choice for a private network (`repos/veilid.md` §Bootstrap config). SPT must generate its own signing keypair via `veilid-server --generate-key-pair VLD0`.

## Coverage gaps (mapper-noted missing sources)

- **No HTML for raw `quinn` crate page** (only `iroh-quinn` fork). Brief [^41][^42] link to GH. — `docs/INDEX.md` line 520
- **No HTML for `arti-client`** (only `tor-hsservice`). — `docs/INDEX.md` line 521
- **No HTML for `openmls` / MLS spec.** Brief [^62][^63] reference RFC 9420 but no copy here. — `docs/INDEX.md` line 522 (NB: rfcs-specs/INDEX.md DOES cover RFC 9420 directly)
- **No HTML for arxiv abstracts.** Brief cites [^35][^36][^43][^79][^80][^81][^82] but only PDFs locally. — `docs/INDEX.md` line 523 (papers/ does have these)
- **No HTML for Syncthing local-discovery spec.** Brief [^19][^20][^33] cited; only in `rfcs-specs/INDEX.md`. — `docs/INDEX.md` line 524
- **No HTML for `magic-wormhole.rs` GitHub repo.** Only readthedocs + docs.rs. — `docs/INDEX.md` line 525 (NB: `repos/magic-wormhole.md` covers the full repo workspace)
- **No live benchmarks for Veilid** bandwidth/CPU; only config-inferred steady-state — `repos/veilid.md` §Bandwidth/CPU profile
- **Brief §4 Open Questions are not yet researched here.** Specifically: (Q1) relay operator commitment, (Q2) libp2p bootstrap strategy, (Q3) pairing UX scope, (Q4) delivery semantics, (Q5) Nostr signaling relay set, (Q6) Veilid bandwidth tolerance, (Q7) Windows code signing, (Q8) CGNAT user UX.
- **No deep coverage of `nostr-sdk`** (only `nostr` crate + `nostr.watch`). Brief [^54][^55] cite both — `nostr-sdk` would need a fresh map if pursued for signaling.
- **No prior-art for SQLite spool design** (SPT-specific) — the cross-cluster review in `repos/vpn-cluster.md` is the closest borrow.
