Keys: arrows, Z and X for B and A, Enter for Start, right Shift for Select; or the pad under the screen, a thumb on each side. Controller 2 on the left hand: W A S D, F and G for B and A, T for Start, R for Select. The strip on the floor has power, reset, play, and full screen.
No cartridge. Choose a .nes file from your own disk; it never leaves this browser.
To look inside a game while it runs, its code, its memory, its palettes and its sprites, or to change its tiles, open it on the create desk.
The console from the repository, running in this page: the fast 2A03 and the fast 2C02 on one master clock through the mainboard’s glue logic, which we wrote from the datasheets, the sound through the board’s audio stage, and every frame encoded to the composite waveform and pulled apart by the three-line comb, exactly the signal path the signal bench runs. It is the same code the repository’s tests check, compiled to WebAssembly from the recorded commit.
There is no cartridge here. Choose a .nes file from your own disk; it is read into a worker in this browser and goes nowhere else. The console loads the boards it has, which the boards report lists, and refuses any other by name. If you are signed in and keep a shelf of your own cartridges, they are offered beside the file button. The repository’s own test cartridge is what the site’s checks run, and its colour-bars cartridge is here to download: nobody’s game, the twelve hues in thirty-two-dot cells at one luma row, the row stepping every two seconds, the same file the capture comparison and the bench use.
Under node on the repository’s bench the console with its sound runs at 71.7 frames a second, 1.19 times real time (2026-09-29). In a page the console and the signal path run on threads of their own, the shape the native shell settled on: the console keeps the source’s rate against the wall clock and the sound with it, and the picture decodes the newest frame at whatever rate this browser manages, a frame that arrived while it was busy counted as run but not decoded. The readouts on the create desk measure all of it live, and their drift counters print what a real display would have duplicated or dropped, as the pacing rules specify. Where the browser gives the picture thread WebGPU, the whole picture runs there: the NES encoder as a compute pass (the source’s segment map, its transcribed levels and its wave rule, ported line for line, the levels and the grid taken from the encoder instance) and the comb decode as three more, the native shell’s shader with the display gamma left off, every constant from the decoder instance. Before it is used the first frame goes through the bundle’s own encoder and decoder as well: the readouts state by how many volts the two encoders differed on any sample and by how many bytes of 255 the two decodes did, each against the tolerance it had to meet. Without WebGPU, or on a miss, the wasm path paints and the readouts say so. The console page has the native shell’s figures.
The console bundle is built at the recorded commit ffa239e by the same script that measures this page’s figures, the signal path’s from f91aecb, and the records carry both bundles’ file hashes. The console’s tables were measured out of the switch-level chips, whose die data is CC BY-NC-SA, and that reaches this page: nothing here is for sale.