Hop is a pure-Rust core you embed in your iOS and Android app. It carries end-to-end encrypted, store-and-forward messages device to device, across BLE, Wi-Fi, and the public internet when it's there, so your app keeps working when the network doesn't. One library, two addressing modes: reach the internet, or reach a device.
Both are the same machinery with a different destination. You don't pick a transport or plan a route, you address a bundle and Hop carries it.
A device with no connection emits a sealed HTTP request. Any gateway node fulfills it and relays the sealed response back to your device's key, eventual, but guaranteed.
Send a sealed message to another device's public key. The bundle hops until the destination receives it, confidential the whole way, even across relays you don't trust.
Everything rides on one sealed datagram. The higher layers rebuild the guarantees you expect, reliability, ordering, HTTP, pub/sub, at the endpoints, where they need no live circuit in the middle.
Hop's UDP: a connectionless, end-to-end encrypted, addressed datagram that's store-and-forwarded across the mesh. Held when there's no onward path, never dropped. All Hop traffic rides on hdp.
The same request/response semantics as HTTP, carried as sealed datagrams. An operator runs a hop-endpoint for their own domain, it is the origin, never an open proxy, so there's no third party in the middle.
Topic-based broadcast and discovery over the same fabric, region-aware so a topic never ships to a region with no subscribers.
Resolve hops://example.com to an address with one HTTPS fetch of the domain's /.well-known/hop. TLS proves the domain, the signed reach record proves the address, so a name can't be forged into the wrong key. No central resolver.
Hop isn't limited to tiny messages. A payload that fits travels as one sealed bundle; anything larger is transparently split into ordered, individually-sealedchunks and reassembled into the original on the far side, id, order, acks, and dedup all preserved. The size cap is a sliding window, not a ceiling, so even video streams through.
A small message is a single sealed datagram, stored, forwarded, delivered as one unit.
A large payload (a file, an image, an HTTP response) auto-splits into ordered sealed chunks and reassembles into the original bundle.
Open-ended data (SSE, media) rides progressive stream chunks, in order, deduped, and resumable after a gap.
Below all of this, each bundle is fragmented into link frames sized to whatever bearer it crosses (BLE MTU, L2CAP CoC) and reassembled at the next hop, so the wire never limits how big a message can be.
The library never owns your keys, you hand it a 32-byte secret and it does the rest. Everything below the radio is pure Rust and unit-testable.
X25519 + ChaCha20-Poly1305 sealed payloads; Ed25519-signed headers; Noise XX links between peers.
One Ed25519 keypair is identity, address, and seal. Import a seed, export a seed, storage is yours.
A small copy budget fans across independent paths in parallel; first arrival wins. No flooding.
Persistent forward queue with dedup and custody transfer, bounded by bundle lifetime.
GATT for control, L2CAP CoC for bulk, with fragmentation and reassembly handled for you.
Find peers, services, and names the moment you meet anyone who has seen them.
You construct a node from a secret, address a sealed payload to a device key or to the internet, and Hop handles the rest, fragmentation, relaying, retransmit, dedup, and delivery acknowledgement.
Illustrative shape, the real API spans hop-core and the native FFI bindings.
The SDK is free and source-available. Add the hosted backbone when your users need to reach across regions and oceans.