Skip to content

Security & Architecture

Why a static kids app with no backend is about as small an attack surface as software gets.

Last updated 26 September 2026

1. Static architecture

Every page is prerendered to static HTML at build time. There is no application server, no database, no user sessions and no API that accepts input โ€” the entire categories of bugs that plague dynamic apps (injection, broken access control, session theft) have nowhere to live.

2. No secrets or auth to steal

There are no API keys in the client, no accounts, no passwords and no payment flows. An attacker studying the shipped JavaScript finds game logic and styling โ€” nothing that unlocks anything else.

3. Transport and platform

Pages are served over HTTPS by the hosting platform. Responses carry X-Content-Type-Options, X-Frame-Options: DENY, a strict Referrer-Policy and a restrictive Permissions-Policy (see next.config.mjs), and the X-Powered-By header is disabled.

4. Supply chain

Dependencies are pinned in package-lock.json, the framework is kept on patched releases (Next.js 15.5.x security backports), and npm audit findings are triaged โ€” remaining advisories are build-time-only packages that never ship to browsers. Every change lands through reviewed pull requests with squash merges.

5. Local data safety

Game progress lives in same-origin localStorage, readable only by pages on this domain. The app never renders user input as HTML (the only inline scripts are our own structured-data JSON and a static theme snippet), keeping cross-site scripting with nothing to steal even if it occurred.

6. Responsible disclosure

Found something that looks wrong? Please report it privately first via GitHub issues so we can fix it before details circulate. We will acknowledge, patch, and credit reporters who give us a fair chance to respond.