Privacy Policy
Last updated: 2026-10-19
This policy explains what happens to your data when you use the kvibi shopping-list app (“the app”). We tried to keep it short and to describe only what the app actually does. Sections 16–18 add details for residents of the European Union, the United States and Canada.
1. Who we are
The app is developed and operated by an individual developer (“we”, “us”), who is the controller of the personal data described here and the person responsible for its protection. For any privacy question or request, write to support@kvibi.com.
2. The short version
- There are no accounts. You do not sign up or log in.
- Your lists, items and tags are stored on your device.
- Our server is used only for optional features: AI list creation and share links.
- The app identifies itself to our server with an anonymous installation ID, not with your name, email or phone number.
- AI features send your input to OpenAI, and only after you agree to it.
- We do not sell or share your data for advertising.
3. Data stored on your device
Your lists, items and tags are kept in a local database on your phone. We do not receive them unless you use the AI or share features described below.
4. Installation ID
What it is. When the app first talks to our server it uses an installation ID: on iOS, a random identifier the app generates and keeps in the device Keychain; on Android, the Android ID that the system assigns to this app on your device. It does not contain your name, email, phone number or the advertising identifier (IDFA/AAID).
Why we use it. To count AI requests and their cost, to enforce the trial limits, to protect the service from abuse, and, if you subscribe, to link your subscription to this installation.
Where it is stored. On your device; on our server, in the usage records described in section 6; in Google Firebase Analytics only as a SHA-256 hash, never the ID itself (section 8).
What we do not do. We do not use it for advertising or to track you across other companies’ apps or websites, and we do not sell it or pass it to data brokers.
How long it lives. On iOS it can survive deleting and reinstalling the app, because the Keychain keeps it. On Android it stays the same until the device is factory reset.
Seeing it and deleting data. You can see and copy your installation ID in the app under Menu → Your data. The Request deletion button there opens an email to us with the ID already filled in (see section 15).
5. AI features (text, photo, voice)
The first time you use AI, the app asks for your consent before anything is sent. Until you agree, no AI request leaves your device. You can withdraw consent at any time under Menu → Your data.
When you create list items with AI, the app sends your input to our server, which forwards it to OpenAI to produce the items:
- Text: the text you typed (up to 500 characters).
- Photo: the image you picked or took. Our server first resizes and recompresses it, then sends the smaller copy.
- Voice: the recording. Our server converts it to MP3 using a temporary file, sends it to OpenAI for transcription, then sends the transcript to OpenAI to build the list. The temporary file is deleted as soon as the conversion finishes.
Our server does not save your text, photos, recordings or transcripts, and does not write them to logs. The resulting items are returned to your app and are not kept by us.
OpenAI processes this input as our service provider. Under its API terms, OpenAI does not use API data to train its models and may keep it for up to 30 days to monitor for abuse, after which it is deleted unless the law requires otherwise. See OpenAI’s privacy policy.
To improve the results, the server also passes OpenAI some non-content context about your device: your language and region settings, time zone, currency and number/clock formats. These are not stored. If your device does not provide a time zone, the server looks up an approximate country and city from your IP address using the third-party service ipapi.co, which therefore receives your IP address. That lookup result is cached in server memory for up to 24 hours and is not stored in a database.
6. Usage records
For every AI request our server stores one record in a database so we can track costs and enforce limits. A record contains:
- time of the request;
- your installation ID (section 4) and the platform (iOS or Android);
- the type of request (text, image or audio), whether it succeeded, an error code if it failed, and how long it took;
- the AI model used and technical sizes: token counts, the length of your text or transcript in characters, file sizes in bytes, audio length in seconds, number of items returned;
- the cost of the request.
For the trial and subscription limits we also store a usage record per successful request: your installation ID, the type of request, its cost, your plan and the time. When your installation first uses AI we store that date, since the trial lasts 30 days from it. If you subscribe, we store the subscription status for your installation ID (plan, store, expiry and cancellation dates) and the store country of the purchase (a two-letter code as reported by the App Store or Google Play via RevenueCat). We store it only for installations that bought a subscription, to understand where paying users come from; we do not determine your location from your IP address.
These records do not contain the content you submitted or your IP address. We keep them as long as we need them for billing, accounting and enforcing limits. When you ask us to delete your data, we delete or irreversibly anonymise the records linked to your installation ID. Cost totals without any identifier may be kept for accounting.
7. Share links
If you share a list by link, the app uploads a snapshot of it to our server: the list name, description, and each item’s text and checked state. The snapshot is kept in the server’s memory, not in a database, and is available for 7 days. After that the link stops working and the data is removed shortly afterwards (within about one more day). It is also lost if the server restarts. Anyone who has the link can view the snapshot while it is available.
8. Analytics
Release builds of the app use Google Firebase Analytics to measure how features are used (for example, which screens and buttons are used, and whether an AI request succeeded, with counts, sizes and durations). Analytics does not run in development builds. Events do not include the content of your lists. They may include a random local ID of a list or item. Events are associated with a user ID that is a SHA-256 hash of your installation ID, not the ID itself. Firebase (Google) also collects standard technical data as described in Google’s privacy policy. Advertising ID collection is disabled, and analytics data is not used for advertising.
This website uses Google Analytics to count page views. On your first visit a dialog asks whether we may use Google Analytics cookies; until you choose, Google Analytics is not loaded at all. If you accept, Google Analytics sets the cookies _ga and _ga_<ID> (kept for up to 2 years) to recognise your browser on later visits; the legal basis is your consent (Art. 6(1)(a) GDPR, § 25(1) TDDDG). If you decline, the site sets no analytics cookies: each visit gets a random ID that is forgotten when you close the page, so visits cannot be linked to each other. Your choice is saved in your browser's local storage, and you can change it at any time with Cookie settings at the bottom of every page, which also deletes the cookies. Share codes are removed from the page addresses we send. Google receives your IP address to deliver the service, but Google Analytics does not store it. Google signals and ad personalisation are off.
The site opens in your browser's language. If you pick another language with the switcher, the site sets the cookie NEXT_LOCALE, which holds only the language code and is deleted when you close the browser. It is strictly necessary to remember the language you asked for (§ 25(2) no. 2 TDDDG), so it needs no consent.
Cloudflare Turnstile sets no cookies for tracking (section 10).
The admin area at /admin, used only by the site operator, sets one strictly necessary session cookie, kvibi_admin, which visitors of the public site never receive, so it needs no consent.
9. Beta signup
On the home page you can sign up for the beta by entering your email address and choosing your phone platform (iPhone or Android). We store your email address, your platform, the language of the website, the time you signed up and the time you confirmed. When you sign up we also store the country derived from your IP address by our hosting provider (Vercel) — only the country code, not the IP address — to understand where interest comes from. We first send you a confirmation email (double opt-in); only after you confirm do we invite you to the beta, ask for your feedback and tell you when the app is released. To invite you, we pass your email address to Apple (TestFlight) if you chose iPhone, or to Google (Google Play testing) if you chose Android. Instead of joining the beta, you can sign up only for one email when the app is released; then we store this choice too, do not pass your email address to Apple or Google, and write to you once at release. The legal basis is your consent (Art. 6(1)(a) GDPR). You can withdraw it at any time by writing to support@kvibi.com; we will delete your data and remove you from the tester list. Unconfirmed addresses are not used and are deleted on request.
10. Bot protection (Cloudflare Turnstile)
The signup form on the home page uses Cloudflare Turnstile to block automated signups. Your browser loads a script from Cloudflare, and Cloudflare, Inc. (USA) receives your IP address and technical browser signals to check that you are a human. Turnstile sets no cookies for tracking, and its script is loaded only on the home page. The legal basis is our legitimate interest in protecting the form from abuse (Art. 6(1)(f) GDPR). See Cloudflare’s privacy policy. Cloudflare also carries all requests from the app to our server (section 14).
11. iCloud backup (iOS)
On iOS the app can back up its database to your own iCloud account and restore it if your device has no lists. The backup lives in your iCloud storage under your Apple account. We have no access to it.
12. Camera, photos and microphone
The app asks for camera and photo library access to create lists from images, and for the microphone for voice input. These are used only when you choose those features.
13. Server logs and IP addresses
Our server receives your IP address with each request, as any web server does. It is used for rate limiting and, in the case described in section 5, for approximate location. Our application logs record technical errors only; they are not designed to contain your list content or AI input. Our hosting provider may keep its own infrastructure logs. All requests to our server pass through Cloudflare’s network (section 14).
14. Service providers
We use these providers to run the app. Each receives only what it needs for its task.
| Provider | What it receives | Location |
|---|---|---|
| OpenAI — AI processing | Your AI input and the device context from section 5 | USA |
| ipapi.co — Approximate location | IP address, only when the time zone is missing | USA |
| Own server — Server hosting and its logs | All requests to our server, including IP address | Germany |
| Cloudflare — Network connection to our server (Tunnel) | All requests to our server pass through Cloudflare’s network, including IP address | USA (global network) |
| Koyeb — Backup server hosting (only if our own server is unavailable) | Requests to our server, including IP address, during such a period | Germany (Frankfurt) |
| Neon — Database | Usage and subscription records (section 6); beta signups (section 9) | EU (Frankfurt, Germany) |
| Google Firebase — Analytics | App usage events and the hashed installation ID; website page views (section 8) | USA |
| Resend — Email delivery | Your email address and the confirmation email (section 9) | USA (sending from the EU, Ireland) |
| Apple TestFlight — Beta invites | Your email address, if you chose iPhone and joined the beta (section 9) | USA |
| Google Play — Beta testing | Your email address, if you chose Android and joined the beta (section 9) | USA |
| Cloudflare — Bot protection (Turnstile) | IP address and technical browser signals when the home page loads (section 10) | USA |
| Apple iCloud — Backup (iOS) | Your database backup, in your own iCloud account | Controlled by your Apple account |
15. Your choices and rights
You can delete your data on the device by deleting lists or the app. You can withdraw AI consent at any time under Menu → Your data; this does not affect requests made before.
Because there are no accounts, we can find server records only by your installation ID. To access, correct or delete them, open Menu → Your data and tap Request deletion, or email your installation ID to support@kvibi.com. We answer within 30 days. We will not treat you differently for using any of your privacy rights.
16. If you are in the European Union
We rely on these legal bases under the GDPR:
- Consent (Art. 6(1)(a)): sending your AI input to OpenAI and the beta signup (section 9). You can withdraw it at any time.
- Contract (Art. 6(1)(b)): providing AI features, plan limits and subscriptions you chose.
- Legitimate interests (Art. 6(1)(f)): recording costs, preventing abuse, rate limiting, keeping the service secure and understanding how features are used, and protecting the signup form with Cloudflare Turnstile.
You have the right to access, rectify and erase your data, to restrict or object to processing, to data portability, and to withdraw consent. You can also complain to a data protection supervisory authority, in particular in the EU country where you live.
Some providers (OpenAI, ipapi.co, Apple, Google, Cloudflare, Resend) are in the United States. Where data is transferred outside the EU, it is protected by the EU–U.S. Data Privacy Framework where the provider is certified, or by the European Commission’s Standard Contractual Clauses.
17. If you are in the United States
This section is for residents of California and other states with consumer privacy laws. In the last 12 months we have collected these categories of personal information:
- Identifiers: the installation ID and IP address.
- Internet or other electronic network activity: app usage events and AI usage records.
- Audio, visual and similar information: photos and voice recordings you choose to submit to AI. They are processed and not stored by us.
- Approximate location derived from your IP address (section 5). This is not precise geolocation.
We collect them from you and your device, for the purposes in sections 4 to 8, and disclose them only to the service providers in section 14. We do not sell or share personal information as those terms are defined in the CCPA/CPRA (we do no cross-context behavioural advertising), and we do not use sensitive personal information to infer characteristics about you. You have the right to know, access, correct and delete your personal information. Use the contact in section 15; we may need your installation ID to find your records.
18. If you are in Canada
The person responsible for personal information is the developer named in section 1, reachable at support@kvibi.com. Your information is processed and stored outside Canada, in the European Union and the United States, by the providers in section 14. While it is there, it may be accessible to the courts and authorities of those countries. You may ask for access to or correction of your personal information, and withdraw consent. If you are not satisfied with our answer, you can complain to the Office of the Privacy Commissioner of Canada or, in Quebec, the Commission d’accès à l’information.
19. Children
The app is not directed to children under 13 (under 16 in the European Union) and we do not knowingly collect their personal data. If you believe a child has used AI features, contact us and we will delete the related records.
20. Changes
We may update this policy. The date at the top shows the latest version. If a change affects how AI input is processed, the app will ask for your consent again.