<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Seoul Rust</title>
    <link rel="self" type="application/atom+xml" href="https://seoul.rs/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://seoul.rs"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-04-12T00:00:00+00:00</updated>
    <id>https://seoul.rs/atom.xml</id>
    <entry xml:lang="en">
        <title>Find us on Matrix</title>
        <published>2026-04-12T00:00:00+00:00</published>
        <updated>2026-04-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              seoul.rs user
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://seoul.rs/news/find-us-on-matrix/"/>
        <id>https://seoul.rs/news/find-us-on-matrix/</id>
        
        <content type="html" xml:base="https://seoul.rs/news/find-us-on-matrix/">&lt;p&gt;As the Seoul Rust meetup, we try to provide an inclusive space for Rustaceans to gather.
Our regular meetups are one part of that mission, but we also provide an online chat space
to discuss Rust, among other things.&lt;&#x2F;p&gt;
&lt;p&gt;Over the last few months, we received several reports of new members being unable to join the conversation on Telegram.
Telegram recently started requiring most new members in many countries, including South Korea,
to pay for a Telegram Premium subscription in order to activate an account.
Since Telegram is not widely used in South Korea, this has been a huge barrier to building a welcoming community.&lt;&#x2F;p&gt;
&lt;p&gt;With this in mind, we have decided to create a room on Matrix, a decentralized chat system.
It is federated, much like Mastodon, giving users the ability to choose whichever server they like.
Though we recommend most new users simply try out the public matrix.org server,
which is run by the Matrix Foundation.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;how-to-get-started&quot;&gt;How to get started&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;1-get-a-matrix-client&quot;&gt;1. Get a Matrix client&lt;&#x2F;h2&gt;
&lt;p&gt;There are &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;matrix.org&#x2F;ecosystem&#x2F;clients&#x2F;&quot;&gt;dozens of apps&lt;&#x2F;a&gt; which let you chat on Matrix.
It’s a bit overwhelming, so here are the ones we recommend to get started.
(You can always try another app later.)&lt;&#x2F;p&gt;
&lt;h3 id=&quot;element-x-ios-and-android&quot;&gt;Element X (iOS and Android)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;matrix.org&#x2F;ecosystem&#x2F;clients&#x2F;element-x&#x2F;&quot;&gt;Element X&lt;&#x2F;a&gt; provides a well-polished user experience and is our first recommendation for mobile users.
If you look around at client comparisons, you’ll often see claims that Element X does not support some features.
The most commonly referenced one is “spaces” (a way of grouping “rooms”, much like a Discord server).
This is no longer correct, so don’t hesitate to try Element X.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;element-desktop-linux-macos-windows-and-web&quot;&gt;Element Desktop (Linux, macOS, Windows, and Web)&lt;&#x2F;h3&gt;
&lt;p&gt;Also from Element, &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;matrix.org&#x2F;ecosystem&#x2F;clients&#x2F;element&#x2F;&quot;&gt;Element Desktop&lt;&#x2F;a&gt; has a similar UX to Element X and other chat apps.
This also works on the web, so you can try it out without installing anything.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-create-an-account&quot;&gt;2. Create an account&lt;&#x2F;h2&gt;
&lt;p&gt;During the app setup, you will be prompted to set up an account.
Choose the matrix.org homeserver and follow the steps.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-join-the-room&quot;&gt;3. Join the room&lt;&#x2F;h2&gt;
&lt;p&gt;You should be able to join the room by clicking &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;matrix.to&#x2F;#&#x2F;#rust-seoul:matrix.org&quot;&gt;this link&lt;&#x2F;a&gt;.
You can also manually join &lt;code&gt;#rust-seoul:matrix.org&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;what-s-happening-to-the-telegram-channel&quot;&gt;What’s happening to the Telegram channel?&lt;&#x2F;h1&gt;
&lt;p&gt;We consider Matrix to be our primary live chat platform going forward.
However, we’ll keep our Telegram channel active indefinitely.&lt;&#x2F;p&gt;
&lt;p&gt;We have set up a bridge, which ensures that messages are synced between both platforms.
Note that some features do not work across the bridge.
For example, at the time of this writing, reactions to don carry over.
But basic messaging, replies, and images are all synced.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>[WIP][LRW] 3. WASM Meets the Web (feat. Web Browsers)</title>
        <published>2026-03-19T00:00:00+00:00</published>
        <updated>2026-03-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              seoul.rs user
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-ch3/"/>
        <id>https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-ch3/</id>
        
        <content type="html" xml:base="https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-ch3/">&lt;p&gt;The &lt;a href=&quot;..&#x2F;lrw-ch1#code_hello_world&quot;&gt;pub hello_world()&lt;&#x2F;a&gt; function implemented in the previous chapter is a very basic Rust function that returns the string “Hello Word”. Rust itself does not require a separate runtime environment. However, compiled Wasm binaries are designed to run on a &lt;strong&gt;Wasm runtime&lt;&#x2F;strong&gt;, and can communicate with the outside world only through that environment.&lt;&#x2F;p&gt;
