Privacy Policy

Effective date: 23 May 2026 · Last updated: 15 July 2026

This privacy policy describes how the ShotFinder Android application (the “App”) handles your information. The App is published by Optygate (“we”, “us”). The application package name is com.optygate.screenshotsearch.

This version of the policy covers ShotFinder including its online features: Google account sign-in and protected ShotFinder sessions, customization sync, billing and credits, AI Enhance, and opt-in crash reports. Each feature is described below, including exactly what data it sends and where it goes.

Summary

The five network surfaces

ShotFinder reaches the network in exactly five ways. Each is listed in the app under Settings → Privacy → “Network surfaces,” and each is described here.

  1. Google sign-in and ShotFinder session: not required for the Free on-device tools, but required before you buy or restore Pro, use AI Enhance or account-bound credits, or enable customization sync. Fresh purchases sign in before Google Play Billing; ShotFinder does not create a signed-out purchase waiting to be claimed later. A legacy or pre-existing purchase token that has never been attached to a ShotFinder account may still be found by Restore Purchases after sign-in and attached once to that signed-in account. Sign-in uses Google services (Android’s Credential Manager and Google identity) to Google-controlled endpoints; our server verifies the resulting Google ID token. After sign-in, the App keeps short-lived access and refresh credentials encrypted by Android Keystore keys and uses a separate non-exportable P-256 key to prove that a renewal comes from that login on this device. The App renews the 24-hour access token only while performing an online action you requested or synchronization you already enabled. It does not refresh merely because the App starts, resumes, or opens Account. Active sessions have a sliding 180-day inactivity limit and can be revoked at any time. Refresh and current-device revoke go only to ShotFinder’s existing authentication host at api.shotfinder.optygate.com and contain no screenshot, extracted text, customization, purchase token, or crash payload. Credential Manager is used again only for a required reconnection or the one-time upgrade from the older access-only format.
  2. Customization sync: off by default after sign-in. You turn it on yourself in Settings → Account, after a consent screen that names what crosses the wire. When on, it syncs across your signed-in devices: the custom tags and categories you created or explicitly adopted, archive flags, collections, suppressed automatic tags, and category/tag assignments you made by hand. Rule- and AI-owned suggestions do not sync unless you explicitly adopt or edit them; AI apply, revert, and content invalidation do not create sync activity. No screenshots. No OCR text. No app preferences. Talks to ShotFinder’s own server at api.shotfinder.optygate.com only.
  3. Billing & credits: when you purchase Pro, restore a purchase, top up AI credits, or when the App verifies your purchase or credit balance before a paid action, the App talks to Google Play and to our server (api.shotfinder.optygate.com) to verify the purchase and grant credits. Before each purchase-verification attempt, the App obtains a fresh Play Integrity device attestation bound through one-way hashes to that logical request, your signed-in ShotFinder account, the App package, the product, and a digest of the purchase token. For this check, Google Play Integrity processes the request binding, App package/version/signing certificate, the signed-in Play account’s App-license status, and device-attestation information. The binding contains no screenshot or extracted text.
  4. AI Enhance: only when you tap the AI Enhance button on a single screenshot. One tap, one screenshot. Never automatic, never batch. That screenshot and the text we already extracted from it (the currentOcrText field) are sent to ShotFinder’s API at api.shotfinder.optygate.com, which forwards them to Google’s Gemini API, the third-party AI provider that powers AI Enhance, on a paid tier whose terms do not use your content to train Google’s models. Your screenshot and its input text are not stored on our server after the call returns. The improved result the AI returns (better text, refined category, tags, entities, and an optional summary) is cached on our server for up to 7 days so that a retry returns the same result without charging you again, then it is deleted. The same user-started request also sends your existing Google Play purchase token to ShotFinder’s API so it can verify the active entitlement and credit operation. Before the upload, the App obtains a fresh request-bound Play Integrity attestation for the same App/license/device anti-abuse check described under Billing. No screenshot bytes or extracted text are included in that attestation.
  5. Opt-in crash reports: off by default. If you turn them on, automatic uncaught-crash reports are sent to our own self-hosted crash-reporting service at glitchtip.shotfinder.optygate.com. Current-process and historical App-not-responding reporting remain disabled so the App does not need a disk/post-exit path that could upload on a later launch. Each event contains a fresh random per-report event ID and capture time, severity/platform, validated App release/environment, Sentry SDK identity, exception type/module, code-only stack frames limited to class, method, source-code filename, and line, plus device model, OS name/version, and App version. Required delivery framing also contains send time, our public project-routing key, release/environment, SDK name/version plus package/enabled-integration identifiers, and a random SDK-scope trace ID and sampling number. Those scope values may repeat across reports while reporting remains enabled in the same App process; they reset when reporting closes or the process restarts. They and the event ID are not persistent account, installation, or device identifiers. No user, transaction, or replay identifier is attached. Reports have no screenshots, extracted text, file paths, anything you typed, persistent identifier, or breadcrumbs. Native/NDK crash capture is disabled. During an uncaught crash, the App makes one brief in-memory send attempt bounded to 2,000 milliseconds. If it cannot send, the report is not saved or retried. Turning reporting off closes it immediately with a zero-millisecond shutdown wait. Reports are deleted after 30 days.

