← Back to Open SourceOpen Source / React Native / Android Telecom

react-native-telecom

Native Android telecom and call UI for React Native New Architecture — Kotlin, Jetpack Core-Telecom, and TurboModules.

Abdul Moiz Dev@itxmoizdevv0.1.0AndroidTurboModulesminSdk 26

What is react-native-telecom?

react-native-telecom is an open-source Android telecom library for React Native New Architecture. It provides native incoming and outgoing call UI, Jetpack Core-Telecom session handling, CallStyle notifications, lock-screen full-screen incoming UI, ringtone and vibration, mute, hold, speaker / earpiece / Bluetooth audio routes, DTMF events, and FCM wake support.

The package is implemented as a TurboModule with a TypeScript API and customizable Android XML layouts. It is Android-first (minSdk 26). iOS CallKit support is planned and not available in the current release.

Why it exists

From Alo Voice constraints to a reusable native layer

react-native-telecom was created from a production engineering constraint in Alo Voice: the product needed reliable native Android calling behavior while using React Native New Architecture.

The existing react-native-callkeep-based approach created compatibility constraints in the project's New Architecture setup. Instead of treating that only as a JavaScript package problem, I investigated the Android telecom layer and built a Kotlin approach around Jetpack Core-Telecom, CallStyle notifications, and TurboModules.

react-native-callkeep remains a widely downloaded React Native calling package — npm currently shows 50K+ weekly downloads for that ecosystem. react-native-telecom was created from a different requirement: a native Android telecom architecture aligned with the project's React Native New Architecture.

react-native-callkeep on npm ↗ · See the Alo Voice case study

The Alo Voice engineering origin

  1. Alo Voice VoIP product

    React Native calling app with Telnyx media and native Android call presentation needs.

  2. New Architecture constraint

    CallKeep-based integration did not fit the project's New Architecture requirements cleanly.

  3. Android telecom investigation

    Moved into Jetpack Core-Telecom, CallStyle, lifecycle, audio session, and FCM wake behavior.

  4. TurboModule native layer

    Built a Kotlin TurboModule boundary for telecom + call UI, not a media engine.

  5. react-native-telecom

    Open-sourced as an Android-first package for New Architecture VoIP apps.

Architecture

The library owns Android telecom session state and call UI. Media engines stay in the application and attach through audio-session events.

  1. React Native app

    TypeScript API: setup, displayIncomingCall, startCall, mute, hold, routes, DTMF, events.

  2. TurboModule bridge

    New Architecture native module surface between JS and Kotlin.

  3. Kotlin telecom layer

    Jetpack Core-Telecom session lifecycle and Android Telecom registration.

  4. Call UI

    CallStyle notifications plus full-screen incoming / in-call Activities (overridable XML).

  5. Audio session events

    didActivateAudioSession / didDeactivateAudioSession for attaching a media engine.

  6. Your media engine

    Telnyx, WebRTC, LiveKit, or similar — connected by the app, not bundled in the library.

Android Telecom stack

Jetpack Core-Telecom

Uses androidx.core:core-telecom for modern Android telecom session lifecycle instead of treating ConnectionService as the primary path.

CallStyle notifications

System CallStyle notifications for Answer / Decline / End, with a quieter ongoing notification after answer.

Full-screen incoming UI

Lock-screen capable full-screen Activity using showWhenLocked and USE_FULL_SCREEN_INTENT patterns documented in the repo.

Ringtone & vibration

Default ringtone and vibration behavior that respects silent / vibrate / normal device modes.

Audio routes

Earpiece, speaker, and Bluetooth SCO route control through the library API.

Customizable layouts

Apps can override rn_telecom_incoming_call.xml and rn_telecom_incall.xml while keeping documented view ids.

React Native New Architecture / TurboModules

react-native-telecom is designed as a TurboModule library for React Native New Architecture. The TypeScript API talks to a Kotlin native implementation rather than relying on a legacy bridge-first calling stack.

That choice matches the Alo Voice requirement: keep native call presentation and telecom lifecycle correct even when the broader app stack is moving onto Fabric / TurboModules.

Related positioning lives in Engineering Focus — Native Android / Kotlin.

Incoming call lifecycle

  1. Push or JS triggers an incoming call (FCM via TelecomPushBridge when JS may be unavailable).
  2. Native layer registers / updates the Core-Telecom session and shows CallStyle + optional full-screen UI.
  3. User answers or declines from notification or full-screen UI.
  4. didActivateAudioSession fires so the app can attach Telnyx / WebRTC / LiveKit media.
  5. Mute, hold, DTMF, and audio-route events stay synchronized with telecom state.
  6. End call → didDeactivateAudioSession → app tears down media.

