Releases: JohnHubble/openbrain-capture-android
Release list
v0.1.0 — initial signed release
First signed release of Open Brain Capture for Android. Voice → on-device Whisper → OB1.
Updated 2026-05-02: APK rebuilt to include session-bounded capture (replaces 30-second wall-clock windowing — one tap-to-start → tap-to-stop produces a single coherent transcript, with a 10-minute hard cap and 8-minute warning), the model-switch fix (Settings → Whisper model now correctly re-evaluates on change), bounded read timeout for model downloads, and IPv4-only DNS for the Hugging Face CDN. SHA-256 below reflects the rebuilt artifact.
What it does
Press a button (in-app, Quick Settings tile, or home-screen widget), speak, and the app:
- Records audio via a foreground service (keeps running with the screen off).
- Transcribes locally with whisper.cpp — nothing leaves the phone until you choose to sync.
- Pushes the transcribed thought to your OB1 backend over JSON-RPC / SSE.
Whisper model size, OB1 endpoint, access key, and a "preview before save" toggle are configured in the in-app Settings screen — no source edits required.
Install
- Download
app-release.apkfrom this release. - Allow your browser or file manager to install unknown apps (Android Settings → Security).
- Tap the APK and confirm install.
- Open Open Brain. On first launch, pick a Whisper model and let it download.
- Open Settings → paste your OB1 endpoint URL and access key, then tap Test connection.
Highlights
- Session-bounded capture — one tap-to-start → tap-to-stop yields a single transcript. 10-minute hard cap with an 8-minute warning banner.
- On-device transcription — Tiny / Base / Small Whisper models via whisper.cpp + JNI. Audio never leaves the phone before you sync the transcript.
- Encrypted credential storage — OB1 access key is held in
EncryptedSharedPreferences(Tink AES-256-GCM, key-wrapped via Android Keystore). - HTTPS-only in release builds — endpoint URLs that don't use HTTPS are rejected with a clear error before any network call.
- Verified model downloads — pinned SHA-256 per Whisper model; the file is only loaded into native code if the hash matches the upstream Hugging Face artifact.
- Fast model fetch — IPv4-only DNS for the download path so a broken IPv6 route to the HF/CloudFront CDN doesn't make Happy-Eyeballs fallback take minutes. ~13 s for the 148 MB Base model on a normal connection.
- Foreground capture — recording continues when the screen is off or another app is foregrounded.
- Quick Settings tile + home-screen widget — start a capture from anywhere on the device.
- R8-shrunk — release APK ~9 MB.
- Tests — 29 unit tests covering OB1Client (header/HTTPS), SseParser (JSON + SSE + malformed), PcmChunker (window math + normalization), WhisperModelRepository (hash verify + cleanup), ThoughtRepository (status transitions).
Audit-remediated
Built on top of an external read-only audit (2026-04-26) — every finding (A1–A8) is closed in this release: no query-string credential exposure, encrypted key at rest, model integrity verification, HTTPS enforcement, no destructive Room migrations, no dead/non-functional settings, R8 minification on, full unit-test coverage. See the changelog in PR #1 for per-finding detail.
Permissions
Only what's actually used: RECORD_AUDIO, POST_NOTIFICATIONS, FOREGROUND_SERVICE (+ microphone), INTERNET, ACCESS_NETWORK_STATE, WAKE_LOCK. No location, contacts, storage, ad/analytics permissions.
Backend
Client-only. Bring your own OB1 instance reachable over HTTPS that speaks JSON-RPC over SSE.
Verify
V2 signature, CN=John Hubble:
- Cert SHA-256:
ff465dffca5837ba0b7921940dca6b8401539bb178865f1a27c801bbb9b43420 - File SHA-256:
cd91648f15b68fc5909b73af4031c4a6b22c8c6e77c76b5610627a1ce18541a6
apksigner verify --print-certs app-release.apk
shasum -a 256 app-release.apk
Known limitations
- No GitHub Actions CI yet — local build proven (
./gradlew testDebugUnitTest assembleRelease). - arm64-v8a only (modern devices; no x86 / armeabi-v7a).