<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jeff Go</title>
    <description>The latest articles on DEV Community by Jeff Go (@jeffgo10).</description>
    <link>https://dev.to/jeffgo10</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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg</url>
      <title>DEV Community: Jeff Go</title>
      <link>https://dev.to/jeffgo10</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jeffgo10"/>
    <language>en</language>
    <item>
      <title>Continuing on my previous thoughts regarding The WordPress Paradox, this article dives now into how to leverage WP native tools just inside functions.php to bypass the traditional monolithic rendering engine entirely, enabling REST API endpoints.</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Mon, 01 Jun 2026 23:42:27 +0000</pubDate>
      <link>https://dev.to/jeffgo10/continuing-on-my-previous-thoughts-regarding-the-wordpress-paradox-this-article-dives-now-into-how-32d8</link>
      <guid>https://dev.to/jeffgo10/continuing-on-my-previous-thoughts-regarding-the-wordpress-paradox-this-article-dives-now-into-how-32d8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jeffgo10/going-headless-from-the-inside-out-native-wordpress-api-customization-3glb" class="crayons-story__hidden-navigation-link"&gt;Going Headless From the Inside Out: Native WordPress API Customization&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="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" alt="jeffgo10 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jeffgo10" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jeff Go
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jeff Go
                
              
              &lt;div id="story-author-preview-content-3793049" 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="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jeff Go&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/jeffgo10/going-headless-from-the-inside-out-native-wordpress-api-customization-3glb" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 1&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/jeffgo10/going-headless-from-the-inside-out-native-wordpress-api-customization-3glb" id="article-link-3793049"&gt;
          Going Headless From the Inside Out: Native WordPress API Customization
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/wordpress"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;wordpress&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/restapi"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;restapi&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/pwa"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;pwa&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/jeffgo10/going-headless-from-the-inside-out-native-wordpress-api-customization-3glb#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 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>api</category>
      <category>architecture</category>
      <category>php</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>Going Headless From the Inside Out: Native WordPress API Customization</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Mon, 01 Jun 2026 06:26:39 +0000</pubDate>
      <link>https://dev.to/jeffgo10/going-headless-from-the-inside-out-native-wordpress-api-customization-3glb</link>
      <guid>https://dev.to/jeffgo10/going-headless-from-the-inside-out-native-wordpress-api-customization-3glb</guid>
      <description>&lt;p&gt;In my previous writing on The &lt;a href="https://dev.to/jeffgo10/the-wordpress-paradox-why-its-here-to-stay-and-how-to-stop-ruining-it-185e"&gt;WordPress Paradox&lt;/a&gt;, I explored the deep-seated tension between the platform’s unmatched content editing experience and the performance bottlenecks of its monolithic rendering pipeline. Engineering teams frequently reach a frustrating crossroads: accept sluggish monolithic themes, or adopt bulky, third-party Headless CMS plugins that introduce security risks and configuration bloat.But if we look past the plugin marketplace, WordPress already has the native architecture required to solve its own paradox. By utilizing &lt;code&gt;register_rest_route&lt;/code&gt; directly inside your &lt;code&gt;functions.php&lt;/code&gt; file, you can bypass the template engine entirely and expose lightweight, type-safe data endpoints tailored for a modern frontend like React.js.  Here is how to build a native micro-API endpoint and consume it efficiently.&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%2Fvpbz4tcckez7g7bxhqf1.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%2Fvpbz4tcckez7g7bxhqf1.png" alt="I declare meself a profound backend developer" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Exposing the Native Endpoint (&lt;code&gt;functions.php&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Instead of fetching massive, deeply nested JSON payloads from the default WordPress REST API, we can register a custom route that returns only the specific fieldsets our modern frontend actually requires.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// Hook into the native WordPress REST API initialization&lt;/span&gt;
&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'rest_api_init'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;register_rest_route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'modern-api/v1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/custom-posts/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'methods'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'get_minimized_custom_posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'permission_callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'__return_true'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Adjust for secure infrastructure&lt;/span&gt;
    &lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Callback function to fetch and trim the database payload&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;get_minimized_custom_posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'post_type'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'post'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'posts_per_page'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Map only critical fieldsets to eliminate database and network bloat&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'id'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_the_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'slug'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;post_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'value'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;get_post_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="no"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'custom_metric_value'&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="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WP_REST_Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By filtering the payload down to the bare essentials at the server level, you drastically reduce response times and memory overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Consuming the Micro-API on the Frontend
