Skip to content

Troubleshooting ​

Start with the symptom. Turn on the bootstrap's log option first; its lines explain most problems without exposing tokens or payloads.

The phone does not ring ​

CheckHow
The push reached the deviceAndroid: onPushReceived in your listener. iOS: Console.app, filter by your process
It was a Callx invitationhandlePush returns false for messages without a callx field
It was allowed to ringonInvitationRejected / invitationRejected gives the outcome: Duplicate, Busy, Expired or Ended
expiresAtMs is in the futureCompare with the device clock; skewed clocks expire invitations early
iOS: VoIP token and topic matchTopic is <bundle id>.voip; sandbox tokens only work with api.sandbox.push.apple.com
iOS: Do Not Disturb or FocusCallKit refuses the report; the call is recorded as failed
Android: high priority, no notification blockandroid.priority: HIGH; compare delivered and original priority in onPushReceived
Android: app force-stoppedNo FCM is delivered until the user opens the app again
Android: vendor battery managerSee Android
Android: device has no TelecomBootstrap throws UnsupportedOperationException; nativeCalling is false

It rings as a notification, not full screen (Android) ​

Android shows the full-screen incoming screen only when the device is locked or the screen is off; in use, a heads-up notification is correct. If it never goes full screen, Android 14+ may have denied full-screen intents: check CallxFullScreenIntent.isAllowed(context).

Answered, but no audio ​

CheckHow
Media was startedAdapter: started.media is Adapter(...). Your own: onCallAnswered / callAnswered fired
Microphone permissionWithout it, LiveKit stays listen-only. The prompt cannot appear on the lock screen; ask earlier
iOS: audio waits for didActivateYour engine must start audio in didActivate, with automatic session handling off
Android: no competing routerTurn off your SDK's route manager; route with requestAudioEndpoint
CredentialsLiveKit: check the token endpoint answers {url, token} for that callId

A call that stays connecting means mediaConnected was never reported. That is media, not signaling.

Setup errors ​

ErrorCause
nativeUnavailableThe app was not rebuilt after installing, or you are on web or Expo Go
notConfigured, or nativeCalling: falseThe bootstrap did not run before setup, or it failed
invalidArgument with "contract version"Native and JavaScript or Dart parts come from different versions; reinstall and rebuild
Android manifest merge fails on minSdkSet minSdk to 29
iOS: No such module 'callx'Flutter: run flutter pub get and rebuild. RN: pod install
Bootstrap throws IllegalStateExceptionTwo media adapters are installed; remove one

State and observation ​

SymptomCause
Observer stopped receivingAnother session replaced it, or the runtime was replaced (account switch) without re-subscribing
resynced on reopenYour cursor is older than the retained journal; adopt the snapshot
queryOperation returns unavailablePending, never received or pruned; reconcile with your backend before retrying
generationMismatchThe login changed, or the host did not restore a stable accountGeneration
A call disappeared from the snapshotEnded calls are removed after five minutes; keep your own history

Still stuck? ​

Open a GitHub issue with the platform, OS version, device model, Callx version, framework version and the bootstrap's log lines around the problem. Remove tokens and personal data first.

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