r/wowservers • u/alinoanta21 • Aug 19 '26
vanilla I rebuilt World of Warcraft 1.12.1 to run directly in a web browser
Hey everyone,
For the last few months I've been working on a side project that got way bigger than I originally expected.
A few months ago I had some free time and I was messing around with a few projects. I also work a lot and at the time I was thinking about how annoying it is when you're on a laptop where you can't really install/download wow or anything like that.
At some point I had the stupid idea of basically, why not just make World of Warcraft run in the browser instead.
So that's what I've been doing.
This is a custom client for WoW 1.12.1 Build 5875, written from scratch in TypeScript. It's using WebGL2, Three.js, HTML5 Canvas, Web Audio and WebSockets and it runs directly in Chrome/Firefox without plugins, cloud streaming or running WoW.exe through WebAssembly.
For the backend I'm using a normal vMaNGOS 1.12.1 core, movement validation, combat, quests, loot, inventory, NPCs, persistence etc are still handled by the real server.
The browser is basically just a modern client.
Because browsers can't connect directly to the TCP socket WoW expects, I have a small Node.js WebSocket to TCP bridge in the middle. The actual protocol is still handled by the browser client itself, including the SRP-6 authentication, encryption, packed GUIDs, UpdateTypes, movement packets and so on.
One thing that took me way more time than expected was the graphics layer.
If you just load the old WoW assets into Three.js and use normal modern lighting it kinda looks like WoW, but at the same time it doesn't. The colors, fog and lighting feel wrong.
So I ended up comparing a lot of it with the original client and going through reversed/disassembled WoW.exe behavior.
Terrain uses the original MCAL alpha maps with 4 texture layers on the GPU, I'm matching the older gamma-space lighting as close as I can, WMO vertex colors are there, day/night lighting, distance fog etc.
I'm not really trying to remaster the game. I actually want it to keep that old look for now, this engine is highly capable to be customized.
Characters are GPU skinned from the original M2 bones and all 8 playable races with both genders are working. Weapon animations also use the original AttackAnimKits and AttackAnimTypes, so different weapons actually use their proper attack animations.
Transports are working too, which was honestly annoying to get right.
Right now I have 33 elevators using around 630 original animation nodes, and ships/zeppelins running over 8 routes.
When you're standing on a ship your character is actually moving relative to the transport, so you can walk around the deck, jump etc while the whole thing is moving.
Most of the UI is also drawn directly using HTML5 Canvas instead of having hundreds of HTML elements sitting on top of the game.
I've been recreating parts of the original Interface 11200 FrameXML/Lua UI in my own canvas system, so bags, action bars, character screen, chat, quests, merchants, stack splitting and a lot of the normal interface is already there.
At the moment I'm calling the build Alpha 1.0.
I currently have 584 tiles covering the Level 1-40 areas I've implemented in Eastern Kingdoms and Kalimdor, the major cities and also places like Deadmines, Scarlet Monastery, Wailing Caverns and Deeprun Tram.
Combat, spells, projectiles, quests, loot, vendors, trainers, professions, inventory/equipment and most of the normal PvE stuff is working now.
Audio is also there with around 3,887 sound entries and 11,514 spell sound references, plus zone music, day/night transitions and different weapon impact sounds.
Also just to get this out of the way because I know people are probably going to ask, yes, I used AI quite a lot while building this.
I'm one guy and realistically I wouldn't get anywhere near this amount of work done in a few months without it. I still review and test the code myself and I've built a lot of custom systems/pipelines around the project, but AI definitely helped me move much faster.
I recorded around 15 minutes of completely unedited freestyle gameplay where I basically just walk around, cast some spells, show random parts of the client and explain what I've done so far.
Youtube Video <- Any updates about the project will be posted here on youtube for now.
I also plan to open source the project once I clean up the extraction/build tools enough that somebody besides me can actually use them.
Just to be clear, I'm not distributing WoW.exe, Blizzard game files or game assets. Everything currently runs locally from my own files, and any future GitHub repo would only contain the code/tools I've written. People would need to provide their own game files in order for the browser client to extract its graphics layer.
There's still a lot left to polish and probably a lot of things I'm going to find are completely wrong, but at this point it's actually playable and not just another WoW browser map viewer/demo.
I'm curious what people think about it.
I'm also curious what kind of QoL changes or custom features people would want, and honestly if you think I should keep working on this.
I know some people will probably see it as pointless compared to just playing the real game, and I get that. For me it's mostly a fun and challenging project, and I still think having WoW run on basically any device without installing anything could have some interesting uses in the near future.

