Kotu Fish

Your data

The short version: we count waters, not people. Nothing is ever read out of your photos, your sensors, or your habits behind your back.

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.

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 a fresh copy of the source fails our checks and does not ship. 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.