JSNES

What JSNES is
JSNES is a JavaScript library for emulating NES games in browsers and Node.js. Its Browser helper connects emulator functions to canvas rendering, audio, keyboard and gamepad input, and frame timing. The API can load ROM data from a URL or from a string, Uint8Array or ArrayBuffer, run frames, accept input for either of two players, reset and adjust frame rate. It also includes methods to move and trigger the Zapper light gun.
Applications can serialize and restore emulator state with `toJSON()` and `fromJSON()`. A callback for battery-backed SRAM writes lets applications persist game save data. Sound emulation is enabled by default, with a default sample rate of 48000 Hz, and an audio callback is available. The README suggests calling `nes.frame()` at 60 fps, while reliable timing remains the integrator's responsibility. Installation options include npm for Node.js or Webpack and an unpkg script for browsers. The repository also includes React embedding guidance and a fuller React frontend. JSNES is free and licensed under Apache-2.0; its GitHub Issues tracker accepts bug reports and feature requests. Project issues include accuracy and compatibility work involving mappers, graphics, audio and ROM loading.
Who it suits
It suits developers building browser or Node.js applications that need NES emulation and control over rendering, audio or input. React developers can also use the provided embedding example or repository frontend.
What it does well
- Supports browser and Node.js use
- Can serialize and restore emulator state
- Browser helper accepts keyboard and gamepad input
- Licensed under Apache-2.0
What to know first
- Reliable frame timing is the integrator's responsibility
- Project issues cite emulator accuracy and compatibility work
Limits
The README places responsibility for reliable 60 fps timing on the integrator. Project issues identify ongoing emulator accuracy and compatibility work, including mapper coverage, graphics, audio, and ROM loading.
Plans
| Plan | Billed and limits | Price |
|---|---|---|
| JSNES | Open-source JavaScript NES emulator library | Free |
As github.com lists them, read 8 Oct 2026. The maker's own page has the final word.
Getting started
- Install `jsnes` with npm for Node.js or Webpack, or use the unpkg script for a browser.
- For a React application, follow the repository's embedding example or use its `web/` frontend as a reference.
- Load ROM data from a URL or provide it as a string, Uint8Array, or ArrayBuffer.
- Connect rendering, audio, and input through the Browser helper or configure custom handling with the NES class.
- Call `nes.frame()` at 60 fps and connect controls for player 1 or player 2.
JSNES is a JavaScript NES emulator library for browser and Node.js applications. It is aimed at developers building their own frontend or game feature rather than people seeking a finished desktop player. The payoff is a permissive, free API; the trade-off is that compatibility work remains and frame scheduling belongs to the integrator.
Overview
JSNES separates a convenient browser layer from a lower-level NES class. The browser helper combines canvas output, sound, keyboard and gamepad input, and frame handling, while Node.js projects can supply custom rendering and audio through the core class. That division suits products that need to shape the user interface or connect emulation to an existing application, but it adds engineering work compared with a ready-to-run emulator.
Installation covers common JavaScript paths: use npm install jsnes with Node.js or Webpack, or load the browser build through an unpkg script. The README includes a React embedding example, and a fuller React frontend is present in the repository's web/ directory. Apache-2.0 licensing permits use in projects, and GitHub Issues is the route for bug reports and feature requests.
Key features
ROMs, frames, and controllers
The API accepts ROM data from a URL, string, Uint8Array, or ArrayBuffer. Applications can run frames, reset the machine, and set frame-rate behavior, with button input available for player one or player two. The browser interface handles keyboard and gamepad controls and allows bindings to be remapped at runtime. Zapper movement and trigger methods extend input beyond standard controllers, which is useful for a frontend that needs light-gun support.
State and saved data
toJSON() and fromJSON() provide serialization and restoration of emulator state, making save-state features practical to add at the application level. Battery-backed game saves use the onBatteryRamWrite callback, so a host application can persist SRAM when the cartridge writes it. These hooks give developers control over storage, but they also mean the surrounding application must implement the persistence and user experience.
Audio and rendering
Sound emulation is enabled by default, with a default sample rate of 48,000 Hz, and an audio callback is available for custom handling. The browser helper draws to canvas, while the core NES class leaves rendering choices to the host. This flexibility is a strength for bespoke interfaces and integrations, not a substitute for a complete presentation layer.
Timing and compatibility
The README directs callers to invoke nes.frame() at 60 fps. Reliable timing is therefore the integrator's responsibility; applications with inconsistent scheduling can produce uneven play even when the emulator API is otherwise suitable. Open issues cover accuracy and compatibility concerns involving mapper coverage, graphics, audio, and ROM loading. Those unresolved areas make JSNES a poor fit when broad cartridge compatibility is a hard requirement without room for validation and fixes.
Pricing
| Plan | Price | Includes |
|---|---|---|
| JSNES | free | Open-source JavaScript NES emulator library |
There is no paid tier or free trial. The free plan is the complete published offering, with no seat or usage quota stated. It fits hobby projects, prototypes, educational work, and commercial applications that can adopt Apache-2.0 software and take responsibility for integration.
Platforms
JSNES supports browser deployments and Node.js, with Linux listed among its supported platforms. Browser builds can use the unpkg script or a bundled setup, while Node.js and Webpack projects can install the package through npm. The platform choice affects how much of the browser helper you use versus how much rendering and audio infrastructure you provide yourself.
Who it's for
Choose JSNES when you are building a web emulator, a React experience, a Node-based tool, or another JavaScript product that needs programmable NES controls and state management. It is especially appropriate when custom canvas rendering, audio routing, controller remapping, two-player input, or application-managed saves matter more than a turnkey player.
Look elsewhere for a consumer-facing emulator that should work broadly without an engineering team managing frame timing and investigating mapper, graphics, audio, or ROM-loading edge cases. JSNES's API gives control, but that control comes with implementation and compatibility responsibilities.
Pros and cons
- Pro: Browser and Node.js options support both web frontends and server-side or custom integrations.
- Pro: ROM loading accepts several data forms, easing integration with different asset pipelines.
- Pro: Keyboard, gamepad, two-player input, remapping, and Zapper methods cover more controller scenarios than basic button APIs.
- Pro: Save-state serialization and battery-RAM callbacks let the host decide how game data is stored.
- Con: Callers must maintain 60-fps frame timing, so smooth play depends on application scheduling.
- Con: Open accuracy and compatibility issues, including mapper, graphics, audio, and ROM-loading work, weaken its suitability for uncompromising coverage.
- Con: The library supplies integration primitives rather than a finished player, leaving frontend and persistence work to developers.
Alternatives
For a broader survey, see NES Emulators.
- GoNES is another free NES emulator with Linux, macOS, web, and Windows support; choose it when cross-platform desktop coverage matters.
- NESER is free MIT-licensed software for Linux, macOS, web, and Windows, a fit when that license and platform mix suit your project.
- Nestalgia is a free desktop emulator for Linux, macOS, and Windows, better suited to those platforms than a browser-focused library.
- binjnes offers free Linux, macOS, and web builds, including a build-from-source route.
- FCEUX adds NES, Famicom, Famicom Disk System, and Dendy emulation through Win32 and Qt/SDL ports.
- HalfNES is free desktop software requiring Java 8 or newer and has no savestates.
- Nestopia Undead Edition is free, open-source GPL-2.0 software for Linux, macOS, and Windows.
- NET-NES is free MIT-licensed software for Linux, macOS, and Windows.
Verdict
JSNES is a strong starting point for developers who want NES emulation embedded in JavaScript and need direct control over input, rendering, audio, and saved state. Its free Apache-2.0 distribution and broad API make experimentation and custom frontends straightforward. Choose another emulator when dependable cartridge compatibility is more important than programmable integration, or when your application cannot own precise frame timing and ongoing compatibility fixes.
Verdict
JSNES provides emulator controls and browser input, audio and rendering support for developers integrating NES gameplay. Its open issues note ongoing accuracy and compatibility work, and applications must handle reliable frame timing.
Questions
How much does JSNES cost?
The listed plan is free. JSNES is free and has no free trial.
Which platforms does JSNES support?
It supports browsers and Node.js. The listed platforms are web and Linux.
Is JSNES open source?
Yes. The repository identifies JSNES as licensed under Apache-2.0.
How can I install it?
The README gives an npm install route for Node.js or Webpack and an unpkg script for browser use.
Who maintains JSNES?
The package metadata names Ben Firshman as the author.
Where can I get support?
The project provides a GitHub Issues tracker for bug reports and feature requests.
Facts from JSNES's own pages
- Audio
- The API supports an audio callback and has sound emulation enabled by default with a default sample rate of 48000 Hz. · github.com, 7 Oct 2026
- Browser frontend
- The Browser helper handles canvas rendering, audio, keyboard input, gamepad input, and frame timing. · github.com, 7 Oct 2026
- Browser setup
- The browser interface handles canvas rendering, audio, keyboard and gamepad input, and frame timing. · github.com, 8 Oct 2026
- Controllers
- The browser interface supports keyboard and gamepad controls, and exposes remapping for both. · github.com, 8 Oct 2026
- Emulation controls
- The NES API includes loading ROM data, running frames, button input, reset, and frame rate methods. · github.com, 7 Oct 2026
- Frame rate
- The README says to call nes.frame() at 60 fps and makes reliable timing the integrator's responsibility. · github.com, 8 Oct 2026
- Input support
- The Browser helper supports keyboard and gamepad input, and its keyboard bindings can be customized at runtime. · github.com, 7 Oct 2026
- Installation
- The README documents installation with npm install jsnes and browser use through an unpkg script. · github.com, 8 Oct 2026
- Known limitations
- Open project issues list emulator accuracy and compatibility work, including mapper coverage, graphics, audio, and ROM loading issues. · github.com, 7 Oct 2026
- License
- The repository identifies its license as Apache-2.0. · github.com, 8 Oct 2026
- Maintainer
- The package metadata names Ben Firshman as the author. · github.com, 7 Oct 2026
- Node integration
- The lower-level NES class supports custom rendering and audio handling and can be used in Node.js. · github.com, 8 Oct 2026
- Persistent game saves
- The API calls `onBatteryRamWrite` when battery-backed SRAM is written so applications can persist save data. · github.com, 7 Oct 2026
- Purpose
- JSNES is a JavaScript NES emulator library that works in browsers and Node.js. · github.com, 8 Oct 2026
- React
- The README provides a React embedding example and says a full-featured React frontend is in the repository's web directory. · github.com, 8 Oct 2026
- ROM loading
- The library can load ROM data from a URL or from a string, Uint8Array, or ArrayBuffer. · github.com, 8 Oct 2026
- Save data
- The onBatteryRamWrite callback allows applications to persist battery-backed SRAM data. · github.com, 8 Oct 2026
- Save states
- The API can serialize emulator state with toJSON() and restore it with fromJSON(). · github.com, 8 Oct 2026
- Support channel
- The project provides a GitHub Issues tracker for bug reports and feature requests. · github.com, 7 Oct 2026
- Two players
- The API accepts controller input for player 1 or player 2. · github.com, 8 Oct 2026
- Zapper
- The API includes methods to move and trigger the Zapper light gun. · github.com, 8 Oct 2026
Where JSNES stands on Freedom251
- NES Emulators#7 of 26