Privacy
Data kept in your browser
Interface preferences and cached game data stay in your browser using localStorage. Saved teams, bench sets, and PokePilot analysis history also keep a local browser copy. When you sign in with Google, PokePilot synchronizes those saved teams and history, plus your language, theme, default battle format, and tutorial-completion preference, plus the last selected analysis tab, model, and reasoning level, to an account-scoped Cloudflare D1 database so they are available on your other signed-in devices. The browser copy remains until you remove it in the app or clear the site's browser data; it is also cleared when you sign out. PokePilot also stores the minimum account profile needed for sign-in and abuse controls: a Google account identifier, and any email address, display name, or profile image URL Google gives to PokePilot.
Optional AI analysis
Account sync stores saved teams and analysis history as described above.
When you request an AI analysis, the server forwards the structured
battle data, including a team name when present, to OpenAI to
generate the response. Avoid placing personal or confidential
information in team names or analysis inputs.
The request also includes a pseudonymous account identifier derived
with a server secret for OpenAI abuse monitoring, not your Google
email or profile. Requests use store: false; this does
not override OpenAI's own data-retention policies.
PokePilot does not currently collect a separate set of teams or analyses for AI quality improvement. Account-synced history is for saving your work, not a quality-sharing program. There is no quality-sharing setting or related reward at this time.
The pre-analysis estimate runs in your browser and does not send an analysis request to OpenAI or save your team. Confirming analysis saves the team before the paid request. Saved analysis history can include the response, duration, token usage, estimated cost, and battle-data source metadata.
AI analysis requires sign-in and a personal OpenAI API key; team building and damage calculation do not require a key. PokePilot encrypts the key before storing it in the account-scoped Cloudflare D1 database. The browser does not retain the key after registration, and PokePilot does not display it again. The server decrypts and sends it to OpenAI only when you request an analysis using that key. OpenAI bills usage to your own account. You can remove the key in account settings; deleting your PokePilot account also removes it.
Abuse controls and server caching
- Google sign-in creates a random, Secure, HttpOnly, SameSite session cookie. Its server-side HMAC is stored in Cloudflare D1 with a 30-day idle window. Authenticated activity renews that window when seven days or less remain, up to 90 days from sign-in. JavaScript cannot read the session value. Expired session records no longer grant access; expiration is not a promise of immediate deletion.
- An HttpOnly, signed anonymous-client cookie identifies a browser for request admission controls. It contains no account or profile data and can remain for up to one year.
- The application converts the request IP address to a keyed, one-way hash for request identity. PokePilot does not place the raw IP address in its application cache.
- Public personal-key analysis bypasses the shared Redis analysis cache, but temporary account/IP request counters and account/global active-analysis permits remain in Redis for abuse and capacity protection. These are not daily analysis credits. Duplicate in-flight requests may share a result within a server process. The development adapter can use Upstash for temporary request controls and analysis caching; its analysis cache expires within 24 hours. Account analysis history in D1 is separate from this cache. It is bounded to 60 entries and a 1 MB payload; older entries can be removed as new history is kept.
Operational metrics
We retain daily aggregate API request counts, HTTP status codes, latency buckets, analysis categories, cache outcomes, token totals, and estimated costs for successful calls and failed calls with known usage for approximately 90 days. These aggregates contain no account identifiers, IP addresses, team contents, prompts, or analysis text. They help us improve reliability and resource efficiency; they do not track individual browsing activity.
Cloudflare Web Analytics also measures page visits and page performance through a browser script. This is separate from the API aggregates above. It does not use cookies or local storage for analytics. PokePilot does not add account identifiers, team contents, analysis text, or API keys to this beacon. See Cloudflare Web Analytics for details about its measurements.
Service providers
Cloudflare hosts the app, Worker API, and account-session database; Google provides optional sign-in; OpenAI processes requested AI analyses; and Upstash provides temporary request and capacity controls and the optional development analysis cache. These providers may process standard request metadata under their own terms and privacy policies. Game data is loaded from or derived from PokeAPI, Pokemon Showdown, and Pokemon Champions Battle Data sources.
Advertising
PokePilot does not currently display third-party advertisements. If advertising is enabled, PokePilot may use Google AdSense to display Google-served ads. Google and its partners may use cookies or other local storage to serve and measure ads, including personalized ads where permitted and consented to. You can manage personalized ads through Google's My Ad Center.
Where required, including for visitors in the EEA, the United Kingdom, and Switzerland, PokePilot will present an appropriate consent choice before enabling advertising storage or personalized advertising.
Your controls and contact
Delete saved teams and analysis history in PokePilot, or clear this site's browser data to remove local data and the anonymous cookie. Signing out clears synchronized team and analysis-history copies from this browser while retaining them in your account. Deleting the account also deletes synchronized teams, analysis history, and preferences from the server alongside the account record and active sessions; local team and history copies are cleared. Interface preferences remain normal browser settings. Server-side operational entries expire automatically. Send general feedback through GitHub Issues and report security concerns through the repository's security policy.