Built for app developers. Engineered for privacy.
DropOnAir gives your app secure messaging primitives without forcing you to build and maintain messaging infrastructure.
End-to-end encryption by default
Messages are encrypted on the sender's device before they leave. The DropOnAir server relays encrypted blobs — it never has access to plaintext content.
- ✓ Client-side key generation per conversation
- ✓ Blind relay — server cannot read content
- ✓ Forward secrecy support
- ✓ Zero knowledge at rest
// Server only sees:
"eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTI1NkdDTSJ9..."
// Only the recipient can decrypt
const plaintext = await client.decrypt(encrypted);
Message queued for offline user
Waiting for reconnection…
Delivered automatically on reconnect ✓
Offline message delivery
When a recipient is offline, messages are durably queued and pushed to their device the moment they reconnect — no polling, no missed messages.
- ✓ Configurable queue size per user
- ✓ FIFO delivery order preserved
- ✓ Works across mobile app restarts
- ✓ Configurable message retention window
Delivery receipts & read status
Know exactly what happened to every message. Receipts are pushed to the sender in real-time via the same WebSocket connection.
In local queue
Reached server
Recipient device
Opened by user
client.onMessageStatus(event => {
const { messageId, status } = event;
// status: SENT | DELIVERED | READ
updateUI(messageId, status);
});
Voice & video calls, built in
Add real-time voice and video calling to your app in minutes. DropOnAir handles the signaling layer over the same encrypted WebSocket used for messages — you supply the WebRTC peer connection.
- ✓ Invite, ring, accept, reject, end — full lifecycle
- ✓ SDP offer/answer + ICE candidate relay
- ✓ Toggle video on/off mid-call
- ✓ Short-lived TURN credentials for NAT traversal
- ✓ Voice-only or video calls
const callId = await client.startCall('user-id');
// React to events
client.onCallEvent(event => {
if (event.type === 'CALL_ACCEPTED')
startWebRtcNegotiation(event.callId);
});
// End the call
await client.endCall(callId);
Same user, multiple devices
Each device has its own E2EE keypair. Messages are encrypted per-device and delivered everywhere simultaneously.
Seamless multi-device support
Users can log in from phone, tablet, and desktop at the same time. The SDK generates a unique keypair per device, encrypts a separate payload for each, and the server fans messages out to every active session.
- ✓ Per-device X25519 keypairs
- ✓ Transparent per-device encryption
- ✓ Server-side fan-out to all devices
- ✓ Backward compatible with single-device clients
- ✓ No client code changes required
Open-source SDKs for every platform
JavaScript SDK is available now, and more language SDKs are on the roadmap. Integration patterns stay consistent across languages.