&lt;p&gt;Therefore, in addition to Rust’s standard library, &lt;strong&gt;an additional library(e.g., wasm-bindgen)&lt;&#x2F;strong&gt; is required to bridge the interface with the execution environment. In a web browser — one of the primary execution environments for Wasm — actual functionality is achieved by accessing browser APIs through the JavaScript engine.&lt;&#x2F;p&gt;
&lt;p&gt;We will explore how to communicate with the JavaScript engine from your Rust-based WASM file using wasm-bindgen, and further examine how to pass results produced within a Wasm module to users by leveraging browser APIs. We will also cover how to use wasm-pack to create an efficient and integrated development environment. Following these stages, we will dive deeper into wasm_bindgen_futures to handle Rust’s asynchronous programming style alongside JavaScript’s Promise-based approach. Finally, we will look over web-sys and js-sys—the crates you will use most often to implement real-world apps with minimal JavaScript glue code, even though your Wasm code still accesses the browser DOM through the JavaScript world.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-wasm-bindgen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-wasm-bindgen&quot; aria-label=&quot;Anchor link for: 1-wasm-bindgen&quot;&gt;🔗&lt;&#x2F;a&gt;1. Wasm-bindgen&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wasm-bindgen&#x2F;wasm-bindgen&quot;&gt;Wasm-bindgen&lt;&#x2F;a&gt; bridges Wasm modules and the JavaScript engine within your web browser.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;1-1-wasm-file-with-wasm-bindgen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-1-wasm-file-with-wasm-bindgen&quot; aria-label=&quot;Anchor link for: 1-1-wasm-file-with-wasm-bindgen&quot;&gt;🔗&lt;&#x2F;a&gt;1.1 Wasm file with &lt;strong&gt;wasm_bindgen&lt;&#x2F;strong&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;New project with &lt;strong&gt;Cargo&lt;&#x2F;strong&gt; command&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;&amp;gt; cargo new --lib hello-world
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Let’s replace the contents of &lt;strong&gt;Cargo.toml&lt;&#x2F;strong&gt; and &lt;strong&gt;src&#x2F;lib.rs&lt;&#x2F;strong&gt; with the following code.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;span id=&quot;code_cargo_toml&quot;&gt;&lt;&#x2F;span&gt;&lt;code&gt;Cargo.toml&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;toml&quot;&gt;[package]
name = &amp;quot;hello-wasm&amp;quot;
version = &amp;quot;0.1.0&amp;quot;
edition = &amp;quot;2024&amp;quot;

[lib]
crate-type = [&amp;quot;cdylib&amp;quot;]

[dependencies]
chrono = &amp;quot;0.4&amp;quot;
wasm-bindgen = &amp;quot;0.2&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The difference from the previous &lt;strong&gt;Cargo.toml&lt;&#x2F;strong&gt; is that &lt;strong&gt;chrono&lt;&#x2F;strong&gt; and &lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt; have been added to the dependencies. We use &lt;strong&gt;chrono&lt;&#x2F;strong&gt; to implement logic for fetching the current time, and &lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt; is the core library that enables communication between the Rust-built Wasm module and the JavaScript runtime.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;span id=&quot;code_src_lib_rs&quot;&gt;&lt;&#x2F;span&gt;&lt;code&gt;src&#x2F;lib.rs&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;rust&quot;&gt;use chrono::Local;
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
  extern &amp;quot;C&amp;quot; {
      fn alert(s: &amp;amp;str);
  }

#[wasm_bindgen]
  pub fn now() -&amp;gt; String {
      Local::now().to_rfc3339()
  }

#[wasm_bindgen]
  pub fn pop_message(msg: &amp;amp;str) {
      alert(msg)
  }