Adding a sixth network surface would require updating this policy, the in-app “Network surfaces” screen, and the Google Play Data Safety form together.

What information the App accesses

To do its job, indexing and organizing your screenshots, the App needs to read images on your device. Depending on your Android version, this may use one or more of the following permissions:

Image content is read locally and leaves your device only on a user-initiated AI Enhance tap, as described above.

What the App stores on your device

The App stores the following inside its private application storage:

This on-device data is never transmitted to us or to any third party except through the five network surfaces described above.

What we store on our server

If you sign in and use the online features, our server (at api.shotfinder.optygate.com) stores only what those features require:

Opt-in crash reports are stored separately on our self-hosted crash-reporting service at glitchtip.shotfinder.optygate.com, only if you opt in, for 30 days. Its database is not backed up.

Connection data and operational logs. Any internet connection necessarily exposes its source IP address to the destination. Nginx’s coarse connection/request zones are keyed by server name, not client IP, and retain no client key. Our Go API is the only component that retains the IP, using it as a bounded in-memory abuse/rate-limit key; idle keys expire within 10 minutes, the map has a 10,000-key hard cap, and the IP is never written to API or Nginx logs. Both ShotFinder proxies disable access logs and discard IP/path-bearing error logs. The crash-reporting proxy also clears X-Forwarded-For, X-Real-IP, and Forwarded before sending a request to GlitchTip. API request logs contain a standard timestamp, severity, and event name; their request-specific fields are limited to a standard method class, registered route pattern (or unmatched), status, response size, duration, and a new server-generated random request identifier. They do not accept a caller-provided identifier or record the raw request path/query. Panic recovery records only the standard log envelope, a general recovery event, and that server identifier—never the panic value, stack, source path, or request target. Other operational errors may include an internal account/request UUID, product id, and safe state/error category. They never contain your Google subject or hash, email, auth/session/purchase/Integrity token, screenshot, OCR text, body, file path, typed content, or a token-bearing provider URL. These container logs rotate at 10 MiB per file with at most three files, so their retention varies with traffic rather than following a fixed number of days.

Encrypted backups. We make a nightly backup of the App database, compress and age-encrypt it before upload to a developer-controlled Google Drive remote, and schedule each backup object for deletion once it is 14 days old. The next successful cleanup permanently deletes matching live objects and separately removes trash-only copies left by older cleanup runs. If cleanup is delayed or fails, the object remains encrypted until cleanup succeeds. Google receives ciphertext only; the age private key remains offline. AI result-cache rows and the GlitchTip database are excluded from backups.

