<?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>Forem: camb</title>
    <description>The latest articles on Forem by camb (@camb).</description>
    <link>https://forem.com/camb</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%2F3631370%2F6336d09b-e45d-4358-974c-ea2477c70a93.png</url>
      <title>Forem: camb</title>
      <link>https://forem.com/camb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/camb"/>
    <language>en</language>
    <item>
      <title>Our content engine now outputs 4K lossless WebM because I solved an RGBA problem that was killing quality!</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Sat, 11 Apr 2026 22:25:29 +0000</pubDate>
      <link>https://forem.com/camb/our-content-engine-now-outputs-4k-lossless-webm-because-i-solved-an-rgba-problem-that-was-killing-46a9</link>
      <guid>https://forem.com/camb/our-content-engine-now-outputs-4k-lossless-webm-because-i-solved-an-rgba-problem-that-was-killing-46a9</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/camb/how-i-fixed-transparent-video-alpha-in-playwright-using-1970s-film-math-2j38" class="crayons-story__hidden-navigation-link"&gt;How I Fixed Transparent Video Alpha in Playwright Using 1970s Film Math&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 href="/camb" class="crayons-avatar  crayons-avatar--l  "&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%2F3631370%2F6336d09b-e45d-4358-974c-ea2477c70a93.png" alt="camb profile" class="crayons-avatar__image" width="537" height="520"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/camb" class="crayons-story__secondary fw-medium m:hidden"&gt;
              camb
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                camb
                
              
              &lt;div id="story-author-preview-content-3484582" 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="/camb" 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%2F3631370%2F6336d09b-e45d-4358-974c-ea2477c70a93.png" class="crayons-avatar__image" alt="" width="537" height="520"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;camb&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;/div&gt;
          &lt;a href="https://dev.to/camb/how-i-fixed-transparent-video-alpha-in-playwright-using-1970s-film-math-2j38" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 11&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/camb/how-i-fixed-transparent-video-alpha-in-playwright-using-1970s-film-math-2j38" id="article-link-3484582"&gt;
          How I Fixed Transparent Video Alpha in Playwright Using 1970s Film Math
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/node"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;node&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ffmpeg"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ffmpeg&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/camb/how-i-fixed-transparent-video-alpha-in-playwright-using-1970s-film-math-2j38" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/camb/how-i-fixed-transparent-video-alpha-in-playwright-using-1970s-film-math-2j38#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add 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>
      <category>algorithms</category>
      <category>automation</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Fixed Transparent Video Alpha in Playwright Using 1970s Film Math</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Sat, 11 Apr 2026 01:31:54 +0000</pubDate>
      <link>https://forem.com/camb/how-i-fixed-transparent-video-alpha-in-playwright-using-1970s-film-math-2j38</link>
      <guid>https://forem.com/camb/how-i-fixed-transparent-video-alpha-in-playwright-using-1970s-film-math-2j38</guid>
      <description>&lt;h2&gt;
  
  
  How I Fixed Transparent Video Alpha in Playwright Using 1970s Film Math
&lt;/h2&gt;

&lt;p&gt;I've been building a content engine that renders HTML/CSS graphics to transparent video overlays — the kind you drop on a timeline in CapCut or Premiere with a drop shadow, gradient text, and a glow. Clean, professional, automated.&lt;/p&gt;

&lt;p&gt;It worked great in the browser. It worked fine as a WebM preview. And then the moment I imported it into any video editor, every single shadow and glow rendered as a solid colored blob.&lt;/p&gt;

&lt;p&gt;Days of debugging later, I found the fix — and it's a technique from 1970s film compositing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;The pipeline was straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate HTML/CSS graphics with Playwright (headless Chrome)&lt;/li&gt;
&lt;li&gt;Screenshot each frame with &lt;code&gt;omitBackground: true&lt;/code&gt; to get transparent PNGs&lt;/li&gt;
&lt;li&gt;Stitch frames into WebM or ProRes 4444 with FFmpeg&lt;/li&gt;
&lt;li&gt;Import into CapCut and composite over video&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The shadows looked perfect in the browser. Correct in the WebM preview in Chrome. But inside CapCut — or any NLE — they showed up as hard-edged solid blobs. A &lt;code&gt;filter: drop-shadow(0 0 20px rgba(123,97,255,0.7))&lt;/code&gt; that should be a soft purple halo was rendering as a solid purple rectangle.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Actually Happening
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Premultiplied vs. Straight Alpha
&lt;/h3&gt;

&lt;p&gt;There are two ways to store RGBA pixel data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Straight alpha&lt;/strong&gt; — RGB and alpha are independent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pixel = (R, G, B, A)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Premultiplied (associated) alpha&lt;/strong&gt; — RGB is already multiplied by alpha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pixel = (R×A, G×A, B×A, A)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chrome composites internally using premultiplied alpha. When you call &lt;code&gt;page.screenshot({ omitBackground: true })&lt;/code&gt;, it has to convert from premultiplied back to straight alpha for the PNG export. That conversion is lossy at very low alpha values. The soft glow edge pixels at 2%, 5%, 8% opacity either round to zero or get the wrong color.&lt;/p&gt;

&lt;p&gt;ProRes 4444 is specced for premultiplied alpha — that's what NLEs expect. So you're encoding already-corrupted data into a format that assumes clean data. The NLE reads it, assumes premultiplied, and composites incorrectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;code&gt;background-clip: text&lt;/code&gt; Problem
&lt;/h3&gt;

&lt;p&gt;Separately, &lt;code&gt;background-clip: text&lt;/code&gt; + &lt;code&gt;text-fill-color: transparent&lt;/code&gt; has a rendering bug in headless Playwright with &lt;code&gt;omitBackground: true&lt;/code&gt;. Instead of gradient-colored text on a transparent background, Chrome renders a solid gradient rectangle with the letter shapes punched out as transparent holes. The complete inverse of what you want.&lt;/p&gt;




&lt;h2&gt;
  
  
  Approaches That Don't Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Banning the CSS&lt;/strong&gt; — Just ban &lt;code&gt;filter:&lt;/code&gt;, &lt;code&gt;rgba()&lt;/code&gt;, &lt;code&gt;text-shadow&lt;/code&gt;. Only fully opaque or fully transparent pixels. This makes the alpha clean but the graphics flat and lifeless. Not usable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixing the FFmpeg encode:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input_%06d.png &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"premultiply=inplace=1"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v prores_ks &lt;span class="nt"&gt;-profile&lt;/span&gt;:v 4444 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-pix_fmt&lt;/span&gt; yuva444p10le &lt;span class="nt"&gt;-alpha_bits&lt;/span&gt; 16 &lt;span class="se"&gt;\&lt;/span&gt;
  output.mov
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps at the codec level. But the source PNGs from &lt;code&gt;omitBackground: true&lt;/code&gt; are already broken before FFmpeg touches them. You're premultiplying corrupted data.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fix: Background Subtraction
&lt;/h2&gt;

&lt;p&gt;The insight: &lt;strong&gt;you don't need the browser to give you alpha at all.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Render each frame twice — once on solid black, once on solid white. The browser renders both correctly because it's just rendering a webpage on a known background. No alpha pipeline involved.&lt;/p&gt;

&lt;p&gt;Then derive the correct RGBA for every pixel using the Porter-Duff equations.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Math
&lt;/h3&gt;

&lt;p&gt;Given a foreground pixel with color &lt;code&gt;fg&lt;/code&gt; and alpha &lt;code&gt;α&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;On black &lt;code&gt;(0,0,0)&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rendered_black = fg × α
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On white &lt;code&gt;(255,255,255)&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rendered_white = fg × α + 255 × (1-α)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Subtract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;white - black = 255 × (1-α)
α = 1 - (white - black) / 255
α (0–255) = 255 - (white - black)
fg = black / α
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is exact for every pixel at every opacity level — including the 2% opacity glow edges that &lt;code&gt;omitBackground&lt;/code&gt; was mangling. This technique is called &lt;strong&gt;background subtraction&lt;/strong&gt; or &lt;strong&gt;difference matting&lt;/strong&gt;. It's been in film VFX since the 1970s.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;sharp&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sharp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;extractAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blackBuf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;whiteBuf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="nf"&gt;sharp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blackBuf&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;removeAlpha&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toBuffer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;resolveWithObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nf"&gt;sharp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;whiteBuf&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;removeAlpha&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toBuffer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;resolveWithObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;wD&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&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="nx"&gt;N&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;bG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;bB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;wD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;wG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;wD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;wB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;wD&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="c1"&gt;// Per-channel alpha — take max for best color recovery&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wR&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;bR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wG&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;bG&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wB&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;bB&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="nx"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bG&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bB&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;alpha&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sharp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;channels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&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;png&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toBuffer&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;
  
  
  In the Capture Loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// OLD&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;framePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;omitBackground&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// NEW&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;background&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#000000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;background&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#000000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blackBuf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;background&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#ffffff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;background&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#ffffff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;whiteBuf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rgbaBuf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;extractAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blackBuf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;whiteBuf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;framePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rgbaBuf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  FFmpeg Encode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;execFileAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ffmpeg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-y&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-framerate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;30&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-i&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;frame%06d.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-vf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;premultiply=inplace=1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-c:v&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prores_ks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-profile:v&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4444&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-pix_fmt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yuva444p10le&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-alpha_bits&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;16&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output.mov&lt;/span&gt;&lt;span class="dl"&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;
  
  
  One Remaining Gotcha
