{"adoption": {"forks": 257, "observed_at": "2026-08-28T04:07:04.581624+00:00", "stars": 2615}, "canonical_url": "https://ross.abutalabs.com/products/keymapper", "card": {"archived": false, "artifact_type": "application", "description": "An Android app to remap the buttons on your devices", "domain": ["android-tools", "developer-tools", "accessibility", "gaming-tools"], "enriched": true, "function": ["workflow-automation", "developer-tools"], "health_score": 98, "homepage": "https://keymapper.app", "language": "Kotlin", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["keymapperorg/KeyMapper"], "name": "keymapperorg/KeyMapper", "platform": [], "pushed_at": "2026-08-11T23:56:14+00:00", "repo": "keymapperorg/KeyMapper", "stars": 2615, "tags": ["key-remapping", "macros", "accessibility-service", "gamepad", "bluetooth-keyboard", "floating-buttons", "foss", "android", "mobile"], "topics": ["keyboard", "keymapping", "keymapper", "android", "android-app", "androidapplication", "keyevent", "android-development", "kotlin", "android-accessibility", "accessibilityservice", "bluetooth", "bluetoothkeyboard", "keyboard-shortcuts", "keyboards", "xda-thread", "switch", "nintendo-switch", "joycon"], "urls": [], "use_cases": ["remap volume buttons to toggle the flashlight", "make a gamepad button tap the screen", "create custom macros on a bluetooth keyboard", "make the power button call someone when pressed five times", "create on-screen floating buttons that act like keys", "remap headset buttons to control media playback"], "what_it_is": "Key Mapper is a free and open-source Android app that remaps buttons on phones, keyboards, gamepads, headsets, and other devices using an accessibility service. It lets users build macros with over 100 actions, custom triggers, constraints, and on-screen floating buttons.", "when_to_avoid": ["you need to remap mouse buttons or joystick/trigger axes, which are unsupported", "you need button remapping on non-Android platforms", "your device aggressively kills background apps and you cannot disable battery optimization"], "when_to_choose": ["you want to remap physical buttons or keys on an Android device without root", "you need macros combining taps, gestures, keyboard input, or app launches", "you want a FOSS key remapper available on Google Play and F-Droid"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/keymapper", "repo": "keymapperorg/KeyMapper", "role": "main", "score": 98}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:04.581624+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:20:25.762670+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "bd84c7d1e6248b3a858490951140501332aff4280945c13f8425f1aae394b9df", "fetched_at": "2026-08-28T04:07:04.581624+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keymapperorg/KeyMapper"}, {"content_hash": "bbe27464fed44202da3f8f0e2eab4982521b3294795dc9632bec77b54e04f7b3", "fetched_at": "2026-08-29T10:03:24.336671+00:00", "kind": "homepage", "missing": false, "url": "https://keymapper.app"}, {"content_hash": "760eccc21a37eaa47408c0ae636b13ac1db5e1fe9e11be110ffc605c31c3f455", "fetched_at": "2026-08-29T10:03:24.348514+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/user-guide/oculus"}, {"content_hash": "026b21a3403684a603019fe7c6e47f1e2cff1d1ebd6bea48f7928095b1e588e2", "fetched_at": "2026-08-29T10:03:24.346093+00:00", "kind": "site_page", "missing": false, "url": "https://keymapper.app/faq"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 97, "longevity": 100, "rhythm": 97}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2970, "days_push": 22, "days_rel": 22, "gap_med": 7, "n_releases_24m": 38}, "score": 98, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}