Skip to content

Get started ​

Callx turns a push from your backend into a real phone call: the system incoming-call UI on iOS and Android, answer and decline from anywhere, and a call state your app can trust. This page explains the pieces; the next pages install them. Callx also provides native media integration, video surfaces, Android PiP and optional call UI. See the capabilities and screenshots.

Not sure which pages apply? Personalize your setup to get a checklist for your framework, platforms, UI, media and backend. Then follow your first real call.

The pieces of a call ​

You provideCallx provides
A backend that creates calls and sends an APNs VoIP push or an FCM data messageReceiving that push natively, deciding whether it may ring, reporting it to the OS
A media engine, or the LiveKit adapterStarting and stopping media at the right moment, from any surface
Your call screens, or branding and controls for the optional UI componentsA snapshot of the call, typed commands, replay, and optional overlay/mini-call UI
APNs and Firebase credentials, on your serverThe incoming-call screen and notification on Android, CallKit on iOS

Requirements ​

Minimum
iOS15.0, Xcode 26 or later, Swift 6
AndroidAPI 29 (Android 10), compile SDK 36
FlutterFlutter 3.41, Dart 3.11
React Native0.76 (New Architecture or legacy), React 18
ExpoSDK 57 with a development build (not Expo Go)

iOS push delivery needs a physical device. Android emulators with Google Play services can receive FCM, though physical phones are still required for vendor and real-audio acceptance. The iOS Simulator cannot receive VoIP pushes and ends CallKit calls immediately; the Android emulator works for most flows.

Choose your path ​

Then add audio: install the LiveKit adapter, or connect your own media. Want to look around first? Run the simulator, which needs no backend, no device and no credentials.

A complete first call, step by step ​

  1. Install and bootstrap Callx for your framework (the quick starts above).
  2. Register the push token: callx.getPushToken() (TypeScript) or Callx.pushToken() (Dart) returns {type: 'voip' | 'fcm', token}. Send it to your backend.
  3. Send an invitation from your backend: an APNs VoIP push or an FCM data message with a callx payload. Payload reference →
  4. The phone rings natively, even if the app was killed.
  5. Answer. Callx tells your host to start media (the adapter does it for you), and your UI sees the call move from incoming to connecting.
  6. Media connects. The call becomes active.
  7. Hang up from either side. Both phones clean up, and a late push for the same call can never ring again.

Released under the MIT License. No telemetry, in the library or on this site.