<?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: Antonio Cardenas </title>
    <description>The latest articles on DEV Community by Antonio Cardenas  (@antoniocardenas).</description>
    <link>https://dev.to/antoniocardenas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif</url>
      <title>DEV Community: Antonio Cardenas </title>
      <link>https://dev.to/antoniocardenas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antoniocardenas"/>
    <language>en</language>
    <item>
      <title>LendingChain: Reimagining Global Generosity with Zero-Interest Solana Micro-Loans</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Sat, 05 Sep 2026 10:41:36 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/lendingchain-reimagining-global-generosity-with-zero-interest-solana-micro-loans-kgo</link>
      <guid>https://dev.to/antoniocardenas/lendingchain-reimagining-global-generosity-with-zero-interest-solana-micro-loans-kgo</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-09-03"&gt;Weekend Challenge: Generosity Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;LendingChain&lt;/strong&gt; is a decentralized, zero-interest micro-lending platform built on Solana Devnet to celebrate the UN International Day of Charity. It connects socially conscious global lenders with grassroots entrepreneurs in emerging economies—specifically focusing on clean energy, sustainable agriculture, indigenous women-led crafts, and tech education. &lt;/p&gt;

&lt;p&gt;Unlike traditional charitable donations, where funds often disappear into administrative overhead, or commercial microfinance institutions that charge predatory 25%–45% APRs, LendingChain provides 0% interest capital directly to verified non-custodial Solana escrows. Our goal is to leverage sub-cent transaction fees to make $5–$25 micro-loans viable and transparent, allowing loan repayments to cycle back to the lender to be re-lent indefinitely (the "Generosity Multiplier").&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live Application:&lt;/strong&gt; &lt;a href="https://micro-lend.web.app" rel="noopener noreferrer"&gt;https://micro-lend.web.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Feel free to explore the interactive "Discovery" mode, fund a loan, or apply for a loan using the seamlessly embedded Solana wallet!)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AntonioCardenas" rel="noopener noreferrer"&gt;
        AntonioCardenas
      &lt;/a&gt; / &lt;a href="https://github.com/AntonioCardenas/microlend" rel="noopener noreferrer"&gt;
        microlend
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Astro Starter Kit: Minimal&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm create astro@latest -- --template minimal&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;🧑‍🚀 &lt;strong&gt;Seasoned astronaut?&lt;/strong&gt; Delete this file. Have fun!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Project Structure&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Inside of your Astro project, you'll see the following folders and files:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;/
├── public/
├── src/
│   └── pages/
│       └── index.astro
└── package.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Astro looks for &lt;code&gt;.astro&lt;/code&gt; or &lt;code&gt;.md&lt;/code&gt; files in the &lt;code&gt;src/pages/&lt;/code&gt; directory. Each page is exposed as a route based on its file name.&lt;/p&gt;
&lt;p&gt;There's nothing special about &lt;code&gt;src/components/&lt;/code&gt;, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.&lt;/p&gt;
&lt;p&gt;Any static assets, like images, can be placed in the &lt;code&gt;public/&lt;/code&gt; directory.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🧞 Commands&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;All commands are run from the root of the project, from a terminal:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Installs dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Starts local dev server at &lt;code&gt;localhost:4321&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Build your production site to &lt;code&gt;./dist/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preview your build locally, before deploying&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run astro ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AntonioCardenas/microlend" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;LendingChain is built with a modern, high-performance tech stack focused on a seamless user experience, verifiable proof of impact, and cryptographic transparency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Frontend &amp;amp; Performance Architecture:&lt;/strong&gt; Built with Astro and React. I placed strong emphasis on Core Web Vitals (FCP, LCP, CLS) using non-blocking app hydration loaders, adaptive skeleton cards to prevent layout shifts, lazy asset scheduling, and subtle micro-interactions (magnetic buttons, smooth drawers) to inspire institutional-grade trust.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google Gemini AI Borrower &amp;amp; Wallet Forensics:&lt;/strong&gt; Rather than trusting self-reported applications blindly, LendingChain implements an AI-driven risk auditor powered by &lt;strong&gt;Google Gemini&lt;/strong&gt;. The engine performs dual-layer evaluation:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Semantic Project Analysis:&lt;/strong&gt; Gemini analyzes the applicant's business plan, capital requested, and cost breakdowns to assess feasibility and credibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;On-Chain Solana Forensics:&lt;/strong&gt; Scans the borrower's public key on Solana Devnet to check wallet age, transaction history volume, and detect anomalous patterns (such as brand-new wallets with 0 history, high transaction failure rates, or suspicious fund drains). It assigns an objective risk score (0–100) and displays an interactive audit modal with actionable recommendations for lenders.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Borrower Field Dispatches &amp;amp; Proof of Work:&lt;/strong&gt; To verify that funded projects are real and progressing, borrowers can publish live on-chain field updates directly to their project page. Updates are tagged by category (&lt;code&gt;Field Progress&lt;/code&gt;, &lt;code&gt;Milestone Hit&lt;/code&gt;, &lt;code&gt;Equipment &amp;amp; Assets&lt;/code&gt;, &lt;code&gt;Expense Receipt&lt;/code&gt;), include photos and transaction signatures, and display update badges across the directory so lenders can monitor real-world capital deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Authentication &amp;amp; Embedded Web3:&lt;/strong&gt; Integrated Privy to provide frictionless embedded Solana wallets. Lenders and borrowers can log in with email or social accounts and immediately interact on-chain without browser extensions or seed-phrase hurdles, with full support for external Solana wallets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backend &amp;amp; Real-time State:&lt;/strong&gt; Loan applications ("Apply"), funding events ("Lend"), and project dispatches sync in real-time via &lt;strong&gt;Firebase Firestore&lt;/strong&gt; using &lt;code&gt;onSnapshot&lt;/code&gt; listeners and atomic multi-document transactions to preserve optimistic UI responsiveness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blockchain Escrows &amp;amp; On-Chain Proof:&lt;/strong&gt; Utilizes Solana Devnet for non-custodial Program Derived Address (PDA) escrows and the SPL Memo program to permanently record loan contributions and lender dedications on the transparency ledger.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deployment:&lt;/strong&gt; Statically generated and optimized via Astro, deployed globally on &lt;strong&gt;Firebase Hosting&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of Solana:&lt;/strong&gt; LendingChain relies on Solana's sub-cent transaction fees and high throughput to make $5–$25 micro-lending viable, using embedded Privy wallets, SPL Memo inscriptions for permanent impact tracking, and non-custodial PDA escrows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of Google AI:&lt;/strong&gt; LendingChain directly integrates Google Gemini to solve the biggest problem in peer-to-peer microfinance: trust and fraud. Gemini audits loan applicants, cross-references live on-chain Solana ledger signals to flag wallet irregularities, generates plain-language risk evaluations, and guides lenders with transparent creditworthiness scores.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Team: Solo build — &lt;a class="mentioned-user" href="https://dev.to/antoniocardenas"&gt;@antoniocardenas&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>gemini</category>
      <category>solana</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 02 Sep 2026 07:58:11 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-1pf1</link>
      <guid>https://dev.to/antoniocardenas/-1pf1</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dezkareid/tratando-de-ser-un-desarrollador-ai-first-sin-vender-humo-2mbd" class="crayons-story__hidden-navigation-link"&gt;Tratando de ser un desarrollador AI First sin vender humo&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="/dezkareid" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F461615%2Fb7e9c050-6fa6-4365-b06a-48ceb6c71ea3.jpg" alt="dezkareid profile" class="crayons-avatar__image" width="720" height="1079"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dezkareid" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Joel Humberto Gómez Paredes
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Joel Humberto Gómez Paredes
                
                
              
              &lt;div id="story-author-preview-content-4464287" 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="/dezkareid" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F461615%2Fb7e9c050-6fa6-4365-b06a-48ceb6c71ea3.jpg" class="crayons-avatar__image" alt="" width="720" height="1079"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Joel Humberto Gómez Paredes&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/dezkareid/tratando-de-ser-un-desarrollador-ai-first-sin-vender-humo-2mbd" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 22&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/dezkareid/tratando-de-ser-un-desarrollador-ai-first-sin-vender-humo-2mbd" id="article-link-4464287"&gt;
          Tratando de ser un desarrollador AI First sin vender humo
        &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/softwaredevelopment"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwaredevelopment&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;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/dezkareid/tratando-de-ser-un-desarrollador-ai-first-sin-vender-humo-2mbd" 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;13&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dezkareid/tratando-de-ser-un-desarrollador-ai-first-sin-vender-humo-2mbd#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              4&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&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;
            8 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Tue, 04 Aug 2026 05:27:44 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-4ane</link>
      <guid>https://dev.to/antoniocardenas/-4ane</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa" class="crayons-story__hidden-navigation-link"&gt;Higgsfield-level image &amp;amp; video quality, but inside Claude Code and billed by Google. generate-nanobanana quotes the cost before every paid run and logs prompt + seed beside each file. &lt;span&gt;github.com/AntonioCard...&lt;/span&gt; feedback welcome.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-status"&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="/antoniocardenas" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif" alt="antoniocardenas profile" class="crayons-avatar__image" width="270" height="349"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antoniocardenas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio Cardenas 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio Cardenas 
                
                
              
              &lt;div id="story-author-preview-content-4308907" 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="/antoniocardenas" 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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif" class="crayons-avatar__image" alt="" width="270" height="349"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio Cardenas &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/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 4&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-status"&gt;
        &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa" id="article-link-4308907"&gt;
          Higgsfield-level image &amp;amp; video quality, but inside Claude Code and billed by Google. generate-nanobanana quotes the cost before every paid run and logs prompt + seed beside each file. &lt;span&gt;github.com/AntonioCard...&lt;/span&gt; feedback welcome.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__contentpreview text-styles"&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://github.com/AntonioCardenas/generate-nanobanana" 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%2Fopengraph.githubassets.com%2F8d15caf5c750da79375a6a5e59336a4a78984114dd428df4109462f23eab583b%2FAntonioCardenas%2Fgenerate-nanobanana" height="600" class="m-0" width="1200"&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://github.com/AntonioCardenas/generate-nanobanana" rel="noopener noreferrer" class="c-link"&gt;
            GitHub - AntonioCardenas/generate-nanobanana: Claude Code skill for AI image &amp;amp; video generation with Google Gemini — Nano Banana 2 Lite, Nano Banana Pro, Gemini Omni Flash. Cost gates before paid runs, real reference images, a prompt log beside every file. · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Claude Code skill for AI image &amp;amp;amp; video generation with Google Gemini — Nano Banana 2 Lite, Nano Banana Pro, Gemini Omni Flash. Cost gates before paid runs, real reference images, a prompt log b...
          &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%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa#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;
            1 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Higgsfield-level image &amp; video quality, but inside Claude Code and billed by Google. generate-nanobanana quotes the cost before every paid run and logs prompt + seed beside each file. https://github.com/AntonioCardenas/generate-nanobanana feedback welcome.</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Tue, 04 Aug 2026 05:27:34 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa</link>
      <guid>https://dev.to/antoniocardenas/higgsfield-level-image-video-quality-but-inside-claude-code-and-billed-by-google-57oa</guid>
      <description>&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://github.com/AntonioCardenas/generate-nanobanana" 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%2Fopengraph.githubassets.com%2F8d15caf5c750da79375a6a5e59336a4a78984114dd428df4109462f23eab583b%2FAntonioCardenas%2Fgenerate-nanobanana" height="600" class="m-0" width="1200"&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://github.com/AntonioCardenas/generate-nanobanana" rel="noopener noreferrer" class="c-link"&gt;
            GitHub - AntonioCardenas/generate-nanobanana: Claude Code skill for AI image &amp;amp; video generation with Google Gemini — Nano Banana 2 Lite, Nano Banana Pro, Gemini Omni Flash. Cost gates before paid runs, real reference images, a prompt log beside every file. · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Claude Code skill for AI image &amp;amp;amp; video generation with Google Gemini — Nano Banana 2 Lite, Nano Banana Pro, Gemini Omni Flash. Cost gates before paid runs, real reference images, a prompt log b...
          &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%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>github</category>
      <category>llm</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Mastering Impeccable: AI Skill Design for Frontend Architecture</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 30 Jul 2026 09:15:21 +0000</pubDate>
      <link>https://dev.to/turingsoracle/mastering-impeccable-ai-skill-design-for-frontend-architecture-lbe</link>
      <guid>https://dev.to/turingsoracle/mastering-impeccable-ai-skill-design-for-frontend-architecture-lbe</guid>
      <description>&lt;p&gt;Generative coding agents are powerful, but left to their own devices, they default to visual clutter: predictable gradients, uncalibrated spacing, and bloated, outdated component structures. Impeccable is a design skill package, created by Paul Bakaus, that runs directly inside &lt;strong&gt;Claude Code, Gemini CLI, and Codex CLI&lt;/strong&gt; (as well as Cursor and GitHub Copilot) to enforce strict aesthetic guardrails, with the same rule set recompiled for each harness.&lt;/p&gt;

