Skip to content

Legal

Privacy notice

This notice explains what Shoppingo collects, why, where it is stored and what you can do with it. It applies to shoppingo.imapps.uk (the landing site) and the hosted app that lives under the same domain.

Last updated: 2026-10-18.

Who runs Shoppingo

Shoppingo is an open-source project. The hosted version at shoppingo-app.imapps.uk is operated by the project maintainer as a small personal service. It is not a commercial product.

Controller
The maintainer of the Shoppingo repository.
Contact
igorsiergiej@gmail.com
Supervisory authority
Information Commissioner’s Office (ico.org.uk) for UK residents; the equivalent authority in your country if you live elsewhere.

What we collect

The table below lists every category of personal data the hosted stack handles. It is rebuilt from the same inventory used by shoppingo-gdpr-sweep; the wording is deliberately close to that document so the two stay in sync.

CategorySourceWhat is storedWhy
Account credentialskivo (the auth service)Username and argon2id password hash; refresh token held in an httpOnly cookie.To run the service for the account holder.
Session telemetrykivoUsername on failed logins (no password). Sessions have a TTL.Abuse detection and session management.
User data in MongoDBshoppingo-apiLists, recipes, todos, labels, meal plans, push subscriptions, friendships, pairing codes, Discover publications and reports, item categories.To provide the app’s features to the account holder.
Uploaded photosMinIO (object store)Recipe and item photos uploaded by users.To attach images to recipes and list items.
Front-end logsLokiuserId, userAgent, URL and server-observed clientIp. No list-item text, recipe text or transcripts.Operational debugging and abuse response.
Voice transcripts and AI requestsfal.aiSpeech-to-text transcripts from voice input, recipe-import text, substitution/categorisation requests and image prompts.To convert voice and links into structured items and recipes.
Push notificationsFCM (Android) / Mozilla autopush (Firefox)Push endpoint and the notification payload.To deliver reminders and shared-list updates to opted-in devices.
Network trafficCloudflare (tunnel and proxy)Every request that reaches the hosted stack.Routing, DDoS protection and caching.
Aggregate analyticsSelf-hosted UmamiPage views and referrers on shoppingo.imapps.uk and the hosted app. No personal identifiers.To measure which parts of the product are used.
Public Discover publicationsshoppingo-apiThe username is shown only if the user ticks “show name”; the cover photo is copied to a public key.To make shared recipes findable in Discover.
Display fontsBundled (Bricolage Grotesque and Montserrat Variable via @fontsource)Font files served from the site’s own origin. No third-party font CDN is contacted.Typography without sending visitor IP to a font provider.

Why we collect it (lawful basis)

Each purpose has a lawful basis under the UK GDPR. Where processing rests on consent, that consent is collected in-app before any data is sent to the third party.

PurposeLawful basisNotes
Running the service (lists, recipes, meal plans, sharing, push notifications)ContractProcessing is required to deliver what the account holder signed up for.
Authentication telemetry and operational logsLegitimate interestsNeeded to keep the service secure and operable. No special-category data.
Aggregate analytics on the hosted sitesStatistical exception (UK GDPR §4(2)), with opt-outSelf-hosted Umami produces aggregate reports. The opt-out switch lives in app Settings (owned by shoppingo-gdpr-sweep).
Session replay and any identified analyticsConsentOff by default. shoppingo-gdpr-sweep prompts once and stores the choice.
Voice transcripts sent to fal.aiConsent (explicit, one-time prompt at first microphone use)The microphone is not opened until the user accepts.

Processors and where data goes

The hosted stack uses a small number of processors. Each is listed with what they do, where they sit, the transfer mechanism used for any cross-border data flow, and the data they see.

