Skip to content

Architecture ​

WildM is split into six programs. Only two of them run inside or next to the game; the game itself is never modified.

PLAYER PCWFX.RE SERVICESSERVER HOSTWildM launcherElectron · boot checksserver browser · account linkresource downloadloading screenClient folder%USERPROFILE%\WildM\client\wildm_connect.jsonclient\wildm_status.jsoncache\<host>_<port>\Web browser/link code · /portalUbisoft Connect / Steamlicence check, starts GRW.exewildm_inject.exeopens uplay:// or steam://, waitsGRW.exe (unmodified)dinput8.dllWildM client framework(GRW ScriptHook fork)plugins\wildm_netskipintrotest_pluginWFX.re master server:7777 /servers /stats /version/auth/* /link /heartbeataccounts · sv_key check · 90 s TTLPortal /portalservers, sv_key, icon, bannerWildM game serverNode.js · server.jsonHTTP :30120 /info /resources/*TCP :30121 JSON lines, 10 Hzresources/ (loadscreen/, …)12345678910
#From → toWhat travelsReference
1Launcher → masterGET /version, /servers, /stats; account linking POST /auth/link/start, GET /auth/link/poll; GET /auth/me, POST /auth/logoutMaster API
2Browser → master / PortalThe /link?code=… sign-in page (approves the launcher's code); the /portal web app for server ownersLinking, Portal
3Launcher → game server (HTTP)GET /info, GET /resources/manifest, GET /resources/file/<path> — up to 4 parallel downloads, sha256-checkedGame server protocol
4Launcher → injectorwildm_inject.exe --url <uplay:// or steam://> <client\dinput8.dll>; reads one OK … / ERR … lineInjector CLI
5Injector → platform → gameThe injector opens the platform URL; Ubisoft Connect / Steam checks the licence and starts GRW.exePrinciples
6Injector → GRW.exeLoadLibraryW(client\dinput8.dll) via a remote thread as soon as GRW.exe appears (handles a relaunch by Ubisoft Connect)Injector CLI
7Launcher ↔ client folderWrites wildm_connect.json (new session per launch), deletes the old wildm_status.json, then polls the new one every 500 msContract
8Client ↔ client folderwildm_net reads wildm_connect.json next to the framework DLL and writes wildm_status.json about once a second (atomic replace)Contract
9Client ↔ game server (TCP)One JSON object per line: hello → welcome, pos at 10 Hz → players at 10 HzGame server protocol
10Game server → masterPOST /heartbeat every 30 s with the server's sv_key; the master drops a server after 90 s without a heartbeatHeartbeat & listing

The components ​

ComponentSource folderLanguageRole
Launcherlauncher/Electron (Node.js)Splash with boot checks, WFX.re account linking, server browser, connect sequence, installs the client into %USERPROFILE%\WildM\client\
Injectorinjector/wildm_inject.cC (Win32)Loads the client DLL into GRW.exe without touching game files
Client frameworkforks/gamexueren/ (advanced fork, being ported) and grw-scripthook/ (original, patched)C / C++ (ImGui overlay)dinput8.dll proxy: plugin loader, game API (SH_API exports), in-game menu
Client pluginsforks/gamexueren/plugins/wildm_net, skipintro, test_pluginCNetwork client + status file; intro video skip; local debug console
Game servergame-server/Node.js, no dependenciesHTTP info/resources, TCP player sync, heartbeat
Master server + Portalmaster-server/Node.js, no dependenciesServer list, stats, WFX.re accounts, launcher linking, Portal and sv_keys, icons/banners, wfx.re landing page

The connect sequence, step by step ​

The launcher's connect screen shows five steps (ids in the code: server, resources, checks, launch, world). Each can be cancelled at any time. Details from a player's perspective are on The loading screen.

  1. Connecting to the server — GET http://<host>:<port>/info (6 s timeout). The answer must contain an integer gamePort.
  2. Downloading resources — fetch the manifest, check the cache (size + sha256), delete files no longer in the manifest, download the rest (4 in parallel, 20 s stall timeout, .wildm-part temp files renamed after verification). If the cache contains loadscreen/index.html, it is displayed behind the progress UI.
  3. Checks — find the game, scan for anti-cheat, make sure GRW.exe is not already running, clean up any legacy files in the game folder, install or update the client if the build changed.
  4. Launching the game — make sure Steam (Steam version) and Ubisoft Connect are running, write wildm_connect.json, run the injector (4 min timeout).
  5. Loading the world — follow wildm_status.json until phase is ingame and server.connected is true. The launcher window then minimises itself.

WildM is an independent community project. It is not affiliated with or endorsed by Ubisoft. Ghost Recon Wildlands is a trademark of Ubisoft Entertainment.