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 (the Open Observatory of Network Interference) is a non-profit free-software project that measures internet censorship and network interference around the world. OONI Probe is the app users install to run those measurements; results are published as open data and have been used to document blocking of websites, messaging apps, and circumvention tools in over 200 countries.

OONI Probe Multiplatform is the consolidated Kotlin Multiplatform rewrite that replaces the legacy Android, iOS and Desktop applications with one shared codebase, while still shipping native binaries to Google Play, F-Droid, Huawei AppGallery, the App Store, the Microsoft Store, macOS, and Linux. The same codebase also ships as the News Media Scan (NMS) variant for press-freedom organisations.

Before the rewrite, the iOS and Android apps lived in separate native codebases — ooni/probe-ios (Swift) and ooni/probe-android (Java/Kotlin) — each with its own release pipeline, its own bridge to the shared Go measurement engine, and its own UI built twice. I maintained both of those repos before and during the move to multiplatform, so I bring the operational history of the legacy apps into the rewrite — what users relied on, what was painful to keep in sync across two stacks, and which behaviours had to be preserved on the way over.

I am a core engineer on the consolidated project, contributing since the very first iOS engine bridge in mid-2024 and continuing as a primary maintainer of the iOS and Desktop targets and of the cross-platform infrastructure that supports them.

What it does

  • Runs Web Connectivity tests to detect blocked websites.
  • Runs instant-messaging tests for apps such as WhatsApp, Telegram, Signal and Facebook Messenger.
  • Runs circumvention-tool tests for Tor, Psiphon and others.
  • Runs performance and middlebox tests (NDT, Dash, HTTP Header Field Manipulation, HTTP Invalid Request Line).
  • Submits results to the OONI collector so they appear, with full network metadata, on OONI Explorer.
  • Lets users add custom test descriptors and run targeted measurement campaigns via Run v2 deeplinks.

My role

  • iOS target — bridging the Go-based oonimkall measurement engine to Kotlin/Native, building out platform features, and maintaining the release pipeline.
  • Desktop target (Windows, macOS, Linux) — establishing and maintaining the desktop platform, including packaging, deeplinking, auto-update flows, tray and window behaviour, and migrations from legacy desktop builds.
  • Cross-platform features — implementing app-wide features in shared Kotlin Multiplatform code, including settings and proxy configuration, secure storage, network and GeoIP handling, and result management.
  • Architecture & infrastructure — refactoring shared modules toward more idiomatic Kotlin, migrating internal layers to modern libraries, and supporting the multi-flavor build system that ships both OONI Probe and the News Media Scan variant.
  • Release engineering — CI/CD across Android, iOS and Desktop, crash reporting, and the publication pipelines for the various app stores and direct-download channels.

Technologies

  • Shared: Kotlin Multiplatform, Compose Multiplatform, Coroutines, Ktor, SQLDelight, Koin
  • Android: Jetpack Compose, WorkManager, Google Play / F-Droid / Huawei AppGallery release pipelines
  • iOS: Swift interop, Xcode Cloud CI, Fastlane, Sparkle-style update flows
  • Desktop: Compose for Desktop, JNI, Sparkle (macOS) / WinSparkle (Windows) / AppImage (Linux), Unique4j
  • Engine: oonimkall — the OONI measurement engine written in Go, called from Kotlin/Swift via JNI/Cocoapods
  • Observability & release: Sentry, GitHub Actions, Weblate (translations)
  • License: GPL-3.0

Screenshots