A keyboard sees everything you type. Whether it can send any of that anywhere is decided by one line in a file you never see: the INTERNET permission in its manifest. Android's own reference describes it in nine words, "Allows applications to open network sockets. Protection level: normal", and that second sentence is the reason this post exists.
"Normal" means the system grants it silently at install. It never appears in the runtime prompt, and it never appears on the main Permissions screen either, for any app. So the check most people do, opening Settings and looking for a "Network" toggle, proves nothing either way. Here are three checks that do.
1. The phone's own "All permissions" list
On a Pixel and on most builds close to stock Android:
- Open Settings, then Apps, then the keyboard. Tap See all apps if it is not in the short list.
- Tap Permissions.
- Tap the three-dot menu in the top corner and choose All permissions.
That last screen is the one that matters. It lists the install-time permissions under a heading called Other, and an app that can reach the network shows the line have full network access there. If that line is missing, the app cannot open a socket. Not "has promised not to". Cannot.
Some manufacturers remove the three-dot menu. If yours has, use the next check.
2. The Play listing
Every Play listing carries a permission list that Google derives from the app's manifest rather than from anything the developer writes. Google's own help page says so plainly: the list "is based on technical information that describes how the developer's app works", and it is separate from the Data safety section, "which is based on information declared by app developers".
Open the listing, tap About this app, scroll to App permissions and tap See more. The same wording appears: Other: have full network access. That is the manifest talking, on a page the developer cannot edit.
3. A cable and one command
If you have adb set up, this is the most literal version:
adb shell dumpsys package studio.forgedev.forgeboard | grep -A 12 "requested permissions"
Swap in any package name you want to check. For FrankenKeys the block lists five entries and android.permission.INTERNET is not one of them. For a fuller walk-through, including pulling the APK off the phone and opening it, read Decompile FrankenKeys yourself.
Why the Settings screen alone is not enough
I want to be exact about this because the whole product rests on it. The screen at Settings, Apps, Permissions shows runtime permissions: the ones Android asks you about with a dialog, like the microphone. The INTERNET permission is not in that class. Google's developer documentation on permissions says the system "automatically grants your app the permissions when the user installs your app" for install-time permissions, and network access is one of them.
So a keyboard that can upload everything you type and a keyboard that cannot look identical on that first screen. Both show a microphone toggle if they offer voice typing. Neither shows a network toggle. The difference lives one menu deeper, in the list under "Other", or on the Play listing, or in the manifest itself.
What a missing permission actually buys you
When an app without INTERNET tries to open a socket, the kernel refuses. The app's own code, every library it bundles, every advertising SDK it might have picked up in an update: all of it hits the same wall, because the restriction is enforced by the operating system on the process, not by a setting inside the app.
That is a different kind of claim from a privacy policy. A policy is a promise about behaviour. A missing permission is a property of the binary, and it is one you can read off the phone in your hand.
The one thing this does not cover
Voice typing on Android hands audio to the system's speech recogniser, which is a separate service with its own permissions. On Android 12 and later, FrankenKeys binds the on-device recogniser explicitly and will refuse to start if there is none. On Android 10 and 11 it can only ask the system to prefer offline, and the system may not comply. That is the system's connection, never the keyboard's, and it is spelled out in full on the voice typing page.
Everything in this post you can check
INTERNETis protection levelnormal: developer.android.com, Manifest.permission reference.- Install-time permissions are granted without a prompt: developer.android.com, permissions overview.
- The Play permission list comes from the manifest, not the developer: support.google.com, "Understand app privacy & security practices with Google Play's Data safety section".
- FrankenKeys requests five permissions and no network one:
adb shell dumpsys package studio.forgedev.forgeboard.
Thirty seconds is the honest estimate for the first check on a phone you already have unlocked. The adb route takes longer the first time and about four seconds every time after.