norbel.ambanumben
arrow_back cd ~/projects
OONI Probe
folder_open

Project

OONI Probe

cat ~/projects/ooni_probe.md

calendar_today

Last updated:

OONI Probe (Multiplatform)

OONI (Open Observatory of Network Interference) est un projet à but non lucratif et open-source qui mesure la censure d’Internet et les interférences réseau dans le monde entier. OONI Probe est l’application installée par les utilisateurs pour effectuer ces mesures ; les résultats sont publiés en données ouvertes et ont servi à documenter le blocage de sites web, d’applications de messagerie et d’outils de contournement dans plus de 200 pays.

OONI Probe Multiplatform est la réécriture consolidée en Kotlin Multiplatform qui remplace les anciennes applications Android, iOS et Desktop par une base de code unique, tout en livrant des binaires natifs sur Google Play, F-Droid, Huawei AppGallery, l’App Store, le Microsoft Store, macOS et Linux. La même base de code alimente également la variante News Media Scan (NMS) destinée aux organisations de défense de la liberté de la presse.

Avant la réécriture, les applications iOS et Android vivaient dans des bases de code natives distinctes — ooni/probe-ios (Swift) et ooni/probe-android (Java/Kotlin) — chacune avec son propre pipeline de publication, son propre pont vers le moteur de mesure Go partagé, et son interface construite deux fois. J’ai maintenu ces deux dépôts avant et pendant la migration vers le multiplateforme, ce qui m’a permis d’apporter à la réécriture l’historique opérationnel des anciennes applications : ce sur quoi les utilisateurs comptaient, ce qui était pénible à garder synchronisé entre deux stacks, et les comportements à préserver lors de la transition.

Je suis ingénieur principal sur le projet consolidé et y contribue depuis le tout premier pont moteur iOS mi-2024. Je continue d’en être l’un des principaux mainteneurs pour les cibles iOS et Desktop, ainsi que pour l’infrastructure transverse qui les soutient.

Ce que fait l’application

  • Exécute des tests Web Connectivity pour détecter les sites web bloqués.
  • Exécute des tests de messagerie instantanée pour des applications comme WhatsApp, Telegram, Signal et Facebook Messenger.
  • Exécute des tests d’outils de contournement pour Tor, Psiphon et d’autres.
  • Exécute des tests de performance et de middlebox (NDT, Dash, HTTP Header Field Manipulation, HTTP Invalid Request Line).
  • Soumet les résultats au collecteur OONI afin qu’ils apparaissent, avec toutes leurs métadonnées réseau, sur OONI Explorer.
  • Permet d’ajouter des descripteurs de tests personnalisés et de lancer des campagnes de mesure ciblées via les deeplinks Run v2.

Mon rôle

  • Cible iOS — pont entre le moteur de mesure oonimkall écrit en Go et Kotlin/Native, développement des fonctionnalités spécifiques à la plateforme, et maintenance du pipeline de publication.
  • Cible Desktop (Windows, macOS, Linux) — mise en place et maintenance de la plateforme bureau, incluant l’empaquetage, les deeplinks, les mises à jour automatiques, le comportement de la barre d’état et des fenêtres, ainsi que les migrations depuis les anciennes versions desktop.
  • Fonctionnalités transverses — implémentation de fonctionnalités à l’échelle de l’application dans le code Kotlin Multiplatform partagé, notamment les paramètres et la configuration du proxy, le stockage sécurisé, la gestion réseau et GeoIP, et la gestion des résultats.
  • Architecture et infrastructure — refactorisation des modules partagés vers un Kotlin plus idiomatique, migration des couches internes vers des bibliothèques modernes, et support du système de build multi-flavor qui produit à la fois OONI Probe et la variante News Media Scan.
  • Release engineering — CI/CD sur Android, iOS et Desktop, rapport de plantages, et pipelines de publication pour les différents app stores et canaux de téléchargement direct.

Technologies

  • Partagé : Kotlin Multiplatform, Compose Multiplatform, Coroutines, Ktor, SQLDelight, Koin
  • Android : Jetpack Compose, WorkManager, pipelines de publication Google Play / F-Droid / Huawei AppGallery
  • iOS : interopérabilité Swift, CI Xcode Cloud, Fastlane, flux de mise à jour de type Sparkle
  • Desktop : Compose for Desktop, JNI, Sparkle (macOS) / WinSparkle (Windows) / AppImage (Linux), Unique4j
  • Moteur : oonimkall — le moteur de mesure OONI écrit en Go, appelé depuis Kotlin/Swift via JNI/Cocoapods
  • Observabilité et release : Sentry, GitHub Actions, Weblate (traductions)
  • Licence : GPL-3.0

Captures d’écran