Bluetooth bridge / direct HID: a landscape Android app can send keyboard and mouse events either through Flipper Zero (BLE Serial → USB HID) or directly to a PC over Bluetooth HID (no Flipper).
Android app ──BLE Serial──► Flipper FAP ──USB HID──► PC
I often work with devices that ship without a keyboard and needed something universal — a keyboard that can reach hosts over as many interfaces as practical (USB via Flipper today, direct Bluetooth HID from the phone, more later). Dedicated mini keyboards help, but their radio dongles kept going missing, which got old fast. A phone is almost always in reach, and a Flipper Zero is harder to lose than a tiny USB stick — so the phone becomes the keys, and Flipper (or Bluetooth) is the cable into the target.
Keyboard (macOS · English), dual labels, stacked ↑↓:
Layout switch banner after swiping the space bar:
Connected (macOS · English):
Touchpad mode:
Settings — output mode (Flipper vs Direct Bluetooth) and keyboard name:
Settings — host list, keyboard template, and languages:
Settings — languages (enabled pinned to the top):
Waiting for phone (USB connected). Bottom hint includes Dn3=shot when built with AKB_SCREENSHOT=1:
Phone connected over BLE — ready to type:
On-device capture: triple short Down → PBM on SD (apps_data/android_keyboard_bridge/). Details: docs/FLIPPER.md.
More screenshots: docs/screenshots/.
| Path | Description |
|---|---|
docs/BUILD.md |
Build, flash, install, troubleshooting |
docs/ANDROID.md |
Android app UI, Settings, templates + language packs |
docs/FLIPPER.md |
FAP behavior, USB identity, BLE/RPC, optional screenshots |
docs/PROTOCOL.md |
BLE UUIDs and frame format |
docs/screenshots/ |
Android + Flipper UI screenshots |
flipper/android_keyboard_bridge/ |
Flipper FAP sources (C — production / default) |
flipper/android_keyboard_bridge_rust/ |
Same FAP in Rust, for educational purposes only |
android/ |
Android app (assets/layouts/templates/, assets/layouts/languages/) |
- Flipper Zero
- Android 8.0+ (API 26), BLE
- USB data cable (Flipper ↔ PC)
- Phone paired with Flipper in system Bluetooth settings
- Local
flipperzero-firmwarecheckout to build the FAP - JDK 17 for command-line Android builds
# Flipper
make flipper-link
make flipper-launch
# Android
make apk-installThen on the phone:
- Settings → choose Via Flipper or Direct Bluetooth to PC, pick a template, enable languages (search the list), optionally Show two languages on keys → Save
- Tap the top-left connection button (green = ready; blue = waiting for PC to pair in Direct mode)
- For Direct BT without a saved PC: accept discoverable, then pair/connect from the PC — host MAC is saved automatically
- Type on the keyboard, or use the top-center Keyboard | Touchpad switch
- Swipe on the space bar to switch languages (banner + toolbar show the active name)
Details: docs/ANDROID.md, docs/FLIPPER.md.
Bundled templates: macOS, PC, Number. Bundled label packs are generated from CLDR Windows keyboards (EN, RU, DE, FR, … — see make language-packs). Settings lists all system-known languages (searchable); pick what you need. Optional dual-label keys (current large, next small). Drop extra language JSON into the app’s files/layouts/languages/ folder (see docs/ANDROID.md).
Limits: Android often exposes only the primary system language, and does not provide soft-keyboard glyph maps — so auto-detect and “letters from the system keyboard” are incomplete. Real labels need a pack (bundled or your JSON); other selections fall back to English QWERTY on the keys. Layout screens also do not switch the Mac/PC input language.
If you have a solid idea how to read the full preferred-language list or keyboard layouts on stock Android without hacks, please open an issue — I’d be grateful for tips.
make help
make apk
make apk-install
make apk-release # → FlipperZeroKbd-<version>.apk
make apk-release-install
make flipper-link
make flipper-build
make flipper-flash
make flipper-launch
make flipper-rust-build # optional educational Rust FAP (.fap)
make flipper-cliFull instructions: docs/BUILD.md.
Keyboard taps use key_down / key_up; touchpad uses mouse move / button / scroll frames (same 6-byte header). See docs/PROTOCOL.md.
Built with help from Cursor.








