<?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: UnitBuilds</title>
    <description>The latest articles on DEV Community by UnitBuilds (@unitbuilds).</description>
    <link>https://dev.to/unitbuilds</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3949275%2F0d884b0e-b445-4e47-a064-505d61283071.png</url>
      <title>DEV Community: UnitBuilds</title>
      <link>https://dev.to/unitbuilds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/unitbuilds"/>
    <language>en</language>
    <item>
      <title>DROP YOUR BILL BY 90%</title>
      <dc:creator>UnitBuilds</dc:creator>
      <pubDate>Tue, 26 May 2026 23:50:46 +0000</pubDate>
      <link>https://dev.to/unitbuilds/drop-your-bill-by-90-5080</link>
      <guid>https://dev.to/unitbuilds/drop-your-bill-by-90-5080</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d"&gt;No seriously, 90+% reduction in browser token usage, using AOM instead of DOM&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>You need this...

https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d</title>
      <dc:creator>UnitBuilds</dc:creator>
      <pubDate>Tue, 26 May 2026 23:40:57 +0000</pubDate>
      <link>https://dev.to/unitbuilds/you-need-this-2p24</link>
      <guid>https://dev.to/unitbuilds/you-need-this-2p24</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d" class="crayons-story__hidden-navigation-link"&gt;Stop Giving LLMs Raw HTML: Build a Graph-Native, 96% More Efficient MCP Web Browser&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/unitbuilds_cc"&gt;
            &lt;img alt="UnitBuilds CC logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F13448%2F1264f654-c6d4-45c9-9793-e785588489c7.png" class="crayons-logo__image" width="339" height="381"&gt;
          &lt;/a&gt;

          &lt;a href="/unitbuilds" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3949275%2F0d884b0e-b445-4e47-a064-505d61283071.png" alt="unitbuilds profile" class="crayons-avatar__image" width="339" height="381"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/unitbuilds" class="crayons-story__secondary fw-medium m:hidden"&gt;
              UnitBuilds
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                UnitBuilds
                
              
              &lt;div id="story-author-preview-content-3759670" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/unitbuilds" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3949275%2F0d884b0e-b445-4e47-a064-505d61283071.png" class="crayons-avatar__image" alt="" width="339" height="381"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;UnitBuilds&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/unitbuilds_cc" class="crayons-story__secondary fw-medium"&gt;UnitBuilds CC&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 26&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d" id="article-link-3759670"&gt;
          Stop Giving LLMs Raw HTML: Build a Graph-Native, 96% More Efficient MCP Web Browser
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mcp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mcp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/neo4j"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;neo4j&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>If you're using AI, YOU NEED THIS!</title>
      <dc:creator>UnitBuilds</dc:creator>
      <pubDate>Tue, 26 May 2026 22:57:22 +0000</pubDate>
      <link>https://dev.to/unitbuilds/if-youre-using-ai-you-need-this-27id</link>
      <guid>https://dev.to/unitbuilds/if-youre-using-ai-you-need-this-27id</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d"&gt;mcp-lite&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Drop your AI-browsing consumption by up over 90%&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Stop Giving LLMs Raw HTML: Build a Graph-Native, 96% More Efficient MCP Web Browser</title>
      <dc:creator>UnitBuilds</dc:creator>
      <pubDate>Tue, 26 May 2026 22:49:17 +0000</pubDate>
      <link>https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d</link>
      <guid>https://dev.to/unitbuilds_cc/stop-giving-llms-raw-html-build-a-graph-native-96-more-efficient-mcp-web-browser-4h5d</guid>
      <description>&lt;p&gt;As developers building AI agents, we’ve all run into the same massive bottleneck: &lt;strong&gt;how do you let a Language Model (LLM) browse the web without destroying your API budget or driving execution latency through the roof?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most current agent frameworks solve web browsing in one of two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Raw HTML Scraping&lt;/strong&gt;: Injecting hundreds of thousands of tokens of raw HTML (complete with styling classes, analytics scripts, and SVG paths) straight into the context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Screenshotting&lt;/strong&gt;: Sending high-resolution images to a Vision LLM (VLM) and hoping it doesn't hallucinate element coordinates when clicking buttons.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both methods are slow, expensive, and fragile.&lt;/p&gt;