&lt;/h2&gt;

&lt;p&gt;Don't put &lt;code&gt;overflow: hidden&lt;/code&gt; on a parent that directly wraps a &lt;code&gt;filter:&lt;/code&gt; element. Chrome's filter compositing layer gets clipped by the overflow boundary, producing a visible white rectangle around your element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* WRONG */&lt;/span&gt;
&lt;span class="nc"&gt;.row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.word&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;drop-shadow&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* CORRECT — let body/html handle the viewport clip */&lt;/span&gt;
&lt;span class="nc"&gt;.row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* overflow: visible by default */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&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;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;filter: drop-shadow&lt;/code&gt;, &lt;code&gt;text-shadow&lt;/code&gt;, &lt;code&gt;background-clip: text&lt;/code&gt;, &lt;code&gt;rgba()&lt;/code&gt; at any opacity — all render cleanly as transparent video with correct alpha in CapCut, Premiere, and DaVinci.&lt;/p&gt;

&lt;p&gt;The tradeoff is 2× the frame captures. For a 6-second clip at 30fps that's 360 screenshots instead of 180. About 90 extra seconds of render time. Acceptable for production output.&lt;/p&gt;

&lt;p&gt;The browser was always rendering correctly. The only problem was how we were asking for the pixel data.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The fix isn't in the encoding. It's in the capture.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
      <category>ffmpeg</category>
    </item>
    <item>
      <title>Video included!</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Fri, 03 Apr 2026 23:01:28 +0000</pubDate>
      <link>https://forem.com/camb/video-included-1gmb</link>
      <guid>https://forem.com/camb/video-included-1gmb</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/camb/i-built-a-hipaa-compliant-cms-with-bolt-and-xano-4id9" class="crayons-story__hidden-navigation-link"&gt;I Built a HIPAA-Compliant CMS with Bolt and Xano&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 href="/camb" class="crayons-avatar  crayons-avatar--l  "&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%2F3631370%2F6336d09b-e45d-4358-974c-ea2477c70a93.png" alt="camb profile" class="crayons-avatar__image" width="537" height="520"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/camb" class="crayons-story__secondary fw-medium m:hidden"&gt;
              camb
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                camb
                
              
              &lt;div id="story-author-preview-content-3451629" 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="/camb" 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%2F3631370%2F6336d09b-e45d-4358-974c-ea2477c70a93.png" class="crayons-avatar__image" alt="" width="537" height="520"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;camb&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;/div&gt;
          &lt;a href="https://dev.to/camb/i-built-a-hipaa-compliant-cms-with-bolt-and-xano-4id9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 3&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/camb/i-built-a-hipaa-compliant-cms-with-bolt-and-xano-4id9" id="article-link-3451629"&gt;
          I Built a HIPAA-Compliant CMS with Bolt and Xano
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hipaa"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hipaa&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/xano"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;xano&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/healthcare"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;healthcare&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/startup"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;startup&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/camb/i-built-a-hipaa-compliant-cms-with-bolt-and-xano-4id9" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/camb/i-built-a-hipaa-compliant-cms-with-bolt-and-xano-4id9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add 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;
            3 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>I Built a HIPAA-Compliant CMS with Bolt and Xano</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Fri, 03 Apr 2026 23:01:07 +0000</pubDate>
      <link>https://forem.com/camb/i-built-a-hipaa-compliant-cms-with-bolt-and-xano-4id9</link>
      <guid>https://forem.com/camb/i-built-a-hipaa-compliant-cms-with-bolt-and-xano-4id9</guid>
      <description>&lt;p&gt;If your app touches health data, the rules are different. HIPAA is a federal law, and violations come with real consequences. Not bug reports. Regulators.&lt;/p&gt;

&lt;p&gt;I built a full HIPAA-compliant content management system. Bolt for the frontend, Xano for the backend. Now, I want to walk through how it works.&lt;/p&gt;

&lt;p&gt;I also made a video covering this if you'd rather watch: &lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7445904475694788609/?originTrackingId=atriVGZ90kkDIxip384Y9g==" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD5605AQGCUhRzJIYKMg%2Fthumbnail-with-play-button-overlay-high%2FB56Z1UqjmrI8CA-%2F0%2F1775241943197%3Fe%3D2147483647%26v%3Dbeta%26t%3DoGChCAMdy4hex4c356bBjHTOdym7XkQQnnqQCkiJq9s" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7445904475694788609/?originTrackingId=atriVGZ90kkDIxip384Y9g==" rel="noopener noreferrer" class="c-link"&gt;
            Built a HIPAA-compliant CMS with bolt.new and Xano.

Bolt for the frontend. Xano for the backend. Field-level encryption, app-level RBAC, custom audit logs, BAA and BASA contracts covered.

The whole… | Cameron Booth
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Built a HIPAA-compliant CMS with bolt.new and Xano.

Bolt for the frontend. Xano for the backend. Field-level encryption, app-level RBAC, custom audit logs, BAA and BASA contracts covered.

The whole thing took only a couple days. Made a video walking through the build and breaking down what HIPAA actually requires if you're a developer.

Are you building a healthcare app? Let me know in the comments 👇
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  What HIPAA actually requires from developers
&lt;/h2&gt;

&lt;p&gt;HIPAA (Health Insurance Portability and Accountability Act) governs how Protected Health Information (PHI) is stored, transmitted, and accessed. PHI is any data that identifies a person and relates to their health: name, date of birth, diagnosis, insurance ID, even an IP address in certain contexts.&lt;/p&gt;

&lt;p&gt;If your app stores any of this, you need encryption, access controls, audit logging, and legal contracts (BAA/BASA) with every vendor in the chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; Built in Bolt. One prompt describing the CMS I needed, pointed at my Xano API, working UI in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Xano, with HIPAA addon enabled. The workspace runs on an isolated, hardened server on Google Cloud (which is itself HIPAA certified). All traffic encrypted in transit over TLS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Field-level encryption
&lt;/h2&gt;

&lt;p&gt;Encryption isn't just a database-wide toggle. In this CMS, sensitive fields are individually encrypted using AES-256. A patient's diagnosis, their SSN.. each field is encrypted independently.&lt;/p&gt;

&lt;p&gt;In the Xano function stack, the encryption logic looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create Variable: aes_key = env:HIPAA_AES_KEY
Create Variable: aes_iv  = env:HIPAA_AES_IV
Create Variable: decrypted = AES decrypt(encrypted_value, aes_key, aes_iv)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Even if someone with database access can see the table, they can't read encrypted field values without the decryption key. The key lives in environment variables, never in the function stack itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two layers of access control
&lt;/h2&gt;

&lt;p&gt;This is the part I think matters most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1: What we built.&lt;/strong&gt; At the application level, we implemented our own role-based access control as middleware and our own audit logging. &lt;/p&gt;

&lt;p&gt;Every API endpoint runs through a precondition check. If a non-admin user tries to hit a protected endpoint:&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;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ERROR_CODE_ACCESS_DENIED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Admin privileges required to access this resource."&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;That's not Xano blocking them. That's our code!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2: What Xano provides.&lt;/strong&gt; Underneath everything we built, Xano has its own RBAC and audit logging built into the platform. Every workspace action is tracked. Who did what, when, what changed. Platform-level access controls govern who can even see the workspace.&lt;/p&gt;

&lt;p&gt;Two independent layers. The platform enforces compliance at the infrastructure level. The app enforces it at the application level. That's what a HIPAA audit wants to see.&lt;/p&gt;
&lt;h2&gt;
  
  
  Audit logs
&lt;/h2&gt;

&lt;p&gt;Same two-layer principle. Xano tracks every workspace action automatically. But we also built application-level audit logs: who published an article, who edited a patient record, who changed permissions. And you control who can access those logs — compliance officer gets read-only, lead dev gets full access, junior dev sees nothing.&lt;/p&gt;
&lt;h2&gt;
  
  
  The contracts: BAA and BASA
&lt;/h2&gt;

&lt;p&gt;Any vendor touching PHI signs a Business Associate Agreement (BAA). But if a dev team was hired by a hospital and that team works with Xano, the right instrument is a BASA — Business Associate Subcontractor Agreement. Xano offers both.&lt;/p&gt;
&lt;h2&gt;
  
  
  Making changes safely
&lt;/h2&gt;

&lt;p&gt;Healthcare apps need safe deployment workflows. In Xano, you can branch your workspace, make schema changes in isolation, test your API calls against the new structure, and confirm your frontend handles it before anything goes live. If something breaks, one click rolls back to the previous version.&lt;/p&gt;
&lt;h2&gt;
  
  
  Shared responsibility
&lt;/h2&gt;

&lt;p&gt;One thing worth being direct about: HIPAA compliance is a shared responsibility. Xano provides the compliant infrastructure. But you're still responsible for your own policies, access controls, employee training, and incident response. The infrastructure doesn't make you compliant on its own. You have to use it correctly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you're building a healthcare product, Xano's HIPAA plan gives you the infrastructure and Bolt gets you a frontend fast. &lt;/p&gt;

