nym-smol-dvpn (per-app dVPN client)

A per-app dVPN client (1- or 2-hop WireGuard) with a post-quantum PSK created at registration and a QUIC bridge if WireGuard is censored. No timing obfuscation — the caller must add it.

Runtime: Rust — native apps (mobile / desktop)dVPN (WireGuard)Speed: Fast
dVPN (WireGuard)
Wallet appEntry GWExit GWlightwalletd

Network path over the Nym network (mostly block downloads, some uploads). See the client data-flow pipeline below for how requests are chunked into WireGuard packets and how replies return.

ClientEntry GWExit GWlightwalletd
dVPN (WireGuard) (no mixing)

Client data-flow pipeline

Goodput ≈ 90%2 packets · on-wire 2.4 KBpayload 2.1 KBupload · client → entry GW

A few KB — the ideal mixnet broadcast workload. Goodput ≈ 90% — WireGuard framing is the only overhead.

Wallet app (client) — nym-smol-dvpnSendTransaction2.1 KBIP stacksmoltcpWireGuardboringtunEntry GWon the wire →SendTransaction 2 WireGuard packets on the wire (2.4 KB):1500 B1380940 B8201500 B MTU − 2 × 60 B WireGuard headers ⇒ 1380 B payload/packet (variable size, UDP).
WireGuard packet on the wireWireGuard hdr — entry (~60 B)WireGuard hdr — exit (~60 B)payload (≤1380 B)

Pick a gRPC message to see how it fragments and frames inside the client, and what fraction of on-wire bytes carry real payload (goodput). Replies return as regular WireGuard packets.

Latency model

Regional (40)Continental (120)Intercontinental (300)
dVPN (WireGuard)360 ms (3 hops)
Geographic propagation (speed-of-light)

What to send over it

  • Block syncs
  • Low-latency, high-bandwidth requests

Notes

  • Post-quantum PSK created at registration
  • QUIC bridge available if WireGuard is censored
  • Timing obfuscation must be done by the caller (out-of-order, buffered requests)
  • Fast

Per-actor assessment (inherited)

The same four threat actors apply. This architecture inherits the assessment of the configuration it implements: dVPN · single exit. Layer-2 baseline hygiene remains the wallet’s responsibility.

Sees

  • Exit gateway IP
  • All requests and contents

Can't see

  • Client IP

Residual / countermeasure

  • P2 fails within a session: the tunnel delivers one NATed flow and, with gRPC, the whole sync typically uses one long-lived HTTP/2 connection. Across sessions, linkage depends on crowding at the exit IP.
  • Rotate the exit per request to restore P2 — see the multiple-exits scenario.

Sees

  • Sync fingerprint — WireGuard adds no cover and preserves packet timing

Sees

  • End-to-end flow correlation

Residual / countermeasure

  • The 2-hop route only prevents a single gateway from linking client to destination (entry knows the client IP but not the destination; exit knows the destination but not the client IP). Both gateways colluding, or a global observer, can still correlate — the extra hop does not add protection over Tor's guard+exit.
Baseline hygiene applies here tooWhatever the transport, the wallet still owes the same Layer-2 discipline: randomize request times, obfuscate the start height, and never broadcast on reaching the tip.Full detail →