What can you do with Wasm? The list keeps growing. Here are some of the best ways developers are using WebAssembly today.
When the browser began, it was just a window for displaying some text and maybe a few images. It was just a new way to distribute the same kind of documents that you might find on a coffee table, like magazines or books.
Java, JavaScript, and CSS changed all that. Just adding a bit of Turing-complete functionality was all it took, and clever programmers found ways to duplicate word processors, games, and more inside what once was a container for words and pictures sitting still.
For all the creativity, though, applications running in browsers were still slower and more resource-hungry than native code. WebAssembly was designed to fix this. The code comes precompiled, so there is no need for just-In-time anything. It’s much smaller, which shrinks bandwidth costs and network delays. It offers a low-level, general solution, so developers can deliver code to the browser without stooping to JavaScript’s level, or even needing to transpile their code.
But the story doesn’t stop there. Developers are finding ways to do more with WebAssembly than deliver animated web pages and add zip to advertisements. WebAssembly, or Wasm, is a foundational technology that has a place in tools and infrastructure up and down all the stacks. Here are some of the most intriguing recent examples we’ve found.
11 new use cases for WebAssembly
The list of clever solutions keeps growing. It began slowly, but now there are hundreds of surprising applications for WebAssembly. Maybe one of these will inspire your next project:
- Applets encore
- Speech decoding
- Modularity rules
- Wasm notebooks
- Data analysis
- Old video games
- Functions as a service
- Bigger, closer databases
- Burrowing inside databases
- Advancing intelligence
- Plugins everywhere
Applets encore
Have you ever heard someone wax nostalgic for the days when Java code would run as applets in your browser? Probably not. That native functionality never delivered and pretty much disappeared years ago. But now you can recapture the magic with CheerpJ, a version of the JVM compiled in WebAssembly. It’s like going back to the past and watching The Matrix or Good Will Hunting, but without any of the ’90s hassles like having to rewind the VHS tape before returning it.
Speech decoding
If you have any lingering notion that the browser is just for toy code, Ermine AI is a good example of how Wasm developers don’t care about such ancient limitations. The tool bundles an entire AI model for speech recognition that will run locally, presumably in between the moments when the rest of the browser code is servicing some legacy <blink>
tag. The model’s webpage warns that startup may be a bit slow because it takes time to download everything.
Modularity rules
Sure, containers are great for deploying software to servers, but what about other places? Container2Wasm is still an experiment, but it converts all your files into one Wasm blob that can run anywhere that can execute WebAssembly binaries. If the code needs help with emulation, the tool also bundles in the right x86 or RISK-V emulator.
Wasm notebooks
Many data scientists deliver their results in notebooks supported by projects like Jupyter. These bundle together code, data, and text in a way that makes it easy for any reader to also try the software. If you want to run a command or invoke a function, all you need to do is click the right button. It’s an ideal way to share software in an open and dynamic environment that engages the reader.
Notebook configuration typically relies on a server for computation. From an admin perspective, this means setting it up and making sure it’s running Python. Now, Wasm-powered toolkits such as Marimo and Sphinx make the job even easier by letting you run the Python code directly in the browser. All you need is a Wasm version of Python, Pyodide. Configuring the server is much easier, and there’s no need to handle everyone’s computation for them.
Data analysis
Something else data scientists like to do is to use R to analyze their data, and then use tools like Sweve to format it. Normally that means installing R on your local machine or a server. Now Wasm-based tools like WebR and R-universe turn that R code into Wasm directly, so it will run right in the browser. Anyone reading your analysis can run your R code without installing the language or needing to ensure the right version is available.
Old video games
Everyone remembers the games of their misspent youth. The good news is, you can still lose entire weekends playing these classics, all without the hassle of trying to recompile old C or Pascal code. Projects like Wasm-4 ensure that all your old favorite flight simulators and adventure games live on, right in your browser. Who doesn’t love two-dimensional realms drawn with 8-bit or wireframe graphics?
Functions as a service
Many of the major cloud services that support microservices and so-called serverless solutions are naturally interested in supporting Wasm. It’s an ideal way to package a small amount of code that can start up quickly because it’s close to fully compiled. Cloud providers like Fermyon, Cloudflare, and Wasmer support WebAssembly modules in a variety of ways. Other providers are bundling the modules with tools like WasmEdge and running them using features of the Node runtime to fire up WebAssembly code.
Bigger, closer databases
In the traditional model, the database is a sacred process running in a separate machine—preferably in its own protected virtual space in some armored co-lo. That may still be reality as we know it, but developers are starting to wonder differently. Why not just shoehorn a complete, feature-rich database into a browser so the code can use all the features? Sure, the W3 gave us key-value systems like the WebStorage API or faster, deeper models like IndexedDB, but both are limited. Projects like PGLite, DuckDB, and SQLite 3 are ready to store much bigger collections of data and analyze them with a far greater range of SQL functions. They’re faster and also offer lower-level APIs so you can link them to other Wasm projects.
Burrowing inside databases
Wasm is not just a delivery mechanism for adding larger, more capable databases to your web pages. Some developers are inverting this vision and embedding Wasm code inside databases to add user-defined functions (UDF). SingleStore, for instance, lets developers add both UDFs and their cousins, table-valued functions. Other data streaming tools like InfinyOn and Redpanda let you transform the information with Wasm functions as it flows through the system. Wasm may end up being the dominant format for embedding new computational abilities wherever data is stored.
Advancing intelligence
While WebAssembly may not be a natural fit for embedding deeply inside the LLMs or neural networks that are part of generative AI, that doesn’t mean it lacks a place in the stack. WasmEdge, for instance, has two plugin systems for TensorFlow (here and here) and one for PyTorch, so your code can interact neatly with the AI computations. Dylibso has experimented with connecting AIs like ChatGPT with Extism modules. In other words, Wasm could be the tool you need for gluing together your code with AIs.
Plugins everywhere
WebAssembly isn’t just for databases or AIs. Many software packages want to make it easy for end users to add a bit of functionality to extend the default feature set. That means developing an API that enables new code to mix with old code without introducing security holes or destroying efficiency. Wasm turns out to be a pretty good system for doing this because it was designed to do more or less the same thing with web pages. It’s got security, brevity, and efficiency pretty well engineered.
Many software packages are already offering this. A quick skim finds them all over the place from Apache projects to Zendesk data migration. Programmers are relying on base tools like Extism to support all the major languages and some that aren’t so common with SDKs and PDK libraries. Wasmi is another option that focuses on constrained or embedded systems. When it comes time to generate the bindings, programmers turn to fp-bindgen, wasm-bindgen, or wit-bindgen to do the scut work.
Conclusion
Is there a limit to what you can do with WebAssembly? Not really. That’s pretty much the point. Wasm opens doors so that users can get what they want from software. It’s modularity made fast, powerful, and omnipresent.