On-device OCR

The App reads the text in your screenshots on your device. It uses Google ML Kit Text Recognition, covering English and 20+ other Latin-script languages. It runs entirely on your device and requires no internet connection; the model ships inside the App, so nothing is downloaded from a network at runtime. AI Enhance is a separate, opt-in feature that can send a single screenshot to a cloud AI provider when you tap it (see above).

Google Sign-In and Google user data

Sign-in is never required on first launch or for the Free on-device tools. It is required before a fresh Pro purchase or restore, before AI Enhance or account-bound credit use, and before customization sync can be enabled. The App prompts at those entry points rather than at startup. Sign-in uses Android’s Credential Manager with Google Sign-In, requesting the standard openid, email, and profile scopes. When you sign in, the App receives a Google ID token, which our server verifies before issuing a ShotFinder session.

Google user data we access. Through Google Sign-In we access only the basic identity contained in your Google ID token:

How we use this data.

Where it is stored and for how long. On your device, your name, email, and account id remain in the App’s private storage so it can show who is signed in. Access and refresh credentials are encrypted with authenticated account/session/version binding under Android Keystore; the renewal signing key is non-exportable. Credentials and keys are cleared when you sign out. Access-token expiry or temporary offline/server failure does not clear the profile; definitive revocation, 180-day inactivity expiry, or unavailable/corrupt Keystore credentials pauses online features until Google reconnection. On our server (api.shotfinder.optygate.com) we store your ShotFinder account id, your Google Account ID only as a SHA-256 hash, a SHA-256 hash of your email, and your display name. To delete your live account data, open Settings → Account → Delete account in the App. This immediately removes live sync/AI history, zeros all spendable credit and operational counters, clears display name/email hash, and revokes every existing ShotFinder session, subject to the narrow non-spendable credit-liability/account/purchase records and scheduled encrypted-backup cleanup in “Your control over your data” below. You can also email us at dev@optygate.com from the address you signed in with; we complete the same deletion within 30 days.

What we do not access. We request no other Google data. ShotFinder does not access your Google Contacts, Gmail, Drive, Calendar, Google Photos, or any other user Google service, only the basic sign-in identity listed above. The encrypted backup remote described above is the developer’s Google Drive, never your Drive or Drive scope. We do not sell your Google user data, disclose it for another party’s own purposes, or use it for advertising; service processors handle only the limited operations described here.

ShotFinder’s use and transfer of information received from Google APIs adheres to the Google API Services User Data Policy, including the Limited Use requirements. Google’s own handling of your sign-in is governed by Google’s privacy policy. You can sign out at any time from Settings → Account.

Google Play Billing, Play Integrity & credits

In-app purchases are processed by Google Play Billing, a Google service that is part of your device’s Google Play Services. When you make a purchase, your payment interaction is between you and Google; the App receives a purchase token, and our server verifies that token with Google to unlock paid features and grant any bundled AI credits. Google Play Billing does not send us your payment method or billing address. Any display name stored by ShotFinder comes only from the separate Google Sign-In flow described above, not from your purchase. Google’s handling of your purchase is governed by Google’s privacy policy.

Fresh purchases, top-ups, and restores require you to be signed in to ShotFinder before the verification flow. One logical verification keeps the same random request identifier across a short bounded retry sequence, while every network attempt obtains a new Classic Play Integrity token. Its nonce is a SHA-256, domain-separated binding of the request identifier, signed-in server account identifier, App package, product identifier, and a SHA-256 digest of the purchase token. Our server validates that binding before asking Google to verify the purchase; a missing, stale, invalid, or mismatched attestation is rejected. It contains no screenshot bytes or OCR text. The only unbound compatibility case is a legacy or pre-existing token found by Restore Purchases, which may attach once to the account already signed in.

