Privacy Policy

Effective: 2026-05-23 · Version 1.2 (added Reach handles, operator accounts, voice signaling; cross-references the v1.2 ToS no-reliance / no-sale clauses)

Plain English summary: Reach handles the absolute minimum data needed to do its job. It does not run analytics, does not place advertising trackers, and does not log the inputs or outputs of any action you invoke. Cost-tracking is opt-in. Everything material is in the table in §3.

1. Who this applies to

This Privacy Policy describes how Reach by InferLane ("Reach," "we," "our") handles information when you use any of Reach's five distribution surfaces:

  1. Reach for Claude Desktop — the one-click .dxt extension installed into Anthropic's Claude Desktop app.
  2. Reach for ChatGPT — the hosted Model Context Protocol (MCP) server at reach.inferlane.dev, consumed by the OpenAI Apps SDK.
  3. Reach for Chrome — the Manifest V3 browser extension distributed via the Chrome Web Store.
  4. Reach for Safari — the same extension wrapped as a Safari Web Extension.
  5. Reach for Mac — the menu bar app distributed as a notarized .dmg and via Homebrew.

It also covers the inferlane.dev/reach landing page and the shadow registry hosted at inferlane.dev/reach/registry.

2. Operator

The operator of Reach is InferLane. [Operating entity: to be finalized and disclosed at inferlane.dev/about before public launch.]

For privacy questions, contact us at privacy@inferlane.dev.

3. What Reach handles, by surface

Each surface has a different handling posture. The table below is exhaustive — anything not listed is not collected.

