{"id":51971594,"url":"https://github.com/koukeneko/essentialkeytools","last_synced_at":"2026-07-29T23:01:08.410Z","repository":{"id":369961469,"uuid":"1292230699","full_name":"KoukeNeko/EssentialKeyTools","owner":"KoukeNeko","description":"Remap the Nothing Phone Essential Key to your own actions — no root required.","archived":false,"fork":false,"pushed_at":"2026-07-15T17:36:33.000Z","size":1012,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-15T18:25:24.490Z","etag":null,"topics":["accessibility-service","android","cmf","essential-key","jetpack-compose","key-remapper","keymapper","kotlin","material3","no-root","nothing","nothing-os","nothing-phone","remapping","shizuku"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KoukeNeko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-07T11:28:36.000Z","updated_at":"2026-07-15T17:37:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/KoukeNeko/EssentialKeyTools","commit_stats":null,"previous_names":["koukeneko/essentialkeytools"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/KoukeNeko/EssentialKeyTools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoukeNeko%2FEssentialKeyTools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoukeNeko%2FEssentialKeyTools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoukeNeko%2FEssentialKeyTools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoukeNeko%2FEssentialKeyTools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KoukeNeko","download_url":"https://codeload.github.com/KoukeNeko/EssentialKeyTools/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoukeNeko%2FEssentialKeyTools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36052204,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-29T02:00:04.910Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility-service","android","cmf","essential-key","jetpack-compose","key-remapper","keymapper","kotlin","material3","no-root","nothing","nothing-os","nothing-phone","remapping","shizuku"],"created_at":"2026-07-29T23:01:07.374Z","updated_at":"2026-07-29T23:01:08.401Z","avatar_url":"https://github.com/KoukeNeko.png","language":"Kotlin","funding_links":["https://buymeacoffee.com/doershing"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"logo/github_social_preview.png\" alt=\"Essential Key Tools\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eEssential Key Tools\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eYour Essential Key, your shortcuts.\u003c/strong\u003e\u003cbr\u003e\n  Turn single, double, triple, and long presses into the actions you actually use.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://play.google.com/store/apps/details?id=dev.koukeneko.essentialkeytools\"\u003e\u003cimg alt=\"Google Play\" src=\"https://img.shields.io/badge/GET_IT_ON-GOOGLE_PLAY-414141?style=for-the-badge\u0026logo=googleplay\u0026logoColor=white\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/KoukeNeko/EssentialKeyTools/releases/latest\"\u003e\u003cimg alt=\"Release\" src=\"https://img.shields.io/github/v/release/KoukeNeko/EssentialKeyTools?style=for-the-badge\u0026logo=github\u0026label=RELEASE\u0026color=2196F3\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/KoukeNeko/EssentialKeyTools/releases\"\u003e\u003cimg alt=\"GitHub downloads\" src=\"https://img.shields.io/github/downloads/KoukeNeko/EssentialKeyTools/total?style=for-the-badge\u0026logo=github\u0026label=GITHUB%20DOWNLOADS\u0026color=4CAF50\"\u003e\u003c/a\u003e\n  \u003cimg alt=\"Android 15+\" src=\"https://img.shields.io/badge/ANDROID-15%2B-3DDC84?style=for-the-badge\u0026logo=android\u0026logoColor=white\"\u003e\n  \u003ca href=\"https://github.com/KoukeNeko/EssentialKeyTools/stargazers\"\u003e\u003cimg alt=\"Stars\" src=\"https://img.shields.io/github/stars/KoukeNeko/EssentialKeyTools?style=for-the-badge\u0026logo=github\u0026label=STARS\u0026color=2196F3\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://play.google.com/store/apps/details?id=dev.koukeneko.essentialkeytools\"\u003e\u003cstrong\u003eGet it on Google Play\u003c/strong\u003e\u003c/a\u003e\n  · \u003ca href=\"https://github.com/KoukeNeko/EssentialKeyTools/releases/latest\"\u003eDownload the APK\u003c/a\u003e\n  · \u003ca href=\"#getting-started\"\u003eGetting started\u003c/a\u003e\n  · \u003ca href=\"PRIVACY.md\"\u003ePrivacy\u003c/a\u003e\n\u003c/p\u003e\n\nEssential Key Tools gives the Nothing Phone's **Essential Key** a life beyond its default action.\nAssign a different shortcut to each gesture and use it instantly, without opening the app first.\n\nIt is built to keep you in control: no root access or computer setup is required. The app explains\nits accessibility use before Android settings open, provides clear agree and decline choices, and\nnever treats leaving the page as consent.\n\n## See it in action\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/1.png\" width=\"19%\" alt=\"Home screen\" /\u003e\n  \u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/2.png\" width=\"19%\" alt=\"Action picker\" /\u003e\n  \u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/3.png\" width=\"19%\" alt=\"Unlock wizard\" /\u003e\n  \u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/4.png\" width=\"19%\" alt=\"Key setup\" /\u003e\n  \u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/5.png\" width=\"19%\" alt=\"Key test\" /\u003e\n\u003c/p\u003e\n\n## Make one key do more\n\n### Four gestures, four shortcuts\n\nGive single press, double press, triple press, and long press their own actions. Launch an app,\ntoggle the flashlight, take a screenshot, lock the screen, control media, or change the ringer mode.\n\n### Take back the single press\n\nNothing OS normally reserves a single press for Essential Space or Recorder. The built-in unlock\nwizard shows the relevant packages and opens each App Info page so you can disable or restore them\nmanually. Double, triple, and long press work without this optional step.\n\n\u003e **Before you unlock:** freeing the single press disables Nothing's Essential Space and Recorder\n\u003e entirely. You can restore them from the same App Info pages, and an OS update may enable them\n\u003e again.\n\n### Test without surprises\n\nKey Test shows the detected hardware events and recognized gesture without running the shortcut\nassigned to it. You can confirm everything works before relying on a mapping.\n\n### Stay up to date on your terms\n\nUpdate checks happen only when you press **Check for updates**. Google Play installations stay with\nGoogle Play, sideloaded stable builds check stable GitHub Releases, and Preview builds check only\npre-releases. The app never downloads or installs an APK by itself.\n\n## A clear choice before accessibility\n\nThe first-run guide starts with language selection and a short introduction. Its final page explains:\n\n- why Essential Key detection needs Android's accessibility service;\n- which hardware-key information the app receives and how it is used;\n- what is stored on the device;\n- when screenshot or lock-screen actions can run; and\n- exactly what happens after either choice.\n\nTwo separate actions are always shown:\n\n- **Agree: use accessibility service** opens Android accessibility settings.\n- **Decline: don't use accessibility service** finishes setup without enabling the service.\n\nPressing Back or leaving the disclosure never enables accessibility. You can review the guide and\nchange your choice later from the home screen.\n\n## Privacy by design\n\n- Hardware-key events are processed immediately on the device and are not stored, uploaded, or\n  shared.\n- Only the Essential Key identifier confirmed in Key Setup is saved locally.\n- The app does not read screen content, text fields, or text you type.\n- Screenshot and lock-screen actions run only when you explicitly assign them to a gesture.\n- There are no accounts, analytics, ads, or tracking.\n\nRead the complete [Privacy Policy](PRIVACY.md).\n\n## Getting started\n\n1. **Choose your language** and read the short product introduction.\n2. **Review the accessibility disclosure** and choose whether to use the service.\n3. **Learn your key** from Home → *Key setup*, then press the Essential Key and save it.\n4. **Choose your shortcuts** by tapping each gesture on the home screen.\n5. **Test the gestures** in *Key Test* without executing their mapped actions.\n6. **Optionally free single press** with the *Unlock wizard* if you do not use Essential Space or\n   Recorder.\n\n## Compatibility\n\n- Android 15 or newer\n- Nothing phones with an Essential Key\n- English and Traditional Chinese\n\nThe app learns the key identifier at runtime instead of assuming every model or firmware reports the\nsame value. Availability of the system-app **Disable** button for the optional single-press unlock\ndepends on the Nothing OS build.\n\n## Get the app\n\nInstall Essential Key Tools from\n[Google Play](https://play.google.com/store/apps/details?id=dev.koukeneko.essentialkeytools) for the\nofficial release and updates delivered through Google Play.\n\nFor manual installation, download the signed APK from the\n[latest GitHub Release](https://github.com/KoukeNeko/EssentialKeyTools/releases/latest). Every stable\nrelease includes its APK SHA-256 digest plus VirusTotal and Koodous submission status. Preview builds\nuse a separate application ID and can be installed beside the stable app.\n\n---\n\n## Technical reference\n\n### How Essential Key detection works\n\nThe Essential Key enters the Android input pipeline as `keyCode=0`; current verified devices report\nLinux `scanCode=250`. Because the public key-layout files leave it unmapped, the accessibility\nservice can observe the event while the app filters for the identifier learned in Key Setup. The\ngesture classifier then resolves single, double, triple, or long press and runs the selected action.\n\nNothing OS also handles the default single press in system policy. Consuming the accessibility key\nevent does not stop that system action, which is why the separate manual unlock flow is needed for\nsingle-press remapping.\n\n### Permissions and network access\n\n- **Accessibility service** - observes hardware-key press and release events, filters them to the\n  learned Essential Key, classifies the gesture, and runs the mapped action. The service does not\n  process window or screen-content events.\n- **`INTERNET`** - fetches the public GitHub contributor list for the contribution card. A separate\n  request runs only after **Check for updates** is pressed and contacts Google Play or GitHub based\n  on the verified installation source.\n\n### Development\n\nInstall Android Studio with the Android SDK and JDK 21. Android Studio's bundled JBR works.\n\nmacOS / Linux:\n\n```bash\n./gradlew lint test assembleDebug\n```\n\nWindows PowerShell:\n\n```powershell\n.\\gradlew.bat lint test assembleDebug\n```\n\nOn macOS and Linux, the verification harness runs the same quality gate and prints a single\nPASS/FAIL summary. It uses `JAVA_HOME` when set, otherwise it detects Android Studio's macOS JBR or\nthe Java installation on `PATH`:\n\n```bash\n./scripts/verify.sh\n```\n\n`scripts/simulate-key.sh` is a best-effort development helper that injects a scancode-250 event with\n`adb sendevent`. It needs the correct input node and usually root on stock firmware; the app itself\ndoes not require root, Shizuku, ADB, or this development setup.\n\nPure logic such as gesture classification, settings serialization, unlock-status mapping, and\nupdate-version parsing is covered by JVM unit tests without requiring a device.\n\n\u003cp\u003e\n  \u003ca href=\"https://github.com/KoukeNeko/EssentialKeyTools/actions/workflows/build-apk.yml\"\u003e\u003cimg alt=\"Build\" src=\"https://img.shields.io/github/actions/workflow/status/KoukeNeko/EssentialKeyTools/build-apk.yml?branch=main\u0026style=for-the-badge\u0026logo=githubactions\u0026logoColor=white\u0026label=BUILD\"\u003e\u003c/a\u003e\n  \u003cimg alt=\"Kotlin\" src=\"https://img.shields.io/badge/KOTLIN-2.2.10-7F52FF?style=for-the-badge\u0026logo=kotlin\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"Jetpack Compose\" src=\"https://img.shields.io/badge/COMPOSE-4285F4?style=for-the-badge\u0026logo=jetpackcompose\u0026logoColor=white\"\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"License: MIT\" src=\"https://img.shields.io/badge/LICENSE-MIT-4CAF50?style=for-the-badge\u0026logo=github\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Support\n\nIf Essential Key Tools is useful to you, you can support development:\n\n\u003ca href=\"https://buymeacoffee.com/doershing\"\u003e\u003cimg alt=\"Buy Me a Coffee\" src=\"https://img.shields.io/badge/Buy%20Me%20a%20Coffee-doershing-FFDD00?style=for-the-badge\u0026logo=buymeacoffee\u0026logoColor=black\"\u003e\u003c/a\u003e\n\n## License\n\n[MIT](LICENSE) © KoukeNeko\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoukeneko%2Fessentialkeytools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkoukeneko%2Fessentialkeytools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoukeneko%2Fessentialkeytools/lists"}