Your data
The short version: we count waters, not people. Nothing is ever read out of your photos or your sensors. We do count whether visits are new or returning, in coarse buckets that cannot single anyone out, and that is spelled out below rather than buried.
What never leaves your device
- Your GPS position. "Use my location" resolves against map data already on your device; your coordinates are not sent to us or stored anywhere.
- Your fish photos. Identification runs entirely on your phone: no photo uploads, no per-photo API, no cloud processing. A photo only ever leaves your device if you tap Share yourself, and even then the shared card carries no location.
What you can choose to send
- A training contribution, one tap per photo: the small 300 px crop, the species you confirmed, and the state-level region you selected. The crop is redrawn on your device first, which physically strips camera metadata, so coordinates cannot survive it. We never receive your original photo.
- Saved waters and flow thresholds, if you turn on alerts. That is what the alerts are about.
What we count, without identity
When a water's rules are opened, a counter for that water goes up by one. The counter is the entire record: no account, no IP address, no device ID, no precise timestamp. Just "this lake was looked up N times this week." Those totals tell us which waters deserve the fastest rule updates and the best gear guidance. Species totals by state from training contributions guide the fish ID model the same way. None of it can be traced back to a person, by us or anyone else, because the identifying part is never created.
One more counter, and we want to be straight about it, because it is the only one that is about visits rather than waters. Your browser remembers, on this device only, the day you first opened Kotu and how many times you have come back. That record never leaves your phone. What we receive is a single bucket, once per session: whether this device is new or returning, roughly how long since it was last here, and which part of the app it opened. It lets us answer "do people come back, and for what" so the app can actually get better. It cannot answer "does this person come back", because a bucket is all we ever get and there is nothing on our side to attach it to. You can wipe that record any time with the button below, and clearing your browser data wipes it too.
Honest edges
- Serving you a water's rules necessarily means our host briefly sees the request, like any website. Host infrastructure logs are short-lived and we never join them with anything.
- Push alerts require storing your saved waters with your browser's push address; unsubscribe and it is deleted.
- Training contributions are anonymous by design, which also means we cannot find yours later to delete it. There is nothing linking it to you.
How we check our data
Every rule in Kotu Fish starts at the official source: the state's own current regulations. We capture the state's exact words rather than rewriting them, and each water's page links the document it came from with the date we last checked it.
For the technically curious: capture is automated, and every captured rule carries a quote that must match the official text character for character; a rule whose quote cannot be found in the captured source text fails our checks and does not ship. In five states (WA, OR, TX, ID, AK) we also re-fetch the live source and re-check every rule. Where a state is verified by two independent reads of the source, both must agree on every rule for a water, and any future check that disagrees flags that water on its own page automatically. Waters that cannot be confidently placed on the map ship unmapped and say so; we never guess.
Rules can change mid-season. The receipts show exactly how fresh each answer is; always verify posted rules at the water.
This page changes in the same commit as any feature that changes what is collected.