Required dependencies
A FreeGameStore game has one required runtime dependency. Everything else is up to you — pick the engine, the language tooling, the testing stack.
Required
{ "dependencies": { "@freegamestore/games": "^0.13.0", "react": "^19", "react-dom": "^19" }}That’s it. Three lines.
@freegamestore/games— the SDK. Components, hooks, types. See Overview.react+react-dom— peers of the SDK. The SDK is React-only; if your game uses a different framework, you’d still need to mount a React tree for<GameShell>and the topbar.
Required (build-time)
In devDependencies from the scaffold:
{ "devDependencies": { "vite": "^6", "@vitejs/plugin-react": "^4.3", "vite-plugin-pwa": "^1.3", "typescript": "^5.7", "@types/react": "^19", "@types/react-dom": "^19" }}- Vite — the build tool. Outputs
web/dist/. - vite-plugin-pwa — generates
manifest.webmanifestandsw.js. The manifest is declared inline invite.config.ts, not as a static file. - TypeScript — the scaffold is TS by default. You can rip it out and use JS if you really want; the compliance suite doesn’t require TS.
Required (HTML, not npm)
In web/index.html:
<link rel="preconnect" href="https://fonts.googleapis.com" /><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /><link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Fraunces:opsz,wght@9..144,700;9..144,800&display=swap" rel="stylesheet"/>The brand fonts — Manrope (UI text) + Fraunces (display numbers). Loaded
via Google Fonts. The compliance check brand-fonts greps for these URLs.
Optional but common
| Package | Use |
|---|---|
kaplay | Game engine — 2D physics, sprites, scenes. |
@babylonjs/core | 3D engine. Triggers the 600 KB bundle budget. |
three | 3D engine. Also 600 KB. |
@react-three/fiber | React bindings for three. 600 KB. |
phaser | 2D engine. |
pixi.js | 2D WebGL renderer. |
The bundle size check (bundle-size) is the only thing that cares — if
you ship a 3D engine, you get 600 KB; otherwise you get 300 KB.
Forbidden
The compliance check no-tracking greps for these by name in the bundle.
Even if not declared in package.json, a transitive copy will fail:
@google-analytics/data/gtagposthog-jsmixpanel-browser@sentry/browserplausible-tracker- Anything that ships a tracking pixel to a third-party domain.
If you need error reporting in dev, use console.error. Production
telemetry isn’t allowed on the free side.
How dependencies upgrade
- The SDK bumps with the platform. Bump
@freegamestore/gamesinweb/package.jsonmanually, thenpnpm installto refresh the lockfile. Watch the changelog for what changed. Each minor bump can be breaking until 1.0. - React stays on 19 until the platform itself moves. Don’t unilaterally upgrade to React 20 — the SDK is built against 19.
- Vite / typescript / other dev tooling — your call. The compliance suite cares about your bundle, not your tooling.
Related
- SDK overview — what
@freegamestore/gamesexports. - PWA + offline rules —
vite-plugin-pwaconfig.