Vibeleaderboard
Index / tool
Visit github.com
Category
Developer Tools
Rank
Pricing
Open Source
Type
TOOL
Use case
Data, Retrieval & Knowledge
Interfaces
CLI
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

climacosautomationgui-scrapingocrfindmylocationswift

Tech Stack

Go

Comments (0)

No comments yet

Editorially curated, with community endorsements as a secondary signal. Corrections welcome.