<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Wasm on kmcd.dev</title><link>https://kmcd.dev/tags/wasm/</link><description>Recent content in Wasm on kmcd.dev</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>All Rights Reserved</copyright><lastBuildDate>Tue, 19 May 2026 10:00:00 +0000</lastBuildDate><atom:link href="https://kmcd.dev/tags/wasm/index.xml" rel="self" type="application/rss+xml"/><item><title>Zero-Friction Demos with WASM</title><link>https://kmcd.dev/posts/wasm-demos/</link><pubDate>Tue, 19 May 2026 10:00:00 +0000</pubDate><guid>https://kmcd.dev/posts/wasm-demos/</guid><description> 
                &lt;p> &lt;img hspace="5" src="https://kmcd.dev/posts/wasm-demos/cover.svg" /> &lt;/p>
                
                Bringing Go libraries to life with WebAssembly.
                </description><content:encoded><![CDATA[<p>You can write the perfect README, record a flawless terminal GIF, and polish your API docs for days. But the second a developer has to run <code>brew install</code> or copy a weird curl script just to test your tool, half of them will bounce. People are busy. They do not want to trash their local environment for a test drive.</p>
<p>The best approach is to just show them how it works. For Go developers, WebAssembly (WASM) is the most effective way to do that.</p>
<h2 id="seeing-is-believing">Seeing is Believing</h2>
<p>The most direct way to prove your library works is to let someone use it right now in the browser.</p>
<p>For JavaScript developers, this has been the standard for a long time. For systems languages like Go, providing a live demo used to require a backend to execute code safely. That was usually expensive, slow, and hard to secure.</p>
<p>WASM changes that. You can compile your Go code into a binary that runs in the user&rsquo;s browser. There is no backend, no latency after the first load, and it runs in a safe sandbox.</p>
<p>I ran into this wall recently with <a href="https://fauxrpc.com" rel="external">FauxRPC</a>. It generates mock data from Protobufs. Explaining that in a README resulted in a lot of blank stares. But letting someone paste their own <code>.proto</code> file into a browser window and immediately see the JSON spit out? That converted them instantly.</p>
<figure><a href="https://kmcd.dev/posts/wasm-demos/fauxrpc-screenshot.png" class="spotlight" data-download="true">
    
    
    
    
        
            
            
                
            
            
        
    

    
    
    

    
    
        
    

    <img src="https://kmcd.dev/posts/wasm-demos/fauxrpc-screenshot_hu_f74ca8291acc1f34.png"
         alt="FauxRPC Demo"/>
    </a><figcaption>
            <p><a href="https://fauxrpc.com" rel="external">FauxRPC</a> running in the browser via WASM.</p>
        </figcaption>
</figure>

<h2 id="building-a-wasm-bridge">Building a WASM Bridge</h2>
<p>Bridging Go and the browser&rsquo;s JavaScript environment mostly comes down to the <code>syscall/js</code> package. You just need to register your function in the global JS scope. It looks something like this:</p>
<details open>
    <summary>
        Go WASM Demo Example (click to expand)<a href="https://github.com/sudorandom/kmcd.dev/blob/main/posts/2026/wasm-demos/go/demo/main.go" target="_blank" rel="noopener noreferrer" class="details-github-link" title="View on GitHub"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg><span>View on GitHub</span>
            </a></summary>
    <div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#81a1c1;font-weight:bold">package</span> main
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#81a1c1;font-weight:bold">import</span> <span style="color:#eceff4">(</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a3be8c">&#34;fmt&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a3be8c">&#34;slices&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a3be8c">&#34;syscall/js&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#81a1c1;font-weight:bold">func</span> <span style="color:#88c0d0">main</span><span style="color:#eceff4">()</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>	fmt<span style="color:#eceff4">.</span><span style="color:#88c0d0">Println</span><span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;Go WebAssembly Initialized&#34;</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#616e87;font-style:italic">// Register a function in the global JavaScript scope</span>
</span></span><span style="display:flex;"><span>	js<span style="color:#eceff4">.</span><span style="color:#88c0d0">Global</span><span style="color:#eceff4">().</span><span style="color:#88c0d0">Set</span><span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;processData&#34;</span><span style="color:#eceff4">,</span> js<span style="color:#eceff4">.</span><span style="color:#88c0d0">FuncOf</span><span style="color:#eceff4">(</span>processData<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#616e87;font-style:italic">// Keep the program alive so functions remain callable</span>
</span></span><span style="display:flex;"><span>	<span style="color:#81a1c1;font-weight:bold">select</span> <span style="color:#eceff4">{}</span>
</span></span><span style="display:flex;"><span><span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#81a1c1;font-weight:bold">func</span> <span style="color:#88c0d0">processData</span><span style="color:#eceff4">(</span>this js<span style="color:#eceff4">.</span>Value<span style="color:#eceff4">,</span> args <span style="color:#eceff4">[]</span>js<span style="color:#eceff4">.</span>Value<span style="color:#eceff4">)</span> <span style="color:#81a1c1">any</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>	<span style="color:#81a1c1;font-weight:bold">if</span> <span style="color:#81a1c1">len</span><span style="color:#eceff4">(</span>args<span style="color:#eceff4">)</span> <span style="color:#eceff4">&lt;</span> <span style="color:#b48ead">1</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>		<span style="color:#81a1c1;font-weight:bold">return</span> <span style="color:#a3be8c">&#34;Error: No input provided&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	input <span style="color:#81a1c1">:=</span> args<span style="color:#eceff4">[</span><span style="color:#b48ead">0</span><span style="color:#eceff4">].</span><span style="color:#88c0d0">String</span><span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>	fmt<span style="color:#eceff4">.</span><span style="color:#88c0d0">Printf</span><span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;Processing input: %s\n&#34;</span><span style="color:#eceff4">,</span> input<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#616e87;font-style:italic">// In a real demo, this is where you&#39;d call your library.</span>
</span></span><span style="display:flex;"><span>	<span style="color:#616e87;font-style:italic">// We&#39;ll reverse the string as a simple placeholder logic.</span>
</span></span><span style="display:flex;"><span>	runes <span style="color:#81a1c1">:=</span> <span style="color:#eceff4">[]</span><span style="color:#81a1c1">rune</span><span style="color:#eceff4">(</span>input<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>	slices<span style="color:#eceff4">.</span><span style="color:#88c0d0">Reverse</span><span style="color:#eceff4">(</span>runes<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#81a1c1;font-weight:bold">return</span> <span style="color:#81a1c1">string</span><span style="color:#eceff4">(</span>runes<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span><span style="color:#eceff4">}</span>
</span></span></code></pre></div>
</details>
<p>The <code>select {}</code> part is important. It keeps the Go program running indefinitely so your functions stay available to JavaScript. Without it, the program would exit and the bridge would break.</p>
<h3 id="live-demo">Live Demo</h3>
<p>Here is that exact Go code running in your browser. Type something in the box to see the WASM bridge update the output in real time:</p>
<div class="wasm-demo">
    <div class="wasm-demo-header">
        <span class="wasm-demo-title">Live WASM Demo</span>
        <div id="wasm-status" class="wasm-status-loading">
            <span class="status-dot"></span>
            <span class="status-text">Initializing...</span>
        </div>
    </div>
    <div class="wasm-demo-controls">
        <input type="text" id="wasm-input" placeholder="Type something..." value="Hello WASM!" disabled>
    </div>
    <div class="wasm-demo-output">
        <strong>Output:</strong> <span id="wasm-result">Waiting for input...</span>
    </div>
</div>

<script>
    (function() {
        
        const wasmUrl = "/wasm/demo.wasm?t=" + new Date().getTime();
        const glueUrl = "/js/wasm_exec.js";
        const statusEl = document.getElementById('wasm-status');
        const statusText = statusEl.querySelector('.status-text');
        const inputField = document.getElementById('wasm-input');
        const resultField = document.getElementById('wasm-result');

        function debounce(func, timeout = 300) {
            let timer;
            return (...args) => {
                clearTimeout(timer);
                timer = setTimeout(() => { func.apply(this, args); }, timeout);
            };
        }

        const updateOutput = () => {
            const input = inputField.value;
            if (typeof processData === 'function') {
                const output = processData(input);
                resultField.textContent = output;
            } else {
                resultField.textContent = 'Error: processData function not found';
            }
        };

        const debouncedUpdate = debounce(updateOutput);

        async function init() {
            try {
                
                if (typeof Go === 'undefined') {
                    await new Promise((resolve, reject) => {
                        const s = document.createElement('script');
                        s.src = glueUrl;
                        s.onload = resolve;
                        s.onerror = reject;
                        document.head.appendChild(s);
                    });
                }

                const go = new Go();
                let result;
                
                
                try {
                    const fetchPromise = fetch(wasmUrl);
                    result = await WebAssembly.instantiateStreaming(fetchPromise, go.importObject);
                } catch (e) {
                    console.warn("WASM instantiateStreaming failed, falling back to arrayBuffer", e);
                    const response = await fetch(wasmUrl);
                    const buffer = await response.arrayBuffer();
                    result = await WebAssembly.instantiate(buffer, go.importObject);
                }

                
                go.run(result.instance);
                
                statusText.textContent = 'Ready';
                statusEl.className = 'wasm-status-ready';
                inputField.disabled = false;
                
                
                updateOutput();

                inputField.addEventListener('input', debouncedUpdate);
            } catch (err) {
                console.error("WASM Initialization Error:", err);
                statusText.textContent = 'Engine Error';
                statusEl.className = 'wasm-status-error';
                resultField.textContent = 'Check console for errors. Reloading might help.';
            }
        }

        init();
    })();
</script>

<style>
.wasm-demo {
    border: 1px solid var(--border-color);
    padding: 1.25rem;
    border-radius: 12px;
    background: var(--bg-secondary);
    color: var(--text-main);
    margin: 2rem 0;
    font-family: inherit;
}

 
:root {
    --bg-secondary: #fafafa;
    --bg-tertiary: #e0e0e0;
    --text-main: #222;
    --border-color: #dcdcdc;
    --accent-color: #0052ff;
    --success-color: #28a745;
    --error-color: #dc3545;
    --status-bg: rgba(0, 0, 0, 0.05);
}

 
@media (prefers-color-scheme: dark) {
    :root {
        --bg-secondary: #283745;
        --bg-tertiary: #3b5065;
        --text-main: #ffffff;
        --border-color: #3b5065;
        --accent-color: #00ffff;
        --success-color: #34ce57;
        --error-color: #ff4b5c;
        --status-bg: rgba(255, 255, 255, 0.1);
    }
}

 
[data-theme=dark] :root {
    --bg-secondary: #283745;
    --bg-tertiary: #3b5065;
    --text-main: #ffffff;
    --border-color: #3b5065;
    --accent-color: #00ffff;
    --status-bg: rgba(255, 255, 255, 0.1);
}

[data-theme=light] :root {
    --bg-secondary: #fafafa;
    --bg-tertiary: #e0e0e0;
    --text-main: #222;
    --border-color: #dcdcdc;
    --accent-color: #0052ff;
    --status-bg: rgba(0, 0, 0, 0.05);
}

.wasm-demo-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 1rem;
}

.wasm-demo-title {
    font-size: 0.9rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    opacity: 0.8;
}

#wasm-status {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.25rem 0.75rem;
    border-radius: 20px;
    background: var(--status-bg);
    font-size: 0.8rem;
    font-weight: 600;
}

.status-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: currentColor;
}

.wasm-status-loading { color: var(--text-main); opacity: 0.6; }
.wasm-status-loading .status-dot {
    animation: wasm-pulse 1.5s infinite;
}

.wasm-status-ready { color: var(--success-color); }
.wasm-status-error { color: var(--error-color); }

@keyframes wasm-pulse {
    0% { opacity: 0.3; transform: scale(0.8); }
    50% { opacity: 1; transform: scale(1.1); }
    100% { opacity: 0.3; transform: scale(0.8); }
}

.wasm-demo-controls {
    margin-bottom: 1rem;
}

.wasm-demo-controls input {
    width: 100%;
    padding: 0.75rem 1rem;
    border: 1px solid var(--border-color);
    border-radius: 8px;
    background: var(--bg-tertiary);
    color: var(--text-main);
    font-size: 1rem;
    outline: none;
    transition: all 0.2s;
}

.wasm-demo-controls input:focus {
    border-color: var(--accent-color);
    box-shadow: 0 0 0 3px rgba(0, 255, 255, 0.1);
}

.wasm-demo-controls input:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}

