<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Todd Schiller - AI</title><link href="https://toddschiller.com/" rel="alternate"></link><link href="https://toddschiller.com/feeds/tag/ai.atom.xml" rel="self"></link><id>https://toddschiller.com/</id><updated>2026-06-03T00:00:00-04:00</updated><subtitle>Human ✘ Artificial Intelligence</subtitle><entry><title>agent-browser-shield June 3 update: 14 new rules and the Chrome Web Store listing</title><link href="https://toddschiller.com/blog/agent-browser-shield-june-03-update.html" rel="alternate"></link><published>2026-06-03T00:00:00-04:00</published><updated>2026-06-03T00:00:00-04:00</updated><author><name>Todd Schiller</name></author><id>tag:toddschiller.com,2026-06-03:/blog/agent-browser-shield-june-03-update.html</id><summary type="html">14 new rules shipped in agent-browser-shield, now installable from the Chrome Web Store, and using it for daily driving.</summary><content type="html">&lt;p&gt;Two days after the alpha announcement, agent-browser-shield has a Chrome Web
Store listing and 14 new protection rules.&lt;/p&gt;
&lt;h2&gt;Install from the Chrome Web Store&lt;/h2&gt;
&lt;p&gt;The extension is live at
&lt;a href="https://chromewebstore.google.com/detail/agent-browser-shield/gnejacdioaelglahihpagpfjpddpnamd"&gt;chromewebstore.google.com/detail/agent-browser-shield&lt;/a&gt;.
One click instead of unpacked-from-source. The prebuilt ZIP and source-build
paths stay for Browserbase and other runtimes that need an unpacked
extension.&lt;/p&gt;
&lt;h2&gt;New rules: handling prompt injection and context pollution in invisible surfaces&lt;/h2&gt;
&lt;p&gt;A browser-use agent reads surfaces a sighted user never looks at. The new
rules close them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; blocks (never rendered with JS on, but agents walk them)&lt;/li&gt;
&lt;li&gt;Poisoned &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; description and &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; (the compact &amp;quot;what is this
page&amp;quot; answer many agents pull first)&lt;/li&gt;
&lt;li&gt;JSON-LD &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; blocks (cited as the &amp;quot;trusted summary&amp;quot; of a page)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aria-label&lt;/code&gt;, &lt;code&gt;alt&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;placeholder&lt;/code&gt;, and SVG &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;desc&amp;gt;&lt;/code&gt;
/ &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt; (a11y-tree carriers)&lt;/li&gt;
&lt;li&gt;Unicode tag characters, bidi overrides, and zero-width payloads&lt;/li&gt;
&lt;li&gt;Long base64 / hex / percent-encoded blobs (the &amp;quot;decode this and follow
it&amp;quot; pattern)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;New rules: trust laundering&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;link-spoof-annotate&lt;/code&gt; flags Cyrillic homoglyphs and anchors whose visible
text doesn't match the href apex. &lt;code&gt;disguised-ad-flag&lt;/code&gt; collapses native
advertorials (Sponsored / Paid Post) that share DOM shape with editorial.
&lt;code&gt;trust-badge-annotate&lt;/code&gt; and &lt;code&gt;schema-trust-sanitize&lt;/code&gt; ship off by default
while we assess their false-positive rates.&lt;/p&gt;
&lt;h2&gt;The daily-driver surprise&lt;/h2&gt;
&lt;p&gt;I've started running it on my own daily-driver browser, not just agent runs.
There have been some funny quirks (e.g., flagging GitHub issue links with &amp;quot;.md&amp;quot;
in the link text as suspicious and hiding the GitHub issue template modal).
However, overall it's been a positive on my browsing experience. So, we'll be
experimenting with making more annotations visible to humans and
multi-modal LLMs.&lt;/p&gt;
&lt;p&gt;⭐ &lt;a href="https://github.com/pixiebrix/agent-browser-shield"&gt;https://github.com/pixiebrix/agent-browser-shield&lt;/a&gt;&lt;/p&gt;
</content><category term="AI"></category><category term="AI"></category><category term="agents"></category><category term="browser security"></category><category term="prompt injection"></category><category term="dark patterns"></category><category term="PixieBrix"></category></entry><entry><title>Introducing agent-browser-shield (alpha): keeping AI agents safe in the browser</title><link href="https://toddschiller.com/blog/agent-browser-shield-alpha.html" rel="alternate"></link><published>2026-06-01T00:00:00-04:00</published><updated>2026-06-01T00:00:00-04:00</updated><author><name>Todd Schiller</name></author><id>tag:toddschiller.com,2026-06-01:/blog/agent-browser-shield-alpha.html</id><summary type="html">Announcing the alpha of agent-browser-shield — a source-available defense layer (also available as an OpenClaw skill) that blocks prompt injection and dark patterns before they reach your agent.</summary><content type="html">&lt;p&gt;There are 6 billion internet users. With AI agents, we're quickly heading to
60 to 600 billion &amp;quot;users&amp;quot; of the web.&lt;/p&gt;
&lt;p&gt;How do we keep all those agents safe when they touch the browser?&lt;/p&gt;
&lt;p&gt;At PixieBrix, we've spent years protecting BPO contact centers from insider
risk, fraud, and social engineering in the browser.&lt;/p&gt;
&lt;p&gt;Today, we're applying that defense to AI agents and making a free,
source-available, browser extension available (on GitHub and ClawHub).&lt;/p&gt;
&lt;p&gt;Your AI agent that lands on a fresh page is one prompt injection away from
leaking credentials, one dark pattern away from buying the wrong thing, and
one fake review away from a bad recommendation.&lt;/p&gt;
&lt;p&gt;Agent Browser Shield sits between the browser and the agent. It blocks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompt injection: visible or hidden instructions in page content&lt;/li&gt;
&lt;li&gt;Dark patterns: manipulative UI designed to trick/coerce&lt;/li&gt;
&lt;li&gt;Context pollution: low-value context that impairs instruction following&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A useful side effect: stripping irrelevant content also cuts token burn.&lt;/p&gt;
&lt;p&gt;Come join us on our mission. File issues, send PRs, or just tell me what you
hate/love!&lt;/p&gt;
&lt;p&gt;The threat surface for agentic browsing is evolving fast. Let's defend our AI
assistants together!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⭐ Star the GitHub repo: &lt;a href="https://github.com/pixiebrix/agent-browser-shield"&gt;https://github.com/pixiebrix/agent-browser-shield&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🦞 Star the OpenClaw skill: &lt;a href="https://clawhub.ai/pixiebrix/agent-browser-shield"&gt;https://clawhub.ai/pixiebrix/agent-browser-shield&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="/assets/images/agent-browser-shield-alpha/demo.webp" alt="Side-by-side demo: an unprotected agent vs. one shielded by agent-browser-shield" loading="lazy" decoding="async" /&gt;&lt;/p&gt;
</content><category term="AI"></category><category term="AI"></category><category term="agents"></category><category term="browser security"></category><category term="prompt injection"></category><category term="PixieBrix"></category><category term="OpenClaw"></category></entry><entry><title>Letting OpenClaw loose on Boston's open data</title><link href="https://toddschiller.com/blog/openclaw-boston-open-data.html" rel="alternate"></link><published>2026-05-30T00:00:00-04:00</published><updated>2026-05-30T00:00:00-04:00</updated><author><name>Todd Schiller</name></author><id>tag:toddschiller.com,2026-05-30:/blog/openclaw-boston-open-data.html</id><summary type="html">At the Boston OpenClaw 2026 hackathon, I let an agent autonomously connect to the city's open-data MCP server, devise its own corruption-signal queries on contract data, and package the workflow as a reusable Claude skill.</summary><content type="html">&lt;p&gt;Today was
the &lt;a href="https://partiful.com/e/eBd91pZJpdTRp8V3FJFJ"&gt;Boston OpenClaw Hackathon&lt;/a&gt;,
which had a theme of using the &lt;a href="https://data.boston.gov/"&gt;Boston open data hub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For my project, I wanted to see how far OpenClaw could get on its own in
analyzing the data (with Claude Sonnet 4.6 as a backing model).&lt;/p&gt;
&lt;p&gt;First, I had OpenClaw connect itself to the MCP server, starting from the press
release about the launch of
the &lt;a href="https://data.boston.gov/showcase/opencontext-democratizing-the-city-of-boston-s-open-data-currently-in-beta"&gt;MCP server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once connected, I asked it to analyze contracts for signs of corruption. It was
able to come up with its own approach for signals and queries. For example:
&amp;quot;Departments Using the Most Limited Competition&amp;quot;, &amp;quot;Top Vendors by Limited
Competition Value&amp;quot;, and &amp;quot;Bid Threshold Clustering (near $10K)&amp;quot;.&lt;/p&gt;
&lt;!-- markdownlint-disable MD013 --&gt;
&lt;img loading="lazy" decoding="async" src="https://toddschiller.com/assets/openclaw-boston-open-data/boston-limited-competition-table.png" alt="OpenClaw output: a table of Boston departments ranked by share of limited-competition contracts (FY2019–FY2026 Q3, departments with 10+ contracts). Law Department 95.1% (155 of 163), Labor Relations 87.2%, Mandatory Appropriations 83.3%, Assessing Department 74.4%, Budget Management 66.7%, Snow &amp; Winter Management 55.2%."&gt;
&lt;!-- markdownlint-enable MD013 --&gt;
&lt;p&gt;After flagging companies, I had it analyze those companies' connections to city
officials.&lt;/p&gt;
&lt;p&gt;There were some interesting nuggets! For example, Capitol Waste Services was
flagged as high
risk for having $285M in historic contracts, of which $136M were awarded with
limited competition.&lt;/p&gt;
&lt;p&gt;The connection research flagged a 2015 fine of $120,000 by the Office of
Campaign and Political Financing (OCPF)
&lt;a href="https://valleypatriot.com/capitol-waste-services-fined-120k-for-illegal-secret-donations-to-candidates/"&gt;for illegal campaign donations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From there, I had OpenClaw create and package a skill for flagging corruption
signals. The skill encodes the queries and data analysis scripts it developed.
That skill is available here:
&lt;a href="https://toddschiller.com/assets/openclaw-boston-open-data/boston-contract-corruption.skill"&gt;boston-contract-corruption.skill&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some other interesting questions OpenClaw was able to answer from the data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which restaurants are the worst health code offenders but haven't been shut
down yet?&lt;/li&gt;
&lt;li&gt;Which roads/intersections are the worst for biking, based on pothole reports
and accidents?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, it was a fun experiment to see how AI agents might impact civic tech. A
big thanks to the hackathon organizers, everyone who demoed, and the city of
Boston for making this data available!&lt;/p&gt;
</content><category term="AI"></category><category term="civic tech"></category><category term="open data"></category><category term="AI"></category><category term="hackathon"></category><category term="Boston"></category></entry><entry><title>Did Google sneak a local LLM model into Chrome?</title><link href="https://toddschiller.com/blog/chrome-local-ai-linkedin-filter.html" rel="alternate"></link><published>2026-05-26T00:00:00-04:00</published><updated>2026-05-26T00:00:00-04:00</updated><author><name>Todd Schiller</name></author><id>tag:toddschiller.com,2026-05-26:/blog/chrome-local-ai-linkedin-filter.html</id><summary type="html">A response to FUD around Chrome's new Local AI models, plus a demo using PixieBrix + Local AI to filter my LinkedIn feed.</summary><content type="html">&lt;p&gt;There's a lot of FUD around Chrome's new Local AI models. Jason Calacanis on the
All-in Podcast got it wrong: Chrome didn't sneak in a local LLM model; it was in
their official Early Preview Program for months.&lt;/p&gt;
&lt;p&gt;The local LLM shipped in 148 is their general Prompt API powered by Gemini Nano.
Smaller, task-specific models for language detection, translation, and rewriting
have been available since Chrome 138 (June 2025), a long time at AI pace!&lt;/p&gt;
&lt;p&gt;Local LLMs distributed with the browser are critical to a future where users
control their browsing experience while ensuring privacy. Consumers cannot be
expected to figure out how to connect their web tools and extensions to Ollama
or LM Studio. And enterprises cannot be expected to deploy local LLM servers to
desktops.&lt;/p&gt;
&lt;p&gt;There are still valid concerns about model lock-in. That's because AI models (
especially small models) can behave differently for the same prompt. But, from
what I've seen, the Chrome team has been, by and large, responsible in how
they've rolled out the technology. For example, the public API shipped in 148
does not expose model-specific parameters.&lt;/p&gt;
&lt;p&gt;Local LLMs enable a range of productivity/compliance use cases, especially for
regulated industries handling financial and health data. But since this is
LinkedIn, here's a fun one instead: using PixieBrix + Local AI to customize your
LinkedIn feed and hide self-promotional, snarky, or sarcastic posts. The
question is -- will anything be left on my feed? 😆&lt;/p&gt;
&lt;!-- markdownlint-disable MD013 --&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0;"&gt;
  &lt;iframe src="https://www.loom.com/embed/8a1082b28512434588447b05b32594e1?hideEmbedTopBar=true" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD013 --&gt;
