Skip to content

Mobile architecture decision records

The ten binding decisions for the YazSes mobile programme. They are public on purpose: the Android app is being built by contributors, and you cannot contribute to an architecture you are not allowed to read. Every one of them follows the same shape — Context, Decision, Consequences, Rejected — and the Rejected section is usually the most useful part, because it tells you which arguments have already been had.

ADR Title Status
MOB-001 Mobile is a first-class port, Android first, in this repository Accepted
MOB-002 Native Kotlin + Compose, pure-Kotlin cores, no cross-platform runtime Accepted
MOB-003 Text delivery: IME first, RecognitionService second, share/clipboard fallback Accepted
MOB-004 Activation: hold the mic key, with a hold/toggle accessibility switch Accepted
MOB-005 STT runtime: an engine seam, whisper.cpp default, sherpa-onnx second Accepted
MOB-006 Models downloaded, verified and user-owned; never bundled Accepted
MOB-007 Permission budget, one networked module, CI-enforced privacy gate Accepted
MOB-008 One behaviour, many implementations: a contract with golden vectors Accepted
MOB-009 F-Droid-shaped by default; GitHub APK first, Play later Accepted
MOB-010 The Apple wave: iOS/iPadOS is a different product shape Accepted (deferred execution)

Reading notes

  • Links to ADR-011, ADR-v2-129 and similar point into the desktop ADR series, which is public under design/adr/ and published on this site under Engineering (design) → Decision records. Where a desktop ADR is load-bearing for a mobile decision, the mobile ADR restates what it says, so you never need the original. The most important one, ADR-011 (zero telemetry, offline by default, no cloud fallback, no ambient capture), is published in user-facing form as the privacy statement, and it governs the Android app unchanged.
  • "Accepted" here means the decision is binding, not that the code exists. Some of these decisions are now partly implemented under android/: the module skeleton and its layering and privacy gates, and the first pure-Kotlin cores that pass the shared contract vectors. The others have no code yet, and there is still no app to install. Where an ADR's own status line says "design only, no code yet", it records the state on the day it was accepted (2026-08-07), not today's. See the programme overview for what exists today and where each milestone stands.
  • To change a decision, open a PR adding a new ADR that supersedes the old one. Do not edit an accepted ADR to say something different from what was decided; the point of the series is that the reasoning survives the decision.