buttonoo
1.0.1 · GitHub
More about this app
Remaps the Nothing Essential Key to any press pattern; Shizuku enables the privileged input route.
buttonoo
Remap the Essential Key on Nothing phones to whatever you want, on any press pattern.
Single, double, triple and quadruple press, plus hold — each one can launch an app, open a shortcut or a specific activity, toggle the torch, change volume or brightness, cycle the ringer, fire the assistant, or show a column of apps to pick from. An edge overlay confirms what fired.
Android only. Built with Flutter over a Kotlin accessibility service.
Status
Working, and used daily on the author's device. Not yet on any store.
Single press needs an extra setup step — see Freeing the single press. Everything else works with nothing but the accessibility permission.
Download
Grab the APK from the latest release.
Take app-arm64-v8a-release.apk — every Nothing and CMF phone with an Essential Key is 64-bit
ARM. The armeabi-v7a and x86_64 builds are there for completeness and for emulators; you
almost certainly do not want them.
Requirements
- A Nothing or CMF phone with an Essential Key
- Android 13 (API 33) or newer
Other devices with an unmapped hardware key may work — the app matches on the raw scan code and nothing about it is specific to Nothing hardware — but no one has tested that.
Building
flutter pub get
flutter build apk --release
Release signing is opt-in — without a keystore the release APK comes out unsigned. To sign your
own builds, create android/key.properties, which is gitignored:
storeFile=/absolute/path/to/release.jks
storePassword=…
keyAlias=…
keyPassword=…
How it works
The short version: Android exposes hardware key events to accessibility services and almost nowhere
else, so the app runs one — KeyRemapService — with canRequestFilterKeyEvents. It watches for a
single scan code, classifies the press pattern, and runs the action you mapped to it.
The service does not request canRetrieveWindowContent and onAccessibilityEvent is empty, so it
cannot read screen content, text fields, or any other keystroke.
For the details — how the key surfaces, why the classifier is shaped the way it is, and what the unlock flow actually does — see docs/how-it-works.md.
Freeing the single press
Nothing OS claims the single press for Essential Space at the system level. Returning true from an
accessibility service does not take it back; the only way is to disable the system apps that hold it.
Nothing is uninstalled and it is reversible from inside the app.
Four routes, in order of friction:
- App Info — the app deep-links you to each package's settings page and you tap Disable. No tools, works on most Nothing OS builds.
- Built-in Wi-Fi ADB — pair over Wireless debugging from the phone itself, no PC.
- Shizuku — if you already have it set up.
- Manual ADB — the app gives you the exact commands to paste into a terminal.
Double, triple, quadruple and long press need none of this.
Privacy
No network use at runtime, no analytics, no accounts. Configuration lives in local Android DataStore.
The INTERNET permission is present only for the built-in ADB route, which connects to the phone's
own adbd over loopback.
Contributing
Issues and pull requests are welcome. Please run flutter analyze and flutter test before opening
a PR.
The codebase is small: lib/ is the Flutter UI, android/app/src/main/kotlin/ holds the service,
the gesture classifier, the action executor and the overlay. lib/native/remapper_channel.dart is
the entire boundary between the two.
Licence
GPL-3.0-or-later. See LICENSE.
Third-party components:
- libadb-android and sun-security-android — dual GPL-3.0-or-later / Apache-2.0
- Shizuku API — Apache-2.0
- HiddenApiBypass — Apache-2.0
- phosphor_flutter — MIT
- Doto and Geist Mono
typefaces — SIL Open Font License 1.1, see
fonts/OFL.txt
Not affiliated with, endorsed by, or connected to Nothing Technology Limited. "Nothing", "CMF" and "Essential Space" are their trademarks, used here only to describe what this app interoperates with.
How Shizuku is used
Can free and restore the Essential Key by disabling system apps via `IPackageManager` through Shizuku.
This is an AI-assisted analysis of Shizuku-related usages in the app's public source code. It is best effort, so it may not catch every single usage.
How this app uses Shizuku
Shizuku is used to free the Nothing Essential Key for remapping and to restore the original apps afterwards.
- Free the Essential Key: disables the preinstalled Essential apps that claim single, double and long press (Essential Space, Essential Recorder and related companion) so single press can run the action chosen in the app, using privileged package control through Shizuku. Nothing is uninstalled.
- Restore Essential apps: re-enables those same Essential apps so the original key behavior returns, using the same privileged package control through Shizuku.
Android APIs or commands used
IPackageManager.setApplicationEnabledSetting
Notable details
The same free and restore actions can also be done without Shizuku via Wi-Fi ADB pairing or by opening the system App Info screens manually, as offered in the unlock screen.
Changelog
What's new for version 1.0.1
Bug fixes. Installs straight over 1.0.0, your settings are kept.
Download app-arm64-v8a-release.apk — that's the one for every Nothing and CMF phone.
Fixed
- Camera works. Mapping a press to the camera did nothing at all before.
- Settings scrolls again. The page was stuck, so you couldn't reach anything past the first screenful.
- App shortcuts now tell you why they're empty. Android only lets your default launcher open another app's shortcuts, so buttonoo can't do it — it used to just show a blank list for every app. Map the app itself, or a specific activity, instead.
- Haptic strength now uses the same slider-style tabs as the overlay settings.
Worth knowing
Actions that open an app won't show up while your phone is locked. Android keeps them behind the lockscreen until you unlock. Torch, volume, brightness, ringer and media all work fine locked — just switch that gesture on under Behaviour.
If the accessibility toggle is greyed out after installing:
Settings → Apps → buttonoo → ⋮ (top right) → Allow restricted settings
Android blocks sideloaded apps from accessibility until you allow it. Installing through F-Droid or Obtainium skips this.
Checking the download is really ours
apksigner verify --print-certs app-arm64-v8a-release.apk
SHA-256: 573688b1648564896cf11893e19688fee9d6bddc17e59ac932325dd22d947b40
Same as 1.0.0. If it differs, it didn't come from us.
GPL-3.0-or-later. Not affiliated with Nothing Technology Limited.
Permissions
9 permissions requested
Sources
3 sources
Sources
3 sources