ProcessorRoleLocationTransfer mechanismData seen
fal.aiSpeech-to-text and generative models for voice input, recipe import, substitution, categorisation and image generation.United StatesEU Standard Contractual Clauses and an executed DPA.Voice transcripts, recipe-import text, prompts derived from user content. No account credentials.
CloudflareTunnel, proxy, caching and DDoS protection in front of the hosted stack.United States / global edgeEU SCCs and ongoing adequacy decisions where applicable.Every request reaching shoppingo.imapps.uk and the hosted app.
Google Firebase Cloud Messaging (FCM)Delivery of push notifications on Android.United StatesEU SCCs (Google Cloud DPA).Push token and notification payload.
Mozilla autopushDelivery of push notifications on Firefox.United StatesEU SCCs (Mozilla DPA).Push token and notification payload.
Self-hosted UmamiAggregate, cookie-less analytics on shoppingo.imapps.uk and the hosted app.Server in the EU (imapps.uk)No transfer — self-hosted.Page path, referrer, country (derived from IP), browser family. No personal identifiers.
Self-hosted LokiFront-end log retention and search.Server in the EU (imapps.uk)No transfer — self-hosted.userId, userAgent, URL, server-observed clientIp.
Self-hosted MinIOObject storage for user-uploaded photos.Server in the EU (imapps.uk)No transfer — self-hosted.Recipe and item photos uploaded by users.

Google Fonts is no longer used. The bundled @fontsource-variable/bricolage-grotesque and@fontsource-variable/montserrat packages ship font files from the site’s own origin.

How long we keep it

Retention is the shortest the purpose allows. The values below mirror the operational configuration of the hosted stack.

ItemRetentionWhere it is set
Front-end logs (Loki)30 daysfoundry/monitoring/config/loki/loki.yml retention_period: 30d
MongoDB backups (mongodump)Until pruned at RETENTION_DAYSfoundry/docs/homelab.md — nightly mongodump; MinIO is not backed up.
Account data and contentUntil the user closes their accountshoppingo-gdpr-sweep will add account deletion (typed confirmation) and data export.
Umami aggregate analyticsAs configured on the Umami instanceSelf-hosted Umami retention setting.
Session replays30 daysshoppingo-gdpr-sweep — replay storage TBD by that task.
Fal.ai inputsPer fal.ai’s published retentionfal.ai DPA — confirmed before activation.

Your rights and how to use them

The UK GDPR gives you the rights below. Exercising them is free and we reply within one calendar month. Where the request is complex, we may write to extend that by up to two further months and explain why.

RightWhat it means
AccessA copy of the personal data we hold about you.
RectificationCorrection of inaccurate or incomplete data.
ErasureDeletion of your account and associated content (lists, recipes, photos, friendships, publications). Account deletion will require a typed confirmation and is being added by shoppingo-gdpr-sweep.
RestrictionPausing processing while a complaint or query is resolved.
PortabilityA JSON download of your lists, items, recipes, meal plans, todos and friends. Provided by shoppingo-gdpr-sweep.
ObjectionRight to object to processing based on legitimate interests, including aggregate analytics.
Withdraw consentWhere processing rests on consent (session replays, microphone access), you can withdraw it at any time.
ComplainRight to lodge a complaint with the Information Commissioner’s Office (ico.org.uk) if you believe your data has been handled incorrectly.

To exercise any of these rights, email igorsiergiej@gmail.comfrom the address on your account. For deletion and data export, the in-app controls underSettings → Account are the fastest path once shoppingo-gdpr-sweep ships.

Cookies and local storage

Cookies are kept to the minimum: one strictly necessary for authentication, and one that sends returning users from this landing page straight to the app. Everything else is local storage on the user’s device, which the user can clear at any time.

NameKindPurposeLifetime
kivo refresh-token cookieStrictly necessary cookieHolds the signed refresh token used to mint access tokens. httpOnly, Secure, SameSite=Strict.Rolling; expires when the session ends or is revoked.
shoppingo_appFunctional cookieSet by the app after you sign in, on imapps.uk (the parent domain of the app and this site), so visiting shoppingo.imapps.uk takes you straight to the app instead of this landing page. Holds no identifier, only the value 1.1 year.
shoppingo:configlocalStoragePersisted UI preferences (e.g. tutorial completion flags).Until cleared by the user.
themelocalStorageUser-chosen colour theme (light / dark / system).Until cleared by the user.
unitSystemlocalStorageMetric or imperial units shown across the app.Until cleared by the user.
shoppingo.voiceKeepListeninglocalStorageWhether voice input stays open after a successful transcript.Until cleared by the user.
release-notes-seenlocalStorageRecords which in-app release notes have already been shown.Until cleared by the user.
Umami sessionCookie-lessAggregate analytics visit grouping. Held only on the self-hosted Umami instance.Session.

Changes to this notice

Material changes are listed at the top with the date they take effect, and the in-app release notes link here when something you can act on changes. Earlier versions are kept in thesite repository.