Write the game
One folder. An index.html, a canvas, and your JavaScript.
Keep the whole thing under 16 MB. Load
the SDK before your own script:
<script src="/static/js/ng-sdk.js"></script>
Every title here is a plain browser game in a sandboxed
iframe. No engine, no build step, no backend. If it runs from a folder
with an index.html, it runs here.
One folder. An index.html, a canvas, and your JavaScript.
Keep the whole thing under 16 MB. Load
the SDK before your own script:
<script src="/static/js/ng-sdk.js"></script>
Four calls is the entire contract.
NG.ready() | assets are up; the loader may show PLAY |
NG.onStart(fn) | fires when the player presses PLAY |
NG.score(n) | optional; drives score-based triggers and the leaderboard |
NG.lose({score}) | run over — the shell takes it from here |
There is also NG.progress(loaded,total)
if you stream your own assets, and NG.win() if you are
feeling generous. You never need to know where the player is sent —
that is set per game and can change without touching your code.
Zip the folder, or drop in a single .js file and we will
wrap it in a canvas for you. Pick what ends the run — the player losing,
a timer, or a score — and where they land afterwards.
You do not have to read any of the above. There is a machine-readable
build spec at /build.md — point
your coding agent at it and it writes a working game.
Build the game described at nevergonna.lol/build.md — read the whole file first, then follow it exactly.
Sign in first and you get something better: a personalised spec at your own URL, carrying your title, theme colour, ending and a publish token. Your agent then uploads the finished game by itself — no zipping, no upload form, no coming back here. It lands as pending for review, and you can play it immediately.
Paste this into Claude Code or Codex. It produces a folder that drops straight into the uploader.
Build a single-folder browser game for nevergonna.lol, a satire site that hosts
fake "leaked" versions of famous games. The joke: the game is playable and
looks good, but it is rigged to end within about 30 seconds, and the site then
rickrolls the player. My game must NOT implement the rickroll itself - the
host page does that.
Deliver exactly this folder:
<slug>/
index.html canvas + <script src="/static/js/ng-sdk.js"> then game.js
game.js the whole game
Hard requirements:
- Vanilla JavaScript, Canvas 2D. No libraries, no build step, no imports, no
network requests, no external assets. Draw everything procedurally and
synthesise sound with the Web Audio API.
- Fixed internal resolution, scaled to fit with devicePixelRatio handling, so
it is sharp on any screen. Letterbox rather than stretch.
- Fixed-timestep update loop, decoupled from rendering, so it plays the same
on a 60 Hz and a 144 Hz display.
- Good-looking: parallax, particles, screen shake, glow, easing. Aim for
"polished arcade", not "programmer art".
- Keyboard controls, listed on the title card. Also accept touch if it's easy.
The host contract, in full:
NG.ready() call once when assets are built and you can render
NG.onStart(fn) fn runs when the player presses PLAY in the shell
NG.score(n) report the current score whenever it changes
NG.lose({score: n}) call the moment the run ends. Then STOP the loop
and leave the last frame on screen - the shell
fades its own panel over the top.
NG.win() only if winning is genuinely possible
The rig: play fair for the first ~12 seconds so it feels like a real game, then
escalate the difficulty until it is unwinnable. Make the escalation look like a
bug in a leaked build - a spawn rate that runs away, physics that stops being
reasonable - not like the game cheating. The player should lose within about
30 seconds and want one more go.
Theme: <describe your fake leaked game here, e.g. "Minecraft 2 nether update">
Write the two files in full, no placeholders and no TODOs.