<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chris Olson</title>
    <description>The latest articles on DEV Community by Chris Olson (@sirhco).</description>
    <link>https://dev.to/sirhco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4008791%2F4d5ce83e-8b1f-4379-9a8c-80ddd1c7e1a5.jpg</url>
      <title>DEV Community: Chris Olson</title>
      <link>https://dev.to/sirhco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sirhco"/>
    <language>en</language>
    <item>
      <title>Why I Built Verve: Crafting a Pure-Zig, Full-Stack Alternative to Tauri and Wails</title>
      <dc:creator>Chris Olson</dc:creator>
      <pubDate>Tue, 07 Jul 2026 05:49:47 +0000</pubDate>
      <link>https://dev.to/sirhco/why-i-built-verve-crafting-a-pure-zig-full-stack-alternative-to-tauri-and-wails-4e3c</link>
      <guid>https://dev.to/sirhco/why-i-built-verve-crafting-a-pure-zig-full-stack-alternative-to-tauri-and-wails-4e3c</guid>
      <description>&lt;p&gt;If you’ve ever built a desktop or modern full-stack web app using frameworks like Tauri or Wails, you know how brilliant the webview architecture is. Combining a lightweight OS webview with a fast backend language like Rust or Go beats shipping a bloated 150MB Electron runtime any day. &lt;/p&gt;

&lt;p&gt;I love these tools and still build applications with them. But as an engineer, I started wondering what it would look like if we pushed the boundaries a step further. What if we could completely eliminate the multi-language context switch, throw away the heavy Node build toolchains, and build everything inside a single, unified systems language?&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter Zig (and a wild idea)
&lt;/h3&gt;

&lt;p&gt;Over the past six months, I’ve been diving deep into &lt;strong&gt;Zig&lt;/strong&gt;. Coming from a background with plenty of Go, I completely fell in love with Zig's philosophy: extreme simplicity, no hidden control flow, no macros, a "standard library first" mindset, and a powerful build system that replaces messy Makefiles and CMake entirely.&lt;/p&gt;

&lt;p&gt;With the recent async/IO overhauls in Zig 0.16.0 (&lt;code&gt;std.io&lt;/code&gt; updates and native &lt;code&gt;io_uring&lt;/code&gt; support), it felt like the absolute perfect time to see just how far the envelope could be pushed.&lt;/p&gt;

&lt;p&gt;I looked at the current ecosystem and realized something was missing: &lt;strong&gt;A pure, unified, single-language framework for both web and desktop apps.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, I decided to go on a bit of an adventure and build it. I call it &lt;strong&gt;&lt;a href="https://github.com/sirhco/verve" rel="noopener noreferrer"&gt;Verve&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What exactly is Verve?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Verve&lt;/strong&gt; is a full-stack, pure-Zig framework for building high-performance web and native desktop applications.&lt;/p&gt;

&lt;p&gt;If you want to see the architecture in action right now, you can dive straight into the &lt;strong&gt;&lt;a href="https://verveframework.dev" rel="noopener noreferrer"&gt;Official Documentation at verveframework.dev&lt;/a&gt;&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;There is &lt;strong&gt;no Node.js toolchain&lt;/strong&gt;, &lt;strong&gt;no virtual DOM&lt;/strong&gt;, and &lt;strong&gt;no macros&lt;/strong&gt;. Everything compiles down into a &lt;strong&gt;single, highly optimized binary&lt;/strong&gt;. You run &lt;code&gt;zig build&lt;/code&gt;, and you get your server or your native desktop application. Simple as that.&lt;/p&gt;

&lt;p&gt;Here is a quick look at the architectural choices powering the project:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Unified Language, Unified Codebase
&lt;/h3&gt;

&lt;p&gt;Instead of splitting your brain between Go/Rust for the backend and TS/JS for the frontend, your entire application UI and logic is written in pure Zig.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web:&lt;/strong&gt; The server renders HTML via native Zig functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Interactivity:&lt;/strong&gt; Interactive components are written in Zig and compiled directly to &lt;strong&gt;WASM chunks&lt;/strong&gt; using Zig's native WebAssembly compilation target.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Islands Architecture &amp;amp; Fine-Grained Reactivity
&lt;/h3&gt;

&lt;p&gt;Verve takes inspiration from modern web frameworks but implements them natively. Pages are Server-Side Rendered (SSR) first, meaning every page is fully formed HTML that functions perfectly even if JavaScript is entirely disabled.&lt;/p&gt;

&lt;p&gt;When you need interactivity, you opt into an &lt;strong&gt;Island&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The build system automatically code-splits every island into its own separate WebAssembly (&lt;code&gt;.wasm&lt;/code&gt;) chunk.&lt;/li&gt;
&lt;li&gt;Chunks are lazy-loaded on-demand and hydrated with typed properties.&lt;/li&gt;
&lt;li&gt;It uses a fine-grained reactive graph (Signals and Effects) shared seamlessly between the server and the WASM client. Updates touch &lt;em&gt;exactly&lt;/em&gt; the DOM nodes that change—no heavy Virtual DOM diffing required.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight zig"&gt;&lt;code&gt;&lt;span class="c"&gt;// A simple reactive route in Verve&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;verve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;@import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"verve"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;verve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;verve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;renderHome&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;verve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello/:name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;renderHello&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;renderHello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;verve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!*&lt;/span&gt;&lt;span class="n"&gt;verve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Node&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;orelse&lt;/span&gt; &lt;span class="s"&gt;"world"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;div&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;children&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;p&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;children&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;span&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Greetings, "&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Native Desktop
&lt;/h3&gt;

