Last updated: 2026-07-07 (v2.10) — see Changelog at the end of this document.
This Privacy Policy describes how the data controller listed below collects, uses, and protects personal data when you use the AI Language Tutor mobile application and the website at ailanguagetutor.app (collectively, the "Service").
We are established outside the EU/EEA. Under GDPR Art. 27 we have designated, in writing, a representative in the Union.
We value your privacy and your rights as a data subject and have therefore appointed Prighter Group with its local partners as our privacy representative and your point of contact for the European Union. Prighter gives you an easy way to exercise your privacy-related rights (e.g. requests to access or erase personal data). To contact us via our representative Prighter, or to exercise your data-subject rights, please visit: https://app.prighter.com/portal/19285443777.
You may contact our EU representative via the portal above for any data-protection matter, or reach us directly at support@ailanguagetutor.app; we will respond within 30 days as required by GDPR Art. 12(3).
We collect the following categories of personal data, each for a specific purpose:
CF-IPCountry request header) at sign-up and sign-in. Purpose limitation: legal and consent display only — for example, to surface the appropriate supervisory-authority reference (see §6) and the right consent text for your jurisdiction. The country code is NOT used to route AI provider traffic or to gate features. Our LLM/STT/TTS cascade resolves identically for all users regardless of country (see app/core/geo.py — _COUNTRY_SPLIT_ROLES = {}); feedback routing is tier-based (Free/Pro vs Premium), not country-based. We do not store the IP address itself; only the country code is persisted on your profile, and it is deleted when you delete your account.To deliver the Service we engage the service providers listed below. Where required by applicable law, we put in place data-processing terms and international-transfer safeguards, such as the European Commission's Standard Contractual Clauses (SCCs), Data Privacy Framework certifications, or another valid transfer mechanism. Maintenance of these contractual arrangements is an ongoing process; copies of relevant agreements are available on request.
| Service | Purpose | Data sent | Region |
|---|---|---|---|
| Anthropic (Claude API) | Primary LLM for Premium-tier feedback generation (claude-sonnet-4-6); fallback for voice and Free/Pro feedback (claude-haiku-4-5); shared fallback for the validation role | Text only (no PII intentionally sent) | USA |
| OpenAI | Primary LLM for in-conversation voice turns (gpt-5.4-mini) and for Free/Pro-tier feedback generation; text-to-speech (models tts-1, tts-1-hd, gpt-4o-mini-tts); fallback speech-to-text; text embeddings | Text and voice audio | USA |
| Google Gemini | Shared fallback for feedback generation (gemini-3.1-pro-preview) for all tiers; primary LLM for the judge role (gemini-2.5-flash); used for content summary and validation roles | Text only | EU/USA (Google Cloud routing) |
| Deepgram | Primary streaming speech-to-text (Nova-2) | Voice audio | USA (api.deepgram.com) |
| ElevenLabs (Premium tier) | High-quality TTS voice synthesis | Text only | USA |
| Azure Speech (Premium tier) | Pronunciation assessment and shadowing | Voice audio sample | EU or USA (depending on Azure region) |
| PostHog | Product analytics and feature flags | User ID, in-app events, IP address | EU (eu.posthog.com) |
| Sentry | Error and crash tracking | Anonymized stack traces and technical context; send_default_pii=False set at backend SDK init (backend/app/main.py) — Sentry does not receive request bodies, headers with auth tokens, or user identifiers by default | USA |
| RevenueCat | Subscription state and IAP receipt management | RevenueCat user ID, entitlements, receipt metadata | USA |
| Apple (Sign in with Apple) | OAuth authentication | Apple-relayed or real email, optionally name | USA |
| Google (Sign in with Google) | OAuth authentication | Email, name, Google account ID (scopes: openid email profile) | USA |
| Firebase / Firebase Cloud Messaging | Push notification delivery | Device push token, message payload | USA |
| Twilio | SMS phone verification | Phone number, country, source IP | USA |
| Resend | Transactional and lifecycle email delivery | Email address, message content | USA |
| S3-compatible object storage (self-hosted MinIO, running on our Hetzner instance) | GDPR data-export bundles (7-day download TTL) and admin-generated article narration TTS. No user voice recordings are stored here — session audio is processed in-memory and kept on the user's device only (see §1 and §5) | Export ZIP archives; pre-generated article narration audio | EU/EEA — Finland (Hetzner data center, Helsinki); data never leaves the EU |
| Hetzner Online GmbH | Hosting infrastructure (compute, PostgreSQL, Redis, MinIO object storage, nginx) | All Service data while at rest on our servers (account, learning, audio, logs) | EU/EEA — Finland (data center in Helsinki); processor headquartered in Germany |
| Cloudflare, Inc. | DNS, content delivery network, DDoS protection, and country-code lookup via the CF-IPCountry request header (stored on your profile for legal and consent localisation only; NOT currently used to route AI traffic or gate features) | HTTP request metadata, including IP address (transient) and approximate country | Global edge network (EU/EEA POPs serve EU/EEA traffic); processor headquartered in USA |
| Telegram FZ-LLC (Telegram Bot API) | Optional delivery channel for daily phrase, vocabulary reminders, and learning nudges via our Telegram bot | Telegram user ID, chat ID, username, message content (only if you connect your Telegram account) | UAE / Global (Telegram-managed) |
com.posthog.posthog.AUTO_INIT=false manifest flag, so no analytics events, session-replay snapshots, or /decide network calls occur before you consent. You can withdraw consent at any time under Profile → Privacy. On the public website, the same applies via the cookie banner.We do not process special-category data under Art. 9. See "Voice biometrics determination" below.
| Data category | Retention |
|---|---|
| Account data | Until you delete your account (+ a 30-day grace period implemented by our account-purge worker) |
| Conversation transcripts | 30 days (then purged by our retention worker) |
| Audio recordings (pronunciation, session voice) | Not retained on our servers. Audio is processed in-memory only and discarded once speech-to-text and pronunciation scoring finish (typically <2 seconds). A rolling local copy of completed-session recordings is kept on your device only, capped FIFO at 3 (Free) / 10 (Pro) / 20 (Premium); uninstalling the app or clearing app storage removes them immediately |
| Vocabulary entries | Until you delete the entry or your account |
| JWT authentication tokens | Access token 15 minutes, refresh token 30 days |
| Analytics events (PostHog) | 24 months (enforced via PostHog EU Cloud project retention settings); analytics identity is deletable on request via support@ailanguagetutor.app and as part of account deletion |
| Error logs (Sentry) | 90 days (Sentry default). Cleartext email addresses are masked in log messages and Sentry breadcrumbs before transmission (helper app/core/logging.py::mask_email); only the domain is preserved for operational correlation |
Web-server access logs (nginx access.log / error.log) | 7 days, enforced by host-side logrotate with daily rotation + 7 retained generations. Captures IP addresses (pseudonymous personal data under GDPR Recital 30); forensic capability beyond 7 days is intentionally given up in favour of Art. 5(1)(c) data-minimisation. Sentry real-time alerts and the 6-year audit_logs table cover incident detection that does not require access-log history |
| Coach free-text feedback (your written replies to the in-app coach thumbs-up / thumbs-down prompts) | 90 days, after which the free-text body is NULLed by our retention worker (the anonymized rating and category are kept for product analytics) |
| Telegram identifiers (telegram_id, chat_id, username) | Until you disconnect Telegram in Profile → Settings or delete your account, whichever is first |
You have the following rights with respect to your personal data:
List-Unsubscribe header) included in every commercial email; the Telegram bot integration can be disconnected at any time under Profile → Settings, which deletes your stored Telegram identifiers.Some of our service providers are located outside the EU/EEA (primarily the United States). Where personal data is transferred outside the EU/EEA, we use an applicable transfer mechanism where required, such as an adequacy decision (where granted by the European Commission), the EU-U.S. Data Privacy Framework for certified providers, the European Commission's Standard Contractual Clauses (SCCs), or another valid safeguard. Details of the applicable safeguards for a specific provider are available on request at support@ailanguagetutor.app.
The Service supports Sign in with Apple. When you use Sign in with Apple, you may choose to share either your real email address or an Apple-relayed private email (e.g. <random>@privaterelay.appleid.com). We store whichever email Apple returns to us. You can revoke our access at any time from your Apple device: Settings → Apple ID → Sign-In & Security → Apps Using Your Apple ID.
Sign in with Google requests the OAuth scopes openid, email, and profile only. We do not request access to Google Drive, Google Calendar, Gmail, or any other Google service.
AI Language Tutor is not intended for users under the age of 16. We do not knowingly collect personal data from children under 16. If you believe a child under 16 has provided us with personal data, please contact support@ailanguagetutor.app and we will delete the data promptly.
Our voice processing is limited to speech-to-text transcription, text-to-speech synthesis, and pronunciation assessment against a reference text. We do not create, store, or compare voice prints for the purpose of identifying or authenticating you. For this reason, voice recordings are processed as ordinary personal data under Art. 6, not as biometric special-category data under Art. 9.
On the public website (ailanguagetutor.app), we use PostHog (EU-hosted) for product analytics. PostHog activates only after you accept analytics cookies via our cookie banner. We do not use advertising or cross-site tracking cookies. In the mobile app, PostHog telemetry is opt-in by default: the SDK is not initialised at all until you accept the consent dialog on first launch (native auto-initialisation is disabled via the AUTO_INIT=false manifest flag on both Android and iOS). Firebase Cloud Messaging is used solely for push-notification delivery and does not capture analytics. You can withdraw or grant analytics consent at any time under Profile → Privacy.
If you use AI Language Tutor on behalf of a company, school, or other organization and require a signed Data Processing Agreement, contact support@ailanguagetutor.app. We provide a standard GDPR-compliant DPA on request.
Some data is necessary to provide the Service; other data is optional.
If you do not provide required data, the corresponding features will not be available, but you may still use the parts of the Service that do not require that data (for example, text-only practice without voice features).
We use technical and organizational measures designed to protect personal data. These include transport encryption (TLS for all client–server traffic), encryption at rest for sensitive credentials, access controls with least-privilege principles for administrative access, environment-separated production credentials, audit logging for sensitive operations, automated retention enforcement (transcript purge worker and export-bundle cleanup worker; session audio is not stored on our servers and so has no cleanup worker — see §1 and §5), pseudonymisation of identifiers in observability tooling (Sentry user context carries only the user UUID with send_default_pii=False; cleartext email addresses in logger.* messages are masked via app/core/logging.py::mask_email before reaching the structured-log / Sentry-breadcrumb pipeline; a regression test in tests/core/test_mask_email.py guards against new leaks), bounded web-server log retention (nginx access / error logs are rotated daily with 7 retained generations; see §5), and restricted backend administrative access. No online service can guarantee absolute security. We will notify affected users and relevant supervisory authorities of any personal-data breach in accordance with GDPR Art. 33 and Art. 34.
We do not use your conversation transcripts, voice recordings, or any personal content to train our own AI models. We only send personal content to third-party AI providers (Anthropic, OpenAI, Google Gemini, ElevenLabs, Deepgram, Azure Speech) where our account settings, the provider's published terms, or our data-processing agreement with that provider prohibit use of API submissions for provider-side model training, unless we disclose otherwise in this Policy before using that provider for personal content. Feedback-generation traffic is routed by subscription tier (Free/Pro to OpenAI primary, Premium to Anthropic primary, with Google Gemini as the shared fallback) rather than by country. If a provider's training posture is uncertain or changes, we will either stop sending personal content to that provider or update this section before continuing.
The Service is designed for language practice. Conversation scenarios, prompts, vocabulary entries, written replies, spoken turns, and any other free-form content you choose to provide are sent in real time to our third-party AI providers (see §3 and §16) and retained for the periods set out in §5 (conversation transcripts for up to 30 days; session audio is not retained on our servers, only a short rolling copy on your device — see §1 and §5).
To protect your privacy, we ask you to use fictional names and made-up scenarios for practice. Please do not include real personal data in your conversations, uploads, or vocabulary entries, in particular:
This guidance reflects the data-minimization principle of GDPR Art. 5(1)(c): the safest data is the data we never receive. We apply automated safeguards on our side — PII masking in error logs, transport encryption, least-privilege access controls (see §15) — and we configure third-party AI providers not to use API submissions for provider-side model training (see §16). However, no automated filter can detect every form of personal data, and once you submit content it has already been transmitted to our AI providers. You remain responsible for the content you choose to share with the Service.
This section does not limit our obligations as data controller under GDPR. Your rights under Arts. 15–22 (see §6) continue to apply to any personal data you provide, including the right to erasure: deleting your account removes your transcripts and vocabulary entries within 30 days, subject to lawful retention obligations. If you realize you have submitted sensitive personal data and want it removed sooner, contact dpo@ailanguagetutor.app (or support@ailanguagetutor.app with subject prefix [GDPR]) and we will process the erasure request without undue delay.
We will notify you of material changes to this Privacy Policy at least 14 days before they take effect, via in-app notification and — if you have given marketing-email consent — by email. Older versions are archived and available on request.
support@ with subject prefix [GDPR])| Version | Date | Changes |
|---|---|---|
| v2.10 | 2026-07-07 | Conversation-transcript retention tightened from 12 months to 30 days under GDPR Art. 5(1)(c) (data minimisation). §5 (Retention table row) and §17 (User-Provided Content pointer) updated. The retention_worker ARQ cron (app/workers/retention_worker.py) now purges session_messages older than 30 days on the daily 03:45 UTC pass; independently-stored derivatives (CEFR level, weak areas, vocabulary items, pronunciation scores, feedback summaries) survive the purge and continue to power progress tracking and coach recommendations. Section numbering §1–§20 unchanged. |
| v2.9 | 2026-07-06 | EU Representative (GDPR Art. 27) — appointment activated. The intro block "EU Representative (GDPR Art. 27)" is now populated with the designated representative Prighter EU Rep GmbH (operated by Maetzler Rechtsanwalts OG, Austria), registered EU/EEA address Schellinggasse 3/10, 1010 Vienna, Austria. Prighter provides an EU-based data-subject-request portal at app.prighter.com/portal/19285443777 for exercising rights of access, rectification, erasure, restriction, portability and objection under GDPR Art. 15–21. The three placeholder markers introduced in v2.3 are removed. Section numbering §1–§20 unchanged. |
| v2.8 | 2026-06-29 | Observability pseudonymisation + bounded web-server log retention. §5 (Retention) — added rows for nginx access / error logs (7 days, daily rotation via host-side logrotate with copytruncate) and clarified the Sentry retention entry now includes mask_email redaction of email addresses in log messages before transmission. §15 (Security Measures) — expanded to document the pseudonymisation invariant for Sentry user context (only the user UUID, send_default_pii=False), the mask_email helper in app/core/logging.py guarded by tests/core/test_mask_email.py, and the bounded web-server log retention. Section numbering §1–§20 unchanged. |
| v2.7 | 2026-06-29 | PostHog analytics moved to a strict opt-in model in the mobile app. §4 (Legal Basis) — analytics lawful basis switched from Art. 6(1)(f) legitimate interest to Art. 6(1)(a) explicit consent. §12 (Cookies and Tracking) — clarified that the mobile-app PostHog SDK is not initialised at all until the user accepts the consent dialog on first launch; native auto-initialisation is disabled via the com.posthog.posthog.AUTO_INIT=false manifest flag on both Android (AndroidManifest.xml) and iOS (Info.plist). Consequence: zero PostHog network activity (no /decide call, no session-replay snapshot, no distinctId emission) before the user grants consent. Section numbering §1–§20 unchanged. |
| v2.6 | 2026-06-29 | Session audio is no longer stored on our servers. §1 (Audio recordings), §3 (S3/MinIO sub-processor row), §5 (Retention — audio row), §14 (Optional data — meeting-audio upload claim removed) and §15 (audio cleanup worker reference removed) all updated to reflect the new on-device-only model: voice is streamed in-memory through Deepgram/OpenAI/Azure for transcription and pronunciation scoring (typically <2 seconds) and discarded; a rolling local-only copy of completed-session recordings is kept on your device, capped FIFO at 3 (Free) / 10 (Pro) / 20 (Premium). Word-level pronunciation scores remain stored as text. Section numbering §1–§20 unchanged. The legacy server-side retention (14 days in MinIO) was removed in the same release; existing audio was wiped via a one-off operator script. |
| v2.5 | 2026-06-22 | Added §17 "User-Provided Content in Conversations (Your Responsibility for Data Minimization)" — explicit guidance to use fictional names and scenarios for language practice, and a non-exhaustive list of categories users are asked NOT to share (government IDs, payment data, credentials, health/special-category data under Art. 9, third-party PII without consent, confidential business information). Section also reaffirms our obligations as data controller and points users to the erasure pathway (§6) for content they later wish to remove. Former §17 (Changes to This Policy) renumbered to §18; former §18 (Contact) to §19; former §19 (Changelog) to §20. |
| v2.4 | 2026-06-17 | Section 18 (Contact) split into a per-purpose alias list. dpo@ailanguagetutor.app (data-protection / DSR) and legal@ailanguagetutor.app (legal / DPA / B2B) added as dedicated aliases now that the Migadu Mail Lite mailbox stack is live; support@ remains the general-purpose address. |
| v2.3 | 2026-06-16 | Added structured EU representative (GDPR Art. 27) placeholder block with Prighter onboarding note and three [TO BE INSERTED] markers for mechanical find-replace once the contract signs. Clarified country-code purpose limitation in §1 (Approximate country) and §3 (Cloudflare row): the CF-IPCountry-derived country code is used only for legal/consent display and is NOT used to route AI traffic or gate features — this aligns the user-facing text with app/core/geo.py (_COUNTRY_SPLIT_ROLES = {}) and with docs/legal/vendor_transfer_register.md. |
| v2.2 | June 2026 | DeepSeek removed from all cascades (per ADR-001, 2026-06-10). Sub-processor table updated to reflect the post-DeepSeek routing: OpenAI primary for voice + Free/Pro feedback, Anthropic primary for Premium feedback, Google Gemini as shared fallback. Telegram bot integration documented as optional, with data-category and purpose disclosure. |