&lt;p&gt;By applying deliberate skill design, you can steer agents away from generic patterns and push them toward precise, high-craft web experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Skill Design, and Why Does It Matter for AI Agents?
&lt;/h2&gt;

&lt;p&gt;Skill design is the practice of building deterministic rails for non-deterministic AI models. Instead of endlessly asking an agent to "make it look better" or "improve performance," you inject a compiled &lt;code&gt;DESIGN.md&lt;/code&gt; and functional directive that the agent must follow on every iteration.&lt;/p&gt;

&lt;p&gt;Impeccable builds on Anthropic's &lt;code&gt;frontend-design&lt;/code&gt; skill and adds 23 commands that give you a shared design vocabulary with the model, plus 58 deterministic anti-pattern detection rules (default Inter font, purple-to-blue gradients, cards nested in cards, gray text on colored backgrounds, rounded icon tiles above every heading, and more). It turns the AI from a junior developer guessing at your aesthetic into a strict implementer of the visual rules you actually define.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Impeccable's Constraints for Modern Web Apps
&lt;/h2&gt;

&lt;p&gt;Precision is everything when you wire this workflow in. Impeccable respects your existing design system rather than overwriting it: when it runs, it scans your codebase (tokens, components, Tailwind config) and loads your brand rules from your own &lt;code&gt;DESIGN.md&lt;/code&gt;, instead of imposing a generic aesthetic. So if your identity is built on a minimalist look, the right way to enforce it is to &lt;strong&gt;declare it yourself&lt;/strong&gt; in that file — a limited green-and-pink palette, a dark base background at &lt;code&gt;#0c1624&lt;/code&gt;, typography and tone of voice — so every subsequent command reads it before generating anything. Impeccable doesn't decide that aesthetic for you; it gives you the vocabulary and the mechanism to keep yours consistent across every iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Commands That Do the Heavy Lifting
&lt;/h3&gt;

&lt;p&gt;Impeccable exposes 23 commands that act as a shared vocabulary with the agent — each one names a specific kind of design intervention. Three of the most useful for a production workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/audit&lt;/code&gt;&lt;/strong&gt; — a production-quality pass. Runs the deterministic anti-pattern detector (58 curated rules: generic gradients, default Inter font, nested cards, predictable shadows, etc.) against your current code and reports findings without changing anything yet. It's the diagnostic step before you touch code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/normalize&lt;/code&gt;&lt;/strong&gt; — fixes inconsistencies within the system itself: spacing, border radii, type sizes, or color usage that drifted from the tokens defined in your &lt;code&gt;DESIGN.md&lt;/code&gt;. Useful when multiple agent sessions have introduced small divergences over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/polish&lt;/code&gt;&lt;/strong&gt; — the final quality pass. Applies fixes within your existing system (it doesn't invent a new one), removes detected "AI tells," and reruns the detector before handing the result back, until it reaches zero findings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A typical flow in Claude Code or Cursor looks like this: &lt;code&gt;/impeccable audit&lt;/code&gt; to diagnose, &lt;code&gt;/impeccable normalize&lt;/code&gt; to align what already exists with your tokens, and &lt;code&gt;/impeccable polish&lt;/code&gt; as a final pass before committing — each one reading the same &lt;code&gt;DESIGN.md&lt;/code&gt;/&lt;code&gt;PRODUCT.md&lt;/code&gt; so it never drifts from your brand.&lt;/p&gt;