&lt;p&gt;For desktop applications, Verve embeds the OS’s native webview window (&lt;code&gt;WKWebView&lt;/code&gt; on macOS, &lt;code&gt;WebView2&lt;/code&gt; on Windows, and &lt;code&gt;WebKitGTK&lt;/code&gt; on Linux).&lt;/p&gt;

&lt;p&gt;Unlike other webview solutions, Verve sets up a highly secure &lt;code&gt;verve://app/&lt;/code&gt; asset scheme. Assets are embedded directly inside the binary as an &lt;code&gt;AssetEntry&lt;/code&gt; table at compile time. Frontend modules communicate with your Zig backend through a deeply typed IPC bridge with strict compile-time route generation. No open local ports, no localhost footprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Zero JavaScript Toolchain (Yes, Really)
&lt;/h3&gt;

&lt;p&gt;One of my primary goals was to completely strip away the complex web infrastructure. Because Zig's build system is incredibly robust, it acts as your compiler, linker, asset packager, and WASM orchestrator all at once. You don’t need &lt;code&gt;npm&lt;/code&gt;, &lt;code&gt;bun&lt;/code&gt;, &lt;code&gt;vite&lt;/code&gt;, or &lt;code&gt;esbuild&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Now, to be totally fair, browsers don't speak native Zig—so there &lt;em&gt;is&lt;/em&gt; a tiny piece of JavaScript glue involved under the hood called &lt;code&gt;verve.js&lt;/code&gt;. But here's the magic: you don't install it, build it, or manage it. The framework automatically serves it as a minimal, lightweight bridge at &lt;code&gt;/verve.js&lt;/code&gt;. It handles mounting your compiled WASM islands, passing typed properties, and letting the client runtime talk back to your backend. &lt;/p&gt;

&lt;p&gt;You just run &lt;code&gt;zig build&lt;/code&gt;, and the framework orchestrates the entire puzzle for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Moving Beyond Tauri and Wails
&lt;/h2&gt;

&lt;p&gt;Don't get me wrong: I still build applications using both Tauri and Wails, and they are phenomenal projects that paved the way for lightweight desktop apps. But I wanted to see what else could be built if we wiped the slate clean.&lt;/p&gt;

&lt;p&gt;Verve shifts the paradigm in a few key ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instant Compile &amp;amp; Dev Loops:&lt;/strong&gt; Zig compiles incredibly fast compared to heavy macro-centric Rust code. With &lt;code&gt;dev_assets&lt;/code&gt; configured, you can edit your frontend markup and live-reload instantly without rebuilding the binary backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single Mental Model:&lt;/strong&gt; You don't have to think about data-serialization boundaries between Go/Rust types and TypeScript interfaces. Everything uses native Zig structs. Comptime-generated, typed client stubs handle data transfers natively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batteries Included (Natively):&lt;/strong&gt; Verve isn't just a webview router. It includes full server-side visualization capabilities (&lt;code&gt;verve.viz&lt;/code&gt; renders everything from force-directed layouts to complex charts directly to server-side SVG), a declarative tween/timeline animation engine, and hardware-accelerated WebGL2/WebGPU 3D scenes out of the box.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Journey So Far
&lt;/h2&gt;

&lt;p&gt;Learning Zig over the last half-year has completely changed how I think about systems programming. Coming from Go, I missed the simplicity when dealing with complex Rust syntax or C-bindings. Zig gives you that exact same readability and predictability, but with absolute control over memory management and allocators (using explicit arenas per request context to completely eliminate leaks).&lt;/p&gt;

&lt;p&gt;Verve is the result of taking that systems-level power and applying it directly to application developer productivity.&lt;/p&gt;

&lt;p&gt;Now, I wish I could take all the credit and claim I built this entirely solo, but I have to give a massive shoutout to my friend &lt;strong&gt;Claude Code&lt;/strong&gt; for the major assist along the way! 🤖&lt;/p&gt;

&lt;h2&gt;
  
  
  Give it a spin!
&lt;/h2&gt;

&lt;p&gt;If you want to escape the massive Node ecosystem, skip the multi-minute compile times, and write lightning-fast full-stack web or desktop apps using a beautiful, modern language, come join the adventure.&lt;/p&gt;

&lt;p&gt;Getting started is as simple as cloning the repo and executing your native toolchain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/sirhco/verve
&lt;span class="nb"&gt;cd &lt;/span&gt;verve
zig build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’d love to hear your thoughts, feedback, or any issues you encounter as you play around with it! Check out the &lt;a href="https://github.com/sirhco/verve" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;, drop a star if you like the direction, and let me know what you think in the comments below!&lt;/p&gt;

</description>
      <category>zig</category>
      <category>webassembly</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