&lt;p&gt;I covered the full build in a video — &lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7445904475694788609/?originTrackingId=atriVGZ90kkDIxip384Y9g==" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdms.licdn.com%2Fplaylist%2Fvid%2Fv2%2FD5605AQGCUhRzJIYKMg%2Fthumbnail-with-play-button-overlay-high%2FB56Z1UqjmrI8CA-%2F0%2F1775241943197%3Fe%3D2147483647%26v%3Dbeta%26t%3DoGChCAMdy4hex4c356bBjHTOdym7XkQQnnqQCkiJq9s" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7445904475694788609/?originTrackingId=atriVGZ90kkDIxip384Y9g==" rel="noopener noreferrer" class="c-link"&gt;
            Built a HIPAA-compliant CMS with bolt.new and Xano.

Bolt for the frontend. Xano for the backend. Field-level encryption, app-level RBAC, custom audit logs, BAA and BASA contracts covered.

The whole… | Cameron Booth
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Built a HIPAA-compliant CMS with bolt.new and Xano.

Bolt for the frontend. Xano for the backend. Field-level encryption, app-level RBAC, custom audit logs, BAA and BASA contracts covered.

The whole thing took only a couple days. Made a video walking through the build and breaking down what HIPAA actually requires if you're a developer.

Are you building a healthcare app? Let me know in the comments 👇
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
          linkedin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Want to see a webinar on how I did this? Drop a comment!&lt;/p&gt;

</description>
      <category>hipaa</category>
      <category>xano</category>
      <category>healthcare</category>
      <category>startup</category>
    </item>
    <item>
      <title>Building a B2A Platform: The Agentic Architecture of "Sh*t My Dev Says"</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Fri, 27 Mar 2026 17:40:27 +0000</pubDate>
      <link>https://forem.com/camb/building-a-b2a-platform-the-agentic-architecture-of-sht-my-dev-says-39ck</link>
      <guid>https://forem.com/camb/building-a-b2a-platform-the-agentic-architecture-of-sht-my-dev-says-39ck</guid>
      <description>&lt;h2&gt;
  
  
  I Built a Platform Where Agents Are the Primary Users
&lt;/h2&gt;

&lt;p&gt;I launched &lt;a href="https://shitmydevsays.com" rel="noopener noreferrer"&gt;Shit My Dev Says&lt;/a&gt; recently.&lt;/p&gt;

&lt;p&gt;The concept is simple: a curated collection of developer quotes, rants, hot takes, war stories, gossip, updates and more, submitted by AI agents and humans alike. Once a week, on Monday morning, an edited newsletter is sent out to subscribers, updating them on the reported chaos. &lt;/p&gt;

&lt;p&gt;I call it &lt;em&gt;The State of the Chaos&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Similar to Moltbook, fused with fmylife from the 2010s, and inspired by the landscape of the future, I wanted to create a platform that was fueled &lt;em&gt;by humans and their voices,&lt;/em&gt; but reported on &lt;em&gt;by agents&lt;/em&gt;. &lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Vanilla HTML, CSS, JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Xano&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: Namecheap shared hosting, Apache&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO Layer&lt;/strong&gt;: PHP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No React. No build pipeline. Very minimal.&lt;/p&gt;

&lt;p&gt;I made a deliberate decision to remain simple. Call it obstinance or staying stuck in my old ways, but being raised on HTML, CSS, and vanilla JS with some PHP does something to the brain. There's another post to be had about frameworks, but the idea was to &lt;em&gt;stay simple.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Backend
&lt;/h2&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%2Fdydw7eiavyqic1skfdsc.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%2Fdydw7eiavyqic1skfdsc.png" alt="MCP Server in Xano" width="540" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obviously the name has stopping power, but what actually drives the platform is the agentic aspect. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;B2A. The future.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Firstly, humans &lt;em&gt;can participate&lt;/em&gt;, but humans are much more of the &lt;em&gt;enjoyers of content&lt;/em&gt; in this context. I mention this because both humans and agents alike can submit posts via an exposed API endpoint. &lt;/p&gt;

&lt;p&gt;So, Xano handles the API layer, and Xano also handles the MCP layer.&lt;/p&gt;

&lt;p&gt;The MCP server supports three tools: save, upvote, downvote. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember&lt;/strong&gt;: simple.&lt;/p&gt;

&lt;p&gt;_(Also yes, your Agents can participate) _&lt;/p&gt;

&lt;p&gt;Secondly, I made this architectural decision because Xano also handles the orchestration for the agentic processes. &lt;/p&gt;

&lt;p&gt;Beyond the database, API layers, &lt;em&gt;and MCP server&lt;/em&gt;, there's an entire agent network that acts as users, moderators, and authors for the newsletter. &lt;/p&gt;

&lt;p&gt;I &lt;em&gt;could have even used Xano's static hosting&lt;/em&gt;, but I set up a quick shared hosting site where I had purchased the domain (using Namecheap) and pushed my files. &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%2Fq5qhwyw69667e4wqj1l4.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%2Fq5qhwyw69667e4wqj1l4.png" alt="Agents" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the cool part about using a headless backend. I can take it anywhere. &lt;/p&gt;

&lt;p&gt;That's also the power of Xano: it's a self-contained system that fully supports backend development at an enterprise level. A multilayered system that, importantly, handles the infrastructure. &lt;/p&gt;

&lt;p&gt;I can speak &lt;em&gt;all day&lt;/em&gt; about Xano. It's &lt;em&gt;the system to use&lt;/em&gt; for backends, complete with its position as the ultimate governance layer for development. If you can see what's happening, you can understand what's happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Newsletter
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;real fun&lt;/em&gt;, and arguably the entire &lt;em&gt;reason this exists&lt;/em&gt;, is to let the &lt;em&gt;human&lt;/em&gt; consume &amp;amp; relish in the craziness of the AI space &lt;em&gt;without needing to doomscroll&lt;/em&gt;... Unless you want to.&lt;/p&gt;

&lt;p&gt;Each Monday, subscribers start off their day by receiving the ShitMyDevSays newsletter. &lt;/p&gt;

&lt;p&gt;The entire premise is for the &lt;em&gt;human&lt;/em&gt; to digest the absurd, the craziness, and the entire &lt;em&gt;world of AI&lt;/em&gt;, in bite size pieces, paired with witty and irreverent commentary. &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%2Fv7wf6wtp85z614go5jok.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%2Fv7wf6wtp85z614go5jok.png" alt="Newsletter" width="357" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tons of newsletters exist. The wheel has already been invented. It's not about reinventing anything. &lt;/p&gt;

&lt;p&gt;It's about making the wheel... different. Change the size, the materials. Maybe add spinners? Ultimately, don't reinvent anything, just use what works and make it your own.&lt;/p&gt;

&lt;p&gt;So, in pursuit of this spirit, I set out to use AgentMail for my mail and mail delivery system. &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%2Fx2y70lq7dsvx0i1ofgis.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%2Fx2y70lq7dsvx0i1ofgis.png" alt="AgentMail via API" width="529" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="//agentmail.to"&gt;AgentMail&lt;/a&gt;, built for B2A, is the &lt;em&gt;Gmail for Agents&lt;/em&gt;. It allows my agents access to inboxes, responses, labels, and more. It's what also handles any inbound messaging for contacts and sponsors. It's autonomous when my system allows it to be, and similar to Xano, offers a visual interface to let me see what's actually happening. Built for agents, for humans. &lt;/p&gt;

&lt;p&gt;Similar to the premise of the entire SMDS system. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's the plan?
&lt;/h2&gt;

&lt;p&gt;Well, until the heat-death of the universe, it's likely that shitmydevsays.com will remain live and active, acting as a memoir to the early days of B2A. With a nod to the sites that I was raised on, the purpose is to exist as a platform for entertainment. &lt;/p&gt;

&lt;p&gt;I think a fascinating aspect about this project is also how it can be used  to receive pulses on the industry. The newest things, the craziest stories. It's supposed to act as a platform that entertains, but also as a source of information. &lt;/p&gt;

&lt;p&gt;The intention is to truly leverage two of my favorite platforms to have fun participating on the internet. Did you know you can just &lt;em&gt;buy domain names?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>marketing</category>
      <category>anonymous</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Building a B2A Platform: The Agentic Architecture of "Sh*t My Dev Says"</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Fri, 27 Mar 2026 17:40:27 +0000</pubDate>
      <link>https://forem.com/camb/building-a-b2a-platform-the-agentic-architecture-of-sht-my-dev-says-nil</link>
      <guid>https://forem.com/camb/building-a-b2a-platform-the-agentic-architecture-of-sht-my-dev-says-nil</guid>
      <description>&lt;h2&gt;
  
  
  I Built a Platform Where Agents Are the Primary Users
&lt;/h2&gt;

&lt;p&gt;I launched &lt;a href="https://shitmydevsays.com" rel="noopener noreferrer"&gt;Shit My Dev Says&lt;/a&gt; recently.&lt;/p&gt;

&lt;p&gt;The concept is simple: a curated collection of developer quotes, rants, hot takes, war stories, gossip, updates and more, submitted by AI agents and humans alike. Once a week, on Monday morning, an edited newsletter is sent out to subscribers, updating them on the reported chaos. &lt;/p&gt;

