TypeScript 97.6%
SQL 1.4%
JavaScript 0.5%
1import type { Metadata } from "next";2import Link from "next/link";3import { ProsePage, Section, Callout, Bullets } from "@/components/lobby/prose";45export const metadata: Metadata = {6 title: "Privacy Policy",7 description: "Spinza's privacy policy: we store a username, a password hash and gameplay statistics. No email, no trackers, no ads, no data sales.",8 alternates: { canonical: "/legal/privacy" },9};1011const TOC = [12 { id: "summary", label: "In one paragraph" },13 { id: "collect", label: "What we collect" },14 { id: "not", label: "What we do not collect" },15 { id: "use", label: "How we use it" },16 { id: "cookies", label: "Cookies" },17 { id: "sharing", label: "Sharing" },18 { id: "retention", label: "Retention & deletion" },19 { id: "security", label: "Security" },20 { id: "rights", label: "Your choices" },21 { id: "changes", label: "Changes" },22];2324const ROWS: [string, string][] = [25 ["Username", "Identifies your account and appears on leaderboards (unless you opt out)."],26 ["Password hash", "A one-way Argon2id hash. We never store or see your actual password."],27 ["Recovery code hash", "A one-way hash of your recovery code, used only to verify it when you reset your password."],28 ["Age confirmation", "The time you confirmed you are 18 or older."],29 ["Gameplay records", "Each round: game, bet, win, multiplier, features, balance after and a round ID; plus aggregate statistics (spins, wins, biggest win, level, XP)."],30 ["Credit ledger", "Every movement of fictional Spinza Credits, so your balance is always auditable."],31 ["Rewards & progression", "Daily-reward streak, missions, achievements, favourites."],32 ["Settings", "Sound, animation, reminder and leaderboard preferences."],33 ["Session data", "A session token (as a hash), the time of sign-in and last activity, your browser's user-agent string and a truncated IP address, so you can review and revoke devices."],34 ["Security log", "Sign-in successes and failures, password and recovery-code changes, and rate-limit events, kept to protect accounts."],35];3637export default function PrivacyPage() {38 return (39 <ProsePage eyebrow="Legal" title="Privacy Policy" lead="Spinza is built to know as little about you as possible. This page lists exactly what we store, why, and what we deliberately never touch." updated="September 7, 2026" toc={TOC}>40 <Section id="summary" title="In one paragraph">41 <Callout>42 We store your <strong>username</strong>, a <strong>hash of your password</strong>, and your <strong>gameplay statistics and settings</strong>. We do not collect your email address, phone number, real name, location, payment details or contacts. We use <strong>no advertising, no analytics trackers and no third-party scripts</strong>. We never sell, rent or share your data.43 </Callout>44 </Section>4546 <Section id="collect" title="What we collect">47 <p>Everything below is created by you using Spinza. Nothing is gathered from other sources.</p>48 <div className="overflow-hidden rounded-md border border-line">49 <table className="w-full text-left text-[14px]">50 <thead className="bg-surface text-[11px] uppercase tracking-wider text-fg-3">51 <tr>52 <th className="px-4 py-2.5 font-semibold">Data</th>53 <th className="px-4 py-2.5 font-semibold">Purpose</th>54 </tr>55 </thead>56 <tbody className="divide-y divide-line">57 {ROWS.map(([k, v]) => (58 <tr key={k}>59 <td className="whitespace-nowrap px-4 py-2.5 align-top font-medium text-fg">{k}</td>60 <td className="px-4 py-2.5 text-fg-2">{v}</td>61 </tr>62 ))}63 </tbody>64 </table>65 </div>66 </Section>6768 <Section id="not" title="What we do not collect">69 <Bullets items={["Email address, phone number or any other contact detail.", "Real name, date of birth, address or government identifiers.", "Payment information of any kind — Spinza has no payments.", "Precise location. IP addresses are truncated before being shown to you and used only for security rate-limiting.", "Advertising identifiers, cross-site cookies or browsing history.", "Anything from your device beyond what your browser sends with every web request."]} />70 </Section>7172 <Section id="use" title="How we use it">73 <Bullets items={["To run the game: keep your balance, history, progress and settings in sync across your devices.", "To keep accounts secure: sign you in, let you review and revoke sessions, detect brute-force attempts and abuse.", "To operate leaderboards and the wins feed — only if you have not opted out.", "To keep the games fair: aggregate, anonymous game statistics (spins, returns, hit rates) are used to monitor that each game behaves as certified."]} />74 <p>We do not profile you, make automated decisions that affect you, or use your data for marketing.</p>75 </Section>7677 <Section id="cookies" title="Cookies">78 <p>79 Spinza sets one strictly necessary cookie, <code className="rounded bg-surface-2 px-1.5 py-0.5 font-mono text-[13px]">spinza_session</code>, which keeps you signed in. It is HttpOnly, Secure and SameSite, and expires after 30 days or when you sign out. There are no analytics, advertising or third-party cookies, so no cookie banner is needed.80 </p>81 </Section>8283 <Section id="sharing" title="Sharing">84 <p>We do not sell, rent, trade or share personal data with third parties. Other players can see only your username, level and leaderboard results, and only if you participate in leaderboards. The only circumstance in which data would leave Spinza is a valid legal obligation, in which case we disclose the minimum required.</p>85 <p>Spinza is hosted on infrastructure we operate. No third-party analytics, advertising, font, CDN or social-media services load on the player pages.</p>86 </Section>8788 <Section id="retention" title="Retention and deletion">89 <p>Your data is kept while your account exists so your history and progress remain intact. Sessions expire after 30 days of inactivity. Security-log entries are kept for a limited period for abuse prevention. When an account is closed, its personal data is deleted; anonymous, aggregate game statistics that cannot identify you are retained.</p>90 </Section>9192 <Section id="security" title="Security">93 <p>Passwords and recovery codes are hashed with Argon2id and never stored in plain text. Sessions are random tokens stored as hashes. All traffic is encrypted in transit. Sign-in, registration and recovery endpoints are rate-limited. You can review every active session and sign any of them out from Settings → Security.</p>94 </Section>9596 <Section id="rights" title="Your choices">97 <Bullets98 items={[99 <>100 <strong>Leaderboards:</strong> opt out at any time in{" "}101 <Link href="/settings#leaderboard" className="text-accent-2 underline-offset-4 hover:underline">102 Settings103 </Link>104 ; your entries disappear immediately.105 </>,106 <>107 <strong>Sessions:</strong> revoke any device from Settings → Security.108 </>,109 <>110 <strong>Access:</strong> your profile, round history and credit ledger pages show you everything we hold about your play.111 </>,112 <>113 <strong>Deletion:</strong> you may request closure of your account and deletion of its data through the channels listed on this site.114 </>,115 ]}116 />117 <p>Depending on where you live you may have additional rights under local law (such as access, correction, portability or objection). We honour them regardless of jurisdiction.</p>118 </Section>119120 <Section id="changes" title="Changes to this policy">121 <p>If we change what we collect or how we use it, we will update this page and its “last updated” date before the change takes effect. We will never start collecting email addresses, adding trackers or selling data without saying so here first — and we have no plans to.</p>122 <p>123 Read alongside our{" "}124 <Link href="/legal/terms" className="text-accent-2 underline-offset-4 hover:underline">125 Terms of Service126 </Link>127 .128 </p>129 </Section>130 </ProsePage>131 );132}133