How to Build a Chrome Extension in 2026: A Complete Manifest V3 Guide
Patrick Bushe
April 3, 2026 · 5 min read
Building Chrome extensions is one of the most underrated skills a web developer can have in 2026. With over 3 billion Chrome users worldwide, even a niche extension can reach thousands of people overnight. I've shipped 19 extensions — from Modern Dark Mode to AutoBrowser — and I'm sharing everything I've learned.
Why Manifest V3 Changes Everything
Google's Manifest V3 (MV3) is now the only accepted format for new Chrome Web Store submissions. If you're still working with MV2, your extension won't pass review. The biggest changes are the shift from background pages to service workers, the replacement of webRequest blocking with declarativeNetRequest, and stricter content security policies. These changes improve performance and security, but they require rethinking how your extension works.
Setting Up Your Project
Every Chrome extension starts with a manifest.json file. This is where you declare permissions, define your service worker, and register content scripts. Keep your permissions minimal — requesting too many will trigger Chrome Web Store review flags and scare off users. A clean MV3 manifest looks surprisingly simple: just a name, version, manifest_version set to 3, and the specific APIs you actually need.
Service Workers vs Background Pages
The biggest mental shift in MV3 is understanding that service workers are ephemeral. They spin up when needed and terminate after about 30 seconds of inactivity. This means you can't store state in global variables anymore. Use chrome.storage.local or chrome.storage.session instead. I learned this the hard way when building Wayback Quick Access — the extension would lose its state after every idle period until I rewired it to persist everything.
Content Scripts Are Your Superpower
Content scripts run in the context of web pages and are how most extensions modify what users see. They can read and manipulate the DOM, inject CSS, and communicate with your service worker via chrome.runtime.sendMessage. When I built Search Cleaner, the entire extension is essentially one content script that identifies and removes sponsored results from Google search pages. Simple concept, massive user value.
The declarativeNetRequest API
If your extension needs to block or modify network requests — like Ghost Browser's fingerprint protection or Cookie Consent Auto-Reject's banner blocking — you'll need to use declarativeNetRequest instead of the old webRequest API. It's more performant because the rules are evaluated in the browser's native code, but it's also less flexible. Define your rules as static JSON files or update them dynamically with chrome.declarativeNetRequest.updateDynamicRules.
Testing and Debugging
Chrome's built-in developer tools are your best friend. Navigate to chrome://extensions, enable Developer Mode, and load your unpacked extension. Click "Inspect views: service worker" to debug your background logic. For content scripts, use the regular page DevTools console — just make sure you select your extension's context from the dropdown. I test every extension on at least 20 different websites before submitting to catch edge cases.
Publishing to the Chrome Web Store
The Chrome Web Store review process has gotten stricter in 2026. Here's what matters: write a clear, honest description with relevant keywords. Include at least 3 high-quality screenshots (1280x800 works best). Your privacy policy must accurately describe every piece of data your extension accesses. Keep your permissions minimal — every unnecessary permission adds review time and reduces install rates. Most of my extensions get approved within 24 to 48 hours.
Performance Matters More Than Features
Users will uninstall an extension the moment it slows down their browser. Profile your content scripts, minimize DOM operations, and use MutationObserver instead of polling. Modern Dark Mode processes thousands of CSS rules per page, but we keep it fast by batching DOM updates and using requestAnimationFrame. Your extension should feel invisible — the best compliment is when users forget it's even running.
Ship It, Then Iterate
Don't wait for perfection. Ship a focused v1 with one core feature that works flawlessly. Collect user feedback through reviews and support emails, then iterate. AutoBrowser started as a simple tab automation tool and grew into a full browser automation suite over 12 months of user-driven improvements. Your users will tell you what to build next — you just have to listen.
The Chrome extension ecosystem is wide open for developers who care about quality. Pick a real problem, solve it elegantly, and ship it. The barrier to entry is low, but the ceiling is incredibly high.