&lt;p&gt;Today, we’re open-sourcing &lt;strong&gt;MCP Lite&lt;/strong&gt;—a standalone, graph-native Model Context Protocol (MCP) browser automation server written in Go. By utilizing Chrome’s Accessibility Object Model (AOM), custom stealth extensions, and Neo4j graph transition mapping, we reduced the context footprint by up to &lt;strong&gt;96.7%&lt;/strong&gt; and achieved a &lt;strong&gt;3.0x execution speedup&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is how we built it, the benchmarks we hit, and how you can use it in your agent stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Architecture: Semantic AOM Pruning
&lt;/h2&gt;

&lt;p&gt;When a human looks at a webpage, they don't read the raw HTML code. They look for interactive components: buttons, text fields, links, and headers. Chrome’s accessibility engine translates the visual DOM into a structured &lt;strong&gt;Accessibility Object Model (AOM)&lt;/strong&gt; for screen readers.&lt;/p&gt;

&lt;p&gt;MCP Lite taps directly into Chrome's AOM via &lt;code&gt;chromedp&lt;/code&gt;. We extract this tree and apply a recursive pruning filter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prune Non-Semantic Nodes&lt;/strong&gt;: We strip away generic containers, layout tables, and presentation divs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redundant Flattening&lt;/strong&gt;: If a link contains a single text child with the same label, we flatten it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retain Spatial Bounding Boxes&lt;/strong&gt;: We keep physical screen coordinates &lt;code&gt;(x, y, width, height)&lt;/code&gt; only for actionable nodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the visual lifecycle of a page representation as it moves through the pruning pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    HTML["Raw HTML / DOM (100K+ Tokens)"] --&amp;gt;|CDP Session| AOM["Accessibility Object Model (AOM)"]
    AOM --&amp;gt;|Pruning &amp;amp; Redundancy Filter| Pruned["Pruned AOM (90%+ Token Reduction)"]
    Pruned --&amp;gt;|Targeted Clicks| Action["Logical Clicks (nodeId)"]
    Pruned --&amp;gt;|SHA-256 Signature| Hashing["Deterministic State Hashing"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  The Impact: Wikipedia &amp;amp; GitHub Benchmarks
&lt;/h3&gt;

&lt;p&gt;We ran our benchmarking engine against real-world targets comparing the pruned AOM against standard full-HTML extraction:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Site&lt;/th&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Standard Full-HTML&lt;/th&gt;
&lt;th&gt;MCP Lite (Pruned AOM)&lt;/th&gt;
&lt;th&gt;Token Savings / Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;wikipedia.org&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Payload Size&lt;/strong&gt; &lt;br&gt; &lt;strong&gt;Est. Tokens&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;435 KB &lt;br&gt; 108,863&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;47 KB&lt;/strong&gt; &lt;br&gt; &lt;strong&gt;11,956&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;89.02% reduction&lt;/strong&gt; in input tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Latency (3 Steps)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9.0s (100% Agent Loop)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.0s (0% Agent Loop)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;3.0x speedup&lt;/strong&gt; via workflow playback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;github.com&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Payload Size&lt;/strong&gt; &lt;br&gt; &lt;strong&gt;Est. Tokens&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;594 KB &lt;br&gt; 148,625&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;19 KB&lt;/strong&gt; &lt;br&gt; &lt;strong&gt;4,774&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;96.79% reduction&lt;/strong&gt; (Perfect for modern SPAs)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Instead of feeding &lt;strong&gt;148,000 tokens&lt;/strong&gt; to the LLM for a single GitHub page, the agent only processes &lt;strong&gt;4,770 tokens&lt;/strong&gt;—making inference faster and significantly cheaper.&lt;/p&gt;


&lt;h2&gt;
  
  
  Bypassing Bot Detection: Hardening Chrome
&lt;/h2&gt;

&lt;p&gt;Automating browsers usually triggers bot protection (Cloudflare, DataDome, etc.). MCP Lite loads a custom content script extension (&lt;code&gt;inject.js&lt;/code&gt;) at startup that executes at &lt;code&gt;document_start&lt;/code&gt; across all frames:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;navigator.webdriver&lt;/code&gt; Masking&lt;/strong&gt;: Instead of just overriding the property, we mock the getter. If a bot detector calls &lt;code&gt;.toString()&lt;/code&gt; on &lt;code&gt;navigator.webdriver&lt;/code&gt;, our mock returns the exact native string signature:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;webdriver&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="nx"&gt;native&lt;/span&gt; &lt;span class="nx"&gt;code&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;PluginArray Prototype Realignment&lt;/strong&gt;: Standard mock scripts fail checks like &lt;code&gt;navigator.plugins instanceof PluginArray&lt;/code&gt;. We reconstruct the fake plugins list and link their prototypes directly to &lt;code&gt;PluginArray.prototype&lt;/code&gt; and &lt;code&gt;Plugin.prototype&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions Query Alignment&lt;/strong&gt;: We align &lt;code&gt;Notification.permission&lt;/code&gt; and &lt;code&gt;navigator.permissions.query&lt;/code&gt; to resolve to &lt;code&gt;prompt&lt;/code&gt;, matching real browser configurations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The result?&lt;/strong&gt; A &lt;strong&gt;100% green pass&lt;/strong&gt; on benchmarks like &lt;code&gt;bot.sannysoft.com&lt;/code&gt; and seamless access to sites like &lt;code&gt;G2.com&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Graph-Native Navigation Mapping
&lt;/h2&gt;

&lt;p&gt;Every web interaction is a state transition. When the agent clicks a button, the page layout changes. &lt;/p&gt;

&lt;p&gt;MCP Lite integrates with &lt;strong&gt;Neo4j&lt;/strong&gt; to represent these layouts as nodes and interactions as edges. At every page load:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We compute a &lt;strong&gt;SHA-256 hash&lt;/strong&gt; of the serialized pruned AOM structure to represent the page’s unique layout &lt;code&gt;State&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We log transitions as an &lt;code&gt;INTERACTED&lt;/code&gt; edge:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;f:&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;hash:&lt;/span&gt; &lt;span class="n"&gt;$from&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;t:&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;hash:&lt;/span&gt; &lt;span class="n"&gt;$to&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="py"&gt;r:&lt;/span&gt;&lt;span class="n"&gt;INTERACTED&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;role:&lt;/span&gt; &lt;span class="n"&gt;$role&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="n"&gt;$name&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;index:&lt;/span&gt; &lt;span class="n"&gt;$index&lt;/span&gt;&lt;span class="ss"&gt;}]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;r.x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$x&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r.y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$y&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r.w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$w&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r.h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If an agent needs to navigate from its current page to a target URL, it queries Neo4j for the shortest path of logical interactions (e.g. "click Search -&amp;gt; type username -&amp;gt; click Submit") and replays them instantly, avoiding reasoning loops.&lt;/p&gt;


