Skip to content

Guides

How to run GBA games in a browser on a Chromebook

EmulatorJS is a RetroArch frontend that runs entirely in a browser tab. Here is what it needs, what it will not do, and why a Chromebook is a surprisingly good machine for it.

4 min read
Topic
Browser emulation
Difficulty
intermediate
Spoilers
None

A Chromebook is a browser with a keyboard attached. That sounds like a limitation, and for most things it is — but browser-based emulation has quietly become good enough that the limitation stops mattering. A modern Chromebook runs a Game Boy Advance at full speed in a tab, with save states, a rewinding timeline and a gamepad.

This is a guide to doing that properly. It is not a guide to getting around a network filter, and none of what follows will help with that.

What you actually need

A legally owned copy of the game. This is not a formality. Emulators are legal; ROM files you did not make from a cartridge you own generally are not. Everything below assumes you are dumping your own games, and that is the only version of this guide we are prepared to write.

A browser. Chrome, Edge or Firefox, all current. No Linux container, no developer mode, no terminal. That is the entire appeal of this route on a Chromebook.

About 40 MB of space per core. The emulator itself is not the problem. Game files are small — a GBA ROM is typically 8 to 32 MB — but Chromebooks often ship with 32 GB of eMMC and a chunk of that is taken by the OS, so it is worth knowing where your headroom is before you start.

The tool: EmulatorJS

EmulatorJS is a frontend for RetroArch — the same emulation cores used on desktop and on retro handhelds, compiled to WebAssembly so they can run in a browser tab. It is explicitly built as a library rather than a finished website, which means there are two ways to use it.

The easy route. Point it at a hosted instance or an existing web build and load your game. Fastest to try, and fine for a first experiment.

The route worth doing. Self-host it. You download the EmulatorJS release, drop it on a static host or run it locally, and add the core data file for the system you want — for the GBA that is the mGBA core. Self-hosting means your games never leave your machine, nothing is rate-limited, and the whole thing keeps working when somebody else’s server goes down.

Two details bite people during self-hosting:

  • The .data files are the emulator. EmulatorJS ships a small loader; the actual emulation cores arrive as separate .data bundles, one per system. If a core silently fails to start, it is almost always because the matching .data file is missing or in the wrong directory. There is also a -legacy-wasm variant of each bundle for older browsers — you do not need it on a current Chromebook, and it is noticeably slower.
  • Headers matter. The threaded cores use SharedArrayBuffer, which browsers only expose when the page is served with cross-origin isolation headers set. Get them wrong and the emulator falls back to a single-threaded path or refuses to start. If you are hosting on a static provider that does not let you set custom headers, use the non-threaded core.

Performance on a Chromebook

GBA emulation is not demanding by modern standards, and any x86 Chromebook from the last several years will hold a steady 60 frames per second with room to spare. The honest caveats:

  • Save states live in the browser. They are stored in IndexedDB, which means clearing site data wipes them. If a save matters, use the in-game save and copy the battery file out of the emulator’s file manager.
  • Audio is the first thing to stutter on a weak machine, not video. If a game feels smooth but sounds wrong, you are closer to the performance ceiling than you think.
  • A cheap USB gamepad transforms it. Keyboard mapping works, but platformers and fighting games are miserable on arrow keys. Any wired or Bluetooth controller that the browser recognises will be picked up automatically.

When a Chromebook is the wrong tool

Two situations where you should stop and use something else.

If you want the full library. Browser emulation is excellent for one system at a time. If you want GBA, SNES, Mega Drive and PlayStation 2 in one place, a dedicated retro handheld does it better for less money than you would expect — and you can read about the ones we actually use elsewhere on this site.

If the game needs a real GPU. Anything from the 3D era onwards will run, technically, and will not be enjoyable. WebAssembly emulation of a 3D console on integrated graphics is a demonstration, not a way to play.

The short version

Self-host EmulatorJS, add the mGBA core data file, serve it with the right headers, and load games you own. On a Chromebook that is a genuinely good setup — a full-speed GBA with save states and rewind, running in a tab, using nothing but the browser the machine already has.