Audio session lifecycle

  1. Telecom owns call UI and telecom state; media engines stay outside the library.
  2. didActivateAudioSession is the attach point for peer connections or Telnyx sessions.
  3. didDeactivateAudioSession is the detach / hang-up point for media.
  4. Mute / hold / route changes emit events so media state can stay aligned with telecom state.

FCM wake flow

  1. When the app is backgrounded or killed, the JavaScript runtime may not be available.
  2. FirebaseMessagingService can call TelecomPushBridge.handleIncomingCall with high-priority data.
  3. Native code can present the incoming call UI without waiting for JS bootstrap.
  4. Foreground JS can also use handlePushMessage for data payloads when the runtime is alive.

Media-engine boundary

react-native-telecom is UI + Telecom infrastructure. It does not ship Telnyx, WebRTC, LiveKit, or Twilio binaries.

Apps show native call UI with displayIncomingCall / startCall, attach media on didActivateAudioSession, and tear media down on didDeactivateAudioSession. Mute and DTMF events can be forwarded into the app's signaling or media SDK.

Comparison with react-native-callkeep

This is an architectural comparison for New Architecture Android VoIP apps — not a claim that CallKeep is abandoned, deprecated, or broken.

Android API focus

react-native-telecom centers on Jetpack Core-Telecom. react-native-callkeep historically focuses on ConnectionService-era Android calling patterns.

React Native bridge

react-native-telecom is TurboModule / New Architecture first. CallKeep remains widely used in existing apps; this package targets projects that need a New Architecture-aligned native boundary.

Native language

react-native-telecom is implemented in Kotlin with a TypeScript API surface.

Call UI

CallStyle notifications plus customizable full-screen incoming and in-call screens.

Media boundary

Neither package is a complete media stack. react-native-telecom documents audio-session events as the integration point for Telnyx, WebRTC, or LiveKit.

Platform coverage

react-native-telecom is Android-first today; iOS CallKit is planned. CallKeep already covers CallKit on iOS for many apps.

Current platform support

Supported: Android (minSdk 26)

Not currently supported: iOS CallKit (planned), Web, desktop.

React Native New Architecture is required. Physical devices are recommended for Telecom / CallStyle / full-screen intent testing — emulators are often unreliable for those paths.

AndroidminSdk 26TurboModulesNew ArchitectureMIT

FAQ

What is react-native-telecom?

react-native-telecom is an open-source Android telecom and call UI library for React Native New Architecture, built with Kotlin, Jetpack Core-Telecom, and TurboModules. It handles native incoming/outgoing call presentation and telecom session lifecycle; it is not a media engine.

Is react-native-telecom an alternative to react-native-callkeep?

It is an Android-focused alternative approach for the same job — native VoIP call UI — built around Jetpack Core-Telecom and React Native New Architecture / TurboModules. It does not claim to be an official CallKeep replacement or that CallKeep is abandoned.

Does react-native-telecom support React Native New Architecture?

Yes. The project is designed around TurboModules and React Native New Architecture.

Is react-native-telecom a media engine?

No. It provides Android telecom and call UI infrastructure. Media engines such as Telnyx, WebRTC, or LiveKit can be connected through audio-session events. Those SDKs are not bundled.

Does it support iOS?

Not currently. The project is Android-first; iOS CallKit support is planned and not available in the current release.

What Android version does it support?

Current minimum SDK is 26 (Android 8.0).

Why was react-native-telecom created?

It originated from Alo Voice engineering work. The project needed reliable native Android calling behavior under React Native New Architecture, and the existing CallKeep-based integration created compatibility constraints. Investigating Jetpack Core-Telecom and building a Kotlin TurboModule layer led to the open-source package.

Can it work with Telnyx?

Yes, through the documented audio-session integration boundary (didActivateAudioSession / didDeactivateAudioSession). Telnyx is not bundled inside the library.

Does it support incoming calls when JavaScript is unavailable?

The package includes TelecomPushBridge so native FCM handling can present an incoming call when the JS runtime may not be running. Exact OEM and process-state behavior still depends on Android permissions, OEM policies, and correct high-priority FCM setup.

Who maintains react-native-telecom?

Abdul Moiz Dev (@itxmoizdev).

Install with npm install react-native-telecom. Maintained by Abdul Moiz Dev (@itxmoizdev).