UDX
A reliable, multiplexed transport over UDP, modelled on QUIC. It handles congestion control, connection migration and path MTU discovery.
DocumentationOpen-source P2P libraries for Dart and Go
Connect devices directly, with no central server in the path. cryptopeer provides a UDP transport, a complete libp2p stack for Dart and Flutter, and store-and-forward messaging for peers that are offline.
dart_libp2p: ^2.0.0const udx = '/ip4/0.0.0.0/udp/0/udx';final a = await createHost(listen: udx);final b = await createHost(listen: udx);
// Authenticated with Noise, multiplexed over UDXawait a.connect(AddrInfo(b.id, b.addrs));print('Connected to ${b.id}');Three families of libraries. Each builds on the one below it, and each can be used on its own.
A reliable, multiplexed transport over UDP, modelled on QUIC. It handles congestion control, connection migration and path MTU discovery.
DocumentationA full libp2p implementation for Dart and Flutter, with Noise, Yamux, relays, hole punching and the protocols built on top.
DocumentationStore-and-forward messaging and storage, modelled on email. Servers hold messages and documents until the recipient comes online.
The same stack exists in Dart and in Go. A Flutter app and a Go server speak the same transport and protocols, so they connect directly.
| Layer | Dart | Go |
|---|---|---|
| Applications | Ricochet client | Ricochet servergo-p2p-forge |
| Protocols | GossipSubKademlia DHTBitswapMerkle-CRDT | go-libp2p pubsub, kad-dht upstream |
| libp2p | dart_libp2p | go-libp2p upstream |
| Transport | dart_udx | go-udxUDX transport |
| Network | UDP, secured with Noise. Dart and Go peers connect to each other directly. | |
Every peer is an Ed25519 key. Each connection runs a Noise handshake that proves both identities, with no accounts or certificate authorities.
Phones sit behind carrier NATs and change networks mid-session. Connection migration, relays and hole punching keep them reachable.
Ricochet servers hold messages and documents for peers that are offline. Payloads can be end-to-end encrypted so the server never reads them.
Both languages share the wire formats. Where the formats must match byte for byte, both repositories test against the same vectors.