Privacy Policy

Effective 1 October 2026

SpecFit is an iPhone app by Codemad ("we", "us"). It shows you how glasses look on your real face. It also estimates your pupillary distance (PD). This policy tells you what the app keeps on your iPhone and what it sends to service providers. It also tells you how long data is kept and what choices you have.

The short version

Data that stays on your device

The guided face scan uses the TrueDepth camera on a Face ID iPhone. It captures a 3D mesh and depth data of your face. The app uses them to find face landmarks and to measure your PD, face width, and bridge width. It also uses them to work out fit details for frames.

The scan, mesh, depth data, landmarks, measurements, and fit details stay on your iPhone. So do your prescription values. None of these go to our server or to analytics. Your base photo, the left and right photos from the scan, your saved try-ons, and your saved link frames are also stored on your iPhone.

All of this lives inside the app's iOS sandbox. The face profile uses iOS complete file protection.

One small note: when you ask for a try-on, the render instruction can include a target frame width. We give it as a percentage of your face width. We do not send your raw measurements or your mesh.

Data that leaves your device, and where it goes

Each item below goes over HTTPS to our API, the "SpecFit API". Cloudflare runs it for us. Some requests then go on to Google's Gemini API.

Try-ons. For each new try-on, the app sends your front photo. This is the photo from your scan or the photo you picked. For angled views, it also sends the left or right still photo taken during your face scan. It sends product images and a text instruction too. Our server passes these to Gemini and returns the result to you. We process them in memory only. We do not write your photos or the generated images to our storage.

Face-shape read. You can set up with a photo instead of a 3D scan. If you do, the app sends a smaller copy of that photo (768 pixels) right after setup. This happens before any try-on. Gemini reads your face shape three times and we average the reads. We do not store the photo. We keep only the result: a shape label and six scores. We cache it in Cloudflare for 7 days. We key it by a one-way SHA-256 hash of the image, not by your device ID. We do not do this read if you use the 3D scan.

Photos of glasses. You can pick a photo or screenshot of glasses, for example of someone who wears them. The app then sends a crop of the eye area to identify the frames. We cache the frame result for 7 days. The result holds frame details and a brand and model guess. It holds no image. We key it by a hash of your profile ID and the style ID.

Pasted product links. When you paste a store link, the app sends the URL. Our server gets the public listing and asks Gemini to pick the product photo. We cache the result for 7 days, keyed by a hash of the URL. The result includes the source URL and the product image. It does not include your device ID. Some stores block our server. In that case the app may get the public page itself, over your own connection, and send the page HTML to our server.

Shared TikTok videos. When you share a TikTok video to SpecFit, the app sends the TikTok link. Our server gets the public video through ScrapeCreators, a TikTok data service. It uploads the video to the Gemini Files API to find the moments where glasses are worn. We delete the file from Gemini right after the read. We cache the result for 24 hours, keyed by the video. The result holds only timestamps and frame pairs.

How Google handles these requests. Google processes them as our service provider under the Gemini API Additional Terms. We use the paid Gemini API. For paid use, Google says it does not use prompts or responses to improve its products. Google may log them for a limited time to detect abuse and to meet legal duties. This processing may happen in other countries.

Anonymous device ID. The app makes a random ID and stores it in the iOS Keychain. It sends this ID with each request to our API. The ID holds no name, email, or face data. You do not need an account. The same ID is your RevenueCat customer ID and your PostHog analytics ID.

Our server keeps a small record under this ID in Cloudflare. It holds your App Attest key record, which lets us check that requests come from the real SpecFit app. It holds keys that track credit use for paid try-ons. It holds the times of your recent link imports, photo identifies, and TikTok reads, for daily limits. We delete those times after 24 hours. It also holds a flag that says if you ever made a purchase.

There is no weekly try-on limit. Your credits pay for try-ons. A global daily budget caps our total AI cost.

