Cookie & Storage Policy
Last updated: June 2026
This page explains what TheLernen stores in your browser, what it is for, and whether it needs your consent. Almost everything is first-party localStorage that never leaves your device: your study progress, streaks, XP, level, daily goals, per-language settings, which lessons you have finished, and interface preferences such as theme and sound. Those keys are strictly necessary for a learning app to remember where you got to, so they are not gated behind the banner. The table below names the ones worth naming — there are roughly seventy in total, most of them per-language or per-session variants of the same few patterns (dl_stories_*, dl_words_learned_*, dl_is_pro_*), and listing every one would be less clear, not more. Nothing in localStorage is sent to a third party. You can change your consent choice at any time by clearing the cookie called dl_consent (App Settings → Clear app cache, or your browser settings).
1. Strictly Necessary (no consent required)
These keys make the app work — saving your study progress, language choice, and theme. They store data only in your browser (localStorage). The app cannot function without them.
2. Analytics (consent required)
When you click "Accept all" in our cookie banner we load PostHog (EU servers, GDPR-compliant) to anonymously measure which features help you learn most. PostHog sets a small first-party cookie and an anonymous ID. We never share this data with advertisers. If you choose "Only necessary", PostHog is never loaded.
3. Error Monitoring (legitimate interest)
Two things run here. On our server we log AI errors (e.g. when Google Gemini is overloaded) to PostHog; those logs contain only error codes and HTTP statuses, no personal data. In your browser, Sentry reports crashes so a broken page reaches us instead of silently ending your session — it receives the error message, the page it happened on and your browser type, with personally identifiable information switched off and no session recording. Both are processed under GDPR Article 6(1)(f) — legitimate interest in a working, secure service — and neither sets an advertising or analytics cookie, so neither is gated behind the banner.
4. Third-Party Cookies
TheLernen shows advertising on its editorial pages — blog articles, relocation guides, course landing pages and the CEFR level pages — and never inside the learning app, on dictionary word pages or on account screens. Third-party cookies you may encounter:
- Google AdSense (advertising) — loaded only on the editorial pages listed above, and only after you choose "Accept all". Google and its partners may set cookies to serve and measure ads. You can turn off personalised advertising at adssettings.google.com, and review Google's partner list at policies.google.com/technologies/partner-sites.
- Meta pixel (advertising measurement) — loaded only after you choose "Accept all".
- Supabase (auth session) — set only after you log in. Necessary.
- Lemon Squeezy (checkout) — set only on the checkout page when you click Subscribe. Necessary for payment.
- PostHog (analytics) — set only with "Accept all" consent.
5. localStorage Keys We Use
| Key | Purpose |
|---|---|
| dl_consent | Your cookie/tracking consent choice. |
| dl_session_id | Links your local progress to your account. |
| dl_device_id | Anonymous device identifier for guest sessions. |
| lang | Your selected interface language. |
| dl_study_lang | Language you are currently learning. |
| theme | Light or dark theme preference. |
| dl_sfx_muted | Sound effects on/off preference. |
| dl_hide_romaji | Hide romaji in Japanese learning mode. |
| dl_anki_native_ime | Use native IME in Anki mode. |
| dl_hiragana_srs | SRS progress for Hiragana characters. |
| dl_katakana_srs | SRS progress for Katakana characters. |
| dl_german_symbols_srs | SRS progress for German umlauts. |
| dl_polish_symbols_srs | SRS progress for Polish characters. |
| dl_is_pro_{session} | Cached PRO status for your session (refreshed from server). |
| guest_session_id | Keeps your progress if you learn without an account. |
| dl_total_xp | Experience points earned. |
| dl_level | Your current level. |
| dl_goal | Why you said you are learning — used to pick your first path. |
| dl_daily_goal_{lang} | Daily target for that language. |
| dl_max_streak_{lang} | Longest streak reached in that language. |
| dl_stories_{lang} | Which stories you have read in that language. |
| dl_words_learned_{…} | Counters behind your daily progress ring. |
| dl_onboarding_completed | Stops the onboarding running twice. |
| dl_srs_settings | Your spaced-repetition preferences. |
| dl_visit_count | Counts visits so the "install app" prompt is not shown too early. |
| dl_tracked_day2 | Marks that the "came back on day 2" event has already been counted, so it is not sent twice. The event itself only fires if you accepted analytics. |
6. Your Rights
You can clear all browser storage at any time via App Settings → Clear app cache (this also resets your consent choice — the banner will reappear). You can also delete your account entirely from Settings; this removes all server-side data per our Privacy Policy.