<?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>Give the agent the harder job</title>
      <dc:creator>Chris Olson</dc:creator>
      <pubDate>Thu, 09 Jul 2026 04:19:17 +0000</pubDate>
      <link>https://dev.to/sirhco/give-the-agent-the-harder-job-1189</link>
      <guid>https://dev.to/sirhco/give-the-agent-the-harder-job-1189</guid>
      <description>&lt;p&gt;The cost of asking an agent to attempt something has collapsed. Most people still scope their asks to what they already believe is possible — that is the mistake.&lt;/p&gt;

&lt;h2&gt;
  
  
  The case
&lt;/h2&gt;

&lt;p&gt;The fastest way to find the edge of an agentic tool is to ask it for something you are fairly sure it cannot do. Not as a stunt — as a habit. The cost of the experiment used to be an afternoon. Now it is a sentence. When the downside of a failed attempt is thirty seconds and a re-prompt, the rational move is to attempt far more than feels reasonable. Most people do the opposite. They scope every request down to what they already believe the tool can handle, and then they conclude the tool can only do what they believed.&lt;/p&gt;

&lt;p&gt;This essay is about the gap between the two. It is the most expensive habit I have had to unlearn while building with these tools, and unlearning it is where the actual leverage turned out to be.&lt;/p&gt;

&lt;h3&gt;
  
  
  The messy job is the job
&lt;/h3&gt;

&lt;p&gt;The well-specified task is the one you didn't need an agent for. "Rename this symbol across the repo," "write a test for this function" — these are fine, and the tool does them, and you save a few minutes. The work that compounds is the work you can barely specify yourself.&lt;/p&gt;

&lt;p&gt;I redesigned &lt;a href="https://sirhco.dev" rel="noopener noreferrer"&gt;my site&lt;/a&gt; recently and asked the agent to "QA the redesign" before I shipped it. I did not tell it how. I expected a list of things to click through manually. Instead it stood up a headless browser, opened a debugging port, navigated to the interactive work index, and started dispatching synthetic clicks at the category filter — driving the real compiled page the way a user would. Within a few iterations it reported that the filter pills lit up correctly but the rows never actually filtered. The count label was frozen. It was a real bug, and it had already shipped.&lt;/p&gt;

&lt;p&gt;I never asked for a browser. I asked for QA. The browser was its idea about what QA means when the thing under test is an interactive page. That distance — between the instruction and the interpretation — is where the value lives. A precise instruction gets you a precise result. An ambiguous one, given to a capable agent, gets you the result plus the approach you didn't know to ask for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools it has that you didn't ask for
&lt;/h3&gt;

&lt;p&gt;The filter bug is a good story because of what catching it required, which is more than "open a browser." The agent had to drive the page, observe that the DOM didn't change, and then cross a boundary most humans avoid: down into the WebAssembly island that owned the filtering, and the JavaScript bridge that fed it props.&lt;/p&gt;