Purchases. Credits are one-time purchases. Apple bills them through your App Store account. Nothing is a subscription, and nothing renews. RevenueCat records each purchase and holds your credit balance, keyed to your device ID. We never see your card details. If you redeem an offer code, RevenueCat tells our server, and we log the redemption in PostHog.

Product analytics. The app and our server send usage events to PostHog EU Cloud. Examples are "screen viewed" or "purchase started". Events are keyed to your device ID. They never include your photos, scan, measurements, or prescription. One server event does include the face-shape label the AI read (for example "oval"), so we can check how well the read works. You can turn the app's analytics off at any time in Settings → Privacy. Our server still sends a few events about purchases, credits, and service errors, because we need them to run the service.

Ad attribution (only if you allow tracking). We run ads for SpecFit on Meta and TikTok. We use AppsFlyer to see which ads lead to installs and purchases. After your first face reveal, iOS asks if SpecFit can track you. If you allow it, AppsFlyer uses its own device ID and your Apple advertising ID (IDFA). RevenueCat also sends your purchase events to AppsFlyer. Apple calls this "tracking". If you say no, AppsFlyer does not get your IDFA or its own device ID, and RevenueCat does not send your purchases to AppsFlyer. We then see only Apple's grouped, anonymous reports (SKAdNetwork and AdAttributionKit). You can change your choice at any time in iOS Settings → Privacy & Security → Tracking.

Server logs. Cloudflare handles normal network data to run and protect the service. This includes your IP address, the request path, the time, and the response status. Cloudflare keeps our request logs for up to 7 days. Our code does not add photos or prompts to these logs.

This website

This website (specfit.app) uses Cloudflare Web Analytics to count page visits. It sets no cookies and stores nothing in your browser. It does not follow you across sites, and it does not build a profile of you. It records the page you visit, the page you came from, your browser type, your country, and how fast the page loads. We see these only as totals, for example "300 visits to this page this week". So the site does not need a cookie banner.

Apple can show us how many downloads came from this site, as totals. Apple does not tell us who you are.

How long we keep data

Service providers

We require providers that act for us to protect personal data in line with this policy and the law. Their own terms and privacy notices also apply to them.

What we don't do

Permissions the app asks for

Children

SpecFit's current AI rendering service is not intended for use by anyone under 18. We do not knowingly process photos or other personal data from children. If you believe a child has provided personal data through SpecFit, contact us so we can investigate and take appropriate deletion steps.

Your rights and choices

Before you can scan or upload, the capture screen shows one sentence. It tells you that your photos go to Google's Gemini AI. When you scan or upload, you agree to this.

You can stop sending photos at any time. Do not ask for more try-ons. You can also remove Camera or Photos access in iOS Settings.

Tap your scan thumbnail, then Delete all scans. This removes every face profile, photo, side photo, mesh, measurement, and try-on from your iPhone. It does not clear your prescription, saved link frames, device ID, or credit record on our server. Use Clear prescription to remove your prescription.

You can turn analytics off at any time in Settings → Privacy. You can turn tracking off in iOS Settings → Privacy & Security → Tracking.

Our server caches delete themselves after 7 days or 24 hours. To delete your records on our server or at RevenueCat, email codemad.edu@gmail.com. You can also write to ask questions, see your data, or object. SpecFit has no accounts, so we need your device ID to find your records. We will respond as privacy law requires. We will work with our service providers when a request concerns data they hold for us.

Security

The face profile uses iOS complete file protection. Other local files stay inside the app sandbox. Everything sent to our API uses TLS (HTTPS). Our API uses Apple App Attest to check that requests come from the real app. It also limits how often each device can make requests. We do not write your photos or generated try-ons to our storage. No system is perfectly secure, so we cannot promise absolute security.

Changes to this policy

If we change how SpecFit handles data, we will update this page and its effective date before the change ships. We will also note major changes in the app's release notes.

Contact

Codemad · codemad.edu@gmail.com