State of Godot
and the Web 2025
Adam Scott
Web Team Lead
Godot Foundation
> whoami


> whoami

- Lead Web maintainer for Godot
- Full-time contractor for the Godot Foundation
My background

What is the Web platform?
What _IS_ the Web?

What _IS_ the Web?


What _IS_ the Web?
The universal virtual machine
<!DOCTYPE html>
<html lang="en">
<head>
<title>My Web Zone</title>
<link href="style.css" rel="stylesheet" />
</head>
<body>
<h1>Welcome to my Web Zone</h1>
<p>Isn't this <blink>awesome?</blink></p>
<img src="totally_rad.jpg" />
<form action="" method="post">
<fieldset>
<legend>Your favorite Web technology</legend>
<input type="radio" id="flash" />
<label for="flash">Macromedia Flash</label>
</fieldset>
</form>
<script>
console.log("I am error.");
</script>
</body>
</html>


GET
GET
Gaming on the Web platform
Little history
of games on the Web
HTML-based games

Java Applets


There was this one little game...
There's also the OTHER one.
(Yet, this one was made way later.)

Shockwave

Shockwave
HELP ME FIND
THIS GAME
PLEASE
The rise
of Flash Player



By its nature, Flash wasn't
the most secure software
... and their fall



Some tried to capitalize on the iPhone's commitment against running Flash
without great success...
The iPhone and mobile games

The iPhone and mobile games
The W3C decided to play catch-up

But there was a lot to do in 2007.
The Web platform for games... today
Web technologies have grown a lot since 2007

Web technologies have grown a lot since 2007
- The Web used to rely on third-party plugins to add interactivity
- But this introduces so many vulnerabilities.
- So it was decided that the Web needed to implement public and safe APIs to offer those features.
Web technologies have grown a lot since 2007
- History
- Speech Synthesis
- Web Monetization
- WebAssembly
- Local Storage
- Service Workers
- WebTransport
- WebRTC
- WebSocket
- Web Speech
- Web Audio
- Web Animations
- PWA Installs
- WebXR
- WebGPU
- WebGL
- Canvas
Potential of the platform
- No formal "installation" needed: just click and play!
- Setup possible to store the game temporarily on your device in order to play to the game even offline
Limitations of the platform
- Single-threaded due to security mitigations


- Side-channel attacks discovered in 2017
- Vulnerability in modern hardware design, not in software
- Affects Intel, AMD, ARM, and more.
- Whether you're on Windows, Linux, macOS, etc.
Limitations of the platform
- Those vulnerabilities limit the use of SharedArrayBuffers, which limit the use of Workers (the Web equivalent of a thread)
- At the time of Godot 4.0, we thought it would be a solvable issue, so we didn't implement single-threading.
- We realized that it wasn't the case, and implemented single-threading for 4.3.
Where are Web games published?
Self-hosted / itch.io
- Self-hosting
- Whip up your own Web server and simply put your game on it.
- Comes with all the bells and whistles that comes with the Web platform.
- itch.io
- Often used for game jams
Web game platforms
- Specialized platforms that host multiple games.
- Some are very popular and successful.
- And the word got around.







Apps also,
not only games
Web Apps are thriving
- Specialized websites that can do things that were normally reserved for desktop apps.

But there's another favorite of mine...
The Godot Engine Editor itself is a Web app.
State of Godot
for the Web platform
State of Godot for the Web platform
- Quite good, I may say!
- But there's a lot of work to be done to push the engine ever further for the platform.
State of Godot for the Web platform

320 (3 %)
State of Godot for the Web platform

4163 (38,7 %)
State of Godot for the Web platform

452 (13,3 %)
27 (0,8 %)
452 (13,3 %)
*
State of
Godot Web features
- What is currently possible
- Full Godot compatibility*
- Single threaded export
- WebAudio / Samples
- GDExtension support
State of
Godot Web features
- What is on the radar
- WebGPU
- WebTransport
- .NET / C#
What is currently possible
Full Godot compatibility*
- Nearly every feature is supported.
- *as much as we can make it work with the Web platform quirks.
- Even compatible with the XR stack via WebXR
Single-threaded exports
- Available since 4.3
- See the Web limitations slide.
- The issues it introduced made the next feature mandatory.
WebAudio/Samples
- New feature since 4.3
- The sole way to offload audio.
- It is the equivalent of having an audio thread, but it's just not directly managed by the engine.
- Pros: it runs super well, better than even on Godot 3.
- Cons: it doesn't support every feature, and bus effect plainly don't work.
GDExtension support
- It's possible to build native libraries for the Web!
- Some caveats, though:
- The same version of emscripten as the one who built the template must be used when building the extension.
- dlink must be enabled on template export.
- Thread support must match the exported template.
What is on the radar
WebTransport
- WebTransport: the follow up to the WebSocket API
- Introduces the concept of "Unreliable" transports.
- Similar to what is UDP to TCP.
- Introduces the concept of "Unreliable" transports.
- Should improve latency in multiplayer games, and more!
WebGPU
- Fresh
upcomingrendering API- Global use of 72.71% on Can I use...
- Chromium-based browsers support it out-of-the-box (except on Linux)
- Firefox Nightly has it enabled by default
- Safari Technology Preview has it enabled by default
- Global use of 72.71% on Can I use...
-
WebGPU demo
(not Godot based)

WebGPU
- Akin to the difference between OpenGL/DirectX 11 to Vulkan/DirectX 12/Metal, WebGPU allows a more direct access to the GPU compared to WebGL.
- Ultimately, this permits high-end rendering capabilities and robust general-purpose calculations.

