Web Wallet vs Native Wallets

Which transports run where. The dividing line is one question: can the platform open a raw UDP WireGuard socket? The browser sandbox can’t; desktop and mobile can.

CapabilityWebBrowser sandboxDesktopRust native appMobileiOS (Swift) / Android (Kotlin)
dVPN / nym-smol-dvpn (WireGuard)no raw UDP socket in the sandboxvia uniffi bindings
nym-smolmixvia uniffi bindings
mixFetch / mixWS (mixnet HTTP)tx broadcast

Why dVPN is native-only

No raw UDP WireGuard socket

dVPN mode needs to open a UDP WireGuard socket. The browser sandbox does not allow raw UDP sockets, so dVPN is unavailable to web wallets — it is not that browsers are slow at UDP, but that the API does not exist in the sandbox.

QUIC bridges blocked by Web PKI

The QUIC-bridge fallback is also unavailable in the browser sandbox: the bridges' TLS uses self-signed certificates, while the sandbox enforces Web PKI — a CA-issued certificate matching the hostname — and this is not how the bridges work, so the self-signed bridge certificate is rejected.

Web wallets — mixnet only

A web wallet is therefore limited to the mixnet-only path (mixFetch / mixWS) for transaction broadcast and cannot use the hybrid — it gets the sensitive-broadcast half but not the fast dVPN sync half. It still owes the Layer-2 baseline hygiene (V2 broadcast delays, V3 start-height obfuscation) exactly like a native wallet: mixFetch protects in-transit timing against L3L/L3G, but the destination still sees arrival timing, so the wallet must add its own delays.

Mobile — Swift / Kotlin via uniffi

iOS (Swift) and Android (Kotlin) wallets are native and can open UDP sockets, so they get the full hybrid. Rather than reimplement the stack, they reuse the nym-smolmix and nym-smol-dvpn Rust crates through uniffi (Mozilla), which generates the Swift and Kotlin bindings — one Rust core, native frontends. As on every platform, the Layer-2 baseline hygiene remains the app's responsibility, implemented in the Swift/Kotlin/Rust app code, not in the crates' transport.

The sandbox removes a transport option; it does not remove the wallet’s Layer-2 duties. See Baseline hygiene and the recommended architecture.