What it is
AirLink carries sealed text messages and live encrypted voice calls between nearby devices, with no internet, no SIM, no phone number, no account and no server. Devices find each other over Bluetooth Low Energy and over Wi-Fi, including Apple's peer-to-peer Wi-Fi when there is no shared network, and treat the two as one link.
Each device is addressed by a short number derived from its own keys, such as A3F9-K2P1. There is no directory to register with and none to compromise.
AirLink also includes a signal-strength finder for locating a nearby Bluetooth device by walking towards it.
What it does
- Chats. Text messages up to 3,500 characters, sealed to the recipient. Delivery is confirmed by a sealed receipt from the recipient.
- Calls. Voice calls with fresh keys for every call. Audio starts over the mesh and moves to a direct Wi-Fi path when one proves it works. On iPhone and iPad, calls appear in the system call screen.
- Relaying. A message addressed to someone not directly in range is passed on by other AirLink devices that are connected at the time.
- Retrying. A message that has not been confirmed is offered again to every device that connects.
- Finding. Nearby Bluetooth devices with a live signal reading, a distance range and a warmer or colder indicator. On iPhones with ultra-wideband, precision finding adds a direction arrow to another AirLink iPhone.
Platforms
| Requirement | |
|---|---|
| Mac | macOS 14 or later |
| iPhone and iPad | iOS 18 or later |
| Command line | airlink, shipped inside the Mac app bundle. It runs the finder, not the messaging |
The shared engine, AirLinkCore, is one Swift package compiled unchanged into the Mac app, the iPhone and iPad app and the command-line tool.
How it fits together
Chat and calls (ChatModel, CallModel)
|
Mesh node: seal, route, retry, receipts (MeshNode)
|
Flooding router with hop limit and duplicate table (FloodRouter)
|
Composite transport
| |
Bluetooth LE (GATT) Wi-Fi (Bonjour, TCP, peer-to-peer)
Call audio: Opus frames, sealed per frame, sent over the mesh
and a direct UDP path at the same time until the direct path proves itself.Key figures
| Figure | Value |
|---|---|
| Packet header | 41 bytes |
| Largest packet payload | 8,192 bytes |
| Hop limit | 8, 6 or 5, set by how many devices are in range |
| Message encryption | HPKE (RFC 9180): X25519, HKDF-SHA256, ChaCha20-Poly1305 |
| Sender signature | Ed25519, inside the ciphertext |
| Call encryption | Ephemeral X25519 per call, HKDF-SHA256, one ChaCha20-Poly1305 key per direction |
| Voice codec | Opus, 24 kHz mono, 20 ms frames, 24 kbit/s |
| Voice frame on the mesh | 121 bytes, 48.4 kbit/s at 50 frames per second |
| Measured message latency, one hop | 34 ms median, 129 ms 90th percentile |
| Tests | 188, plus one opt-in benchmark |
The performance page gives the conditions behind every measured figure.
Read next
- User guide to go on the air, message and call.
- How it works for the transports, routing and calls.
- Wire format for every byte.
- Security and privacy for what is sealed and what is not.
- The technical report for the design in prose.