This is the permission list of FrankenKeys 3.13.0 as read from the merged manifest, the file inside the package Google Play installs. It is the whole list. Every other page on this site points here, because this is the receipt.
| Permission | What it is for |
|---|---|
android.permission.VIBRATE |
Haptics when you press a key. Twenty profiles, all of them need this one line. |
android.permission.RECORD_AUDIO |
Voice typing. The audio is captured by Android's own speech recogniser in its own process; the keyboard receives text. Asked for only when you tap the microphone, and the keyboard works without it. |
com.google.android.apps.aicore.service.BIND_SERVICE |
Talking to Android's on-device AI service, AICore, for grammar and tone rewrites on phones that have it. A binder connection, not a socket. |
com.android.vending.BILLING |
The one-time Pro unlock, over inter-process communication to the Play Store app, which does its own networking on its own permission. |
studio.forgedev.forgeboard.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION |
A private signal the app sends to itself. Android 13 requires a receiver to say whether other apps may reach it; this is the "they may not" form, contributed by the AndroidX library. |
| Not held | |
|---|---|
android.permission.INTERNET |
Not requested. Not present. Explicitly stripped from the merged manifest so no library can contribute it. |
android.permission.ACCESS_NETWORK_STATE |
Same. An app that cannot use the network has no business asking about it. |
No contacts. No location. No camera. No phone state. No accounts. No advertising identifier.
How it stays five
Libraries carry their own manifest fragments, and Android's build merges them into the app's. Left alone, that is how a keyboard acquires a network permission nobody typed. Two things prevent it here.
First, the manifest names both network permissions with tools:node="remove", which tells the merger to drop them whoever contributed them.
Second, the release build carries an allowlist of exactly the five permissions above and a task, assertAirGap, that reads the merged manifest after every merge and fails the build with "AIR GAP VIOLATED" if anything else appears. It is bound to the manifest step itself, so no assemble or bundle can skip it. The full account.
What "no network permission" means in practice
Android grants INTERNET silently at install and enforces it in the kernel: a process without it is refused a socket. The refusal applies to the app's own code and to every library it bundles, on every version, regardless of what any setting says. Google's own reference describes the permission in one line, "Allows applications to open network sockets", with protection level normal. Absent that line, the sockets are not opened.
That is a different kind of claim from a privacy policy. A policy describes behaviour. A missing permission is a property of the binary you can read off the phone in your hand.
The one asterisk
Voice typing hands audio to Android's speech recogniser, a separate service with its own permissions. On Android 12 and later, FrankenKeys binds the on-device recogniser explicitly and refuses to start if there is none. On Android 10 and 11 it can only ask the system to prefer offline, and Android's documentation says that request "may have no effect". That is the system's connection, never the keyboard's. The voice typing page has the whole account, and the privacy policy at forgedev.studio/forgeboard/privacy says the same.
Permissions held
5
Network permissions
0
Version checked
3.13.0
Last verified
2026-09-06
Read it yourself
- Android's reference for
INTERNET: developer.android.com,Manifest.permission. - The Play permission list is derived from the manifest, not written by the developer: support.google.com, "Understand app privacy & security practices with Google Play's Data safety section".
- Pull the APK and open the manifest: Decompile FrankenKeys yourself.
- Why the label on Play is not the same thing as this list: Data safety labels versus the manifest.
There is no network to switch off. There never was one. If a future version ever changes this, the privacy policy changes first and the permission list on Play changes with it, because Google reads that list from the manifest and I cannot edit it.