&lt;p&gt;I call it &lt;em&gt;The State of the Chaos&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Similar to Moltbook, fused with fmylife from the 2010s, and inspired by the landscape of the future, I wanted to create a platform that was fueled &lt;em&gt;by humans and their voices,&lt;/em&gt; but reported on &lt;em&gt;by agents&lt;/em&gt;. &lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Vanilla HTML, CSS, JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Xano&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: Namecheap shared hosting, Apache&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO Layer&lt;/strong&gt;: PHP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No React. No build pipeline. Very minimal.&lt;/p&gt;

&lt;p&gt;I made a deliberate decision to remain simple. Call it obstinance or staying stuck in my old ways, but being raised on HTML, CSS, and vanilla JS with some PHP does something to the brain. There's another post to be had about frameworks, but the idea was to &lt;em&gt;stay simple.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Backend
&lt;/h2&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%2Fdydw7eiavyqic1skfdsc.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%2Fdydw7eiavyqic1skfdsc.png" alt="MCP Server in Xano" width="540" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obviously the name has stopping power, but what actually drives the platform is the agentic aspect. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;B2A. The future.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Firstly, humans &lt;em&gt;can participate&lt;/em&gt;, but humans are much more of the &lt;em&gt;enjoyers of content&lt;/em&gt; in this context. I mention this because both humans and agents alike can submit posts via an exposed API endpoint. &lt;/p&gt;

&lt;p&gt;So, Xano handles the API layer, and Xano also handles the MCP layer.&lt;/p&gt;

&lt;p&gt;The MCP server supports three tools: save, upvote, downvote. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember&lt;/strong&gt;: simple.&lt;/p&gt;

&lt;p&gt;_(Also yes, your Agents can participate) _&lt;/p&gt;

&lt;p&gt;Secondly, I made this architectural decision because Xano also handles the orchestration for the agentic processes. &lt;/p&gt;

&lt;p&gt;Beyond the database, API layers, &lt;em&gt;and MCP server&lt;/em&gt;, there's an entire agent network that acts as users, moderators, and authors for the newsletter. &lt;/p&gt;

&lt;p&gt;I &lt;em&gt;could have even used Xano's static hosting&lt;/em&gt;, but I set up a quick shared hosting site where I had purchased the domain (using Namecheap) and pushed my files. &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%2Fq5qhwyw69667e4wqj1l4.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%2Fq5qhwyw69667e4wqj1l4.png" alt="Agents" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the cool part about using a headless backend. I can take it anywhere. &lt;/p&gt;

&lt;p&gt;That's also the power of Xano: it's a self-contained system that fully supports backend development at an enterprise level. A multilayered system that, importantly, handles the infrastructure. &lt;/p&gt;

&lt;p&gt;I can speak &lt;em&gt;all day&lt;/em&gt; about Xano. It's &lt;em&gt;the system to use&lt;/em&gt; for backends, complete with its position as the ultimate governance layer for development. If you can see what's happening, you can understand what's happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Newsletter
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;real fun&lt;/em&gt;, and arguably the entire &lt;em&gt;reason this exists&lt;/em&gt;, is to let the &lt;em&gt;human&lt;/em&gt; consume &amp;amp; relish in the craziness of the AI space &lt;em&gt;without needing to doomscroll&lt;/em&gt;... Unless you want to.&lt;/p&gt;

&lt;p&gt;Each Monday, subscribers start off their day by receiving the ShitMyDevSays newsletter. &lt;/p&gt;

&lt;p&gt;The entire premise is for the &lt;em&gt;human&lt;/em&gt; to digest the absurd, the craziness, and the entire &lt;em&gt;world of AI&lt;/em&gt;, in bite size pieces, paired with witty and irreverent commentary. &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%2Fv7wf6wtp85z614go5jok.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%2Fv7wf6wtp85z614go5jok.png" alt="Newsletter" width="357" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tons of newsletters exist. The wheel has already been invented. It's not about reinventing anything. &lt;/p&gt;

&lt;p&gt;It's about making the wheel... different. Change the size, the materials. Maybe add spinners? Ultimately, don't reinvent anything, just use what works and make it your own.&lt;/p&gt;

&lt;p&gt;So, in pursuit of this spirit, I set out to use AgentMail for my mail and mail delivery system. &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%2Fx2y70lq7dsvx0i1ofgis.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%2Fx2y70lq7dsvx0i1ofgis.png" alt="AgentMail via API" width="529" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="//agentmail.to"&gt;AgentMail&lt;/a&gt;, built for B2A, is the &lt;em&gt;Gmail for Agents&lt;/em&gt;. It allows my agents access to inboxes, responses, labels, and more. It's what also handles any inbound messaging for contacts and sponsors. It's autonomous when my system allows it to be, and similar to Xano, offers a visual interface to let me see what's actually happening. Built for agents, for humans. &lt;/p&gt;

&lt;p&gt;Similar to the premise of the entire SMDS system. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's the plan?
&lt;/h2&gt;

&lt;p&gt;Well, until the heat-death of the universe, it's likely that shitmydevsays.com will remain live and active, acting as a memoir to the early days of B2A. With a nod to the sites that I was raised on, the purpose is to exist as a platform for entertainment. &lt;/p&gt;

&lt;p&gt;I think a fascinating aspect about this project is also how it can be used  to receive pulses on the industry. The newest things, the craziest stories. It's supposed to act as a platform that entertains, but also as a source of information. &lt;/p&gt;

&lt;p&gt;The intention is to truly leverage two of my favorite platforms to have fun participating on the internet. Did you know you can just &lt;em&gt;buy domain names?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>marketing</category>
      <category>anonymous</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Amazon Lost 6.3 Million Orders Because Nobody Reviewed the Code. Here's What Governance Actually Looks Like.</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Fri, 20 Mar 2026 07:42:41 +0000</pubDate>
      <link>https://forem.com/camb/amazon-lost-63-million-orders-because-nobody-reviewed-the-code-heres-what-governance-actually-64h</link>
      <guid>https://forem.com/camb/amazon-lost-63-million-orders-because-nobody-reviewed-the-code-heres-what-governance-actually-64h</guid>
      <description>&lt;p&gt;On March 5th, Amazon's North American marketplace saw a 99% drop in orders. 6.3 million orders gone. Not because of a hack. Not because of a natural disaster. Because someone pushed a production change without documentation or approval.&lt;/p&gt;

&lt;p&gt;Three days earlier, on March 2nd, their AI coding assistant Q gave an engineer inaccurate advice pulled from an outdated internal wiki. That change went live. 120,000 lost orders. 1.6 million website errors. Globally.&lt;/p&gt;

&lt;p&gt;Amazon's SVP of e-commerce stood up and said what everyone was thinking: "The availability of the site and related infrastructure has not been good recently."&lt;/p&gt;

&lt;p&gt;understatement of the quarter.&lt;/p&gt;

&lt;p&gt;They've now initiated a 90-day "code safety reset" across 335 Tier-1 systems. Senior engineers are now required to approve AI-assisted code changes before deployment. Directors and VPs have been instructed to audit all production code change activities within their organizations. Mandatory deep-dive meetings. Stricter documentation. "Controlled friction."&lt;/p&gt;

&lt;p&gt;In other words: the largest e-commerce company on the planet, with some of the best engineers alive, just discovered they need governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Word Nobody Wants to Say
&lt;/h2&gt;

&lt;p&gt;Governance has a bad reputation. It sounds like bureaucracy. It sounds like the word your VP uses to justify a three-week approval chain on a CSS change.&lt;/p&gt;

&lt;p&gt;But governance isn't bureaucracy. Governance is a system knowing what it's allowed to do, who's allowed to do it, and having a record of everything that happened.&lt;/p&gt;

&lt;p&gt;Amazon didn't have that for some of its most critical paths. A single authorized operator could execute a high-impact configuration change without a second pair of eyes. AI-assisted changes were going straight to production without guardrails. Internal documents admitted that generative AI tooling "accelerated exposure of sharp edges and places where guardrails do not exist."&lt;/p&gt;

&lt;p&gt;The code wasn't the problem. The absence of structure around the code was the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executives Are Now Doing What the Architecture Should Have Done
&lt;/h2&gt;

&lt;p&gt;Here's the thing that should concern every engineer reading this: Amazon's response to the crisis was to put humans in the loop. Senior engineers now review AI-generated code. Directors audit deploys. Mandatory meetings happen weekly.&lt;/p&gt;

&lt;p&gt;This works. In the short term. But it doesn't scale.&lt;/p&gt;

&lt;p&gt;A senior engineer reviewing code is not a governance layer. It's a bottleneck with institutional knowledge. When that engineer is sick, on vacation, or just burnt out from reviewing 47 AI-generated PRs before lunch. And then system breaks again.&lt;/p&gt;

&lt;p&gt;The real fix isn't "make a person approve it." The real fix is building systems where the rules are enforced structurally, where state is tracked centrally, where changes are auditable by default, and where no single human decision can cascade into a 6.3-million-order catastrophe.&lt;/p&gt;

