{"adoption": {"forks": 143, "observed_at": "2026-08-28T04:07:49.875937+00:00", "stars": 3223}, "canonical_url": "https://ross.abutalabs.com/products/findmypy", "card": {"archived": false, "artifact_type": "library", "description": "🍏 + 🎯 + 🐍 = Query Apple's FindMy Network with Python!", "domain": ["reverse-engineering", "developer-tools", "privacy"], "enriched": true, "function": ["sdk", "http-client", "cryptography"], "health_score": 97, "homepage": "http://docs.mikealmel.ooo/FindMy.py/", "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["malmeloo/FindMy.py"], "name": "malmeloo/FindMy.py", "platform": ["python", "cross-platform", "cli"], "pushed_at": "2026-08-12T18:15:02+00:00", "repo": "malmeloo/FindMy.py", "stars": 3223, "tags": ["airtag", "find-my", "apple", "location-tracking", "openhaystack", "offline-finding", "bluetooth", "async", "automation"], "topics": ["airtag", "find-my", "apple", "bluetooth", "findmy", "location-tracker", "offline-finding"], "urls": [], "use_cases": ["track the location of my AirTag from a Linux server using Python", "build a custom location tracker with OpenHaystack tags and query their positions", "fetch and decrypt Find My location reports without owning a Mac", "scan for nearby Find My devices and read their public keys", "integrate AirTag location lookup into my own Python project", "sign in to an Apple account with 2FA to retrieve device locations"], "what_it_is": "FindMy.py is a Python library for querying Apple's Find My network to fetch and decrypt the location of AirTags, Apple devices, and custom OpenHaystack tags, without needing a Mac. It supports Apple account sign-in with 2FA, accessory key management, nearby device scanning, and both async and sync APIs.", "when_to_avoid": ["you need a polished end-user tracking app rather than a developer library", "your use case depends on unofficial Apple APIs that may break at any time and you need guaranteed stability", "you are not comfortable with the legal/ToS implications of reverse-engineered Apple services"], "when_to_choose": ["you want a maintained, well-documented Python library for the Find My network instead of fragmented research code", "you need cross-platform access (no Mac required) to AirTag or iDevice locations", "you want both async and sync APIs and support for official and DIY accessories"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/findmypy", "repo": "malmeloo/FindMy.py", "role": "main", "score": 88}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "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:07:49.875937+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:49.875937+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:44:19.042324+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "1a5663f2a97c556ed467a55399fbed397eecbc00be535001f74507a263f39f1f", "fetched_at": "2026-08-28T04:07:49.875937+00:00", "kind": "readme", "missing": false, "url": "https://github.com/malmeloo/FindMy.py"}, {"content_hash": "eb5cf75a017f17e07244695cb0fb114db7f0f0f897a63f371fb9a4e7a626dbe4", "fetched_at": "2026-08-29T09:37:57.653268+00:00", "kind": "homepage", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/"}, {"content_hash": "692b3b79523802b3c8f1dab52c7cfd161be8c3cb0516ccf4b66b32be58654be9", "fetched_at": "2026-08-29T09:37:57.655649+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/getstarted/00-install.html"}, {"content_hash": "c6e3df4bfe8aa49ccfa3ae85927e7313f0a7706d74569e218665fe36e67b7a3a", "fetched_at": "2026-08-29T09:37:57.657384+00:00", "kind": "site_page", "missing": false, "url": "http://docs.mikealmel.ooo/FindMy.py/technical/index.html"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 97, "longevity": 69, "rhythm": 86}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 977, "days_push": 21, "days_rel": 93, "gap_med": 28.5, "n_releases_24m": 15}, "score": 88, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}