Built for app developers. Engineered for privacy.

DropOnAir gives your app secure messaging primitives without forcing you to build and maintain messaging infrastructure.

Security

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
const encrypted = await client.encrypt(message, recipientPublicKey);

// 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 ✓

Reliability

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
Visibility

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.

PENDING

In local queue

📤
SENT

Reached server

📬
DELIVERED

Recipient device

👀
READ

Opened by user

// Listen for status updates
client.onMessageStatus(event => {
  const { messageId, status } = event;
  // status: SENT | DELIVERED | READ
  updateUI(messageId, status);
});
Calling

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
// Start a call
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.

Multi-Device

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.

🌐 Web⚛ React🅰️ Angular🟢 Vue📱 React Native🟦 TypeScript