Privacy Notice — jpgames.app
Effective: 2026-08-27 (previously 2026-07-14; §2.3 page counts added, and the unqualified "no analytics" claim corrected)
In one paragraph
jpgames.app is a small self-hosted card-game service. It collects the minimum needed to run the game: a random identifier so you can close the tab and come back to your seat, the gameplay state of games you take part in (hands, bids, scores), and short-lived operational data (your IP address for rate limiting, your browser's User-Agent in server logs). If you register an account, it also stores your chosen handle and a hashed password. There is no email address, no advertising, and no third-party trackers. The server counts how many times each page is requested, in aggregate — no cookie, no IP address, nothing that identifies you, and nothing that leaves this machine. If you want the data associated with your visit removed, clear the site's cookies and — if you played long enough for a game to persist or registered an account — email the address below.
1. Who runs the service
Operated by John Paist. Contact: hello@jpaistiv.com.
2. What is collected, and why
2.1 As a guest (no account)
- A player identifier (
playerId). A random 128-bit value generated the first time you visit and stored in a signed cookie so you can reclaim your seat if you disconnect. It is not tied to any real-world identity. Deleting the cookie disconnects you from any past gameplay under that id. - Gameplay state. Hands, bids, plays, scores, and table configuration for games you take part in. Stored in a SQLite database on the server so games survive a restart.
- IP address. Used at connection time for per-IP rate limits and abuse prevention. Not stored in the game database; visible in server logs for a short window (typically a few weeks).
- User-Agent string. Visible in the same server logs alongside your IP. Not linked to your
playerIdin any stored record.
2.2 With an account (once registered)
- Your handle — the public display name you pick during registration. Shown on your seat and, later, on the leaderboard.
- A hashed password. Passwords are hashed with
scryptand a per-account random salt before storage. The raw password is never stored or logged. - A session cookie (
jpgames_session) — see §3. - Per-account game stats once game-end crediting is enabled — games played, wins, losses, scoring counters. Feeds the leaderboard.
- The User-Agent of the browser you signed in with — recorded on the session row so you can later see the list of your active sessions and log out from a specific device.
That is the complete list. There is still no email address, no advertising, and no third-party trackers.
2.3 Page counts
- A count of how many times each page was requested, per day. That is the entire record: a route name, a date, and a number. There is no visitor identifier, no IP address, no session, no cookie, no referrer and no User-Agent attached to it, and no ordering — so two visits by one person and one visit by two people are indistinguishable in the data, by construction rather than by promise.
- Only pages this site already knows about are counted. A request for a page that does not exist is not recorded at all.
- Why it exists. To answer one question: whether the rules pages added in August 2026 are read by anyone. Without it there is no way to tell a page that helps people from one nobody opens.
- It never leaves this machine. Nothing is sent to any third party, there is no analytics provider, and no script runs in your browser for it.
> Changed 2026-08-27. This document previously said "no analytics" without > qualification. That was true when written and became false the day these > counts were added, so the sentence was corrected in the same change rather > than left to rot. What was, and remains, true is the part that matters: no > cookies for it, no fingerprinting, no third-party scripts, and nothing that > follows you between pages or between sites.
3. Cookies
The complete list of storage keys lives at /privacy/storage-keys; the short version:
euchre.pid+euchre.token(localStorage). The signed guestplayerIdand its HMAC token. Set on your first visit.euchre.name(localStorage). The display name you typed on the Euchre home screen, so you don't re-type it on the next visit.jpgames.zoom(localStorage). Your zoom preference.jpgames_session(HTTP cookie — once accounts arrive). A high-entropy random session identifier,HttpOnly+Secure+SameSite=Lax. The server stores only a SHA-256 hash of this value.jpgames_csrf(HTTP cookie — once accounts arrive). A short anti-CSRF token that pairs with hidden form fields on sign-in and logout. NotHttpOnlybecause the client needs to read it.
No ad-network cookies. No analytics cookies — the page counts in §2.3 are kept on the server and set nothing on your device. No embedded third-party widgets that would set cookies on your device from other domains.
4. Retention
- Live gameplay state: in-progress tables are kept in the database and reaped after an idle window (currently thirty minutes) or when the game completes.
- Nightly database backups are kept for fourteen days, then deleted.
- Server access logs are retained per host configuration; typically no more than a few weeks.
- Account rows persist until the account is deleted or the service ends. Session rows expire 30 days after last activity (sooner if you sign out).
5. Sharing
- Nothing is shared with third parties for analytics, advertising, or any marketing purpose. The service does not use any external CDN.
- Three infrastructure providers are involved by virtue of being on the public internet: Porkbun (the DNS registrar for
jpgames.app), Let's Encrypt (which issues the TLS certificate), and Hetzner Cloud (which hosts the server). None of them can see gameplay content; they see only what any operator of DNS, PKI, or network transit sees. - If external sign-in via Google or Apple is added later, those providers see the sign-in exchange itself and receive whatever they require from the standard OAuth handshake. This notice will be updated to describe that before it ships.
6. Your rights
Because the data footprint is small, there is little to request. If you would like:
- A summary of the data associated with your
playerIdor your account, or - Deletion of that data,
email hello@jpaistiv.com and include your playerId (visible in your browser's DevTools under Application → Cookies for jpgames.app) or your account handle.
Clearing your browser's site data for jpgames.app is the fastest way to disconnect from any past guest sessions. For an account, sign out and email deletion@jpaistiv.com — the account row and all its associated stats and sessions can be removed on request.
7. Security
Security reports are handled per SECURITY.md in the source repository — private reports via GitHub Security Advisories or email to hello@jpaistiv.com.
Passwords are hashed with scrypt (RFC 7914) with a per-account random salt and tuned cost parameters. The service never stores or logs the raw password; a database dump does not expose the plain-text values.
8. Age
The service is intended for ages 13 and up. Some jurisdictions require users to be 18 or older to use online services; if that applies to you, that is your minimum. The service is not directed at children under 13, and if we learn a registered account belongs to someone under 13 (or the applicable local minimum), the account will be deleted.
9. Changes to this notice
Material changes are reflected in the effective date at the top of this page. When accounts and email are introduced (later phases of the roadmap), this notice will be updated to describe them before the feature ships.
This notice is written in good faith to describe how the service actually works, and is intentionally short because there is little to describe. It is not legal advice. Compliance with specific jurisdictions (GDPR, CCPA, and others) should be confirmed with a lawyer before wider public promotion.