FrankenKeys · the receipt

Every permission FrankenKeys holds, and the one it does not

The complete permission list of the FrankenKeys Android keyboard: five entries with a reason each, no INTERNET, and three ways to confirm it yourself.

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.

N/I

Rated N/I: no internet permission. Settings, Apps, FrankenKeys, Permissions, three-dot menu, All permissions: nothing under Other says "have full network access". Play listing, About this app, App permissions, See more: same. adb shell dumpsys package studio.forgedev.forgeboard: five requested permissions. Step by step.

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.