#5464: Your Keyboard's Hidden Data Problem

Your keyboard knows your email address, your phrases, your habits — and you can't take any of it with you.

Featuring
Listen
0:00
0:00
Episode Details
Episode ID
MWP-5647
Published
Duration
25:53
Audio
Direct link
Pipeline
V5.2
TTS Engine
chatterbox-regular
Script Writing Agent
DeepSeek 4.1 Flash

AI-Generated Content: This podcast is created using AI personas. Please verify any important information independently.

An Android keyboard is an InputMethodService — a service the system binds to, receiving key events and committing text through a narrow channel called an InputConnection. That constraint explains almost everything about what keyboards can and can't do, and why so much cleverness requires workarounds.

The suggestion engine in HeliBoard descends from OpenBoard and ultimately the AOSP keyboard, LatinIME. It combines a static language dictionary with a learned frequency model that counts every word and n-gram you commit. That's why your email address becomes a top suggestion after you've typed it forty times — nobody built that feature, the statistical model just did its job. And that model, representing months of your typing habits, lives in a private app directory on Gboard, SwiftKey, and Samsung Keyboard, syncing to vendor clouds. You can delete individual entries. You cannot export them.

The personal dictionary is a different story entirely. It's explicit and declarative, stored in a content provider called UserDictionary — and it's shared across IMEs. It's one of the few pieces of keyboard data on Android that's already portable, and almost nobody notices.

Macro expanders split into two mechanisms: accessibility services, which require a second app with broad permissions and a persistent background service, and IME-native text replacement, which is clean but only works while that keyboard is active. When an ASR IME commits text and an accessibility macro app inspects it, timing conflicts produce double replacements and partial-string reads — two editors working the same document a hundred milliseconds apart.

On the ASR side, Whisper IME downloads 435MB of TFLite models on first launch, then runs fully offline with a 30-second utterance cap. Parakeet TDT 0.6B v3 posts a 4.91 multilingual WER against Whisper large v3's 5.05 — statistically indistinguishable — while running 17x faster on CPU alone. That explains why voice-first typists find Whisper "struggles" on phones: it's a latency problem, not an accuracy one. Whisper large still wins on a desk with a GPU.

Downloads

Episode Audio

Download the full episode as an MP3 file

Download MP3
Transcript (TXT)

Plain text transcript file

Transcript (PDF)

Formatted PDF with styling

#5464: Your Keyboard's Hidden Data Problem

