Privacy Policy (Public Beta)

Last updated: August 31, 2026

This Privacy Policy explains what information Fluent Thai collects, how it's used, and the choices you have.

TL;DR

  • No account is required. You can use all of Fluent Thai without giving us a name or an email address, and we never ask for one to let you in.
  • There is an optional email sign-in, in Settings > Account. If you choose it, we store the email address you give us, because that address is what lets your progress follow you to a second device. Section 1D says what we keep and why. If you don't use it, and you haven't left an address on a bug report, we hold no email for you.
  • We do collect usage and learning data to run the product (e.g., saving progress, generating your plan, fixing mistakes) and to improve it.
  • We don't sell your data.
  • Your learning progress is automatically backed up to our server. If you clear localStorage only, your data will be restored on your next visit via a device ID cookie. Clearing all site data including cookies removes your device identity and progress cannot be automatically recovered. Use the in-app reset options instead.
  • You can selectively reset local data via Settings > Troubleshooting, and you can request deletion of server-stored data associated with your device.

1) What we collect

A. Device and basic request information

When you use the site, we receive standard information that your browser and network send to any website, including:

  • IP address (processed by Cloudflare for security and delivery)
  • User agent (browser/OS), and basic device/platform signals
  • Referrer URL (the page that linked you to Fluent Thai, if any)
  • Timestamps of activity
  • Timezone information (sent by the client to keep day-boundaries and “today” features consistent)

We use this for site operation, security, debugging, and analytics.

B. Product analytics (usage events)

We collect event-based analytics about how the product is used, such as:

  • Which pages/apps you open, and navigation events
  • Session start/end and approximate duration
  • App/round interactions (e.g., starting a round, submitting an answer, completing a round)
  • Performance signals (e.g., correct/incorrect, scores, counts, timing/latency)
  • Audio playback health (e.g., play errors, missing assets, autoplay blocked)
  • Feature interactions (e.g., tips, coach hints, onboarding steps)
  • Diagnostics events (e.g., data recovery, manifest health checks, troubleshooting resets)

These events may include identifiers for the exercise/item you interacted with (to understand what's working and what isn't).

C. Learning and progress data (to provide features)

To power features like spaced repetition, error review, assessments, daily plans, coaching tips, and data backup/recovery, we store:

  • Spaced repetition state (cards/items reviewed, scheduling info, review history)
  • Mistake/error tracking (what was missed, counts, and status for review workflows)
  • Assessments / calibration results (scores and answers where applicable)
  • Daily session / plan state (today's plan blocks, completion status, results)
  • Skill/progress summaries used for the dashboard
  • Activity history (streaks, minutes practiced, sessions completed)
  • User profile and preferences

Learning data is stored both locally in your browser and server-side. The server copy acts as a backup so your progress can be restored if you clear localStorage. If you clear all browser data including cookies, your device identity is lost and automatic recovery is not possible.

D. Account details (only if you choose to sign in)

Fluent Thai works without an account. Nothing in this section exists for you unless you start the sign-in yourself from Settings > Account. The one thing it does is let the same progress open on a second device, instead of being stranded in the browser that made it.

If you do sign in, we store:

  • The email address you enter — lowercased, with surrounding spaces removed — saved as the credential attached to your learner record.
  • Timestamps for that credential: when it was created, when it was verified, and when it was last used to sign in.
  • A record of which device was attached to which learner record, and why. This is what lets a “where did my progress go” question be answered rather than guessed at.
  • The sign-in link, stored only as a hash. The link that arrives in your inbox is never written down on our side. It expires 15 minutes after it is sent, and works once.

To deliver that email we pass your address to Resend, a transactional email provider. The sign-in link is the only email we send to it. There is no newsletter, no announcement list, and nothing to unsubscribe from.

Signing out detaches this browser from the account and returns it to an anonymous record. It does not delete the stored email address — to have that removed, use the deletion request in section 8C below.

E. Anything you type into a report

The issue reporting page has an optional email field. If you fill it in, it is stored with your report so we can reply about that report; leaving it blank still files the report. What you submit alongside it — what went wrong, which screen you were on, your answer and the expected one — is stored with it.

2) Identifiers we use (and why)

A. Device identifier

Fluent Thai generates a random device identifier stored in your browser's localStorage. This identifier is also persisted in a cookie (__ft_device_id, 2-year expiry, SameSite=Lax) as a durability fallback. If your localStorage is cleared, the cookie allows your device to be recognized so your backed-up data can be restored.