.wasm-demo-output {
    padding: 1.25rem;
    background: var(--bg-tertiary);
    border-radius: 8px;
    font-family: 'Fira Code', 'Courier New', monospace;
    font-size: 0.95rem;
    color: var(--text-main);
    border-left: 4px solid var(--accent-color);
    word-break: break-all;
    min-height: 4rem;
    display: flex;
    align-items: center;
}

.wasm-demo-output strong {
    margin-right: 0.75rem;
    color: var(--accent-color);
    font-size: 0.85rem;
    text-transform: uppercase;
}
</style>

<h2 id="compiling-to-wasm">Compiling to WASM</h2>
<p>Compiling your Go code for the browser is a one-liner. You just need to set the <code>GOOS</code> and <code>GOARCH</code> environment variables:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>GOOS<span style="color:#81a1c1">=</span>js GOARCH<span style="color:#81a1c1">=</span>wasm go build -o demo.wasm ./go/demo/main.go
</span></span></code></pre></div><h2 id="loading-in-the-browser">Loading in the Browser</h2>
<p>You will need a glue file called <code>wasm_exec.js</code> to actually load this in the browser. Luckily, Go already ships with it. Just pull it from your installation:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cp <span style="color:#a3be8c">&#34;</span><span style="color:#81a1c1;font-weight:bold">$(</span>go env GOROOT<span style="color:#81a1c1;font-weight:bold">)</span><span style="color:#a3be8c">/misc/wasm/wasm_exec.js&#34;</span> ./static/js/
</span></span></code></pre></div><p>After that, you can load and run your WASM module with a little bit of JavaScript. Using an <code>input</code> event listener with a debounce makes the interaction feel more natural:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#81a1c1;font-weight:bold">const</span> go <span style="color:#81a1c1">=</span> <span style="color:#81a1c1;font-weight:bold">new</span> Go<span style="color:#eceff4">();</span>
</span></span><span style="display:flex;"><span>WebAssembly<span style="color:#eceff4">.</span>instantiateStreaming<span style="color:#eceff4">(</span>fetch<span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;demo.wasm&#34;</span><span style="color:#eceff4">),</span> go<span style="color:#eceff4">.</span>importObject<span style="color:#eceff4">).</span>then<span style="color:#eceff4">((</span>result<span style="color:#eceff4">)</span> <span style="color:#eceff4">=&gt;</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>    go<span style="color:#eceff4">.</span>run<span style="color:#eceff4">(</span>result<span style="color:#eceff4">.</span>instance<span style="color:#eceff4">);</span>
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#81a1c1;font-weight:bold">const</span> input <span style="color:#81a1c1">=</span> <span style="color:#81a1c1">document</span><span style="color:#eceff4">.</span>getElementById<span style="color:#eceff4">(</span><span style="color:#a3be8c">&#39;my-input&#39;</span><span style="color:#eceff4">);</span>
</span></span><span style="display:flex;"><span>    input<span style="color:#eceff4">.</span>addEventListener<span style="color:#eceff4">(</span><span style="color:#a3be8c">&#39;input&#39;</span><span style="color:#eceff4">,</span> debounce<span style="color:#eceff4">(()</span> <span style="color:#eceff4">=&gt;</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>        console<span style="color:#eceff4">.</span>log<span style="color:#eceff4">(</span>processData<span style="color:#eceff4">(</span>input<span style="color:#eceff4">.</span>value<span style="color:#eceff4">));</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">},</span> <span style="color:#b48ead">300</span><span style="color:#eceff4">));</span>
</span></span><span style="display:flex;"><span><span style="color:#eceff4">});</span>
</span></span></code></pre></div><h2 id="binary-size">Binary Size</h2>
<p>Let&rsquo;s be honest, Go binaries are notoriously thick. A basic hello-world WASM build sits at around 2MB. Start importing standard libraries like <code>encoding/json</code> or <code>protoreflect</code>, and suddenly you are staring at a 10MB payload.</p>
<p>If you need a smaller binary, you can use <a href="https://tinygo.org/" rel="external">TinyGo</a>:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>tinygo build -o demo.wasm -target wasm ./go/demo/main.go
</span></span></code></pre></div><p>For the minimal example we used above, here is the size difference:</p>
<table>
  <thead>
      <tr>
          <th style="text-align: left">Compiler</th>
          <th style="text-align: left">Raw Size</th>
          <th style="text-align: left">Gzipped Size</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><strong>Go</strong></td>
          <td style="text-align: left">2.5 MB</td>
          <td style="text-align: left">758 KB</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>TinyGo</strong></td>
          <td style="text-align: left">702 KB</td>
          <td style="text-align: left">239 KB</td>
      </tr>
  </tbody>