Corn
I'm going to be honest, when I opened this one I felt a small pang of sympathy for Daniel, because he's writing this from bed with a stomach bug, and instead of resting he's rebuilding his keyboard.
Herman
That is the most Daniel sentence I've ever heard.
Corn
Here's what he sent. He's been a voice-first typist for a long time now, and he says dictation on Android has lagged behind other systems for years. He found Whisper struggles a bit, Parakeet works really well, and he's getting great accuracy with an app called Whisperian that integrates with HeliBoard as a voice IME.
Herman
Whisperian is a fork of woheller69's Whisper IME, for anyone wondering.
Corn
Right. Then he gets to the part that actually made him sit up. Exploring third-party keyboards makes you realize how many separate components assemble into what feels like one seamless keyboard, and how the valuable data you generate quietly disappears into a black box. He names two value-adds. Macro expanders, which he's been advocating for a while, but which require installing an entire second app with accessibility access just to fire off some macros. He calls that bloated engineering, and I think that's fair.
Herman
It's very fair.
Corn
And text prediction. The standard UI where, as you type, the keyboard builds a history of your common phrases. You can manually remove entries, but you can't take them with you. And he points out that prediction actually delivers much of the macro benefit already, because if you start typing your email address, the suggestion finishes it.
Herman
Which is the same saving, just delivered differently.
Corn
Then the third ingredient. Personal dictionaries. Words you use often that are cognates of words the transcriber is liable to produce instead, usually integrated at the voice layer.
Corn
He means the ASR hears a normal word and writes the normal word, when you wanted the unusual one. And then the actual ask. Two threads. First, unpack how these accessory components work under the hood. Second, and this is where he wants to steer us, how you replicate all of it with open source components so that your histories, your replacement history, your suggestions, and your personal words are data you can back up and propagate across apps, devices, and operating systems. One unified set of lists instead of a footprint of customization smeared across every machine you own.
Herman
That's the real question.
Corn
So. Where do we start.
Herman
Start with the plumbing, because everything else in this conversation depends on it. An Android keyboard is an InputMethodService. That's it. It's a service the system binds to. The WindowManager tells it about the focused text field, the IME receives key events, and it commits text into that field through something called an InputConnection. That's the entire contract.
Corn
So the keyboard isn't drawing into the app.
Herman
No. It's handing strings to the app through a narrow channel. Which is why the keyboard can see so little of what's around it. The InputConnection doesn't tell it what's in the rest of the text field, generally. It tells it enough to insert text and enough to delete a few characters backwards.
Corn
That constraint matters later.
Herman
It matters enormously later. Because a lot of the cleverness people want from a keyboard requires knowing things the InputConnection won't tell you, and that's why the workarounds exist.
Corn
The suggestion engine.
Herman
HeliBoard inherits its engine from OpenBoard, which descends from the AOSP keyboard, LatinIME. So it's the stock Android suggestion engine, not something invented last year. And the way it works is simple at the core. There's a static dictionary for the language. And there's a learned frequency model that updates as you type. Every word you commit gets counted. N-grams get counted. When you start typing, the engine scores candidates from both sources and the personal model boosts things you've typed before.
Corn
So the email address.
Herman
The email address is the cleanest demonstration there is. Nobody puts your email address in a dictionary. But you type it forty times, it gets promoted into the frequency model, and by the twentieth time you type the first three letters it's sitting there as the first suggestion. That's not a feature somebody built. That's the statistical model doing exactly what it's designed to do.
Corn
And that's the data.
Herman
That's the data. That's the thing that represents months of your typing habits, compressed into a file of word counts. And here's the part that should annoy everyone. On Gboard, on SwiftKey, on Samsung Keyboard, that file lives in the app's private data directory and syncs to the vendor's cloud. You can delete individual suggestions. You cannot export them. You cannot back them up. You cannot move them to another keyboard.
Corn
You can prune the tree. You can't dig it up.
Herman
That's exactly right.
Corn
So what's the personal dictionary layer, then, because Daniel treats it as a separate thing and I think he's right to.
Herman
He is right to. It's a different mechanism entirely. The learned frequency model is statistical and implicit. The personal dictionary is explicit and declarative. You add a word, you add a shortcut, and it's stored in a content provider called UserDictionary. And here's the interesting part for our purposes. UserDictionary is shared across IMEs.
Corn
Wait. That one's already portable?
Herman
That one is already portable. It's one of the very few pieces of keyboard data on Android that any app with the right permission can read. So if you add a word in one keyboard, another keyboard can see it. It's a system-level store, not an app-level one.
Corn
So the layer Daniel cares most about, the personal words, is the one that's already solved and nobody notices.
Herman
Which is a useful thing to know before you start building anything. Half the problem has a solution sitting in the platform already, and the other half is locked in vendor vaults.
Corn
Macro expanders next, because that's where it gets ugly.
Herman
Two completely different mechanisms, and people conflate them constantly. The first is the accessibility service approach. You install a separate app, it registers an AccessibilityService, and that gives it the ability to observe text-change events across every app on the device. It watches what you type, it pattern-matches, and when it sees a trigger it issues a delete-and-replace through its own accessibility actions.
Corn
Which is why it needs that permission.
Herman
It needs that permission because that's the only way to see text outside your own app. And it needs a persistent background service, because it has to be watching at all times. That's the bloat Daniel is complaining about. You're running a second keyboard-shaped thing that isn't a keyboard, purely to do string substitution.
Corn
And the second mechanism?
Herman
IME-native text replacement. The keyboard itself watches the text it just committed and substitutes. No accessibility permission, no background service, no separate app. The catch is it only works while that keyboard is the active one. The moment you switch to another keyboard, your macros are gone.
Corn
So one is powerful and invasive, the other is clean and fragile.
Herman
That's the trade in one line.
Corn
Now the sequencing question, because Daniel flags it and I want to make sure we do it justice. What actually happens when your ASR output comes back and something else wants to inspect it.
Herman
This is the most interesting technical problem in the whole prompt. Android allows exactly one active IME at a time. You can have five installed, but one is bound. So the ASR IME commits its text through the InputConnection of whatever app has focus. That's step one.
Corn
And then?
Herman
Then a separate accessibility-based macro app, if you have one, sees a text-change event fire. It reads the committed string. If a trigger matches, it issues its own delete-and-replace. So the sequence is: ASR commits, accessibility service inspects, replacement fires.
Corn
And if the timing is off?
Herman
Then you get the classic failures. The accessibility service reads a partial string because it fired on an intermediate change event. Or it deletes the wrong number of characters because the ASR committed in two chunks rather than one. Or both the ASR's own correction logic and the macro app's correction logic fire on the same string and you get a double replacement.
Corn
Have you seen that happen?
Herman
I've seen it described precisely enough by people who hit it that I believe it. The general shape is that you end up with a word that's been corrected twice, so it's now wrong in a new way. And the reason it's hard to fix is that neither component knows the other exists. The ASR doesn't know a macro app is watching. The macro app doesn't know the text came from speech rather than fingers.
Corn
They're two people editing the same document without looking up.
Herman
With about a hundred milliseconds between their edits.
Corn
Let's do the ASR layer properly, because that's where Daniel's actual experience lives.
Herman
Whisper IME is a good example of how to do it right, architecturally. It works two ways. It's a standalone app you can open and dictate into. And it registers as an IME, so you can activate it from the microphone button inside HeliBoard. It also plugs into Android's standard speech interfaces, RecognitionService and the recognize-speech intent, so any app that asks the system for speech input can get it.
Corn
That last part is the one people miss.
Herman
It is. It means it's not a walled garden. It's a proper citizen of the platform's speech API. And the model side is straightforward. On first launch it downloads about four hundred and thirty-five megabytes of Whisper models in TFLite format from Hugging Face. That's the only time it needs internet permission. After that it's fully offline. And there's a thirty-second cap per utterance.
Corn
Why the cap?
Herman
Because the model processes a fixed window. Thirty seconds is the practical limit for that architecture on a phone. It's not a bug, it's the shape of the thing.
Corn
Now Parakeet, because this is the part where Daniel's lived experience and the benchmarks actually agree.
Herman
They agree remarkably well. Parakeet TDT 0.6B v3 is NVIDIA's model. Six hundred million parameters, multilingual, built on a FastConformer encoder and a Transformer decoder. And the headline number is this. Multilingual word error rate of 4.91, against Whisper large v3 at 5.05. Statistically indistinguishable.
Corn
And the speed.
Herman
Seventeen times faster. On CPU only. Whisper models of comparable accuracy need a GPU.
Corn
That's the whole story right there.
Herman
It is, and it explains Daniel's experience exactly. He said Whisper struggles. He didn't say Whisper gets it wrong. On a phone, Whisper large isn't going to run comfortably, so you're running a smaller Whisper, and the smaller Whisper is less accurate. Meanwhile Parakeet at six hundred million parameters runs on the CPU at a speed that feels instant, with accuracy matching the big Whisper.
Corn
So "struggles" means "makes you wait."
Herman
Almost certainly. And that's a latency problem, not an accuracy problem. Which is a much better problem to have, because latency is the thing that determines whether you keep using voice or give up and go back to thumbs.
Corn
There's a caveat though, and I want it on the record.
Herman
There is. Some people find Whisper large v3 still slightly better on hard cases and on multilingual work. One commenter put it as Parakeet being very fast but sometimes inaccurate, and said you can't beat Whisper large v3 for accuracy if you have the GPU. I think that's a fair characterization. Parakeet wins on the phone. Whisper large wins on the desktop with a graphics card.
Corn
Different hardware, different winner.
Herman
And there's a broader trend underneath it. A study of fifty-plus ASR configurations for edge devices found that quantization can take a model from two point four seven gigabytes down to zero point six seven, with word error rate moving less than one percent. That's the thing that makes Parakeet-class models viable on a phone in the first place. You're not running the full model. You're running a compressed version that's nearly as good.
Corn
So the mobile ASR story is really a story about compression.
Herman
Compression and architecture. FastConformer is more efficient per parameter than the older encoder stacks. Both things had to be true.
Corn
Alright. So that's the mechanism. Which brings us to the part Daniel actually cares about, which is why the data ends up locked in a box.
Herman
And the honest answer is that it's not an accident and it's not incompetence. It's a business model.
Corn
Say more.
Herman
The learned frequency model is the single most valuable asset a keyboard company has. It's not the keyboard. Anybody can draw keys. It's the model of how you type. And if you can export that, you can leave. You can take six years of accumulated personalization to a competitor in a file. So the export button doesn't exist because the export button is the exit.
Corn
The lock isn't on the data. The lock is the data.
Herman
That's the cleanest way to put it.
Corn
And HeliBoard is the counter-example.
Herman
HeliBoard is the counter-example in almost every respect. It's a fork of OpenBoard, which descends from the AOSP keyboard, so it inherits that stock suggestion engine. It does not request internet permission at all. Nothing leaves the device. And it explicitly offers backup and restore of your settings and your learned word and history data.
Corn
There it is.
Herman
That's the thing. The feature Daniel is asking for, in the abstract, as a hypothetical architecture, exists. It's a checkbox in HeliBoard's settings. Backup and restore learned words and history.
Corn
So the answer to "can this be done" is yes, and the answer to "why isn't it universal" is that the vendors don't want it to be.
Herman
And one more detail that matters. HeliBoard is funded by the NGI Mobifree Fund, through NLnet and the EU's Next Generation Internet program. That's public money. It's not a hobby project that dies when the maintainer gets a job. It's funded infrastructure.
Corn
Which is a strange sentence to say about a keyboard.
Herman
It is. But that's what it is. Somebody decided a keyboard you control is infrastructure worth paying for.
Corn
Now the iOS comparison, because Daniel says Android dictation has lagged behind other operating systems, and I think that framing needs pushing back on.
Herman
It does, and this is the misconception I'd most like to kill. On the keyboard-extension axis specifically, iOS is more locked down than Android, not less. There was a long thread about this earlier in the year, people enumerating exactly what a third-party iOS keyboard cannot do. No caret or cursor control. No custom dictation pipeline inside the keyboard extension, you have to use the system dictation. No camera access. No privileged macros. And aggressive lifecycle and memory limits that make large dictionaries or language models impractical.
Corn
So on iOS you can have a keyboard, but it's a keyboard with its hands tied.
Herman
And on Android, an IME is a full app with real permissions. It can run its own speech model. It can hold its own dictionary. It can do its own text replacement. That's why this whole ecosystem exists on Android and not on iOS. Android's keyboard layer is more open.
Corn
So where does the lag come from?
Herman
I think it comes from two places. One, the stock Android dictation experience has historically been weaker than Apple's, so the default impression is worse. And two, the good stuff on Android is scattered across five apps you have to find and assemble yourself, whereas on iOS it's just there, worse, but there.
Corn
The Android problem is discoverability, not capability.
Herman
Yes. Android gives you a better ceiling and a worse floor.
Corn
Let's talk about the portability blueprint, because that's where Daniel wants us to land.
Herman
Right. And the good news is that most of the pieces exist. It's the glue that's missing. So let's inventory. Personal words: already portable, that's the UserDictionary provider, shared across IMEs. Custom layouts: HeliBoard stores them as text files, so they're shareable and editable and diffable. Learned words and history: HeliBoard exports and imports them. That's three of the four.
Corn
And the fourth?
Herman
Replacement history and macro triggers. Those are the ones that live inside whichever app implements them, and there's no standard.
Corn
So what does the architecture look like?
Herman
I'd argue for one master file. Plain text or JSON, human-readable, version-controllable. It holds three things. A word list, which is your personal dictionary. A replacement map, which is trigger and expansion pairs. And a word-override map for the ASR layer, which is the mis-transcriptions you want fixed.
Corn
And each tool imports the part it understands.
Herman
Each tool imports the part it understands and ignores the rest. HeliBoard reads the word list. An accessibility macro app reads the replacement map. The ASR IME reads the override map. And because it's one file, you sync it with whatever you already use to sync files, and now your keyboard habits travel.
Corn
There's a concrete example of this pattern, isn't there.
Herman
There is, and it's a nice one. Chirp STT ships a config file with a word-overrides section. It's a map of what the recognizer heard to what you actually meant. Something like "parra keat" maps to "parakeet."
Corn
Because that's exactly what a recognizer does with a word it's never seen.
Herman
And the point isn't that Chirp invented something clever. The point is that the format is a text file you can read, edit, commit to git, and sync. That's the model. Generalize that to every layer of the keyboard stack and you've solved Daniel's problem.
Corn
Why hasn't anybody done it?
Herman
Because the layers don't know about each other. HeliBoard doesn't know an ASR IME exists. The ASR IME doesn't know a macro app exists. Nobody has an incentive to define a shared format, because defining a shared format is work that benefits your competitors.
Corn
Unless somebody does it as infrastructure.
Herman
Which is roughly what the NGI funding model is for.
Corn
Now the threat, because there's a bad piece of news in Daniel's stack and I don't want us to skip it.
Herman
It's in the Whisper IME readme. Google has announced that starting in 2026 and 2027, all apps on certified Android devices will require the developer to submit personal identity details directly to Google. And the developer of Whisper IME has written that they don't agree to that requirement, so the app will stop working on certified Android devices after that point.
Corn
Stop working how? Deliberately?
Herman
Deliberately, in the sense that the developer won't comply, so the app won't be installable or updatable on certified devices. It's not Google reaching in and deleting it. It's the developer declining the terms and the app falling off the truck as a result.
Corn
That's a strange kind of death.
Herman
It's the honest kind, actually. The developer is telling you in advance rather than letting you find out.
Corn
But the effect on the ecosystem is the same either way.
Herman
The effect is that the whole category of sideloaded open-source IMEs is under threat on certified devices. And a keyboard is the worst possible app to lose this way, because it's the app that sees everything you type. If the only keyboards that survive are the ones from companies large enough to hand over identity documents to Google, then the open-source keyboard stops being an option for normal people.
Corn
And the people who care most about keyboard privacy are exactly the people who won't be able to install one.
Herman
That's the shape of it. I don't know how it resolves. I don't. There may be a workaround, there may be a carve-out, or the open-source keyboard may end up living only on devices that aren't certified.
Corn
Which is a much smaller population.
Herman
Much smaller.
Corn
One more thing before we get to Hilbert, which is that the Parakeet versus Whisper story is bigger than keyboards.
Herman
It is. It's a story about on-device AI becoming viable. Two years ago the assumption was that good speech recognition needed a server. Now a six-hundred-million-parameter model runs on a phone CPU faster than real time with accuracy matching the best large model from a couple of years ago. That's a step change.
Corn
And it makes the data question more urgent, not less.
Herman
Considerably more urgent. Because if everything runs locally, then everything is local data, and local data is data you should own. The technical excuse for locking it in the cloud is evaporating. Which means the only remaining reason to lock it is the one we already named.
Corn
The business model. Hilbert, you've been doing something over there.

