{"adoption": {"forks": 1043, "observed_at": "2026-08-28T04:10:59.346513+00:00", "stars": 12569}, "canonical_url": "https://ross.abutalabs.com/products/urh", "card": {"archived": true, "artifact_type": "application", "description": "Universal Radio Hacker: Investigate Wireless Protocols Like A Boss", "domain": ["security", "iot", "reverse-engineering", "hardware"], "enriched": true, "function": ["security", "reverse-engineering", "penetration-testing", "fuzzing", "simulation", "gui"], "health_score": 10, "homepage": null, "language": "Python", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["jopohl/urh"], "name": "jopohl/urh", "platform": ["windows", "python", "cross-platform"], "pushed_at": "2025-12-19T14:25:58+00:00", "repo": "jopohl/urh", "stars": 12569, "tags": ["sdr", "software-defined-radio", "wireless-protocols", "signal-analysis", "hackrf", "rtl-sdr", "protocol-reverse-engineering", "demodulation", "qt", "wireless", "linux", "macos"], "topics": ["security", "wireless", "iot", "hacking", "hackrf", "rtl-sdr", "limesdr", "usrp", "sdrplay", "airspy", "qt", "python", "bladerf", "radio", "sdr"], "urls": [], "use_cases": ["reverse-engineer wireless protocols from captured RF signals", "demodulate and decode signals from an SDR like HackRF or RTL-SDR", "fuzz stateless IoT wireless protocols", "simulate stateful attacks against wireless devices", "automatically infer protocol fields from recorded messages", "crack custom encodings like CC1101 data whitening", "analyze and replay RF communications of smart home devices"], "what_it_is": "Universal Radio Hacker (URH) is a complete open-source suite for investigating wireless protocols, with native support for many common Software Defined Radios. It provides automatic modulation parameter detection, customizable decodings, protocol field inference, a fuzzing component, and a simulation environment for stateful attacks.", "when_to_avoid": ["you only need Wi-Fi or Bluetooth analysis, which dedicated tools handle better", "you need a headless CLI-only signal processing pipeline", "you require real-time signal monitoring at high bandwidths beyond URH's analysis focus"], "when_to_choose": ["you need a GUI-based tool to capture, analyze, and replay wireless signals with an SDR", "you want automated modulation detection and protocol field inference during RF reverse-engineering", "you are doing IoT or embedded security research on proprietary wireless protocols"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/urh", "repo": "jopohl/urh", "role": "main", "score": 10}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "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:10:59.346513+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:10:59.346513+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:13:57.496752+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "365ed71a5ec999b24f0a21c0db98c93653c734d6ff8417ffaa515aab746f2894", "fetched_at": "2026-08-28T04:10:59.346513+00:00", "kind": "readme", "missing": false, "url": "https://github.com/jopohl/urh"}, {"content_hash": "7d0bd1a3a0a65373659c14dea25d96a3d2b36d7cfdf64447a5cabe5607075ee8", "fetched_at": "2026-08-29T08:10:27.677658+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/urh/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 58, "longevity": 100, "rhythm": 30}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["archived"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3806, "days_push": 257, "days_rel": 259, "gap_med": 400, "n_releases_24m": 2}, "score": 10, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}