What FluentAI collects
Local inference means your conversations are processed on your device and are never transmitted. It does not mean the app is silent. Below is every category the app sends on its own, in the background — which SDK sends it, why it exists, and whether you can turn it off. Features you actively choose, such as cloud providers or the free starter chat, send your messages to that service; those messages are not listed here.
Never collected in the background
- Your prompts, messages, or conversation history
- Model responses or generated output
- Documents, files, or knowledge-base content you add
- Your API keys for cloud providers
- Voice recordings or transcripts
- Images you attach or generate
Benchmark publishing — only when you ask for it
If you run a benchmark and choose to publish it, the app sends that single measurement to us so it can appear on the public benchmark table: your device model and chip, the model and settings you ran, and the resulting speed and memory figures.
It is listed separately from the categories below because it is not background telemetry — nothing is sent unless you tap Publish, and the app shows you the exact data first. It contains no chats, prompts, documents or model output.
Crash and stability reports
firebase_crashlytics
- Stack traces from crashes and non-fatal errors
- Device model, OS version and app version at the time of the crash
- Breadcrumb logs we write ourselves — screen names and operation names, never message text
Why: On-device inference can hard-crash the process from native code, and without stack traces those failures are invisible to us and unfixable for you.
No in-app control today
Feature usage analytics
firebase_analytics
- 84 event types covering which features are opened and whether they succeed — for example app_open, chat_create, model_selected, benchmark_completed
- Message events carry metadata only: model name, model type, a character count, and whether an image or attachment was attached — never the text itself
- Performance figures: tokens per second, response duration, token counts
- Four user properties: device tier, device RAM, inference mode, premium status
Why: It tells us which models and features people actually use, so limited development time goes to the paths that matter rather than the ones we assume matter.
No in-app control today
Advertising
google_mobile_ads
- Your device's advertising identifier
- Ad impressions and interactions
Why: Ads fund the free tier. The one-time premium upgrade removes them entirely.
Controlled by your device's ad settings
Account, only if you sign in
firebase_auth
- Email address and an account identifier
- Sign-in method and timestamps
- While you are signed in, your account identifier is attached to analytics events and crash reports
Why: Signing in is optional and only needed to sync settings and premium entitlement across devices.
No in-app control today
Device attestation
firebase_app_check
- A Play Integrity attestation token, sent only when you use the free hosted onboarding chat
Why: It proves a request came from a genuine install of this app, which is what lets us offer the free trial chat without shipping an API key inside the app.
No in-app control today
Feature flags
firebase_remote_config
- An app instance identifier, sent when fetching which features are enabled
Why: It lets us turn a broken feature off for everyone without shipping an emergency release.
No in-app control today
Verifying it yourself
You do not have to take our word for any of this. We publish a reproducible procedure for putting the app behind an intercepting proxy and confirming that a local chat sends no prompt or response anywhere. Read the offline verification procedure.