</content><category term="Browser Extensions"></category><category term="AI"></category><category term="Chrome"></category><category term="browser extensions"></category><category term="PixieBrix"></category><category term="local AI"></category></entry><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><entry><title>The agentic opportunity: value, not hours</title><link href="https://toddschiller.com/blog/agentic-value-not-hours.html" rel="alternate"></link><published>2025-10-26T00:00:00-04:00</published><updated>2025-10-26T00:00:00-04:00</updated><author><name>Todd Schiller</name></author><id>tag:toddschiller.com,2025-10-26:/blog/agentic-value-not-hours.html</id><summary type="html">Focusing on hours (or FTEs) misses the point of the agentic opportunity.</summary><content type="html">&lt;p&gt;A fundamental mistake people make when assessing the agentic opportunity is a
focus on hours (or FTEs) instead of value.&lt;/p&gt;
&lt;p&gt;It's indisputable that agentic automation will reshape the number of human
hours for processes like order-to-cash and compliance.&lt;/p&gt;
&lt;p&gt;However, it fails to address what drives enterprise value (vs. COGS).
Defensible enterprise value comes from empowering your people to be their best.&lt;/p&gt;
&lt;p&gt;At PixieBrix, we're focused on helping companies create customer success and
loyalty to win.&lt;/p&gt;
&lt;!-- markdownlint-disable MD013 --&gt;
&lt;figure&gt;
  &lt;img loading="lazy" decoding="async" src="https://toddschiller.com/assets/images/agentic-value-not-hours/hours-vs-value.png" alt="Stacked bar chart comparing % Hours to % Value across Agentic Copilot, Agentic Automation, and RPA. Agentic Copilot is 20% of hours but 60% of value (strategy, customer success, customer loyalty, brand experience, intellectual property, talent). Agentic Automation is 40% of hours and contributes to the 60% value bucket. RPA is 40% of hours but only 30% (fulfillment, order to cash) and 10% (compliance) of value."&gt;
  &lt;figcaption&gt;Where agentic work creates value isn't always where it saves the most hours.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;!-- markdownlint-enable MD013 --&gt;
</content><category term="AI"></category><category term="AI"></category><category term="agentic"></category><category term="PixieBrix"></category><category term="enterprise"></category></entry></feed>