<?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: Ari</title>
    <description>The latest articles on DEV Community by Ari (@ariay).</description>
    <link>https://dev.to/ariay</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3646926%2F757bf801-0299-4d47-bf3a-145b0bd09907.png</url>
      <title>DEV Community: Ari</title>
      <link>https://dev.to/ariay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ariay"/>
    <language>en</language>
    <item>
      <title>CAPS Chromium AI Plugin Skeleton</title>
      <dc:creator>Ari</dc:creator>
      <pubDate>Thu, 04 Dec 2025 18:24:44 +0000</pubDate>
      <link>https://dev.to/ariay/caps-chromium-ai-plugin-skeleton-9ae</link>
      <guid>https://dev.to/ariay/caps-chromium-ai-plugin-skeleton-9ae</guid>
      <description>&lt;p&gt;Here is a polished, ready-to-publish blog entry based on your project description. I have formatted it to work well on platforms like Dev.to, Medium, or Hashnode.&lt;/p&gt;




&lt;h1&gt;
  
  
  Giving AI Its Sight Back: Introducing CAPS, the Chromium AI Plugin Skeleton 🦴
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Project Repository:&lt;/strong&gt; &lt;a href="https://github.com/aayvazyan-tgm/CAPS-Chromium-AI-Plugin-Skeleton" rel="noopener noreferrer"&gt;CAPS-Chromium-AI-Plugin-Skeleton&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI assistants have revolutionized how we write code, but until now, they’ve had a significant blind spot: &lt;strong&gt;Browser Extensions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An AI agent can generate a &lt;code&gt;popup.ts&lt;/code&gt; file, but it doesn't know if the popup actually renders. It can write a background worker, but it can't see if it initializes correctly. It’s like asking someone to paint a masterpiece while blindfolded—they can make the strokes, but they can't check their work.&lt;/p&gt;

&lt;p&gt;I wanted to give AI its sight back.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;CAPS (Chromium AI Plugin Skeleton)&lt;/strong&gt;, a production-ready Chrome Extension V3 template that transforms AI from a blind code generator into a verified extension builder.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 The Inspiration
&lt;/h2&gt;

&lt;p&gt;The concept fits perfectly into the "Skeleton Crew" category. This isn't just about building one extension; it's about building the &lt;strong&gt;foundation that lets AI build ANY extension&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I needed a skeleton that was lean enough to understand, but complete enough to verify. The bones that let the monster come alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ What it Does
&lt;/h2&gt;

&lt;p&gt;CAPS solves the "verification gap." It automates the feedback loop so that when an AI (or a human) makes a change, they know immediately if it works.&lt;/p&gt;

&lt;p&gt;The magic happens via a robust verification loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧪 &lt;strong&gt;E2E tests with Playwright:&lt;/strong&gt; Actually loads the extension in a real Chrome browser.&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;CI/CD Pipeline:&lt;/strong&gt; Runs build → lint → unit tests → E2E tests on every change.&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;One-Command Launch:&lt;/strong&gt; &lt;code&gt;npm start&lt;/code&gt; builds and opens Chrome with the extension loaded.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Instant Feedback:&lt;/strong&gt; The AI knows immediately if its code works.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡ Features at a Glance
&lt;/h2&gt;

&lt;p&gt;For developers, this is a complete starter kit. For AI, it’s a superpower.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI-Friendly Codebase:&lt;/strong&gt; Clean TypeScript structure that AI context windows can digest easily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manifest V3 Ready:&lt;/strong&gt; Modern API implementation with service workers (no legacy background pages).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated DevOps:&lt;/strong&gt; GitHub Actions handling parallel linting, testing, and release artifact generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict Tooling:&lt;/strong&gt; ESLint, Prettier, and Husky pre-configured.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ready-to-Use Commands:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start           &lt;span class="c"&gt;# Build + launch Chrome with extension loaded&lt;/span&gt;
npm run build       &lt;span class="c"&gt;# Production build&lt;/span&gt;
npm &lt;span class="nb"&gt;test&lt;/span&gt;:e2e        &lt;span class="c"&gt;# Run E2E tests in Chrome (Headless supported)&lt;/span&gt;
npm run check       &lt;span class="c"&gt;# Type-check, lint, format, and test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📚 Proof of Concept: One-Prompt Builds
&lt;/h2&gt;

&lt;p&gt;To prove the skeleton works, I used it to generate two distinct extensions using &lt;strong&gt;single prompts&lt;/strong&gt; with no manual intervention.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Repository&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🍬 &lt;strong&gt;Candy Counter&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;A sidebar that counts candies on web pages.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/aayvazyan-tgm/chrome-plugin-example-impl-1-candy-counter-sidebar" rel="noopener noreferrer"&gt;View Repo&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⏱️ &lt;strong&gt;Countdown Timer&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;A timer with notification integration.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/aayvazyan-tgm/chrome-plugin-example-impl-2-countown-timer" rel="noopener noreferrer"&gt;View Repo&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🧠 How I Built It (With Kiro)
&lt;/h2&gt;

&lt;p&gt;I used &lt;strong&gt;Kiro&lt;/strong&gt; instrumentally throughout the development phase. We used a process I call "Spec Driven Development."&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Architecture:&lt;/strong&gt; We started with natural conversations to define the three pillars: Chrome Foundation, Pipeline, and Quality Tooling.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Playwright Breakthrough:&lt;/strong&gt; Getting Playwright to test extensions in headless mode is notoriously difficult. Kiro helped navigate the complexity of &lt;code&gt;--headless=new&lt;/code&gt;, Service Worker detection, and dynamic Extension ID extraction to build &lt;code&gt;e2e/fixtures.ts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;CI/CD:&lt;/strong&gt; We designed a parallel GitHub Actions workflow using Xvfb for headless testing in CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Challenges Overcome
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Headless Paradox:&lt;/strong&gt; Extensions usually need a visible window. We had to utilize specific flags and event waiting to make tests pass in a CI environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manifest V3 Async Nature:&lt;/strong&gt; The shift to Service Workers introduced race conditions in testing. I added robust event listeners to ensure tests only run once the worker is active.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Why CAPS Matters
&lt;/h2&gt;

&lt;p&gt;There are other extension boilerplates out there, but they are designed for humans who can manually check their work. CAPS is the first &lt;strong&gt;AI-First Architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Zero Configuration:&lt;/strong&gt; Clone and deploy. The Chrome profile is persisted locally, so you don't need to re-login every session.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Self-Correcting Agents:&lt;/strong&gt; Because the tests run automatically, Kiro (or other agents) can see when a test fails and self-correct their code without human prompting.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;True E2E Verification:&lt;/strong&gt; We aren't mocking the browser. If the test passes, the extension &lt;em&gt;actually&lt;/em&gt; works.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🔮 What's Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP Integration:&lt;/strong&gt; Creating a Model Context Protocol server to expose testing capabilities directly to AI assistants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recipe Library:&lt;/strong&gt; Pre-built patterns for context menus, tab management, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Browser Support:&lt;/strong&gt; Extending the skeleton for Firefox and Edge.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧟 One Last Thing...
&lt;/h2&gt;

&lt;p&gt;The "Skeleton" metaphor isn't just a name. Using this skeleton, Kiro was able to implement two separate extensions with a single prompt, perfectly, without feedback, and without bugs.&lt;/p&gt;

&lt;p&gt;The skeleton is alive. Now it's time to see what monsters you can create with it. 🎃&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/aayvazyan-tgm/CAPS-Chromium-AI-Plugin-Skeleton" rel="noopener noreferrer"&gt;Check out the CAPS project on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>webdev</category>
      <category>github</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
