#Troubleshooting

The problems that actually come up, and what to do about them. The build messages name the file and the problem, so read the whole thing before changing anything. (If an AI assistant is helping, paste it the full error rather than a summary.)

#Setup and access

"Repository not found" when cloning. You don't have access yet. Ask Anthony Kinson or Robert Syvarth to add your GitHub username to the repo, and accept the email invitation before trying again. See submitting your game.

npm isn't a recognised command. Node isn't installed, or the terminal was open before you installed it. Install the LTS build from nodejs.org and open a new terminal.

npm run build fails immediately at the root. Run npm install at the repo root first. The landing page and docs generator need it.

#Building

A manifest error names your game. The message says exactly what's wrong (bad slug, missing index.html, an achievement total over 1000). npm run validate re-runs just those checks, quickly.

"Achievement catalog is out of date". You edited an achievements.json but didn't regenerate the API's copy. Run npm run gen-achievements and commit the result. The Lambda can't read games/ at runtime, so that generated file is the API's only copy.

esbuild or rollup says it was "installed for another platform". This working tree was last used from a different OS. npm run build handles it for the SDK and for games: it stamps each node_modules with the platform that installed it and reinstalls when that changes. If you hit it inside a game's own npm run dev, delete that game's node_modules and npm install again.

Port 8002 is busy. Nothing to fix: npm run preview increments until it finds a free port and prints the URL it settled on.

#Your game doesn't run

Blank page, or images and scripts 404. Almost always absolute URLs. Your game is served from /games/<slug>/, so /main.js looks for a file at the site root that isn't there. Use main.js or ./art/ship.png. In Vite, base: "./" (the template sets this).

The game 404s in preview. build.outputDir in game.json doesn't match where your build actually writes, or there's no index.html at the top of it.

It isn't on the landing page. Check game.json: slug must equal the folder name, and status must be "live" ("hidden" deploys it but hides it from the list).

It worked, then broke after a rebuild. Something in the build now writes somewhere else, or a build step was added that CI can't run. The output must be plain static files with index.html at the top of outputDir.

#Arcade features

"Arcade is not defined". The SDK script didn't load. Two normal causes: the page was opened directly from disk instead of through npm run preview, or you're in a game's own Vite dev server, where /sdk/v1/arcade.js 404s. Both are expected, so keep the typeof Arcade !== "undefined" guard the templates ship with.

Calls throw ArcadeOfflineError. The API is unreachable (offline, or the preview server isn't running). This is by design: catch it and carry on. Leaderboards and achievements are never load-bearing for play.

Sign-in does nothing locally. Locally there's no Google. /api/auth/login mints a session immediately; add ?email=alice@gamesight.io to sign in as somebody else. That shortcut is dev-only and ignored in production. See player accounts.

An achievement unlocks but no popup appears. You're signed out (there's nobody to award it to, and unlock() returns null), you already had it (new: false, which is deliberate), or the game passed achievementToasts: false to Arcade.init. Server-granted unlocks need Arcade.achievements.watch().

Achievements granted from a backend module never show up. Same watch() call. Without it there's no poll, so nothing surfaces until the next page load.

#Working with an AI assistant

What you see Say this
Absolute URLs again "The game is served from a subfolder. Make every URL relative, not starting with /."
It built a login or a score server "Don't build that. Use Arcade.auth and Arcade.leaderboard from the SDK."
It edited files outside your game "Revert that. Only files under games/my-game/ may change."
It added npm packages to a vanilla game "No dependencies and no build step. Plain HTML, CSS and JavaScript in public/."

Absolute URLs and inventing a backend are by far the two most common. Point at the rule rather than explaining the fix; it's shorter and it sticks.

See also: local development · submitting your game

View docs/troubleshooting.md on GitHub ↗