{"adoption": {"forks": 73, "observed_at": "2026-08-28T04:06:51.411421+00:00", "stars": 2435}, "canonical_url": "https://ross.abutalabs.com/products/whosthere", "card": {"archived": false, "artifact_type": "cli-tool", "description": "Local Area Network discovery tool with an interactive Terminal User Interface (TUI) written in Go.  Discover, explore, and understand your LAN in an intuitive way. Knock Knock.. who's there? 🚪", "domain": ["networking", "security", "developer-tools"], "enriched": true, "function": ["networking", "monitoring", "security", "cli", "terminal-ui"], "health_score": 100, "homepage": null, "language": "Go", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["ramonvermeulen/whosthere"], "name": "ramonvermeulen/whosthere", "platform": ["windows", "go", "cli", "cross-platform"], "pushed_at": "2026-08-25T13:24:00+00:00", "repo": "ramonvermeulen/whosthere", "stars": 2435, "tags": ["lan-discovery", "network-scanner", "mdns", "ssdp", "arp", "tui", "port-scanner", "network-analysis", "command-line", "linux", "macos"], "topics": ["go", "golang", "lan", "network", "networking", "tui", "network-analysis", "scanner", "tview"], "urls": [], "use_cases": ["discover all devices on my local network", "scan my LAN without root privileges", "find out which devices are connected to my wifi", "identify device manufacturers on my network", "explore my network from the terminal", "run a network scanner with an HTTP API", "find open ports on devices in my LAN"], "what_it_is": "Whosthere is a Local Area Network discovery tool with an interactive Terminal User Interface, written in Go. It discovers devices via mDNS, SSDP, and unprivileged ARP cache sweeps, enriches them with OUI manufacturer lookups, and offers an optional port scanner and daemon mode with an HTTP API.", "when_to_avoid": ["you need deep packet inspection or full network traffic analysis", "you require enterprise-grade network inventory across multiple subnets or VLANs", "you need passive monitoring of network traffic rather than active scanning", "scanning networks you do not own or lack permission to scan"], "when_to_choose": ["you want a fast, interactive TUI for LAN device discovery", "you cannot or do not want to use elevated privileges for scanning", "you need mDNS/SSDP service discovery plus ARP-based host detection in one tool", "you want a daemon mode with an HTTP API for integration with other tools"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/whosthere", "repo": "ramonvermeulen/whosthere", "role": "main", "score": 83}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "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:06:51.411421+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:51.411421+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:31:07.333197+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "548e6f21042aa86daa7c4fde8ea48b1c2e552f07590d779dfbd22ca468fadde4", "fetched_at": "2026-08-28T04:06:51.411421+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ramonvermeulen/whosthere"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 27, "rhythm": 94}, "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": 378, "days_push": 8, "days_rel": 41, "gap_med": 1, "n_releases_24m": 16}, "score": 83, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}