44
u/Blastphemie Aug 19 '26
damn thats so cool now i can actually play at the office lmao!
But really, thats awesome!
14
u/Due-Champion-5954 Aug 19 '26
I play in the office from my flashdisk already for a long time on Warmane.
10
u/powerfist89 Aug 19 '26
Lol I used to do this in High School in 2005-2007.
3
u/Druuseph Aug 19 '26
I worked at a cafe that had full Windows XP computers as the registers back then. Three of us played WoW and would pop in our own thumb sticks after hours to show off our characters.
3
u/clark478 Aug 19 '26
I’m curious about this. Do you just install on a USB drive and run it from there?
3
u/Due-Champion-5954 Aug 19 '26
You dont have to install anything. You just download Wotlk and put it on flash disk and play. It even runs better because the flash disc is faster than most PC storage in the office 😃.
1
Aug 19 '26
[removed] — view removed comment
1
u/AutoModerator Aug 19 '26
Your post/comment has been automatically removed because your account is too young. Please read the rules.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.
1
u/brianj64 Aug 22 '26
My company has disabled 3D rendering in Edge on our work laptops. This ain't gonna work sadly. Funny enough this has also caused some problems for legit things. Meanwhile people who actually go out of their way to procrastinate just open their phone. Sigh.
29
u/Intercellar Aug 19 '26
i have no idea about anything here but if you made wow run on a web browser then you're a damn legend sir
12
u/ZeroZelath Aug 19 '26
I'm curious how much data something like this would use and since you're doing it for work purposes if they would notice an uptick in data being used lol
23
u/alinoanta21 Aug 19 '26
The initial load is around 50–150 MB to grab the engine, UI, and starting zone (which gets cached in your browser so you don't download it again). After that, active gameplay only uses about 10–30 MB per hour, which is less data than streaming on spotify. As you explore brand new zones, it just streams small 2–5 MB chunks on demand.
-3
u/Level_Emergency731 Aug 20 '26
Impossible, ask your AI need to be sure about this.
5
u/alinoanta21 Aug 20 '26
It’s definitely possible because the browser isn’t streaming rendered frames. The assets are baked into much smaller chunks and downloaded only when needed, then cached locally.
So if you’re playing in an area you’ve already visited, there’s very little asset traffic besides the actual game packets. If you run through completely new zones, obviously the bandwidth usage goes up because new terrain, models and textures have to be downloaded.
The 10–30 MB/hour figure is from normal gameplay in mostly loaded areas, not a hard cap. I’ll probably publish some actual network measurements later because it would be interesting to compare different routes and fresh vs cached sessions.
10
u/TehZiiM Aug 19 '26
Games don’t Exchange much data between client and server. It’s minuscule in comparison to watching a YouTube video or streaming music.
4
2
u/schaka Aug 19 '26
Yeah, we were playing 1.12 / 2.4.3 pservers on 3G in 2010, like 5 people off a single phone hot spot
1
u/Orangecuppa 2d ago
Yeah except back in those days your game was already installed on your machine so the only data moving to and from are just packets to track movement/activity. This is on a browser streaming assets live
1
u/schaka 2d ago
The server isn't really streaming the assets. It's essentially a local node.js instance (can also be just an SPA). It's all very much client side except the proxy coverings XHR to what mangos accepts, since you can't just Web socket call to random servers from within a browser
That node server is also expected to run on the client, none of the asset traffic would be leaving the client
3
u/railbeast Aug 19 '26
Yeah but my clients are all several GB, so where is that? Within the browser?
1
1
19
u/TanukiThing Aug 19 '26
This is gonna go so hard in middle school study halls
2
u/vapetusboy Aug 24 '26
Yeah, wow is really popping in middle school
1
u/TanukiThing Aug 24 '26
I’m sure they’d really enjoy it if they could play it off Chromebooks. Obviously times have changed but a ton of the 04 player base would’ve been in that age range
4
u/comander_random Aug 19 '26
Really impressive work. I’m working on a somewhat related reconstruction project, so I’m curious about one thing in particular:
When you were reverse-engineering the original client, did you develop any systematic way to record what you discovered — things like source evidence, whether a behavior came from assets/client/server logic, inferred rules, confidence, and how you validated it?
Or is most of that knowledge ultimately encoded directly into the TypeScript implementation?
I’m especially interested in the parts where the original game files alone weren’t enough to reproduce the correct behavior.
3
u/alinoanta21 Aug 19 '26
Thanks! To track everything, i've codified the findings directly into automated test scripts that validate our TypeScript against raw DBC dumps, Ghidra decompilations, and vMaNGOS headers so nothing breaks during refactors.
The assets alone definitely weren't enough for things like movement physics (gravity and jump curves are hardcoded engine logic), character texture compositing order (the exact skin-to-armor layering order is inside WoW.exe's render loop), and GameObject animation states (reversing whether an animation is a one-shot freeze like opening a chest vs a looping idle so objects don't flap open and closed forever). The MPQs give you the raw assets, but client disassembly provides all the behavioral glue!
1
u/comander_random Aug 19 '26
That’s incredibly useful, thanks — especially the examples around movement physics, texture compositing, and GameObject animation states.
I’m working on a reconstruction approach where I’m trying to keep that “behavioral glue” explicit rather than letting it exist only inside the replacement client, so it can be traced back to its source and reused across different reconstruction targets.
One thing I’m really curious about: when DBC data, WoW.exe behavior, and vMaNGOS assumptions disagree, do you have any explicit source-precedence or confidence model for deciding what becomes authoritative, or do you resolve those cases individually?
Your automated tests against the raw sources are very close to the kind of validation model I’ve been trying to build, so your answer is genuinely helpful.
4
u/alinoanta21 Aug 19 '26
Yeah, i have a pretty strict hierarchy for this. For anything client side (rendering, UI, animations, local physics), the reversed 1.12.1
WoW.exebinary and the MPQ files are source of truth. If vMaNGOS assumes something visual that contradicts what the original client actually does in Ghidra, the client binary always wins.The main exception is server authoritative logic where vMaNGOS dictates the wire protocol. A funny example of this biting us: in vMaNGOS's
UpdateFieldsheader, the code comments said the player quest log starts at offset0x0C0, but the actual compiled C++ formula evaluated to0x0C6because of a +6 object header offset. If you trusted the comments, quest IDs were shifted by 2 slots and every female character spawned with a phantom "quest 1" because it decoded the gender byte as a quest ID.Whenever DBCs, client assembly, and server code disagree, we trace the data all the way through (DBC -> client memory -> packet -> server state) and trust whatever the running binary actually compiles/executes rather than the comments or documentation.
3
u/Chaosvex Aug 19 '26 edited Aug 19 '26
The comments are likely correct and you're misinterpreting two different representations of the data, not accounting for the packet header, vtables, alignment, etc.
2
u/_Isoroku_Yamamoto Aug 20 '26
two people using chatgpt to talk to eachother lmao
1
0
u/Chaosvex Aug 20 '26 edited Aug 20 '26
It's clear to experienced developers, too. Most of the stuff they're talking about sounds plausible because it's hitting a bunch of related keywords but at a higher level, doesn't actually make much sense.
2
u/xthrowaway4561 Aug 27 '26
Facts. All of the people glazing OP really just need to give their props to Fable 5. All of the "I built x..." posts are the exact same story.
1
u/comander_random Aug 27 '26
It doesn't? How so? My project is way past proof of concept but far from being something I'd feel comfortable sharing. Op provided invaluable information.
1
u/Chaosvex Aug 27 '26 edited Aug 27 '26
Statements like this:
Having that explicit end to end chain has saved me countless times from half implemented pipelines where data arrives from the server but gets lost before the renderer ever consumes it!
Anybody that's experienced in the domain is going to raise an eyebrow and wonder what sort of bizarre concoction has been magicked up where such a thing is even possible, not to mention the concept of the renderer ingesting packets. A lot of the terminology, such as "explicit end to end chain" and "half implemented pipelines" are LLM-brained because nobody talks like that.
I don't know if you're using Fable 5 but it really is a technical Mad Libs generator.
1
u/comander_random Aug 19 '26
Really appreciate you taking the time to answer these in this much detail — your examples have been genuinely useful for thinking through my own reconstruction approach.
I’m working on what I’ve been calling a World Contract: basically an evidence-backed intermediate model of a game that tries to preserve not just assets/data, but behavior, dependencies, provenance, and eventually enough context to reconstruct the same client in different targets without re-deriving everything from scratch.
One thing I’m still trying to pin down is composition. When you reverse-engineer a behavior, do you also record what larger system it belongs to and what it depends on?
For example, would a GameObject animation rule just live as an isolated test, or do you model that it’s part of a specific object type/state machine and depends on particular client/server state?
I’m starting to think preserving the “what is this part of?” relationship may be just as important as preserving the behavior itself.
Thanks again — your answers have already helped me identify a couple of architectural gaps, and I’d be interested if anything in that World Contract idea overlaps with problems you’ve run into.
1
u/alinoanta21 Aug 19 '26
That "World Contract" concept sounds awesome, and you're right, preserving the "what is this part of?" relationship is just as critical as the logic itself.
I definitely don't treat behaviors as isolated tests in a vacuum. Instead, i enforce an end to end pipeline model for every single feature: Network Packet -> State Store / UpdateField -> Entity State Machine -> Canvas/3D Render.
For something like GameObject animations, the rule isn't just a standalone animation check. It's modeled as a pure state machine that explicitly takes the server's wire state (e.g.
GAMEOBJECT_STATE 0x0E), resolves the transition vs resting idle based onAnimationData.dbcand model capabilities, and then feeds the final sequence to the M2 animator. Because that state machine is decoupled and pure, my test suite can run that exact pipeline against all 1,000+ baked gameobjects and DBCs to verify the whole system holds up across the entire game world.I also maintain an automated dependency graph across the codebase with thousands of nodes and edges connecting opcodes, update fields, and renderers. That way, if you touch an opcode handler or state field, you immediately know every downstream UI panel and rendering system that depends on it. Having that explicit end to end chain has saved me countless times from half implemented pipelines where data arrives from the server but gets lost before the renderer ever consumes it!
1
u/comander_random Aug 19 '26
Just wanted to say thanks again, this conversation actually changed how I’m approaching my project.
I originally thought of the World Contract mostly as a structured intermediate representation for assets, behavior, and provenance. Your examples pushed me toward something more explicit: preserving the full end-to-end chain of how data enters the system, gets transformed, drives state, and ultimately affects rendering/UI.
I’m now treating things like source authority, pure state machines, dependency/dataflow relationships, and runtime validation as first-class parts of the contract rather than implementation details inside the Unreal side.
The biggest shift is that I want the engine-specific importer to become as “dumb” as possible. The World Contract should own the WoW semantics; Unreal should mostly project already-resolved behavior.
Your "packet -> state -> state machine -> renderer" model and the dependency graph example made that click for me. Really appreciate you taking the time to share how you solved these problems in practice.
I’d also love to stay in touch and compare notes as the projects evolve. I think there could be a lot of useful overlap in sharing findings, validation approaches, and the weird edge cases we both run into along the way.
5
u/InfernoGuard Aug 20 '26
https://reddit.com/link/p4ruq6q/video/uta36grv2hkh1/player
Ha, that's funny ! I started basically the same thing about a week ago. Different angle though: I went straight for PvP, so Warsong Gulch and arenas, with AzerothCore as the backend, which means 3.3.5a instead of 1.12.1.
Mine's purely for fun though. I'm not planning to make it public or turn it into a community project. It really started as an experiment to see how far I could push vibe coding with Babylon.js, TypeScript and that whole stack... the game was just the excuse. Turns out you can get pretty far.
How did you handle collision? I bake the ADT terrain, WMO and doodad geometry into triangle soups offline, then feed those to Rapier (the Rust physics engine, compiled to WASM) as trimesh colliders, with a capsule and a kinematic character controller for the player.
Anyway, cool to see someone else landed on the same idea. Yours looks great.
5
u/komp13 Aug 19 '26
I absolutely love the idea of this! Being able to play some wow in the office during the off times sounds like a dream coming true. I look really forward to hear more of this project!
1
u/krumply Aug 20 '26
So there is no way for the system admin to know that we’re playing wow at the office? Asking for a friend.
3
3
u/Dry_Tea9805 Aug 19 '26
Epic. Would love to pull up WoW in a web browser on a whim and play for a bit.
4
12
u/knuspriges-haehnchen Aug 19 '26
Even with a lot of AI, you put more work into this game than Blizzard did in the last five years
12
u/alinoanta21 Aug 19 '26
That's exactly why I wanted something like this. My office won't allow us to download stuff due to security concerns :(
2
u/starsforfeelings Aug 19 '26
Oh this is what I was thinking. If one day I can play classic in a browser thats gonna be awesome for slow office days.
2
u/knuspriges-haehnchen Aug 19 '26
I totally understand. The client is outdated anyways and wow runs on a potato machine.
1
2
2
u/Buch1337 Aug 19 '26
So how would it potentially work as remote play?
And how would add-ons work? Are they loaded from the local folder?
2
u/Popular-Wolverine-99 Aug 19 '26
Did you implement a game engine from scratch, use an existing one or WebAssembled the Ghidra output?
1
u/alinoanta21 Aug 19 '26
It’s basically a custom game client/engine built in TypeScript on top of Three.js/WebGL2. I didn’t WebAssemble the Ghidra output.
I use Ghidra and the original 1.12.1 client to reverse engineer how specific systems behaved, then reimplement that behavior myself for the browser. Three.js handles the lower level WebGL abstraction, but things like terrain streaming, M2/WMO rendering, animation, combat, networking, UI, lighting, etc. are custom.
I do use WebAssembly in a few places where it makes sense, like StormLib for MPQ handling.
2
u/medicalnoob90 Aug 19 '26
I don't understand the lingo but this sound very cool! It would be great to do this at work and just explore, kill mobs, or just work on profession. Very excited to see where this goes. Congrats!
2
u/schaka Aug 19 '26
Already commented on the video YouTube sent my way today. If you can get the websocket proxy replaced with WASM, making it purely client side SPA, that'd be insane.
1
u/csabloj Aug 20 '26
You cannot replace the proxy, as Webassembly has limits to what you can use with it. Opening network sockets and accessing files are not possible like on a native build on Windows, as those require syscalls which Webassembly doesn't implement. The only way to communicate with any servers is by using HTTP calls, Websockets or the Webtransports API.
1
u/schaka Aug 20 '26
File access wouldn't matter, but I guess the proxy to translate HTTP calls to wow's packets can't be circumvented then
2
u/Ancient_Resolve_6164 Aug 19 '26
Can you make a mobile version??
5
u/alinoanta21 Aug 19 '26
It runs on literally any device with a modern browser and a decent CPU. You can load it up on iPhones, Android, iPads, Steam Deck, or even an PS4, Xbox via Edge. Just need to polish up the touch and gamepad controls for those devices.
2
u/mr_rosh Aug 19 '26
So we'll finally be able to play WoW on Xbox? That's pretty nice
3
u/alinoanta21 Aug 19 '26
I really wanted to try it on one of those smart fridges with the built in browser, but sadly I don't have one. Technically it can work on anything with a modern browser, though the controls are another story!
2
u/G_nn_r Aug 19 '26
Sounds amazing!
So this would run on MacOS with Apple Silicon?
2
u/alinoanta21 Aug 19 '26
Yes, 100% It runs natively on Apple Silicon in Safari or Chrome via WebGL2.
1
2
2
u/Deep_Ad1959 Aug 20 '26 edited Aug 24 '26
the discovery log is the piece i'd keep outside the code. i tracked mine in commit messages on a protocol project and half a year later i couldn't say why a field was byte aligned the way it was, because the reasoning was spread across forty 'fix guid parsing' commits. a dated notes file per opcode is what actually survived the year.
fwiw that's exactly the commit-granularity gap. sundial attributes and reviews edits at edit granularity, not per commit, so the reasoning behind a byte-aligned field stays pinned to that edit, not scattered across forty commits, https://s4l.ai/r/bwt438tw
2
u/eurosonly Aug 20 '26
I wish someone would just make it so we only have to launch the exe for a solo play server without doing any of the set up on the back end. Just build it into the game itself as a pop up window setting that we can bring up in order to fine tune our experience. Make it run like a true single player game.
2
1
1
1
u/wisintel Aug 19 '26
This is really awesome man and the process of doing this sort of thing is more fun than playing sometimes. I have way more hours logged modding skyrim than I have playing it. Really cool work.
1
Aug 19 '26
[removed] — view removed comment
1
u/AutoModerator Aug 19 '26
Your post/comment has been automatically removed because you have too few karma points on your account.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.
1
1
1
1
u/Deep_Ad1959 Aug 20 '26
the discovery log is the piece i'd keep outside the code. i tracked mine in commit messages on a protocol project and half a year later i couldn't say why a field was byte aligned the way it was, because the reasoning was spread across forty 'fix guid parsing' commits. a dated notes file per opcode is what actually survived the year.
1
1
1
u/claudxiao Aug 21 '26
It’s an amazing work! Curios do you have any plan to open source it in future?
1
1
u/MrCrispeta Aug 24 '26
I really want to test this out, cool project. Personally I don't mind if it's donde with IA.
1
1
Aug 25 '26
[removed] — view removed comment
1
u/AutoModerator Aug 25 '26
Your post/comment has been automatically removed because your account is too young. Please read the rules.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.
1
1
Sep 12 '26
[removed] — view removed comment
1
u/AutoModerator Sep 12 '26
Your post/comment has been automatically removed because your account is too young. Please read the rules.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.
1
1
1
u/TSocialNomad 18d ago edited 18d ago
Hey dude! I'm working on a Wow port as well. There are a few people (not myself) building it from core up and so whether or not you are, good work either way and I look forward to your progress. A lot of the comments for your post I find is more a "social commentary about the ethical usage of ai with World Of Warcraft" instead of the fact that you're using the web as access to world of warcraft, which is a huge feat. I think someone tried doing that years ago unfortunately they didn't have the same tools. I look forward to your progress and no pressure. I just saw this and was laughing, I'll probably delete this comment as I'm hesitent myself to comment on other people's forums. But please, keep your head up. You and your team are making great progress.
1
0
6d ago
[removed] — view removed comment
1
u/AutoModerator 6d ago
Your post/comment has been automatically removed because you have too few karma points on your account.
I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.
1
u/Fit_Trash_5139 2d ago
Thanks for the inspiration, I was able to get this to work over the weekend!
1
-1
u/f0ubarre Aug 20 '26
Nice ! I'm not reading all of that tho. Here is a tldr from a random ai:
A solo developer built a custom World of Warcraft (Vanilla 1.12.1) client from scratch using TypeScript and WebGL2, allowing the game to run natively inside web browsers without plugins or cloud streaming. The browser client connects to a standard vMaNGOS backend via a Node.js WebSocket bridge, handling authentication, combat, quests, inventory, and movement relative to transports. Alpha 1.0 features 584 world tiles covering levels 1–40, working audio, race skinning, weapon animations, HTML5 Canvas UI, and several dungeons. The developer plans to open-source the codebase on GitHub, requiring users to supply their own original game files for asset extraction.
-9
u/Visual-Constant-533 Aug 19 '26
AI SLOP
6
u/alinoanta21 Aug 19 '26
Fair enough if it’s not your thing. I do use AI as a development tool, but the project itself has taken months of work, reverse engineering, debugging and testing. AI can help me write and review code, but it doesn’t magically turn WoW 1.12.1 into a working browser client. Either way, thanks for checking it out.
4
u/KingOfAzmerloth Aug 19 '26
These idiots think you just prompt "make WoW run in browser" and wait 10 minutes for it to click. They never coded a single thing in their life themselves and think it's all just as simple as generating a microsite. Just ignore it. AI is a tool and if used by capable person, it can speed up the process a whole lot.
5
u/sagiroth Aug 19 '26
Thats all you do man. Show some of your impressive work
-7
u/Visual-Constant-533 Aug 19 '26
my impressive work is doing just that. and still get people like you to reply :)
3
92
u/mcergun Aug 19 '26
So many ports have popped up recently Congrats on your hard work