&lt;h2&gt;
  
  
  Replaying Workflows with Zero LLM Overhead
&lt;/h2&gt;

&lt;p&gt;For repetitive automation (such as bulk form submissions or multi-page scrapes), running the LLM in a step-by-step loop is expensive. &lt;/p&gt;

&lt;p&gt;MCP Lite includes a workflow engine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Record&lt;/strong&gt;: Call &lt;code&gt;workflow_record_start&lt;/code&gt; and perform actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template&lt;/strong&gt;: Actions are written to a JSON file. Use double-braces (&lt;code&gt;{{variable_name}}&lt;/code&gt;) to define input fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replay&lt;/strong&gt;: Play back the workflow with an input dataset:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"search_query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"adidas campus green"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"search_query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nike air force white"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The browser handles the automation loop natively, feeding variables into the template and running actions sequentially with &lt;strong&gt;0% LLM overhead&lt;/strong&gt; during playback.&lt;/p&gt;


&lt;h2&gt;
  
  
  Try It Yourself!
&lt;/h2&gt;

&lt;p&gt;The repository is open-source under the &lt;strong&gt;GNU AGPL-v3&lt;/strong&gt; license. &lt;/p&gt;
&lt;h3&gt;
  
  
  Quick Build
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/UnitBuilds-CC/MCP-Lite.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mcp-lite
go mod tidy
build.bat &lt;span class="c"&gt;# Rebuilds server, benchmark, and test binaries&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Configure Claude Desktop
&lt;/h3&gt;