SurfaceWhat Reach handlesWhat goes to InferLane serversWhat is logged
Claude Desktop The URL you ask Reach to discover. Manifests fetched from that URL. Optional bearer tokens stored in the host's keychain. Nothing, by default. Only if you set an InferLane API key: invocation metadata (domain, capability ID, latency, cost estimate). Nothing on InferLane's side by default. With API key: metadata only — never inputs or outputs.
ChatGPT (hosted MCP) The URL you ask Reach to discover. The per-session McpServer instance lives in memory at reach.inferlane.dev for the duration of a ChatGPT conversation. The URL passed through ChatGPT to the hosted endpoint. Manifests fetched server-side from that URL. No payloads of capability invocations are routed via InferLane. Per-session McpServer is evicted from memory after 30 minutes of idle time. Aggregate request rates are recorded for capacity planning; they contain no URLs and no user identifiers.
Chrome / Safari extension The URL of the tab you currently have focus on (detected from the browser's tab API, not by reading page content). Settings stored in chrome.storage.local. Nothing, by default. Same opt-in: with an InferLane API key, invocation metadata only. Nothing on InferLane's side by default.
Mac menu bar The URL of the active tab in your frontmost browser (detected via Apple Events). Clipboard intent payloads when you click a capability. Nothing, by default. Same opt-in. Nothing on InferLane's side by default.
inferlane.dev/reach landing page Standard web server logs (anonymized IP, user agent, requested path). The host running the site (Vercel) processes the request. Logs retained per Cookie Policy. Aggregate page-view counts. No advertising trackers. No third-party analytics by default.
Shadow registry The domain name you query (for example, github.com). Negative-cache state stored client-side. The hosted JSON file you fetch from inferlane.dev/reach/registry/v1/{domain}.json. The CDN may log the lookup. CDN-level aggregate counts (which domains are most queried). No user identifiers.

3.5. Reach handles, operator accounts, and voice signaling

From v1.1 onward, Reach also offers three opt-in surfaces that involve more data than the original discovery layer above. Each is described in its own subsection. None of these is enabled by default: you have to claim a handle, sign up as an operator, or place a voice call before any of this applies.

3.5.1 Personal-tier Reach handles (the /reach/claim flow)

If you claim a personal handle (for example @heath) so that other Reach users can call you in their browser without your phone number, the following data is handled by the InferLane Reach handles backend (api.reach.inferlane.dev):

What we storeHowWhy
Your phone number, encrypted AES-256-GCM (authenticated encryption) with a server-only key. Stored as (ciphertext, IV, auth tag). The plaintext is held only in memory during the SMS verification step and is discarded as soon as the database write completes. So we can recognise that the same number is trying to re-claim, and (in future) so we can SMS-notify you if you opt in to incoming-call alerts.
An HMAC of your phone number (phone_hash) HMAC-SHA-256 under a server-only key. Acts as the unique database index. Not reversible without that key. A database dump alone does not let an attacker enumerate which phone numbers are claimed. Defense in depth on the index column.
A plain SHA-256 of your phone number (phone_lookup_hash) Public. Used as the entries in the Bloom-filter snapshot served at /bloom.bin, so Reach client surfaces can answer "is this tel: link a Reach handle?" offline without sending the number to us. This hash is brute-forceable (the NANP space is ~10 billion numbers; one SHA-256 each). We accept this trade-off because being a Reach handle is a public opt-in and the snapshot is intentionally distributed. So Reach clients can pre-filter tel: links to claimed numbers without leaking every number you read to us.
Your chosen handle, your display name, the SIP endpoint (e.g. sip:heath@reach.inferlane.dev), claim timestamp Plaintext. These are intentionally public: they appear on your calling-card page at inferlane.dev/@<handle> and in the synthesized voice manifest. So callers can find and dial you.

3.5.2 SMS verification

When you submit a phone number to claim a handle, we send a one-time 6-digit code via Short Message Service (SMS). The SMS is sent by our transactional SMS provider (currently Twilio); see §9 for the processor list. The verification attempt record stores:

Verification attempts expire after 10 minutes and are deleted by a background job within 24 hours. Standard message rates from your carrier may apply; InferLane does not charge for the verification SMS.

3.5.3 Voicemail-style SMS notifications (B.5, opt-in only)

If you opt in to "SMS me when someone tries to reach me while my browser is offline," InferLane will send an SMS to your verified number with a link to answer the call in your browser. This is off by default and requires explicit per-account opt-in. Per-caller and per-recipient rate limits apply. You can disable it at any time from the dashboard; SMS notifications cease on the next dispatched call attempt.

3.5.4 Bloom-filter snapshot

InferLane publishes a Bloom-filter snapshot of all currently-active phone_lookup_hash values at api.reach.inferlane.dev/bloom.bin. The snapshot uses a fresh random salt embedded in the header (the "RBF2" wire format) so any client holding the snapshot can query it offline. The privacy posture is documented inline in the format header and is summarised here:

3.5.5 Operator accounts (the /reach/operator dashboard)

If you sign up as a business operator (a publisher that controls a domain and wants to take WebRTC calls dialled at that domain), we additionally hold:

Operator sessions use a JSON Web Token (JWT) HMAC-signed under the same server key; the JWT is stored in an HTTP-only, SameSite=Lax, Secure (in production) cookie named reach_operator. Default TTL is 7 days; the cookie is cleared on sign-out.

The DNS-TXT verification step queries the public DNS for a TXT record at _reach-verify.<your-domain>. InferLane queries DNS; nothing is stored about other records at that name.

3.5.6 Voice signaling and call metadata

When a Reach call is placed (either to sip:<handle>@reach.inferlane.dev or to a verified publisher's sip:<endpoint>@<domain>), the call traverses the InferLane Reach signaling server (voice.inferlane.dev). The signaling server proxies SIP signaling only — audio media never traverses InferLane infrastructure. Media flows browser-to-browser over WebRTC; symmetric-NAT callers may relay media through a TURN server, which is configured with no-log and does not decode or store media.

Per-call metadata logged by the signaling server is intentionally narrow:

The signaling server never logs: the caller's identity or IP, the dialled phone number (for handle-namespace calls the handle is the identifier — the underlying phone number is not in the call path), the audio stream, any transcript, the WebRTC SDP body, or any capability arguments. A continuous-integration grep guard in the project's .github/workflows/ci.yml hard-fails the build if a developer accidentally introduces a regression that would log capability arguments.

Call metadata is retained for 90 days for operational debugging, then aggregated and anonymized.

4. What Reach explicitly does NOT collect

5. Cost-tracking opt-in (the InferLane API key)

Each surface offers an optional setting: paste an InferLane Application Programming Interface (API) key, and Reach will log invocation metadata to your InferLane account. When configured, the following fields travel to InferLane on each capability invocation:

The inputs and outputs of the capability call are never sent to InferLane. You can revoke the API key at any time inside the surface's settings; logging stops immediately on the next invocation.

6. Authentication tokens

If a capability requires authentication (typically OAuth or a bearer token), the token is stored locally on your device by the host's standard secret store:

Reach does not centrally collect or sync these tokens across devices.

7. Data retention

Data classRetention periodTrigger for deletion
In-memory MCP session state (hosted ChatGPT surface)30 minutes of idle time, or end of conversationAutomatic eviction; no manual recovery
Manifest cache (per-device, in memory)15 minutes default time to live (TTL)Automatic eviction; HTTP ETag revalidation
Negative cache (registry misses)1 hourAutomatic; clears the next time the domain is queried
Extension settings (Chrome / Safari)Until you uninstall or resetYou: via the extension's settings page
Cost-tracking logs (opt-in, on InferLane servers)7 years for financial records; aggregated and anonymized after 90 days for non-financial useYou: by deleting the InferLane API key, or via a data subject request
Web server access logs (landing page)90 days, then aggregatedAutomatic
Support correspondence2 years from last activityYou: by request
Reach handle claim (encrypted phone + handle + display name)Until you revoke the claim, or 24 months of total inactivityYou: by clicking "Delete handle" in the operator UI or emailing privacy@inferlane.dev. The encrypted phone row is deleted within 7 days; the bloom-filter snapshot stops including the lookup hash on the next rebuild (daily).
SMS verification attempts10 minutes (active TTL); deleted within 24 hoursAutomatic background job
Operator account + publisher + endpoint + agent recordsUntil you delete the resource or close the account; closed accounts purged within 30 daysYou: via the operator dashboard
Operator session cookies (JWT)7 days from issue; cleared on sign-outYou: by signing out or clearing browser cookies
Voice call metadata (signaling server)90 days, then aggregatedAutomatic

8. Data subject rights

If you live in a jurisdiction with a comprehensive privacy law (the European Union, the United Kingdom, California, Australia, Canada, Brazil, and others), you have the following rights with respect to data InferLane holds about you:

Email privacy@inferlane.dev to exercise any of these rights. InferLane will respond within 30 days.

9. Third-party processors

InferLane uses the following processors. Each processes only the data necessary for the specified function.

ProcessorFunctionData shared
Vercel (or equivalent hosting)Landing page + static registry CDNWeb server logs (anonymized IP, user agent)
Render / Fly.io / equivalentHosting for the ChatGPT MCP endpointRequest URLs (no payloads)
Resend / equivalent transactional email providerSupport correspondence + receiptsYour email address and message content if you contact support
Stripe (premium SLA tier only)Payment processingYour billing details (card or bank), to Stripe directly — InferLane never sees full card numbers
Twilio (handles backend, when SMS adapter is enabled)One-time-code SMS for handle verification; opt-in offline-call notifications (B.5)The destination phone number and a short message containing the one-time code or the call-answer link. Twilio retains delivery records per its own retention policy.
Fly.io (reach-signaling + reach-handles)HostingEncrypted-at-rest database; request URLs at the proxy edge (no payload bodies). Signaling traffic is SIP-over-WSS only — no media bytes.

10. International transfers

InferLane operates from Australia. If you use Reach from outside Australia, your data may be transferred to and processed in Australia or in the regions where our processors operate (typically the United States and the European Union). Transfers are governed by Standard Contractual Clauses or equivalent legal mechanisms where applicable.

11. Children

Reach is not directed at children under 13 (or 16, where local law sets a higher age of digital consent). If you believe a child has provided personal information to InferLane, please contact privacy@inferlane.dev and we will delete it.

12. Security

InferLane follows industry-standard practices: Transport Layer Security (TLS) for all network traffic, hardened operating system images, principle-of-least-privilege access controls, encryption at rest for stored data, and a documented incident response process. No system is perfectly secure; in the event of a breach affecting your data, InferLane will notify you within the time required by applicable law (72 hours under the European General Data Protection Regulation; equivalent windows elsewhere).

13. Changes to this Policy

If we make a material change, we will notify users via a banner on inferlane.dev and (if you have an InferLane account) by email at least 30 days before the change takes effect. The current version is always available at inferlane.dev/reach/legal/privacy-policy.html with a visible effective-date stamp.

14. Contact

Privacy questions, data subject requests, and complaints: privacy@inferlane.dev.

If you are dissatisfied with InferLane's response, you have the right to lodge a complaint with your local data protection authority (for example, the Office of the Australian Information Commissioner, the European Data Protection Board, or the United Kingdom Information Commissioner's Office).

Note on this document. This Privacy Policy is intended to be plain, honest, and substantive. It is provided as part of the Reach by InferLane open-source project. It is not legal advice. Before relying on this document as the privacy policy of a third-party service, have a lawyer in your jurisdiction review it.