&lt;/h2&gt;

&lt;p&gt;On the frontend, whether you are building a decoupled React layout or fetching data inside a React component, you can consume this native endpoint cleanly without navigating complex, nested plugin data models.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Fetching the minimized native WP data structure&lt;/span&gt;
&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CustomPost&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&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;getModernWPData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CustomPost&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&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;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://your-wp-site.local/wp-json/modern-api/v1/custom-posts/&lt;/span&gt;&lt;span class="dl"&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to fetch optimized legacy data&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&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%2Fjn4p46sgbr006xpv1u2t.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%2Fjn4p46sgbr006xpv1u2t.png" alt="Say yes to my trade offer?" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Shifting Value Upstream
&lt;/h2&gt;

&lt;p&gt;This hybrid approach bridges the gap outlined in the WordPress Paradox. You don't have to rip out the entire backend infrastructure overnight. By turning WordPress into a lightweight data engine from the inside out, you retain a familiar authoring environment for content teams while unlocking the extreme velocity, type safety, and architectural freedom of a decoupled frontend ecosystem&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>restapi</category>
      <category>pwa</category>
    </item>
    <item>
      <title>The value in software engineering has officially shifted upstream. Typing code is becoming cheap and instant. The new bottleneck isn't syntax—it's architecture, context, and security.</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Wed, 27 May 2026 05:29:17 +0000</pubDate>
      <link>https://dev.to/jeffgo10/the-value-in-software-engineering-has-officially-shifted-upstream-typing-code-is-becoming-cheap-4367</link>
      <guid>https://dev.to/jeffgo10/the-value-in-software-engineering-has-officially-shifted-upstream-typing-code-is-becoming-cheap-4367</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jeffgo10/ai-agents-arent-replacing-you-but-the-dev-who-steers-them-is-43l" class="crayons-story__hidden-navigation-link"&gt;AI Agents Aren’t Replacing You, But the Dev Who Steers Them Is&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="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" alt="jeffgo10 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jeffgo10" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jeff Go
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jeff Go
                
              
              &lt;div id="story-author-preview-content-3761341" 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="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jeff Go&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/jeffgo10/ai-agents-arent-replacing-you-but-the-dev-who-steers-them-is-43l" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 27&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/jeffgo10/ai-agents-arent-replacing-you-but-the-dev-who-steers-them-is-43l" id="article-link-3761341"&gt;
          AI Agents Aren’t Replacing You, But the Dev Who Steers Them Is
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&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/jeffgo10/ai-agents-arent-replacing-you-but-the-dev-who-steers-them-is-43l#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            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>
      <category>ai</category>
      <category>architecture</category>
      <category>career</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>AI Agents Aren’t Replacing You, But the Dev Who Steers Them Is</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Wed, 27 May 2026 05:28:11 +0000</pubDate>
      <link>https://dev.to/jeffgo10/ai-agents-arent-replacing-you-but-the-dev-who-steers-them-is-43l</link>
      <guid>https://dev.to/jeffgo10/ai-agents-arent-replacing-you-but-the-dev-who-steers-them-is-43l</guid>
      <description>&lt;p&gt;There is a lot of anxiety in the tech community right now about AI taking software engineering jobs. If your entire identity as a developer is tied to how fast you can type out standard boilerplate or memorize framework syntax, then yes—you should probably be worried.&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%2Fculmjexolqwqsx04fffs.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%2Fculmjexolqwqsx04fffs.png" alt="AI is coming. be afraid." width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But if you look past the hype, something else is happening. Raw code generation is becoming cheap and instant.&lt;/p&gt;

&lt;p&gt;The bottleneck in software engineering is no longer typing code. The bottleneck is architecture, security, and context.&lt;/p&gt;

&lt;p&gt;AI agents aren't replacing developers. They are turning senior engineers into one-man engineering squads. The value has completely shifted from writing lines of code to steering the agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shifting from Coder to Conductor
&lt;/h2&gt;

