Skip to content
SPECIFICTION
Get listed

JSNES

github.com

Free plan WebLinux
Visit github.com
Spec score 8.3 #3 of 26 in NES Emulators

What it is

JSNES is a free JavaScript library for emulating NES games in browsers and Node.js. Its Browser helper handles canvas rendering, audio, keyboard and gamepad input, and frame timing; the lower-level NES class allows custom rendering and audio handling in Node.js. ROM data can be loaded from a URL or from a string, Uint8Array, or ArrayBuffer. The API runs frames, accepts controller input for either player, resets, adjusts frame rate, and includes methods for moving and triggering the Zapper. Applications can serialize and restore emulator state with `toJSON()` and `fromJSON()`. The `onBatteryRamWrite` callback lets an application capture battery-backed SRAM writes for persistent game saves. Sound emulation is enabled by default, with a default sample rate of 48000 Hz, and an audio callback is available. The README provides npm installation for Node.js or Webpack and an unpkg script for browser use, as well as a React embedding example. JSNES is licensed under Apache-2.0; its GitHub Issues tracker accepts bug reports and feature requests.

Spec sheet

Purpose
JSNES is a JavaScript NES emulator library that works in browsers and Node.js.Read 8 Oct 2026 · github.com
License
The repository identifies its license as Apache-2.0.Read 8 Oct 2026 · github.com
Audio
The API supports an audio callback and has sound emulation enabled by default with a default sample rate of 48000 Hz.Read 7 Oct 2026 · github.com
Browser frontend
The Browser helper handles canvas rendering, audio, keyboard input, gamepad input, and frame timing.Read 7 Oct 2026 · github.com
Browser setup
The browser interface handles canvas rendering, audio, keyboard and gamepad input, and frame timing.Read 8 Oct 2026 · github.com
Controllers
The browser interface supports keyboard and gamepad controls, and exposes remapping for both.Read 8 Oct 2026 · github.com
Emulation controls
The NES API includes loading ROM data, running frames, button input, reset, and frame rate methods.Read 7 Oct 2026 · github.com
Frame rate
The README says to call nes.frame() at 60 fps and makes reliable timing the integrator's responsibility.Read 8 Oct 2026 · github.com
Input support
The Browser helper supports keyboard and gamepad input, and its keyboard bindings can be customized at runtime.Read 7 Oct 2026 · github.com
Installation
The README documents installation with npm install jsnes and browser use through an unpkg script.Read 8 Oct 2026 · github.com
Known limitations
Open project issues list emulator accuracy and compatibility work, including mapper coverage, graphics, audio, and ROM loading issues.Read 7 Oct 2026 · github.com
Maintainer
The package metadata names Ben Firshman as the author.Read 7 Oct 2026 · github.com
Node integration
The lower-level NES class supports custom rendering and audio handling and can be used in Node.js.Read 8 Oct 2026 · github.com
Persistent game saves
The API calls `onBatteryRamWrite` when battery-backed SRAM is written so applications can persist save data.Read 7 Oct 2026 · github.com
React
The README provides a React embedding example and says a full-featured React frontend is in the repository's web directory.Read 8 Oct 2026 · github.com
ROM loading
The library can load ROM data from a URL or from a string, Uint8Array, or ArrayBuffer.Read 8 Oct 2026 · github.com
Save data
The onBatteryRamWrite callback allows applications to persist battery-backed SRAM data.Read 8 Oct 2026 · github.com
Save states
The API can serialize emulator state with toJSON() and restore it with fromJSON().Read 8 Oct 2026 · github.com
Support channel
The project provides a GitHub Issues tracker for bug reports and feature requests.Read 7 Oct 2026 · github.com
Two players
The API accepts controller input for player 1 or player 2.Read 8 Oct 2026 · github.com
Zapper
The API includes methods to move and trigger the Zapper light gun.Read 8 Oct 2026 · github.com

Plans and prices

JSNES Free Open-source JavaScript NES emulator library Read 8 Oct 2026 · github.com

Every JSNES plan and price →

Strong points and limits

Strong points

  • Supports browser and Node.js use.
  • Can serialize and restore emulator state.
  • Browser input supports keyboard and gamepad controls.
  • Includes two-player input and Zapper methods.
  • Licensed under Apache-2.0.

Limits

  • Reliable frame timing is the integrator’s responsibility.
  • Project issues include emulator accuracy and compatibility work.
  • No free trial.

Who it suits

JSNES suits developers building browser or Node.js applications that need NES emulation. Integrators are responsible for reliable frame timing.

Verdict

JSNES exposes emulator controls and state handling for browser and Node.js projects. It is free, but frame timing and application integration remain the developer’s responsibility.

Where Specifiction places it

Alternatives to JSNESAll alternatives →