&lt;p&gt;Add it to your &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"agentic-browser-mcp-lite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;path&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;to&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;mcp-lite&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;mcp-server.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"NEO4J_URI"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bolt://localhost:7687"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"NEO4J_USER"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"neo4j"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"NEO4J_PASS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"secure_password"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Check out the code, run the benchmark suite against your own target sites, and join us in building a more efficient web automation standard!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/UnitBuilds-CC/MCP-Lite" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Star MCP-Lite on GitHub&lt;/a&gt;
&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/UnitBuilds-CC" rel="noopener noreferrer"&gt;
        UnitBuilds-CC
      &lt;/a&gt; / &lt;a href="https://github.com/UnitBuilds-CC/MCP-Lite" rel="noopener noreferrer"&gt;
        MCP-Lite
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AOM driven Agentic browser MCP
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Agentic Browser (MCP Lite) 🚀&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A highly-efficient, standalone, graph-native version of the Agentic Browser MCP Server. It provides direct LLM control over Google Chrome via the Model Context Protocol (MCP) using &lt;code&gt;chromedp&lt;/code&gt;. It integrates with &lt;strong&gt;Neo4j&lt;/strong&gt; to build site graphs, query shortest action paths, and automate complex workflows with looping and parameter binding.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;


&lt;ol&gt;

&lt;li&gt;

&lt;strong&gt;Raw MCP Browser Automation&lt;/strong&gt;: Perform standard interactions (navigate, click, type, scroll, wait, drag, screenshot, list frames) using standard logical pixel offsets.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Neo4j Graph Logging&lt;/strong&gt;: Automatically logs page navigation data (titles, links, scripts, and cookies) and AOM state-transition graphs directly to a Neo4j database.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;BFS Site Crawling&lt;/strong&gt;: Traverses a site using Breadth-First Search (BFS) to map structural accessibility states and link action transitions.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Shortest Path Execution&lt;/strong&gt;: Query Neo4j for the shortest sequence of actions from any start state/URL to a target state/URL, and execute the transitions automatically.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Workflow Recording &amp;amp; Execution&lt;/strong&gt;…&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/UnitBuilds-CC/MCP-Lite" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





&lt;h2&gt;
  
  
  Discussion
&lt;/h2&gt;

&lt;p&gt;How are you currently handling web browsing for your AI agents? Are you hitting context limits with raw HTML, or have you tried vision-based approaches? &lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts on using the AOM vs. the DOM for these types of workflows!&lt;/p&gt;

</description>
      <category>llm</category>
      <category>mcp</category>
      <category>neo4j</category>
      <category>go</category>
    </item>
    <item>
      <title>I'd have thought more people would be interested in the obliteration of WASM's poor performance?

https://dev.to/unitbuilds_cc/how-i-bypassed-blazor-webassemblys-virtual-dom-using-raw-wasm-pointers-4jn7</title>
      <dc:creator>UnitBuilds</dc:creator>
      <pubDate>Tue, 26 May 2026 20:52:57 +0000</pubDate>
      <link>https://dev.to/unitbuilds/id-have-thought-more-people-would-be-interested-in-the-obliteration-of-wasms-poor-performance-jid</link>
      <guid>https://dev.to/unitbuilds/id-have-thought-more-people-would-be-interested-in-the-obliteration-of-wasms-poor-performance-jid</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/unitbuilds_cc/how-i-bypassed-blazor-webassemblys-virtual-dom-using-raw-wasm-pointers-4jn7" class="crayons-story__hidden-navigation-link"&gt;How I bypassed Blazor WebAssembly's Virtual DOM using raw WASM pointers&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/unitbuilds_cc"&gt;
            &lt;img alt="UnitBuilds CC logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F13448%2F1264f654-c6d4-45c9-9793-e785588489c7.png" class="crayons-logo__image" width="339" height="381"&gt;
          &lt;/a&gt;

          &lt;a href="/unitbuilds" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3949275%2F0d884b0e-b445-4e47-a064-505d61283071.png" alt="unitbuilds profile" class="crayons-avatar__image" width="339" height="381"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/unitbuilds" class="crayons-story__secondary fw-medium m:hidden"&gt;
              UnitBuilds
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                UnitBuilds
                
              
              &lt;div id="story-author-preview-content-3742259" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/unitbuilds" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3949275%2F0d884b0e-b445-4e47-a064-505d61283071.png" class="crayons-avatar__image" alt="" width="339" height="381"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;UnitBuilds&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/unitbuilds_cc" class="crayons-story__secondary fw-medium"&gt;UnitBuilds CC&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/unitbuilds_cc/how-i-bypassed-blazor-webassemblys-virtual-dom-using-raw-wasm-pointers-4jn7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 24&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/unitbuilds_cc/how-i-bypassed-blazor-webassemblys-virtual-dom-using-raw-wasm-pointers-4jn7" id="article-link-3742259"&gt;
          How I bypassed Blazor WebAssembly's Virtual DOM using raw WASM pointers
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blazor"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blazor&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webassembly"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webassembly&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/csharp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;csharp&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/unitbuilds_cc/how-i-bypassed-blazor-webassemblys-virtual-dom-using-raw-wasm-pointers-4jn7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>V.A.L.I.D.</title>
      <dc:creator>UnitBuilds</dc:creator>
      <pubDate>Sun, 24 May 2026 18:15:51 +0000</pubDate>
      <link>https://dev.to/unitbuilds_cc/valid-546l</link>
      <guid>https://dev.to/unitbuilds_cc/valid-546l</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;V.A.L.I.D.&lt;/strong&gt; (Vectorized Asynchronous Logic &amp;amp; Intelligent Diagnostics) — a lightweight, high-performance state-tracking and business logic framework for .NET 8 and Blazor WebAssembly applications. &lt;/p&gt;

