
FindMy CLI
github.com/omarshahine/findmy-cli- Category
- Developer Tools
- Rank
- No. 914Tools index
- Pricing
- Open Source
- Type
- TOOL
- Use case
- Data, Retrieval & Knowledge
- Interfaces
- CLI
- Builder
- @OmarShahine
- GitHub
- 59 stars
- Latest release
- v0.3.0
- Date
About
A command-line tool that extracts your Find My friends' locations from macOS by automating the FindMy app GUI and using OCR to read location data. Works around Apple's lack of public API by taking screenshots and parsing the interface.
What it does
A terminal utility written in Go that pairs with a small Swift helper to drive the native macOS Find My app directly: it brings the window forward, captures its contents, and runs Apple's on-device text recognition to turn the sidebar into structured records for people, devices and trackers. Beyond simple lookups, it can ring a device by locating and clicking the Play Sound control, save aliases for frequent targets, watch for changes on a timer, and log every observation to a local database you can query later.
Why it's ranked here
It earns a look because it solves a real gap without cutting corners on trust: everything runs on-device, touches only people who already share their location with this Mac, and never opens a network connection. The code owns up to the fragility of driving a GUI instead of hiding it: capture failures, locale differences, and a recent macOS UI change that broke one feature are all handled explicitly rather than silently. MIT licensed and shipped through several install paths, it reads like a maintained tool rather than a one-off script.
What's good
The engineering shows real attention to the fragile parts of GUI automation. Ringing a device defaults to a dry run that reports where it would click before anything makes noise, and the actual click sequence retries with increasing delays because the map animation has no completion signal. Permission checks probe capture access directly rather than trusting a preflight call known to return stale results. Menu and sidebar text is localized across dozens of system languages, and every successful query appends a record to a local history file you can later query by name or time window.
Tradeoffs
The design that makes this work is also its ceiling: reading a live window means results break whenever Apple reshuffles the interface, and a recent system update already removed the detailed address view for one command with no replacement in sight. Every run needs the display awake, unlocked and briefly stolen for focus, so it does not fit unattended or headless use without extra hardware and configuration. Because it depends on screen capture and synthesized clicks, it also needs Screen Recording and Accessibility permissions granted and the host process fully restarted before anything works. It returns only coarse location, never coordinates.
How to use it well
This fits someone who already leans on Find My for casual check-ins on family or close friends and wants that lookup from a terminal, a chat agent, or a script instead of unlocking a phone. Set up aliases for the devices or people you check often, and use watch mode with diffing for a notification only when something changes, instead of polling by hand. It is the wrong tool for locating a device precisely enough to hand to police, or for finding a specific room in a building. For fleet tracking, third-party trackers with a real API, or exact coordinates, look elsewhere.
Technical notes+
The Go entry point in cmd/findmy/main.go dispatches to subcommands that all follow the same pattern in internal/findmy/findmy.go: activate FindMy.app via osascript, capture the window with screencapture -o -l (dropping the shadow so image and window coordinates align 1:1), then shell out to the compiled helper for OCR. The Swift side in helpers/findmy-helper/main.swift exposes window, ocr, click, scroll and permissions as JSON-emitting subcommands over ScreenCaptureKit, Vision (with usesLanguageCorrection disabled to avoid mangling proper nouns) and CGEvent; there is no in-process FFI between Go and Swift, only exec plus JSON on stdout. internal/findmy/ring.go implements the ring workflow as a scroll-to-find loop followed by a click-and-poll retry ladder for the map's Play Sound button, distinguishing a stale open detail card from the target device by comparing OCR text position against the sidebar boundary. internal/findmy/watch.go adds a polling loop with an in-memory added/removed/updated diff keyed by name. internal/findmy/aliases.go persists name aliases as JSON under the user's config directory, and internal/findmy/ledger/ledger.go appends every observation to a local SQLite table. internal/findmy/locale.go hardcodes UI string tables for dozens of macOS languages, falling back to runtime Spotlight metadata (mdls) for the window owner name. go.mod shows a small, mostly indirect dependency graph built around a pure-Go SQLite driver, and the Makefile builds the Swift helper and Go binary as two separate artifacts with no shared build step.
Observed
- License
- MIT licensed.
- Language
- Implemented in Go with a companion Swift helper binary for the macOS-only frameworks (Vision, ScreenCaptureKit, CGEvent) that Go cannot bind to directly.
- Platform
- macOS only; no Linux or Windows path exists in the codebase.
- Interfaces
- Interface is a command-line tool with a JSON output mode on every subcommand, plus a bundled Claude Code / OpenClaw plugin (skill and slash command) wrapping the same binary.
- Packaging
- Distributed through a Homebrew tap, an npm package, and a source build via a Makefile; no prebuilt binaries are committed to the repository.
- Persistence
- Persists observation history to a local, append-only SQLite database rather than any network service.
- Architecture
- The Go CLI and Swift helper communicate over subprocess exec and JSON on stdout, not a shared library or FFI binding.
Read from README.md, go.mod, cmd/findmy/main.go, internal/findmy/findmy.go, internal/findmy/watch.go, internal/findmy/ring.go, internal/findmy/aliases.go, internal/findmy/locale.go, helpers/findmy-helper/main.swift, skills/findmy/SKILL.md, commands/findmy.md, Makefile, LICENSE, cmd/findmy/imagesize.go, internal/findmy/ledger/ledger.go.
What it can do
Extract Find My friends' location data from macOS
macOS Find My app interface → Location data of friends
Automate Find My app GUI interactions
Find My app on macOS → Automated navigation and data access
Capture screenshots of Find My app interface
Find My app display → Screenshot images
Parse location text using OCR
Screenshots of Find My app → Text-based location information
Provide command-line access to Find My data
CLI commands → Friend location data in terminal
Tags
Tech Stack
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.