Ownword (WhisperKeyboard) — Voice-First Android Keyboard

Ownword, an Android keyboard built around speech, with on-device dictation, swipe typing, prediction, autocorrect and a sentence check, rebuilt from its own APK after the original project was lost.

134,810lines of code
769files
453commits

What the measurements mean

Only what is unusual for this project. Every sentence names the field it came from; nothing here is asserted that cannot be checked against the data.

How it works

Ownword is a voice-first keyboard for Android. Dictation runs on the phone, in its own process, using sherpa-onnx models that are downloaded rather than bundled, and the server transcription route was closed in 1.0.362. Around it sit swipe typing, prediction, autocorrect, a sentence check, and read-aloud and Ask Ownword from any app's text menu. The interesting part is how it came to exist. The Android Studio project was lost in a machine reformat and only the shipped APK survived, so the source had to be rebuilt from the binary. The tool apktool recovers the resources and smali (Android's low-level code), and jadx recovers Java. A pipeline of purpose-written scripts turns that into a buildable Gradle module: it extracts resources by following what the code refers to, systematically repairs jadx's known breakages, and reports which members and calls the reconstruction dropped. The final step compares a rebuilt APK against the original, so the reconstruction is verified rather than assumed. Since then the work has been about typing accuracy under a real thumb. Spacebar mis-hits were researched and measured before any repair was built, and a stray key is treated as evidence and scored that way. The keyboard can also be told when it got something wrong, so the numbers choose the design rather than the design choosing the numbers. A public site at keyboard.rnsu.net is generated from the code and publishes only builds recorded as run on a phone.

What it is built from

Each bar is one of this project's own modules, sized by how many times the rest of the project imports it. The counts are measured, not estimated, and the module at the top is the one the rest of the project leans on most.

Module mapInternal modules by how often they are imported: lm_model 7 times, validate_glide 6 times, profile 4 times, preview 3 times, headless_edge 3 times, analyse_features 2 timeslm_model7validate_glide6profile4preview3headless_edge3analyse_features2experiment_glide_doubles2imports of each internal module, counted across the project

What kind of engineering this is

Six signals counted from the source: files that run models locally, that act without being asked each time, that check their own output, that survive failure, that touch parsers and protocols, and that were measured then improved. Every axis carries its file count.

Depth profileDepth signals: Local inference 7 files, Autonomy 11 files, Verification 48 files, Resilience 54 files, Low level 26 files, Iteration 0 filesLocal inference7 filesAutonomy11 filesVerification48 filesResilience54 filesLow level26 filesIteration0 files

What it is written in

Share of code bytes. Vendored bundles and generated output are set aside before this is computed, which is why it differs from a simple file count.

Language mixHTML 49.4%, Kotlin 36.9%, Python 11.4%, XML 1.8%, PowerShell 0.4%, Shell 0.1%HTML 49.4%Kotlin 36.9%Python 11.4%

What stands out

Grade

Every check names the field it measured. Checks that cannot apply are excluded, never counted as failures.

A
94.1% over 18 of 18 checks100% coverage

Not met

Architecture

Directories carrying real modules, largest first.

Vocabulary

Parsed 72 of 72 Python file(s). Counts are exact; the names below are a sample.

672functions
69methods
20classes
72documented modules

Classes

Functions

Command line

Depth

Signals counted from the code, not asserted.

452 commits across 34 separate working days over 2.6 months, 46 of them revising existing behaviour

Built from scratch

Closes its own loop

Proves itself

Survives failure

Local inference

Systems

Model operations

Working within limits

GPU & memory management

Networking

Distributed systems

Languages

Built with

Recurring themes in the commit history

Evidence

Taken from the code itself: a module docstring or the opening of the README.

Turn the keyboard's diagnostics log into numbers you can act on. The app uploads batches of JSONL to the File Exchange. Download them, point this at the folder, and it reports what actually happened rather than what it felt like. Batches can overlap - a failed upload is retried with the same sequence range - so entries are de-duplicated on (install, seq) before anything is counted. Pass several fi

At a glance

Status
active
Primary language
HTML
First commit
2026-08-23
Last activity
2026-11-10
Domain
Data & analysis
Agent docs
CLAUDE.md, AGENTS.md