<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Todd Schiller - speaking</title><link href="https://toddschiller.com/" rel="alternate"></link><link href="https://toddschiller.com/feeds/tag/speaking.atom.xml" rel="self"></link><id>https://toddschiller.com/</id><updated>2026-02-27T00:00:00-05:00</updated><subtitle>Human ✘ Artificial Intelligence</subtitle><entry><title>Making AI coding work for enterprise-grade browser extensions</title><link href="https://toddschiller.com/blog/ai-coding-browser-extensions.html" rel="alternate"></link><published>2026-02-27T00:00:00-05:00</published><updated>2026-02-27T00:00:00-05:00</updated><author><name>Todd Schiller</name></author><id>tag:toddschiller.com,2026-02-27:/blog/ai-coding-browser-extensions.html</id><summary type="html">Lessons learned using AI coding tools to build PixieBrix, an enterprise-grade browser extension with a complex architecture spanning content scripts, background workers, and React UI.</summary><content type="html">&lt;p&gt;&lt;em&gt;This is a transcript of my talk at the
&lt;a href="https://aicodingsummit.com/"&gt;AI Coding Summit&lt;/a&gt; on February 26, 2026.
&lt;a href="https://gitnation.com/contents/making-ai-coding-work-for-enterprise-grade-browser-extensions"&gt;Watch the video on GitNation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/title.png" alt="Title slide: Making AI Coding Work for Enterprise-Grade Browser Extensions" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;Hi, I'm Todd Schiller, co-founder of PixieBrix. Today I'm going to be talking
through some of the hard-won lessons that we've learned using AI to code an
AI-enabled extension that's used globally by enterprises.&lt;/p&gt;
&lt;h2&gt;Browser Extensions Enable Permissionless Innovation&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/permissionless-innovation.png" alt="Extensions enable permissionless innovation" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;Our mission has always been to empower people to create the perfect experience
for the technology that matters most to them. Our first product was a browser
extension because browser extensions enable permissionless innovation. You can
automate and modernize sites that you don't yourself control — whether those
are third-party websites, vendor websites, or government websites. You can also
automate and integrate across tabs. We fundamentally believe that browser
extensions are a key part of how you empower the people closest to the work to
customize their tools to the job.&lt;/p&gt;
&lt;h2&gt;Browser Extensibility Is a Spectrum&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/extensibility-spectrum.png" alt="Browser extensibility is a spectrum" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;Browser extensibility is in fact a spectrum. There are multiple different ways
to customize the standard browser experience.&lt;/p&gt;
&lt;p&gt;In the past year, we've even seen many different forks of the Chromium browser
for things like security or embedding AI capabilities directly into the browser.
Then you have the standard custom extension experience that most people are
familiar with — you go to the Chrome Web Store, you get an extension, it does
something.&lt;/p&gt;
&lt;p&gt;Then you have a category of extensions that enable people to customize in
different ways. Userscripts like Greasemonkey or Tampermonkey allow you to run
JavaScript in the context of a web page. PixieBrix is a different kind — you
can think of it like userscripts but more low-code or no-code, enabling a
broader audience to customize.&lt;/p&gt;
&lt;p&gt;Each of these comes with different trade-offs. The things on the right side of
the screen are generally more lightweight and more agile, but that comes with
trade-offs of less control, fewer affordances, and more restrictions versus,
for example, creating a custom extension or building your entire browser
yourself.&lt;/p&gt;
&lt;h2&gt;AI Coding Tools Aren't Designed for Browser Extension SDLC&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/ai-tools-gaps.png" alt="AI Coding Tools aren't designed for Browser Extension SDLC" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;As we've started applying AI coding tools like Claude and Cursor to the problem
of browser extensions, we found three main gaps in how those tools treat the
software development lifecycle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Distributed System Architecture:&lt;/strong&gt; Browser extensions are actually
distributed systems, even though at first glance they might look like
applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slow Iteration Loops + Web Store Review:&lt;/strong&gt; Because of the web store
structure and how extensions are distributed, they have slower iteration
loops than many tools designed for web applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Host Site Changes and Hostility:&lt;/strong&gt; Extensions often need to work in
the context of host sites that change or might be outwardly hostile to
your extension.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These challenges are surmountable. You just have to think through how to best
handle them and how to best apply AI coding tools.&lt;/p&gt;
&lt;h2&gt;Browser Extensions Are Distributed Systems in a Box&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/distributed-systems.png" alt="Browser Extensions are distributed systems in a box" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;For people who aren't familiar with how browser extensions work under the hood,
I like to describe them as a distributed system in a box.&lt;/p&gt;
&lt;p&gt;A browser has multiple different tabs, each tab has multiple different frames,
and your browser extension is injecting content scripts onto each of those. But
then you also have surface areas like the side panel, as well as things working
behind the scenes — storage, the service worker, offscreen documents. A lot of
different pieces are talking to each other.&lt;/p&gt;
&lt;p&gt;You run into the usual suspects of distributed systems problems: everything is
async, you're doing message passing with serialized payloads, and you hit race
conditions. But in some ways, it's worse than a normal distributed system. Some
of these components have very complex lifecycles — tab pre-rendering,
backward/forward cache, worker recycling. It's a different animal even compared
to normal distributed systems.&lt;/p&gt;
&lt;h2&gt;Best Practice #1: Choose the Right Base Foundation&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/best-practice-1.png" alt="Best Practice #1: choose the right base foundation" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;The first best practice is choosing the right base foundation. I don't believe
most people should have to worry about the distributed systems issues I showed
on the last slide. You want to choose a foundation where you can be the most
productive.&lt;/p&gt;
&lt;p&gt;In our case, we started at the &lt;strong&gt;library&lt;/strong&gt; layer — we use different libraries to
smooth over quirks in the browser extension APIs for better ergonomics. But if
you're building an extension for a single, common use case, you might consider
using a &lt;strong&gt;framework&lt;/strong&gt; like WXT, Plasmo, or CRXJS to build it quickly. If you
don't want to worry about CI/CD or preview builds, you might use a &lt;strong&gt;platform&lt;/strong&gt;
like Plasmo or Shipper that handles builds automatically or even submits to the
Chrome Web Store on your behalf.&lt;/p&gt;
&lt;p&gt;On the other side, if you're building on top of extensions, the question is
whether you want to be in the &lt;strong&gt;userscript&lt;/strong&gt; world with Greasemonkey or
Tampermonkey, or build on a &lt;strong&gt;low-code platform&lt;/strong&gt; like PixieBrix that gives you
higher abstractions for integrations, compliance, and component libraries.&lt;/p&gt;
&lt;h2&gt;Best Practice #2: Maximize the &amp;quot;Boring&amp;quot; Part of the App&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/best-practice-2.png" alt="Best Practice #2: maximize the boring part of the app" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;Once you've chosen your foundation, the name of the game is maximizing the
boring part of the application. Browser extensions can be built with standard
frameworks like React, Angular, or Vue. What you want to do is create a big
area of those boring applications, and then encapsulate the extension-specific
code — the code that uses extension APIs, the messaging bus, etc.&lt;/p&gt;
&lt;p&gt;Use the standard isolation tactics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dependency Injection:&lt;/strong&gt; Separate extension-specific code from standard
application logic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explicit &amp;gt; Implicit:&lt;/strong&gt; When using AI, it's always better to be explicit
than implicit. This helps the AI have better local context for how a
particular piece of code is working.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforce via Linters:&lt;/strong&gt; Enforce these boundaries using linters or other
tools to give instantaneous feedback.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Best Practice #3: Create Fast Feedback Loops&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/best-practice-3.png" alt="Best Practice #3: create fast feedback loops" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;Creating fast feedback loops is critical in the browser extension world. From
fastest to slowest:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Static Analysis: TypeScript + Linters&lt;/strong&gt; — Use TypeScript with type
definitions for the different browsers. We use tagged types for strings to
differentiate values. We also use lint rules extensively and use AI to create
custom lint rules. Whenever a bug comes in, we ask ourselves: was this a
preventable bug, could we have caught it earlier? Then we write a lint rule for
it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Headless Tests&lt;/strong&gt; — Take advantage of dependency injection, use mocks and
fakes like jest-webextension-mock and messaging fakes to do integration tests
in a realistic way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Boring Component + App UI/UX Tests&lt;/strong&gt; — Use Storybook and standard Playwright
MCP for the vanilla application components.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E2E Extension Tests&lt;/strong&gt; — Cross-browser tests via Playwright MCP. These take
longer, especially across multiple browser types and versions. We also test
against Canary. Some things that Playwright can't test, we use browser-use
tools like Reinforced QA.&lt;/p&gt;
&lt;p&gt;Always shift left — catch things earlier rather than relying on slower feedback
loops.&lt;/p&gt;
&lt;h2&gt;Best Practice #4: Create Test Pages for Host Page Quirks&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/best-practice-4.png" alt="Best Practice #4: create test pages for host page quirks" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;Extensions often modify a host page. It's not a good idea to run your automated
tests or do your QA against those host pages all the time because it's slow,
flaky, and in some cases they'll catch your robotic behavior. So we create test
pages for the different patterns we come across.&lt;/p&gt;
&lt;p&gt;Common quirks include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Host Style Conflicts:&lt;/strong&gt; Even with Shadow DOM, some styles can leak
through. We have a page with very extreme styles so we can see which ones
come through to our extension.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forms + Rich Text Editors:&lt;/strong&gt; These have their own interaction models
that extensions need to handle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single Page Application navigation events:&lt;/strong&gt; SPAs don't trigger
standard page loads, which affects extension behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whenever you have a bug, create a test page for it. Then it's in your
repertoire of regression tests. Definitely use AI to generate those test pages.&lt;/p&gt;
&lt;h2&gt;Recap&lt;/h2&gt;
&lt;p&gt;To recap, set your AI coding tools up for success:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose the right foundation&lt;/li&gt;
&lt;li&gt;Maximize the boring part of the app&lt;/li&gt;
&lt;li&gt;Create fast feedback loops&lt;/li&gt;
&lt;li&gt;Create test pages for host page quirks&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That's going to give you stability and testing in your agentic loop.&lt;/p&gt;
&lt;h2&gt;Enterprise-Grade Is More Than Code&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/enterprise-grade.png" alt="Enterprise-Grade is more than code" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;Enterprise-grade is more than just code. You can generate all the code in the
world, but if you don't have the right enterprise IT documentation, the right
trust center, the right audits in place, you're not going to get traction in
the enterprise — especially with browser extensions. Go do those things and
definitely leverage AI for those non-code activities.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://toddschiller.com/assets/images/ai-coding-summit/pixiebrix-platform.png" alt="PixieBrix is the enterprise-grade platform for end-user AI Coding" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
&lt;p&gt;As you're thinking about which foundation you want to build on, take a look at
&lt;a href="https://www.pixiebrix.com"&gt;PixieBrix&lt;/a&gt;. We are the only enterprise-grade
platform enabling end-user AI coding. Start for free and check out our workshop
to get hands-on experience building with the PixieBrix platform.&lt;/p&gt;
</content><category term="Browser Extensions"></category><category term="browser extensions"></category><category term="AI"></category><category term="speaking"></category><category term="transcript"></category></entry><entry><title>Speaking at AI Coding Summit 2026: making AI coding work for enterprise-grade browser extensions</title><link href="https://toddschiller.com/blog/ai-coding-summit-2026.html" rel="alternate"></link><published>2026-02-25T00:00:00-05:00</published><updated>2026-02-25T00:00:00-05:00</updated><author><name>Todd Schiller</name></author><id>tag:toddschiller.com,2026-02-25:/blog/ai-coding-summit-2026.html</id><summary type="html">&lt;p&gt;I'll be speaking at the
&lt;a href="https://aicodingsummit.com/"&gt;AI Coding Summit&lt;/a&gt; on February 26, 2026.&lt;/p&gt;
&lt;p&gt;My talk, &lt;strong&gt;Making AI Coding Work for Enterprise-Grade Browser Extensions&lt;/strong&gt;,
covers the unique challenges of applying AI coding workflows to browser
extension development.&lt;/p&gt;
&lt;p&gt;Mainstream &amp;quot;vibe coding&amp;quot; workflows weren't designed for browser extensions.
Extensions have distributed architectures spanning tabs …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'll be speaking at the
&lt;a href="https://aicodingsummit.com/"&gt;AI Coding Summit&lt;/a&gt; on February 26, 2026.&lt;/p&gt;
&lt;p&gt;My talk, &lt;strong&gt;Making AI Coding Work for Enterprise-Grade Browser Extensions&lt;/strong&gt;,
covers the unique challenges of applying AI coding workflows to browser
extension development.&lt;/p&gt;
&lt;p&gt;Mainstream &amp;quot;vibe coding&amp;quot; workflows weren't designed for browser extensions.
Extensions have distributed architectures spanning tabs, background workers,
and popups; Chrome Web Store forbids remote code; and slow review cycles all
break the fast feedback loops that make AI coding productive.&lt;/p&gt;
&lt;p&gt;In the talk, I'll cover the browser customization landscape from bookmarklets
and user scripts to low-code mod platforms and AI browsers. I'll also share
practical techniques for adapting AI coding workflows to extension development
based on experience shipping extensions in enterprises around the globe.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gitnation.com/contents/making-ai-coding-work-for-enterprise-grade-browser-extensions"&gt;Watch the talk on GitNation&lt;/a&gt;,
or read the &lt;a href="{filename}ai-coding-browser-extensions.md"&gt;full transcript&lt;/a&gt;.&lt;/p&gt;
</content><category term="Browser Extensions"></category><category term="browser extensions"></category><category term="AI"></category><category term="speaking"></category></entry></feed>