NES EMULATOR
cfxnes
cfxnes — a JavaScript-based NES emulator and emulation library that runs in web browsers and can be embedded as a library.

WHY IT MATTERS
Why pick cfxnes?
cfxnes is a compact, MIT-licensed NES implementation written in JavaScript intended for use both as a browser-playable emulator (live demo) and as a library that can be embedded in web projects. It supports common NES ROM formats and a set of popular mappers, plus web-specific features (WebGL rendering, Web Audio, IndexedDB save persistence) that make it convenient for demos, teaching, browser-based tooling, and light-weight embedding into web apps.
BEST FOR
Best use-cases
Running NES ROMs directly in a modern desktop browser for quick testing or demos; embedding an NES core into a web app or interactive documentation; using the project as a reference JavaScript implementation of common NES mappers and browser integration patterns (audio via Web Audio, graphics via WebGL/canvas, save persistence in IndexedDB).
The people behind cfxnes
Project history and status
The project is hosted on GitHub and shows active repository history and tagged releases. The repository README documents features, supported ROM formats (iNES and NES 2.0) and lists supported mappers (NROM, MMC1, MMC3, UNROM, CNROM, AOROM, BNROM, NINA-001, Color Dreams). The codebase is split into core, lib and app components and the project is distributed under the MIT license. Releases are published on the repository's Releases page and the author provides a live demo and documentation site. Known issues listed in the repo include occasional MMC3 graphical glitches and poor performance on some browsers or mobile devices. Based on the repository and release activity, this is an actively maintained open-source browser-focused NES emulator/library.
What cfxnes supports
- Nintendo Entertainment System (NES)
- ROM formats: iNES, NES 2.0
- Mappers: NROM, MMC1, MMC3, UNROM, CNROM, AOROM, BNROM, NINA-001, Color Dreams
- Browser platforms: Chrome, Firefox, Opera, Edge, Safari (WebGL / Web Audio required)
- Input: keyboard, gamepad, mouse (Zapper emulation via mouse)
- Persistence: battery-backed RAM saved to IndexedDB
Download and availability
OFFICIAL DOWNLOADS
Get cfxnes
Official source and release binaries are provided from the project's GitHub repository. See the Releases page for tagged releases and assets; the repository is the canonical download and source location.
Get cfxnes ↗DOCUMENTATION
Official documentation
Read the official configuration, compatibility, and troubleshooting material before changing advanced options.
Read official documentation ↗cfxnes setup guide
Setup note: cfxnes runs primarily in web browsers and is also usable as a JavaScript library. The steps below show how to use the hosted demo, run the app locally, and embed the library. The instructions assume you will obtain your own legally licensed ROM files; cfxnes does not include commercial game ROMs or console firmware.
- 1) Try the live demo (fastest): Open the project's live demo page in a modern desktop browser (Chrome/Firefox/Edge/Safari). The demo UI lets you load .nes (iNES/NES 2.0) files or ZIP archives containing ROMs, configure controls, toggle fullscreen, and use a mouse for Zapper input. Use a desktop browser for best performance; the README warns of poor mobile performance.
- 2) Download the source or release: Fetch the source or release assets from the project's GitHub repository Releases section. Clone the repository (git clone https://github.com/jpikl/cfxnes) or download a release archive from the Releases page. Build steps are in the repository; check the repo README and the app/lib READMEs for build or packaging instructions.
- 3) Run the web app locally: Serve the app directory over a local HTTP server (static hosting) rather than opening files directly, because browsers restrict some APIs when loading from file://. Example: from the repository root run a simple static server (python -m http.server or a Node-based static server) and open the app/demo URL. The app uses WebGL for rendering (with canvas fallback) and Web Audio for sound; ensure your browser allows those APIs.
- 4) Using cfxnes as a library in a web project: Consult the project's library documentation (API and examples) in the repository/docs. The library exposes modules in the lib folder and includes examples showing how to instantiate the emulator core, load ROM bytes (from a file input or fetch), configure key bindings, and connect Web Audio and WebGL/canvas sinks. Integrate by including the built library bundle or by importing from a build step; follow the repository's recommended build/packaging steps to produce a distributable JS bundle.
- 5) Save persistence and input: Games that use battery-backed RAM persist save data to IndexedDB in the browser. If testing locally, use the same origin/URL as the demo or host; IndexedDB storage is scoped by origin. For controller input, the project supports the Gamepad API; ensure your browser and OS recognize the controller. Zapper-like input is emulated with the mouse pointer in the demo.
- 6) Troubleshooting and limitations: If you encounter no sound, verify Web Audio availability and browser permissions. If performance is poor, try a desktop browser and enable hardware acceleration; complex mappers (MMC3) may show occasional graphical glitches per the repo's known-issues. For compatibility questions, consult the repository's 'broken-games' list and open an issue on the GitHub project if needed.
Software reminder: You must supply your own legally obtained ROM files. cfxnes does not provide commercial games, firmware, or BIOS files.
Sources and further reading
Detailed guides and tutorials
Explore step-by-step guides for cfxnes as they are published.
Retro Replay Retro Gaming History, Reviews & Emulation
