Skip to content

Google Find Hub as a second location network - #244

Open
alex-so-3 wants to merge 3 commits into
parawanderer:mainfrom
alex-so-3:feature/find-hub-source
Open

alex-so-3 wants to merge 3 commits into
parawanderer:mainfrom
alex-so-3:feature/find-hub-source

Conversation

@alex-so-3

@alex-so-3 alex-so-3 commented Sep 28, 2026 •

Copy link
Copy Markdown

Adds Google Find Hub as a second location network next to Apple's.

The main use is tags that advertise on both networks, such as DIY trackers (e.g. Everytag-style firmware) that send Apple Find My and Google Find Hub frames at the same time. Such a tag is one device in the app, and the location reports from both networks are merged into its position and history. Tags that are only on Google work too.

Google reports come from a small self-hosted service, googlefind-service (Docker, built on GoogleFindMyTools). The app only talks to that service; nothing Google-specific is signed in on the phone. Without it configured, nothing changes.

What it adds:

  • Settings → Extra location sources: the service URL, an API token, and optional HTTP Basic Auth for a reverse proxy.
  • Add from Google Find Hub: adds a tracker of the Google account as a device.
  • Link Google tracker: on an existing device, so reports from both networks land on the same device. The map card says which network a position came from.
  • Google is asked for fresh locations only when the user refreshes a tag. A tracker with no reports yet is located once.
  • Ringing Google trackers: the owner ring from the Find Hub (FMDN) spec, over the Beacon Actions characteristic. The ring key and current EIDs come from the service; the ring key can make the tracker ring but cannot decrypt its locations.
  • Nearby for Google trackers: recognised by their EID in the 0xFEAA service data. Their battery flags are encrypted, so only the signal is shown.
  • Add OpenHaystack key: imports a .keys file (Macless Haystack / OpenHaystack format), including files with several keys for tags that rotate through them. They become ordinary custom_rolling_key_accessory devices, fetched through the Apple account like any self-made tag.
  • Ring failures on the map card are shown instead of being retried silently.

There is no Room schema change. The Google-specific data (the linked tracker id) is kept in SharedPreferences, because FindMy.py rewrites the accessory JSON and drops unknown keys. New strings are in all locales.

Depends on #242 and #241. This branch contains both commits: the ring code needs stopSound, and the map card and Nearby need the accessory JSON on the model. Once those are merged, the diff shrinks to the one feature commit.

Verified: on a phone with a Google account that has two off-the-shelf Find Hub trackers and one DIY tag on both networks:

  • the Google trackers are added, located on refresh, ring from the map card and from the device menu, and show up in Nearby;
  • the DIY tag linked to its Google tracker shows as one device with reports from both networks.

./gradlew testAll and add_strings.py --check pass. New JVM tests cover the FMDN ring command, report merging and .keys parsing.

Not verified:

  • the instrumented suite: I did not add instrumented tests for the two new screens (settings and import dialogs);
  • AMap with Google reports;
  • the Find Hub ring on trackers other than the two cheap ones I have. Vendors may differ from the spec, so the app retries the few layouts seen in practice.

alex-so-3 and others added 3 commits September 28, 2026 01:39
Stopping only ended the re-triggering, so a DULT accessory kept sounding until its
own timeout. AirTags have no stop command and stop by themselves; unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xeHfDLMuUeusX9PEgNEmY
…-key .keys import

Adds Google Find Hub as a second location network next to Apple's, through a self-hosted
service built on GoogleFindMyTools (the "googlefind" service).

- Google trackers of the account can be added as devices (menu: "Add from Google Find Hub"),
  or linked to any existing device. A tag that advertises on both networks is then one
  device in the app, with the reports of both merged into its location and history. Reports
  carry provenance "google"; the map card says which network a position came from. Fresh
  locations are requested from Google only on a manual refresh; a tracker with no reports
  yet is located once.
- OpenHaystack keys can be imported from a .keys file ("Add OpenHaystack key"), including
  files holding several keys for tags that rotate through them; they are ordinary
  custom_rolling_key_accessory devices fetched through the Apple account.
- Ringing Google trackers: owner ring over the FMDN Beacon Actions characteristic, with the
  ring key and current EIDs from the googlefind service. Google trackers also show as
  "Nearby", recognised by EID (their battery flags are encrypted, so signal only).
- Ring failures on the map card are shown instead of being retried silently.
- Settings > Extra location sources: service URL, API token, optional HTTP Basic Auth.
- No Room schema change; strings in all locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xeHfDLMuUeusX9PEgNEmY
CustomAccessoryParser never set ownedBeaconAccessoryJson, so Ring on the map card
had nothing to derive addresses from and always reported "Could not compute this
accessory's current address".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xeHfDLMuUeusX9PEgNEmY

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant