{"adoption": {"forks": 198, "observed_at": "2026-08-28T04:06:14.273368+00:00", "stars": 2111}, "canonical_url": "https://ross.abutalabs.com/products/monitor", "card": {"archived": false, "artifact_type": "application", "description": "Distributed advertisement-based BTLE presence detection reported via mqtt", "domain": ["iot", "self-hosted"], "enriched": true, "function": ["monitoring", "iot", "message-queue"], "health_score": 20, "homepage": null, "language": "Shell", "license": null, "license_family": "other", "maturity": "maintenance", "member_repos": ["andrewjfreyer/monitor"], "name": "andrewjfreyer/monitor", "platform": ["iot", "cli"], "pushed_at": "2024-07-31T17:50:15+00:00", "repo": "andrewjfreyer/monitor", "stars": 2111, "tags": ["bluetooth", "btle", "presence-detection", "mqtt", "home-automation", "beacon", "shell-script", "automation", "linux"], "topics": ["beacon", "cell-phone", "mqtt-message", "advertisement", "btle", "presence-detection", "bluetooth-devices"], "urls": [], "use_cases": ["detect when family members arrive home using their cell phone bluetooth signals", "track bluetooth beacons for room-level presence detection in home automation", "set up distributed presence detection across multiple raspberry pis reporting to mqtt", "trigger home automation scenes based on which bluetooth devices are nearby", "passively monitor bluetooth devices without pairing or connecting", "integrate bluetooth presence detection with home assistant via mqtt"], "what_it_is": "A shell-based application that performs passive Bluetooth Low Energy (BTLE) presence detection of beacons, cell phones, and other Bluetooth devices. It reports detected devices via MQTT, making it useful for distributed home automation setups across multiple devices.", "when_to_avoid": ["you need active bluetooth connection-based tracking rather than passive advertisement listening", "you require a maintained project with an explicit license and active development", "you need presence detection on non-linux platforms like windows or macos", "you want a plug-and-play solution without manual raspberry pi setup"], "when_to_choose": ["you need passive, unobtrusive bluetooth presence detection without pairing", "you want to run detection on multiple low-cost devices like raspberry pi zero w distributed around a property", "your home automation stack already uses mqtt as a message bus", "you want a lightweight shell-based solution with minimal dependencies"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/monitor", "repo": "andrewjfreyer/monitor", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "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:14.273368+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:14.273368+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:53:43.062070+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1c5f0e38c59b5bf7be9ba78658dd473af8a328aacb3b99bbf6e6e1d68a8f9045", "fetched_at": "2026-08-28T04:06:14.273368+00:00", "kind": "readme", "missing": false, "url": "https://github.com/andrewjfreyer/monitor"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3032, "days_push": 763, "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}}