Code Review Checklist
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
Build a complete, polished, production-quality browser game inside a single self-contained HTML file using only vanilla HTML, CSS and JavaScript — no frameworks, no libraries, no external assets.
$ npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install buildfastwithai/gen-ai-experiments html-game-generator --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/buildfastwithai/gen-ai-experiments.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/html-game-generator .claude/skills/html-game-generator && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "html-game-generator" agent skill from https://github.com/buildfastwithai/gen-ai-experiments/tree/main/skills/html-game-generator into .claude/skills/html-game-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "html-game-generator", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/buildfastwithai/gen-ai-experiments/tree/main/skills/html-game-generatorType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install buildfastwithai/gen-ai-experiments html-game-generator --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/buildfastwithai/gen-ai-experiments.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/html-game-generator .agents/skills/html-game-generator && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "html-game-generator" agent skill from https://github.com/buildfastwithai/gen-ai-experiments/tree/main/skills/html-game-generator into .agents/skills/html-game-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "html-game-generator", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install buildfastwithai/gen-ai-experiments html-game-generator --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/buildfastwithai/gen-ai-experiments.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/html-game-generator .cursor/skills/html-game-generator && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "html-game-generator" agent skill from https://github.com/buildfastwithai/gen-ai-experiments/tree/main/skills/html-game-generator into .cursor/skills/html-game-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "html-game-generator", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/buildfastwithai/gen-ai-experiments.git --path skills/html-game-generator--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install buildfastwithai/gen-ai-experiments html-game-generator --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/buildfastwithai/gen-ai-experiments.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/html-game-generator .gemini/skills/html-game-generator && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "html-game-generator" agent skill from https://github.com/buildfastwithai/gen-ai-experiments/tree/main/skills/html-game-generator into .gemini/skills/html-game-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "html-game-generator", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install buildfastwithai/gen-ai-experiments html-game-generatorInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/buildfastwithai/gen-ai-experiments.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/html-game-generator .github/skills/html-game-generator && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "html-game-generator" agent skill from https://github.com/buildfastwithai/gen-ai-experiments/tree/main/skills/html-game-generator into .github/skills/html-game-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "html-game-generator", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install buildfastwithai/gen-ai-experiments html-game-generator --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/buildfastwithai/gen-ai-experiments.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/html-game-generator .opencode/skills/html-game-generator && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "html-game-generator" agent skill from https://github.com/buildfastwithai/gen-ai-experiments/tree/main/skills/html-game-generator into .opencode/skills/html-game-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "html-game-generator", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
html-game-generatorBuild a complete, polished, production-quality browser game inside a single self-contained HTML file using only vanilla HTML, CSS and JavaScript — no frameworks, no libraries, no external assets.
HTML Game Generator is an agent skill from buildfastwithai/gen-ai-experiments. Build a complete, polished, production-quality browser game inside a single self-contained HTML file using only vanilla HTML, CSS and JavaScript — no frameworks, no libraries, no external assets. Use this skill whenever the user asks for a game, a playable demo, a prototype, an interactive toy, or anything "inspired by" an existing title — platformers, tower defense, RTS, racing, RPGs, physics games, city builders, simulations, card games, survival, idle/incremental, puzzle and arcade games all qualify. Trigger…
Its SKILL.md is about 8.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `references/audio-recipes.md`, `references/engine-patterns.md` and `references/genres.md`).
It sits in Development. It works with JavaScript. The repository describes itself as: Collection of Jupyter notebooks is designed to provide you with a comprehensive guide to various AI tools and technologies. The licence is MIT.
10 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 7b62043. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
HTML Game Generator loads about 8.5k tokens when it runs, and up to ~33k if it reads all its reference files. Until then it costs about 229 tokens; SKILL.md has 4,730 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from buildfastwithai/gen-ai-experiments at commit 7b62043, republished under its MIT licence (© buildfastwithai). 4,730 words, ~8,539 tokens.
.claude/skills/html-game-generator/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.Turn a game idea into one HTML file the user can double-click and play — finished, not prototyped.
The deliverable is a complete game: title screen, tutorial or control hints, core loop, difficulty progression, win/lose states, sound, particles, persistence, and a restart path. It runs offline from the filesystem with zero setup, zero build step, zero network requests, and zero dependencies.
The failure mode worth naming up front is the tech demo: a grey rectangle that moves, one enemy, no menu, no sound, // TODO: add more levels. That is not the deliverable. A user who asks for a tower defense game wants to play tower defense for twenty minutes, not to see that tower defense is possible. Every choice in this skill points at that difference.
The second failure mode is scope collapse under pressure — quietly dropping the third enemy type or the upgrade shop because the file was getting long. Length is not the constraint. If something has to give, simplify how things look, never what the player can do.
Determine which systems the game needs and build them. The request rarely names them; infer from the genre and the described experience.
Implementations for all of these live in references/engine-patterns.md. Read it before writing the engine layer of any non-trivial game.
These are hard requirements. Violating them means the deliverable doesn't work when the user opens it.
.html document containing everything. No companion .js, .css, .json, image or audio files.<script src="…">, no import from a URL, no CDN, no npm, no Google Fonts. Every algorithm is written by hand.<style>. In <head>. No external stylesheets.<script>. Before </body>. No external scripts, no ES module imports.file:// must work. No fetch, no XHR, no WebSocket, no analytics.Deliver the file, then a short note: what was built, the controls, and any deliberate simplifications. Not a tutorial on the code.
Fixed-timestep simulation, interpolated rendering. Physics and game logic step at a fixed rate (60 Hz, or 30 Hz for heavy simulations) with an accumulator; rendering happens once per requestAnimationFrame. This is what keeps a game from behaving differently on a 144 Hz monitor than on a 60 Hz one, and it makes collisions deterministic. Clamp the accumulator so a backgrounded tab doesn't produce a thousand catch-up steps.
One requestAnimationFrame loop. Never setInterval for gameplay. Never a second rAF loop. Pause the loop on visibilitychange and on the pause menu.
Canvas sizing. Size the backing store to cssWidth * devicePixelRatio, set the CSS size separately, and scale the context — otherwise everything is blurry on retina displays. Re-run on resize, debounced.
Input is state, not events. Event handlers write into an input object; the update step reads it. This makes controls remappable, makes touch and keyboard interchangeable, and prevents input from being processed at a different rate than simulation. Track both "is held" and "was pressed this frame".
Seeded RNG for anything procedural. A tiny mulberry32 means a run can be reproduced and a seed can be shown to the player.
Design for the failure cases. LocalStorage can throw in private mode. AudioContext starts suspended until a user gesture. The canvas can be zero-sized before layout settles. Handle all three; each one is a "the game doesn't work for me" report otherwise.
Everything lives in one file, which makes discipline more important, not less. Organise it so a reader can navigate by scrolling.
Order the <script> as: constants and config → utilities (math, RNG, easing) → audio → input → procedural art → entity classes → systems → world/level → UI → game state machine → boot. Separate each block with a banner comment.
Player, Enemy, Tower, ParticleSystem, Camera). Plain functions for transformations (aabb, lerp, easeOutCubic).CONFIG object at the top holding every tunable number: speeds, damages, costs, spawn rates, colours. Balance changes should happen in one place, and the user should be able to find it. Magic numbers scattered through the code are the main reason a generated game can't be modified afterward.enemySpawnInterval, not t2. applyKnockback, not doStuff.// separate the axes so a wall slide doesn't snag on tile seams earns its line. // increment i does not.drawRoundedRect, one spawnParticles, one playTone — used everywhere.const/let. 'use strict'; at the top.eval, no document.write, no inline onclick attributes. Attach listeners in script.Code correctness is not the same as the game being good. These decide whether the user keeps playing.
Playable in ten seconds. Menu → game with one click. Controls discoverable without reading. If a mechanic needs explanation, teach it in the first encounter rather than in a wall of text.
A loop with tension and release. Something threatens, the player responds, the player is rewarded, the threat escalates. Even a puzzle game needs this rhythm.
Difficulty ramps, not walls. Start below the player's ability and climb past it. Prefer curves (spawnRate = base * pow(1.04, minute)) over hand-authored tables, and make the curve a CONFIG value.
Meaningful choices. Two upgrades that both say "+10% damage" are one upgrade. Options should trade off against each other.
Immediate, legible feedback. Every input produces a visible and audible reaction within one frame. Every hit registers. Every currency change animates. Silence and stillness read as "broken".
Fail forward. Death shows a score, a stat summary, what killed you, and a one-key restart. Never a dead end.
Respect the player's time. No unskippable animations, no mandatory waiting, no losing progress to a misclick.
Target 60 fps on a mid-range laptop and a three-year-old phone. Test the worst case — the moment with the most entities on screen — not the calm opening.
.map/.filter/.slice per frame, no string building in hot paths. Reuse scratch vectors.save/restore when a plain translate suffices; avoid shadowBlur in hot loops (it is very expensive) — fake glow with a pre-rendered radial gradient sprite.The UI is what separates "a demo" from "a game". Build it in DOM/CSS layered over the canvas — it's easier to make responsive and accessible than canvas-drawn text.
Required screens: title (play, options, how-to-play, and a visible high score if scores exist), the in-game HUD, pause, and game-over/victory. Options should at minimum expose master/SFX/music volume and a reduced-motion toggle.
Visual design: commit to a coherent palette (4–6 colours plus neutrals) and use it consistently. Use a real type hierarchy. Rounded corners, soft shadows and a clear accent colour carry a lot. Avoid pure #000/#FFF in favour of near-black and off-white. Keep a consistent margin scale.
HUD rules: show only what the player acts on. Anchor it to screen edges, never over the centre of the play area. Animate value changes (count up, flash, scale-pop) rather than snapping. Health and resource bars need instant damage feedback plus a delayed "ghost" bar behind.
Feedback and affordance: hover and active states on every clickable element, a cursor change, a click sound. Disabled buttons look disabled and explain why on hover.
Accessibility: keyboard-navigable menus with visible focus rings. Text at least 14px with real contrast. Never encode critical information in colour alone — pair it with a shape or a label. Honour prefers-reduced-motion by cutting screen shake and flashes. Always provide a pause key.
Animation is game feel. A game with identical mechanics feels twice as good with it.
easeOutCubic for arrivals, easeOutBack for pops, easeInOutQuad for camera moves.All audio is synthesised at runtime with the Web Audio API. Working recipes are in references/audio-recipes.md.
AudioContext lazily and resume it on the first user gesture. Browsers block autoplay; a game that boots silently and never recovers is the most common audio bug.gain.gain.exponentialRampToValueAtTime — and never ramp to exactly 0, use 0.0001.ctx.currentTime — never setInterval. Adapt intensity to game state by adding a percussion layer when danger rises.Assume a phone will open this. Design for it rather than adding it at the end.
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, user-scalable=no">touch-action: none on the play surface plus preventDefault on touch handlers to stop scroll, pull-to-refresh and double-tap zoom. user-select: none to stop text selection during drags.dvh units, not vh, so mobile browser chrome doesn't crop the layout. Respect env(safe-area-inset-*) for notches.One file, but structured as if it were many.
CONFIG all tunable values
Utils clamp, lerp, rand, seeded RNG, easing, AABB, vector helpers
Audio AudioContext, buses, synth voices, music scheduler
Input keyboard/mouse/touch → normalised state object
Art procedural sprite and tile generation into offscreen canvases
Entities Player, Enemy, Projectile, Tower, Item… (classes)
Systems Physics, Collision, AI, Spawner, Particles, Camera, Save
World level/grid/map, generation, queries
UI screens, HUD, menus, tooltips, notifications
Game state machine: BOOT → MENU → PLAY ⇄ PAUSE → GAMEOVER
boot() wire it together, start the loopExplicit game state machine. A single state variable with an enum, and update/render dispatching on it. Ad-hoc booleans (isPaused, isMenu, isDead) always end up in contradictory combinations.
Entities own their data and behaviour; systems own the relationships. A Bullet knows its velocity and how to draw itself; the collision system knows what bullets hit. For games with many entity types and shared behaviour — survivors-likes, simulations — a light component approach (plain objects with optional fields, systems iterating over arrays) scales better than deep inheritance. Never build more than two levels of class hierarchy.
Events over polling for rare things. A tiny pub/sub (on, emit) decouples "enemy died" from the six systems that care: score, particles, audio, quests, drops, achievements.
All persistence through one save module with a schema version, so a later change doesn't corrupt an existing save. Wrap reads and writes in try/catch and fall back to defaults.
Read the request, identify the genre, and build the systems that genre actually requires. references/genres.md carries a full playbook per genre — required systems, the core loop, the balance levers, and the pitfalls. Consult the matching entry before planning the architecture.
The short version:
| Genre | Non-negotiable systems |
|---|---|
| Platformer | Tile collision (axes resolved separately), coyote time, jump buffering, variable jump height, camera look-ahead, hazards, checkpoints |
| Tower defense | Path or flow field, wave scheduler, placement grid, targeting priorities, projectile lead, economy, upgrade and sell |
| RTS / lane battler | Unit selection or card deploy, pathfinding with local avoidance, formations, resource income, opponent AI with a build order |
| Racing | Track spline or tiles, throttle-brake-steer with grip and drift, lap and checkpoint validation, rival AI on racing lines, minimap |
| RPG | Stats and levels, turn-based or action combat, inventory and equipment, dialogue, quests, world map, saves |
| Physics | Verlet or impulse solver, restitution and friction, destructible structures, aiming with trajectory preview, stable resting contacts |
| City builder / management | Tile grid, placement validity, resource flow simulation, supply and demand, population, budget, tick-based updates |
| Simulation | Agent needs and schedules, time of day and calendar, growth and decay processes, emergent interaction, speed controls |
| Card game | Deck/hand/discard zones, shuffle, mana or cost curve, targeting, an effect resolution queue, opponent AI |
| Survival | Hunger/thirst/stamina/temperature, day-night cycle, gathering, crafting, base building, escalating threat |
| Idle / incremental | Big-number formatting, generators and multipliers, offline progress from timestamps, prestige, unlock cadence |
| Puzzle | Grid state, match or validity rules, cascade resolution, undo, level definitions or generation with guaranteed solvability |
| Arcade | Tight controls, score with multiplier, escalating spawn rate, high-score persistence, sub-second restart |
| Roguelike / survivors-like | Procedural waves, an upgrade draft on level-up, run-scoped progression, meta-progression, thousands of pooled entities |
When a request spans genres ("a farming RPG with tower defense at night"), build the union of the systems and let the state machine switch between modes.
When the user names an existing title, take only the mechanics — the systems, the loop, the feel. Everything expressive must be original: name, characters, art, story, music, and specific named content.
Mechanics are not protectable; expression is. So: no copyrighted character names or likenesses, no logos, no trademarked titles, no recreated level layouts, no lifted music. Give the game its own name and its own world. This is both a legal requirement and better work — an original skin on a proven loop is a game, while a knock-off is a knock-off.
Say what you did in one line: "Deck-based lane battler in the spirit of the genre, with an original setting and roster."
Walk this before responding. Anything unchecked is unfinished work.
Boots and runs
file:// with no console errors and no network requestsComplete
Feels good
Robust
Mobile
When the request is huge — an MMO, an open-world RPG, a full 4X — build the complete core loop at reduced content scale, and cut in this order: (1) visual fidelity, (2) content volume, (3) breadth of systems, (4) core mechanics. Cutting from the bottom of that list is what turns a game into a demo. Ten enemy types can become four; the combat system cannot become "click to win". State plainly what was scaled and what a next pass would add.
When the request is vague — "make me a game" — pick something with a strong loop, build it fully, and offer directions afterward. Never respond with a questionnaire; a finished game the user redirects beats a clarifying question every time.
When something is genuinely impossible in a single offline HTML file — real multiplayer, cloud saves, licensed assets, AAA-fidelity 3D — say so directly, then ship the closest real thing: local hot-seat or AI opponents instead of netplay, LocalStorage instead of cloud, original procedural art instead of licensed assets.
When the file gets long: that is expected. A complete game is 1500–4000 lines. Do not compress by deleting features, merging unrelated logic, or stripping comments. Write it in order and finish it.
When a mechanic proves unstable — jittery stacked physics, pathfinding that snags on corners — fix the algorithm rather than hiding the symptom. Substepping, position correction and proper broad-phase are all in references/engine-patterns.md.
Work through these ten steps in order. Steps 1–4 are planning and should be brief and internal; the user wants a game, not a design document.
1 · Analyse the request. Identify genre, core fantasy ("I want to feel powerful / clever / in control"), session length, target platform, and any named inspiration. Fix the win and lose conditions now — an unclear ending produces a game that just stops. Decide the art direction: palette, shape language, mood.
2 · Decompose into systems. List every system the game needs — rendering, input, physics, AI, spawning, economy, UI, audio, particles, save. Mark each as core (the game is meaningless without it) or supporting. Note the dependencies — pathfinding needs the grid, combat needs collision — and build in dependency order.
3 · Plan the architecture. Choose the entity model (classes vs. component-ish objects), the update order (input → AI → physics → collision → resolution → effects → camera → render), the data structures (spatial hash? flow field? tile array?), and the save schema. Write the CONFIG block first — it forces you to decide the actual numbers before code depends on them.
4 · Design the UI. Sketch each screen and the HUD: what's shown, where it's anchored, how it responds. Decide the control scheme for keyboard, mouse and touch simultaneously so touch isn't retrofitted. Choose the palette and typography once, then apply them everywhere.
5 · Build the rendering foundation. Canvas setup with DPR scaling and resize handling, the fixed-timestep loop, the camera, layering, and the procedural art generation that produces sprites and tiles into offscreen canvases. Get a static scene drawing correctly on desktop and mobile before adding any behaviour — every later bug is easier to find when rendering is known-good.
6 · Implement core mechanics. The player first: movement, controls, and the primary verb (jump, shoot, place, drag, harvest). Tune it until it feels good in isolation — this is the single highest-leverage tuning in the project. Then the world it interacts with, then the primary opposition, then the loop that ties them together, then progression, economy and win/lose.
7 · Add AI. Give opponents state machines with clearly separable behaviours and visible telegraphs. Add pathfinding where units navigate. Tune aggression, reaction delay and accuracy as CONFIG values, and make sure they scale with difficulty. Good AI is readable — the player should be able to predict it well enough to outplay it. Perfect AI is not fun.
8 · Add effects and juice. Particles on every impact, spawn, death and pickup. Hit-stop and screen shake on significant hits. Damage numbers. Squash-and-stretch. Trails. Screen transitions. Then a full audio pass: every action gets a sound, then music, then the mix. This step is what people mean when they say a game feels "finished"; it is not optional decoration.
9 · Optimise. Pool the transient objects. Add the spatial hash if entity counts warrant it. Cache static layers. Cull off-screen work. Remove per-frame allocation. Then simulate the worst case — maximum entities, maximum particles — and confirm the frame budget holds. Add automatic degradation if it doesn't.
10 · Verify before responding. Trace the whole thing as a player would, honestly:
TODO, no empty handler, no undefined variable, no function defined twice, no reference to a sprite, sound or level that was never created.If any check fails, fix it before responding. Shipping a broken game costs the user far more than the extra minutes cost you.
"Create a Clash Royale-inspired game." Real-time lane battler. Original setting — say, rival clockwork guilds — with an original card roster. Systems: elixir regeneration on a timer, an 8-card deck with a 4-card hand and a next-card queue, drag-to-deploy restricted to the player's half, two lanes plus a bridge, unit steering with local avoidance, target acquisition priorities (buildings vs. troops vs. air), three towers per side, a match timer with double-elixir overtime, and an opponent AI that banks elixir, counters recent deployments and pushes when ahead. Cards get distinct roles — swarm, tank, ranged, splash, spell — so counterplay exists. UI: deck bar with cost badges and cooldown fills, elixir bar, tower health, timer, victory/defeat with a crown count. Touch: drag a card onto the field with a valid-placement highlight.
"Create an Angry Birds-inspired physics game." Slingshot puzzle with original characters and a distinct art direction. Systems: impulse-based rigid body physics with circles and boxes, restitution and friction, stable resting contacts via position correction and sleeping, destructible structures with per-material health (wood, stone and glass with different thresholds and debris), drag-to-aim with a dotted trajectory preview, projectile variants with a mid-flight ability (split, drop, dash), 12+ hand-designed levels of increasing complexity, three-star scoring on remaining ammo and structural damage, and a camera that follows the shot then pans back to the launch point. Effects: debris particles, dust on impact, splintering, chunky impact sounds. LocalStorage stores stars and unlocked levels.
"Create a Vampire Survivors-style roguelike." Auto-attacking survival arena. Systems: WASD or joystick movement with weapons that fire automatically on their own cooldowns, endless scaling waves driven by a time-based spawn curve, 8+ enemy types with distinct movement (chaser, swarmer, charger, ranged, splitter, elite), XP gems that drop and magnet toward the player, a level-up draft of three upgrades from weapons and passives with evolution combos, thousands of entities handled with pooling plus a spatial hash, a 30-minute run structure with a boss, and meta-progression currency that persists between runs. This genre lives or dies on the power fantasy — the screen should be full of numbers and effects by minute 15 — so the particle system, damage numbers and cap-aware degradation matter more here than usual.
"Create a Stardew Valley-inspired farming game." Cozy farming sim with an original valley, villagers and crops. Systems: a tile-based farm grid with till/plant/water/harvest states, a crop growth model driven by day ticks and watering, a day-night cycle with a stamina budget that ends the day, seasons that gate which crops grow, an inventory with stacking and a hotbar, a shop economy with buy and sell prices, NPCs with schedules and friendship-gated dialogue, tool upgrades, and a save system that writes on sleep. Art: warm palette, procedurally drawn tiles with per-tile variation so the farm doesn't look tiled. The loop is plan → act within stamina → sleep → see growth, so the end-of-day summary screen carries a lot of the satisfaction.
"Create a Project Zomboid-style survival game." Top-down survival with an original setting. Systems: a procedurally generated town of buildings with interiors and lootable containers, needs simulation (hunger, thirst, fatigue, health, infection risk), an inventory with weight limits and equipment slots, melee and ranged combat with stamina cost and durability, enemy AI driven by sound and sight with a horde attraction system so noise genuinely matters, a day-night cycle with reduced visibility, base fortification with barricades and doors, crafting from scavenged parts, skill progression through use, and permadeath with a run summary. Tension here comes from information scarcity — a limited vision cone and audio cues for off-screen threats do more than any amount of gore.
© buildfastwithai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (references) in skills/html-game-generator of buildfastwithai/gen-ai-experiments.
Open the folder on GitHubat commit 7b62043
HTML Game Generator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| HTML Game Generator this skillbuildfastwithai/gen-ai-experiments | 785 | — | ~8.5k | Automated safety check: Pass | MIT | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 5 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.3k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| @pierre/diffs Code Renderingpierrecomputer/pierre | 6.2k | 2 repos | ~803 | Automated safety check: Pass | Apache-2.0 | |
| Generate Release Notesteambit/bit | 18k | — | ~2.2k | Automated safety check: Pass | Custom licence | |
| Pnpm Engineteambit/bit | 18k | — | ~1.9k | Automated safety check: Pass | Custom licence |
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
pierrecomputer/pierre
Guides an agent through using @pierre/diffs to render syntax-highlighted files and diffs, and to build editing and review surfaces in React or plain JavaScript.
teambit/bit
Generate comprehensive release notes for Bit from git commits and pull requests.
teambit/bit
Work on the pnpm Rust engine (@pnpm/napi, the pacquet crates) that bit install runs through.
TryGhost/Ghost
Moves a legacy internal Ghost package from JavaScript and CommonJS to TypeScript and ESM in three focused commits that keep git file history intact.
buildfastwithai/gen-ai-experiments
Builds a single self-contained HTML landing page from a template with copy frameworks, four themes and SEO meta, then runs bundled audit scripts for conversion and speed.
buildfastwithai/gen-ai-experiments
Builds a realtime voice-chat app around a talking character portrait made from your photo or a text description, with mouth sprites driven by the audio.
buildfastwithai/gen-ai-experiments
Audits a startup, app or landing page from a URL, localhost, repository, screenshots or copy, then gives a launch-readiness verdict, prioritized fixes and an HTML report.
buildfastwithai/gen-ai-experiments
Turn a startup, SaaS, app, developer tool, website, repository, or product idea into an evidence-backed business plan, monetization strategy, pricing architecture, editable 12-month financial model…
buildfastwithai/gen-ai-experiments
Creates a QUICKSTART, doctor scripts and a documented .env.example for an unfamiliar repo from facts scanned in the repo, and audits how easy it is to onboard.
buildfastwithai/gen-ai-experiments
Measures how well a Python pytest suite catches behavior changes through diff-scoped mutation testing, then proposes and verifies tests for surviving mutants.
Works with
Categories
Build a complete, polished, production-quality browser game inside a single self-contained HTML file using only vanilla HTML, CSS and JavaScript — no frameworks, no libraries, no external assets. HTML Game Generator is an agent skill from buildfastwithai/gen-ai-experiments. Build a complete, polished, production-quality browser game inside a single self-contained HTML file using only vanilla HTML, CSS and JavaScript — no frameworks, no libraries, no external assets.
HTML Game Generator fits situations like: the user asks for a game; A playable demo; an interactive toy; anything inspired by an existing title — platformers.
Run `npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a claude-code`. Or copy the skill folder (skills/html-game-generator in buildfastwithai/gen-ai-experiments) into .claude/skills/html-game-generator in your project. Claude Code loads it when a task matches its description.
Run `npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a codex`. Or copy the skill folder (skills/html-game-generator in buildfastwithai/gen-ai-experiments) into .agents/skills/html-game-generator in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add buildfastwithai/gen-ai-experiments --skill html-game-generator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/html-game-generator, .gemini/skills/html-game-generator, .github/skills/html-game-generator and .opencode/skills/html-game-generator in your project.
SKILL.md names no scripts, command-line tools or credentials: HTML Game Generator is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
HTML Game Generator is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.5k tokens (SKILL.md is roughly 34k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 25k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with HTML Game Generator: Code Review Checklist (shareAI-lab/learn-claude-code, 78k stars), Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.3k stars), @pierre/diffs Code Rendering (pierrecomputer/pierre, 6.2k stars) and Generate Release Notes (teambit/bit, 18k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
buildfastwithai (a GitHub organization) maintains it in buildfastwithai/gen-ai-experiments, which has 785 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on September 22, 2026.
Source: buildfastwithai/gen-ai-experiments on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.