Thirty-two cyan bricks, a three-pixel yellow ball and a sixty-pixel paddle. No engine, no libraries — one file, one canvas, one fixed 60 Hz physics step.
The wall is a contiguous 8 × 4 grid — 50 × 20 px per brick, laid out at col × 50 and row × 20, dropped below a 60 px HUD strip so the score never fights the bricks. Everything else is the ball's problem.
The ball waits on the paddle. Tap, click or hit Space and it leaves along (2, −2.8) normalised to 3.44 px/frame — roughly 54° off vertical, with a randomised sign so no two lives open the same way.
Where you contact decides the exit angle: dead centre goes nearly vertical, the tips throw the ball out at up to 62°. Lateral paddle speed is added as spin, then the vector is re-normalised so the magnitude never drifts.
Every overlapping brick is scored by penetration area; only the deepest resolves, so a corner hit can't double-deduct. The ball is ejected along the collision normal, which is also what stops it tunnelling or lodging inside the wall.
Ten points a brick, three lives, and the broken bricks stay broken when you lose one. Survive and the next wave rebuilds the wall a little faster.