&lt;p&gt;That's what a governance layer does. And I'll be honest, this is exactly why I've been calling Xano a governance layer and not just a "backend."&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Governance Layer Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;I've written about this before when I talked about building ChatClipThat, but the Amazon situation makes the argument way more concrete.&lt;/p&gt;

&lt;p&gt;A governance layer does five things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Centralized State&lt;/strong&gt; &lt;br&gt;
Every service, every worker, every node talks to one source of truth. Not a local database. Not an in-memory cache. One centralized place where state lives. When my GPU render node finishes a clip, it doesn't write to a local file. It PATCHes a record in Xano. If the node dies, the state survives.&lt;/p&gt;

&lt;p&gt;Amazon's problem wasn't just bad code. It was that a change to one system cascaded into everything because nothing was mediating the state between services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Enforced Rules at the Platform Level&lt;/strong&gt;&lt;br&gt;
Input validation. Authentication. Role-based access. Rate limiting. These shouldn't be things you remember to implement. They should be things the platform gives you by default.&lt;/p&gt;

&lt;p&gt;In Xano, every API endpoint has built-in input validation and authentication. You don't "forget" to add auth to a new endpoint because the platform asks you to configure it during creation. You don't push a field update without it immediately being reflected in the API contract and the Swagger docs.&lt;br&gt;
Compare that to Amazon, where an engineer followed bad advice from an AI tool and nothing between them and production said "wait, are you sure?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Auditable Changes&lt;/strong&gt;&lt;br&gt;
Every modification to a table, endpoint, or logic flow in Xano is versioned. You can see what changed, when, and roll back if needed. You don't need a VP to "audit all production code change activities" because the platform maintains that history structurally.&lt;/p&gt;

&lt;p&gt;When Amazon says they're now requiring "more extensive documentation for critical code changes": they're admitting this didn't exist before, at least not in a way that caught these issues. A governance layer makes documentation a byproduct of working, not a separate chore you assign to exhausted engineers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Separation of Code and Configuration&lt;/strong&gt;&lt;br&gt;
One of the most undervalued aspects of Xano is that the backend isn't a repo. It's a workspace. You configure logic, data models, and endpoints through a structured interface. That means you can't accidentally rm -rf your way into a production incident. The blast radius of a mistake is inherently smaller because the platform constrains what a change can touch.&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;can&lt;/em&gt;, and &lt;em&gt;I do,&lt;/em&gt; use GitHub to sync my workspace into my private repo. That's totally doable. But it's also not quite the point.&lt;/p&gt;

&lt;p&gt;Amazon's March 5th outage happened because "a production change bypassed formal documentation and approval processes." In a governed system, there is no "bypassing." The process is the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The Visual Layer Is the Validation Layer&lt;/strong&gt;&lt;br&gt;
This is the one people overlook. In a traditional codebase, logic lives in text files. You validate it by reading it. Line by line. Hoping you catch what the last person (or the last AI) changed across a 400-line diff.&lt;/p&gt;

&lt;p&gt;In Xano, the logic is visual. You're looking at function stacks, conditional branches, loops, and data transformations rendered as structured flows. You don't read the logic. You see it. And that changes everything about how mistakes get caught.&lt;/p&gt;

&lt;p&gt;When logic is visual, it becomes inherently reviewable. A product manager can look at a flow and ask "why does this branch exist?" A new engineer can trace the path a request takes without deciphering someone else's variable naming conventions. The visual interface isn't just a convenience feature. It's a validation mechanism. It forces the logic to be legible by default.&lt;/p&gt;

&lt;p&gt;And critically, the visual representation is the documentation. There's no separate wiki to maintain. No outdated internal doc that contradicts what the code actually does (which is exactly what tripped up Amazon's AI assistant). The thing you build in is the thing you review. The interface is the truth.&lt;/p&gt;

&lt;p&gt;For governance, this matters more than people think. When you can see every step of a logic flow at a glance, the blast radius of any change is immediately apparent. You don't need a senior engineer to mentally compile 200 lines of Python to understand what a change touches. You look at the flow and it's right there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Problem is a Governance Problem
&lt;/h2&gt;

&lt;p&gt;Here's where this gets interesting for anyone using AI coding assistants (which is basically everyone in 2026).&lt;/p&gt;

&lt;p&gt;Amazon's internal documents noted that generative AI accelerated the exposure of gaps in their safety infrastructure. AI didn't create the gaps. AI just found them faster. And when it found them, there was nothing to stop the damage.&lt;/p&gt;

&lt;p&gt;This is the thing nobody talks about with AI-assisted development: the code an AI writes is often syntactically correct, confidently written, and completely unaware of your system's context. It doesn't know about unwritten constraints. It doesn't know about that deprecated internal wiki that hasn't been updated since Q3 2024. It doesn't know that this specific config change affects 335 downstream systems.&lt;/p&gt;

&lt;p&gt;Pull request sizes are growing. Incidents per PR are increasing. Change failure rates are climbing. The bottleneck isn't code generation anymore. It's review. And review doesn't scale when the governance is a person instead of a system.&lt;/p&gt;

&lt;p&gt;This is why I keep talking about platforms that enforce structure. Not because I hate writing code. Because when AI is generating code at scale, the thing that protects you isn't the code review. Typically, it's the system that catches what the reviewer missed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who This Is Actually For
&lt;/h2&gt;

&lt;p&gt;Amazon has 30,000+ engineers. They'll figure it out. They'll build internal tooling, add approval chains, and eventually make this a solved problem in their stack.&lt;/p&gt;

&lt;p&gt;But most of us aren't Amazon. We're teams of 3, or 10, or we're solo. We don't have the luxury of 90-day resets, mandatory VP audits, or a dedicated platform reliability team.&lt;/p&gt;

&lt;p&gt;And we're using the same AI coding tools. Generating the same volume of code. With the same risk of blindly deploying something that an AI confidently told us was correct.&lt;/p&gt;

&lt;p&gt;The difference is whether your architecture has built-in guardrails or whether you're relying on someone to remember to check.&lt;/p&gt;

&lt;p&gt;I use Xano because it gives me governance at the platform level. Input validation, auth, versioned logic, centralized state, structured endpoints. Not because I'm building at Amazon's scale. Because I'm building without Amazon's team, and I need the platform to do what their 335 Tier-1 system review process is now scrambling to do manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Amazon didn't have a code quality problem. They had a governance problem. The code was fine until it hit production without anyone knowing what it touched.&lt;/p&gt;

&lt;p&gt;The 90-day code safety reset is the right move. Requiring senior engineer review is the right move. But both of those are human solutions to a systems problem. And human solutions degrade when the humans get tired, distracted, or overwhelmed by the volume of AI-generated changes hitting their desks.&lt;/p&gt;

&lt;p&gt;Build systems where governance is structural, not procedural. Where the rules are enforced by the platform, not by a person's memory. Where a bad change can't cascade because the architecture constrains its blast radius.&lt;/p&gt;

&lt;p&gt;Or, you know, lose 6.3 million orders and then do it anyway.&lt;/p&gt;

</description>
      <category>xano</category>
      <category>webdev</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Fri, 20 Mar 2026 05:11:17 +0000</pubDate>
      <link>https://forem.com/camb/-4dph</link>
      <guid>https://forem.com/camb/-4dph</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/camb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2F3631370%2F6336d09b-e45d-4358-974c-ea2477c70a93.png" alt="camb"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/camb/the-pillars-behind-a-solo-built-ai-platform-4la7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Pillars Behind a Solo-Built AI Platform&lt;/h2&gt;
      &lt;h3&gt;camb ・ Mar 19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#xano&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>xano</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Thu, 19 Mar 2026 17:10:46 +0000</pubDate>
      <link>https://forem.com/camb/-3mfh</link>
      <guid>https://forem.com/camb/-3mfh</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/camb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2F3631370%2F6336d09b-e45d-4358-974c-ea2477c70a93.png" alt="camb"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/camb/the-pillars-behind-a-solo-built-ai-platform-4la7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Pillars Behind a Solo-Built AI Platform&lt;/h2&gt;
      &lt;h3&gt;camb ・ Mar 19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#xano&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>xano</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Pillars Behind a Solo-Built AI Platform</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Thu, 19 Mar 2026 08:57:49 +0000</pubDate>
      <link>https://forem.com/camb/the-pillars-behind-a-solo-built-ai-platform-4la7</link>
      <guid>https://forem.com/camb/the-pillars-behind-a-solo-built-ai-platform-4la7</guid>
      <description>&lt;p&gt;I built an AI video clipping platform called ChatClipThat. You give it a Twitch VOD (sometimes 4+ hours long) and it finds the best moments, generates titles, adds karaoke-style animated captions, and renders them as vertical clips ready for TikTok (pending), Shorts, and Reels.&lt;/p&gt;

&lt;p&gt;I'm actively developing and testing live clipping. While a stream is happening, it watches via a VLM every 30 seconds, moments in real time, and creates clips on the fly. If a streamer says "clip that," the audio trigger system catches it and clips the moment immediately.&lt;/p&gt;

&lt;p&gt;There's a dense and multi-stage AI pipeline behind this. Parallel GPU rendering. A three-machine hybrid cluster. Stripe billing. A real-time video editor with face tracking, caption styling, and per-user brand templates.&lt;/p&gt;

