Skip to content

Astradial Mobile Apps — Strategy & Overview

Status (June 2026): active project. iOS first, Android second. This supersedes the earlier Flutter softphone experiment (Astradial Softphone App), which remains documented for reference but is no longer the forward path.

The one-line strategy

Linphone engine underneath, native Apple Phone-app UI on top.

Hard rule: no Flutter, no cross-platform UI frameworks

The UI is pure Swift / SwiftUI on iOS (and native Kotlin on Android in phase 2). No Flutter, React Native, or any other cross-platform UI layer — they cannot reproduce the stock dialer's look, feel, haptics, and accessibility behaviour pixel-perfectly. The earlier Flutter app is retired.

We build the Astradial mobile apps on top of Linphone — the most mature open-source SIP stack with production-grade iOS/Android apps — but we replace its UI entirely with a UI that is indistinguishable from the platform's native dialer. On iOS that means a 100% visual and behavioural match with the stock iOS Phone app (Keypad, Recents, Contacts, Favourites, Voicemail).

Layer What we use What we change
SIP / media engine linphone-sdk (liblinphone, mediastreamer2, belle-sip) Nothing — keep all of it
Call features Linphone's call logic: register, in/out calls, hold, transfer, DTMF, conference, CallKit/PushKit integration, audio routing, echo cancellation Keep the functionality, re-skin every screen
UI / UX Fully rebuilt to match the native iOS Phone app, SwiftUI
Branding & provisioning Astradial accounts, QR provisioning against our PBX

Why Linphone

  • Battle-tested SIP stack. liblinphone has 20+ years of SIP interop behind it — far beyond what sip_ua/Flutter or a hand-rolled PJSIP wrapper gave us (see the 32-bit ARM crashes documented in the Flutter softphone doc).
  • First-class iOS support. The official app already solves the hard iOS problems: CallKit integration, PushKit/VoIP push wake-up, background SIP registration, audio session management, bluetooth/ speaker routing. We inherit all of it.
  • GPLv3 open source, commercially used. Belledonne Communications develops it in the open; we fork the app layer, keep the SDK as a dependency.
  • Same engine on Android. linphone-android gives us the identical feature set for phase 2, so call behaviour is consistent across platforms.

Licence note

linphone-iphone (the app) is GPLv3. Building our app from this codebase means the app's source is subject to GPLv3 obligations if distributed. Belledonne also sells proprietary licences for the SDK. Decide before App Store submission: either comply with GPLv3 (publish source) or buy a commercial licence from Belledonne. Track this as an open business decision — it does not block development.

Build order

  1. Phase 1 — iOS (astradial-ios, fork of linphone-iphone). Native iOS Phone-app UI; all Linphone calling features. See iOS App and the iOS UI Spec.
  2. Phase 2 — Android (astradial-android, fork of linphone-android). Same approach: keep the engine, rebuild the UI to match the stock Samsung Galaxy Phone app (One UI) — not Pixel/Material You. Started June 2026 (repos created, local clone building). Uses a clean split (public OSS dialer vs. private Firebase/analytics overlay). See Android App, Android UI Spec, and Android Status.

Product requirements (v1, iOS)

The two non-negotiables, in priority order:

  1. Native iOS UI/UX — 100% match with the stock iOS Phone app. Anyone who has used an iPhone must feel zero learning curve. Same five tabs, same layouts, same typography, same animations, same haptics. The screen-by-screen reference (with screenshots from the stock app) lives in the iOS UI Spec.
  2. All Linphone calling functionality, registered against the Astradial PBX:
    • SIP registration (Astradial account, QR provisioning like the existing softphone flow)
    • Outbound + inbound calls, CallKit native in-call screen
    • Call logs (Recents) from Linphone call history
    • Contacts (iOS address book + SIP addresses)
    • Hold / mute / speaker / bluetooth routing
    • DTMF, attended & blind transfer, multi-call / conference
    • VoIP push (PushKit) for inbound calls when the app is killed — requires a server-side push gateway (Linphone uses Flexisip for this; how we provide push from Astradial's Asterisk is an open architecture question, tracked in iOS App → Open questions)

Out of scope for v1: chat/IM, video calls, end-to-end encryption UI, meetings. liblinphone supports them; we hide them until there's a product reason.

Repos

Repo Upstream Status
astradial-ios (local: ~/AstradialDevelopment/Mobile App/astradial-ios) BelledonneCommunications/linphone-iphone Cloned June 2026 — phase 1 active
astradial-android-oss (public) → astradial-android (private); local ~/AstradialDevelopment/Mobile App/astradial-android BelledonneCommunications/linphone-android Cloned June 2026 — phase 2 active (clean split)
call_dial_app (Flutter) Superseded; kept for reference

Relationship to existing Astradial infrastructure

The mobile app is a SIP client like Zoiper or the Flutter app before it. Server-side nothing changes for basic calling:

  • Registers to the same per-environment SIP endpoints (devsip.astradial.com:5060 prod, stagesip.astradial.com:5080 staging) over UDP/TCP/TLS — liblinphone does not need the WebRTC/WSS path the Flutter app used, so the webrtc=yes / admin-only gating problem disappears.
  • Credentials come from the same QR provisioning payload the editor already renders (Users → SIP icon) — see QR provisioning.
  • Calls hit the same multi-tenant Asterisk on the cloud VPS; CDRs, recordings, tickets, queues all behave as for any SIP endpoint.

The one genuinely new server-side requirement is VoIP push for inbound calls (see open questions in the iOS App doc).