HappyDEV
Five tiny arcade games with a coding theme that run inside VS Code, each with 3 difficulty levels and an optional online leaderboard.
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 |
- 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, 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.0.0.vsix. From a terminal:
code --install-extension happydev-2.0.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:
↑ ↓ pick a game, Space (or Enter) starts it. You can also click a game or press 1–5.
← → pick 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 |
- 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").
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.
- 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.
Press L in the menu to open the world top 10 of the selected game and level (↑↓ game, ←→ level).
The leaderboard is opt-in. To join:
- Press
L in the menu, then J, or run Ctrl+Shift+P → HappyDEV: Join Online Leaderboard.
- Pick a public nickname (2–16 characters).
- Your existing high scores are uploaded, and from now on every new high score is sent. The game-over card shows your world rank.
Privacy: you are identified by a random id created by the extension. 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.
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.
5. How to play
Most games use one button: Space (or ↑, W, or a mouse click). snake_case uses the arrow keys.
| 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 |
| wide gaps, slow |
normal; after 10 points the blocks move up and down |
narrow gaps, fast, blocks always moving |
💡 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 |
| slower, more space between obstacles, long stages |
normal |
very fast, obstacles close together, short stages (you reach sudo sooner) |
💡 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 |
| 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) |
💡 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 |
| slow, rows always come from the left, easy "perfect" |
rows come from both sides |
very fast, "perfect" only to the pixel |
💡 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 |
| slow, the edges wrap around |
the edges are deadly |
very fast, deadly edges and // legacy code blocks appearing every 4 bugs |
💡 Keep your tail along the edges and leave the middle free.
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) |
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
├── 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 three levels (speeds, gaps, timers...). PALETTE in media/core.js sets the colors. Inside a game, HD.pick([junior, senior, tenx]) 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 and pointer(x, y) for clicks. Use dash.js as an example, then add the file to SCRIPTS in extension.js.
License
MIT