How We Built a Full Browser Game in Two Evenings with Claude
A story of angry clouds, Norse gods, and 15,000 lines of code written entirely by AI
The Idea
It started with a simple idea: what if you played as a storm cloud terrorizing a city?
That’s roughly what my son and I told Claude. No design document, no technical spec — just the concept. Claude took that idea and ran with it, producing a comprehensive game design: four weather attacks, fourteen pedestrian types with unique behaviors, a wave system, procedural audio, parallax city rendering — even a file structure for 21 JavaScript files.
I said “implement it.” And it did. All 21 files, in parallel.
The game is live at cloud-heavy-industries.com/grumbulus.
From Plan to Playable
Claude generated the entire codebase from the design it created — config, input, camera, city rendering, cloud character, pedestrian AI, collision detection, scoring, waves, power-ups, HUD, menus, particle effects, and a procedural music sequencer. All vanilla JavaScript, no frameworks, no external assets. Every pixel drawn on HTML5 Canvas, every sound synthesized via Web Audio API.
It also caught and fixed 18 integration bugs between the files before I even played it. The first time I saw the game, it worked — a cloud moved across a parallax city, rained on stick figures, and lightning struck with screen shake. Not polished, but playable.
The Play-Test Loop
This is where the real collaboration started. I played. I noticed things. Claude fixed them. Each cycle: 2-5 minutes.
“Time Warp slows ME too” — Cloud and projectiles switched to real-time while only the world slowed down.
“I don’t see any bosses” — They were in the design but never actually implemented. The wave system had a silent if (pedManager.spawnBoss) check that always returned false because the method didn’t exist.
“Storm upgrades are too cheap, I can buy everything” — We adjusted the economy five times before finding the right curve.
“Power-ups feel weak” — Storm Surge went from “rain refills 2x faster” to “unlimited rain, zero drain.” Tesla Coil went from “recharges lightning once” to “12 seconds of unlimited lightning.” The principle emerged: power-ups should feel powerful, not incremental.
This loop continued for two days. Dozens of cycles. The game grew not from a master plan but from playing and reacting.
Ideas That Changed the Game
“How about a rainbow that lures people out?”
I suggested a Rainbow power-up that attracts pedestrians. Claude built it — a colorful arc that lures 8-12 people from the edges of the world. When hit, they complain:
“The rainbow LIED!”
“Rainbow? More like PAIN-bow!”
“I didn’t sign up for Narnia!”
“Ball lightning goes into a building, people run out screaming”
This became a multi-phase entity: a glowing orb flies to the nearest building, enters through the door, windows flash with electricity, then panicked people burst out. Stack three and 9 buildings explode simultaneously.
“If you combine X + X + Y, a Nordic god should appear”
Thor descends from the sky with a winged helmet, red cape, Mjölnir, and a custom soundtrack. He smites 20 pedestrians with divine lightning from his hammer. It took six attempts to draw him correctly — he was invisible, then headless, then the hammer was behind him, then lightning came from his elbow. But when it finally worked, it was worth it.
“People should say funny things”
This transformed the game. Tourists say “Cheese! 📸” while taking photos. Scientists scream “I haven’t submitted my paper to arxiv yet!” Children shout “Puddles!!!” in the rain. Police yell “EVERYONE TAKE COVER!” Two pedestrians standing near each other will chat — “Nice weather today!” / “Is it though?”
“What about saving the game?”
What started as one save became four save slots, auto-saving every 10 seconds, with per-slot upgrades after we discovered shared upgrades confused players starting fresh games.
What Claude Invented
A lot of the game’s systems came from Claude expanding on simple requests:
I asked for “power-ups.” Claude designed 8 types and a 3-slot inventory system. Later we upgraded it to 12 types and 5-slot system, with custom-drawn icons, multiplicative stacking, and secret combinations.
I asked for “upgrades.” Claude built a 13-upgrade shop with storm points economy, wave-based attack unlocks, and localStorage persistence.
I asked for “more enemies.” Claude created police that chase you, military that shoots visible dodgeable bullets, scientists with shield domes, riot police with frontal hail blocking, and an Anti-Cloud boss that heals pedestrians and counters your fog.
I asked for “achievements.” Claude built 25 across 7 categories, later expanded to 35 including 10 secret ones with cryptic descriptions for the combo system.
I asked to “keep late-game interesting.” Claude added wave mutators (random modifiers every 5 waves), a bounty system with named targets, and building damage from tornados.
What I Directed
The creative vision came from playing and having opinions:
“This power-up is too weak” → led to the “unlimited everything” philosophy
“I want to hold power-ups for later” → led to the inventory system
“Rainbow complaints should have humor in them” → led to all the complaint dialogue
“Let people find the secret combos themselves” → led to cryptic achievement descriptions
“The music is too repetitive” → led to A/B pattern alternation and 7 distinct tracks
“I need to exit to the main menu” → led to the pause menu redesign
“My friend says achievements don’t unlock” → led to an audit that found 4 broken trackers
“The pause screen is too crowded” → led to the two-column layout redesign
“Frost and fog feel too weak” → led to frost shatter AoE (Area of Effect) and fog damage amplification
The Ghost Bugs
Some bugs hid for a long time:
15 dead flags. An audit found that 15 pedestrian behavior flags were defined in data but never checked in code. The VIP was supposed to spawn with bodyguards — the flag was right there, but no code read it. The encyclopedia faithfully described behaviors that didn’t exist.
0 storm points forever. The wave score was captured AFTER startIntermission() reset it to zero. Players earned points but got nothing to spend. Took a while to notice because the shop didn’t appear when you had 0 SP.
Aurora killed everyone. Aurora was supposed to mesmerize (freeze without damage), but shared the frozen state with Frost which dealt cold DPS. Every aurora activation slowly killed all pedestrians.
Thor was invisible. Drawn at world coordinates (0-4000) in screen space. He was there — just 3000 pixels off-screen to the left.
Technical Notes
~15,000 lines of vanilla JavaScript, 25 files, no frameworks
All procedural: every pixel drawn with Canvas API, every sound from Web Audio oscillators
Resolution-independent: virtual 1280×720, scales to any screen with HiDPI support
4 save slots with auto-save every 10 seconds
Hosted on Cloudflare Pages with PostHog analytics
0 build steps: open
index.htmland it works
By The Numbers
6 weather attacks unlocking progressively
24 pedestrian types including 4 bosses
12 power-ups with 5-slot inventory and multiplicative stacking
13 upgrades to improve your attacks
10 secret power-up combos (including Thor) — no spoiler, sorry.
35 achievements, 8 cloud cosmetics
7 procedural music tracks with dynamic intensity
8 wave mutators, bounty system, 4 special events
Pedestrian conversations, police shouts, aurora/rainbow/frost/fog complaints
Named multi-kills (DOUBLE DRENCH → APOCALYPSE WRATH)
Newspaper-style game over with dynamic headlines
There is a game encyclopedia as well.
Lessons Learned
On working with AI
We are living in a new world. The quality of AI coding agents has grown enormously in the last 3-6 months. And it keeps growing. I constantly experiment with different approaches, and I already have an expanding collection of cases when AI became my companion which tooks progressively more and more work on its own. The browser game is just a single example among many (e.g. enterprise software, a paper, ML experiments, etc), I will write about more cases if you are interested in it. Let me know.
Play early, play often. The game design doc was impressive on paper, but dozens of bugs and missing features only surfaced by actually playing. The play→feedback→fix loop was 10x more productive than trying to spec everything upfront.
Say what’s wrong, not how to fix it (unless you know exactly). “Frost feels too weak” was a better prompt than “increase frost damage by 20%.” The first led to shatter chains, area damage, and freeze combos. The second would have just bumped a number.
The AI forgets things. Every time we added a feature, something else needed updating — the encyclopedia, the achievement tracker, the collision descriptors, the save system. “Did we update the encyclopedia?” became our most frequent question. A checklist helps. I’ve also added it to CLAUDE.md, but it’s not always helpful, maybe I need to distill the file into a smaller set of rules (we know, it may help).
AI-generated code across many files will have integration bugs. When 21 files are generated by different agents in parallel, they’ll agree on the spirit of the API but disagree on the details — method names, return formats, property paths. An integration audit before testing saves pain (however, it was catched even before I first played).
Let it be creative. I said “add power-ups.” Claude came back with several types and an inventory system. Same with pedestrian types. Even if I had my own ideas, this definitely gave a boost to creativity.
On game design
Power-ups should feel powerful. “20% more damage” is forgettable. “Unlimited lightning for 12 seconds” makes you feel like a god. We buffed every power-up to be dramatic rather than incremental.
Data-driven designs need code audits. We defined 15 pedestrian behavior flags that were never checked anywhere. The data said riot police block hail. The code didn’t care. Every flag needs a corresponding check, verified together.
Balance is iteration, not math. Storm Points changed five times (and may change more). Frost damage changed three times. Cloud HP, enemy damage, upgrade costs — all tuned by playing, not by spreadsheets. The game tells you when something is wrong if you listen.
Personality makes the game. The moment pedestrians started talking (”I haven’t submitted my paper to arxiv yet!”, “This counts as cardio!”, “Rainbow of LIES!”), the game stopped being a score-chaser and became something people wanted to show friends.
Late game needs variety, not just difficulty. More HP and faster enemies get boring. Wave mutators (random modifiers), bounties (specific high-value targets), and boss variety (Anti-Cloud that counters your strategy) keep wave 30 feeling different from wave 20. And it’s still not the end of the story.
On deployment
Browser cache is your enemy during development. After deploying fixes, testers kept seeing the old version. Hard refresh (Ctrl+Shift+R) became standard advice.
Cloudflare Pages caches old files. Even after build.sh deleted markdown files, they were still served from CDN cache. We needed _redirects to catch them.
Analytics from day one. We added PostHog late. Would have been useful earlier to see where players actually die, which power-ups they collect, and whether anyone discovers the secret combos.
Try It
cloud-heavy-industries.com/grumbulus
Open it, pick a save slot, and become the storm.
This game was built collaboratively between a human and Claude. The human had the idea, played the game, and directed every creative decision. Claude designed the systems, wrote all the code, drew a Norse god (after 6 attempts), and kept forgetting to update the encyclopedia.











