Why GTA, Halo and Quake Now Run in a Browser Tab

A format designed for compiled code turned the browser into a games platform, and the ports keep getting heavier.

Updated 2026-10-10 · 4 min read

What WebAssembly Is, Without the Jargon

WebAssembly is a binary format that browsers can execute. Code written in C, C++ or Rust is compiled into it, and the browser runs that compiled output inside the same sandbox that JavaScript uses. It became a W3C recommendation in 2019 and shipped in every major browser, which is why the ports below stopped being experiments.

The important part is not raw speed, it is fit. Game engines are large C and C++ codebases that assume a graphics context, a game loop and direct memory access. WebAssembly gives them a way to run without rewriting the engine, and WebGL or WebGL2 gives them something to draw with. The glue is usually Emscripten.

That combination is what the tech line on each game page is telling you. When an entry says WebAssembly with WebGL, it means an engine compiled for the web rendering through the browser's graphics API. When an entry says native WebGL, it means a game written for browsers from the start.

The Ports That Made the Case

Quake (1996) was an early proof. id Software released the source code, so a QuakeWorld client could be compiled to WebAssembly and pointed at live servers. Quake II (1997) and Quake III Arena (1999) followed, and Return to Castle Wolfenstein (2001) arrived through iortcw with its class-based multiplayer intact.

The heavier ports are the interesting ones. Halo: Combat Evolved (Web) is a WebAssembly and WebGL port of the PC build, and GTA: Vice City (WASM) (2002) and GTA III (WASM) (2001) run on the reVC and re3 engines, reverse-engineered reimplementations compiled for the web. The Simpsons: Hit & Run (2003) is served from a Cloudflare Workers deployment.

Some projects take a different road entirely. Minecraft 1.8.8 (Eaglercraft) translates Java into JavaScript and WebGL rather than compiling to WebAssembly, and Prince of Persia (1989) is a JavaScript rewrite of the original. Both land in the same place, a playable tab, without using the same toolchain, which is why the two behave so differently on first load.

Where the Game Files Come From

An engine and a game are not the same thing. Community projects such as DevilutionX, Xash3D FWGS, iortcw, ioquake3, re3 and reVC recreate or rebuild a commercial engine, while OpenTTD (Web) is an Emscripten build of a project that was open source from the beginning.

Where the engine is free but the assets are not, the port has to ask you for data. Half-Life (Web), Half-Life / Counter-Strike 1.6 (webXash), Diablo (Web), GTA: Vice City (WASM) and GTA III (WASM) all expect files from a copy you own. The page you open is software, and the game content stays yours.

That is why a browser port can be legitimate and still feel unfinished. The engine is a community project running in a tab, the art and sound come from your library, and nothing is bundled that should not be. It also explains why some builds break, since they depend on data formats and versions the author happened to test.

The Real Cost: Load Time, Memory and Battery

WebAssembly is efficient once it is running. Getting there is the expensive part. A large module has to download, compile and cache before the first frame, which is why the first visit to a heavy port takes noticeably longer than the second. The browser keeps the compiled build, so the cost is mostly paid once.

Memory is the other limit worth understanding. A WebAssembly module addresses a 32-bit linear memory space, which caps it at 4 GB in theory, and a browser tab has to fit inside the same budget as the rest of your session. Ports that stream assets instead of bundling them behave better on modest machines.

Battery life and fan noise are the practical symptoms. Compiled engines keep a processor core busy, and a laptop running one will run warmer and shorter than the same laptop on a native game. Plugging in and closing other tabs is not superstition, it is resource management.

Controls, Audio and the Limits of a Tab

Pointer lock is the piece that makes first-person ports work. When you click the canvas, the page can capture the mouse and read movement without the cursor escaping the window. Esc releases it. Without pointer lock, a browser shooter is unusable, which is why so many ports ask you to click before anything else.

Audio runs through the browser's audio pipeline, so a heavy tab can crackle during a busy scene. Gamepads work through the Gamepad API in some builds, keyboard layouts occasionally confuse ports that assume a US layout, and fullscreen mode usually improves both frame pacing and aim.

Storage is the quiet advantage. WebAssembly games can cache a compiled engine in the browser, so a port you open weekly starts faster each time. Clear site data and that cache is gone, along with any settings the build saved locally. Nothing of yours is uploaded by the format itself.

How to Spot a WebAssembly Port

The clearest signal is a loading bar before any menu appears. WebAssembly builds have to fetch and compile an engine, so a progress indicator is normal and the second visit will not need it. If a game starts instantly with no delay at all, it is probably native WebGL or a very small JavaScript game.

The second signal is a file prompt. Ports that cannot ship commercial assets ask you to select a folder, a .wad, a .pak, a .pk3 or an archive. That request is the signature of a compiled engine running on data you provided, and it is the most honest kind of browser port.

  1. Let the first load finish, then reload once and compare the time
  2. Check the tech line on the game page for WebAssembly, WebGL or emulation
  3. Expect a file picker if the port cannot bundle the original assets
  4. Click the canvas to capture the mouse and press Esc to release
  5. Close heavy tabs before a long session, since memory is shared

Why GTA, Halo and Quake Now Run in a Browser Tab: questions

Is WebAssembly faster than JavaScript for games?

For engine style code, usually yes, because it is compiled ahead of time and does not need to be parsed and optimized at runtime. The bigger advantage is fit: WebAssembly lets a large C or C++ engine run in a browser with few changes to its core.

Why do some browser ports need my game files?

Because the community engine is open source but the art, sound and level data are not. Projects like Xash3D FWGS and DevilutionX ship the engine only, so you supply data from a copy you own. That keeps the port on the right side of copyright.

Which games run best in a browser?

Older 3D engines do well, including Quake and Quake II, because their data sets are small and their code is compact. Heavier open world ports such as GTA: Vice City (WASM) work, but they want a desktop machine and patience on the first load.

Does WebAssembly give a website access to my computer?

No. WebAssembly runs in the same sandbox as JavaScript, inside the browser, with memory it has to request. A page cannot read files from your disk unless you choose them, and it cannot install software without you downloading and running something.

Why does the second visit load faster?

Browsers cache the compiled WebAssembly module along with the game data, so the compile step is largely skipped. That cache lives in your browser profile and disappears when you clear site data or when the project ships a new build.

Games mentioned in this guide

More guides

All guides →