Privacy & saved settings
This site doesn't track you. No analytics, no third-party scripts, no advertising pixels. The only data we keep about your visit lives in your own browser, on this device.
What we save on this device
A few small preferences, in localStorage — a tiny key/value store the browser keeps for our domain. Nothing is sent to a server. The current list:
| Key | What it stores | Why |
|---|---|---|
ccg-theme | "light" or "dark" when you pick
an explicit theme. Absent when set to Auto. | So the site doesn't flash to the wrong color scheme on your next visit. |
ccg-standings-format | The last format you chose on the standings page —
"TCG", "VGC", or "GO". | So when you come back to /players/ you land on the format you actually follow, not the site's default. |
ccg-notice-dismissed | "1" after you've dismissed the bottom-screen
"we save preferences on this device" notice. | So we don't show you the same notice on every page load. |
tb-deckbuilder-draft | Your in-progress deck on the Deck Builder — a JSON list of card identifiers and quantities plus the chosen format (Standard / Expanded). Card list only; never any personal info — your name, Player ID, and date of birth are entered only when you export and are not stored here. | So an accidental refresh mid-build doesn't lose your deck. One working draft; it's overwritten as you edit and cleared when you press Clear in the builder. (Saving named decks to an account is coming later.) |
tb-theme | "light" or "dark" when you've
pinned an appearance on the Team Builder
(/teams/). Absent when set to Auto. | Same pre-paint flicker prevention as ccg-theme,
scoped to the Team Builder so the two surfaces can disagree
if you want. |
ccg-account-hint | Only if you sign in: your public handle and favorite-Pokémon type colors — nothing private (never your email or Player ID). | So the header shows your account pill instantly on the next page load instead of flashing a "Sign in" button first. Cleared when you sign out. |
tb-notice-dismissed | "1" after you've dismissed the Team Builder's
"we save preferences" notice. | Same reason as ccg-notice-dismissed, scoped to
the Team Builder. |
teams.layoutOverrides.<profile-id> | Your manual nudges to OCR crop regions for one screenshot layout profile. JSON object of region IDs → adjusted coordinates. | So your calibration tweaks don't reset every time you reload the team intake page. One key per layout profile. |
teams.opponentNatureIndicators | Present as "1" only if you've turned on
"Print nature-effect indicators on the opponent's page"
in the Team Builder. Absent when the default (off) applies. | So your opt-in persists across reloads — you don't have to flip the toggle every time you export a team list. |
teams.includeTeamID | Present as "1" only if you've turned on
"Include Team ID on the PDF" in the Team Builder.
Absent when the default (off) applies. | So your opt-in persists across reloads. |
tb-draft-player-<join-code> | Per-session identity for the Custom Tournament Interface
at /custom/. A JSON blob
{ playerId, displayName, seatIndex }, where
playerId is a random per-session UUID we
generate the first time you join — NOT your Play! Pokémon
Player ID, which we never collect from your browser.
displayName is whatever you typed in the
"Take a seat" box; seatIndex is the seat
the session assigned you. | So you can refresh the page or switch tabs mid-draft
without re-joining the session. One key per draft
session you join; the
<join-code> piece is the 6-character
session code (e.g. tb-draft-player-PNGM3X).
The Clear button below removes every key matching this
prefix. |
tb-draft-art | "champions" or "pokeapi" when you
pick a tile artwork source in the Custom Tournament Interface
at /custom/. | So your choice of Pokémon tile art — the Champions in-game sprites or PokéAPI artwork — sticks across draft modes and visits on this device. |
tb-pointbuy-ineligible | "bottom", "grey", or
"hide" when you choose how the point-buy menu
shows Pokémon you can't currently pick. | So your preferred handling of ineligible Pokémon on the point-buy team menu sticks across visits on this device. |
tb-research-open | "1" when you open the species catalog ("Catalog")
on the team builder at /teams/; removed
when you close it. | So the catalog research panel stays open (or closed) the way you left it across visits on this device. |
If you create an account
Accounts are optional. You sign in with a passkey
(Face ID / Touch ID / a security key) or with Google or
Apple — there's no password for us to store. When you're
signed in we set one cookie, and we keep a small account record on our server:
What Where Details player_session Cookie (HttpOnly, Secure) A random session token so you stay signed in (~30 days). We
store only a hashed copy; signing out deletes it. Account record Our server (Cloudflare D1) Your handle, email, registered passkeys, optional favorite
Pokémon, and — if you add it — your Player ID. Connected account Our server (Cloudflare D1) If you choose Continue with Google or Sign in with
Apple, we store that provider's account identifier (an opaque
“subject” ID) plus the email they share, used only to recognize you
on your next sign-in. We never receive or store your Google or Apple
password. Disconnect any time from your account page. Saved decks Our server (Cloudflare D1) Decks you save in the Deck Builder while
signed in — each is a name, format, and the card list (card
identifiers + quantities). No personal info is in a
saved deck. We may look at aggregate usage across accounts
(which cards and archetypes get built) to inform events and prizing;
that analysis never identifies you. Delete any deck any time from the
builder, and account deletion removes them all.
Signing in with Google or Apple briefly sends you to that
provider's own sign-in page; what happens there is governed by
Google's
or
Apple's
privacy policy. When you return, we receive only your basic profile
(name + email) to create or recognize your account — nothing else — and we
never post anything to your Google or Apple account. With Apple you can also
choose to hide your email (a private relay address) — that
works fine here.
Your email and Player ID are never shown publicly
— a public profile (if you turn one on) shows only your handle and
favorite Pokémon. You can request account deletion any
time from your account page; a staff member
processes the request, which removes your passkeys, connected accounts,
sessions, and profile
(teams you've submitted are kept but un-linked, and can be removed
separately via a data request). Your account stays active until the
request is processed.
Filters in shareable links
When you change a filter on the standings page (format, category,
division, season) or the Deck Builder
(format, search text, card type, set), we update the URL in your
address bar — that way a link you copy already carries the view
you're looking at. No cookies involved; just the URL itself.
Clear saved settings
The button below removes both keys above from this browser.
Your theme returns to Auto and standings will land on whatever
the site's current default is.
Cleared. Reloading…
What we currently don't collect
An honest answer instead of a promise — this list reflects the
site as it stands today. If anything changes, this page changes
with it.
- No login, no account, no email collection on the public site.
- No analytics or visitor counters.
- No third-party scripts, fingerprinting, or ad networks.
- No cookies (the standings filter state lives in the URL, not
a cookie).
Questions? Email
dennis@circlecitygaming.com.