Hilbert: I did data entry for a medical billing company for about a year. Whole office ran on macros. Every diagnosis code, every procedure code, every phrase we typed more than twice a day was a trigger. HTN for hypertension. You'd type three letters and the whole thing appeared.
Corn
And?

Hilbert: Then they moved us to a cloud records system that didn't support our macros. Not a migration problem. The new system just didn't have the feature. And the entire office's typing speed fell through the floor overnight. People who'd been doing the job for fifteen years were suddenly slower than the new hires.
Herman
Because the macros were the skill.

Hilbert: The macros were most of the skill. What was left was knowing which code to pick. Which is real, but it isn't the thing that made you fast.
Corn
So they took the tool away and discovered how much of the job was the tool.

Hilbert: They discovered it in about a week. And I've been suspicious of anything that says cloud on it ever since. Not because the cloud is bad. Because when they move you, they don't move your stuff with you.
Herman
That's the lock-in argument, and you're making it better than we did.

Hilbert: It's not a conspiracy. It's just that if you can take your learned words and your triggers and leave, then leaving is easy. So nobody builds the export. The black box isn't a bug. It's the product.
Corn
Say that again.

Hilbert: The black box is the product. The keyboard is free because the keyboard isn't what they're selling.
Herman
I think that's exactly right, and I think we undersold it earlier.