</table>
<p>A 10MB payload isn&rsquo;t great for a landing page. Even the small example is around a megabyte when gzipped with the standard Go compiler.</p>
<h3 id="reducing-the-impact">Reducing the impact</h3>
<ol>
<li><strong>TinyGo:</strong> It produces much smaller binaries, but it doesn&rsquo;t support the entire standard library. If your code uses complex reflection, TinyGo might not work out of the box.</li>
<li><strong>Selective Imports:</strong> Be ruthless about what you import. Some standard library packages are surprisingly heavy in a WASM context:
<ul>
<li><strong><code>fmt</code>:</strong> Including <code>fmt.Printf</code> or <code>fmt.Sprintf</code> can pull in a large chunk of the reflection and formatting logic. For simple debugging, <code>println()</code> is free and doesn&rsquo;t add weight.</li>
<li><strong><code>encoding/json</code>:</strong> This relies heavily on reflection. If you have a massive JSON structure, consider if you can simplify the interaction or use a code-gen based parser like <code>easyjson</code>.</li>
<li><strong><code>net/http</code>:</strong> This is the big one. If you need to make API calls, don&rsquo;t use Go&rsquo;s <code>http.Client</code>.</li>
</ul>
</li>
<li><strong>Analyze Your Binary:</strong> You can use <code>go tool nm</code> to see what is taking up space:
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>go tool nm -size -sort size demo.wasm <span style="color:#eceff4">|</span> head -n <span style="color:#b48ead">20</span>
</span></span></code></pre></div></li>
<li><strong>Compression:</strong> Make sure your web server is using Gzip or Brotli. It can turn a 10MB WASM file into 2 or 3MB.</li>
<li><strong>UI Feedback:</strong> Don&rsquo;t show a blank screen while the WASM loads. Use a progress bar or a simple &ldquo;Initializing&hellip;&rdquo; message.</li>
<li><strong>Deferred Loading:</strong> Only load the WASM when the user actually gets to the demo section.</li>
</ol>
<h2 id="managing-the-toolchain">Managing the Toolchain</h2>
<p>These builds rely on specific versions of Go and TinyGo. To keep things consistent, I use <a href="https://mise.jdx.dev/" rel="external">mise</a> to manage them.</p>
<p>Adding a <code>.mise.toml</code> to your project helps ensure everyone is using the same compiler versions:</p>
<details >
    <summary>
        .mise.toml (click to expand)<a href="https://github.com/sudorandom/kmcd.dev/blob/main/posts/2026/wasm-demos/go/demo/.mise.toml" target="_blank" rel="noopener noreferrer" class="details-github-link" title="View on GitHub"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg><span>View on GitHub</span>
            </a></summary>
    <div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span><span style="color:#eceff4">[</span>tools<span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>go <span style="color:#eceff4">=</span> <span style="color:#a3be8c">&#34;1.26.3&#34;</span>
</span></span><span style="display:flex;"><span>tinygo <span style="color:#eceff4">=</span> <span style="color:#a3be8c">&#34;0.41.1&#34;</span>
</span></span></code></pre></div>
</details>
<h2 id="documentation-as-a-sandbox">Documentation as a Sandbox</h2>
<p>Writing good docs is still important, but giving people a sandbox to play in is a game changer. WASM finally makes that practical for languages other than Javascript. If you are building something new, let people break it in the browser before showing them the installation steps. It saves everyone a lot of time.</p>
]]></content:encoded></item></channel></rss>