&lt;p&gt;In my daily workflow, I use Cursor as my primary editor. I don’t use it to think for me; I use its AI features—especially Composer—to handle the heavy lifting.&lt;/p&gt;

&lt;p&gt;If I need to spin up a new service wrapper, write a comprehensive unit test suite covering twenty edge cases, or refactor an older component to match a new TypeScript interface, I offload it to Cursor. What used to take two hours of mundane typing now takes two minutes.&lt;/p&gt;

&lt;p&gt;This doesn't mean my job got easier. It means my job shifted upstream.&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%2Fzrtpahenksyo5k7lpde1.gif" 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%2Fzrtpahenksyo5k7lpde1.gif" alt="I'm a code wizard now!" width="260" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of getting bogged down in syntax errors, my brain power is entirely focused on big-picture engineering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Is this the right data model for our long-term scaling needs?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;How will this new module affect our CI/CD deployment pipeline?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Are we introducing hidden security risks or breaking latency budgets?&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The "Human-in-the-Loop" Rules of Engagement
&lt;/h2&gt;

&lt;p&gt;If you blindly copy-paste whatever an AI agent outputs, you aren't a senior engineer—you’re a liability. To actually build stable software with AI, you have to maintain absolute authority over the codebase.&lt;/p&gt;

&lt;p&gt;Here is how to steer agents safely without introducing massive technical debt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be Specific with Context&lt;/strong&gt;: An agent is only as good as the guardrails you give it. Feed it your strict project typings, your linting rules, and explicit architectural boundaries before you let it touch a file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Treat AI Code Like an Intern’s PR&lt;/strong&gt;: Never commit AI code blindly. Treat every block of generated code as if it was written by a junior developer who works fast but doesn't fully understand the business logic. Review every line, check the security implications, and verify the edge cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use AI for Velocity, Not Navigation&lt;/strong&gt;: You decide where the ship is going; let the AI do the rowing. Use it to eliminate boilerplate, generate scaffolding, and hunt down bugs, but never let it make major architectural bets for your platform.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The New Market Reality
&lt;/h2&gt;

&lt;p&gt;The software market has fundamentally changed. The developers who resist AI out of pride are going to get left behind, not because the AI is smarter, but because they are choosing to build with a shovel while others are using an excavator.&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%2F16vxpn6rve1z44qmxt65.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%2F16vxpn6rve1z44qmxt65.png" alt="Which line do you hop in at this modern time of software development?" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The future belongs to the engineers who can take a complex, ambiguous business problem, break it down into clean architectural requirements, and steer an array of AI agents to build, test, and ship it at breakneck speed.&lt;/p&gt;

