tinyFPS

A playable zombie-horde first-person shooter that fits in 5,144 bytes. Built from scratch in x86 assembly, running right here in your browser.

3,153 bytes ~19x under the record DOS / VGA mode 13h

Loads a DOS emulator in your browser. Best on desktop.

WASD move Mouse look Space fire 123 switch weapon R reload [] sensitivity Esc quit

The record it targets

Small enough to disappear

tinyFPS this game
5,144 bytes
.kkrieger Guinness record holder, 2004
97,280 bytes

That green sliver is the whole game. It is about 19 times smaller than the current Guinness World Record for the fewest bytes in a first-person shooter, and smaller than the average email signature.

What is in there

A real shooter, not a tech demo

Raycast 3D world

A real level of rooms and corridors, perspective floor casting with a tiled ground, brick-textured distance-shaded walls, and mouse look. Drawn a column at a time.

Enemies that hunt you

Zombies spawn in the far rooms and path through the corridors to find you via a flood-fill distance field. Brutes fire dodgeable projectiles from range, and red edge markers grow as off-screen threats approach.

Three weapons

Pistol, shotgun, and SMG, each with its own fire rate, damage, sound, magazine, reload, and gun. A top-left readout shows the weapon and live ammo count. Plus fog-shaded enemies, recoil, blood, and endless waves.

Nothing wasted

The sine and cosine tables, the map, and the color palette are all generated at startup, so almost none of it costs a single byte on disk.

How it stays this small

Every byte earns its place

01
One flat binary. A DOS .COM file: no headers, no libraries, no runtime. Execution starts at the first byte.
02
Runtime tables. A 65-byte quarter-wave seed expands into full sine and cosine tables in memory, so the trig costs almost nothing on disk.
03
Bit-packed everything. The 16x16 map is packed to 32 bytes and read one bit at a time; scratch variables live in free high memory at zero file cost.
04
Shared code paths. Repeated math and drawing are folded into tiny reusable helpers, and the cosine table is just a window into the sine table.