No server
AirLink has no server, no account, no registration and no directory. Identity is a pair of keys generated on the device. Messages and calls move only between devices in radio or local-network range. The apps do not use push notifications. Nothing is sent to the internet by the messaging or calling code.
The More screen on iPhone and iPad contains a link to a website. It opens only if you tap it.
Primitives
All cryptography comes from Apple's CryptoKit.
| Purpose | Primitive |
|---|---|
| Identity signing | Ed25519, long-term |
| Identity key agreement | X25519, long-term |
| Fingerprint | First 8 bytes of SHA-256 over both public keys |
| Message sealing | HPKE (RFC 9180): DHKEM X25519, HKDF-SHA256, ChaCha20-Poly1305, base mode, info airlink-mesh-hpke-v1 |
| Message authorship | Ed25519 signature over the message identifier and text, inside the ciphertext |
| Call key agreement | Ephemeral X25519 per call, exchanged inside sealed signalling |
| Call keys | HKDF-SHA256, salt airlink-call-v1, one 32-byte key per direction |
| Call frames | ChaCha20-Poly1305, sequence number as nonce and associated data |
| Storage | ChaCha20-Poly1305 with a 256-bit key held in the Keychain |
| Random identifiers | SecRandomCopyBytes, 16 bytes per message |
What is protected
- Content. Only the recipient can open a message. Relays carry ciphertext.
- Authorship. The sender's keys and signature travel inside the ciphertext. A relay learns nothing about who wrote a message from the message itself.
- Integrity. A tampered message, a message re-labelled with a new identifier, and a tampered voice frame all fail to open and are dropped.
- Length. Messages are padded to buckets of 256, 512, 1,024, 2,048 or 4,096 bytes, so size reveals only the bucket.
- Replay of call audio. A 64-frame window drops repeated frames.
- Numbers. A number is derived from the device's keys, and every message is signed by those keys, so a device cannot speak as a number it does not own.
What an observer can see
Anyone scanning Bluetooth nearby
- That an AirLink device is present, from the fixed service UUID in its advertisement.
- The device's Bluetooth address, which the operating system manages and rotates. AirLink cannot add protection at this layer.
Any device that connects to the mesh
Connecting needs no pairing or password. Any device speaking the protocol receives:
| Visible | Where |
|---|---|
| Your chosen name and both public keys | Hello packets, which are not encrypted |
| Your fingerprint and number | Derived from the public keys |
| Who a message is for | The recipient fingerprint in every packet header |
| Message, receipt, hello or voice | The kind byte in the header |
| When it was sent | The timestamp in the header |
| Size bucket | The payload length |
| That a call is in progress, and with whom | Voice packets addressed to a fingerprint, 50 a second |
| The call's frame count | The plaintext sequence number on each voice frame |
A relay therefore sees a sealed box addressed to a fingerprint, and can match that fingerprint to a name from the recipient's hellos. It does not see who sent the box.
Anyone on the same local network
- The Bonjour services AirLink publishes:
_airlink._tcpwith a random per-launch name, and_airlinkcall._udpnamedcall-and eight characters for each call. - The same packets as above, carried over TCP without TLS. Their payloads are already sealed.
- Call audio on the direct path is sealed per frame.
Limits of the design
- No forward secrecy for text. Messages are sealed to the recipient's long-term key. Someone who records the mesh and later obtains a recipient's private key can open that recipient's recorded messages. Call audio uses fresh keys for every call.
- Verification is by people. The only defence against someone substituting their own keys is two people comparing numbers or fingerprints. A 40-bit number read aloud is a convenience, not strong authentication.
- Traffic analysis. Receipts, call beacons and voice cadence form recognisable patterns. AirLink does not claim resistance to traffic analysis.
- Denial of service. A nearby radio can flood the mesh with traffic. The bounds are a payload cap of 8,192 bytes, validation before any relay, a bounded duplicate table and a per-link queue that sheds whole packets. There is no per-sender rate limit.
- Unauthenticated hellos. A hello is not signed. A device can announce any name with any keys. It cannot read messages sealed to someone else's keys, and it cannot sign as them.
What is stored on the device
On the Mac, files live in ~/Library/Application Support/AirLink and ~/Library/Logs/AirLink. On iPhone and iPad, the same names inside the app's own container.
| Item | File | Protection |
|---|---|---|
| Identity: both private keys and your name | identity.bin | Sealed with the storage key. File mode 0600 |
| Message and call-event text | conversations.json.db (SQLite) | Each body sealed with the storage key |
| Contact cards | Same database | Each card sealed with the storage key |
| Message metadata: peer fingerprint, time, direction, delivered, kind | Same database | Not encrypted. File mode 0600 |
| Names you give contacts, and names saved against a number | Same database | Not encrypted |
| Your display name and whether to join the mesh at launch | App preferences | Not encrypted |
| Finder names, favourites and notes for Bluetooth devices | devices.json | Not encrypted |
| Activity log, including names met, numbers and message identifiers | Logs/AirLink/activity.log | Not encrypted. Appended to, not rotated |
| Lab spool, only when lab mode is on | Logs/AirLink/lab-<session>.jsonl | Not encrypted |
The storage key is a 256-bit key created on first use and kept in the Keychain, available after first unlock so that a call arriving at a locked phone can still be recorded. If the Keychain refuses to create or return the key, AirLink stores bodies and cards in plaintext rather than fail to save. A tampered sealed row refuses to open.
Remove Device deletes the conversation, the name and the card for that person from the database. The rows are deleted by SQLite; the file is not overwritten.
The finder's matching of rotating Bluetooth addresses is kept in memory for the session only and never written to disk.
On iPhone and iPad, calls are not added to the system's recent calls list.
Lab mode
Lab mode exists for measurement sessions. It is off by default, switched on by hand in Settings, and lapses after three hours. While on, it writes events to a spool file on the device and streams them over the local network to a collector running on a Mac, found through Bonjour.
The events are message identifiers, fingerprints, sizes, hop counts, timings, call milestones, audio counters, link changes, app state and battery level. They do not include message text or audio.