&lt;p&gt;Stop worrying about whether AI will take your job. Start figuring out how to use it to do the work of a three-person team by yourself.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>The Web is just getting better nowadays. Google I/O just announced the HTML-in-Canvas API, and it's going to completely change how we build interactive web apps!</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Mon, 25 May 2026 04:28:09 +0000</pubDate>
      <link>https://dev.to/jeffgo10/the-web-is-just-getting-better-nowadays-google-io-just-announced-the-html-in-canvas-api-and-its-5adj</link>
      <guid>https://dev.to/jeffgo10/the-web-is-just-getting-better-nowadays-google-io-just-announced-the-html-in-canvas-api-and-its-5adj</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc" class="crayons-story__hidden-navigation-link"&gt;HTML-in-Canvas: The Wild New API from Google I/O (and How Not to Break the Browser)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" alt="jeffgo10 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jeffgo10" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jeff Go
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jeff Go
                
              
              &lt;div id="story-author-preview-content-3745603" 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="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jeff Go&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/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 25&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/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc" id="article-link-3745603"&gt;
          HTML-in-Canvas: The Wild New API from Google I/O (and How Not to Break the Browser)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/html"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;html&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&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/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            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>Google I/O just announced the HTML-in-Canvas API, and it's going to completely change how we build interactive web apps!</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Mon, 25 May 2026 04:27:28 +0000</pubDate>
      <link>https://dev.to/jeffgo10/google-io-just-announced-the-html-in-canvas-api-and-its-going-to-completely-change-how-we-build-40nc</link>
      <guid>https://dev.to/jeffgo10/google-io-just-announced-the-html-in-canvas-api-and-its-going-to-completely-change-how-we-build-40nc</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc" class="crayons-story__hidden-navigation-link"&gt;HTML-in-Canvas: The Wild New API from Google I/O (and How Not to Break the Browser)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" alt="jeffgo10 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jeffgo10" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jeff Go
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jeff Go
                
              
              &lt;div id="story-author-preview-content-3745603" 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="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jeff Go&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/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 25&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/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc" id="article-link-3745603"&gt;
          HTML-in-Canvas: The Wild New API from Google I/O (and How Not to Break the Browser)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/html"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;html&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&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/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            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>HTML-in-Canvas: The Wild New API from Google I/O (and How Not to Break the Browser)</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Mon, 25 May 2026 04:10:10 +0000</pubDate>
      <link>https://dev.to/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc</link>
      <guid>https://dev.to/jeffgo10/html-in-canvas-the-wild-new-api-from-google-io-and-how-not-to-break-the-browser-hkc</guid>
      <description>&lt;p&gt;Google I/O just dropped an absolute bomb of an API for frontend developers: &lt;strong&gt;HTML-in-Canvas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/TUtKGTeFWjQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you’ve ever built immersive 3D web experiences, map tools, or heavy data dashboards using WebGL or WebGPU, you know the absolute nightmare of rendering UI text or buttons on top of a canvas. You either had to sync floating, absolute-positioned HTML elements on top of the canvas (which lagged during fast scrolls), or draw text manually using WebGL textures (which killed SEO and accessibility).&lt;/p&gt;

&lt;p&gt;The new HTML-in-Canvas API fixes this by introducing three new primitives—like the &lt;code&gt;layoutsubtree&lt;/code&gt; attribute and &lt;code&gt;textElementImage2D()&lt;/code&gt;—allowing you to put real, styleable HTML elements directly inside a canvas. The browser feeds it straight into the GPU as a texture, but keeps it part of the normal DOM layout and accessibility tree.&lt;/p&gt;

&lt;p&gt;Because it’s an active origin trial, the wild west rules apply. Here are the practical Do's and Don'ts for this new playground.&lt;/p&gt;

&lt;h2&gt;
  
  
  👑 The DO's
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DO use it for complex data visualizations and 3D UI&lt;/strong&gt;: This is the ultimate sweet spot. If you are building high-frequency data dashboards or immersive spatial sites, you can now build your menus, form controls, and text overlays in standard HTML/CSS and let the GPU layer them directly over your canvas without a hint of frame lag.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DO keep accessibility in mind&lt;/strong&gt;: Because the elements inside the canvas are real DOM nodes, screen readers can finally read your canvas text, and browser translate features actually work on it natively. Make sure you use semantic HTML (&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;, etc.) inside your canvas subtree so the accessibility tree populates correctly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DO use CSS for layout&lt;/strong&gt;: You don't have to write custom JavaScript positioning math anymore. You can apply standard CSS styling to children within the &lt;code&gt;layoutsubtree&lt;/code&gt;. Let the browser engine calculate the bounds, then use the &lt;code&gt;onpaint&lt;/code&gt; hook to upload the fresh layout changes to your WebGL/WebGPU shaders.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚫 The DON'Ts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DON'T dump your whole app into a canvas&lt;/strong&gt;: Just because you can render HTML in a canvas doesn’t mean your entire landing page belongs in one. Canvas-heavy rendering consumes significantly more battery and GPU resources. Use it strictly for high-fidelity interactive sections, not standard text articles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DON'T update the inner HTML 60 times a second&lt;/strong&gt;: The API relies on a &lt;code&gt;.onpaint&lt;/code&gt; event to upload changes as a GPU texture. If you are blasting text modifications or CSS transitions inside the canvas subtree on every single frame, you will bottleneck the main thread with heavy texture re-uploads. Keep the static UI inside the canvas, and use WebGL shaders for the crazy animations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DON'T ship this to production blindly yet&lt;/strong&gt;: It’s an origin trial. It currently requires a flag in Chrome Canary and isn't a baseline standard across Safari or Firefox yet. Use this phase to build prototypes, learn the architecture, and write feedback for the WICG proposal while the API matures.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;p&gt;The web is getting fun again. HTML-in-Canvas breaks down the wall between traditional document layouts and hardware-accelerated creative engineering. It’s going to completely change how we build tools, dashboards, and spatial interfaces over the next few years.&lt;/p&gt;

