clothescast

Privacy Policy

Last updated: 2026-10-10

ClothesCast is a daily weather-insight app for Android. This policy describes what data the app handles, where it goes, and what control you have over it.

TL;DR

Who we are

ClothesCast is an open-source Android app developed by Mikel Ward. The source code is at https://github.com/mikelward/clothescast.

Data the app handles

Approximate location

Calendar events (optional, off by default)

Calendar-sourced theming (optional, off by default)

Notifications

Diagnostic logs and crash reports

Smart Home / Home Assistant bridge (optional, off by default)

Online TTS: shared key by default, your own key on request

Online TTS (the Gemini voice) has two paths.

Third-party services

ClothesCast talks to these services on your behalf. Their own privacy policies apply to anything they receive:

Service What we send When
Open-Meteo Coarse coordinate (forecast); your typed search text when you use the Settings location picker Always for forecast; only when you search for a place name
Google’s geocoding service (via Android’s Geocoder on Play Services devices), governed by Google’s Privacy Policy Coarse coordinate Always on Play Services devices (city / country lookup for the Today header); skipped on AOSP devices
Google Weather API (Google Maps Platform), governed by Google’s Privacy Policy Coarse coordinate and your own Gemini API key Only if you enable the “Google” forecaster on the Forecasters page and have set your own Gemini key
Google Firebase Authentication An App Check attestation, to mint and refresh an anonymous identifier (no name, email, or password) First use of the shared-key path, then periodic token refreshes
ClothesCast TTS proxy (Cloud Function, ClothesCast-operated) The short rendered insight sentence, an anonymous app identifier (as a signed Firebase ID token; plus a Firebase Installation ID during the current rollout), a Firebase App Check token, and the Gemini model name Online TTS with the shared key (default)
Google Gemini API The short rendered insight sentence (forwarded by the proxy, or sent directly when you use your own key) Online TTS, either path
Your self-hosted MQTT broker (e.g. Mosquitto inside Home Assistant) The short rendered insight sentence; the outfit-card image, TTS audio, and muxed MP4 on sibling topics; an update timestamp; and a calendar-derived has_events boolean (no event titles, times, or locations) — all as retained MQTT messages Only if you opt in to the Smart Home bridge and configure a broker
Analytics / crash-reporting service (e.g. Firebase Crashlytics + Google Analytics for Firebase) Aggregate usage events and crash diagnostics — see “Analytics and crash reporting” below for what’s in and out Only if you turn on crash and usage reporting in Settings → Privacy, plus the one upgrade exception described there

These providers act as service providers fulfilling a single request and returning the result. When the ClothesCast TTS proxy is in the path, it adds the anonymous identifier and App Check token described above; when you use your own Gemini key, the request goes straight to Google and no anonymous identifier is attached.

Note on Gemini API: request inputs are not retained for training by default. See the provider’s policy linked above for the authoritative terms.

What we do not collect

Your controls

Analytics and crash reporting

To spot bugs and decide which features are worth keeping, ClothesCast can send two kinds of payload to a third-party reporting service (e.g. Firebase Crashlytics + Google Analytics for Firebase, or equivalent).

This is off until you turn it on, in Settings → Privacy. Both SDKs are started with collection disabled, before any of the app’s own code runs, so on a fresh install nothing is sent and nothing is queued to be sent.

Being exact about one thing, because “off” does not mean the same for both: analytics collects nothing at all, but the crash reporter still writes a crash to your phone even while it is off — turning collection off stops it sending, not catching. Such a report is never sent, and it is discarded the moment you first turn the switch on rather than being released. The goal, once you do turn it on, is to inform product decisions, not to identify you.

What’s sent, once it is on:

What’s not sent — these are hard limits, not “best-effort”:

It is off until you turn it on, and you can turn it back off. Settings → Privacy has the switch. Leave it alone and nothing is sent — with one exception, if you are updating from a version where reporting was on: the reporting libraries start before any of the app’s own code, so a report they were already holding — or an event they record themselves in that moment — can still go before the app turns them off. The app does that on its first launch after the update, and they start off from then on — unless that launch ends before the app gets that far, in which case the next one tries again. A fresh install is never in this position. The Changelog entry for 2026-08-28 describes it in full.

Turn it on and then off again and the app stops collecting, resets the analytics identifier so a later re-enable starts a new stream rather than resuming the old one, and asks the crash reporter to discard the reports it is still holding.

Two things worth being exact about. If the app crashes while reporting is off, the reporting library still writes that crash to your phone — it is never sent, and it is discarded the moment you first turn the switch on, rather than being released. And within a period you had switched on, anything already queued can’t be recalled, and a crash or event landing in the moment you flip the switch is handed over before the new setting reaches the library; either of those may still go.

The reporting service receives only what’s described above and is bound by its own privacy policy (linked from the third-party services table above once a specific provider is chosen). ClothesCast is open source, so you can audit exactly what’s instrumented at https://github.com/mikelward/clothescast.

Children

ClothesCast is not directed at children under 13 and does not knowingly collect personal data from them.

Changes

If this policy changes, the updated version is committed to https://github.com/mikelward/clothescast/blob/main/PRIVACY.md and the “Last updated” date at the top reflects the change. A short summary of each material change is added to the Changelog below, and material changes are also noted in the app’s release notes.

The full revision history of this file is viewable on GitHub: View all changes to PRIVACY.md →

Contact

Open an issue at https://github.com/mikelward/clothescast/issues or email the address listed on the Play Store listing.

Changelog

View full revision history on GitHub →