WebGPU
- I (virtually) met with David Zhong (@davnotdev on GitHub)
- UCLA student in Computer science & engineering
- He started implementing, on his free time, WebGPU into Godot.
- Purely as a side-project.
- But thought his insight could be interesting.

WebGPU


WebGPU
- He did not try to target any browser, yet.
- As yes, WebGPU can target desktop environments too.
- Can be easier to develop at first.
- Right now, we can render the main menu + maybe simple 2D games
- But anything 3D fails

WebGPU
- The Godot rendering pipeline is really good
- Lower level than OpenGL/WebGL
- Currently, the only problems stem from features that aren't supported in WebGPU.
- Texture3DArray, CombinedImageSampled, Swizzle, PushConstants
- But those features can be either patched or they will come to WebGPU.

WebGPU
- He did not try to target any browser, yet.
- As yes, WebGPU can target desktop environments too.
- Can be easier to develop at first.
- The Godot rendering pipeline is really good
- Lower level than OpenGL/WebGL
- Currently, the only problems stem from features that aren't supported in WebGPU.

WebGPU
- He chose to go towards WGPU instead of Dawn. (as it has more extensions and he's more familiar with it)

WebGPU
- What to expect from WebGPU?
- Mobile renderer over the Forward+ renderer
- The current limits are too low to support Forward+ currently, wasn't able to run it on their computer without overriding them.
- Compute shaders would work. (didn't test them yet, though)
- Mobile renderer over the Forward+ renderer

.NET/C#
on the Web
- Complex. It's a very complex topic.
-
We tried to make it work a lot:
-
dotnet.js
- ❌
- NativeAOT-LLVM
- ❌
- Statically link Mono
- ❌
-
- We promise to get back to you as soon as possible if something changes.
.NET/C#
on the Web





.NET/C#
on the Web
- Well, finally, linking statically Mono did the trick.
- Using stubs helped!
- Prototype available
- Draft pull request incoming in a few minutes.
- There's a lot of work to do, though, so no exact "release date", but we really hope to make it for 4.5.
What's next?
Tackling
load times
Why improving load times?
- Because users are impatient, especially gamers.
- Players should be able to play as fast as possible, they shouldn't be stuck on a loading screen.
Rewrite the JavaScript glue code
Rewrite the JavaScript glue code
- Code which load exported assets and the game engine.
- Not critical per se, but could help a lot helping newcomers and game developers to better understand how the engine is loaded on a webpage.
My proposal
Async loader
My proposal
Async loader
- Currently, there's no easy way to split a .pck into multiple files.
- The .pck usually contains
THE WHOLE GAME!- This is OK for the desktop platform, as load times are practically instant.
- This means that the player loads the ending of your game even before trying it out.
- The .pck usually contains
- What if there could be a way to load on-demand assets in Godot?
- My new AsyncLoader (name subject to change) is there for exactly that.
- First, you drop a AsyncLoader node in a scene.
- Make sure to setup the loaded signal!
- Then, you declare to the AsyncLoader whatever you need in your next transition.
- First, you drop a AsyncLoader node in a scene.
My proposal
Async loader
- My new AsyncLoader (name subject to change) is there for exactly that. (cont.)
- Trigger start() on your node when you want to start to load assets.
- New OS methods to require the OS to download a file.
- This makes downloading a file asynchronously possible.
- New OS methods to require the OS to download a file.
- When ready and the files available, the loaded signal will be triggered.
- Trigger start() on your node when you want to start to load assets.
My proposal
Async loader
- My new AsyncLoader (name subject to change) is there for exactly that. (cont.)
- Transition to the next scene.
- A little bit complex, but needed in order to prevent synchronous downloads.
- This method could also be used in other contexts, such on consoles, where loading the entire game at first can take some time.
My proposal
Async loader
Optimizing the engine size
Optimizing the size of the engine
- Great blog post from Popcar titled
How to Minify Godot's Build Size (93MB -> 6.4MB exe) - Got me to think about what can be applied by the engine itself to save space.
- We cannot really strip features from the current export templates.
- What's left is compression and running
wasm-opt
.
Introducing
built-in (pre)compression
Introducing
built-in (pre)compression
- A lot of HTTP servers handle the
Accept-Encoding
andContent-Encoding
headers.- Instead of serving the "raw" file, servers can serve a compressed version to the recipient, if it can handle it.
- As it can take some time to compress-on-the-fly, servers usually serve an adjacent file when needed.
Introducing
built-in (pre)compression

Accepts "br"
index.wasm
index.wasm
index.wasm
Encoding "none"
Non-configured server
Introducing
built-in (pre)compression

Accepts "br"
index.wasm
index.wasm
index.wasm
Encoding "br"
index.wasm.br
Configured server
Introducing
built-in (pre)compression
- An upcoming PR will add new features for template developers and engine users.
- New compression option for the Web platform
- After being merged, the Web builds (including templates) files should have pre-compressed files besides them.
scons platform=web target=template_debug compress_for_servers=all
Introducing
built-in (pre)compression
- New options in the Web export menu to precompress exported files in various formats.

Introducing
built-in (pre)compression
- But now, everything relies on the HTTP server being correctly setup.
- Game developers don't always have access to the server settings.
- Introducing the decompression fallback system.
- The PR will introduce on-demand JavaScript modules containing native Zstd and Brotli decompression utilities.
- This means that the user don't have to do anything to reap the benefits of compression.
Q&A time!
Thank you!
State of the Godot and the Web 2025
By Adam Scott