&lt;p&gt;Are you planning to test out the origin trial? What wild UI ideas are you thinking of throwing into a shader? Let’s chat shop in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>html</category>
      <category>api</category>
    </item>
    <item>
      <title>sometimes Wordpress frustrates me, but hey, it is here to stay. here's what we as devs can do about it</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Sat, 23 May 2026 12:06:15 +0000</pubDate>
      <link>https://dev.to/jeffgo10/sometimes-wordpress-frustrates-me-but-hey-it-is-here-to-stay-heres-what-we-as-devs-can-do-about-164m</link>
      <guid>https://dev.to/jeffgo10/sometimes-wordpress-frustrates-me-but-hey-it-is-here-to-stay-heres-what-we-as-devs-can-do-about-164m</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jeffgo10/the-wordpress-paradox-why-its-here-to-stay-and-how-to-stop-ruining-it-185e" class="crayons-story__hidden-navigation-link"&gt;The WordPress Paradox: Why It’s Here to Stay (and How to Stop Ruining It)&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="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" alt="jeffgo10 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jeffgo10" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jeff Go
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jeff Go
                
              
              &lt;div id="story-author-preview-content-3732360" 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="/jeffgo10" 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%2F756317%2F5dcde9c8-b29c-4857-a933-a02310830579.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jeff Go&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/jeffgo10/the-wordpress-paradox-why-its-here-to-stay-and-how-to-stop-ruining-it-185e" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 23&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/jeffgo10/the-wordpress-paradox-why-its-here-to-stay-and-how-to-stop-ruining-it-185e" id="article-link-3732360"&gt;
          The WordPress Paradox: Why It’s Here to Stay (and How to Stop Ruining It)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/wordpress"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;wordpress&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/jeffgo10/the-wordpress-paradox-why-its-here-to-stay-and-how-to-stop-ruining-it-185e#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            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>
      <category>discuss</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>The WordPress Paradox: Why It’s Here to Stay (and How to Stop Ruining It)</title>
      <dc:creator>Jeff Go</dc:creator>
      <pubDate>Sat, 23 May 2026 11:21:47 +0000</pubDate>
      <link>https://dev.to/jeffgo10/the-wordpress-paradox-why-its-here-to-stay-and-how-to-stop-ruining-it-185e</link>
      <guid>https://dev.to/jeffgo10/the-wordpress-paradox-why-its-here-to-stay-and-how-to-stop-ruining-it-185e</guid>
      <description>&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%2Fee14wiapnoyb84gaqam5.jpg" 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%2Fee14wiapnoyb84gaqam5.jpg" alt="software developer screaming computer funny meme. Source: itchronicles.com" width="800" height="605"&gt;&lt;/a&gt;Let’s be honest. If you are fluent in React, TypeScript, and modern backend architectures, working on WordPress feels like taking a massive step backward. For years, developers have been predicting its death, claiming modern stacks would completely wipe it out.&lt;/p&gt;

&lt;p&gt;But it’s 2026, and WordPress still powers over 40% of the internet. It isn't going anywhere.&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%2Fo7kqd7ftqmmfxonbspu8.jpg" 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%2Fo7kqd7ftqmmfxonbspu8.jpg" alt="Unfortunately, Wordpress is here to stay *sigh*" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As developers, we have two choices: we can keep complaining about it, or we can understand why businesses love it and learn how to engineer it properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Problem: Plugin Abuse
&lt;/h2&gt;

&lt;p&gt;WordPress gets a bad reputation, but the fault usually lies with the people building it. Too many developers (and clients) treat the plugin directory like a candy store.&lt;/p&gt;

&lt;p&gt;Need a Google Analytics tag? Install a plugin. Need a basic contact form? Install a plugin. Need to compress an image? Install another one.&lt;/p&gt;