Hilbert: I've still got a text file on an old drive somewhere with all those billing macros in it. Never been able to use them since. Different system, different format, no importer.
Corn
You kept the file.

Hilbert: I kept the file. It's useless. I kept it anyway.
Corn
Did you ever try to rebuild it?

Hilbert: Once. On my personal phone. Spent a weekend on it. Got it working, more or less. And then about three months later I realized I'd been typing HTN in text messages to my sister instead of the word hypertension. She never said anything. I don't know what she thought was happening.
Herman
She just accepted it.

Hilbert: Three months.
Corn
That's the whole episode in one anecdote, isn't it. The habit outlived the job.

Hilbert: The habit outlives everything. Anyway, I've left the garage light on at home, so.
Corn
Right.
Herman
So the open question I keep landing on is whether a standard format can actually emerge, or whether every open-source keyboard just invents its own and we're back where we started with nicer licenses.
Corn
And the other one is whether the developer-identity mandate actually kills sideloaded IMEs on certified devices, or whether there's a workaround nobody's found yet. I don't think anybody knows.
Herman
I don't think anybody knows either. But I'd note that the compression trend cuts in favor of the local side of this argument. As models keep shrinking, more of the stack runs on your phone, and more of the data is yours by default. The technical case for the black box gets weaker every year.
Corn
Which means the only thing holding it up is the business case.
Herman
Which is a real thing, and it doesn't go away on its own.
Corn
The keyboard is the most intimate interface we have with these devices. It's the thing that knows your vocabulary, your habits, the names of the people you write to. The question of who owns that isn't a question about software. It's a question about who owns a piece of how you think.
Herman
And right now, on most phones, the answer is somebody else.
Corn
Thanks as always to our producer, Hilbert Flumingtop.
Herman
This has been My Weird Prompts, the human-AI collaboration podcast.
Corn
If you're enjoying the show, leave us a review on your podcast platform of choice. It helps other listeners find us.
Herman
We'll be back soon.
Corn
See you then.

This episode was generated with AI assistance. Hosts Herman and Corn are AI personalities.