Skip to main content

Best Chrome Extension Boilerplates in 2026

·StarterPick Team
chrome-extensionplasmoboilerplatebrowser2026

Chrome Extensions: 3 Billion User Distribution Channel

Chrome extensions are underrated as a distribution channel. The Chrome Web Store reaches every Chrome user — 3 billion people. Extensions that solve a real problem can grow virally without ad spend.

In 2026, Manifest V3 (MV3) is the mandatory standard, having replaced MV2. The MV3 migration changed how extensions work — background scripts became service workers, webRequestBlocking became declarative. Boilerplates now abstract MV3's quirks.

Quick Comparison

StarterLanguageReactTypeScriptHot ReloadBuild ToolBest For
PlasmoTSParcelFull-featured React extensions
WXTTS/JSViteModern Vite-based extensions
CRXJSTS/JSViteVite extensions (manual setup)
chrome-extension-boilerplate-reactTSViteReact/Vite extension template

The Starters

Price: Free | Creator: Plasmo team

The most feature-complete Chrome extension framework. File-based routing for extension surfaces (popup, options, content scripts, background, newtab), automatic manifest generation, React/Vue/Svelte support, messaging system, storage API wrapper, and CSUI (Content Script UI) that renders React into any webpage.

pnpm create plasmo my-extension
# Choose: React + TypeScript

Plasmo file structure:

├── popup.tsx       # → Extension popup
├── options.tsx     # → Options page
├── newtab.tsx      # → New tab page
├── background.ts   # → Service worker
└── contents/
    ├── overlay.tsx # → Content script with React UI
    └── inline.tsx  # → Inline content script

Plasmo CSUI — Inject React into any page:

// contents/sidebar.tsx
import cssText from "data-text:./sidebar.css"
import type { PlasmoCSConfig } from "plasmo"

export const config: PlasmoCSConfig = {
  matches: ["https://github.com/*"],  // Only on GitHub
}

export const getStyle = () => {
  const style = document.createElement("style")
  style.textContent = cssText
  return style
}

export default function Sidebar() {
  return <div className="my-sidebar">Hello GitHub!</div>
}

Choose if: You want the most productive React extension development experience.

WXT — Best Vite-Based

Price: Free | Creator: Aaron Klinker

Vite-based alternative to Plasmo. First-class TypeScript, auto-imports, entrypoints for all extension surfaces, multi-browser support (Chrome, Firefox, Safari), and better tree-shaking than Plasmo.

npx wxt@latest init my-extension

Choose if: Vite's ecosystem is important (plugins, speed) or you need multi-browser support beyond Chrome.

Chrome Extension Architecture (MV3)

Understanding MV3's service worker model:

// background.ts — Service worker (not persistent!)
chrome.runtime.onInstalled.addListener(() => {
  console.log('Extension installed');
});

// Service workers can be terminated! Store state in storage, not memory
chrome.storage.local.set({ initialized: true });

// Message passing between popup and content scripts
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.type === 'GET_DATA') {
    fetchData().then(sendResponse);
    return true;  // Keep channel open for async response
  }
});
// popup.tsx — Communicates with background
const response = await chrome.runtime.sendMessage({ type: 'GET_DATA' });

Monetizing Chrome Extensions

Chrome extensions can be monetized via:

  1. Stripe subscription — Link to web app for billing; extension checks subscription status via API
  2. License keys — Simple, no web backend required; validate against a key server
  3. Chrome Web Store payments — Deprecated; Google removed it in 2020
  4. Freemium — Free features + paid features locked behind account/subscription

The standard pattern in 2026: extension checks localStorage or calls your API to verify active subscription before unlocking premium features.


Compare Chrome extension boilerplates on StarterPick.

Check out this boilerplate

View Plasmo on StarterPick →

Comments