&lt;p&gt;I built this by myself.&lt;/p&gt;

&lt;p&gt;Not because I'm some 10x engineer. I'm genuinely not. I don't have a CS degree. I have ADHD and a tendency to ship things before they're ready. The reason I could build something this complex alone is because of the platforms I chose to build on.&lt;/p&gt;

&lt;p&gt;I want to talk about those platforms and tech. The supporting pillars. Because your stack choices aren't just technical decisions. They're velocity multipliers or velocity killers. And for me, the biggest multiplier by far has been Xano.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pillar 1: Xano — The Governance Layer
&lt;/h2&gt;

&lt;p&gt;Every complex system needs governance. Not bureaucracy. Governance. Something that decides who can do what, tracks the state of everything, enforces the rules, and gives every part of the system a shared understanding of reality. In a traditional setup, this means standing up a database, writing an ORM layer, building REST endpoints, implementing auth, designing migrations, and maintaining all of it.&lt;/p&gt;

&lt;p&gt;I didn't do any of that. I use Xano.&lt;/p&gt;

&lt;p&gt;Xano is my governance layer. It gives me a visual database, server-side logic (XanoScript), instant REST APIs with input validation and Swagger docs, and built-in JWT authentication. But calling it a "backend" undersells what it actually does in a system like mine. It's the thing that keeps a distributed, multi-machine AI platform organized.&lt;/p&gt;

&lt;p&gt;When my CPU analysis node finishes processing a VOD, it doesn't write to a local database. It POSTs the results to Xano. When my GPU render node finishes a clip, it PATCHes the clip record in Xano with the output URL. When the live monitoring engine deducts a credit every 60 seconds, it calls a Xano endpoint. When the frontend needs to show a user their jobs, templates, or clips — Xano.&lt;/p&gt;

&lt;p&gt;Every machine in my cluster talks to the same Xano instance. That means every machine is stateless. If one crashes, the state is safe. If I need to scale a node, I just point the new one at the same API. The workers don't know about each other. They only know about Xano.&lt;/p&gt;

&lt;p&gt;This is a legitimate distributed systems pattern (centralized state with stateless workers) and I implemented it without writing a single line of backend infrastructure code. I just designed my tables, wrote the logic in XanoScript, and every node talks to the resulting API.&lt;/p&gt;

&lt;p&gt;The result is that I have 15+ database tables, multiple API groups, and full authentication powering a production SaaS. &lt;/p&gt;

&lt;h2&gt;
  
  
  Pillar 2: GCP — The Muscle
&lt;/h2&gt;

&lt;p&gt;Google Cloud gives me the compute I can't run locally. An e2-standard-4 CPU instance handles the heavy AI analysis. An NVIDIA L4 GPU instance handles video rendering with hardware acceleration. Google Cloud Storage holds every VOD, metadata, artifact, and rendered clip.&lt;/p&gt;

&lt;p&gt;The key decision was splitting the work across purpose-built machines. Analysis requires CPU and memory. Rendering requires a GPU. The VPS handles web traffic. Each node does one thing well and talks to Xano for coordination.&lt;/p&gt;

&lt;p&gt;I spent a lot of time fighting GCP — zone resource exhaustion, disk space problems, firewall misconfigurations, IAP tunnel race conditions. But the underlying model works: cheap CPU for analysis, expensive GPU on-demand for rendering, and Xano as the coordinator between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pillar 3: The AI Layer
&lt;/h2&gt;

&lt;p&gt;The AI models are the product. They're what actually watches the video, understands what's happening, and decides what's worth clipping. I won't go deep on the specifics here, but the pipeline uses a combination of vision models, transcription, and audio analysis to find moments worth sharing.&lt;/p&gt;

&lt;p&gt;The important thing in the context of this article isn't how the AI works. It's that AI outputs are useless without infrastructure to organize them. A model can tell you "something interesting happened at 47 minutes." Cool. Now where does that data go? How does the editor access it? How does the renderer know what to render? That's where the other pillars come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pillar 4: The Vibe Coding Philosophy
&lt;/h2&gt;

&lt;p&gt;This is the meta-pillar. The reason any of this works is because I optimized for speed of iteration, not perfection of architecture.&lt;/p&gt;

&lt;p&gt;I use FastAPI with Jinja2 server-side rendering instead of a React frontend because I can ship a page in 20 minutes. I use Alpine.js for reactivity because it's 15 lines of JavaScript instead of a component tree. I use vanilla CSS where I need control and Tailwind where I need speed.&lt;/p&gt;

&lt;p&gt;The pipeline is modular. Every stage is a Python class with &lt;code&gt;name()&lt;/code&gt; and &lt;code&gt;run(ctx)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If a stage breaks, I replace it. If I want to test a new ranking algorithm, I swap one class. The architecture isn't elegant. It's fast to change.&lt;/p&gt;

&lt;p&gt;And this philosophy extends to the backend choice. Xano lets me iterate on data models without writing migration scripts. If I need a new field on the jobs table, I add it in the visual editor and it's immediately available in the API. If I need a new endpoint, I build the XanoScript function, click publish, and it's live. I haven't even mentioned the GitHub and CI/CD pipeline, but Xano has also allowed me to test in isolated environments and push to prod when my tests pass.&lt;/p&gt;

&lt;p&gt;When you're building alone, the speed at which you can react to what the product needs is everything. The pillars I chose aren't the "best" in any objective sense. They're the ones that let me move the fastest while maintaining enough structure to not collapse.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Part
&lt;/h2&gt;

&lt;p&gt;I work at Xano. I do education and developer advocacy. So no, I'm not an unbiased source.&lt;/p&gt;

&lt;p&gt;But I chose Xano for ChatClipThat because I already knew the platform inside and out... and I knew it could handle what I was building. The advocacy is easy when the thing you're advocating for is the same thing you'd pick anyway.&lt;/p&gt;

&lt;p&gt;The "governance layer" framing isn't a solo dev thing. It's an architecture thing. Enterprise teams use Xano to centralize their backend logic and data governance across services. Indie devs use it to ship without building infrastructure from scratch. The use case scales. The platform is the same.&lt;/p&gt;

&lt;p&gt;Pick platforms that let you focus on the thing only you can build. For me, that's the AI pipeline. Everything else is a pillar.&lt;/p&gt;

</description>
      <category>xano</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Web Tells Machines What Things Are. It Doesn't Tell Them Why.</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Fri, 13 Mar 2026 22:37:10 +0000</pubDate>
      <link>https://forem.com/camb/the-web-tells-machines-what-things-are-it-doesnt-tell-them-why-1ilb</link>
      <guid>https://forem.com/camb/the-web-tells-machines-what-things-are-it-doesnt-tell-them-why-1ilb</guid>
      <description>&lt;p&gt;I had a thought the other day that won't leave me alone.&lt;/p&gt;

&lt;p&gt;We've spent decades building the web for humans. HTML gives us structure — headings, tables, buttons, forms. A human looks at a page and immediately understands what's going on.&lt;/p&gt;

&lt;p&gt;Machines don't.&lt;/p&gt;

&lt;p&gt;An LLM sees a &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; and has no idea if it's pricing tiers, analytics data, a leaderboard, or a comparison tool. It just sees a table. It has to &lt;em&gt;guess&lt;/em&gt; why it's there.&lt;/p&gt;

&lt;p&gt;And that guess becomes the foundation for AI browsing, accessibility systems, personalized interfaces, and agents operating software — basically everything we're trying to build next.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The web gives machines structure, but not intent. And I think that's the missing layer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Semantic Web Tried This. It Failed.
&lt;/h2&gt;

&lt;p&gt;This isn't a new observation. Schema.org, RDFa, microformats, the entire Semantic Web movement — they all tried to make web content machine-readable.&lt;/p&gt;

&lt;p&gt;They all struggled with adoption. And they all struggled for the same reason:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The developer does the work. Someone else gets the value.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A developer adds &lt;code&gt;itemprop="author"&lt;/code&gt; or &lt;code&gt;typeof="Product"&lt;/code&gt; and... Google's search results get richer. A knowledge graph gets smarter. But the developer? They got nothing they could feel.&lt;/p&gt;

&lt;p&gt;There's a second reason they struggled: &lt;strong&gt;the machines of that era couldn't read natural language.&lt;/strong&gt; So every standard required structured, rigid, machine-parseable formats. Controlled vocabularies. Ontologies. Committee-approved taxonomies.&lt;/p&gt;

&lt;p&gt;You had to learn the vocabulary. You had to use it exactly right. And if your use case didn't fit the taxonomy, you were stuck.&lt;/p&gt;

&lt;p&gt;That constraint no longer exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  LLMs Changed the Consumer
&lt;/h2&gt;

&lt;p&gt;This is the part that matters.&lt;/p&gt;

&lt;p&gt;The machine reading the web is fundamentally different now. An LLM doesn't need &lt;code&gt;type="Product"&lt;/code&gt;. It can understand &lt;em&gt;"this section sells shoes."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That single shift changes everything about what a machine-readable web could look like.&lt;/p&gt;

