The short version
- No email address. Signing in with Discord does not ask Discord for your email, so there is none here to leak, sell or lose.
- No password. There is no password field anywhere in this app. Discord does the signing in.
- No analytics, no trackers, no advertising. The site loads no third-party scripts of any kind.
- You can play without an account. The hot-seat table at /play needs no sign-in and stores nothing about you on any server.
Signing in with Discord
The only way to sign in is Discord. The app asks Discord for the identify scope and nothing else, which returns your Discord user id, your display name and your avatar. It does not include your email address, and this app never requests, receives or stores one.
Discord is a separate company with its own privacy policy, and signing in tells Discord that you used this app. What Discord does with that is between you and Discord.
What is stored on the server
Once you sign in, one row exists for you, plus one row for each deck you save. The table below is every column of both — not a selection from them:
| What | From | Why it is kept |
|---|---|---|
| Discord user id | Discord | It is the only thing that says which decks are yours. |
| Display name | Discord | So the app can greet you by name instead of by number. |
| Avatar URL | Discord | The picture beside your name. It is a link to Discord, not a copy of the image. |
| Village | You pick it | The colours your side of the table is dressed in. |
| The date your row was created | The database | Written once, the first time you sign in. It is how old your account is. |
| The date your row last changed | The database | The database advances this every time the row is written, and signing in writes it — so in practice it is the date you last signed in. That makes it the one thing here that records when you were around, which is why it is a row in this table rather than a detail left out of it. Nothing in the app shows it to anyone, including you. |
| Decks you save | You build them | So they follow you between devices, which is the reason accounts exist here at all. Each one is stored whole, under your Discord id and the id it was built with. |
| When each deck was saved, and last changed | The database | Your deck list comes back most-recently-saved first, and these two dates are what put it in that order. Nothing else reads them. |
That is the whole of it rather than a summary of it: every column of both database tables appears as a row above, the two dates included. Beyond them there is no other profile, no match history, no page-view log, no IP log kept by the app itself, and no field waiting to be filled in later.
Deck names and any other text you type are stored as you typed them. They are readable by the person who runs the site, and other players see them when you play. Do not put anything in one that you would not want read.
What is stored in your browser
Separately from any account, the app keeps a small record in your browser's own local storage, under two keys: chuunin.profile — a display name, a village, and two table preferences — and chuunin.decks, which holds decks you have built. Nothing sends that record anywhere on its own. Clearing this site's data in your browser erases it, and no copy of it exists elsewhere unless you signed in and saved.
Signing in sets four cookies, and three of them are set before your browser has even left for Discord — so if you open devtools partway through a sign-in you will count three, and four once you are back:
__Host-authjs.csrf-token— proves the sign-in being completed is the one this site's own page started, and not one another site posted on your behalf.__Secure-authjs.callback-url— which page to put you back on when Discord returns you.__Secure-authjs.pkce.code_verifier— a one-time secret that ties the trip out to Discord to the reply that comes back, so an intercepted reply is useless on its own. It is created with a fifteen-minute life and is spent on the way back.__Secure-authjs.session-token— the session itself, set last, when Discord returns you. This is the one that keeps you signed in between page loads.
All four are set by this site's own server in a response header, are marked HttpOnly (no script on the page can read them, this app's own included) and SameSite=Lax, and each exists to make the sign-in itself work. Once you are signed in three remain, because the code verifier has been spent. The __Host- and __Secure- prefixes are a browser rule that only applies over HTTPS: a copy of this app running on plain http://localhost sets the same four cookies under the same names without them.
There are no analytics, advertising or tracking cookies, because there is no analytics and no advertising, and none of the four above is one.
The roster form on the front page
The front page has an “Enter the exam” box that takes an email address. This is a mailing list for beta announcements and it is entirely separate from accounts — an address given to it is never attached to a Discord id, and signing in never adds you to it.
When a list service is configured, the address you type is posted to it and stored there, under that service's policy rather than this one. When none is configured, the form still says you are on the roster and your address is not stored anywhere at all — which is the honest state of that form today, and is stated here rather than left for you to assume either way.
Where the site runs, and what it loads
- Railway hosts the app and the Postgres database the rows above live in. Like any web host, its servers see the requests your browser makes.
- Cloudflare Pages serves the card art, when card art is switched on. Your browser fetches images from it directly, so that host sees those requests the way any image host does. No account data is attached to them: the app holds no credential for it and sends none. When no art host is configured, your browser never contacts one at all and cards fall back to plain text frames.
- Discord handles the sign-in itself, and serves the avatar image your browser loads beside your name.
- Fonts are served from this site, not from Google. They are downloaded once when the app is built and shipped from this origin, so loading a page makes no request to a font host.
That is the complete list of hosts a page on this site talks to. There is no tag manager, no analytics service, no advertising network and no embedded third-party script anywhere in the app.
Deleting your data
Revoking the app in Discord is not deletion. Removing Chuunin Exam under Discord's User Settings → Authorized Apps stops it signing you in again, and it is worth doing — but Discord cannot reach into this database, so the row stays until it is deleted here.
There is no self-serve delete button yet. Ask, and the row and every deck attached to it are deleted — every column in the table above, the two dates included. Nothing is kept back, and there is no soft-delete copy.
This copy of the site has no contact address configured, so there is no address to print here and no way for you to ask for your data to be deleted from this page. That is a gap in the deployment, not a policy: if you are reading this on the live site, it is a bug, and the address belongs in this paragraph.
One honest caveat: the database host takes its own routine backups, so a deleted row can survive in those until they age out. Nothing reads them except a restore after a failure.
Children
Signing in requires a Discord account, and Discord's own terms set the minimum age for that. This site is not directed at children, and it collects nothing from anyone who has not signed in.
Security, stated plainly
This is a hobby project run by one person, and it makes no security claims it cannot keep. What it does instead is hold as little as possible: no password to steal, no email address to leak, no payment details, and one row per player whose every column is printed in the table above. The safest data is the data that was never collected.
Changes to this page
It changes when the app does. There is no mailing list to notify you through — the app holds no email addresses, which is the point — so the date below is how you tell.
Last updated 24 August 2026