Télécom
Telz : des appels internationaux au prix affiché d'avance
Depuis 2023, nous sommes l'équipe Android derrière Telz, une application d'appels internationaux à bas prix. Nous avons fait d'un client SIP open source un produit payant, avec des tarifs affichés d'avance et des recharges.
Fiche projet
- Client
- Telz (Nettia, Finlande)
- Année
- 2026
- Durée
- Depuis 2023, en cours
- Plateformes
- Android
- Technologies
- Kotlin, VoIP / SIP, Compose
- 3+ ans Partenariat continu — Fonctionnalités, mises à jour de la plateforme et support depuis 2023
- 54 Versions dans le changelog — Livrées avec le lead interne du client, de 2023 à 2026
- 36 Langues et régions — Dont l'arabe, l'hébreu et le persan, de droite à gauche
Ce qui a fait la différence
- Tarif à la minute et type d'appel affichés avant chaque appel international
- Fork de Linphone migré couche par couche vers Hilt, des view models MVI et Compose
- Tests d'interface sur de vrais appareils Kobiton et contrôles de traduction pour 36 langues et régions
Telz vend des appels internationaux depuis 2012. Son application Android est née d'un fork de Linphone, le client SIP open source : un moteur d'appel fiable dans une interface pensée pour un softphone générique, pas pour quelqu'un qui appelle sa famille dans un autre pays. Depuis 2023, notre équipe travaille sur l'application aux côtés du lead interne du client : nous livrons des fonctionnalités, suivons chaque version d'Android et faisons passer la base de code à un Kotlin moderne sans mettre la roadmap à l'arrêt.
La mission en une phrase : faire d'un softphone générique un produit d'appel pour lequel les gens paient, continuer à publier des versions et ne pas toucher au cœur SIP qui a fait ses preuves.
Le point de départ
La base Linphone offrait à Telz une VoIP fiable, mais tout ce qui entourait l'appel restait générique. Les premières minutes dans l'application ne disaient presque rien du prix, de la confidentialité ou du fonctionnement des recharges. Le code mélangeait plusieurs générations de patterns Android, si bien que même de petites modifications prenaient plus de temps que nécessaire.
Ce que nous avons construit
Le prix avant l'appel
Quand un utilisateur touche un contact, Telz associe le numéro à un pays et présente les options : un appel internet via Wi-Fi ou données mobiles, ou un rappel où Telz fait sonner les deux interlocuteurs. Chaque option affiche son tarif à la minute, et nous avons ajouté une ligne qui indique combien de minutes le solde actuel permet. Le choix prend une seconde, et la facture ne réserve aucune surprise.
Un onboarding qui répond aux premières questions
Le nouvel onboarding est écrit en Jetpack Compose. Trois écrans courts couvrent ce qu'un nouvel utilisateur veut savoir : aucune inscription au-delà d'un numéro de téléphone, des recharges dans n'importe quelle devise, et des enregistrements d'appels qui restent sur l'appareil. Une grille tarifaire avec sélecteur de devise est à un geste, et une courte note sur la protection des données s'affiche avant la connexion.
Paiements et croissance
Nous avons fiabilisé le parcours d'achat Google Play face aux échecs de chargement des produits et aux catalogues vides, construit des paramètres de paiement avec recharge automatique et ajouté un bonus de parrainage avec codes promo. Les référents d'installation et les achats validés sont transmis à AppsFlyer, pour que le marketing voie quels canaux amènent des utilisateurs payants.
Suivre le rythme d'Android
Chaque version d'Android touche à quelque chose dont une application d'appel dépend. Nous sommes passés aux mises en page edge-to-edge pour Android 15, avons préparé l'application aux pages mémoire de 16 Ko, déplacé le travail de Linphone sur son propre thread, ajouté les mises à jour natives dans l'application et un observateur réseau, et traité un à un les rapports de crash et d'ANR.
Moderniser sans tout réécrire
Une réécriture complète aurait gelé la roadmap pendant des mois. Nous avons remplacé les fondations couche par couche, pour que chaque version contienne encore du travail produit.
| Domaine | Ce que nous avons fait | Pourquoi c'est important |
|---|---|---|
| Injection de dépendances | Hilt dans toute l'application et l'intégration Linphone | Un seul endroit pour les singletons, des composants testables |
| Présentation | View models de style MVI avec état, événements et effets ponctuels | Des écrans prévisibles, aucun événement de navigation perdu |
| Nouvelle interface | Jetpack Compose dans la navigation par fragments existante | Les nouveaux écrans arrivent sans toucher aux anciens |
| Réseau | Coroutines et un wrapper de résultat typé, anciens appels RxJava conservés | Les endpoints migrent un par un |
| Numéros de téléphone | Sélecteur de pays et validateur maison basés sur libphonenumber | Des numéros E.164 corrects, donc des tarifs corrects |
| Qualité | Tests Robot Framework et Appium sur de vrais appareils Kobiton via GitHub Actions | Les régressions apparaissent sur du vrai matériel avant la sortie |
Une application, 36 langues et régions
Les utilisateurs de Telz appellent au-delà des frontières, alors l'interface parle leurs langues, dont l'arabe, l'hébreu et le persan, qui se lisent de droite à gauche. Un contrôle des traductions signale les textes manquants ou incohérents avant chaque sortie.
Ce dont le client dispose aujourd'hui
- Un parcours d'appel où le prix et le type d'appel sont clairs avant la première sonnerie
- Une base de code où les nouveaux écrans sont construits en Compose sur une architecture cohérente
- Des versions qui suivent les évolutions de la plateforme Android au lieu de courir derrière
- Une suite de tests de régression automatisée qui tourne sur de vrais appareils
Vous faites tourner un produit Android sur un cœur open source qui doit devenir quelque chose pour lequel vos clients paient ? Nous serions ravis de l'examiner avec vous.