Turn your Android phone into a wireless keyboard, mouse, and media remote for any Bluetooth host. No companion app on the target device.
Or grab the latest APK directly from GitHub Releases.
Linkpad is a Bluetooth HID controller built natively for Android. It pairs with any host that supports Classic Bluetooth — macOS, Windows, Linux, iPadOS, Android TV, and most smart TVs — and shows up as a generic combo keyboard + mouse. The host doesn't need any driver, helper app, or pairing code beyond the standard Bluetooth flow.
Use it as a silent remote for your living-room TV, a backup keyboard when yours dies mid-meeting, or a desk-side trackpad when you want your laptop closed.
- Touchpad — laptop-class trackpad with 1-finger move, 2-finger scroll (vertical + horizontal AC Pan), 2-finger tap right-click, tap-to-drag, and a precision right-edge scroll strip.
- Software keyboard — relays your typing to the host in real time. Optional Shortcuts row (Cmd / Ctrl + C/V/X/Z/A, Alt+Tab), F-keys, Edit cluster (Backspace / Del / Home / End / PgUp / PgDn / Insert), and Arrow cluster.
- Air mouse — gyroscope-driven cursor with low-pass filter. Configurable sensitivity, axis invert, and per-button visibility.
- Media remote — brightness, volume, mute, prev/next track, play/pause, plus press-and-hold FF/RW for continuous seeking.
- TV Remote — dedicated tab with D-Pad ring, system keys (Back / Home / Menu), volume & channel controls, colour function keys (F1–F4), Power & Input/Source buttons, and a numeric keypad.
- Multi-host profiles — save Mac / PC / iPad / TV profiles, each with its own target-OS layout and last-connected device. Switch in one tap.
- Quick Settings Tile — connect or reconnect directly from the Android notification shade.
- Device Switcher Dropdown — one-tap switch between paired hosts with Disconnect and Forget-device options.
- Themed UI — SoulExtender Synth glassmorphic dark theme with electric violet, neon cyan, and synth magenta accents. Light / dark / system toggle.
- Redesigned glassmorphic UI (SoulExtender Synth theme) with frosted-glass nav bar and radial glow effects.
- TV Remote tab — full D-Pad, numeric keypad, Power & Input/Source buttons, colour keys.
- Onboarding walkthrough — guided 4-page first-launch setup with permission explanations.
- Quick Settings Tile — connect to Linkpad from the notification shade.
- Device Switcher Dropdown — switch, disconnect, or forget paired hosts without leaving the current tab.
- Independent Windows & macOS shortcut rows — toggle each OS's shortcut strip separately on the Keyboard tab.
- Android nav buttons on Touchpad — Back / Home / Recents row (toggle in Settings → Controls).
- Scroll strip side toggle — move the edge scroll strip to the left or right (Settings → Mouse).
- In-app Bluetooth pairing — pair new devices directly inside Linkpad; no need to open Android Settings.
- Windows Bluetooth keep-alive — background heartbeat prevents Sniff Mode lag and stutter on Windows.
- Smooth 125 Hz mouse — throttled delta distribution eliminates L2CAP buffer overflow and cursor jitter.
- Background connection retention — foreground service auto-promotes on connect so the link survives app minimisation.
- Zero-lag typing — keyboard queue runs on
Dispatchers.IO; key cycle cut to 20 ms. - Press-and-hold FF/RW — hold for continuous seeking; brief tap sends a single skip.
- Fixed crash on rapid double-tap of "Get Started" in onboarding (
ArrayIndexOutOfBoundsException). - Fixed QS Tile crash on Android 13 and below (
Tile.setSubtitleAPI guard). - Fixed stuck keys on host when press-and-hold seek loop was cancelled.
- Fixed Bluetooth permission denial failing silently — now shows an error card with a Settings deep-link.
- Fixed erratic horizontal scroll on Windows (explicit HID AC Pan bounds in descriptor).
See update.md for the full detailed changelog.
| Touchpad | Keyboard | Air Mouse |
|---|---|---|
| Trackpad surface + edge scroll strip | Live typing relay + chip rows | Gyro cursor visualizer + click row |
| Media | TV Remote | Connect | Settings |
|---|---|---|---|
| Brightness / volume / transport | D-Pad + numpad + system keys | Scan + paired history | Profiles, OS, theme, About |
- File → Open and select the project root.
- When prompted "Gradle Wrapper not found", choose OK / Use Gradle from gradle-wrapper.properties.
- Studio downloads everything. Hit Run.
brew install gradle
gradle wrapper --gradle-version 8.6
./gradlew assembleDebug
./gradlew installDebug # installs to a USB-connected device| Command | Output |
|---|---|
./gradlew assembleDebug |
app-debug.apk (com.btremote.app.debug suffix) |
./gradlew assembleRelease |
R8-shrunk signed release APK |
./gradlew bundleRelease |
AAB for Play Store |
./gradlew lint |
Lint report |
./gradlew test |
Unit tests |
- Open Linkpad → Connect tab → tap Scan.
- Pick the device from the list (bonded devices appear first).
- On the host, accept the pairing request (Linkpad shows up as a combo keyboard + mouse named Linkpad).
- Done. Switch back to Touchpad / Keyboard / Media — anything you do is mirrored to the host instantly.
After the first pair, the active profile remembers the device. Tap QUICK on the connection bar next launch — no scan needed.
- macOS 12+
- Windows 10 / 11
- Linux (BlueZ 5.50+)
- iPadOS / iOS 14+
- Android TV / Google TV
- Most smart TVs (LG, Samsung) accept it as a BT keyboard
Not supported: Android phones as the host. Stock and skinned Android (MIUI / One UI / ColorOS) filters out HID-Combo from another phone. Not fixable app-side.
- Kotlin + Jetpack Compose (no XML layouts)
- Hilt dependency injection
- DataStore Preferences (split across app prefs / paired devices / host profiles)
- BluetoothHidDevice API for HID reports
- MVVM with one ViewModel per screen
- Foreground Service owns the HID profile proxy + device connection lifecycle
- Min SDK 28 · Target SDK 35
app/
├── bluetooth/ HID descriptor, report sender, service, scan manager, QS tile
├── data/ Preferences, paired-device cache, host profiles
├── sensor/ Gyroscope reader for air mouse
└── ui/
├── components/ Connection bar, glass card, mouse buttons, sliders, toggles
├── navigation/ Compose nav graph
├── screens/ Touchpad / Keyboard / AirMouse / Media / TV / Connect / Settings / Onboarding
└── theme/ Material3 color, typography
The HID descriptor is a byte-exact combo (Boot Keyboard + 5-button mouse with AC Pan + Consumer control). Mouse polling runs at ~125 Hz to match commercial HID devices. Keyboard input uses 6-key rollover with mutex-guarded slot allocation.
Linkpad never connects to the internet. All Bluetooth traffic is local. Only data stored:
- A list of recently paired devices (name + MAC), kept on-device.
- Your settings (speeds, toggles, theme).
- Host profiles you create.
Nothing leaves your phone.
- Custom keyboard layouts (AZERTY, QWERTZ, Dvorak)
- Macro recorder
- Lock-screen widget for play / pause / skip
- Material You dynamic color
- Optional encrypted cloud sync of profiles
Issues and pull requests welcome. Before submitting:
- Run
./gradlew lintand./gradlew test. - Keep diffs focused — one feature or fix per PR.
- If you touch the HID descriptor, re-pair every test host before retesting (hosts cache the descriptor at bond time).
MIT — see LICENSE.
Devdas Kumar · @Devdas-gupta
If Linkpad saved you a Bluetooth dongle, a star on the repo is appreciated. ⭐