#[wasm_bindgen]
  pub fn add(a: f64, b: f64) -&amp;gt; f64 {
      a + b
  }
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Functions annotated with the &lt;strong&gt;#[wasm_bindgen]&lt;&#x2F;strong&gt; attribute macro are intended to be called from JavaScript. You can see the &lt;strong&gt;now()&lt;&#x2F;strong&gt; function for returning the current time, &lt;strong&gt;pop_message(&amp;amp;str)&lt;&#x2F;strong&gt; for triggering a JavaScript &lt;strong&gt;alert()&lt;&#x2F;strong&gt;, and &lt;strong&gt;add(f64, f64)&lt;&#x2F;strong&gt; for performing addition.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Generating WASM file&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;❯ cargo build --release --target wasm32-unknown-unknown
  Finished `release` profile [optimized] target(s) in 0.16s
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You should see &lt;code&gt;target&#x2F;wasm32-unknown-unknown&#x2F;release&#x2F;hello_wasm.wasm&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;1-2-creating-java-type-script-files-with-wasm-bindgen&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-2-creating-java-type-script-files-with-wasm-bindgen&quot; aria-label=&quot;Anchor link for: 1-2-creating-java-type-script-files-with-wasm-bindgen&quot;&gt;🔗&lt;&#x2F;a&gt;1.2. Creating Java(Type)Script files with wasm-bindgen&lt;&#x2F;h4&gt;
&lt;p&gt;&lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt; serves as both a Rust crate and a CLI tool. As a crate, it handles the interoperability between the Wasm modules generated by the compiler and JavaScript. As a CLI tool, it automatically generates the necessary bindings and glue code, allowing you to seamlessly call your Wasm functions from JavaScript or TypeScript.&lt;&#x2F;p&gt;
&lt;p&gt;Installation&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; cargo binstall wasm-bindgen-cli
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Alternatively, you can clone the code directly from the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wasm-bindgen&#x2F;wasm-bindgen&quot;&gt;wasm-bindgen repository&lt;&#x2F;a&gt; and build it yourself (which is the approach I personally prefer).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;&amp;gt; git clone --depth 1 https:&#x2F;&#x2F;github.com&#x2F;wasm-bindgen&#x2F;wasm-bindgen.git &amp;amp;&amp;amp; cd wasm-bindgen
&amp;gt; cargo build --release --package wasm-bindgen-cli
&amp;gt; install -s -Dm755 target&#x2F;release&#x2F;wasm-bindgen -t ~&#x2F;.cargo&#x2F;bin
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, let’s use the &lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt; command to generate the JavaScript(and&#x2F;or TypeScript) bindings that will allow your browser to interface with the Wasm file we built earlier.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; wasm-bindgen .&#x2F;target&#x2F;wasm32-unknown-unknown&#x2F;release&#x2F;hello_wasm.wasm --target web --out-dir .&#x2F;pkg
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Set &lt;code&gt;--target&lt;&#x2F;code&gt; to &lt;code&gt;web&lt;&#x2F;code&gt; and &lt;code&gt;--out-dir&lt;&#x2F;code&gt; to &lt;code&gt;.&#x2F;pkg&lt;&#x2F;code&gt;. The output will be generated in the &lt;code&gt;pkg&lt;&#x2F;code&gt; directory.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;❯ eza --tree pkg&#x2F;
pkg
├── hello_wasm.d.ts
├── hello_wasm.js
├── hello_wasm_bg.wasm
└── hello_wasm_bg.wasm.d.ts
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you open &lt;strong&gt;pkg&#x2F;hello_wasm.js&lt;&#x2F;strong&gt;, you will find the exported Wasm functions ready to be called directly from JavaScript. A major benefit of using &lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt; is that developers don’t have to manually redefine function interfaces for JavaScript interoperability; the tool automatically generates all the complex glue code for you.&lt;&#x2F;p&gt;
&lt;p&gt;Now, it’s time to create the &lt;strong&gt;index.html&lt;&#x2F;strong&gt; file to see it in action. Create &lt;strong&gt;index.html&lt;&#x2F;strong&gt; in the project root, the same directory where your &lt;strong&gt;Cargo.toml&lt;&#x2F;strong&gt; is located.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;span id=&quot;index_html&quot;&gt;&lt;&#x2F;span&gt;&lt;code&gt;index.html&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;The Little Rust and Wasm Guide&amp;lt;&#x2F;title&amp;gt;
  &amp;lt;&#x2F;head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;
      import init, {now, pop_message}
      from &amp;#39;.&#x2F;pkg&#x2F;hello_wasm.js&amp;#39;;

      async function run() {
        await init();
        pop_message(&amp;quot;Current time is &amp;quot; + now());
      }

      run();
    &amp;lt;&#x2F;script&amp;gt;

    &amp;lt;h1&amp;gt;The Little Rust and Wasm Guide&amp;lt;&#x2F;h1&amp;gt;
    &amp;lt;form id=&amp;quot;sumForm&amp;quot;&amp;gt;
      &amp;lt;input type=&amp;quot;number&amp;quot; id=&amp;quot;num1&amp;quot; placeholder=&amp;quot;First number&amp;quot; required&amp;gt;
      &amp;lt;input type=&amp;quot;number&amp;quot; id=&amp;quot;num2&amp;quot; placeholder=&amp;quot;Second number&amp;quot; required&amp;gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Add&amp;lt;&#x2F;button&amp;gt;
    &amp;lt;&#x2F;form&amp;gt;

    &amp;lt;p&amp;gt;Result: &amp;lt;span id=&amp;quot;result&amp;quot;&amp;gt;0&amp;lt;&#x2F;span&amp;gt;&amp;lt;&#x2F;p&amp;gt;

  &amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;
   import init, { add }
      from &amp;#39;.&#x2F;pkg&#x2F;hello_wasm.js&amp;#39;;

    const form = document.getElementById(&amp;#39;sumForm&amp;#39;);
    const resultDisplay = document.getElementById(&amp;#39;result&amp;#39;);

    form.addEventListener(&amp;#39;submit&amp;#39;, (event) =&amp;gt; {
      event.preventDefault();
      const val1 = document.getElementById(&amp;#39;num1&amp;#39;).value;
      const val2 = document.getElementById(&amp;#39;num2&amp;#39;).value;

      const sum = add(val1, val2);

      resultDisplay.textContent = sum;
    }
    );
  &amp;lt;&#x2F;script&amp;gt;

  &amp;lt;&#x2F;body&amp;gt;
&amp;lt;&#x2F;html&amp;gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;span id=&quot;serve_html&quot;&gt;&lt;&#x2F;span&gt;`
Now, let’s serve the HTML, JavaScript, and Wasm files we created using &lt;strong&gt;miniserve&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; miniserve -p 9099 --index index.html .
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Open your web browser and navigate to http:&#x2F;&#x2F;localhost:9099.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;blog&#x2F;the-little-rust-and-wasm-guide&#x2F;ch3-miniserve.png&quot; alt=&quot;Browser result&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;What is `miniserve`?  
Miniserve: a CLI tool to serve files and dirs over HTTP  
https:&#x2F;&#x2F;github.com&#x2F;svenstaro&#x2F;miniserve
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;2-wasm-pack&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-wasm-pack&quot; aria-label=&quot;Anchor link for: 2-wasm-pack&quot;&gt;🔗&lt;&#x2F;a&gt;2. wasm-pack&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;drager&#x2F;wasm-pack&quot;&gt;wasm-pack&lt;&#x2F;a&gt; streamlines the development process by integrating various commands like &lt;strong&gt;cargo&lt;&#x2F;strong&gt; and ****&lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt; into a single tool. If you use &lt;strong&gt;wasm-pack&lt;&#x2F;strong&gt;, there’s no need to install &lt;strong&gt;wasm-bindgen-cli&lt;&#x2F;strong&gt; separately, as it handles the underlying environment for you.“&lt;&#x2F;p&gt;
&lt;h4 id=&quot;2-1-installation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-1-installation&quot; aria-label=&quot;Anchor link for: 2-1-installation&quot;&gt;🔗&lt;&#x2F;a&gt;2.1 Installation&lt;&#x2F;h4&gt;
&lt;p&gt;You can install wasm-pack using the official &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;drager.github.io&#x2F;wasm-pack&#x2F;installer&#x2F;&quot;&gt;installer&lt;&#x2F;a&gt;. Alternatively, you can build it from source if you prefer.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;&amp;gt; git clone --depth 1 https:&#x2F;&#x2F;github.com&#x2F;drager&#x2F;wasm-pack.git &amp;amp;&amp;amp; cd wasm-pack
&amp;gt; cargo build --release
&amp;gt; install -s -Dm755 target&#x2F;release&#x2F;wasm-pack -t ~&#x2F;.cargo&#x2F;bin
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once installed, you can view the usage instructions using the &lt;code&gt;help&lt;&#x2F;code&gt; command.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;❯ wasm-pack help
📦 ✨  pack and publish your wasm!

Usage: wasm-pack [OPTIONS] &amp;lt;COMMAND&amp;gt;

Commands:
  build    🏗️  build your npm package!
  pack     🍱  create a tar of your npm package but don&amp;#39;t publish!
  new      🐑 create a new project with a template
  publish  🎆  pack up your npm package and publish!
  login    👤  Add an npm registry user account! (aliases: adduser, add-user)
  test     👩‍🔬  test your wasm!
  help     Print this message or the help of the given subcommand(s)

Options:
  -v, --verbose...             Log verbosity is based off the number of v used
  -q, --quiet                  No output printed to stdout
      --log-level &amp;lt;LOG_LEVEL&amp;gt;  The maximum level of messages that should be logged by wasm-pack. [possible values: info, warn, error] [default: info]
  -h, --help                   Print help
  -V, --version                Print version
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;2-2-create-your-project-with-wasm-pack&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-2-create-your-project-with-wasm-pack&quot; aria-label=&quot;Anchor link for: 2-2-create-your-project-with-wasm-pack&quot;&gt;🔗&lt;&#x2F;a&gt;2.2. Create your project with “wasm-pack”&lt;&#x2F;h4&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;❯ wasm-pack new hello-wasm
[INFO]: ⬇️  Installing cargo-generate...
🐑  Generating a new rustwasm project with name &amp;#39;hello-wasm&amp;#39;...
🔧   Destination: &#x2F;tmp&#x2F;hello-wasm ...
🔧   project-name: hello-wasm ...
🔧   Generating template ...
[ 1&#x2F;14]   Done: .appveyor.yml
[ 2&#x2F;14]   Done: .github&#x2F;dependabot.yml
[ 3&#x2F;14]   Done: .github
[ 4&#x2F;14]   Done: .gitignore
[ 5&#x2F;14]   Done: .travis.yml
[ 6&#x2F;14]   Done: Cargo.toml
[ 7&#x2F;14]   Done: LICENSE_APACHE
[ 8&#x2F;14]   Done: LICENSE_MIT
[ 9&#x2F;14]   Done: README.md
[10&#x2F;14]   Done: src&#x2F;lib.rs
[11&#x2F;14]   Done: src&#x2F;utils.rs
[12&#x2F;14]   Done: src
[13&#x2F;14]   Done: tests&#x2F;web.rs
[14&#x2F;14]   Done: tests
🔧   Moving generated files into: `&#x2F;tmp&#x2F;hello-wasm`...
🔧   Initializing a fresh Git repository
✨   Done! New project created &#x2F;tmp&#x2F;hello-wasm
[INFO]: 🐑 Generated new project at &#x2F;hello-wasm
&amp;gt; 
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Generated project structure&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;❯ eza --tree hello-wasm
hello-wasm
├── Cargo.toml
├── LICENSE_APACHE
├── LICENSE_MIT
├── README.md
├── src
│   ├── lib.rs
│   └── utils.rs
└── tests
    └── web.rs
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;2-3-code&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-3-code&quot; aria-label=&quot;Anchor link for: 2-3-code&quot;&gt;🔗&lt;&#x2F;a&gt;2.3 Code&lt;&#x2F;h4&gt;
&lt;p&gt;We will use the same &lt;a href=&quot;https:&#x2F;&#x2F;seoul.rs&#x2F;blog&#x2F;the-little-rust-and-wasm-guide&#x2F;lrw-ch3&#x2F;#code_cargo_toml&quot;&gt;Cargo.toml&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;seoul.rs&#x2F;blog&#x2F;the-little-rust-and-wasm-guide&#x2F;lrw-ch3&#x2F;#code_src_lib_rs&quot;&gt;src&#x2F;lib.rs&lt;&#x2F;a&gt; files created in the previous &lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt; example.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;2-4-build&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-4-build&quot; aria-label=&quot;Anchor link for: 2-4-build&quot;&gt;🔗&lt;&#x2F;a&gt;2.4 Build&lt;&#x2F;h4&gt;
&lt;p&gt;Let’s perform the build using &lt;strong&gt;wasm-pack&lt;&#x2F;strong&gt;. By setting the &lt;strong&gt;–target&lt;&#x2F;strong&gt; to &lt;strong&gt;web&lt;&#x2F;strong&gt;, the generated files will be placed in the default &lt;strong&gt;.&#x2F;pkg&lt;&#x2F;strong&gt; directory. Unlike using &lt;strong&gt;wasm-bindgen directly&lt;&#x2F;strong&gt;, there is no need to manually build the Wasm file with &lt;strong&gt;cargo&lt;&#x2F;strong&gt; beforehand; &lt;strong&gt;wasm-pack&lt;&#x2F;strong&gt; automatically handles both the Wasm compilation and the generation of JavaScript (and TypeScript) bindings in a single step&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; wasm-pack build --target web
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Generated files in ‘pkg’ folder after the build&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;❯ eza --tree pkg&#x2F;
pkg
├── hello_wasm.d.ts
├── hello_wasm.js
├── hello_wasm_bg.js
├── hello_wasm_bg.wasm
├── hello_wasm_bg.wasm.d.ts
├── package.json
└── README.md
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;2-5-calling-from-html-and-viewing-the-results&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-5-calling-from-html-and-viewing-the-results&quot; aria-label=&quot;Anchor link for: 2-5-calling-from-html-and-viewing-the-results&quot;&gt;🔗&lt;&#x2F;a&gt;2.5 Calling from HTML and Viewing the Results&lt;&#x2F;h4&gt;
&lt;p&gt;Create &lt;a href=&quot;https:&#x2F;&#x2F;seoul.rs&#x2F;blog&#x2F;the-little-rust-and-wasm-guide&#x2F;lrw-ch3&#x2F;#index_html&quot;&gt;index.html&lt;&#x2F;a&gt; with the same index.html file we created at &lt;strong&gt;wasm_bindgen&lt;&#x2F;strong&gt; example. Then &lt;a href=&quot;https:&#x2F;&#x2F;seoul.rs&#x2F;blog&#x2F;the-little-rust-and-wasm-guide&#x2F;lrw-ch3&#x2F;#serve_html&quot;&gt;check the result on your web browser&lt;&#x2F;a&gt; .&lt;&#x2F;p&gt;
&lt;p&gt;You should see the same results as we did with &lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt;. By integrating the tasks previously handled separately by &lt;strong&gt;Cargo&lt;&#x2F;strong&gt; and &lt;strong&gt;wasm-bindgen&lt;&#x2F;strong&gt;, &lt;strong&gt;wasm-pack&lt;&#x2F;strong&gt; significantly improves development efficiency.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-wasm-bindgen-futures&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-wasm-bindgen-futures&quot; aria-label=&quot;Anchor link for: 3-wasm-bindgen-futures&quot;&gt;🔗&lt;&#x2F;a&gt;3. wasm_bindgen_futures&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;wasm-bindgen-futures&quot;&gt;wasm_bindgen_futures&lt;&#x2F;a&gt; bridges the gap between JavaScript Promises and Rust Futures.&lt;&#x2F;p&gt;
&lt;p&gt;To demonstrate this, let’s build an example that fetches the current temperatures of Seoul, New York, and Berlin using the &lt;strong&gt;reqwest&lt;&#x2F;strong&gt; crate and the Open-Meteo API, then displays them in the browser.“&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Cargo.toml&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;toml&quot;&gt;[package]
name = &amp;quot;hello-wasm&amp;quot;
version = &amp;quot;0.1.0&amp;quot;
edition = &amp;quot;2024&amp;quot;

[lib]
crate-type = [&amp;quot;cdylib&amp;quot;]

[dependencies]
reqwest = &amp;quot;0.13.2&amp;quot;
wasm-bindgen = &amp;quot;0.2.114&amp;quot;
wasm-bindgen-futures = &amp;quot;0.4.64&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;src&#x2F;lib.rs&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;rust&quot;&gt;use reqwest::{self, StatusCode};
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub async fn get_http(url: String) -&amp;gt; Result&amp;lt;String, JsError&amp;gt; {
    let client = reqwest::Client::new();

    let res = client
        .get(&amp;amp;url)
        .send() 
        .await
        .map_err(|e| JsError::new(&amp;amp;format!(&amp;quot;Request failed: {}&amp;quot;, e)))?;

    if res.status() == StatusCode::OK {
        let text = res
            .text()
            .await
            .map_err(|e| JsError::new(&amp;amp;format!(&amp;quot;Text parse failed: {}&amp;quot;, e)))?;
        return Ok(text);
    }

    Err(JsError::new(&amp;amp;format!(&amp;quot;HTTP Error: {}&amp;quot;, res.status())))
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;index.html&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;The Little Rust and Wasm Guide&amp;lt;&#x2F;title&amp;gt;
  &amp;lt;&#x2F;head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt; 
      import init, {get_http}
      from &amp;#39;.&#x2F;pkg&#x2F;hello_wasm.js&amp;#39;;

      const cities = [
      { name: &amp;quot;Seoul&amp;quot;, url: &amp;quot;https:&#x2F;&#x2F;api.open-meteo.com&#x2F;v1&#x2F;forecast?latitude=37.566&amp;amp;longitude=126.9784&amp;amp;current=temperature_2m&amp;amp;timezone=Asia%2FTokyo&amp;quot;},
      { name: &amp;quot;NewYork&amp;quot;, url: &amp;quot;https:&#x2F;&#x2F;api.open-meteo.com&#x2F;v1&#x2F;forecast?latitude=40.7143&amp;amp;longitude=-74.006&amp;amp;current=temperature_2m&amp;amp;timezone=Asia%2FTokyo&amp;quot;},
      { name: &amp;quot;Berlin&amp;quot;, url: &amp;quot;https:&#x2F;&#x2F;api.open-meteo.com&#x2F;v1&#x2F;forecast?latitude=52.5244&amp;amp;longitude=13.4105&amp;amp;current=temperature_2m&amp;amp;timezone=Asia%2FTokyo&amp;quot;},
      ]

      async function run() {
        await init();
        for (const city of cities) {
          try {
            const weather = JSON.parse(await get_http(city.url));
            const temp = weather.current.temperature_2m;
            const unit = weather.current_units.temperature_2m;
            document.getElementById(city.name).innerText = `${temp}${unit}`;
          } catch (err) {
            console.error(&amp;quot;Rust Error:&amp;quot;, err);
          }
        }
      }

      run();
    &amp;lt;&#x2F;script&amp;gt;

    &amp;lt;h1&amp;gt;The Little Rust and Wasm Guide&amp;lt;&#x2F;h1&amp;gt;

    &amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;Seoul: &amp;lt;span id=&amp;quot;Seoul&amp;quot;&amp;gt;Loading...&amp;lt;&#x2F;span&amp;gt;&amp;lt;&#x2F;li&amp;gt;
    &amp;lt;li&amp;gt;New York: &amp;lt;span id=&amp;quot;NewYork&amp;quot;&amp;gt;Loading...&amp;lt;&#x2F;span&amp;gt;&amp;lt;&#x2F;li&amp;gt;
    &amp;lt;li&amp;gt;Berlin: &amp;lt;span id=&amp;quot;Berlin&amp;quot;&amp;gt;Loading...&amp;lt;&#x2F;span&amp;gt;&amp;lt;&#x2F;li&amp;gt;
    &amp;lt;&#x2F;ul&amp;gt;

  &amp;lt;&#x2F;body&amp;gt;
&amp;lt;&#x2F;html&amp;gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Open your web browser and navigate to http:&#x2F;&#x2F;localhost:9099.&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
&lt;img src=&quot;&#x2F;images&#x2F;blog&#x2F;the-little-rust-and-wasm-guide&#x2F;ch3-weather-result.png&quot; alt=&quot;Browser result&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>[WIP][LRW] 1. Build your first WASM</title>
        <published>2026-03-15T00:00:00+00:00</published>
        <updated>2026-03-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              seoul.rs user
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-ch1/"/>
        <id>https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-ch1/</id>
        
        <content type="html" xml:base="https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-ch1/">&lt;p&gt;&lt;strong&gt;Code First.&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
A wise man once said, &lt;em&gt;‘Talk is cheap. Show me the code.’&lt;&#x2F;em&gt;&lt;br &#x2F;&gt;
Keep Calm and Code On.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-check-your-rust-compiler-can-handle-wasm-build&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-check-your-rust-compiler-can-handle-wasm-build&quot; aria-label=&quot;Anchor link for: 1-check-your-rust-compiler-can-handle-wasm-build&quot;&gt;🔗&lt;&#x2F;a&gt;1. Check your Rust compiler can handle WASM build&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;      ❯ rustc --print target-list | grep wasm
      wasm32-unknown-emscripten
      wasm32-unknown-unknown
      wasm32-wali-linux-musl
      wasm32-wasip1
      wasm32-wasip1-threads
      wasm32-wasip2
      wasm32-wasip3
      wasm32v1-none
      wasm64-unknown-unknown
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you don’t see the wasm32-unknown-unknown entry in the list, it means you aren’t ready to compile WASM files yet.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;  wasm32-unknown-unkown means  
  wasm32: Indicates that the target CPU architecture is 32-bit WebAssembly.  
  unknown(Vendor): Signifies that no specific vendor (manufacturer) is defined for producing or distributing this binary.
  unknown(OS&#x2F;ABI): Signifies that the target operating system or System Interface(ABI) is not defined.  
  Taken together, it refers to a &amp;quot;pure&amp;quot; 32-bit WebAssembly binary that can run anywhere, free from specific OS or hardware constraints.  

  Examples of Other Targets  
  x86_64-unknown-linux-gnu: Targets the 64-bit environment of the x86 architecture and is not limited to a specific vendor. It requires the Linux operating system and the GNU C library (glibc). This is the standard target used when compiling Linux C code.  
  aarch64-apple-darwin: Targets the aarch64 (Apple Silicon) architecture and is dependent on Apple devices and the Darwin OS&#x2F;runtime.  
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Installing &lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt; build target&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;  &amp;gt; rustup target add wasm32-unknown-unknown
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once the installation is complete, run the &lt;code&gt;rustc --print target-list&lt;&#x2F;code&gt; command again to verify that the &lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt; target has been successfully added to the list.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-code-hello-world&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-code-hello-world&quot; aria-label=&quot;Anchor link for: 2-code-hello-world&quot;&gt;🔗&lt;&#x2F;a&gt;2. Code Hello World&lt;&#x2F;h3&gt;
&lt;p&gt;Creating a hello-world project using Cargo&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;     ❯ cargo new --lib hello-world
     Creating library `hello-world` package
     note: see more `Cargo.toml` keys and their definitions at https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;cargo&#x2F;reference&#x2F;manifest.html
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The command &lt;code&gt;cargo new hello-wasm --lib&lt;&#x2F;code&gt; creates the following directory structure:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;  ❯ eza --tree hello-world
  hello-world
  ├── Cargo.toml
  └── src
  └── lib.rs
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;What is `eza`?
eza는 기존의 ls 명령어를 현대적으로 재해석하여 대체하기 위한 도구이다. Rust 언어로 작성되어 매우 빠른 속도를 자랑하며, 사용자에게 더 직관적이고 풍부한 정보를 제공한다. You can find more at eza.rocks(https:&#x2F;&#x2F;eza.rocks) site.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Generating a WASM binary requires adding a [lib] section and configuring the crate-type in Cargo.toml.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;toml&quot;&gt;[lib]
crate-type = [&amp;quot;cdylib&amp;quot;]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Completed &lt;code&gt;Cargo.toml&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;toml&quot;&gt;[package]
name = &amp;quot;hello-world&amp;quot;
version = &amp;quot;0.1.0&amp;quot;
edition = &amp;quot;2024&amp;quot;

[lib]
crate-type = [&amp;quot;cdylib&amp;quot;]

[dependencies]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Write the contents of &lt;code&gt;src&#x2F;lib.rs&lt;&#x2F;code&gt; as follows:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;rust&quot;&gt;pub fn hello_world() -&amp;gt; &amp;amp;&amp;#39;static str&amp;#39; {
  &amp;quot;Hello World&amp;quot;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;3-compiling&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-compiling&quot; aria-label=&quot;Anchor link for: 3-compiling&quot;&gt;🔗&lt;&#x2F;a&gt;3.Compiling&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;wasm&lt;&#x2F;code&gt; file build with &lt;code&gt;cargo build&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;❯ cargo build --target wasm32-unknown-unknown --release
  Finished `release` profile [optimized] target(s) in 0.01s  
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;hello_world.wasm&lt;&#x2F;code&gt; file can now be found in the &lt;code&gt;target&#x2F;wasm32-unknown-unknown&#x2F;release&lt;&#x2F;code&gt; folder.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;❯ file target&#x2F;wasm32-unknown-unknown&#x2F;release&#x2F;hello_world.wasm
target&#x2F;wasm32-unknown-unknown&#x2F;release&#x2F;hello_world.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We have successfully created a &lt;code&gt;hello_world.wasm&lt;&#x2F;code&gt; file using a very simple Rust code. Running the &lt;code&gt;file&lt;&#x2F;code&gt; command on it confirms that it is indeed a WebAssembly (wasm) binary.&lt;&#x2F;p&gt;
&lt;p&gt;Now, you might be wondering how to execute and utilize this &lt;code&gt;.wasm file&lt;&#x2F;code&gt;. Unlike other languages, there is quite a lot to discuss here. This is where the true journey into the world of WebAssembly begins.&lt;&#x2F;p&gt;
&lt;p&gt;In the next post, we will take a closer look at what this WASM file actually is and how it can be executed in various environments.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>[WIP] The Little Rust &amp; Wasm Guide</title>
        <published>2026-03-15T00:00:00+00:00</published>
        <updated>2026-03-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              seoul.rs user
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-toc/"/>
        <id>https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-toc/</id>
        
        <content type="html" xml:base="https://seoul.rs/blog/the-little-rust-and-wasm-guide/lrw-toc/">&lt;p&gt;This is a series of blog posts originally written in Korean for &lt;a href=&quot;&#x2F;ko&#x2F;blog&#x2F;the-little-rust-and-wasm-guide&#x2F;&quot;&gt;The Little Rust and WASM Guide&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;..&#x2F;lrw-ch1&quot;&gt;Diving Headfirst into Creating a WASM File&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
1.1 &lt;a href=&quot;..&#x2F;lrw-ch1&#x2F;#1-check-your-rust-compiler-can-handle-wasm-build&quot;&gt;Rust Compiler: Are your Cargo ready?&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
1.2 &lt;a href=&quot;..&#x2F;lrw-ch1&#x2F;#2-code-hello-world&quot;&gt;Code ‘Hello World’&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
1.3 &lt;a href=&quot;..&#x2F;lrw-ch1&#x2F;#3-compiling&quot;&gt;Compiling to Wasm&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;..&#x2F;lrw-ch2&quot;&gt;What is WASM?&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
2.1 WASM, First Appearance&lt;br &#x2F;&gt;
2.3 WASI - Wasm Beyond the Browser&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;..&#x2F;lrw-ch3&quot;&gt;WASM Meets the Web (feat. Web Browsers)&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
3.1 &lt;a href=&quot;..&#x2F;lrw-ch3&#x2F;#1-wasm-bindgen&quot;&gt;wasm-bindgen&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
3.2 &lt;a href=&quot;..&#x2F;lrw-ch3&#x2F;#2-wasm-pack&quot;&gt;wasm-pack&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
3.3 &lt;a href=&quot;..&#x2F;lrw-ch3&#x2F;#3-wasm-bindgen-futures&quot;&gt;wasm_bindgen_futures&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
3.4 &lt;a href=&quot;..&#x2F;lrw-ch3_4&quot;&gt;web_sys (incl. js_sys)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;..&#x2F;lrw-ch2&quot;&gt;The Story of WASI: WASM Beyond the Browser&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
4.1 Wasmtime&lt;br &#x2F;&gt;
4.2 Wasmer&lt;br &#x2F;&gt;
4.3 WasmEdge&lt;br &#x2F;&gt;
4.5 Spinframework&lt;br &#x2F;&gt;
4.6 FaaS(Function as a Service) and WASM&lt;br &#x2F;&gt;
4.7 Container and WASM&lt;&#x2F;li&gt;
&lt;li&gt;Cookbook&lt;br &#x2F;&gt;
5.1 WebSocket Client on Browser&lt;br &#x2F;&gt;
5.2 Rss Feeder in Spinframework&lt;br &#x2F;&gt;
5.3 ActivityPub in WASI&lt;br &#x2F;&gt;
5.4 ActivityPub in Browser&lt;br &#x2F;&gt;
5.5 Graphics&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to write on seoul.rs</title>
        <published>2026-03-13T00:00:00+00:00</published>
        <updated>2026-03-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              seoul.rs user
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://seoul.rs/blog/how-to-contribute-here/"/>
        <id>https://seoul.rs/blog/how-to-contribute-here/</id>
        
        <content type="html" xml:base="https://seoul.rs/blog/how-to-contribute-here/">&lt;p&gt;This post was originally written in Korean &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;seoul.rs&#x2F;ko&#x2F;blog&#x2F;how-to-contribute-here&#x2F;&quot;&gt;How to Contribute here&lt;&#x2F;a&gt; and translated into English with the help of an LLM.&lt;&#x2F;p&gt;
&lt;p&gt;seoul.rs is built with &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;getzola.org&quot;&gt;zola&lt;&#x2F;a&gt;, a Rust-based Static Site Generator (SSG), and utilizes the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;alinnow&#x2F;zola-bearblog&quot;&gt;zola-bearblog&lt;&#x2F;a&gt; template.&lt;&#x2F;p&gt;
&lt;p&gt;To contribute a blog post or news article, please fork &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;seoul-rs&#x2F;seoul-rs&quot;&gt;github.com&#x2F;seoul-rs&#x2F;seoul-rs&lt;&#x2F;a&gt;. Create a Markdown (.md) file under the blog or news directory within the content folder. Each post must include a header in the format shown below, followed by your content in Markdown. For posts written in Korean, please include the &lt;code&gt;.ko&lt;&#x2F;code&gt; language tag in the filename (e.g., my-first-writing.ko.md). For English posts, simply use the .md extension (e.g., my-first-writing.md).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;+++
title = &amp;quot;How to write on seoul.rs&amp;quot;
date = &amp;quot;2026-03-03&amp;quot;
[taxonomies]
authors = [&amp;quot;John Smith&amp;quot;]
tags = [&amp;quot;first&amp;quot;]
+++

Start writing here...

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once you have finished writing, please submit a Pull Request to the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;seoul-rs&#x2F;seoul-rs&quot;&gt;github.com&#x2F;seoul-rs&#x2F;seoul-rs&lt;&#x2F;a&gt; repository. Your post will be reviewed and merged, after which it will be automatically published via GitHub Actions.&lt;&#x2F;p&gt;
&lt;p&gt;When creating a Pull Request, please ensure that all commits are signed with your encryption key. We only merge commits that are Verified using keys registered with GitHub. If you do not have a GitHub account, please submit your patch files signed with your GPG key.&lt;&#x2F;p&gt;
&lt;p&gt;For more detailed information on the Static Site Generator (SSG), please refer to &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;getzola.org&quot;&gt;Zola&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Monthly Seoul Rust Meetup at March 19, 2026</title>
        <published>2026-03-13T00:00:00+00:00</published>
        <updated>2026-03-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              seoul.rs user
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://seoul.rs/news/monthly-rust-meetup-2026-may/"/>
        <id>https://seoul.rs/news/monthly-rust-meetup-2026-may/</id>
        
        <content type="html" xml:base="https://seoul.rs/news/monthly-rust-meetup-2026-may/">&lt;p&gt;Meetup location and details: &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;rust-seoul-meetup&#x2F;events&#x2F;313764176&quot;&gt;Meetup.com page&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
This meetup is held in English.&lt;&#x2F;p&gt;
&lt;p&gt;This Month’s talk&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;zeeshanlakhani&#x2F;40876902bf77e081ed8d718b4f8088d3&quot;&gt;Chat History the Database the Search Engine the TUI the CLI the Local-First Matrix Archiver in Rust (Zeeshan Lakhani)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Continuously Deploying Rust servers to production without rebuilding the universe (Charles Jonhson)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>[Link] Writing Complex Macro in Rust: Reverse Polish Notation</title>
        <published>2026-03-12T00:00:00+00:00</published>
        <updated>2026-03-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              seoul.rs user
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://seoul.rs/blog/rust-macro-rpn/"/>
        <id>https://seoul.rs/blog/rust-macro-rpn/</id>
        
        <content type="html" xml:base="https://seoul.rs/blog/rust-macro-rpn/">&lt;p&gt;If you aren’t very familiar with Rust macros and have always wondered if they are actually necessary for everyday programming—and if you’re a math or CS enthusiast who prefers RPN and HP calculators over TI ones—this is for you.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rreverser.com&#x2F;writing-complex-macros-in-rust&#x2F;&quot;&gt;https:&#x2F;&#x2F;rreverser.com&#x2F;writing-complex-macros-in-rust&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tokio Conf 2026</title>
        <published>2026-03-02T00:00:00+00:00</published>
        <updated>2026-03-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              seoul.rs user
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://seoul.rs/news/tokioconf-2026/"/>
        <id>https://seoul.rs/news/tokioconf-2026/</id>
        
        <content type="html" xml:base="https://seoul.rs/news/tokioconf-2026/">&lt;p&gt;Tokio Conf 2026, Portland, Oregon, April 20 - 22, 2026&lt;&#x2F;p&gt;
&lt;p&gt;Tickets are now on sale:
https:&#x2F;&#x2F;www.eventbrite.com&#x2F;e&#x2F;tokioconf-2026-tickets-1595919270499&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
