Limitations
- Both people need AirLink open. A device that is not running AirLink cannot be woken by another device. The app does not use push notifications, because there is no server to send them.
- Delivery windows. An unconfirmed message is kept by the sending device and offered to every device that connects, but only while AirLink keeps running, and receivers drop any packet older than six hours. A message that is not delivered within six hours of sending is not delivered.
- Relays do not carry messages later. A device relaying someone else's message forwards it at once to the links it has and keeps no copy. A message reaches someone out of range only through devices that are connected along the way at the time.
- Unconfirmed messages stay marked as sending. The app does not yet mark an expired message as failed.
- Message size. The composer allows 3,500 characters. The sealed envelope must also fit in one 8,192-byte packet, which limits a message to 4,091 bytes of UTF-8. Text in scripts that need two to four bytes per character can reach that limit before 3,500 characters, and such a message is not delivered.
- No forward secrecy for text. Messages are sealed to long-term keys.
- Verification is manual. Comparing numbers in person is the only check against someone substituting keys.
- Plaintext presence. Your chosen name and public keys are broadcast in hellos to any device that connects.
- No jitter buffer. Received voice frames are played as they arrive.
- Not measured on Bluetooth alone. Calls over Bluetooth LE are designed to fit, but the one measured session ran with Wi-Fi available and Bluetooth carried almost nothing.
- Three devices measured. Behaviour in larger groups is untested.
- Apple platforms only. macOS 14 and later, and iOS 18 and later.
- The command line does not message. The
airlinktool runs the finder only. - Precision finding needs ultra-wideband on both iPhones. No iPad or Mac has the radio. Elsewhere, the finder uses signal strength and shows a range, not a direction.
Troubleshooting
Nobody appears
- Check that both devices pressed Go on the air in Chats, and that AirLink is open on both.
- Check Bluetooth is on, and that AirLink has Bluetooth and Local Network permission in Settings. On the Wi-Fi transport, a missing Local Network permission fails silently; the Activity log shows "Wi-Fi listener waiting" or "Wi-Fi browser waiting".
- Bring AirLink to the front. Coming back to the app reconnects anything the system suspended and announces the device again.
- Open Activity. It shows whether each radio is scanning, advertising and linking.
A message stays at "sending"
The recipient's sealed receipt has not come back. Either the recipient is not reachable now, or the message has not reached them. Keep AirLink open: the message is offered again to every device that connects, for up to six hours in practice.
A call rings but has no sound
- Grant microphone permission. Without it a call cannot start.
- The call screen shows the road the audio is on. If it stays on the mesh, the direct Wi-Fi path has not proved itself, which is normal without a shared network.
- Open Activity. The call logs its audio state: frames sent, received and played, microphone level and incoming level. These distinguish a silent microphone from a path that never delivered.
The other person hears themselves
On a Mac where the system's voice processing cannot run, AirLink uses its own echo canceller. If it makes things worse, it resets, and after three resets it switches itself off for the rest of the call. Its measured performance so far comes from a bench simulation, not a device.
My number changed
A number changes only if the identity file is replaced. If AirLink cannot read the file at launch, for example because the Keychain is locked, it runs that session on a temporary identity and leaves the file alone. The real number returns at the next launch that can read it.
The Mac keeps asking for Bluetooth permission
The permission follows the app's code signature. Build with a stable signing identity, as scripts/build-app.sh does when one is available.
FAQ
Does it work with no Wi-Fi at all?
It is designed to. Bluetooth LE carries the whole mesh, including Opus voice at 24 kbit/s, and peer-to-peer Wi-Fi needs no router. The one measured session had a shared Wi-Fi network, so a Bluetooth-only measurement has not yet been made.
Do I need an account or a phone number?
No. Your identity is a pair of keys generated on your device, shown as an eight-character number.
Can someone in the middle read my messages?
No. Messages are sealed to the recipient with HPKE, and the sender's identity travels inside the ciphertext. A relay sees who a message is for, when it was sent and its size bucket, not its content or its author.
Is a message stored on other people's phones?
No. Devices relay others' messages immediately and keep no copy. Only the sender and the recipient store it.
Are calls private?
Every call agrees fresh keys, and every 20 ms frame is sealed with a key for its direction. A device nearby can tell that two devices are in a call, but not what is said.
Does AirLink record who is around me?
The finder's matching of rotating Bluetooth addresses is kept in memory only. The Activity log on the device does record people met by name and number; it is not encrypted.
How far does it reach?
Range has not been measured. A message can travel up to eight hops when few devices are nearby, and each hop is one Bluetooth or Wi-Fi link.