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
- Your 3D face scan and your measurements stay on your iPhone. We never send them to our server or to analytics.
- A try-on or a face-shape read needs photos. These photos go to our server and to Google's Gemini AI to make the result.
- We do not keep those photos after the result is made. The one thing we keep is a short-lived face-shape result. We store it under a one-way hash for 7 days. It contains no photo.
- Google may keep the photos for a short time to check for abuse.
- We never sell your data. We never use your photos for ads.
- We measure our ad campaigns with AppsFlyer only if you allow tracking when iOS asks you.
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
- Face scan, mesh, measurements, photos, and try-ons on your iPhone: until you delete the capture, replace it, or delete the app.
- Prescription and saved link frames on your iPhone: until you clear or remove them, or delete the app.
- Try-on photos and generated images on our server: only while the request runs. We do not store them.
- Face-shape photo on our server: only while the request runs. We do not store it.
- Face-shape result (label and six scores, no photo): 7 days, keyed by a one-way hash of the image.
- Frame result from a photo of glasses (no image): 7 days.
- Pasted link result (URL and product image): 7 days.
- TikTok video in Gemini: deleted right after the read.
- TikTok result (timestamps only): 24 hours.
- Gemini prompts and responses at Google: for a limited time for abuse checks, under Google's paid-service terms. Google does not publish a fixed limit.
- Times of link imports, photo identifies, and TikTok reads: 24 hours.
- Device ID record on our server (App Attest key, credit-use keys, purchase flag): until you ask us to delete it.
- Purchases and credit balance at RevenueCat: until you ask us to delete them. They stay across reinstalls.
- Cloudflare request logs: up to 7 days.
- Analytics events at PostHog: as set in our PostHog project. Turning analytics off stops new events from the app at once.
- AppsFlyer attribution data (only if you allowed tracking): as set in AppsFlyer's retention terms.
- Device ID in the Keychain: it can stay after you delete the app and come back if you reinstall.
Service providers
- Cloudflare runs the SpecFit API and this website. It also holds our short-lived caches and the device ID record. It gives network security, keeps request logs, and counts website visits without cookies.
- Google (Gemini API) makes try-ons, reads face shape, identifies frames, picks product photos, and finds glasses in TikTok videos.
- RevenueCat handles purchases and holds your credit balance.
- PostHog gives us anonymous product analytics, hosted in the EU.
- AppsFlyer measures our ad campaigns. It gets your IDFA and purchase events only if you allow tracking.
- ScrapeCreators gets public TikTok videos that you share to SpecFit.
- Apple gives us the App Store, in-app purchases, the photo picker, App Attest, and ad reports.
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
- We do not ask you to make an account. We do not keep a face profile on our server.
- We do not show ads in the app.
- We do not sell or rent your personal data.
- We do not use your photos for ads or to train AI models.
- We do not track you unless you allow it at the iOS prompt.
- We do not use facial recognition or check who you are. Our face-shape instruction tells the AI not to identify the person.
Permissions the app asks for
- Camera - for the guided face scan with the TrueDepth camera.
- Photo library - when you pick a photo of yourself, or a photo or screenshot of glasses.
- Add to photo library - when you save a try-on.
- Tracking - to measure our ad campaigns with AppsFlyer. You can say no, and the app works the same.
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