&lt;p&gt;These three are just the starting point: there are 20 more commands (&lt;code&gt;/typeset&lt;/code&gt;, &lt;code&gt;/distill&lt;/code&gt;, &lt;code&gt;/colorize&lt;/code&gt;, &lt;code&gt;/layout&lt;/code&gt;, &lt;code&gt;/bolder&lt;/code&gt;, &lt;code&gt;/quieter&lt;/code&gt;, &lt;code&gt;/overdrive&lt;/code&gt;, among others) covering typography, color, layout, and motion. You can find the full command list, installation docs, and source code in the &lt;a href="https://github.com/pbakaus/impeccable/blob/main/README.md" rel="noopener noreferrer"&gt;official repository README&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation Example: Your Own Brand Rules
&lt;/h3&gt;

&lt;p&gt;Impeccable doesn't impose frontend architecture — it doesn't decide whether you use zoneless Angular, Signals, or which animation engine to reach for; that stays in your hands. What it does do is consistently read the visual rules you define. A &lt;code&gt;DESIGN.md&lt;/code&gt; with strict brand constraints might look like this, as an illustrative example:&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="c1"&gt;# Illustrative example only — not Impeccable's actual schema,&lt;/span&gt;
&lt;span class="c1"&gt;# which uses DESIGN.md/PRODUCT.md in Markdown (Google Stitch spec)&lt;/span&gt;
&lt;span class="na"&gt;brand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;background_base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0c1624"&lt;/span&gt;
  &lt;span class="na"&gt;allowed_accents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;green"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pink"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calm,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;precise,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hype"&lt;/span&gt;
  &lt;span class="na"&gt;anti_references&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Avoid&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pure&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;white.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Don't&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generate&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;gradients.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Reject&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;aggressive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;weapon-related&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;iconography,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;avoid&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generating&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;showing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hands&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;visual&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;assets."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any motion engine or architecture decision (GSAP, Lenis, Angular with Signals, etc.) is still your own technical stack choice — Impeccable simply keeps the agent from reintroducing generic visual patterns while you implement it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>claude</category>
    </item>
    <item>
      <title>Haz que tu frontend se mantenga impecable</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 30 Jul 2026 09:12:23 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/haz-que-tu-frontend-se-mantenga-impecable-3ldc</link>
      <guid>https://dev.to/antoniocardenas/haz-que-tu-frontend-se-mantenga-impecable-3ldc</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739" class="crayons-story__hidden-navigation-link"&gt;Dominando Impeccable: para mantener coherencia y consistencia de diseño&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/angularfirebase"&gt;
            &lt;img alt="Angular Firebase logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F821%2Fd43c326b-2812-4d5d-a7e0-f13d3a9567d7.png" class="crayons-logo__image" width="768" height="768"&gt;
          &lt;/a&gt;

          &lt;a href="/antoniocardenas" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif" alt="antoniocardenas profile" class="crayons-avatar__image" width="270" height="349"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antoniocardenas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio Cardenas 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio Cardenas 
                
                
              
              &lt;div id="story-author-preview-content-4270170" 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="/antoniocardenas" 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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif" class="crayons-avatar__image" alt="" width="270" height="349"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio Cardenas &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/angularfirebase" class="crayons-story__secondary fw-medium"&gt;Angular Firebase&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 30&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/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739" id="article-link-4270170"&gt;
          Dominando Impeccable: para mantener coherencia y consistencia de diseño
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/claude"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;claude&lt;/a&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/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&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/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739" 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/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Dominando Impeccable: para mantener coherencia y consistencia de diseño</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 30 Jul 2026 09:11:27 +0000</pubDate>
      <link>https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739</link>
      <guid>https://dev.to/angularfirebase/dominando-impeccable-diseno-de-habilidades-para-arquitectura-frontend-con-ia-1739</guid>
      <description>&lt;p&gt;Los agentes de código generativo son potentes, pero si se les deja a su libre albedrío, por defecto producen un desorden visual: degradados predecibles, espaciados sin calibrar y estructuras de componentes pesadas y obsoletas. Impeccable es un paquete de habilidades de diseño, creado por Paul Bakaus, que opera directamente dentro de &lt;strong&gt;Claude Code, Gemini CLI y Codex CLI&lt;/strong&gt; (además de Cursor y GitHub Copilot) para imponer estrictos límites estéticos, con un mismo conjunto de reglas recompilado para cada harness.&lt;/p&gt;

&lt;p&gt;Al aplicar un diseño de habilidades deliberado, puedes alejar a los agentes de los patrones genéricos y obligarlos a generar experiencias web precisas y de alto nivel visual.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es el diseño de habilidades y por qué es importante para los agentes de IA?
&lt;/h2&gt;

&lt;p&gt;El diseño de habilidades (&lt;em&gt;skill design&lt;/em&gt;) es la práctica de construir rieles deterministas para modelos de IA no deterministas. En lugar de pedirle interminablemente a un agente que "haga que se vea mejor" o "mejore el rendimiento", inyectas un &lt;code&gt;DESIGN.md&lt;/code&gt; compilado y directivas funcionales que el agente debe respetar en cada iteración.&lt;/p&gt;

&lt;p&gt;Impeccable construye sobre la habilidad &lt;code&gt;frontend-design&lt;/code&gt; de Anthropic y añade 23 comandos con un vocabulario de diseño compartido, más 58 reglas deterministas de detección de antipatrones (fuente Inter por defecto, degradados morado-azul, tarjetas anidadas, texto gris sobre fondos de color, iconos redondeados sobre cada encabezado, entre otros). Transforma a la IA de ser un desarrollador junior que intenta adivinar tu estética a un implementador estricto de las reglas visuales que tú definas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo implementar las restricciones de Impeccable para aplicaciones web modernas
&lt;/h2&gt;

&lt;p&gt;Al integrar este flujo de trabajo, la precisión lo es todo. Impeccable respeta tu sistema de diseño existente en lugar de sobrescribirlo: al ejecutarse, escanea tu código base (tokens, componentes, configuración de Tailwind) y carga las reglas de marca desde tu propio &lt;code&gt;DESIGN.md&lt;/code&gt;, en vez de imponer una estética genérica. Por eso, si tu identidad se basa en una estética minimalista, la forma correcta de imponerla es &lt;strong&gt;declarándola tú mismo&lt;/strong&gt; en ese archivo — paleta limitada de verde y rosa, fondo oscuro base en &lt;code&gt;#0c1624&lt;/code&gt;, tipografía y tono de voz — para que cada comando posterior la lea antes de generar nada. Impeccable no decide esa estética por ti; te da el vocabulario y el mecanismo para que la tuya se respete de forma consistente en cada iteración.&lt;/p&gt;

&lt;h3&gt;
  
  
  Los comandos que hacen el trabajo pesado
&lt;/h3&gt;

&lt;p&gt;Impeccable expone 23 comandos que funcionan como un vocabulario compartido con el agente — cada uno nombra un tipo específico de intervención de diseño. Tres de los más útiles para un flujo de producción:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/audit&lt;/code&gt;&lt;/strong&gt; — un pase de calidad de producción. Ejecuta el detector determinista de antipatrones (58 reglas curadas: degradados genéricos, fuente Inter por defecto, tarjetas anidadas, sombras predecibles, etc.) contra tu código actual y reporta los hallazgos sin modificar nada todavía. Es el paso de diagnóstico antes de tocar código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/normalize&lt;/code&gt;&lt;/strong&gt; — corrige inconsistencias dentro del propio sistema: espaciados, radios de borde, tamaños tipográficos o usos de color que se desviaron de los tokens definidos en tu &lt;code&gt;DESIGN.md&lt;/code&gt;. Útil cuando varias sesiones de un agente fueron introduciendo pequeñas divergencias con el tiempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/polish&lt;/code&gt;&lt;/strong&gt; — el pase final de calidad. Aplica las correcciones dentro de tu sistema existente (no inventa uno nuevo), elimina las "señales de IA" detectadas y vuelve a correr el detector antes de entregar el resultado, hasta llegar a cero hallazgos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un flujo típico en Claude Code o Cursor se ve así: &lt;code&gt;/impeccable audit&lt;/code&gt; para diagnosticar, &lt;code&gt;/impeccable normalize&lt;/code&gt; para alinear lo que ya existe con tus tokens, y &lt;code&gt;/impeccable polish&lt;/code&gt; como pase final antes de hacer commit — cada uno leyendo el mismo &lt;code&gt;DESIGN.md&lt;/code&gt;/&lt;code&gt;PRODUCT.md&lt;/code&gt; para no salirse de tu marca.&lt;/p&gt;

