{"adoption": {"forks": 685, "observed_at": "2026-08-28T04:10:28.596791+00:00", "stars": 9151}, "canonical_url": "https://ross.abutalabs.com/products/espectre", "card": {"archived": false, "artifact_type": "application", "description": "ESPectre - Motion detection system based on Wi-Fi spectre analysis (CSI), with Home Assistant integration.", "domain": ["iot", "privacy", "hardware"], "enriched": true, "function": ["monitoring", "machine-learning", "embedded", "sdk"], "health_score": 100, "homepage": "https://espectre.dev", "language": "Python", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["francescopace/espectre"], "name": "francescopace/espectre", "platform": ["iot", "python"], "pushed_at": "2026-08-26T14:37:37+00:00", "repo": "francescopace/espectre", "stars": 9151, "tags": ["wifi-sensing", "csi", "motion-detection", "presence-detection", "diy", "smart-home", "privacy-first", "through-wall-detection", "automation", "esphome", "micropython"], "topics": ["csi", "home-assistant", "wifi", "wifi-sensing", "esp-32", "espectre", "diy", "motion-detection"], "urls": [], "use_cases": ["detect motion at home using Wi-Fi signals instead of cameras", "build a privacy-friendly presence sensor with an ESP32 and Home Assistant", "detect movement through walls without PIR sensors", "automate lights or alarms when someone enters a room", "experiment with Wi-Fi CSI sensing and signal processing algorithms", "replace camera-based security sensors for GDPR-friendly monitoring"], "what_it_is": "ESPectre is an open-source motion detection system that analyzes Wi-Fi Channel State Information (CSI) on ESP32 devices to detect movement without cameras or microphones. It ships as an ESPHome component with native Home Assistant integration, plus a Python/MicroPython research platform for algorithm development.", "when_to_avoid": ["you need a plug-and-play commercial product with no YAML configuration", "your router or ESP32 variant does not support CSI extraction", "you require precise location tracking rather than binary motion/presence detection", "you need a battery-powered sensor, since CSI analysis favors mains-powered devices"], "when_to_choose": ["you want camera-free, microphone-free motion detection that works through walls", "you already run Home Assistant with ESPHome and have a 2.4GHz Wi-Fi router", "you want a cheap (~€10 ESP32) DIY presence sensor with strong privacy guarantees", "you are a researcher prototyping Wi-Fi CSI sensing algorithms in Python"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/espectre", "repo": "francescopace/espectre", "role": "main", "score": 78}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "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:28.596791+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:10:28.596791+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:23:24.157039+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aefde6ff3bf465f517fe6570f9525bab2af40f98c41939e507b928295ee44016", "fetched_at": "2026-08-28T04:10:28.596791+00:00", "kind": "readme", "missing": false, "url": "https://github.com/francescopace/espectre"}, {"content_hash": "f5435477cee26e7a4937648c714af1ba9c140eefd157515a5449699d13fc4229", "fetched_at": "2026-08-29T08:23:30.996322+00:00", "kind": "homepage", "missing": false, "url": "https://espectre.dev"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 22, "rhythm": 84}, "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": 311, "days_push": 7, "days_rel": 104, "gap_med": 8, "n_releases_24m": 14}, "score": 78, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}