&lt;p&gt;Enterprise .NET frameworks like CSLA or state containers like Fluxor are heavily dependent on reflection and heap-allocated tracking collections. V.A.L.I.D. replaces all of that with a zero-allocation compile-time model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bitmask Register State Tracking:&lt;/strong&gt; Uses &lt;code&gt;System.UInt128&lt;/code&gt; bitmasks to track up to 128 property flags (dirty, error, busy, deleted) in $O(1)$ time with 0 B allocated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VDOM &amp;amp; JS Serialization Bypass:&lt;/strong&gt; Allocates a contiguous native memory slab (&lt;code&gt;UnmanagedSlab&lt;/code&gt;) on the WebAssembly linear heap. A JavaScript requestAnimationFrame render loop directly reads the WASM heap (&lt;code&gt;HEAPU8&lt;/code&gt;) to surgically update elements, bypassing Blazor's Virtual DOM diffing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roslyn Source Generator:&lt;/strong&gt; Generates the properties, circular undo/redo history, F# record mappings, and auto-generates unit/fuzz tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F# Rules Engine:&lt;/strong&gt; Projects C# states onto immutable F# struct records, resolving offline-first replication conflicts with mathematical Add-Wins Observed-Removed Set (AWORSet) CRDTs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/UnitBuilds-CC/V.A.L.I.D." rel="noopener noreferrer"&gt;UnitBuilds-CC/V.A.L.I.D.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Official Documentation:&lt;/strong&gt; &lt;a href="https://github.com/UnitBuilds-CC/V.A.L.I.D./wiki" rel="noopener noreferrer"&gt;V.A.L.I.D. Wiki&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture Overview
&lt;/h3&gt;

&lt;p&gt;Below is the visual flow of our surgical WASM bypass architecture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05iynf166cfg7cw837u6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05iynf166cfg7cw837u6.png" alt="V.A.L.I.D. Widescreen Architecture Diagram" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Benchmarks
&lt;/h3&gt;

&lt;p&gt;Here are the official BenchmarkDotNet results comparing V.A.L.I.D.'s direct memory write speed against standard Blazor VDOM mutations:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F585tpxmdnhplnrq64irv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F585tpxmdnhplnrq64irv.png" alt="V.A.L.I.D. Performance Benchmarks" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark Operation&lt;/th&gt;
&lt;th&gt;Execution Time (Mean)&lt;/th&gt;
&lt;th&gt;Gen 0 / 1000&lt;/th&gt;
&lt;th&gt;Allocated Memory&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VALID Slab direct memory write&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.62 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26.7x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;F# Rule Evaluation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15.80 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.4x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;F# CRDT Convergence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.48 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0391&lt;/td&gt;
&lt;td&gt;328 B&lt;/td&gt;
&lt;td&gt;1.8x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blazor VDOM Mutation (Baseline)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;172.78 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0048&lt;/td&gt;
&lt;td&gt;40 B&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Baseline&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;Before the challenge, V.A.L.I.D. was an experimental proof-of-concept sitting unfinished in my local directory. The code had compilation bugs, the packaging configuration was broken, and the JS-WASM bridge was prone to memory allocation crashes when the WASM memory buffer resized. &lt;/p&gt;

