JSNES
github.com
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
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
- NES Emulators#3 of 268.3