flutterwatch is a small independent project. It keeps the least it can get away with: enough to tie engine downloads to an account and to know which apps ship the engine — and nothing at all about the people who use those apps.
Signing in uses GitHub OAuth, requesting only the user:email scope. That shows us your public GitHub profile and lets us read the email addresses on your GitHub account, and nothing else: it gives no access to your repositories, private or public. We look at those addresses only while you sign in, keep at most one of them, and do not keep the GitHub token. An account stores:
A token is stored only as a SHA-256 hash. The plaintext is shown once — to the CLI when you sign in, or in your console when you create a key — and is never written to the database. Alongside the hash we keep a short non-secret prefix so you can tell your keys apart in a list, and the time a key was last used. A lost token cannot be recovered, only revoked and replaced.
On your own machine the token lives in ~/.flutter-watchos/credentials.json with file mode 600.
flutter-watchos logout revokes it on the service, then deletes it.
Each engine-artifact request is logged with the engine version and file requested, the time, the account it belonged to — if there was one: the Simulator engine downloads without an account, and such a request is logged without one — and whether it succeeded or was refused. That log tells us which engine versions are actually in use so old ones can be retired without stranding anyone.
When you build an app for release while signed in, the command-line tool registers that build with your account. It sends four things, once, from your machine, at build time: the app's bundle id, its version, the engine version, and the build mode. It prints a line when it does. That is what lists the app in your console, and it is how the project knows which apps ship the engine.
No source code, file names, dependency lists, or anything about your machine is sent, and debug, profile and simulator builds are never registered. It is on by default and
flutter-watchos build-registry --disable turns it off — an app you would rather not name yet is reason enough.
The full list of what is and is not sent.
A new account gets a one-time welcome at its address. After that, accounts get the occasional announcement — a release, or something you need to know. Every announcement has a one-click unsubscribe, and the Account page of your console has the same switch.
The rest is correspondence, not a subscription, so that switch does not stop it: an answer to a message you sent us, and a note a maintainer writes to you personally about your account.
For every email we send, we keep the address, the subject, what kind of email it was, when it went, and whether it was delivered, bounced or reported as spam; we do not track opens or clicks. An address that bounces for good, or reports our mail as spam, goes on a do-not-send list with that reason, and nothing is sent to it again.
Mail sent to hello@flutterwatch.dev, a reply to one of our emails included, is stored so that it can be answered, whether or not you have an account. We keep the sender's name and addresses (the From address and the envelope sender, which can differ), a separate Reply-To address if there is one, the address it was sent to, the subject, the text, the headers that thread a conversation, and the message's size. Attachments are not kept: only their names, types and sizes are recorded. If the sender's address is the one on an account, the message is linked to that account.
A copy of the text is emailed to the maintainers' own inboxes, so that someone reads it. Our answer goes to the address you wrote from, or to your Reply-To address, and is stored with your message.
flutter-watchos login
starts, a keyed hash of the network it comes from (never the address itself) is kept with the sign-in code, to stop floods of sign-in attempts; it is cleared out with the old codes, an hour or so later. Cloudflare, which hosts the service, necessarily processes connection metadata in order to deliver the request at all.
The site is pre-rendered static HTML and CSS. It sets no cookies unless you allow Google Analytics, and it runs three small scripts:
Your answer to the analytics question is kept in your browser's local storage (fw-analytics-consent), so the bar does not come back on every page. If your browser sends Global Privacy Control, Google Analytics stays off and you are not asked.
Nothing is sold, and nothing is shared for advertising.
Much of this you can see and change yourself in your console: Usage lists your engine downloads, My apps your registered release builds, and API keys every key on the account, each of which you can revoke there. Account is where you change your email address and turn announcements off; the link in any announcement does the same.
flutter-watchos build-registry --disable stops release builds being registered.
For anything else — a copy of what we hold about you, a correction, or deletion — write to hello@flutterwatch.dev from the address in question, or use Support in your console.
Ask as above, and we delete the account and what is tied to it: its profile fields, tokens, sign-in codes, download records and registered release builds; your Support messages and the mail you sent to hello@flutterwatch.dev from that address, with our answers and the copies in the maintainers' inboxes; and the log of the email we sent you. You do not need an account to ask: if you only ever wrote to us, ask from the address you wrote from, and your messages and our answers are deleted the same way.
Two things are kept. If your address ever bounced for good or reported our mail as spam, it stays on the do-not-send list with that reason: that entry is what stops us writing to it again. And the record of actions the maintainers took on the account stays, with your address taken out of it. Your username is left on one entry only, the one that records the deletion itself, so that we can show it was done; ask, and it comes off that one too.
The service is still moving. If what is collected changes, this page changes with it — and anything genuinely new will be called out in the release notes rather than quietly appearing here.
Write to hello@flutterwatch.dev about anything on this page. You do not need an account to ask.
Last updated 11 October 2026.