Loading projects…
A 2D side-scrolling platformer that runs entirely in the browser on a single canvas — no game engine, no image or audio assets, no backend. Its signature is a 1930s rubber-hose "Cuphead" art style drawn live on the Canvas 2D API, four multi-phase bosses, and peer-to-peer online co-op over a 4-letter code.
Run right across tile-based levels, collect coins, stomp foes, dodge hazards, parry pink bolts, and topple four hand-drawn bosses — BARKBROOD the elder oak, GRANITE the stone golem, RIME the ice spire, and THE OVERCLOCK, an airborne finale. Four biomes — golden-hour meadow, crystal cavern, industrial foundry, and a moonlit boss arena — each ship their own palette and parallax backdrop.
The full platforming kit is there: variable jump, duck and fast-fall, dash, wall-jump, shooting with 8-way aim, a parry, moving and crumbling platforms, and checkpoints. It plays on phones too, with auto-detected touch controls, auto-fire, and a layout that respects notches and the mobile address bar.
There is not a single image or audio file in the repository. The Cuphead look — ink-outlined curves, boiling lines, and a warm vintage film grade — is rendered live every frame on the Canvas 2D API, and a clean Mario-style pixel path ships alongside it, switchable at any time. Every sound effect and music track is synthesized with the Web Audio API.
No engine, no assets, no backend — everything on screen is drawn, and everything you hear is synthesized, at runtime.
Press C on the title screen, share a 4-letter code, and a friend drops into the same world — same enemies, same bosses, combined boss damage. The connection is peer-to-peer over WebRTC: a public broker handles only the initial handshake, then all game data flows directly between the two players. The host runs the one authoritative simulation while the joining player’s character is predicted locally, so movement feels instant instead of waiting on the network.
The codebase is strict TypeScript on Vite with a fixed-timestep loop that decouples physics from frame rate. The render layer never mutates state, all gameplay constants live in one file, and every level and boss is an authored JSON file — adding a stage requires no physics changes at all.