&lt;p&gt;Before you know it, the site is running 40+ heavy plugins. They constantly fight for database resources, conflict with each other during updates, create massive security vulnerabilities, and turn the user experience into a slow, bloated mess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Clients Won't Move On
&lt;/h2&gt;

&lt;p&gt;We love our frameworks, but clients care about business outcomes, not our tech stacks. WordPress wins because of two things:&lt;/p&gt;

&lt;p&gt;The Non-Technical Content Editor: Marketing teams know how to use the dashboard. They want to fix a typo or publish a landing page instantly without opening a GitHub ticket or waiting for a developer to deploy code.&lt;/p&gt;

&lt;p&gt;The Mature Ecosystem: Spinning up standard features like WooCommerce or Advanced Custom Fields (ACF) takes days, whereas building those from scratch in a custom stack takes weeks of expensive engineering time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modern Compromise: Headless WordPress
&lt;/h2&gt;

&lt;p&gt;You don’t have to build monolithic, slow PHP sites to give clients what they want. The modern way to handle this is Headless WordPress.&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%2F5eyjo80f1yztxax5f5oi.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%2F5eyjo80f1yztxax5f5oi.png" alt="Next.js = TECHNOLOGIA" width="800" height="849"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You keep WordPress strictly as a backend Content Management System (CMS). The marketing team gets their familiar login dashboard to manage posts. But instead of letting PHP render the front-end, you pull that content via the WordPress REST API or WPGraphQL.&lt;/p&gt;

&lt;p&gt;Then, you build the actual website using Astro, Next.js, or Remix. The end-user gets a blazing-fast, secure, compile-on-demand static or React site, and the client still gets their favorite editor. It’s a win-win.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Keep Monolithic WordPress Lean (Without 50 Plugins)
&lt;/h2&gt;

&lt;p&gt;If you do have to build a traditional monolithic WordPress site, you can easily keep it from choking if you stick to a few senior development rules:&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%2Fmk3ty0osc6e04cdl5mff.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%2Fmk3ty0osc6e04cdl5mff.png" alt="Be the Code Bro - use functions.php" width="800" height="902"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stop using plugins for embed codes:&lt;/strong&gt; If a client needs a Google Analytics tag, a Facebook Pixel, or a custom script, do not look for a plugin to inject it. WordPress gives you native hooks like &lt;code&gt;wp_enqueue_script&lt;/code&gt; or &lt;code&gt;wp_head&lt;/code&gt; and &lt;code&gt;wp_footer&lt;/code&gt;. You can open your &lt;code&gt;functions.php&lt;/code&gt; file, write a quick action hook, and drop the code directly into the header or footer yourself. It takes five minutes, requires zero overhead, and eliminates an entire third-party plugin attack vector.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;// Drop this in functions.php instead of installing a Google Analytics plugin

add_action('wp_head', 'add_google_analytics');

function add_google_analytics() {
    ?&amp;gt;
&lt;span class="c"&gt;&amp;lt;!-- embed code here --&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use native core features:&lt;/strong&gt; If you need to register a custom post type, change a minor layout behavior, or adjust image thumbnail crop sizes, write a few clean lines of native PHP in &lt;code&gt;functions.php&lt;/code&gt;. It keeps your logic version-controlled and tightly integrated with your theme.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ditch heavy page builders:&lt;/strong&gt; Avoid tools like &lt;strong&gt;Elementor&lt;/strong&gt; or &lt;strong&gt;Divi&lt;/strong&gt; that inject endless nested tables, bloated CSS, and unnecessary DOM elements. Use native &lt;strong&gt;Gutenberg&lt;/strong&gt; blocks paired with &lt;strong&gt;Advanced Custom Fields (ACF)&lt;/strong&gt; to give clients flexible layouts that remain incredibly lightweight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Offload to the Edge:&lt;/strong&gt; Stop using heavy security and optimization plugins that run massive, unoptimized cron jobs on your origin server. Put the site behind &lt;strong&gt;Cloudflare&lt;/strong&gt; and let the network edge handle caching, web application firewalls (WAF), and image optimization.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;WordPress isn't a tech stack problem; it's an engineering discipline problem. Once we stop fighting the fact that it's here to stay, we can start using modern architecture to make it fast, secure, and actually pleasant to work with.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
