HappyDEV
Fifteen tiny arcade games with a coding theme that run inside VS Code, each with 4 difficulty levels and an optional online leaderboard with a global ranking.
HappyDEV can also open by itself while Claude Code or Codex works on your prompt and close when the agent is done.
| Game |
Inspired by |
In short |
| 🐤 Flappy Code |
Flappy Bird |
Fly the debugging rubber duck between { } code blocks |
| ▶ Deploy Dash |
Geometry Dash |
The terminal cube >_ runs a CI pipeline full of bugs, race conditions, npm i, debug orbs and sudo portals |
| ∿ Sine Glide |
Tiny Wings |
A tiny bit slides over sine-wave hills: build up speed and fly before the deadline |
| ☰ Stack Overflow |
Stack |
Stack lines of code: whatever hangs over gets cut off |
| 🐍 snake_case |
Snake |
A snake made of the letters snake_case eats bugs and coffee |
| ● Bug Sweeper |
Minesweeper |
Review the code without hitting a bug: numbers count the bugs around, mark them with a breakpoint ● |
| ⇡ Crossy Commit |
Crossy Road |
Hop a git commit across lanes of HTTP requests, ride the console.log()s down the log stream and dodge the deploy train, before the deadline catches you |
| 🐞 Bug Invaders |
Space Invaders |
A text cursor shoots ; at waves of bugs before they reach production, behind shields of test coverage |
| ⎇ Git Jump |
Doodle Jump |
Bounce a git commit up the branches: rebase moves, stash pops, legacy breaks, npm i launches you, and bugs get squashed from above |
| ☕ Jetpack Java |
Jetpack Joyride |
A coffee mug with a jetpack flies through the server room, dodging firewalls, P1 alerts and rm -rf / beams |
| 🪓 Refactor Jack |
Timberman |
A lumberjack chops a legacy monolith one line at a time: dodge the nested callbacks before the sprint runs out |
| 🥷 NinJS |
Ninjump |
A ninja wall-jumps up the split view, between merge conflicts, crawling bugs and throw shurikens |
| 🏄 Branch Surfers |
Subway Surfers |
A git commit surfs up three branches: switch branch to dodge the deploy trains, jump the merge conflicts, roll under the failing builds, and don't let the code reviewer catch you |
| ✂ Bug Slicer |
Fruit Ninja |
Slice the bugs, exceptions and warnings tossed over the editor before they fall into production. Never slice rm -rf / |
| 🗑 Ticket Toss |
Paper Toss |
Crumple Jira tickets and throw them into /dev/null, while the product manager's fan blows them off course |
- Lightweight: a few JavaScript files, no dependencies and no image assets. Everything is drawn in code.
- Opens in an editor tab, next to your code.
- High scores are saved per game and per level, and survive restarts.
- Optional world leaderboard with a public nickname, a global ranking across every game and level, and a live count of who's playing right now.
1. Install
From the Marketplace: open the Extensions view (Ctrl+Shift+X), search for HappyDEV and click Install.
From a .vsix file: in the Extensions view click ··· → Install from VSIX... and choose happydev-2.8.0.vsix. From a terminal:
code --install-extension happydev-2.8.0.vsix
When it's installed, 🎮 HappyDEV appears in the status bar (bottom right).
Upgrading from the old Flappy Code build? Uninstall it first (Extensions view → Flappy Code → ⚙ → Uninstall). HappyDEV replaces it.
2. Start playing
| How |
What to do |
| 🖱️ Status bar |
Click 🎮 HappyDEV (bottom right) |
| ⌨️ Shortcut |
Ctrl+Alt+F (Cmd+Alt+F on macOS) |
| 🔎 Command Palette |
Ctrl+Shift+P → HappyDEV: Play |
The games open in a tab beside your code and show the menu:
- The games are laid out in a grid that fills the tab: three per row in a tall tab, up to five in a wide one. The arrow keys (or the mouse) pick a game,
Space (or Enter) starts it. You can also click a game or press the number row: 1–9, 0, - and = for the first twelve.
Tab (Shift+Tab backwards) or a click on the level bar at the top picks the level (it applies to every game):
| Level |
What it's like |
| 🟢 Junior |
slower, with more room for mistakes: good for learning |
| 🟡 Senior |
the standard challenge |
| 🔴 10x Dev |
fast, tight, with extra obstacles |
| 🟣 Ultracode |
a swarm of agents ships at machine speed: everything at once, as fast and as tight as it gets |
- Press
M during a game to go back to the menu.
- The menu remembers the last game and level you played.
3. 🤖 Play while your AI agent works
HappyDEV can open by itself when you send a prompt to Claude Code or Codex and close by itself when the agent is done.
Codex
Nothing to set up. HappyDEV notices when a Codex turn starts and ends (CLI or IDE extension) and opens/closes the games.
It works the same way as with Claude Code (see How it works below), and it also closes when you interrupt Codex.
How: Codex logs every session to ~/.codex/sessions/. HappyDEV only reads the turn start/end events of new sessions in those files, never the content of your conversations. Turn it off with the happydev.codex setting.
Claude Code: connect (once)
- The first time HappyDEV starts, a notification asks:
"Open the games automatically while Claude Code works on your prompt?" → click Yes, connect.
Missed it?
Ctrl+Shift+P → HappyDEV: Connect to Claude Code.
- Close and reopen the Claude Code chat (or reload the window:
Ctrl+Shift+P → Developer: Reload Window).
Claude Code only picks up the new setting in a new session.
How it works
- Type a prompt in Claude Code or Codex and send it.
- 🎮 HappyDEV opens in a separate tab, in a column beside the current one, so your code and the agent's chat stay visible.
- Play! (Click the game if the keys don't respond.)
- ✅ When the agent finishes answering, the game tab closes by itself and the status bar shows "Claude is done: back to work!" (or "Codex is done").
If you're in the middle of a run, it isn't cut short: a banner says the agent is done, and the tab closes a moment after the run ends.
Good to know:
- If the agent asks for a permission (e.g. "can I run this command?"), the question shows up in its chat: answer it there, then go back to the game.
- If you interrupt Claude with
Esc, the game stays open: close it with the tab's ✕. (With Codex it closes by itself.)
- With several agent chats, the game closes when all of them are done.
- If you opened the game (status bar, shortcut or command), it never closes by itself, even if an agent is working.
- With several VS Code windows, the game only opens in the window of the project the agent is working on.
Turn it off
- For a while: Settings (
Ctrl+,) → search HappyDEV → untick Auto Start.
- Only for Codex: untick Codex in the same settings.
- Claude Code hooks:
Ctrl+Shift+P → HappyDEV: Disconnect from Claude Code.
What "connect" does: it adds three hooks (UserPromptSubmit, Stop, SessionEnd) to ~/.claude/settings.json.
Each hook writes a tiny event file into ~/.claude/happydev/, which the extension watches. Your other hooks are left untouched.
Event files are deleted after a minute. The hook is a POSIX shell command, so on Windows it needs Git Bash (Claude Code already requires it there).
4. 🌍 Online leaderboard
The menu shows how many developers are online and how many are playing each game, plus the world #1 of every game.
Click 🏆 Boards in the menu (or press L) to open the world top 10 of the selected game and level (↑↓ game, ←→ level).
🌍 Global ranking
Click 🌍 Global (or press G) for the global ranking: one standing for every player across all games and levels.
- Every board (a game at a level) is worth up to 1000 points, in proportion to how close your best is to the world record of that board:
points = 1000 × your best ÷ world record: hold the record and you get the full 1000.
- Then it's multiplied by the weight of the level: Junior ×1, Senior ×2, 10x Dev ×3, Ultracode ×4.
A world record on Ultracode is worth 4000 points, one on Junior 1000.
- Your total is the sum over every board you have an online score on, so it pays to play every game, and to play them hard.
- ★ FULL STACK: hold the world record on every level of the same game (Junior, Senior, 10x Dev and Ultracode), each at least at par,
and you get +2000 bonus points for that game, and a glowing neon FULL STACK badge next to your name in the global ranking.
- So that an empty board doesn't give away full points, every board has a par score (a very good score for that game and level):
the record counts as at least the par.
Because the points compare you with the record, the scale of each game doesn't matter: 60 in Flappy Code and 3000 in Bug Invaders
can be worth the same. The menu shows your global rank; the ranking is refreshed every 30 seconds.
The leaderboard is opt-in. To join:
- Open the leaderboard and press
J (or click join with a nickname), or run Ctrl+Shift+P → HappyDEV: Join Online Leaderboard.
- Pick a public nickname (2–16 characters).
- From now on, every run that beats your online best is sent. The game-over card shows your world rank.
High scores made before joining stay local: the server only accepts runs it has seen start (see Fair play).
Nicknames are unique (ignoring upper/lower case): if another player already uses yours, HappyDEV says so and asks for another one.
Privacy: you are identified by a random id created by the extension, and a secret key kept in VS Code's secret storage
proves to the server that the calls come from you (the server stores only a hash of it). Only your nickname and your high scores are public.
While the games tab is visible and you have joined, the extension sends a heartbeat once a minute so you count as online
(every 30 s during a game).
If you haven't joined, HappyDEV only downloads the public leaderboard and never sends anything about you.
HappyDEV: Leave Online Leaderboard stops all sending and deletes your scores from the server.
The server also keeps a truncated hash of your IP address for up to a day, only to rate-limit abuse.
Fair play: when a game starts, the server opens a single-use run. A score is accepted only with its run,
only if the run was kept alive by the heartbeats while you played, and only if it could really have been made in the time since
the run started (every game has a top speed in points per second).
The server settings can only be changed in your user settings, never by a workspace's .vscode/settings.json, and only https servers are used.
5. How to play
Most games use one button: Space (or ↑, W, or a mouse click). snake_case uses the arrow keys, Bug Sweeper the mouse (or the arrow keys), Crossy Commit the arrow keys, Bug Invaders the arrow keys (or the mouse) plus Space, Git Jump the arrow keys (or the mouse), Jetpack Java holds Space (or the mouse button), Refactor Jack the arrow keys (or a click on either side), Branch Surfers the arrow keys (or swipes with the mouse), Bug Slicer and Ticket Toss the mouse (Ticket Toss also the arrow keys plus Space).
| Key |
Action (same in every game) |
Space / ↑ / W / click |
The game's action (see below) |
P or Esc |
Pause / resume |
R |
Restart |
M |
Back to the menu |
🐤 Flappy Code
- Every press makes the duck flap and rise a bit. Then it falls again.
- Fly through the gap between a
} block at the top and a { block at the bottom: +1 point.
- Touch a block or the floor and it's "Uncaught Bug!".
| Junior |
Senior |
10x Dev |
Ultracode |
| wide gaps, slow |
normal; after 10 points the blocks move up and down |
narrow gaps, fast, blocks always moving |
narrowest gaps, fastest, blocks swinging wide |
💡 Small, regular taps. Don't mash.
▶ Deploy Dash
The cube runs by itself through a CI/CD pipeline: lint › test › build › deploy. Then it starts over as v2, v3… and gets faster every time.
Progress is shown at the top, like a deploy.yml file. Press Space to jump. Hold it to jump again as soon as you land.
| Element |
What it does |
From stage |
| 🔺 bug (red spike) |
touching it = crash |
lint |
| ⬛ code block |
you can land and run on top of it; hitting its side (or its bottom) = crash |
lint |
| ⚙ race condition (saw) |
touching it = crash |
test |
🟡 npm i (yellow pad) |
launches you with a super jump over tall walls |
test |
| ◎ debug (yellow ring) |
press while you're inside it to jump in mid-air |
build |
| ▯ low corridor |
you can't jump under it: time your way in and out |
build |
🟣 sudo (portal) |
flips gravity: you run on the ceiling! The green portal brings you back down |
deploy |
When you crash you get "Build Failed!" with a random error message. ATTEMPT counts your tries.
| Junior |
Senior |
10x Dev |
Ultracode |
| slower, more space between obstacles, long stages |
normal |
very fast, obstacles close together, short stages (you reach sudo sooner) |
fastest track, shortest breathers between chunks |
💡 Jump just before an obstacle. Hold the button while passing through a ◎ debug ring.
Every track is random, but it's always possible to beat: an automated solver checks the track generator.
∿ Sine Glide
- The bit slides over the hills by itself. Hold to get heavy and dive, let go to get light again.
- That's the trick: hold on the way down to build up speed and let go on the way up to take off from the top of the hill.
- Land along a downslope and you get "Perfect!" plus extra seconds. Land against an uphill ("Ouch!") and you slow down.
- The deadline bar at the top runs down while the sky gets dark. At zero it's "Deadline!".
| Junior |
Senior |
10x Dev |
Ultracode |
| 55 s, +3 s per perfect landing |
40 s, +2 s |
32 s, +1.5 s, steeper hills, stricter landings and ▲ bugs on hilltops (-3 s) |
the tightest deadline, more hills and bugs |
💡 While flying, hold as soon as you start to come down: you land sooner and more in line with the slope.
☰ Stack Overflow
- A line of code slides back and forth above the stack: press
Space to drop it.
- Whatever hangs over is cut off and falls, so the stack gets narrower and narrower.
- Drop it perfectly aligned and you lose nothing. 3 perfect drops in a row make the row wider again.
- Miss completely and it's "Stack Overflow!". Your score is the number of rows.
| Junior |
Senior |
10x Dev |
Ultracode |
| slow, rows always come from the left, easy "perfect" |
rows come from both sides |
very fast, "perfect" only to the pixel |
fastest lines, smallest perfect window, tiny rewards |
💡 Watch the dashed outline: it shows where the row should go.
🐍 snake_case
- Steer with the arrow keys (or
WASD). You can also click the board: the snake turns towards that point.
- Eat bugs 🐞 (+1) to grow. Coffee ☕ is worth +5, but it disappears after a few seconds.
- Don't bite your own tail ("Infinite recursion"). The more you eat, the faster you go.
| Junior |
Senior |
10x Dev |
Ultracode |
| slow, the edges wrap around |
the edges are deadly |
very fast, deadly edges and // legacy code blocks appearing every 4 bugs |
fastest snake, legacy code every 3 bugs |
💡 Keep your tail along the edges and leave the middle free.
● Bug Sweeper
- Click a line of code to review it. A number tells how many bugs hide in the 8 cells around it; an empty cell opens its neighbours by itself.
- Right click to set a breakpoint ● where you think a bug is. Click a number with as many breakpoints around it to open all its other neighbours.
- Review every clean cell to ship the release: you get a bonus (plus 1 point for every second under the time limit) and the next board starts. Hit a bug and it's "Bug in prod!".
- Keyboard: arrow keys /
WASD move the cursor, Space / Enter reviews, F sets a breakpoint.
Your score is +1 for every cell reviewed, plus the bonus of every release. The first click is never a bug.
| Junior |
Senior |
10x Dev |
Ultracode |
| 8×10 board, 10 bugs |
12×15 board, 28 bugs |
14×18 board, 46 bugs |
16×20 file with 70 bugs |
💡 Start from the corners of the empty areas: that's where the numbers tell you the most.
⇡ Crossy Commit
- Hop with the arrow keys (or
WASD); Space hops forward. You can also click: the commit hops towards the pointer.
- Roads: dodge the
GET, POST, DELETE… requests and the long npm install trucks.
- Log stream: you can only stand on the floating
console.log() logs, and they carry you along. Don't get swept off the screen.
- Rails: when the red light blinks, the deploy train is coming.
// TODO blocks on the green lanes can't be crossed.
- The deadline scrolls up by itself: fall behind and it's "Deadline exceeded". Your score is how far you got.
| Junior |
Senior |
10x Dev |
Ultracode |
| slow traffic, long logs, lazy deadline |
the standard challenge |
fast traffic, short logs, frequent trains and a tight deadline |
rush-hour traffic, the shortest logs, a deadline right behind you |
💡 Don't rush onto the logs: wait for a long one, and go back to a green lane to catch your breath.
🐞 Bug Invaders
- Move the cursor with
← → (or A D), or just move the mouse.
Space (or a click) shoots a ;. Hold it to keep shooting.
- Bugs are worth 10 🐞, 20 (
NullPointerException) and 30 (race condition, top row). The flickering Heisenbug crossing the top is worth up to 300.
- The swarm marches side to side and steps down at every edge, faster and faster as it thins out. If it reaches the production line, it's "Build broken!".
- Bugs throw exceptions
!: each hit costs a ♥. Your ; cancel them in mid-air. The green test coverage blocks stop shots from both sides but wear away.
- Forked bugs (with a branch on their back) split into two divers when hit. Dodge them or shoot them (+5).
- Power-ups: L linter = triple shot for 9 s, H hotfix = a shield that absorbs one hit.
- Clear a wave for a bonus: the next one starts lower and faster. Fresh tests come every other wave.
| Junior |
Senior |
10x Dev |
Ultracode |
| fewer, slower bugs, rare slow exceptions, 4 ♥ |
more bugs, forks, 3 ♥ |
fast swarm, aimed exceptions, more forks |
swarm at full speed, a storm of aimed exceptions, only 2 ♥ |
💡 Stay under a shield while the exceptions rain, and pick off the columns at the edges: the swarm has to travel further before it steps down.
⎇ Git Jump
- The commit bounces by itself on every branch it lands on. Steer it with
← → (or A D), or just move the mouse. Off one side, back on the other.
- Climb as high as you can: every 10 px of height is +1 point. Fall below the screen and it's "Detached HEAD!".
- Branches: green ones are solid, blue
rebase ones move, white stash ones pop after one bounce, brown legacy ones break under you.
- An
npm package on a branch is a super jump, a ☕ coffee flies you up for a moment (and through bugs).
- Bugs 🐞 float between the branches: land on them from above to fix them (+10), touch them any other way and your commit is broken.
| Junior |
Senior |
10x Dev |
Ultracode |
| close branches, few moving ones, bugs only up high |
the standard challenge |
wider gaps, more rebase, stash and legacy, more bugs |
the widest gaps, fast rebases, legacy everywhere, bugs from the start |
💡 Look up while you fall: aim for the next solid branch, not the nearest one, and never trust a legacy.
☕ Jetpack Java
- Hold
Space (or the mouse button) to fire the jetpack and rise, release it to fall.
- You fly on your own, faster and faster: every meter is +1 point, every
{} token another +1.
- Firewalls (two nodes with a crackling beam) block your way: some are open in the middle, some rotate.
- A red P1 alert on the right edge follows your height, then launches: move away right before it does.
⚠ rm -rf / lines warn you where a beam will sweep the whole screen a moment later.
- A green ✓ unit tests bubble absorbs one hit.
| Junior |
Senior |
10x Dev |
Ultracode |
| slow, spaced firewalls, a few alerts |
faster, rotating firewalls and the first rm -rf / |
fast, more alerts and beams |
top speed, patterns back to back, alerts in pairs, rare tests |
💡 Tap, don't hold: short bursts keep you steady. Stay in the middle so you can dodge up or down.
🪓 Refactor Jack
- Chop the monolith from the left (
← / A / click on the left half) or the right (→ / D / click on the right half). Space chops again on the side you're on.
- Every chop removes one line: +1 point. The trunk drops down by one line.
- Nested callbacks stick out of the trunk: don't walk into the one at head height, and don't stay under the next one when it comes down. You can always dodge it from the other side.
- The sprint bar at the top drains all the time, faster and faster: every chop buys a little time. Every 25 lines a new sprint starts.
| Junior |
Senior |
10x Dev |
Ultracode |
| slow sprint, fewer callbacks |
the standard challenge |
fast sprint, callbacks almost everywhere |
a sprint at machine speed, a callback on nearly every other line |
💡 Don't look at Jack, look two lines up: you always know where to stand next.
🥷 NinJS
- The ninja runs up the split view on its own, faster and faster: every 10 px is +1 point.
Space (or a click) jumps across to the other pane. Press it just before landing to jump again right away.
- Red merge conflicts
<<<<<<< are deadly: never touch them.
- Bugs crawl on the panes and
throw shurikens fly across: on a pane they hurt, but in mid-air the ninja cuts them down (+10 a bug, +15 a shuriken, up to x3 if you chain them).
| Junior |
Senior |
10x Dev |
Ultracode |
| slow climb, long jumps, few shurikens |
the standard challenge |
faster, tighter gaps, more shurikens |
top speed, short gaps, shurikens everywhere |
💡 Jump into the bugs on the other pane: it's the only way they turn into points.
🏄 Branch Surfers
- Your commit surfs up three branches by itself, faster and faster: every meter is +1 point, every
{} token another +1.
← → (or A D) switch branch, ↑ (or Space) jumps, ↓ rolls. With the mouse: swipe left, right, up or down (a click jumps).
- Deploy trains block a whole branch: switch before you reach them. A red ▼ hotfix at the top of a branch means a train is coming at you.
- Red
<<<<<<< merge conflicts on the track must be jumped, ✗ build signs overhead must be rolled under.
- Switching into the side of a train makes you stumble: the code reviewer catches up. Stumble again while they're behind you and you're caught.
- A green ✓ unit tests bubble absorbs one crash.
| Junior |
Senior |
10x Dev |
Ultracode |
| slow, one train at a time, more shields |
faster, two trains at once, the first hotfixes |
fast, more hotfixes and barriers |
top speed, trains everywhere, rare shields |
💡 Pick your branch early: look at where the next trains end, not just where they start.
✂ Bug Slicer
- Bugs,
NPEs and ⚠ warnings are tossed up over the editor: drag the mouse across them to slice them (+1 each, a golden zero-day is +5).
- Slice 3 or more in one swipe for a combo bonus.
- Every bug that falls back down unsliced reaches production: 3 of them and the game is over.
- Never slice an
rm -rf / terminal: it wipes everything at once.
| Junior |
Senior |
10x Dev |
Ultracode |
small, slow waves, few rm -rf / |
bigger waves |
fast, crowded waves, more rm -rf / |
huge waves at full speed, rm -rf / everywhere |
💡 Swipe low and wide while the waves rise, and keep the blade away from the red terminals.
🗑 Ticket Toss
- Press the mouse anywhere, pull back like a slingshot and let go to throw the ticket: the arrow shows direction and power, not where it lands.
With the keyboard:
← → aim, hold Space to charge the power and release it to throw.
- Mind the wind at the top: the PM's fan blows the ticket left or right, a little more every throw.
- Straight in (swish) is +2, in off the rim +1. Three tickets on the floor and the game is over.
| Junior |
Senior |
10x Dev |
Ultracode |
| wide bin, gentle wind |
narrower bin, stronger wind |
the bin rolls back and forth after 6 points |
narrow, far, rolling bin and strong wind |
💡 Throw higher when the wind is strong: a long, high arc gives it time to push the ticket back towards the bin.
The games only take real keyboard, mouse and touch input. If something else drives them (a bot or a script), the scores of that session are neither saved nor sent online.
If the keys don't respond, click the game once: the tab needs keyboard focus.
If you switch tabs during a game, it pauses by itself.
6. Commands and settings
| Command |
What it does |
| HappyDEV: Play |
Opens the games |
| HappyDEV: Connect to Claude Code / Disconnect from Claude Code |
Turns automatic opening on or off (see section 3) |
| HappyDEV: Join Online Leaderboard / Leave Online Leaderboard |
Joins with a nickname / stops sending and deletes your online scores |
| HappyDEV: Reset High Scores |
Resets the local high scores of every game and level |
| Setting |
Default |
What it does |
happydev.autoStart |
true |
Open/close the games together with Claude Code and Codex |
happydev.codex |
true |
Also react to Codex |
happydev.online.enabled / happydev.online.nickname |
off / empty |
Online leaderboard (set them with the Join command) |
happydev.online.server |
HappyDEV server |
Leaderboard server URL, if you host your own (see server/README.md) |
happydev.game |
menu |
What to show when HappyDEV opens: menu, last (last game played) or a specific game (flappy, dash, wings, stack, snake, mines, crossy, invaders, jump, jetpack, lumber, ninja, surf, slice, toss) |
To change the shortcut: Ctrl+K Ctrl+S, search "HappyDEV".
7. Uninstall
If you connected it, run Ctrl+Shift+P → HappyDEV: Disconnect from Claude Code first.
Then: Extensions view (Ctrl+Shift+X) → HappyDEV → ⚙ → Uninstall.
For developers
happydev/
├── package.json # manifest: commands, shortcut, settings
├── extension.js # opens/closes the games, Claude Code hooks, high scores
├── images/icon.png # extension icon
├── media/core.js # shared core: canvas, input, pause, menu, levels, high scores
├── media/games/flappy.js # Flappy Code
├── media/games/dash.js # Deploy Dash
├── media/games/wings.js # Sine Glide
├── media/games/stack.js # Stack Overflow
├── media/games/snake.js # snake_case
├── media/games/mines.js # Bug Sweeper
├── media/games/crossy.js # Crossy Commit
├── media/games/invaders.js # Bug Invaders
├── media/games/jump.js # Git Jump
├── media/games/jetpack.js # Jetpack Java
├── media/games/lumber.js # Refactor Jack
├── media/games/ninja.js # NinJS
├── media/games/surf.js # Branch Surfers
├── media/games/slice.js # Bug Slicer
├── media/games/toss.js # Ticket Toss
├── server/ # leaderboard server: Cloudflare Worker + D1 (see server/README.md)
└── build-vsix.py # builds the .vsix without Node.js (only Python 3 needed)
- Try it without installing: open this folder in VS Code and press
F5. A second window opens with the extension running.
- Build the package:
npx @vscode/vsce package, or python3 build-vsix.py if you don't have Node.js.
- Tweak it: each file in
media/games/ starts with a LEVELS table holding the parameters of the four levels (speeds, gaps, timers...). PALETTE in media/core.js sets the colors. Inside a game, HD.pick([junior, senior, tenx, ultra]) returns the value for the selected level.
- Add a game: create
media/games/name.js calling HD.register({ id, name, tagline, color, W, H, reset, update, draw, press, release, playing, icon }). Optional: key(code) for custom keys, keyUp(code) for held keys, pointer(x, y) for clicks and hover(x, y) to follow the mouse. Use dash.js as an example, then add the id to GAMES in extension.js and server/worker.js (with its top speed in points per second and its par score for the global ranking) and to the happydev.game enum in package.json.
License
MIT
| |