2665
= book · cook · cool — one key sequence, three words.
T9 predictive typing for Android, with a row of engineering keys — Esc, Tab, Ctrl, arrows and the symbols a shell actually needs. Built for a folding phone you are holding in one hand.
Android 11+ · sideload · no account, no tracking, no permissions
Real dictionary, real ranking — 6,000 words from the app itself. Tap next to cycle, 0 for a space.
The argument
Android measures layout in dp, and a dp is a
physical unit by definition: 160 dp = 1 inch, on
every device ever made. So this is arithmetic, not taste.
A folded phone's cover screen is about 60 mm wide. Put a QWERTY top row across it and each of the ten keys gets 6.0 mm. Now measure what you are aiming with: an adult thumb pad is 20–25 mm.
Unfold the phone and the keys stay exactly as they were. Most keyboards make keys a percentage of screen width, so opening a folding phone silently doubles every key and throws away the muscle memory you spent a week building. Here the spare width goes to the hand you are not typing with — and the engineering keys move over there, where your thumb can never hit them by accident.
Measured, not claimed
Every figure below came from replaying 20,000 words of real prose through the engine, one key at a time, against baselines. KSPC is keystrokes per character — lower is better, and 1.0 is a perfect typist hitting one key per letter.
| Method | KSPC | vs multi-tap |
|---|---|---|
| Multi-tap — a 1999 phone | 2.05 | — |
| Full-length T9 — a 2001 phone | 1.27 | −38% |
| 12 Keys | 1.03 | −50% |
| Perfect QWERTY typist | 1.00 | −51% |
The honest caveats. Keystrokes are not speed — reading a suggestion costs attention that hitting a known key does not, and real-thumb words-per-minute has not been measured, so there is no speed claim here. Roughly one word in seven still has to be spelled out because it is not in the dictionary yet. A keypress is answered in 0.02 ms against a 16.6 ms frame budget, which is the one number with room to spare.
The engineering row
A stock keyboard buries |, ~, /
and $ two taps deep, and has no Esc, no Tab, no Ctrl and no
arrows at all. Fine for texting, useless over ssh.
Ctrl-C sends an actual keycode with an actual modifier, so it
interrupts a process. A keyboard that merely types the character
0x03 interrupts nothing.
In a terminal, URL bar or email field the keyboard promotes
engineering vocabulary — kubectl, systemctl,
raidz2 — and stops capitalising your commands.
Typeable, always. Never completed into from a short prefix unless you have typed it before — so it cannot guess its way into an obscenity, and it never blocks one either.
Type :) or <3 and it becomes one. Type
"love" and it is offered beside the word. Or open the picker.
Privacy
Every password, every card number, every message you deleted before sending. It all passes through the keyboard before it reaches the app that asked for it. When you enable any keyboard, Android warns you about exactly this. That warning is correct.
12 Keys requests no permissions. None at all.
In particular it has no INTERNET permission, so it
cannot open a network connection — the operating system
refuses, no matter what the code says or who audited it. That is the
strongest form of the promise Android allows, and you can verify it in
ten seconds without reading a line of our code.
A build step checks the final manifest and fails the build if a
permission ever appears. It was tested by deliberately adding
INTERNET and watching the build stop.
There is no account, no sync, no analytics and no crash reporter. Words you teach it stay on the phone, learning halts entirely in password fields, and "forget everything" deletes rather than hides.
Beta
Version 0.3.0. Android 11 or newer. This is a real beta — it is being used daily and it still has rough edges.
On Samsung, turn Auto blocker off first (Settings → Security and privacy). It silently blocks sideloading and says nothing useful when it does.
The setup screen walks you through enabling it and takes you straight to the right system screens. Each step ticks green on its own once done.
No overlay permission is requested. Other keyboards ask for one; an input method already gets its own window, so this one does not need it.