&lt;p&gt;Estos tres son solo el punto de partida: hay otros 20 comandos (&lt;code&gt;/typeset&lt;/code&gt;, &lt;code&gt;/distill&lt;/code&gt;, &lt;code&gt;/colorize&lt;/code&gt;, &lt;code&gt;/layout&lt;/code&gt;, &lt;code&gt;/bolder&lt;/code&gt;, &lt;code&gt;/quieter&lt;/code&gt;, &lt;code&gt;/overdrive&lt;/code&gt;, entre otros) que cubren tipografía, color, layout y movimiento. Puedes ver el listado completo, la documentación de instalación y el código fuente en el &lt;a href="https://github.com/pbakaus/impeccable/blob/main/README.md" rel="noopener noreferrer"&gt;README oficial del repositorio&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo de implementación: Tus propias reglas de marca
&lt;/h3&gt;

&lt;p&gt;Impeccable no impone arquitectura de frontend (no decide si usas Angular zoneless, señales o qué motor de animación usar) — eso queda en tus manos. Lo que sí hace es leer consistentemente las reglas visuales que tú definas. Un &lt;code&gt;DESIGN.md&lt;/code&gt; con restricciones estrictas de marca podría verse así, a modo de ejemplo:&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="c1"&gt;# Ejemplo ilustrativo — no es el esquema real de Impeccable,&lt;/span&gt;
&lt;span class="c1"&gt;# que usa DESIGN.md/PRODUCT.md en formato Markdown (spec Google Stitch)&lt;/span&gt;
&lt;span class="na"&gt;brand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;background_base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0c1624"&lt;/span&gt;
  &lt;span class="na"&gt;allowed_accents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;green"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pink"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;voice&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calma,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;precisa,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sin&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hype"&lt;/span&gt;
  &lt;span class="na"&gt;anti_references&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Evitar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;el&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;blanco&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;puro.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;No&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;degradados&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;genéricos.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Rechazar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;toda&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;iconografía&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;agresiva&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;o&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;relacionada&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;con&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;armas,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;evitar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;o&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;mostrar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;manos&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;los&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;recursos&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;visuales."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cualquier motor de movimiento o decisión de arquitectura (GSAP, Lenis, Angular con Signals, etc.) sigue siendo una decisión tuya de stack técnico — Impeccable simplemente evita que el agente reintroduzca los patrones visuales genéricos mientras la implementas.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>claude</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 04 Jun 2026 04:34:58 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-3mfi</link>
      <guid>https://dev.to/antoniocardenas/-3mfi</guid>
      <description>&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://dev.to/turingsoracle/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6jpi7wmmmcc52bzb6vh.jpeg" height="447" class="m-0" width="800"&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://dev.to/turingsoracle/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai" rel="noopener noreferrer" class="c-link"&gt;
            Agent-Safe Angular Components: Copy-Paste MCP + Skills Setup for Verified AI Development - DEV Community
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Angular v22 MCP + Skills Integration: Agentic Development Setup   With Angular v22, the MCP...
          &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" width="300" height="299"&gt;
          dev.to
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Agent-Safe Angular Components: Copy-Paste MCP + Skills Setup for Verified AI Development</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 04 Jun 2026 04:32:42 +0000</pubDate>
      <link>https://dev.to/turingsoracle/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai</link>
      <guid>https://dev.to/turingsoracle/agent-safe-angular-components-copy-paste-mcp-skills-setup-for-verified-ai-development-32ai</guid>
      <description>&lt;h2&gt;
  
  
  Angular v22 MCP + Skills Integration: Agentic Development Setup
&lt;/h2&gt;