The device identifier is used to:

  • Keep your progress consistent on a single device
  • Associate analytics and learning state with your device
  • Enable data backup and recovery
  • Support pairing/sync when you opt in

This identifier is not your name and does not, by itself, tell us who you are.

B. Session identifier

We also use session-level identifiers to group activity into sessions (for example, when you return after being idle). Session identifiers may change more frequently than the device identifier.

3) Cookies and local storage

Fluent Thai uses:

  • A device ID cookie (__ft_device_id) to maintain your device identity if localStorage is cleared. This cookie contains only the random device identifier and expires after 2 years.
  • localStorage to store preferences, learning state, audio cache, and session data. This is the primary storage for your app experience.
  • sessionStorage for short-lived state like health-check throttles and recovery flags (cleared when you close the tab).

To manage your local data, use the Troubleshooting page in Settings. You can selectively reset specific parts of the app (audio cache, today's session, daily plan, coach notes, or SRS data) without losing everything. Server-backed data is restored on your next visit from the same browser. If you clear all site data for fluent-thai.com (including cookies and local storage), your anonymous device identity resets and automatic recovery may not be possible.

4) Server-side data backup

Your learning progress is automatically backed up to our server. This includes settings, skill progress, spaced repetition state, error bank, activity history, and profile data. Backup happens in the background when you use the app.

If your browser data is cleared but your device ID cookie is preserved, backed-up data is automatically restored on your next visit. If both localStorage and cookies are cleared, a new device identity is created and previously backed-up data remains on the server (it can be manually linked upon request).

5) Where data is stored and processed

Fluent Thai runs on Cloudflare infrastructure. Depending on feature flags and configuration, your analytics and learning data may be stored/processed in:

  • Cloudflare Workers / Pages (application runtime)
  • Cloudflare D1 (database for product state, backups, and analytics)
  • Cloudflare Analytics Engine (aggregated analytics storage)
  • Cloudflare R2 (audio files, event archival / logs)

One thing leaves Cloudflare: if you use the optional email sign-in, your email address and the sign-in link are passed to Resend, which delivers that one email. Resend receives nothing else — no learning data, no analytics.

We don't sell your data and we don't share it with third-party advertisers.

6) How we use information

We use collected information to:

  • Provide core functionality (sessions, progress, review, plans, tips/coaching)
  • Back up and restore your learning data
  • Maintain and secure the service
  • Diagnose bugs and improve quality (including audio/content correctness)
  • Measure product performance and improve recommendations over time

7) Data retention

Retention varies by data type:

  • Analytics may be retained for trend analysis and product improvement.
  • Learning state is retained as long as needed to provide features (and as long as your device remains active or paired), unless you request deletion.
  • Server-side backups are retained to enable data recovery. They are deleted upon request.
  • If you use the optional email sign-in, the credential and its sign-in history are kept for as long as the account exists, so that signing in again lands you on the same progress. Spent and expired sign-in links are kept as records rather than pruned; each one holds a hash, never the link itself.

We aim to retain only what is necessary for product operation and improvement.

8) Your choices and rights

A. Manage local data

Use the Troubleshooting page in Settings to selectively reset specific parts of the app. Each option shows exactly what will be cleared and what will be preserved. Server-backed data is restored automatically on your next visit from the same browser. If you clear all site data for fluent-thai.com (including cookies and local storage), your anonymous device identity resets and automatic recovery may not be possible.

B. Don't sign in, or sign out again

The email sign-in is optional and stays optional. Skip it and Fluent Thai works exactly as it does now on this device, with your data still backed up for recovery. If you have signed in and change your mind, signing out from Settings > Account detaches this browser from the account. That is a detach, not a deletion — the stored email address goes only when you ask for it to, below.

C. Request deletion

Because we store learning and analytics data server-side keyed to your device (and/or paired user record), you can request deletion of the data associated with your device(s). Contact us at privacy@fluent-thai.com and include:

  • The fact you want data deletion, and
  • The device you used, or the email address you signed in with

(We may ask for a simple verification step to ensure you control the device(s) in question.)

9) Beta limitations

Fluent Thai is in Public Beta. During this period:

  • Data backup and recovery are best-effort. We work to ensure reliability but cannot guarantee zero data loss.
  • If both your cookies and localStorage are cleared simultaneously, and you have not signed in with an email address, your device identity is lost and backed-up data cannot be automatically restored (manual recovery may be possible upon request).

10) Changes to this policy

We may update this policy as the product evolves. We will update the “Last updated” date at the top of this page.

11) Contact

Questions or requests: privacy@fluent-thai.com