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.
- At 137,339 authored lines it is one of the larger things here, roughly 16x the median project in this estate. authored_linesfrom authored_lines
- It was changed within the last week, so this is work in progress. activefrom mtime_newest_code
- The code defines 672 functions, 69 methods and 20 classes.see the evidencefrom pythonAst.counts, pythonAst.coverage
- It grades A, weakest on runnability at 71.4%. runnability coveragesee the evidencefrom grades
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.
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.
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.
What stands out
- Rebuilt from a shipped APK, with parity checks and an APK comparison verifying the reconstruction
- Dictation has run on the phone since 1.0.310, and the server route closed in 1.0.362
- Swipe typing, with key lighting measured (93% right) before it was built
- Spacebar mis-hits were researched and measured before a repair was built
- Read aloud and Ask Ownword from any app's text menu and share sheet
- A public site generated from the code, publishing only builds verified on a phone
Grade
Every check names the field it measured. Checks that cannot apply are excluded, never counted as failures.
- provenance100.0%
- documentation100.0%
- runnability71.4%
- maintenance100.0%
- integrity100.0%
Not met
- environment none
python -m venv .venv (in the project folder
Architecture
Directories carrying real modules, largest first.
scripts72 modules
Vocabulary
Parsed 72 of 72 Python file(s). Counts are exact; the names below are a sample.
Classes
Resscripts/preview.py:43__init__, _load_values, style_items, color, dimen, string, _drawable_path, background_cssRendererscripts/preview.py:260__init__, layout_path, attrs_for, render, _box_cssReaderscripts/lm_model.py:77__init__, varint, byteLanguageModelscripts/lm_model.py:97__init__, _val, logp_word, logp_next, knowsNoisyChannelscripts/lm_model.py:165__init__, repair, _offerResultscripts/questions.py:74__init__, answeredUnreadablescripts/audit_insights.py:303Decoderscripts/validate_glide.py:520__init__, sampled, decode, same_pathReaderscripts/experiment_sense.py:158__init__, encode, whole_word, layout, run, pll, namedDiscriminatorscripts/experiment_sense.py:302__init__, probsPhoneDetectorscripts/experiment_sense.py:334__init__, probsReportscripts/analyse_telemetry.py:197__init__, head, say, action, renderScorerscripts/export_text_model.py:122__init__, forwardDoubtscripts/export_text_model.py:183__init__, forwardContextscripts/validate_sentence.py:137__init__, candidates, scoreKNscripts/experiment_scoring.py:107__init__, p_next, logpChannelscripts/experiment_scoring.py:171__init__, lp_word, reading, lp_next, repairNodescripts/validate_correction.py:23__init__Maskedscripts/experiment_mlm_rerank.py:190__init__, scoresPhoneModelscripts/experiment_mlm_rerank.py:250__init__, encode, scores
Functions
capturescripts/learn.py:51mainscripts/learn.py:82_uleb128scripts/verify.py:27dex_type_namesscripts/verify.py:38app_classesscripts/verify.py:60normalisescripts/verify.py:81app_resourcesscripts/verify.py:121owned_resource_namesscripts/verify.py:136reportscripts/verify.py:149mainscripts/verify.py:167dimscripts/preview.py:359hide_by_idscripts/preview.py:512mainscripts/preview.py:521load_storescripts/profile.py:46save_storescripts/profile.py:55expandscripts/profile.py:63ingestscripts/profile.py:73summarisescripts/profile.py:117mainscripts/profile.py:150quantisescripts/build_lm.py:112varintscripts/build_lm.py:118load_ranksscripts/build_lm.py:125load_pairsscripts/build_lm.py:142dictionary_hashscripts/build_lm.py:168
Command line
- --json
- --wait
- --source
- --coverage
- --follows-cap
- --heads
- --follows
- --no-register
- --open
- --adjacent
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
- Parser / lexer
- Audio / DSP
- Compiler / transpiler
- Protocol / wire format
Closes its own loop
- Memory / accumulated state
- Evaluation / scoring
Proves itself
- Reconciliation / audits
- Benchmarks
- Golden / baseline files
- Smoke tests
- Backtesting / evaluation
Survives failure
- Recovery / restore
- Logging / observability
- Fallback paths
- Timeouts
- Retry / backoff
- Rate limiting
Local inference
- ONNX runtime
- Direct torch inference
Systems
Model operations
- Model formats
- Hugging Face
Working within limits
- Timeout budgets
- Context-window budgeting
GPU & memory management
- Quantisation
Networking
- DNS
- Tunnels / reverse proxy
Distributed systems
- Worker orchestration
Languages
- Kotlin93,639
- Python28,349
- PowerShell914
- Shell190
- Batchfile229
Built with
- Pillow
Recurring themes in the commit history
- key
- phone
- read
- site
- your
- generated
- you
- owner
- aloud
- word
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