NES EMULATOR
nes-js
nes-js — a JavaScript NES (Famicom) emulator implemented to run in web browsers. It exposes a small API for loading iNES-format ROMs, rendering to a canvas, and producing audio via WebAudio; it is published on GitHub and has an accompanying GitHub Pages demo.

WHY IT MATTERS
Why nes-js matters
nes-js is a compact, browser-focused NES/Famicom emulator implementation useful to developers who want an embeddable JavaScript NES engine (Canvas + WebAudio) or a reference for simple web-based emulation. It is not a full-featured desktop emulator but offers an accessible codebase and live demos for experimentation and embedding in web projects.
BEST FOR
Best for
Embedding an NES runtime in web pages, learning basic NES emulation in JavaScript, building small demos (Canvas/WebAudio) or AR/VR experiments that run in the browser.
The people behind nes-js
History and status
nes-js is an open-source JavaScript NES (Famicom) emulator maintained in the GitHub repository takahirox/nes-js. The repository contains source (src), example HTML pages, a build directory, and a GitHub Pages demo. The README documents features (iNES-format ROM support, Canvas rendering, WebAudio output) and lists demos including standard and Three.js/VR/AR variants. The project offers an npm package name and build scripts. The repository shows active content (source and example pages) and issue activity; releases are published on the GitHub releases page. The project states TODOs including performance optimization and wider mapper support, so compatibility with all commercial NES titles is not claimed. For current project activity or exact release dates consult the repository and releases directly; the official project page and demo are hosted under the takahirox GitHub account.
What nes-js supports
- Browser (modern desktop/mobile browsers) — Canvas + WebAudio
- Node/npm packaging (package name: nes-js)
- GitHub Pages demo for quick testing
- iNES ROM image format
Download and availability
OFFICIAL DOWNLOADS
Get nes-js
Official code and releases are distributed from the project's GitHub repository and its Releases page. A browser-hosted demo is available via the project's GitHub Pages site. The package is also installable via npm under the project name referenced in the repository documentation.
Get nes-js ↗DOCUMENTATION
Official documentation
Read the official configuration, compatibility, and troubleshooting material before changing advanced options.
Read official documentation ↗nes-js setup guide
Setup note: This guide explains how to try nes-js from the browser demo, embed the emulator in a webpage, and build/use the npm package. It focuses on the verified repository layout and README instructions. It does not include or instruct how to obtain commercial ROMs, BIOS, or other copyrighted firmware — you must supply legally obtained iNES-format ROM images yourself.
- Try the live demo: Open the project's GitHub Pages demo (hosted at the project's takahirox.github.io/nes-js URL). The demo lets you load an iNES-format ROM image into the browser and run it using the included Canvas and WebAudio-based frontend.
- Embed nes-js in a webpage (quick example): Use the built library (nes.min.js) from the repository build output or your own build. The repository README shows an example: include nes.min.js in a page, fetch a ROM as an ArrayBuffer (XHR/fetch with responseType 'arraybuffer'), create a NesJs.Nes instance, call nes.setRom(new NesJs.Rom(buffer)), set a display with NesJs.Display(canvasElement), set audio with NesJs.Audio(), attach keyboard handlers to call nes.handleKeyDown/handleKeyUp, then call nes.bootup() and nes.run(). The emulator renders to a canvas sized for NES resolution (256×240) and uses WebAudio for sound.
- Install and build via npm: From the repository: npm install to get dev dependencies, then run the repository build scripts (README indicates npm run all). The package name referenced in the README is nes-js — you may install it in a project with npm install nes-js; consult package.json in the repository for exact metadata before use.
- Local development and examples: Clone the GitHub repository, inspect the example HTML files (index.html, index2.html, index3.html, index4.html) and the src/ directory. Build via the provided npm scripts to produce build/nes.min.js. Open the example pages from a simple local HTTP server (browsers block some functionality when opened via file://). Use developer tools to observe console output for errors and to verify ROM loading and audio initialization.
- ROM format, mappers, and compatibility: nes-js accepts iNES-format ROM images per the repository README. The project lists mapper support as limited and includes a TODO for supporting more mappers; many NES commercial cartridges require specific mappers and may not run if those mappers are unimplemented. Expect varying compatibility; test with small homebrew or public-domain iNES images first.
- Performance and features to expect: nes-js renders using Canvas and uses WebAudio for audio output. The README notes performance optimization as a TODO and mentions that Three.js/VR/AR demos have performance issues. If you need cycle-accurate timing, highly complete mapper coverage, or advanced features (save states, extensive input mapping, netplay), this project is primarily educational and for light web use rather than a drop-in replacement for mature desktop emulators.
Software reminder: Do not include or expect the repository to contain commercial game ROMs, BIOS, or copyrighted firmware. You must supply legally obtained iNES-format ROMs yourself.
Sources and further reading
Detailed guides and tutorials
Explore step-by-step guides for nes-js as they are published.
Retro Replay Retro Gaming History, Reviews & Emulation