A first-person shooter for Windows in a single 16 KB executable (limit: 16 384 bytes). Underground, in the dark, your scanner pulse paints the world: wherever its front passes with line of sight, the contours light up and then fade to a faint trace. The things that hunt you show only in a pulse. Every pulse is also noise, and everything down there hunts noise.
Working title; the final name is still open (candidates: PULSE, ECHO//LOC, ЕХОЛОТ).
blind_sector.exe in the repository root (16 004 bytes, the current build; a build writes out/blind_sector.exe).
Fullscreen, any key layout with WASD positions.
| Input | Action |
|---|---|
| WASD / arrows | move |
| Mouse | look |
| LMB (hold) | fire the current scanner mode |
| 1 / 2 / 3, Q, RMB, wheel | LF / HF / Discharge (Discharge from sector 2) |
| Space | jump |
| Esc | back to the menu |
Three sectors (Tunnels, Machine Hall, Arena), Crawler / Sprinter / Listener and the boss, pits and bridges, generative menu and final music. The menu has a mouse speed setting.
Photosensitivity: the Discharge flash ramps up over 150 ms and cannot repeat faster than once every 2 s; there are no strobes. A warning is shown on the title screen.
The level is not a mesh: one fragment shader (shaders/world.frag) ray-casts the 64x64 cell grid,
lights it from the pulses with shadows, adds corner AO and per-room wall patterns, draws the
enemies as jointed distance fields, the post effects and the HUD text. The CPU side
(src/render.cpp) fills one float texture per frame and draws one rectangle: no uniforms, no
matrices, no depth buffer. The window is a "static" popup with raw mouse input read in the
message loop. Code is x87 C++ without the CRT, packed with Crinkler. What each feature cost is in
budget.md.
Packed executables are sometimes flagged by antivirus heuristics. On the development machine
Windows Defender did not remove the Crinkler-packed build. out/tiny/blind_unpacked.exe (≈41 KB,
no packer) is the same game for players whose antivirus blocks the packed file.
Requirements: Visual Studio 2022 (MSVC x86) + Windows SDK, Python 3 (stdlib only). Crinkler and
Shader Minifier are in tools/bin.
powershell -ExecutionPolicy Bypass -File build/build.ps1 -Profile All
That regenerates every data table from the readable sources, builds the Dev and Tiny configurations, packs with Crinkler and checks the size.
| Script | What it does |
|---|---|
build/scenario.ps1 [-Name n] [-Runs 10] | headless test scenarios (tests/*.json), determinism check, replay check |
build/capture.ps1 [-Scene s] | reference frames from build/scenes.json to out/frames/ |
build/exe_snapshot.ps1 -Exe out/blind_sector.exe | starts the packed exe and copies its window to a PNG |
build/assets_preview.ps1 | model previews, level maps, all sounds as WAV, contact sheets (out/preview/) |
build/compare.ps1 -Base <tag> | size, per-pixel frame and scenario deltas against a git tag |
build/compare_selftest.ps1 | proves compare.ps1 catches an intentional regression |
build/promo.ps1 | renders the 15 s promo GIF (out/promo/promo.gif) |
Dev build extras (out/dev/blind_dev.exe): --level N, --god, --record f.inp, --play f.inp
(--headless for bit-exact replay), --scenario f.scn, --capture f.png --cam x,y,z,yaw,pitch,
--bench N, --export-sounds dir, --export-music dir, --stuck-test N.
docs/ — the original design, plan and rules (Ukrainian), written for the 64K game this
edition was cut from. CLAUDE.md — rules for the coding agent.src/ — C++ unity build; src/data/ is generated (not in git).shaders/, levels/, tools/ — readable sources and the generators that compact them.tests/ — scenarios; build/ — scripts, toolchain.lock.md.budget.md — measured byte budget; PROPOSALS.md — deviations from docs/ awaiting a decision.A first-person shooter for Windows in a single 16 KB executable (limit: 16 384 bytes). Underground, in the dark, your scanner pulse paints the world: wherever its front passes with line of sight, the contours light up and then fade to a faint trace. The things that hunt you show only in a pulse. Every pulse is also noise, and everything down there hunts noise.
Working title; the final name is still open (candidates: PULSE, ECHO//LOC, ЕХОЛОТ).
blind_sector.exe in the repository root (16 004 bytes, the current build; a build writes out/blind_sector.exe).
Fullscreen, any key layout with WASD positions.
| Input | Action |
|---|---|
| WASD / arrows | move |
| Mouse | look |
| LMB (hold) | fire the current scanner mode |
| 1 / 2 / 3, Q, RMB, wheel | LF / HF / Discharge (Discharge from sector 2) |
| Space | jump |
| Esc | back to the menu |
Three sectors (Tunnels, Machine Hall, Arena), Crawler / Sprinter / Listener and the boss, pits and bridges, generative menu and final music. The menu has a mouse speed setting.
Photosensitivity: the Discharge flash ramps up over 150 ms and cannot repeat faster than once every 2 s; there are no strobes. A warning is shown on the title screen.
The level is not a mesh: one fragment shader (shaders/world.frag) ray-casts the 64x64 cell grid,
lights it from the pulses with shadows, adds corner AO and per-room wall patterns, draws the
enemies as jointed distance fields, the post effects and the HUD text. The CPU side
(src/render.cpp) fills one float texture per frame and draws one rectangle: no uniforms, no
matrices, no depth buffer. The window is a "static" popup with raw mouse input read in the
message loop. Code is x87 C++ without the CRT, packed with Crinkler. What each feature cost is in
budget.md.
Packed executables are sometimes flagged by antivirus heuristics. On the development machine
Windows Defender did not remove the Crinkler-packed build. out/tiny/blind_unpacked.exe (≈41 KB,
no packer) is the same game for players whose antivirus blocks the packed file.
Requirements: Visual Studio 2022 (MSVC x86) + Windows SDK, Python 3 (stdlib only). Crinkler and
Shader Minifier are in tools/bin.
powershell -ExecutionPolicy Bypass -File build/build.ps1 -Profile All
That regenerates every data table from the readable sources, builds the Dev and Tiny configurations, packs with Crinkler and checks the size.
| Script | What it does |
|---|---|
build/scenario.ps1 [-Name n] [-Runs 10] | headless test scenarios (tests/*.json), determinism check, replay check |
build/capture.ps1 [-Scene s] | reference frames from build/scenes.json to out/frames/ |
build/exe_snapshot.ps1 -Exe out/blind_sector.exe | starts the packed exe and copies its window to a PNG |
build/assets_preview.ps1 | model previews, level maps, all sounds as WAV, contact sheets (out/preview/) |
build/compare.ps1 -Base <tag> | size, per-pixel frame and scenario deltas against a git tag |
build/compare_selftest.ps1 | proves compare.ps1 catches an intentional regression |
build/promo.ps1 | renders the 15 s promo GIF (out/promo/promo.gif) |
Dev build extras (out/dev/blind_dev.exe): --level N, --god, --record f.inp, --play f.inp
(--headless for bit-exact replay), --scenario f.scn, --capture f.png --cam x,y,z,yaw,pitch,
--bench N, --export-sounds dir, --export-music dir, --stuck-test N.
docs/ — the original design, plan and rules (Ukrainian), written for the 64K game this
edition was cut from. CLAUDE.md — rules for the coding agent.src/ — C++ unity build; src/data/ is generated (not in git).shaders/, levels/, tools/ — readable sources and the generators that compact them.tests/ — scenarios; build/ — scripts, toolchain.lock.md.budget.md — measured byte budget; PROPOSALS.md — deviations from docs/ awaiting a decision.