&lt;p&gt;The root cause was buried there. The page handed its island props as a hand-rolled JSON string; the &lt;a href="https://verveframework.dev" rel="noopener noreferrer"&gt;framework&lt;/a&gt; expected a binary codec, base64-encoded, that the bridge decodes with atob before the WASM ever sees it. atob on a raw { throws, the error gets swallowed, the island hydrates with zero rows, and the filter has nothing to filter. The pills toggled because their state was static and didn't depend on the props at all.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// the bug: props as raw JSON — atob() rejects it, island hydrates empty&lt;br&gt;
const props = try buildJsonString(projects);&lt;br&gt;
// the fix: the framework's binary props codec → base64&lt;br&gt;
const props = try verve.encodeProps(ctx, .{ .slugs = slugs, .cats = cats });&lt;/code&gt;&lt;br&gt;
That is four distinct capabilities composed in service of one vague request: run a browser, simulate input, inspect a reactive DOM, and read across the WASM/JS boundary to a serialization mismatch. I would not have thought to ask for any single one of them. I would have written "check that the filter works" and accepted a screenshot. The creativity was not in my prompt. It was in the framing — verify this actually behaves — and the agent supplied the method.&lt;/p&gt;

&lt;p&gt;This is the part that does not fit the autocomplete mental model people still carry. The tool is not finishing your sentence. Given enough room, it is choosing a strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  The work you didn't have time for
&lt;/h3&gt;

&lt;p&gt;There is a second payoff, quieter than the first. Every codebase has a backlog of work that is obviously worth doing and never quite worth a human afternoon. The dead-code audit. The exhaustive edge-case sweep. The asset that should be generated instead of hand-drawn. These items live forever in a file called TODO because the value is real but sub-threshold for a person.&lt;/p&gt;

&lt;p&gt;That threshold just moved. While cleaning up the same redesign I asked for an audit of unused CSS. The agent found ten candidate classes — and then, before deleting any of them, checked whether the were still in use, caught that six of the ten were live, and deleted only the four that were actually dead. That is the correct, careful version of a chore I would have done sloppily at midnight, if at all.&lt;/p&gt;

&lt;p&gt;The 3D artifact on the &lt;a href="https://sirhco.dev/" rel="noopener noreferrer"&gt;site&lt;/a&gt; is the same story from the other direction. I wanted a piece of generated geometry and an image-based lighting environment baked at build time. That is a real graphics task, the kind that historically eats a weekend you don't have. It became a build step. Not because the work got easier in some abstract sense — because the unit of effort it cost me dropped to "describe what you want and review what comes back."&lt;/p&gt;

&lt;p&gt;The backlog is not a backlog anymore. It is a queue, and the queue moves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be wrong about the ceiling
&lt;/h3&gt;

&lt;p&gt;Here is the uncomfortable part. Your belief about what the tool cannot do has a shelf life measured in weeks, and you are almost certainly still operating on a stale one. The thing it couldn't do last quarter it can do now, and you will never find out if your prompts are calibrated to last quarter's ceiling.&lt;/p&gt;

&lt;p&gt;The only reliable way I have found to stay current is to keep asking for the thing I assume will fail. Most of the time it does, and I have lost a sentence. Sometimes it doesn't, and I have learned that an entire category of work moved inside the boundary while I wasn't looking. The expected value of that bet is lopsided in a way that should change your behavior, and for most people it hasn't yet.&lt;/p&gt;

&lt;p&gt;Fearlessness here is not recklessness. It is refusing to pre-decide the outcome. You do not get to know the ceiling by reasoning about it. You find it by pushing on it, and it has a habit of not being where you left it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify like you mean it
&lt;/h3&gt;

&lt;p&gt;The counterweight, because exploration without it is malpractice: the filter bug shipped in the first place because someone — a previous version of this same loop — explored creatively and did not verify. The redesign rendered, the SSR looked right, the markup was correct, and the thing was broken in a way no static check would catch. Creativity got the feature built. Only adversarial verification caught that it didn't work.&lt;/p&gt;

&lt;p&gt;So the habit is not "ask for big things and trust the output." It is "ask for big things and then make the agent prove them." Drive the real page. Run the real binary. Diff the actual behavior against the claim. The same tool that will invent a browser-automation strategy to please you will also, asked the wrong way, assure you something works when it doesn't. The exploration and the skepticism are two halves of one practice. Run them together or you are just generating plausible mistakes faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Paradigm Shift
&lt;/h3&gt;

&lt;p&gt;The bottleneck has moved. For a long time the limiting factor on what got built was hours — yours, your team's — and so the discipline was about spending them well. That discipline is now aimed at the wrong constraint. The hours are cheap. What is scarce is the imagination to ask for the harder thing, and the rigor to confirm you actually got it.&lt;/p&gt;

&lt;p&gt;Give the agent the job you think is too big. Give it the chore you were never going to do. Frame the ambiguous version, not the safe one, and then verify the result like you expect it to be wrong. The downside is a wasted sentence. The upside is finding out that the work you had quietly written off as impossible, or simply not worth your time, was neither.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>softwareengineering</category>
      <category>productivity</category>
    </item>
    <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>