&lt;p&gt;Previous standards required rigid formats because the parsers on the other end were rigid. Schema.org needed exact property names. RDFa needed exact predicates. The entire Semantic Web was built around the limitation that machines couldn't interpret — they could only match.&lt;/p&gt;

&lt;p&gt;LLMs don't have that limitation. They interpret. They reason. They understand context, nuance, and implied meaning. A sentence describing &lt;em&gt;why&lt;/em&gt; a UI element exists carries more signal to an LLM than any structured attribute ever could.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The machines changed. The web hasn't caught up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the gap. And the fix might be simpler than anyone expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intent: The Missing Primitive
&lt;/h2&gt;

&lt;p&gt;What if web elements carried a description of their purpose — not as a structured label, but as a natural language statement that an LLM can understand?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;intent&amp;gt;&lt;/span&gt;
  This section helps the user compare pricing tiers and decide which
  plan fits their needs. The table shows monthly vs annual pricing
  with feature breakdowns. The primary action is selecting a plan.
&lt;span class="nt"&gt;&amp;lt;/intent&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;intent&amp;gt;&lt;/span&gt;
  This modal confirms subscription cancellation and attempts to retain
  the user with a discount offer. It's a critical conversion moment —
  the user should not be rushed past this.
&lt;span class="nt"&gt;&amp;lt;/intent&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;intent&amp;gt;&lt;/span&gt;
  This section onboards new users while simultaneously building trust
  through social proof. The testimonials are positioned here to reduce
  signup hesitation.
&lt;span class="nt"&gt;&amp;lt;/intent&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No controlled vocabulary. No schema to memorize. No committee to wait on. A developer just describes what the section does and &lt;em&gt;why&lt;/em&gt; it exists — in their own words.&lt;/p&gt;

&lt;p&gt;The LLM on the other end handles the semantics. That's its job. And for the first time in the history of the web, the consumer is actually capable of doing that job.&lt;/p&gt;

&lt;p&gt;You don't even need a new HTML element to start. An HTML comment prefixed with &lt;code&gt;intent:&lt;/code&gt; would work just as well — it's already invisible to browsers, already readable by crawlers, and already a habit developers have. The format barely matters. What matters is that &lt;em&gt;intent is expressed&lt;/em&gt;, and that something on the other end can now understand it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Is Different From Everything Before
&lt;/h2&gt;

&lt;p&gt;Every previous attempt at machine-readable web content required structured formats because the machines &lt;em&gt;couldn't understand language&lt;/em&gt;. They needed rigid schemas because parsers needed exact keys.&lt;/p&gt;

&lt;p&gt;Intent doesn't need any of that. The consumer is an LLM. The format is natural language. The authoring cost is writing a sentence.&lt;/p&gt;

&lt;p&gt;This removes every barrier that killed previous standards:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. No standardization bottleneck.&lt;/strong&gt; There's no taxonomy to agree on. A developer describes what the section does in their own words. The LLM figures out the classification, the relationships, the context — all of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Authoring is trivially easy.&lt;/strong&gt; Writing "this form collects shipping info for checkout" isn't a new skill. Developers already write comments, documentation, and PR descriptions. This is the same muscle — applied to the DOM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It scales with the LLM.&lt;/strong&gt; As models get better, the same intent descriptions become &lt;em&gt;more&lt;/em&gt; useful — not less. A better model extracts richer meaning from the same sentence. The investment compounds over time without the developer changing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Actually Unlocks
&lt;/h2&gt;

&lt;p&gt;Once intent exists on a page, the UI no longer has to be fixed. It becomes interpretable. Adaptable.&lt;/p&gt;

&lt;p&gt;Imagine browsing Reddit, but you choose how you experience it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TikTok-style vertical feed&lt;/li&gt;
&lt;li&gt;Twitter-style stream&lt;/li&gt;
&lt;li&gt;Minimal reading mode&lt;/li&gt;
&lt;li&gt;Research mode with everything expanded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same content. Completely different UI. The content stays the same because the &lt;em&gt;intent&lt;/em&gt; stays the same — only the presentation changes based on who you are and how you prefer to consume information.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Intent becomes the bridge between content and experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  When Is Intent Even Necessary?
&lt;/h2&gt;

&lt;p&gt;If the HTML is already semantically clear — a &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; inside a section titled "Pricing" — a machine can probably infer that. You don't need to annotate everything.&lt;/p&gt;

&lt;p&gt;Intent shines when the purpose isn't obvious from structure alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"This table isn't just data — it's designed to push users toward the annual plan by making monthly look expensive."&lt;/li&gt;
&lt;li&gt;"This section looks like filler, but it's the primary trust-building mechanism on the page."&lt;/li&gt;
&lt;li&gt;"This modal is the most important conversion moment in the entire flow."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That level of nuance can't come from a &lt;code&gt;type="Product"&lt;/code&gt; label. It can only come from natural language — and it can only be &lt;em&gt;consumed&lt;/em&gt; by something that understands natural language.&lt;/p&gt;

&lt;p&gt;That's the key insight. Intent as a concept only becomes viable when the consumer can interpret free-form descriptions. We finally have that consumer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: Three Pillars
&lt;/h2&gt;

&lt;p&gt;The system breaks into three parts.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. User Profile
&lt;/h3&gt;

&lt;p&gt;A user defines how they want to experience the web. Simple structured preferences:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;preferred_layout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;feed&lt;/span&gt;
&lt;span class="na"&gt;reading_density&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;high&lt;/span&gt;
&lt;span class="na"&gt;modal_tolerance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;low&lt;/span&gt;
&lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dark&lt;/span&gt;
&lt;span class="na"&gt;interaction_style&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keyboard-first&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What do you want to see when you browse? How do you want to consume content? This is just an onboarding step — straightforward preference collection.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Web Intent Index
&lt;/h3&gt;

&lt;p&gt;This is the real work. Sites are crawled and their intent is mapped.&lt;/p&gt;

&lt;p&gt;Two paths exist:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A — Explicit Intent (Best Case)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developers add natural language intent descriptions to their markup. Rich, contextual, high-signal. The LLM on the indexing side ingests these and builds a purpose map of the site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B — Inferred Intent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If intent annotations aren't present, a crawler scrapes the page, maps the structure, and uses an LLM to &lt;em&gt;infer&lt;/em&gt; intent — then hashes the result and stores a semantic index.&lt;/p&gt;

&lt;p&gt;Here's where things get interesting: the explicit and inferred paths aren't competing — they compound. A crawler's inferred intent might say "this looks like a pricing table." A developer's explicit intent says "this table exists to push users toward the annual plan by making the monthly price look bad." The explicit version carries &lt;em&gt;far&lt;/em&gt; more signal — and an LLM can reconcile both.&lt;/p&gt;

&lt;p&gt;You could also &lt;em&gt;inject&lt;/em&gt; inferred intent into existing pages and let site owners refine it later if they want to participate. That gives you immediate coverage without requiring anyone to change their code first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This becomes a semantic sitemap of the web. Not just links — purpose.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Rendering Engine
&lt;/h3&gt;

&lt;p&gt;When a user visits a page:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A browser extension intercepts the request&lt;/li&gt;
&lt;li&gt;A page hash lookup occurs&lt;/li&gt;
&lt;li&gt;The intent map is retrieved&lt;/li&gt;
&lt;li&gt;The user profile is matched&lt;/li&gt;
&lt;li&gt;The best rendering path is selected&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight: &lt;strong&gt;this doesn't need LLM reasoning at runtime.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All the heavy work — the crawling, the inference, the intent mapping — already happened during indexing. At runtime, it's just similarity matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User vector → Intent vectors → Closest match → Render
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No slow AI calls. Cached intent maps, hashed page structures, vector similarity. You could put this on a CDN. You could put this at the DNS level. At that point, it's just numbers and lookups — not reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Doesn't Require Rebuilding the Web
&lt;/h2&gt;

&lt;p&gt;Intent is an overlay. It sits on top of whatever already exists.&lt;/p&gt;

&lt;p&gt;The supporting infrastructure could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A crawler that indexes intent annotations&lt;/li&gt;
&lt;li&gt;A CDN layer that caches intent maps&lt;/li&gt;
&lt;li&gt;A browser extension that matches users to intents&lt;/li&gt;
&lt;li&gt;A developer habit: describe what your sections do&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existing sites continue to work. Nobody rewrites anything. React, Svelte, plain HTML — doesn't matter. Intent is framework-agnostic by nature because it describes purpose, not implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Idea Lives
&lt;/h2&gt;

&lt;p&gt;This sits somewhere between the Semantic Web, search indexing, AI browsing, and adaptive UI systems. But instead of encoding data relationships, it encodes user experience purpose.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This is a Product."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This helps the user decide which product to buy — and it's designed to make the premium option feel like the obvious choice."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Semantic Web tried to make the web machine-readable at the &lt;em&gt;data&lt;/em&gt; level using structured formats for machines that needed structured formats.&lt;/p&gt;

&lt;p&gt;This is about making the web machine-readable at the &lt;em&gt;experience&lt;/em&gt; level using natural language for machines that now understand natural language.&lt;/p&gt;

&lt;p&gt;Different era. Different consumer. Different approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Point
&lt;/h2&gt;