Play Integrity is also used immediately before a user-initiated AI Enhance upload. For every Integrity request, Google says it processes the request hash or nonce; App metadata including package name, version, and signing certificate; the App’s Google Play license status for signed-in accounts on the device; and device information including a key-attestation certificate and device-attestation token. Google states that this data is encrypted, is not transferred to third parties, and is deleted after a fixed retention period. See Google’s Play Integrity data-safety guidance. ShotFinder uses this processing only to verify App, license, request, and device integrity for Billing/credits and AI Enhance; it does not use it to fingerprint or track you. Our server does not persist the raw attestation or a reusable device identifier.

Crash reporting

Crash reporting is off by default. You can turn it on in Settings → Privacy; the first time you do, the App explains what is collected. When on, automatic reporting covers uncaught crashes only and sends reports to our own self-hosted crash-reporting service at glitchtip.shotfinder.optygate.com. Before sending, the App rebuilds a minimal event containing a fresh random per-report event ID and capture time, severity/platform, validated App release/environment, Sentry SDK identity, exception type/module, code-only stack frames limited to class, method, source-code filename, and line, plus device model, OS name/version, and App version. Sentry's required delivery framing separately adds send time, our public DSN project-routing key, release/environment, SDK name/version plus package/enabled-integration identifiers, and a random SDK-scope trace ID and sampling number. The scope values may repeat across reports while reporting remains enabled in the same App process; they reset when reporting closes or the process restarts. They and the event ID are not persistent account, installation, or device identifiers, and no Sentry user, transaction, or replay identifier is attached. Exceptions, stack traces, frames, and contexts are rebuilt from strict allowlists; exception messages/mechanisms and every other nested or free-form event field are dropped. Current-process and historical App-not-responding reporting are disabled so the App does not need a disk/post-exit path that could upload on a later launch. Sessions, performance traces, breadcrumbs, root/additional context, screenshots, view hierarchy, thread dumps, default PII, native/NDK capture, and disk retry envelopes are disabled. Reports never contain your screenshots, their text, file paths/URIs, anything you typed, account id, or a Sentry user/installation identifier. The separate Play Integrity processing described above is why the App declares “Device or other IDs” in Google Play Data Safety; crash reports themselves do not carry a persistent device or installation identifier. If GlitchTip is unavailable the event is not saved or retried. The uncaught send attempt waits no longer than 2,000 milliseconds; turning reporting off uses a zero-millisecond shutdown wait and deletes only any legacy crash-envelope cache. GlitchTip deletes events after 30 days and its database is not backed up. “Anonymous” describes the minimized payload; the proxy necessarily handles the connection IP transiently but does not log, forward, or store it.

What the App does not do

Children’s privacy

The App is not directed to children under 13. We do not knowingly collect any personal information from children.

Your control over your data

You stay in control of your data:

Data sharing

We do not sell or rent your data. The only third parties involved are Google (for sign-in, Play Billing, Play Integrity abuse-prevention checks) and Google’s Gemini API, which powers AI Enhance, and only for the specific, user-initiated purposes described above. We use Gemini on a paid tier whose terms do not use your content to train Google’s models. A developer-controlled Google Drive remote also stores age-encrypted App-database backups that are scheduled for deletion once 14 days old; the next successful cleanup permanently removes eligible live and trash-only copies, while a delayed cleanup leaves them encrypted until it succeeds. Google receives ciphertext only and the private key stays offline. These providers process data for the described service purpose and do not receive it for advertising or sale.

Security

On-device data lives in the application-private area of your device’s storage, sandboxed by Android from other apps, and protected by your device’s screen lock and disk encryption. Network traffic to our server uses TLS (HTTPS). Server-side data is access-controlled and stored only for the feature/retention periods stated above; backups are encrypted before leaving the server and their decryption key remains offline.

Changes to this policy

If we change this policy (for example, if a future version adds a new feature or changes the AI Enhance provider), we will update this page and clearly mark what changed. The current version of the policy is always available at this URL.

Contact

If you have questions about this policy or about the App, email dev@optygate.com.