{"adoption": {"forks": 145, "observed_at": "2026-08-28T04:03:47.336220+00:00", "stars": 1153}, "canonical_url": "https://ross.abutalabs.com/products/googlefindmytools", "card": {"archived": false, "artifact_type": "framework", "description": "Framework for tracking and building your own Google Find My Device / Find Hub trackers 🧭", "domain": ["security", "privacy", "embedded-systems", "developer-tools", "hardware"], "enriched": true, "function": ["security", "cryptography", "sdk", "developer-tools", "embedded"], "health_score": 68, "homepage": null, "language": "Python", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "experimental", "member_repos": ["leonboe1/GoogleFindMyTools"], "name": "leonboe1/GoogleFindMyTools", "platform": ["python", "windows", "embedded"], "pushed_at": "2026-05-05T17:22:27+00:00", "repo": "leonboe1/GoogleFindMyTools", "stars": 1153, "tags": ["find-my-device", "find-hub", "tracker", "esp32", "zephyr", "e2ee", "location-tracking", "reverse-engineering", "google-network", "linux", "macos"], "topics": [], "urls": [], "use_cases": ["locate my Google Find My Device tracker from a computer", "decrypt encrypted location reports from the Find Hub network", "build my own ESP32 tracker compatible with Google's Find My Device network", "read out E2EE keys from my Find My Device account", "register a custom Zephyr-based tracker with Google's network", "track lost Android devices outside the official app"], "what_it_is": "A Python framework that reimplements parts of Google's Find My Device (Find Hub) network, allowing users to query trackers and Android devices, decrypt their end-to-end encrypted location reports, and register custom ESP32- or Zephyr-based trackers. It includes firmware for building your own Find My Device-compatible trackers.", "when_to_avoid": ["you need a polished, production-ready tracking solution", "you run ARM Linux and need the full authentication flow", "you want to track devices without setting up Find My Device on an Android phone first", "you need support for P-256 curve trackers like Sony WH1000XM5 headphones"], "when_to_choose": ["you want to query or decrypt locations from Google's Find My Device network programmatically", "you want to build a DIY tracker using ESP32 or Zephyr hardware", "you need headless access to Find My Device locations without the Android app"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/googlefindmytools", "repo": "leonboe1/GoogleFindMyTools", "role": "main", "score": 58}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "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:47.336220+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:47.336220+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:33:28.667474+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d9171ba9bc41f0b6d65dab0d0bcc4f9d6469ca847dc5cd5986464711956d91ee", "fetched_at": "2026-08-28T04:03:47.336220+00:00", "kind": "readme", "missing": false, "url": "https://github.com/leonboe1/GoogleFindMyTools"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 80, "longevity": 47, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 665, "days_push": 120, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 58, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}