A modern SIP client that just rings.
Halcyon is a low-latency Android softphone built on PJSIP, integrated deeply with Android Telecom, and woken by FCM the instant a call arrives — so it doesn't burn your battery holding a TLS register all day.
Built on a real telephony stack.
Not a wrapper around a WebRTC demo. Halcyon ships PJSIP + native codecs and treats Android Telecom as a first-class citizen.
PJSIP / pjsua2
Battle-tested SIP & media stack with ICE, outbound, and full RFC 8599 push parameters.
SRTP & AEC3
Encrypted media with WebRTC AEC3 echo cancellation. ZRTP support is on the roadmap.
FCM call-aware push
Sleep until your registrar pings you. Battery-friendly, sub-second wake-to-ring.
Default phone app
Self-managed ConnectionService handles tel:, sip:, and the lock screen.
Bluetooth & Android Auto
Telecom-native audio routing — headsets, car stereos, and watches just work.
Multi-account
Run several SIP identities side by side with a per-call account picker.
Audio & video codecs
Opus, G.722, AMR-WB, G.729 — plus VP8/VP9 and MediaCodec H.264 on arm64.
Material 3 UI
Compose, dynamic color, edge-to-edge. A SIP client that actually looks like 2026.
Push wakes the phone. PJSIP rings it.
A call-aware push contract keeps the device asleep until your PBX has something to say — then we ring through Android's own call UI.
Register with your PBX
Halcyon registers over UDP, TCP, or TLS, advertising RFC 8599 push params so the registrar knows how to wake you.
FCM wakes the device
Right before the INVITE, your registrar sends a data-only FCM. No 24/7 socket, no battery hit, no relay in the middle.
Telecom rings the call
A self-managed ConnectionService takes over: lock screen, Bluetooth, Android Auto, audio focus — all native.
Why Halcyon?
Most market-leading softphones rely on opaque push relays, dated UI, and bolt-on Android integration. Halcyon is built the other way around: a self-hostable, transparent path from your PBX to your pocket.
- No third-party relay. Your PBX talks directly to FCM — nobody else sits in the call path.
- Native by design. Telecom
ConnectionService, default-dialer role, Bluetooth and Android Auto routing built in, not retrofitted. - Open architecture. Documented push contract and a stable
SipEngineinterface — swap PJSIP for another stack without rewriting the app.
Install Halcyon.
The Play Store listing is on the way. In the meantime, grab the latest signed APK from GitHub Releases — or build from source.
Download the APK
Latest pre-1.0 builds are published to GitHub Releases. The Play Store listing will land here once Halcyon ships its first stable release.
Build from source
Two commands. Halcyon builds without the native PJSIP library — UI development is unblocked from day one.
export ANDROID_NDK_HOME=/path/to/android-ndk-r26d
./scripts/build_pjsip.sh
./gradlew :app:assembleDebug
Common questions.
Is Halcyon free?
Yes. Halcyon is in active pre-1.0 development and is free to install and use. Pricing and licensing for the 1.0 release will be announced before launch.
Which Android versions are supported?
Android 8.0 (API 26) and newer, on arm64-v8a, armeabi-v7a, and x86_64. Video codecs (VP8, VP9, H.264) are currently only compiled into the arm64-v8a build.
Will Halcyon replace my system dialer?
Only if you ask it to. Halcyon registers a PhoneAccount per SIP identity so the call UI lights up regardless. If you grant the default-dialer role, all tel: and sip: intents — including from contacts and Bluetooth — ring on Halcyon.
Does it work without server-side push?
Yes. Halcyon falls back to a foreground SIP service when push isn't configured, at the usual battery cost of a permanent TLS register. Push is recommended — see the FCM contract for the registrar-side details.
Is there an iOS version?
Not today. Halcyon is Android-first; Telecom integration and self-managed connections are the whole point. A desktop build is in the repository for testing the SIP stack on Linux.