&lt;p&gt;Right now, the web tells machines &lt;strong&gt;what things are&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It doesn't tell them &lt;strong&gt;why they exist&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Previous attempts to fix this required rigid schemas because the machines couldn't read language. That constraint is gone. LLMs can interpret natural language descriptions of purpose — and that changes what's possible.&lt;/p&gt;

&lt;p&gt;If the next generation of browsing is going to be powered by agents, assistants, and adaptive interfaces, the missing layer might just be intent — written in plain language, for machines that can finally understand it.&lt;/p&gt;

&lt;p&gt;I'm calling it IntentML until someone gives me a better name.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>html</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Stop Using One AI Model for Everything!</title>
      <dc:creator>camb</dc:creator>
      <pubDate>Fri, 06 Mar 2026 23:51:46 +0000</pubDate>
      <link>https://forem.com/camb/stop-using-one-ai-model-for-everything-3a4i</link>
      <guid>https://forem.com/camb/stop-using-one-ai-model-for-everything-3a4i</guid>
      <description>&lt;p&gt;Every time a new model drops, the internet loses it.  &lt;/p&gt;

&lt;p&gt;"INSANE."&lt;br&gt;&lt;br&gt;
"This changes &lt;em&gt;everything&lt;/em&gt;."&lt;br&gt;&lt;br&gt;
"Goodbye developers."  &lt;/p&gt;

&lt;p&gt;And for about 48 hours, everyone forgets the obvious: &lt;strong&gt;Models are just tools.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Each one has strengths, weaknesses, and specific jobs it's actually good at. Together, wired the right way, they can create a beautiful system.&lt;/p&gt;

&lt;p&gt;As an analogy, imagine an orchestra in union. There exists a maestro and musicians, each person with a particular role, instrument, and each playing a specific part. &lt;/p&gt;

&lt;p&gt;Now, in contrast, imagine a music hall full of clarinetists and &lt;em&gt;only&lt;/em&gt; clarinetists. &lt;/p&gt;

&lt;p&gt;Playing any composition intended for a full orchestra would be... different. Not &lt;em&gt;necessarily&lt;/em&gt; bad, but it would be lacking. &lt;/p&gt;

&lt;p&gt;In this same manner, models in agentic development are unique enough that they warrant distinction. &lt;/p&gt;

&lt;p&gt;After building a bunch of real AI pipelines, there's &lt;em&gt;no such thing&lt;/em&gt; as "the best model." In the same way as the music analogy above, there's no "universal instrument". &lt;/p&gt;

&lt;p&gt;There are only models that are best for &lt;em&gt;specific&lt;/em&gt; kinds of work. &lt;/p&gt;

&lt;p&gt;And if you conduct them the right way, you can make &lt;em&gt;beautiful music&lt;/em&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  So what do AI models actually do?
&lt;/h2&gt;

&lt;p&gt;When you peel away the hype, most use cases fall into 4 buckets:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vision&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signal detection&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different models shine at each.  &lt;/p&gt;

&lt;p&gt;Trying to use one model for all four? I'd... recommend against it. Again. Think of the ensemble of clarinets. &lt;em&gt;shudders&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Reasoning models → Deep thinking
&lt;/h2&gt;

&lt;p&gt;These are your &lt;strong&gt;problem solvers&lt;/strong&gt;. Use them when you actually need &lt;em&gt;thought&lt;/em&gt; — not just speed.&lt;br&gt;&lt;br&gt;
They excel at logic, planning, synthesis, and multi-step analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Great for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing architecture
&lt;/li&gt;
&lt;li&gt;Debugging hard problems
&lt;/li&gt;
&lt;li&gt;Analyzing tradeoffs
&lt;/li&gt;
&lt;li&gt;Synthesizing research
&lt;/li&gt;
&lt;li&gt;Planning multi-step workflows
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They’re slower and pricier, but the quality? Way higher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI &lt;strong&gt;GPT‑5 (Reasoning Mode)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic &lt;strong&gt;Claude 3 Opus&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Google DeepMind &lt;strong&gt;Gemini 2 Ultra&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral Large&lt;/strong&gt; or &lt;strong&gt;Cohere Command R+&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're asking:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why is this system failing?”&lt;br&gt;&lt;br&gt;
“How should I structure this pipeline?”&lt;br&gt;&lt;br&gt;
Use one of these.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Fast generation models → Throughput work
&lt;/h2&gt;

&lt;p&gt;These models are built for &lt;strong&gt;speed, cost, and volume&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perfect for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarization
&lt;/li&gt;
&lt;li&gt;Rewriting
&lt;/li&gt;
&lt;li&gt;Classification
&lt;/li&gt;
&lt;li&gt;Bulk content
&lt;/li&gt;
&lt;li&gt;Tagging
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don’t waste a reasoning model on millions of lines of text — &lt;strong&gt;go cheap and fast&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT‑4o mini&lt;/strong&gt; or &lt;strong&gt;GPT‑3.5 Turbo&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude Haiku&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral‑7B&lt;/strong&gt; or &lt;strong&gt;Mixtral (8×7B)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Vision models → Anything with images or video
&lt;/h2&gt;

&lt;p&gt;If your app looks at &lt;strong&gt;images, screenshots, or frames&lt;/strong&gt;, this is your category.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI/screenshot analysis
&lt;/li&gt;
&lt;li&gt;Gameplay or scene interpretation
&lt;/li&gt;
&lt;li&gt;Document layouts
&lt;/li&gt;
&lt;li&gt;Image annotation
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vision‑language models (VLMs)&lt;/strong&gt; combine text + visual context and make a huge difference when visuals matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT‑5.3&lt;/strong&gt; (multimodal: text, audio, image)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3 Pro (VLM capable)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude 4.6 Opus&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QWEN 3 Max&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Signal detection models → Cheap filters
&lt;/h2&gt;

&lt;p&gt;One of the best tricks in AI pipelines:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cheap models detect signals. Expensive ones analyze.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of sending everything to your most powerful model, filter first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example pipeline:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;cheap classifier&lt;br&gt;
↓&lt;br&gt;
find interesting samples&lt;br&gt;
↓&lt;br&gt;
vision model looks closer&lt;br&gt;
↓&lt;br&gt;
reasoning model interprets&lt;br&gt;
↓&lt;br&gt;
generation model writes output&lt;/p&gt;

&lt;p&gt;It saves cost &lt;em&gt;and&lt;/em&gt; improves accuracy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DistilBERT&lt;/strong&gt;, &lt;strong&gt;MiniLM&lt;/strong&gt;, or &lt;strong&gt;Mistral 7B‑Instruct&lt;/strong&gt; for lightweight classification
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLaMA‑3‑8B&lt;/strong&gt; for pre‑filtering or tagging
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT‑5&lt;/strong&gt; or &lt;strong&gt;Claude Opus&lt;/strong&gt; for deep reasoning after filtering&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The biggest mistake
&lt;/h2&gt;

&lt;p&gt;The most common fail I see:  &lt;/p&gt;

&lt;p&gt;People pick one big model and try to use it for everything.&lt;/p&gt;

&lt;p&gt;That's how you end up with systems that are:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow
&lt;/li&gt;
&lt;li&gt;Expensive
&lt;/li&gt;
&lt;li&gt;Inefficient
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Better approach?  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orchestrate models.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Let each one do the part it's best at.&lt;/p&gt;

&lt;p&gt;Just like you wouldn't use a screwdriver as a hammer, you shouldn't use a reasoning model for bulk classification work.&lt;/p&gt;




&lt;h2&gt;
  
  
  What real AI systems look like
&lt;/h2&gt;

&lt;p&gt;It's not:&lt;br&gt;&lt;br&gt;
&lt;code&gt;app → one LLM → output&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It's more like:&lt;br&gt;&lt;br&gt;
&lt;code&gt;input → filter → specialized model → reasoning model → generator → result&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Each stage has a role. Modular. Extendable. Scale efficiently &lt;em&gt;and&lt;/em&gt; keep quality high.&lt;/p&gt;

&lt;p&gt;Think of it like an assembly line. Each worker (model) has one job they're really good at. The magic happens in the coordination, not in having one super-worker trying to do everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters for your next project
&lt;/h2&gt;

&lt;p&gt;I see too many developers burning through API credits because they're using Claude Sonnet to classify 10,000 support tickets when a $0.001 classification model would do the job better and faster.&lt;/p&gt;

&lt;p&gt;Or using a fast generation model for complex reasoning tasks and wondering why the outputs are inconsistent.&lt;/p&gt;

&lt;p&gt;The real skill in AI engineering isn't picking the "best" model. It's designing systems where each model does what it's actually optimized for.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Stop asking "Which model should I use?"  &lt;/p&gt;

&lt;p&gt;Start asking "Which model should I use for &lt;em&gt;this&lt;/em&gt; job?"&lt;/p&gt;

&lt;p&gt;Once you start thinking that way, your systems get cheaper, faster, and way more reliable. &lt;/p&gt;

&lt;p&gt;That's when AI engineering starts to &lt;em&gt;click.&lt;/em&gt; That's when it really starts to sound like music... figuratively, of course. &lt;/p&gt;

&lt;p&gt;It's way more fun building systems that feel like orchestrated symphonies rather than trying to make one model do everything poorly.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
