OMG-Guest/Halo-Mobile

๐Ÿ”ฅ Halo CE in your browser: mobile touch controls, streamed maps, System Link, and WebAssembly absurdity.

C

1

4 commits

updated Sep 30, 2026

See the code

See what people are saying

SourceMessageScoreDate

Opus 5.5 made Halo run on mobile with touch controls (r/ClaudeAI)

Just played Halo CE straight in the browser on my phone. Halo CE Mobile (based on halo-ce-universal by cybersecurity, from the punpckhdq/bnunu decomp). Play: [**https://halo.lolgames.net**](https://halo.lolgames.net) Source:โ€ฆ

7

Sep 30, 2026

README

๐Ÿ”ฅ Halo Mobile

๐Ÿš€ Halo: Combat Evolved. In your browser. On your phone. ๐Ÿš€

WebAssembly PWA WebGL 2 Source License Stars Forks


A mobile-first Halo CE web port with touch controls, controllers, browser saves, streamed maps, System Link play, and a real Play button at the top.

No installer. No native app package. Just WebAssembly doing something it absolutely should not be able to do.

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๐ŸŽฎ PLAY HALO CE FROM A BROWSER TAB โ”‚ โ”‚ ๐Ÿ“ฑ TOUCH. CONTROLLER. KEYBOARD. โ”‚ โ”‚ ๐ŸŒ STREAM MAPS. KEEP SAVES. JOIN FRIENDS. โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜


๐Ÿคฏ What Is This?

Halo Mobile takes the Halo: Combat Evolved decompilation and pushes it through a modern browser stack: WebAssembly, WebGL 2, OffscreenCanvas, OPFS, service workers, and a launcher built for phones.

The result is an installable browser game with direct Play controls, private on-device storage, custom touch layouts, controller support, and multiplayer System Link rooms. Yes, that is a campaign-capable Halo port. Yes, that is a browser tab. ๐Ÿคฏ

๐Ÿง  TL;DR: bring authorized game data, open the launcher, hit Play, and let the browser carry the absurdly large energy sword.

๐Ÿ“ฑ This Is Not A Mockup

Halo Mobile launcher on Android showing Play and Play streamed maps at the top
๐Ÿ“ฒ Android launcher โ€” Play and streamed-map controls are first. Game-data controls stay below.

๐ŸŒ What Can You Do With It?

โšกMissionWhat happens
๐Ÿ“ฑPlay on AndroidRun the WebAssembly build in current Chrome with touch controls.
๐ŸŽInstall on iPhone or iPadAdd the PWA to the Home Screen for a full-screen app-like experience.
๐ŸŽฎUse a controllerPair Bluetooth or USB controllers and let touch controls step aside.
๐Ÿ•น๏ธUse keyboard + mousePlay on a desktop browser or a tablet with peripherals.
๐Ÿ’พKeep saves locallyStore saves, settings, and shader caches in private browser storage.
๐Ÿ“ฆImport private game dataChoose an authorized disc image or an extracted maps folder.
๐Ÿ“กStream maps on demandUse a separately hosted byte-range map service instead of importing every map.
๐ŸคPlay System LinkCreate, join, share, and match into browser-based Halo rooms.
๐ŸงชTry direct presentationUse the experimental direct worker-canvas mode for reduced frame transport.
๐Ÿ› ๏ธBuild the whole thingCompile the web port with Emscripten and Ninja.

โšก Quick Start

The shortest path from clone to โ€œwhy is Halo running in my browser?โ€

# ๐Ÿ”“ Get the source
git clone https://github.com/OMG-Guest/Halo-Mobile.git
cd Halo-Mobile

# ๐Ÿงฐ Install and activate Emscripten 6.0.10
git clone --depth 1 https://github.com/emscripten-core/emsdk.git ../emsdk
python3 ../emsdk/emsdk.py install 6.0.10
python3 ../emsdk/emsdk.py activate 6.0.10
source ../emsdk/emsdk_env.sh

# ๐Ÿš€ Build and test
python3 configure.py --release
ninja web
node --test port/web/tests/*.cjs

The browser app is written to build/web/site. Serve it locally:

# ๐ŸŒ Launch a local server
python3 -m http.server --directory build/web/site 8081

Open http://localhost:8081. The service worker reloads once to establish browser isolation. Then you are flying. โœˆ๏ธ

๐Ÿ—บ๏ธ Bring Your Own Game Data

The code is here. The game data is not. Keep it that way.

This repository includes zero Halo maps, disc images, saves, credentials, or generated builds. Supply compatible Halo game data only from a source you are authorized to use.

๐Ÿ”Launcher routeResult
๐Ÿ’ฟChoose disc imageImport an authorized ISO or XISO into private browser storage.
๐Ÿ“Import maps folderSelect an extracted compatible maps directory.
๐Ÿ“กPlay streamed mapsPoint the launcher at a separately hosted downloaded-maps manifest with HTTP byte ranges.

Do not commit map files, disc images, browser saves, credentials, or build output. Ever.

๐Ÿงฑ Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๐Ÿ“ฑ Browser launcher                                       โ”‚
โ”‚ Play โ€ข Touch โ€ข Controller โ€ข Install โ€ข System Link rooms  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
               โ”‚ ๐ŸŒ Service worker + PWA โ”‚
               โ”‚ COOP / COEP + offline   โ”‚
               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚ โš™๏ธ Emscripten + WebAssembly engine   โ”‚
         โ”‚ WebGL 2 โ€ข worker canvas โ€ข audio      โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚                   โ”‚
      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
      โ”‚ ๐Ÿ’พ OPFS             โ”‚ โ”‚ ๐Ÿ“ก Range map host  โ”‚
      โ”‚ saves + local maps  โ”‚ โ”‚ optional streaming โ”‚
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽฏ Requirements

  • ๐Ÿ Python 3.10+
  • ๐Ÿ”จ Ninja
  • ๐Ÿงช Emscripten 6.0.10
  • ๐ŸŒ A current browser with WebGL 2, OffscreenCanvas, SharedArrayBuffer, and OPFS
  • ๐Ÿ“ฑ Android Chrome, iOS/iPadOS 17+, or a current desktop browser
  • ๐Ÿ”’ HTTPS for mobile network deployment
  • ๐Ÿ’พ About 2 GB browser storage for a full local map import

For Android USB development:

# ๐Ÿ“ฒ Make the desktop server appear as Android localhost
adb reverse tcp:8081 tcp:8081

Then open http://localhost:8081 in Android Chrome. Use HTTPSโ€”not insecure LAN HTTPโ€”for complete mobile browser capabilities.

๐Ÿงช Presentation Modes

Pixels have baggage. Pick your transport.

๐ŸŽจModeUse it when
โšกDirect worker canvasThe launcher default: reduces per-frame pixel transport on compatible hardware.
๐Ÿ›ก๏ธBounded readbackAdd ?present=readback when you need the fixed-buffer fallback.

Direct worker-canvas presentation is the current default. Compare it with ?present=readback when diagnosing device-specific stability or performance.

๐Ÿ“ Project Structure

๐Ÿ“ฆ Halo-Mobile
โ”œโ”€โ”€ ๐ŸŒ port/web/site/      Launcher, PWA shell, controls, service worker
โ”œโ”€โ”€ ๐Ÿ”Œ port/web/src/       Browser and Emscripten platform bridge
โ”œโ”€โ”€ ๐Ÿงช port/web/tests/     Launcher, presenter, and stream-map tests
โ”œโ”€โ”€ ๐Ÿง  source/             Halo decompilation source
โ”œโ”€โ”€ ๐Ÿ”ง tools/web_build.py  Browser Ninja build graph
โ””โ”€โ”€ ๐Ÿ“– LICENSE.md          License and notice material

๐Ÿ› Troubleshooting

๐Ÿ˜ต Problem๐Ÿ› ๏ธ Fix
Browser says required features are missingUse a current supported browser and reload after the service worker starts.
Phone cannot use all capabilities on a LAN IPServe the app over HTTPS. Use localhost only for ADB reverse development.
Streamed maps do not startConfirm the manifest and maps use same-origin byte-range endpoints.
Android cannot reach the desktop serverRun ADB reverse for port 8081, then use Android localhost.
Direct mode is unstableReturn to bounded readback.
Saves are missingBrowser origins are separate. Keep the same origin and export saves before moving.

๐Ÿค Contributing

Fix browser bugs. Improve touch controls. Test weird devices. Make the build more reliable. Keep proprietary game data out of every commit.

Before opening a change:

# โœ… Verify the browser port
node --test port/web/tests/*.cjs

โญ Star This Repo

If you believe browser games should be allowed to be ridiculous, smash that star button. โญ

Built from decompilation research, WebAssembly, and an unreasonable amount of browser ambition. ๐Ÿ”ฌ

The ring is a web app now. Deal with it. ๐Ÿ˜


๐Ÿ“œ Attribution

Halo Mobile builds on fucktrevor/HCE-Mobile, cybersecurity/halo-ce-universal, bnunu/halo-1, and punpckhdq/halo. Preserve their attribution and licenses. Read LICENSE.md.

android
emscripten
game-development
halo
ios
offscreen-canvas
pwa
wasm
webassembly
webgl

OMG-Guest/Halo-Mobile

๐Ÿ”ฅ Halo CE in your browser: mobile touch controls, streamed maps, System Link, and WebAssembly absurdity.

C

1

4 commits

updated Sep 30, 2026

See the code

See what people are saying

SourceMessageScoreDate

Opus 5.5 made Halo run on mobile with touch controls (r/ClaudeAI)

Just played Halo CE straight in the browser on my phone. Halo CE Mobile (based on halo-ce-universal by cybersecurity, from the punpckhdq/bnunu decomp). Play: [**https://halo.lolgames.net**](https://halo.lolgames.net) Source:โ€ฆ

7

Sep 30, 2026

README

๐Ÿ”ฅ Halo Mobile

๐Ÿš€ Halo: Combat Evolved. In your browser. On your phone. ๐Ÿš€

WebAssembly PWA WebGL 2 Source License Stars Forks


A mobile-first Halo CE web port with touch controls, controllers, browser saves, streamed maps, System Link play, and a real Play button at the top.

No installer. No native app package. Just WebAssembly doing something it absolutely should not be able to do.

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๐ŸŽฎ PLAY HALO CE FROM A BROWSER TAB โ”‚ โ”‚ ๐Ÿ“ฑ TOUCH. CONTROLLER. KEYBOARD. โ”‚ โ”‚ ๐ŸŒ STREAM MAPS. KEEP SAVES. JOIN FRIENDS. โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜


๐Ÿคฏ What Is This?

Halo Mobile takes the Halo: Combat Evolved decompilation and pushes it through a modern browser stack: WebAssembly, WebGL 2, OffscreenCanvas, OPFS, service workers, and a launcher built for phones.

The result is an installable browser game with direct Play controls, private on-device storage, custom touch layouts, controller support, and multiplayer System Link rooms. Yes, that is a campaign-capable Halo port. Yes, that is a browser tab. ๐Ÿคฏ

๐Ÿง  TL;DR: bring authorized game data, open the launcher, hit Play, and let the browser carry the absurdly large energy sword.

๐Ÿ“ฑ This Is Not A Mockup

Halo Mobile launcher on Android showing Play and Play streamed maps at the top
๐Ÿ“ฒ Android launcher โ€” Play and streamed-map controls are first. Game-data controls stay below.

๐ŸŒ What Can You Do With It?

โšกMissionWhat happens
๐Ÿ“ฑPlay on AndroidRun the WebAssembly build in current Chrome with touch controls.
๐ŸŽInstall on iPhone or iPadAdd the PWA to the Home Screen for a full-screen app-like experience.
๐ŸŽฎUse a controllerPair Bluetooth or USB controllers and let touch controls step aside.
๐Ÿ•น๏ธUse keyboard + mousePlay on a desktop browser or a tablet with peripherals.
๐Ÿ’พKeep saves locallyStore saves, settings, and shader caches in private browser storage.
๐Ÿ“ฆImport private game dataChoose an authorized disc image or an extracted maps folder.
๐Ÿ“กStream maps on demandUse a separately hosted byte-range map service instead of importing every map.
๐ŸคPlay System LinkCreate, join, share, and match into browser-based Halo rooms.
๐ŸงชTry direct presentationUse the experimental direct worker-canvas mode for reduced frame transport.
๐Ÿ› ๏ธBuild the whole thingCompile the web port with Emscripten and Ninja.

โšก Quick Start

The shortest path from clone to โ€œwhy is Halo running in my browser?โ€

# ๐Ÿ”“ Get the source
git clone https://github.com/OMG-Guest/Halo-Mobile.git
cd Halo-Mobile

# ๐Ÿงฐ Install and activate Emscripten 6.0.10
git clone --depth 1 https://github.com/emscripten-core/emsdk.git ../emsdk
python3 ../emsdk/emsdk.py install 6.0.10
python3 ../emsdk/emsdk.py activate 6.0.10
source ../emsdk/emsdk_env.sh

# ๐Ÿš€ Build and test
python3 configure.py --release
ninja web
node --test port/web/tests/*.cjs

The browser app is written to build/web/site. Serve it locally:

# ๐ŸŒ Launch a local server
python3 -m http.server --directory build/web/site 8081

Open http://localhost:8081. The service worker reloads once to establish browser isolation. Then you are flying. โœˆ๏ธ

๐Ÿ—บ๏ธ Bring Your Own Game Data

The code is here. The game data is not. Keep it that way.

This repository includes zero Halo maps, disc images, saves, credentials, or generated builds. Supply compatible Halo game data only from a source you are authorized to use.

๐Ÿ”Launcher routeResult
๐Ÿ’ฟChoose disc imageImport an authorized ISO or XISO into private browser storage.
๐Ÿ“Import maps folderSelect an extracted compatible maps directory.
๐Ÿ“กPlay streamed mapsPoint the launcher at a separately hosted downloaded-maps manifest with HTTP byte ranges.

Do not commit map files, disc images, browser saves, credentials, or build output. Ever.

๐Ÿงฑ Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๐Ÿ“ฑ Browser launcher                                       โ”‚
โ”‚ Play โ€ข Touch โ€ข Controller โ€ข Install โ€ข System Link rooms  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
               โ”‚ ๐ŸŒ Service worker + PWA โ”‚
               โ”‚ COOP / COEP + offline   โ”‚
               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚ โš™๏ธ Emscripten + WebAssembly engine   โ”‚
         โ”‚ WebGL 2 โ€ข worker canvas โ€ข audio      โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚                   โ”‚
      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
      โ”‚ ๐Ÿ’พ OPFS             โ”‚ โ”‚ ๐Ÿ“ก Range map host  โ”‚
      โ”‚ saves + local maps  โ”‚ โ”‚ optional streaming โ”‚
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽฏ Requirements

  • ๐Ÿ Python 3.10+
  • ๐Ÿ”จ Ninja
  • ๐Ÿงช Emscripten 6.0.10
  • ๐ŸŒ A current browser with WebGL 2, OffscreenCanvas, SharedArrayBuffer, and OPFS
  • ๐Ÿ“ฑ Android Chrome, iOS/iPadOS 17+, or a current desktop browser
  • ๐Ÿ”’ HTTPS for mobile network deployment
  • ๐Ÿ’พ About 2 GB browser storage for a full local map import

For Android USB development:

# ๐Ÿ“ฒ Make the desktop server appear as Android localhost
adb reverse tcp:8081 tcp:8081

Then open http://localhost:8081 in Android Chrome. Use HTTPSโ€”not insecure LAN HTTPโ€”for complete mobile browser capabilities.

๐Ÿงช Presentation Modes

Pixels have baggage. Pick your transport.

๐ŸŽจModeUse it when
โšกDirect worker canvasThe launcher default: reduces per-frame pixel transport on compatible hardware.
๐Ÿ›ก๏ธBounded readbackAdd ?present=readback when you need the fixed-buffer fallback.

Direct worker-canvas presentation is the current default. Compare it with ?present=readback when diagnosing device-specific stability or performance.

๐Ÿ“ Project Structure

๐Ÿ“ฆ Halo-Mobile
โ”œโ”€โ”€ ๐ŸŒ port/web/site/      Launcher, PWA shell, controls, service worker
โ”œโ”€โ”€ ๐Ÿ”Œ port/web/src/       Browser and Emscripten platform bridge
โ”œโ”€โ”€ ๐Ÿงช port/web/tests/     Launcher, presenter, and stream-map tests
โ”œโ”€โ”€ ๐Ÿง  source/             Halo decompilation source
โ”œโ”€โ”€ ๐Ÿ”ง tools/web_build.py  Browser Ninja build graph
โ””โ”€โ”€ ๐Ÿ“– LICENSE.md          License and notice material

๐Ÿ› Troubleshooting

๐Ÿ˜ต Problem๐Ÿ› ๏ธ Fix
Browser says required features are missingUse a current supported browser and reload after the service worker starts.
Phone cannot use all capabilities on a LAN IPServe the app over HTTPS. Use localhost only for ADB reverse development.
Streamed maps do not startConfirm the manifest and maps use same-origin byte-range endpoints.
Android cannot reach the desktop serverRun ADB reverse for port 8081, then use Android localhost.
Direct mode is unstableReturn to bounded readback.
Saves are missingBrowser origins are separate. Keep the same origin and export saves before moving.

๐Ÿค Contributing

Fix browser bugs. Improve touch controls. Test weird devices. Make the build more reliable. Keep proprietary game data out of every commit.

Before opening a change:

# โœ… Verify the browser port
node --test port/web/tests/*.cjs

โญ Star This Repo

If you believe browser games should be allowed to be ridiculous, smash that star button. โญ

Built from decompilation research, WebAssembly, and an unreasonable amount of browser ambition. ๐Ÿ”ฌ

The ring is a web app now. Deal with it. ๐Ÿ˜


๐Ÿ“œ Attribution

Halo Mobile builds on fucktrevor/HCE-Mobile, cybersecurity/halo-ce-universal, bnunu/halo-1, and punpckhdq/halo. Preserve their attribution and licenses. Read LICENSE.md.

android
emscripten
game-development
halo
ios
offscreen-canvas
pwa
wasm
webassembly
webgl

Languages

C

80.1%

Python

15.9%

C++

2.4%