Best-in-class, open tools for games and creative work on the web.
Each tool does one job well and works on its own with whatever you already use.
Together they make one fast, open foundation, so you spend your time on the idea, not the plumbing.
debuff is our framework for small, polished 2D games that run in the browser: less setup, more time for mechanics, art and weird ideas.
npm create debuff@latest my-game- A small, fast runtime. Rendering is spryte, which draws moving sprites 2–4× faster than the most popular 2D web renderer, at a ninth of its size, in 2dbench.
- Crisp pixel art out of the box. Integer scaling, pixel snapping, and debuff sans, our pixel font, as the default for text.
- Tests that play the real game. Logic tests run the actual game in Node in milliseconds, scenarios check it in a browser (including flashes and contrast), and a fuzzer plays it with random hands until something breaks. Every finding replays exactly.
- Dev tools that explain things. Errors say whose bug it is and link the exact source line. Rewind and scrub a live session. Frame drops say why. Feel values become live sliders.
- Agents as helpers, people in charge. An MCP server and plugins for Claude Code and Codex let agents play the game you have open, read its state and errors, and run the tests. You see everything they do and can undo it.
- Web standards only. ES modules, a canvas, Web Audio and Gamepad. No proprietary editor or project format.
Status: 0.21, early development. APIs will change, and feedback from real games shapes them.
These work without debuff, alongside Phaser, PixiJS, three.js, KAPLAY or a plain canvas:
The renderer inside debuff, standalone. Immediate mode, batched WebGL2 with a Canvas 2D fallback, about 10 kB. |
Headless pixel art for coding agents: sprites and animations over MCP, a CLI or a TypeScript API. Reads and writes .aseprite. |
Game music made in code. Songs are tiny data, synthesized live with Web Audio. No audio files, a few kB. |
A frame profiler that finds the hitches players feel and says why in plain words. |
Fast, deterministic logic tests that run your real game in Node, no browser. |
Lint rules for oxlint and ESLint: unseeded randomness, real clocks and timers that break replays, allocations in update loops. |
An open, fair benchmark for 2D web renderers, with a pixel-parity gate. Run it on your device. |
Agent skills for writing and reviewing 2D web games. |
| Repo | What's there |
|---|---|
| debuff | Runtime packages, CLI, scaffolder, MCP server, keiko, myaku, plonk, templates |
| spryte | The renderer: WebGL2 sprites, shapes, text, render targets and shaders, with a Canvas 2D fallback |
| tenten | Headless, scriptable pixel art and animation; .tt and .aseprite |
| 2dbench | Open benchmark for 2D web renderers, with community results from many devices |
| game-lint | Lint rules for game logic, one plugin for oxlint and ESLint |
| plugins | Official and community plugins for debuff |
| 2d-web-game-skills | Agent skills for 2D web games |
| overbuffed | A swarm survival game starring buff, built in the open to find what debuff should do better. Play it |
| debuff-sans | Our pixel font as TTF, BDF and a sprite sheet, under the SIL Open Font License |
| brand | The foundation mark, the debuff wordmark, buff the mascot, sprite sheet and social card |
- Come say hi, share what you're making, or ask anything on Discord.
- Everything we make is free: code under MIT, the font under the SIL Open Font License. Sponsor us on GitHub to keep it that way.
- Bugs and ideas: open an issue.
- Read the contributing guide and the roadmap, or build a plugin.
- Everyone is welcome under our code of conduct.