&lt;p&gt;Here is what we did to cross the finish line:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Refactored core library dependencies&lt;/strong&gt; to support clean .NET 8 builds and verified 100% test coverage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed the JS memory relocation bug&lt;/strong&gt; in our surgical bridge (&lt;code&gt;vavid-bypass.js&lt;/code&gt;). We added a background heartbeat inspector that checks a magic pulse header in WASM memory, allowing the JS loop to automatically re-bind to the heap if the WASM buffer resizes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured the NuGet packaging pipelines&lt;/strong&gt; and versioned the assets (&lt;code&gt;VALID 3.0.3&lt;/code&gt; and &lt;code&gt;VALID.FSharp 3.0.1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Created the official release pipeline&lt;/strong&gt;, pushing tagged releases (&lt;code&gt;v3.0.3&lt;/code&gt;) and uploading &lt;code&gt;.nupkg&lt;/code&gt; assets to the release tab.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrote a 6-page comprehensive Wiki&lt;/strong&gt; covering Core Concepts, Getting Started, Business Objects, Validation Rules, and Blazor Integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Populated the GitHub Projects board&lt;/strong&gt; with the Blazor Cashbook Demo to give developers a working sandbox.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot acted as an invaluable co-pilot throughout the final polishing process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Writing Boilerplate &amp;amp; Generators:&lt;/strong&gt; Copilot expedited the creation of the Roslyn Source Generator syntax trees, writing the recursive C# property-to-bit mapping code in minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging Low-Level JS-Interop:&lt;/strong&gt; Copilot helped write the safety heartbeat and pointer relocation code in JavaScript, ensuring the WASM &lt;code&gt;HEAPU8&lt;/code&gt; array offset changes were handled gracefully.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation &amp;amp; Wiki Generation:&lt;/strong&gt; Copilot read our codebase and compiled clear, concise API documentation for our Wiki pages, ensuring the migration path from legacy frameworks (like CSLA) was fully documented.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
    </item>
    <item>
      <title>How I bypassed Blazor WebAssembly's Virtual DOM using raw WASM pointers</title>
      <dc:creator>UnitBuilds</dc:creator>
      <pubDate>Sun, 24 May 2026 17:53:21 +0000</pubDate>
      <link>https://dev.to/unitbuilds_cc/how-i-bypassed-blazor-webassemblys-virtual-dom-using-raw-wasm-pointers-4jn7</link>
      <guid>https://dev.to/unitbuilds_cc/how-i-bypassed-blazor-webassemblys-virtual-dom-using-raw-wasm-pointers-4jn7</guid>
      <description>&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The Bottleneck&lt;/li&gt;
&lt;li&gt;Step 1: The Memory Slab&lt;/li&gt;
&lt;li&gt;Step 2: JSExport Bridge&lt;/li&gt;
&lt;li&gt;Step 3: DOM Mutation&lt;/li&gt;
&lt;li&gt;The Performance Payoff&lt;/li&gt;
&lt;li&gt;Compile-time Generation with Roslyn&lt;/li&gt;
&lt;li&gt;Try it yourself!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottleneck: When WebAssembly UI gets sluggish
&lt;/h2&gt;

&lt;p&gt;If you've ever built a heavy data grid, a real-time telemetry dashboard, or a line-of-business spreadsheet application in Blazor WebAssembly, you've likely hit the rendering wall.&lt;/p&gt;

&lt;p&gt;Blazor WASM is incredibly productive, but when thousands of cells change multiple times a second:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every property change triggers an event.&lt;/li&gt;
&lt;li&gt;Every event triggers standard Blazor component cycle overhead (&lt;code&gt;StateHasChanged&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The Virtual DOM (VDOM) diffs the old rendering tree with the new one.&lt;/li&gt;
&lt;li&gt;JS-Interop serializes the diffs and updates the browser DOM.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Under high frequency (like 100+ updates per second on 5,000+ fields), this pipeline stutters. The CPU spikes to 100%, garbage collection (GC) triggers pauses, and key-press latency rises.&lt;/p&gt;

&lt;p&gt;We decided to see if we could completely bypass Blazor's rendering pipeline while maintaining C# as the single source of truth for business logic.&lt;/p&gt;

&lt;p&gt;Our solution is &lt;strong&gt;V.A.L.I.D.&lt;/strong&gt;—a compile-time state-tracking framework that shares raw WebAssembly memory slabs directly with JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: The Unmanaged Memory Slab in C
&lt;/h2&gt;

&lt;p&gt;To avoid heap allocations and GC overhead when managing object states (dirty, error, busy, deleted), we allocate a contiguous block of native memory on the WebAssembly linear heap.&lt;/p&gt;

&lt;p&gt;We built a custom bump allocator wrapper called &lt;code&gt;UnmanagedSlab&amp;lt;T&amp;gt;&lt;/code&gt; that uses &lt;code&gt;NativeMemory.Alloc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;unsafe&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UnmanagedSlab&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IDisposable&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;unmanaged&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;_pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UnmanagedSlab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_length&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;// Allocate contiguous memory in the WASM heap&lt;/span&gt;
        &lt;span class="n"&gt;_pointer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;*)&lt;/span&gt;&lt;span class="n"&gt;NativeMemory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Alloc&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;nuint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;nuint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;_pointer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;GetUnsafePointer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Dispose calls NativeMemory.Free...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;Every business object in the application is registered to a fixed slot in this slab. Its state flags are represented as single bits in a System.UInt128 mask register, giving us up to 128 fields tracked per object in O(1) time with 0 heap allocations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: The JSExport Bridge
&lt;/h2&gt;

&lt;p&gt;Next, we need to let JavaScript know where this memory block is. We use .NET 8's new JS interop system with [JSExport] inside our WebWorkerBridge class:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WebWorkerBridge&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;UnmanagedSlab&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UInt128&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;?&lt;/span&gt; &lt;span class="n"&gt;_stateSlab&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;JSExport&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;unsafe&lt;/span&gt; &lt;span class="kt"&gt;nint&lt;/span&gt; &lt;span class="nf"&gt;GetStatePointer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_stateSlab&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;nint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;_stateSlab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetUnsafePointer&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When our Blazor page initializes, we retrieve this pointer and pass it directly to JS as a long integer address:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebWorkerBridge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetStatePointer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebWorkerBridge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetSlabLength&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;JSRuntime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;InvokeVoidAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"__VAVID_INITIALIZE_INDUSTRIAL_BYPASS__"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Step 3: Surgical DOM Mutation in JS
&lt;/h2&gt;

&lt;p&gt;Once JavaScript receives the memory address, it connects to Mono's WebAssembly linear heap buffer (HEAPU8 array).&lt;/p&gt;

&lt;p&gt;First, we compile a surgical map of DOM inputs. Every VavidInput.razor component renders standard metadata data-attributes rather than binding inputs to Blazor:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;vavid&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="s"&gt;"
&lt;/span&gt;       &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"@Value"&lt;/span&gt;
       &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vavid&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;slab&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"@SlabIndex"&lt;/span&gt;
       &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vavid&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"@BitIndex"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;Our JS code parses these elements on startup and runs a high-performance requestAnimationFrame loop.&lt;/p&gt;

&lt;p&gt;Because we know the exact byte offsets, JS can read the dirty/error/busy bitmasks directly from the heap array and surgically toggle class names without going through the VDOM:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;syncSurgicalMap&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;h&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;globalThis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;globalThis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HEAPU8&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;statePointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// the nint address from C#&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;surgicalMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&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;entry&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;surgicalMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&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;ptr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// slot offset&lt;/span&gt;

        &lt;span class="c1"&gt;// Read dirty and error bit flags directly from WASM memory&lt;/span&gt;
        &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;isDirty&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bitByte&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bitMask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;!==&lt;/span&gt; &lt;span class="m"&gt;0&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;hasError&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bitByte&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bitMask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;!==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Toggle UI classes instantly in place&lt;/span&gt;
        &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isDirty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;vavid&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dirty&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;vavid&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dirty&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;vavid&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;vavid&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="err"&gt;'&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  The Performance Payoff
&lt;/h2&gt;

&lt;p&gt;We ran micro-benchmarks comparing this bypass model to standard Blazor VDOM mutation and F# rules engines:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Gen 0 / 1000&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VALID Slab direct memory write&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.62 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26.7x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F# Rule Evaluation&lt;/td&gt;
&lt;td&gt;15.80 ns&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;0 B&lt;/td&gt;
&lt;td&gt;10.4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blazor VDOM Mutation (Baseline)&lt;/td&gt;
&lt;td&gt;172.78 ns&lt;/td&gt;
&lt;td&gt;0.0048&lt;/td&gt;
&lt;td&gt;40 B&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At 6.6ns per update with 0 bytes allocated, state tracking is running at register-level CPU efficiency.&lt;/p&gt;

&lt;p&gt;By avoiding Blazor's entire component render cycle, UI grids can handle millions of visual updates with zero input latency.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Compile-time Generation with Roslyn
&lt;/h2&gt;

&lt;p&gt;Writing manual pointer offsets and bit masks by hand for every class is exhausting. To keep the developer experience clean, we built a Roslyn Source Generator.&lt;/p&gt;

&lt;p&gt;All you do is write a partial class:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ValidObject&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Invoice&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;CustomerName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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="s"&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;Range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;Amount&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The source generator intercepts this at build time and generates the bitmask backing properties, circular undo/redo history, F# record projections, and auto-generates unit/fuzz tests right into your test projects.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it yourself!
&lt;/h2&gt;

&lt;p&gt;V.A.L.I.D. is fully open-source. If you want to check out the WASM memory management, review the source generators, or run the Blazor grid benchmark locally, check out the repository:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/UnitBuilds-CC" rel="noopener noreferrer"&gt;
        UnitBuilds-CC
      &lt;/a&gt; / &lt;a href="https://github.com/UnitBuilds-CC/V.A.L.I.D." rel="noopener noreferrer"&gt;
        V.A.L.I.D.
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      V.A.L.I.D. (Vectorized Asynchronous Logic &amp;amp; Intelligent Diagnostics)
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;V.A.L.I.D. (Vectorized Asynchronous Logic &amp;amp; Intelligent Diagnostics)&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/UnitBuilds-CC/V.A.L.I.D" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9e968d9471725151bf93b46bcd079913754b36f39f5205ac6b0c1e18328adb7b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5374617475732d537461626c652d627269676874677265656e" alt="Framework Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/UnitBuilds-CC/V.A.L.I.D" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a0fa059a0b6612c64ae7f79aca4969bc0fdcf87c1dc887523adaa4a84ca333ff/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506572666f726d616e63652d566563746f72697a65642d626c7565" alt="Performance"&gt;&lt;/a&gt;
&lt;a href="https://github.com/UnitBuilds-CC/V.A.L.I.D" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/987132214657a7dae35815af9d501d541cc64ff98ec24bbead6f5ee0a61c8d3b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4855442d562e412e562e492e442e2d6f72616e6765" alt="Diagnostics"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;V.A.L.I.D. is a high-performance, low-latency business logic framework for .NET. It replaces standard reflection-based change tracking with a compile-time, bitmask-driven, and compiler-integrated architecture.&lt;/p&gt;
&lt;p&gt;Built specifically for complex enterprise data management, V.A.L.I.D. ensures surgical precision in synchronization and real-time visibility in the browser.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚡ Performance Benchmarks&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;V.A.L.I.D. is engineered for absolute zero-allocation on core operations. Below are the official BenchmarkDotNet results comparing V.A.L.I.D.'s direct memory write speed against other state-management components:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;BenchmarkDotNet v0.13.12, Windows 11 (10.0.29591.1000)
.NET SDK 10.0.200-preview.0.26103.119
  [Host]     : .NET 8.0.24 (8.0.2426.7010), X64 RyuJIT AVX2
  DefaultJob : .NET 8.0.24 (8.0.2426.7010), X64 RyuJIT AVX2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Gen0&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VALID Slab direct memory write&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.619 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.1573 ns&lt;/td&gt;
&lt;td&gt;0.2305 ns&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;- (0 B)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;F# Rule Evaluation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15.800 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.3659 ns&lt;/td&gt;
&lt;td&gt;0.7308 ns&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;- (0 B)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;F# CRDT Convergence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.478 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.7367 ns&lt;/td&gt;
&lt;td&gt;3.7384 ns&lt;/td&gt;
&lt;td&gt;0.0391&lt;/td&gt;
&lt;td&gt;328 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blazor VDOM Mutation&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/UnitBuilds-CC/V.A.L.I.D." rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I’d love to hear your thoughts on this. Is sharing raw pointers with JS in WebAssembly too unsafe for typical business applications, or is the performance payoff worth the trade-off?&lt;/p&gt;

</description>
      <category>blazor</category>
      <category>webassembly</category>
      <category>performance</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
