{"adoption": {"forks": 91, "observed_at": "2026-08-28T04:03:41.124638+00:00", "stars": 1125}, "canonical_url": "https://ross.abutalabs.com/products/android-usb-gadget", "card": {"archived": false, "artifact_type": "application", "description": "Convert your Android phone to any USB device you like! USB Gadget Tool allows you to create and activate USB device roles, like a mouse or a keyboard.  🛠🛡📱", "domain": ["android-tools", "security", "hardware", "developer-tools"], "enriched": true, "function": ["security", "developer-tools", "embedded"], "health_score": 20, "homepage": null, "language": "Kotlin", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["tejado/android-usb-gadget"], "name": "tejado/android-usb-gadget", "platform": [], "pushed_at": "2024-04-19T14:52:46+00:00", "repo": "tejado/android-usb-gadget", "stars": 1125, "tags": ["usb-gadget", "configfs", "usb-hid", "root-required", "fido-ctap", "ccid", "smartcard", "uvc-camera", "kotlin", "android"], "topics": ["android", "usb", "gadget", "kernel", "configfs", "usb-hid", "usb-devices", "ctap", "ctap2", "ccid", "smartcard", "hid", "functionfs", "authorizer", "usb-gadget", "root"], "urls": [], "use_cases": ["turn my android phone into a usb keyboard or mouse", "use my phone as a fido ctap hardware security key for webauthn", "emulate a ccid smartcard reader over usb from android", "disable adb and mtp usb functions for security", "create custom usb composite device profiles on android", "activate usb gadget roles automatically at boot"], "what_it_is": "An Android app that uses the Linux kernel's ConfigFS API to create and activate arbitrary USB gadget device roles, such as keyboard, mouse, FIDO CTAP authenticator, CCID smartcard reader, or UVC camera. It requires root permissions and a kernel with ConfigFS support, and manages gadget profiles rather than implementing the device endpoints themselves.", "when_to_avoid": ["your device is not rooted or its kernel lacks ConfigFS USB gadget support", "you need the actual endpoint implementations (e.g. sending keystrokes) rather than gadget management - you'll need companion apps like Authorizer", "you want a no-root solution or support for non-Android platforms"], "when_to_choose": ["you have a rooted Android device with a ConfigFS-capable kernel and want to redefine its USB device role", "you need a software-defined USB HID device, FIDO token, or CCID reader without extra hardware", "you want to harden a phone by disabling default USB functions like adb and mtp"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/android-usb-gadget", "repo": "tejado/android-usb-gadget", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "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:03:41.124638+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:41.124638+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:39:35.863069+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9771e80b6ab8d92732301ecf6ee7de5dd0f1539a519ee06f640697b982312699", "fetched_at": "2026-08-28T04:03:41.124638+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tejado/android-usb-gadget"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2228, "days_push": 866, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 23, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}