Quickstart
wasmCloud enables you to build polyglot applications out of reusable WebAssembly (Wasm) components and run them everywhere—across any cloud, Kubernetes, datacenter, or edge.
In this tutorial:
- We'll use the wasmCloud Shell (
wash) CLI to build a simple "Hello world" HTTP server application from a WebAssembly component—written in the language of your choice. - Along the way, we'll start a developer loop that automatically deploys our application to a local wasmCloud environment.
Install wash
First, we need to install the latest version of wash.
- macOS
- Ubuntu and Debian
- Windows
On macOS, you can use Homebrew to install wash:
brew install wasmcloud/wasmcloud/washOn Ubuntu and Debian Linux, you can use apt to install wash:
curl -s https://packagecloud.io/install/repositories/wasmcloud/core/script.deb.sh | sudo bashsudo apt install washFor the smoothest experience, we recommend that Windows users run wasmCloud with Windows Subsystem for Linux (WSL) and follow the Ubuntu/Debian instructions throughout this guide.
Microsoft provides documentation for getting started with WSL and using WSL with Visual Studio Code.
When using WSL, we recommend choosing the Ubuntu distro (wsl --install -d Ubuntu).
You may need to update git to the latest version using the Ubuntu Git Maintainers' Personal Package Archive (PPA):
sudo add-apt-repository ppa:git-core/ppasudo apt-get updatesudo apt-get install gitWhen your WSL environment is ready, you can use the standard Ubuntu/Debian installation method:
curl -s https://packagecloud.io/install/repositories/wasmcloud/core/script.deb.sh | sudo bashsudo apt install washIf you are unable to use WSL, you can find native Windows installation instructions on the Installation page, but note that native Windows support is experimental.
We support other package managers and the option to install from source. If you'd like to use a different installation method, see the Installation page.
Verify that wash is installed by running:
wash --versionChoose your language
wasmCloud supports building WebAssembly components from any language that supports the WASI 0.2 target, including Go, Rust, TypeScript, and others.
wash depends on your local language toolchain for your language of choice.
- Choose the language you would like to use.
- Install the toolchain or verify that you have the correct versions.
- Go
- Rust
- TypeScript
- My Language Isn't Listed
Install the Go toolchain
Requirements:
- Go 1.23.0+
- TinyGo (always use the latest version):
wasm-toolsv1.225.0
Due to incompatibilities introduced in wasm-tools v1.226.0 and higher, we strongly recommend using wasm-tools v1.225.0 when building Go projects. The easiest way to download wasm-tools v1.225.0 is via cargo: cargo install --locked wasm-tools@1.225.0
- macOS
- Ubuntu/Debian
On macOS, you can use Homebrew to install the Go toolchain. (See the official Go documentation for other options.)
brew install gobrew install tinygo-org/tools/tinygoYou will also need the wasm-tools utility.
On Ubuntu/Debian, Go 1.23+ isn't currently available via major package managers, but you can use curl or wget to download the Go toolchain from the official Go download page. (See the official Go documentation for other options.)
Before downloading, ensure that you do not have a previous version of Go installed. You can find an existing installation in the /usr/local/go directory.
Consult the download page and set environment variables specifying the appropriate version and architecture for your system. (The values below are examples.)
export GO_VERSION="1.23.4"export GO_ARCH="amd64"Download your file:
curl -O -L "https://golang.org/dl/go${GO_VERSION}.linux-${GO_ARCH}.tar.gz"Find the appropriate checksum value for your file on the download page and validate the file. (The example below uses the checksum value for the v1.23.4 on amd64 download.)
echo -n "6924efde5de86fe277676e929dc9917d466efa02fb934197bc2eba35d5680971 *go${GO_VERSION}.linux-${GO_ARCH}.tar.gz" | shasum -a 256 --checkExtract the file:
tar -xf "go${GO_VERSION}.linux-${GO_ARCH}.tar.gz"You may need to change ownership on the new go directory:
sudo chown -R root:root ./goFinally, move the go directory to /usr/local:
mv -v go /usr/localOn Ubuntu/Debian, you can download TinyGo similarly. Refer to the TinyGo GitHub releases page to find the correct version and architecture and set environment variables accordingly. (The values below are examples—remember to always use the latest version of TinyGo.)
export TINYGO_VERSION="0.34.0"export TINYGO_ARCH="amd64"Now download the .deb file:
curl -O -L "https://github.com/tinygo-org/tinygo/releases/download/v${TINYGO_VERSION}/tinygo_${TINYGO_VERSION}_${TINYGO_ARCH}.deb"Install TinyGo from the .deb file:
sudo dpkg -i tinygo_${TINYGO_VERSION}_${TINYGO_ARCH}.debAdd TinyGo to your PATH:
export PATH=$PATH:/usr/local/binValidate the installation:
tinygo versionYou will also need the wasm-tools utility.
For the best experience, we strongly recommend using wasm-tools v1.225.0 and installing with cargo:
cargo install --locked wasm-tools@1.225.0Otherwise, download the binary for wasm-tools v1.225.0 for your architecture and add it to your PATH.
Install the Rust toolchain
Requirements:
- The Rust toolchain (always use the latest version)
- The
wasm32-wasip2target for Rust
On macOS or Ubuntu/Debian, you can use the official install script to download rustup, which will automatically install the Rust toolchain:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shOnce you've installed the Rust toolchain, use rustup to add the wasm32-wasip2 target:
rustup target add wasm32-wasip2Install the TypeScript toolchain
Requirements:
- npm v14.17+
- TypeScript v5.6+
- macOS
- Ubuntu/Debian
On macOS, you can use Homebrew to install npm and Node.js. (See the official Node.js documentation for other options.)
brew install nodeOn Ubuntu, you can install npm (and Node.js) using the Node Version Manager (nvm). (See the official Node.js documentation for other options.) You can download and install nvm using the official installation script:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bashOnce the script completes, you may need to start a new shell session.
You can use nvm to install the latest Long-Term Service version of node:
nvm install --ltsOnce you've installed Node.js and npm, you can use npm to install TypeScript:
npm install -g typescriptIf you prefer working in a language that isn't listed here, let us know!
Create a new component
Now that we've installed wash and our language toolchain, it's time to create a new component project.
- Go
- Rust
- TypeScript
In your terminal, run:
wash new component hello --template-name hello-world-tinygoAfter a moment, wash will create a new directory called hello with all of the required project files for building a component from your chosen language.
Navigate to the hello project directory:
cd helloIn your terminal, run:
wash new component hello --template-name hello-world-rustAfter a moment, wash will create a new directory called hello with all of the required project files for building a component from your chosen language.
Navigate to the hello project directory:
cd helloIn your terminal, run:
wash new component hello --template-name hello-world-typescript
After a moment, wash will create a new directory called hello with all of the required project files for building a component from your chosen language.
Navigate to the hello project directory:
cd helloInstall the npm packages for your project:
npm installStart your developer loop
From our project directory, we'll run:
wash devThe wash dev command automatically builds your WebAssembly component and deploys it to a local wasmCloud environment. This will take a moment, and the terminal output will update you on the process. The last step should look like this:
✅ Successfully started host, logs writing to /home/.wash/dev/kSKCGi/wasmcloud.log
🚧 Building project...
...
✨ HTTP Server: Access your application at http://127.0.0.1:8000
👀 Watching for file changes (press Ctrl+c to stop)...By default, the application will run on our local port 8000. In a new terminal tab, we can curl our application:
curl localhost:8000The application should return:
Hello from <language>!You just ran a WebAssembly application in wasmCloud!
Make the application yours
Now we'll make a change to our code and see how the running application updates automatically.
- Go
- Rust
- TypeScript
- My Language Isn't Listed
Modify main.go
The Go code for our component is found in hello/main.go.
Open the file in your code editor and change the "Hello" message in the handleRequest function. You might modify the message to say hello from WebAssembly, your own name, or whatever else you like.
// Send HTTP response
func handleRequest(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello from Go!\n")
fmt.Fprintf(w, "Hello from Wasm!\n")
}Modify lib.rs
The Rust code for our component is found in hello/src/lib.rs.
Open the file in your code editor and change the "Hello" message on line 19. You might modify the message to say hello from WebAssembly, your own name, or whatever else you like.
use wasmcloud_component::http;
struct Component;
http::export!(Component);
impl http::Server for Component {
fn handle(
_request: http::IncomingRequest,
) -> http::Result<http::Response<impl http::OutgoingBody>> {
Ok(http::Response::new("Hello from Rust!\n"))
Ok(http::Response::new("Hello from Wasm!\n"))
}
}Modify http-hello-world.ts
The TypeScript code for our component is found in hello/http-hello-world.ts.
Open the file in your code editor and change the "Hello" message on line 23. You might modify the message to say hello from WebAssembly, your own name, or whatever else you like.
// Write hello world to the response stream
outputStream.blockingWriteAndFlush(
new Uint8Array(new TextEncoder().encode('Hello from Typescript!\n'))
new Uint8Array(new TextEncoder().encode('Hello from Wasm!\n'))
);If you prefer working in a language that isn't listed here, let us know!
Save the modified file. The wash dev automatically builds and deploys the updated component.
In the terminal, curl the application again:
curl localhost:8000Hello from Wasm!Next steps
We installed wash, built our first component, and ran our application locally with wash dev.
In our next tutorial, we'll add pluggable, reusable capabilities like key-value storage to our application.