&lt;p&gt;With Angular v22, the MCP (Model Context Protocol) server + Angular Skills stack transforms agent-assisted development from a risky proposition into a deterministic, verifiable workflow. This guide walks you through configuring your environment, setting up the right skills, and building agent-safe components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1: Environment Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js v20+ (&lt;code&gt;node --version&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Angular CLI v22+ (&lt;code&gt;npm install -g @angular/cli@latest&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A coding agent environment (Gemini CLI, Cursor, Claude Code, GitHub Copilot, JetBrains AI, or Windsurf)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Configure Angular MCP Server
&lt;/h3&gt;

&lt;p&gt;The Angular CLI ships with the MCP server built-in. Configure it in your agent's settings:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Gemini CLI / Cursor / Claude Code&lt;/strong&gt; (using &lt;code&gt;.gemini/settings.json&lt;/code&gt; or equivalent):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chrome-devtools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"chrome-devtools-mcp@latest"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For JetBrains IDEs&lt;/strong&gt; (Settings → Tools → MCP):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add new server: name &lt;code&gt;angular-cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Command: &lt;code&gt;npx -y @angular/cli mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add second server: name &lt;code&gt;chrome-devtools&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Command: &lt;code&gt;npx chrome-devtools-mcp@latest&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test the connection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @angular/cli mcp &lt;span class="nt"&gt;--health-check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a list of available tools. Common ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ng_lint&lt;/code&gt; — runs the linter on your project&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_examples&lt;/code&gt; — fetches best-practice code examples&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_best_practices&lt;/code&gt; — retrieves the Angular Best Practices Guide&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search_documentation&lt;/code&gt; — queries angular.dev&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev_server.wait_for_build&lt;/code&gt; — blocks until build succeeds/fails (critical for agents)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev_server.start&lt;/code&gt; — starts the dev server&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dev_server.stop&lt;/code&gt; — stops the dev server&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Install Angular Skills
&lt;/h3&gt;

&lt;p&gt;Skills are installed separately from MCP tools. They augment the agent's knowledge without adding token overhead to every request.&lt;/p&gt;

&lt;p&gt;Install the official Angular skills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using npx skills package&lt;/span&gt;
npx @anthropic-ai/skills add &lt;span class="se"&gt;\&lt;/span&gt;
  https://github.com/angular/skills/blob/main/angular-developer/SKILL.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; angular-developer

npx @anthropic-ai/skills add &lt;span class="se"&gt;\&lt;/span&gt;
  https://github.com/angular/skills/blob/main/angular-new-app/SKILL.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; angular-new-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if your agent supports URL-based skills, reference directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/skills &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/angular/skills/blob/main/angular-developer/SKILL.md
/skills &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/angular/skills/blob/main/angular-new-app/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In your agent (Gemini CLI, etc.)&lt;/span&gt;
/skills list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;angular-developer&lt;/code&gt; and &lt;code&gt;angular-new-app&lt;/code&gt; listed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Configure Chrome DevTools for Agents
&lt;/h3&gt;

&lt;p&gt;This gives agents visibility into your running application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx chrome-devtools-mcp@latest &lt;span class="nt"&gt;--install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx chrome-devtools-mcp@latest &lt;span class="nt"&gt;--health-check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Part 2: Writing Agent-Safe Components
&lt;/h2&gt;

&lt;p&gt;With MCP + Skills configured, your agent has access to build verification and browser visibility. Now write code that agents can safely modify.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 1: Exhaustive &lt;a class="mentioned-user" href="https://dev.to/switch"&gt;@switch&lt;/a&gt; with Type Safety
&lt;/h3&gt;

&lt;p&gt;Always use exhaustive &lt;a class="mentioned-user" href="https://dev.to/switch"&gt;@switch&lt;/a&gt; blocks. This prevents agents from introducing unhandled cases.&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;// ✓ Good: Type-safe, exhaustive union&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;VehicleStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;maintenance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;critical&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FleetDetailComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;VehicleStatus&lt;/span&gt;&lt;span class="o"&gt;&amp;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;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;assertNever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;never&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="s2"&gt;`Unhandled status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Template with exhaustive check --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"status-card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  @switch (status()) {
    @case ('idle') {
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge badge-green"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Available&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    }
    @case ('transit') {
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge badge-blue"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;In transit&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    }
    @case ('maintenance') {
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge badge-yellow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Maintenance&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    }
    @case ('critical') {
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge badge-red"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Critical&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    }
    @default {
      &lt;span class="c"&gt;&amp;lt;!-- If an agent adds a new status to the union without updating the template, this line will fail to compile --&amp;gt;&lt;/span&gt;
      {{ assertNever(status() as never) }}
    }
  }
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;: If a backend team adds &lt;code&gt;'error'&lt;/code&gt; to the union without notifying frontend, the TypeScript build fails—agents can't ship broken code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: Signal Forms with Inline Validators
&lt;/h3&gt;

&lt;p&gt;Signal Forms provide type-safe, signal-driven form handling. Agents are far less likely to introduce validation errors.&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ServiceTicketComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Signal-based form&lt;/span&gt;
  &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormGroup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Validators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FormControl&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOW&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MEDIUM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIGH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CRITICAL&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MEDIUM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;assignedTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&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="c1"&gt;// Signal-based access&lt;/span&gt;
  &lt;span class="nx"&gt;priority$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;priority&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valueAsSignal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Compute UI state based on priority&lt;/span&gt;
  &lt;span class="nx"&gt;priorityClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&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;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="nf"&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;level&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CRITICAL&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;text-red-600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIGH&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;text-orange-600&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;text-gray-600&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="c1"&gt;// Agent can safely call this; form validation is enforced&lt;/span&gt;
  &lt;span class="nf"&gt;submitTicket&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Safe to use form.value — it's typed and validated&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fleetService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTicket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Template:&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;form&lt;/span&gt; &lt;span class="na"&gt;[formGroup]=&lt;/span&gt;&lt;span class="s"&gt;"form"&lt;/span&gt; &lt;span class="na"&gt;(submit)=&lt;/span&gt;&lt;span class="s"&gt;"submitTicket()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt;
    &lt;span class="na"&gt;formControlName=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;
    &lt;span class="na"&gt;[class]=&lt;/span&gt;&lt;span class="s"&gt;"priorityClass()"&lt;/span&gt;
    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Describe the issue..."&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;formControlName=&lt;/span&gt;&lt;span class="s"&gt;"priority"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"LOW"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Low&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"MEDIUM"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Medium&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"HIGH"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;High&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"CRITICAL"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Critical&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;[disabled]=&lt;/span&gt;&lt;span class="s"&gt;"form.invalid()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;: Agents can't generate invalid form values. TypeScript catches it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: @boundary for Risky Integrations
&lt;/h3&gt;

&lt;p&gt;When integrating third-party code or experimental features, wrap with &lt;code&gt;@boundary&lt;/code&gt;.&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"dashboard"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Core fleet list always renders --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;fleet-list&lt;/span&gt; &lt;span class="na"&gt;[units]=&lt;/span&gt;&lt;span class="s"&gt;"units()"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- AI diagnostics can fail without crashing the whole page --&amp;gt;&lt;/span&gt;
  @boundary {
    &lt;span class="nt"&gt;&amp;lt;ai-predictive-diagnostics&lt;/span&gt; &lt;span class="na"&gt;[selectedUnit]=&lt;/span&gt;&lt;span class="s"&gt;"selectedUnit()"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  } @catch (error) {
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"error-fallback"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Diagnostics unavailable&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ error.message }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"retryDiagnostics()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Retry&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  }
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;: When an agent writes complex AI integration code, a single bug won't crash the user's app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 4: Inline Template Functions for Transient Logic
&lt;/h3&gt;

&lt;p&gt;Keep component API clean; let agents write inline handlers.&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="c"&gt;&amp;lt;!-- ✓ Inline handler — close to its usage --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
  &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"vehicles.update(v =&amp;gt; v.filter(item =&amp;gt; item.id !== vehicleId))"&lt;/span&gt;
  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn-danger"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Remove from fleet
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- ✗ Avoid exposing every handler as a method --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- &amp;lt;button (click)="removeVehicle(vehicleId)"&amp;gt;Remove&amp;lt;/button&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the component API surface minimal and lets agents see the full handler intent inline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3: Agent Workflows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Workflow 1: Scaffold a Component (with MCP Verification)
&lt;/h3&gt;

&lt;p&gt;Tell your agent: &lt;em&gt;"Create a ServiceTicketForm component using Angular skills. Use signal forms, include an @boundary for the AI priority analyzer, and run the build to verify."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The agent will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call &lt;code&gt;get_best_practices&lt;/code&gt; to fetch Signal Forms patterns.&lt;/li&gt;
&lt;li&gt;Scaffold the component with &lt;code&gt;ng generate component&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implement inline validators using the skill guidance.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;dev_server.wait_for_build&lt;/code&gt; to verify compilation.&lt;/li&gt;
&lt;li&gt;If the build fails, read the error and fix it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can monitor this entirely in your agent's chat; no surprise errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow 2: Add AI-Powered Fleet Chat (with Browser Verification)
&lt;/h3&gt;

&lt;p&gt;From the logistics-manager-app codelab, tell your agent: &lt;em&gt;"Implement a fleet chat query feature. Use the Gemini API to analyze fleet data and return filtered results. Start the dev server with Chrome DevTools, navigate to the chat component, and take a screenshot to verify the feature works."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The agent will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;FleetChatService&lt;/code&gt; that accepts a natural-language query.&lt;/li&gt;
&lt;li&gt;Send the current &lt;code&gt;units()&lt;/code&gt; signal state to the Gemini API.&lt;/li&gt;
&lt;li&gt;Parse Gemini's response and filter the fleet.&lt;/li&gt;
&lt;li&gt;Update the chat UI with results.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;dev_server.start&lt;/code&gt; to spin up the dev server.&lt;/li&gt;
&lt;li&gt;Call Chrome DevTools to navigate to the component.&lt;/li&gt;
&lt;li&gt;Snap a screenshot showing the chat results.&lt;/li&gt;
&lt;li&gt;Read the screenshot and confirm the feature works.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No hallucinations—the agent has eyes on the running application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow 3: Implement Predictive Diagnostics with @boundary
&lt;/h3&gt;

&lt;p&gt;From the codelab, tell your agent: &lt;em&gt;"Add a 'Run AI Diagnostic' button to the FleetDetailModal. The button should call a Gemini API with the unit's telemetry (speed, battery, status). Wrap the diagnostics component with @boundary so if the AI call fails, it doesn't crash the modal. Test it by triggering a vehicle detail view and clicking the button."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The agent will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;DiagnosticsComponent&lt;/code&gt; that calls the AI service.&lt;/li&gt;
&lt;li&gt;Wrap it with &lt;code&gt;@boundary&lt;/code&gt; in the modal template.&lt;/li&gt;
&lt;li&gt;Implement a fallback UI in the &lt;a class="mentioned-user" href="https://dev.to/catch"&gt;@catch&lt;/a&gt; block.&lt;/li&gt;
&lt;li&gt;Add retry logic.&lt;/li&gt;
&lt;li&gt;Start the dev server.&lt;/li&gt;
&lt;li&gt;Navigate to a vehicle detail modal.&lt;/li&gt;
&lt;li&gt;Click the diagnostic button.&lt;/li&gt;
&lt;li&gt;Verify the result (or error) in the browser.&lt;/li&gt;
&lt;li&gt;If the test fails, analyze the error and iterate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This entire workflow is deterministic. The agent can't ship broken code—the build will catch it first, and Chrome DevTools will catch runtime issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 4: Skills Configuration Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One Server Per Domain
&lt;/h3&gt;

&lt;p&gt;Don't load the Angular MCP server alongside your deployment server and communication server. Create separate IDE configurations:&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;"profiles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"chrome-devtools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"chrome-devtools-mcp@latest"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deployment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"deploy-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"my-deploy-cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Activate only the profile you need for the task at hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version Your Skills
&lt;/h3&gt;

&lt;p&gt;Put skills in your repo and version them like code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/my-project
  /skills
    /angular-v22-dev-guidelines.md
    /our-design-system.md
    /api-integration-patterns.md
  /src
  angular.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reference them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @anthropic-ai/skills add ./skills/angular-v22-dev-guidelines.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Review and update skills when you update Angular versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measure Context Budget
&lt;/h3&gt;

&lt;p&gt;Before running an agent on a real task, ask it to estimate token usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What's the total token count of all my installed MCP tools and skills?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If over 30% of your context window is on tool definitions, simplify. Agents need room to think.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write MCP Guardrails in Skills
&lt;/h3&gt;

&lt;p&gt;Instead of relying on the agent to "be careful," write it into the skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Angular Update Guardrail Skill&lt;/span&gt;

Before running &lt;span class="sb"&gt;`ng update`&lt;/span&gt;, ALWAYS:
&lt;span class="p"&gt;1.&lt;/span&gt; Create a git branch: &lt;span class="sb"&gt;`git checkout -b ng-update-v22`&lt;/span&gt;
&lt;span class="p"&gt;2.&lt;/span&gt; Run tests: &lt;span class="sb"&gt;`npm test`&lt;/span&gt;
&lt;span class="p"&gt;3.&lt;/span&gt; Commit current state: &lt;span class="sb"&gt;`git commit -m "checkpoint before ng update"`&lt;/span&gt;
&lt;span class="p"&gt;4.&lt;/span&gt; Then and only then run: &lt;span class="sb"&gt;`ng update @angular/core @angular/cli`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent will follow the skill's instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 5: Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"MCP server not found"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify &lt;code&gt;npx @angular/cli mcp --health-check&lt;/code&gt; returns a list of tools&lt;/li&gt;
&lt;li&gt;Restart your agent IDE&lt;/li&gt;
&lt;li&gt;Check that Angular CLI v22+ is installed: &lt;code&gt;ng version&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Skills not recognized"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;npx @anthropic-ai/skills list&lt;/code&gt; to confirm they're installed&lt;/li&gt;
&lt;li&gt;Restart your agent&lt;/li&gt;
&lt;li&gt;Verify the skill URL is correct&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Chrome DevTools not taking screenshots"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure Chrome is installed and in PATH&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npx chrome-devtools-mcp@latest --health-check&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Check that you've started the dev server with &lt;code&gt;dev_server.start&lt;/code&gt; before asking the agent to navigate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Build verification timed out"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;dev_server.wait_for_build&lt;/code&gt; tool has a default timeout (usually 30 seconds)&lt;/li&gt;
&lt;li&gt;If your builds are slower, ask the agent to increase the timeout in the MCP call&lt;/li&gt;
&lt;li&gt;Check that the dev server is running: &lt;code&gt;ng serve&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;With Angular v22's MCP + Skills stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agents write type-safe code&lt;/strong&gt; that compiles or fails, never silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exhaustive type checking&lt;/strong&gt; prevents new states from slipping past.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@boundary&lt;/strong&gt; contains failures instead of crashing the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline templates&lt;/strong&gt; keep components clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal Forms&lt;/strong&gt; enforce validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome DevTools integration&lt;/strong&gt; gives agents visibility into running code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills teach modern patterns&lt;/strong&gt; aligned to your version and conventions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hallucination loop is closed. Code generation becomes verifiable. Agentic development shifts from risky to reliable.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up Angular MCP in your IDE/agent (5 minutes)&lt;/li&gt;
&lt;li&gt;Install Angular Skills (2 minutes)&lt;/li&gt;
&lt;li&gt;Configure Chrome DevTools (2 minutes)&lt;/li&gt;
&lt;li&gt;Write a test component using the patterns above&lt;/li&gt;
&lt;li&gt;Ask your agent to scaffold a feature and verify it with MCP tools&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;Angular Skills Repository: &lt;a href="https://github.com/angular/skills" rel="noopener noreferrer"&gt;https://github.com/angular/skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chrome DevTools for Agents: &lt;a href="https://developer.chrome.com/docs/devtools/agents" rel="noopener noreferrer"&gt;https://developer.chrome.com/docs/devtools/agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Logistics Manager Codelab: &lt;a href="https://github.com/angular/examples/blob/main/logistics-manager-app/codelab.md" rel="noopener noreferrer"&gt;https://github.com/angular/examples/blob/main/logistics-manager-app/codelab.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>mcp</category>
      <category>agentskills</category>
      <category>ai</category>
    </item>
    <item>
      <title>Stop AI Agents From Hallucinating: Angular v22's Type-Safe, Boundary-Protected Pipelines</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Thu, 04 Jun 2026 04:22:07 +0000</pubDate>
      <link>https://dev.to/turingsoracle/stop-ai-agents-from-hallucinating-angular-v22s-type-safe-boundary-protected-pipelines-3j1k</link>
      <guid>https://dev.to/turingsoracle/stop-ai-agents-from-hallucinating-angular-v22s-type-safe-boundary-protected-pipelines-3j1k</guid>
      <description>&lt;h1&gt;
  
  
  Angular v22: Agentic Pipelines and Resilient Template Architectures
&lt;/h1&gt;

&lt;p&gt;The frontend landscape is no longer just about rendering pixels; it's about establishing robust pipelines that integrate seamlessly with automated, AI-driven workflows. At Google I/O 2026, the Angular team unveiled a massive structural shift for the framework. Moving towards the v22 release (launching the week of June 1st, 2026), Angular is solidifying its primitive layer—pushing Signal Forms and Resource APIs to stable—while actively engineering the framework to act as a first-class citizen in agentic development environments.&lt;/p&gt;

&lt;p&gt;Here is an architectural breakdown of the most critical updates and what they mean for high-performance core engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Agentic Pipeline: Angular MCP + Skills
&lt;/h2&gt;

&lt;p&gt;For those of us configuring custom agentic workflows, the standard LLM coding loop is notoriously brittle. An agent writes code, claims it works, and leaves you to discover the compilation errors at runtime.&lt;/p&gt;

&lt;p&gt;Angular is attacking this friction head-on by pairing two critical systems: the Angular CLI's Model Context Protocol (MCP) server that enables AI assistants to interact directly with the Angular CLI, providing tools for code generation, modernizing code, fetching examples, and running &lt;code&gt;builds/tests&lt;/code&gt;, and the &lt;strong&gt;Angular Skills framework&lt;/strong&gt; — a specialized knowledge layer that teaches agents to write modern, v22-aligned code.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works: The MCP Server + Skills Stack
&lt;/h3&gt;

&lt;p&gt;The Angular CLI MCP server exposes tools that launch an interactive AI-powered Angular tutor, find authoritative best-practice code examples, retrieve the Angular Best Practices Guide, and list applications and libraries in the workspace by reading angular.json, and search the official documentation at angular.dev.&lt;/p&gt;

&lt;p&gt;Configure it in your IDE or agent environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"angular-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The angular-developer skill generates Angular code and provides architectural guidance, triggering when creating projects, components, or services or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling, testing, or CLI tooling.&lt;/p&gt;

&lt;p&gt;When an agent scaffolds a new component, instead of reaching for outdated Angular 15 patterns, the &lt;code&gt;angular-developer&lt;/code&gt; skill injects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signal-first reactivity&lt;/strong&gt;: &lt;code&gt;input()&lt;/code&gt; and &lt;code&gt;output()&lt;/code&gt; instead of &lt;code&gt;@Input()&lt;/code&gt; and &lt;code&gt;@Output()&lt;/code&gt; decorators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OnPush by default&lt;/strong&gt;: Change detection set to &lt;code&gt;ChangeDetectionStrategy.OnPush&lt;/code&gt; from the start&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standalone components&lt;/strong&gt;: No &lt;code&gt;NgModule&lt;/code&gt; boilerplate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-safe forms&lt;/strong&gt;: Signal Forms for reactive, typed form handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real-world example from the Angular logistics-manager-app codelab: agents can implement AI-powered fleet chat by updating FleetService to include a queryFleet(prompt) method, using the gemini-sdk skill to send the current units() state to Gemini and filter data based on the user's input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closing the Hallucination Loop: MCP + Chrome DevTools for Agents
&lt;/h3&gt;

&lt;p&gt;The real power unlocks when you chain Angular MCP with Chrome DevTools for Agents, which allows agents to navigate websites, interact with buttons, explore pages, and run instant accessibility audits through a fully managed browser instance.&lt;/p&gt;

&lt;p&gt;The workflow becomes deterministic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agent writes code&lt;/strong&gt; using the &lt;code&gt;angular-developer&lt;/code&gt; skill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP triggers &lt;code&gt;dev_server.wait_for_build&lt;/code&gt;&lt;/strong&gt; — the agent blocks until compilation succeeds or fails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent spawns the dev server&lt;/strong&gt; using &lt;code&gt;dev_server.start&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome DevTools for Agents takes a screenshot&lt;/strong&gt; to visually verify DOM changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent reads the rendered output&lt;/strong&gt; and fixes errors if needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This closes the hallucination loop entirely. No more "I'll assume that worked" — the agent has eyes on your running application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template Resilience with @boundary
&lt;/h2&gt;

&lt;p&gt;In complex UI engineering—especially when mixing DOM layouts with heavy WebGL or custom animation loops—a single component failure can crash the entire change detection cycle, resulting in a blank screen.&lt;/p&gt;

&lt;p&gt;To solve this, Angular is introducing &lt;strong&gt;@boundary&lt;/strong&gt; (landing in Developer Preview in Q3 2026).&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@boundary&lt;/code&gt; block introduces native error boundaries directly into the template compilation. If an isolated widget or complex directive throws a fatal error, &lt;code&gt;@boundary&lt;/code&gt; traps it, preventing the crash from bubbling up and halting the rest of the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error Isolation and Fallback Patterns
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@boundary {
  &lt;span class="nt"&gt;&amp;lt;heavy-webgl-scene-renderer&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
} @catch (error) {
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"error-fallback"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Scene unavailable&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ error.message }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"retryBoundary()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reload scene&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unlike try-catch in component logic, &lt;code&gt;@boundary&lt;/code&gt; operates at the &lt;strong&gt;template compilation level&lt;/strong&gt;. The boundary knows about the component tree and can isolate errors without unwinding the entire change detection cycle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retry Logic Without State Reload
&lt;/h3&gt;

&lt;p&gt;The architecture enables intentional retry logic:&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DashboardComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;sceneError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;retryBoundary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Retry logic — the boundary re-renders, re-executes the component&lt;/span&gt;
    &lt;span class="c1"&gt;// but preserves the outer application state&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sceneError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In traditional Angular, a critical error in one component forces a full page reload. With &lt;code&gt;@boundary&lt;/code&gt;, you contain the failure. The fleet dashboard can crash, but the user can still see the service queue and vehicle list. Error containment becomes a first-class concern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Level Boundaries for Granular Control
&lt;/h3&gt;

&lt;p&gt;You can nest &lt;code&gt;@boundary&lt;/code&gt; blocks for layered error handling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@boundary {
  &lt;span class="nt"&gt;&amp;lt;telemetry-dashboard&amp;gt;&lt;/span&gt;
    @boundary {
      &lt;span class="nt"&gt;&amp;lt;ai-predictive-diagnostics&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    } @catch {
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Diagnostics unavailable&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    }
  &lt;span class="nt"&gt;&amp;lt;/telemetry-dashboard&amp;gt;&lt;/span&gt;
} @catch {
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Dashboard offline&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The inner boundary catches errors from the diagnostics component; the outer boundary catches errors from the entire dashboard. This mirrors real-world failure domains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep Dive: Advanced Control Flow Mechanics in &lt;code&gt;@switch&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The evolution of Angular's control flow syntax isn't just about cleaner aesthetics — it's about moving runtime liabilities into compile-time guarantees. The updates to the &lt;code&gt;@switch&lt;/code&gt; block address two classic pain points in template architecture: redundant boilerplate via multiple case matching and structural desynchronization via exhaustive type checking.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Multiple Case Matching (Boilerplate Reduction)
&lt;/h3&gt;

&lt;p&gt;In traditional templates, if multiple states shared identical UI representation, you were forced to duplicate template blocks or nest conditional elements. Angular now allows comma-separated matching values within a single &lt;code&gt;@case&lt;/code&gt; block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@switch (orderStatus()) {
  @case ('pending', 'processing') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your order is being prepared.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('shipped') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your order is on the way.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('delivered') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Order complete.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The template compiler groups these branches efficiently without generating redundant view nodes. Instead of maintaining two separate case blocks with identical markup, a single case handles multiple states. This is especially powerful when dealing with isomorphic state enums where the user-facing representation is identical across several backend statuses.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Exhaustive Checking via the &lt;code&gt;never&lt;/code&gt; Type
&lt;/h3&gt;

&lt;p&gt;The most critical architectural upgrade is compile-time exhaustiveness enforcement. When dealing with strict TypeScript union types (e.g., &lt;code&gt;type Status = 'open' | 'closed' | 'archived'&lt;/code&gt;), a common source of production bugs occurs when a backend team introduces a new status — but the frontend template is never updated. The UI silently fails or shows a blank state.&lt;/p&gt;

&lt;p&gt;By combining template variable evaluation with an exhaustive default assignment using the &lt;code&gt;never&lt;/code&gt; type boundary assertion, the Angular compiler can enforce that every branch of a union type is explicitly handled. If a new member is added to the union, the build breaks immediately until that state is handled.&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;// Component TypeScript&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;OrderStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;processing&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;delivered&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;orderStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;OrderStatus&lt;/span&gt;&lt;span class="o"&gt;&amp;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;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// This forces exhaustive checking — TypeScript won't compile without all cases&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;assertNever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;never&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="s2"&gt;`Unhandled status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Template with exhaustive guarantee --&amp;gt;&lt;/span&gt;
@switch (orderStatus()) {
  @case ('pending') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Waiting to be processed.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('processing') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your order is being prepared.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('shipped') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your order is on the way.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @case ('delivered') {
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Order complete.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  }
  @default {
    {{ assertNever(orderStatus() as never) }}
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a backend engineer adds a sixth status (&lt;code&gt;'returned'&lt;/code&gt;) without notifying the frontend, TypeScript compilation fails immediately. This shifts the burden of type safety from runtime testing to the development build process — exactly where it belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inline Template Functions: Reducing Class Boilerplate
&lt;/h2&gt;

&lt;p&gt;In v22, you can now safely inline short, quick arrow functions directly within template event bindings without bloating your TypeScript class. This is more than cosmetic—it's a statement about where logic belongs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pattern: Event Handlers and Transforms
&lt;/h3&gt;

&lt;p&gt;Instead of exposing every handler as a class method:&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;// Before: pollutes the component API&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CartComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;([...]);&lt;/span&gt;

  &lt;span class="nf"&gt;onAddItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;onRemoveItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&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;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now inline these directly:&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="c"&gt;&amp;lt;!-- v22: inline arrow functions in templates --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"items.update(items =&amp;gt; [...items, newItem()])"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Add&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"items.update(items =&amp;gt; items.filter(i =&amp;gt; i.id !== id))"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Remove&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The component surface shrinks—only the true public API remains visible. Transient handlers stay in the template, where they logically belong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Template Errors and Type Inference
&lt;/h3&gt;

&lt;p&gt;The template compiler now provides rich type feedback for inline expressions:&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="c"&gt;&amp;lt;!-- TypeScript error: items.update expects an updater function --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"items.update('invalid')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Wrong&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- ✓ Correct: full type checking on the inline arrow function parameter --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"items.update(items =&amp;gt; items.slice(0, items.length - 1))"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Remove last
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is critical for agent-assisted development. When the &lt;code&gt;angular-developer&lt;/code&gt; skill writes template code, the compiler catches type mismatches immediately, preventing hallucinations from reaching production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Example: Form Field Transforms
&lt;/h3&gt;

&lt;p&gt;From the logistics-manager-app codelab, when a user describes an issue like "The vehicle is emitting smoke and the engine has stopped," the AI should automatically set the priority to CRITICAL by adding a listener to the issue field in the &lt;strong&gt;serviceForm&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With inline template functions, you can implement this compactly:&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;input&lt;/span&gt; 
  &lt;span class="na"&gt;(blur)=&lt;/span&gt;&lt;span class="s"&gt;"priorityField.setValue(
    analyzePriority(issueField.value)
  )"&lt;/span&gt;
  &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Describe the issue..."&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The handler stays close to its trigger, making the intent transparent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Reactivity Refinements
&lt;/h2&gt;

&lt;p&gt;Beyond agents, error boundaries, and control flow mechanics, Angular is sharpening the broader developer experience:&lt;/p&gt;

&lt;h3&gt;
  
  
  Signal Forms: Fine-Grained Reactivity for Complex Forms
&lt;/h3&gt;

&lt;p&gt;Moving out of Developer Preview in v22, Signal Forms combines the strict typing of reactive forms with the granular reactivity of Signals. A form with 50 fields now updates only the field that changed—not the entire form tree.&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ServiceTicketForm&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormGroup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;issueDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOW&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;assignedTechnician&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&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="c1"&gt;// Signal-based access with fine-grained tracking&lt;/span&gt;
  &lt;span class="nx"&gt;priority$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;priority&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valueAsSignal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Only the priority display updates when priority changes&lt;/span&gt;
  &lt;span class="nx"&gt;priorityStyles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&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;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="nf"&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;level&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CRITICAL&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;bg-red&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;bg-yellow&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Angular Aria: Accessible UI Primitives
&lt;/h3&gt;

&lt;p&gt;Alongside Signal Forms, Angular Aria (the headless, fully accessible UI directive set) also hits stable, allowing you to build heavily customized, high-contrast UI components without sacrificing native accessibility standards.&lt;/p&gt;

&lt;p&gt;This is crucial for AI-assisted development. When the &lt;code&gt;angular-developer&lt;/code&gt; skill scaffolds a custom dropdown or modal, it automatically includes the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keyboard navigation (arrow keys, enter, escape)&lt;/li&gt;
&lt;li&gt;ARIA roles and live regions&lt;/li&gt;
&lt;li&gt;Focus management&lt;/li&gt;
&lt;li&gt;Screen reader announcements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No agent hallucinations about accessibility—it's baked in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vitest as Default
&lt;/h3&gt;

&lt;p&gt;The Angular CLI now scaffolds all new projects with Vitest as the default test runner, replacing Karma for dramatically faster, more modern testing cycles. Tests run in milliseconds instead of seconds, making the agent feedback loop nearly instant.&lt;/p&gt;

&lt;h3&gt;
  
  
  OnPush as Default Change Detection
&lt;/h3&gt;

&lt;p&gt;New components use &lt;code&gt;ChangeDetectionStrategy.OnPush&lt;/code&gt; by default, encouraging signal-based reactivity over Zone.js-triggered checks from project inception. This trains both developers and agents to think in terms of granular, trackable state changes rather than global change detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular Skills: Teaching Agents Modern Patterns
&lt;/h2&gt;

&lt;p&gt;Angular Skills are designed to help coding agents create applications aligned with the latest versions of Angular, best practices, and new features and manage Angular applications effectively. These skills provide architectural guidance, generate idiomatic Angular code, and help scaffold new projects using modern best practices.&lt;/p&gt;

&lt;p&gt;Two key skills ship with v22:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;angular-developer&lt;/code&gt;&lt;/strong&gt;: Generates code for components, services, state management, forms, routing, SSR, and more. Always references the correct Angular version before providing guidance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;angular-new-app&lt;/code&gt;&lt;/strong&gt;: Creates a new Angular app using the Angular CLI, providing important guidelines for effectively setting up and structuring a modern Angular application, with flags like --ai-config=[agents, claude, copilot, cursor, gemini, jetbrains, none, windsurf] to tune the generated code for the specific agent's conventions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Skills and MCP tools are complementary—don't confuse them. One MCP server per domain (don't load everything at once); version your skills like code (a skill for Angular 19 patterns will actively hurt you on Angular 21); use skills to write MCP guardrails (e.g., "Before running ng update, always create a git branch first"); and measure your context budget (if over 30% of your context window is on tool definitions, you have a configuration problem).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Consolidation Release
&lt;/h2&gt;

&lt;p&gt;Angular is no longer just catching up in the reactivity space; by natively integrating MCP and Angular Skills, hardening its template error boundaries with &lt;code&gt;@boundary&lt;/code&gt;, automating exhaustive type checking in control flow, and enabling inline template functions, it is actively defining what a modern, agent-ready frontend architecture looks like.&lt;/p&gt;

&lt;p&gt;v22 is the signal-first era made concrete. The framework's multi-year modernization effort converges into a coherent, production-ready, agentic-native development model where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agents write type-safe templates&lt;/strong&gt; that compile or fail, never silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error boundaries isolate failures&lt;/strong&gt; instead of crashing the entire app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control flow is exhaustive&lt;/strong&gt; by default, not a runtime surprise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers close the hallucination loop&lt;/strong&gt; with real browser visibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills teach agents modern patterns&lt;/strong&gt; tailored to your version and conventions.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;What's new in Angular - Chrome for Developers (Google I/O 2026)&lt;/li&gt;
&lt;li&gt;Angular Skills Repository: &lt;a href="https://github.com/angular/skills" rel="noopener noreferrer"&gt;https://github.com/angular/skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Logistics Manager App Codelab: &lt;a href="https://github.com/angular/examples/blob/main/logistics-manager-app/codelab.md" rel="noopener noreferrer"&gt;https://github.com/angular/examples/blob/main/logistics-manager-app/codelab.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP Skills vs MCP Tools: The Right Way to Configure Your Server (Antonio Cárdenas, yeou.dev)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 20 May 2026 15:19:49 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-ehm</link>
      <guid>https://dev.to/antoniocardenas/-ehm</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5" class="crayons-story__hidden-navigation-link"&gt;Antigravity ha muerto, larga vida a Antigravity.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/angularfirebase"&gt;
            &lt;img alt="Angular Firebase logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F821%2Fd43c326b-2812-4d5d-a7e0-f13d3a9567d7.png" class="crayons-logo__image" width="768" height="768"&gt;
          &lt;/a&gt;

          &lt;a href="/antoniocardenas" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif" alt="antoniocardenas profile" class="crayons-avatar__image" width="270" height="349"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antoniocardenas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio Cardenas 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio Cardenas 
                
                
              
              &lt;div id="story-author-preview-content-3704933" 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="/antoniocardenas" 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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif" class="crayons-avatar__image" alt="" width="270" height="349"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio Cardenas &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/angularfirebase" class="crayons-story__secondary fw-medium"&gt;Angular Firebase&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 20&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/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5" id="article-link-3704933"&gt;
          Antigravity ha muerto, larga vida a Antigravity.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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/gemini"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemini&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/antigravity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;antigravity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/spanish"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;spanish&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/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5" 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;11&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/angularfirebase/antigravity-ha-muerto-larga-vida-a-antigravity-3eb5#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;
            5 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Antonio Cardenas </dc:creator>
      <pubDate>Wed, 20 May 2026 15:14:44 +0000</pubDate>
      <link>https://dev.to/antoniocardenas/-3hhb</link>
      <guid>https://dev.to/antoniocardenas/-3hhb</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m" class="crayons-story__hidden-navigation-link"&gt;Antigravity is Dead. Long Live Antigravity.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/turingsoracle"&gt;
            &lt;img alt="Turing's Oracle logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9347%2F7a287c81-6a1d-486c-9c09-5d4d5640ad06.png" class="crayons-logo__image" width="176" height="176"&gt;
          &lt;/a&gt;

          &lt;a href="/antoniocardenas" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif" alt="antoniocardenas profile" class="crayons-avatar__image" width="270" height="349"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antoniocardenas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio Cardenas 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio Cardenas 
                
                
              
              &lt;div id="story-author-preview-content-3704613" 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="/antoniocardenas" 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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175287%2F859fdc73-07f1-40d3-810a-c1d8d1a09654.gif" class="crayons-avatar__image" alt="" width="270" height="349"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio Cardenas &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/turingsoracle" class="crayons-story__secondary fw-medium"&gt;Turing's Oracle&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 20&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/turingsoracle/antigravity-is-dead-long-live-antigravity-186m" id="article-link-3704613"&gt;
          Antigravity is Dead. Long Live Antigravity.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/antigravity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;antigravity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemini"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemini&lt;/a&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/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&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/turingsoracle/antigravity-is-dead-long-live-antigravity-186m" 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;11&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/turingsoracle/antigravity-is-dead-long-live-antigravity-186m#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
