Browser Extension Starter

BeginnerBrowser Extension

Build cross-browser extensions with a modern UI framework and a storage backend.

Published 27 September 2026

Core Tools
WXT
WXT
TypeScript
TypeScript
Supabase
Supabase
Supabase Auth
Supabase Auth
Frontend Framework
React
Vue.js
Svelte

About Browser Extension Starter

The Browser Extension Starter combines WXT (the modern cross-browser extension framework), React for UI components, Tailwind CSS for styling, TypeScript for type safety, and Supabase for cloud storage and authentication, giving you a production-capable extension scaffold that works in Chrome, Firefox, and Edge from a single codebase.

WXT abstracts away the differences between Manifest V2 and V3 and provides hot module replacement during development, a significant quality-of-life improvement over raw extension development. React lets you build complex popup UIs and options pages with the same component patterns used in web apps. Supabase provides a hosted PostgreSQL database with a REST API, so your extension can sync user data across devices without building a custom backend.

TypeScript is essential in extension code because the browser extension API surface is large and error-prone, so static types catch mistakes in message passing, storage schema, and content script boundaries before they reach users. Supabase Auth handles user sign-in via OAuth providers so you can gate features behind accounts without running your own auth server. This stack is well-suited for productivity tools, content enhancers, and developer utilities that need persistent user data.

Key Features

  • ✓WXT framework for cross-browser compatibility (Chrome, Firefox, Edge) with a single codebase
  • ✓React-powered popup, options page, and side panel UIs
  • ✓Tailwind CSS utility classes for consistent, fast styling
  • ✓Supabase for cloud sync, so user data persists across devices and browser reinstalls
  • ✓Supabase Auth for OAuth sign-in without building a custom auth backend
  • ✓TypeScript throughout, catching message-passing and storage schema errors at compile time

When to Use Browser Extension Starter

  • →Productivity tools that save and sync user preferences to the cloud
  • →Content enhancers that annotate or transform web pages
  • →Developer utilities that inject tooling into specific sites
  • →Extensions that gate premium features behind user accounts

Pros

  • WXT eliminates the most tedious parts of extension development: manifest generation, HMR, cross-browser shims
  • React + Tailwind means you can reuse UI skills and component libraries from web development
  • Supabase removes the need for a custom backend, delivering full cloud sync in hours, not weeks

Cons

  • Supabase adds a third-party dependency, so it's not suitable for extensions that must work fully offline
  • Browser extension review processes (Chrome Web Store, Firefox Add-ons) add friction to shipping updates
  • Manifest V3 restrictions on background service workers break some long-running task patterns

Frontend Framework Options for Browser Extension Starter

React

Browser Extension Starter with React

WXT's most mature integration and the default most extension tutorials use for the popup, options page, and content-script UI. The largest ecosystem of the three if the extension needs specific React-only component libraries.

Vue.js

Browser Extension Starter with Vue.js

A lighter-weight alternative to React for an extension's UI surfaces, with a gentler learning curve and less boilerplate for the typically small popup/options-page component trees extensions ship.

Svelte

Browser Extension Starter with Svelte

Compiles to the smallest vanilla JavaScript output of the three, which matters directly for a browser extension: popup and content-script bundle size affects load time every time the user opens it, unlike a full web app's single page load.

These are highlighted picks. To see all the tools, check the JS Frontend Frameworks category.

Browser Extension Starter Add-ons

Each addition below extends this stack with a capability the base stack works fine without. None are required: include the ones your product actually needs when building this stack, and skip the rest.

CI/CD Add-ons

Add CI/CD when you want a dedicated pipeline for running tests, linting, or multi-stage builds before a deploy goes out. Many hosting platforms already redeploy automatically on every push on their own — a CI/CD tool adds the most value on top of that by gating the deploy on a passing test suite, and matters even more when the hosting choice does not auto-deploy at all, such as a self-hosted server.

GitHub Actions

Browser Extension Starter with GitHub Actions

Runs linting, tests, and a build step (`wxt zip`) on every push, directly from the same GitHub repo the code already lives in. Store submission (Chrome Web Store, Firefox Add-ons) still needs a manual or separately-scripted upload; GitHub Actions doesn't handle extension-store publishing itself.

GitLab CI/CD

Browser Extension Starter with GitLab CI/CD

GitLab's built-in CI/CD system, configured via .gitlab-ci.yml, the natural pick if the project's code lives on GitLab rather than GitHub, with the same "runs lint/tests/build, doesn't handle store submission" scope as the GitHub Actions option.

These are highlighted picks. To see all the tools, check the CI/CD Pipelines category.

Styling Add-ons

Add styling when you want a component or utility-class system to build the UI faster than hand-writing CSS from scratch.

Tailwind CSS

Browser Extension Starter with Tailwind CSS

A utility-class CSS framework: styles are composed directly in markup via class names instead of writing separate stylesheet files. The default styling choice bundled by most modern framework CLIs (create-next-app, create-vue, the SvelteKit and Astro starters all offer it), and the base layer shadcn/ui components are built on when that's loaded into the catalog in the future.

These are highlighted picks. To see all the tools, check the CSS Frameworks category.

Analytics Add-ons

Add analytics when you want to measure traffic, track visitor behavior, or understand how people actually use the product.

PostHog

Browser Extension Starter with PostHog

PostHog's JS client runs inside the extension's popup, options page, and background service worker for event tracking and feature flags, the same client used on web apps, since an extension's UI is just JavaScript running in a browser context.

These are highlighted picks. To see all the tools, check the Web & Product Analytics category.

Frequently Asked Questions about Browser Extension Starter

Which frontend framework should I use: React, Vue.js, or Svelte?

All three plug into WXT's build the same way, so the honest tradeoffs are ecosystem size and bundle weight rather than raw capability. React has the deepest ecosystem and the most extension tutorials to copy from, which matters if you're new to Manifest V3's message-passing patterns and want examples to reference. Vue.js trades some of that ecosystem for a gentler learning curve and less boilerplate, a fair swap for the small popup and options-page component trees most extensions actually ship. Svelte compiles away its framework at build time, so it produces the smallest bundle of the three, and bundle size matters more here than in a typical web app: a popup's script loads every time the user clicks the toolbar icon, not once per session. Pick React by default, Svelte if the extension is UI-light and load time is the priority, and Vue.js for React's component model without React's ecosystem weight.

Do I need Supabase, or can this extension work fully offline?

Supabase is only worth adding if the extension needs data to follow the user across devices or browser reinstalls, or needs real sign-in. A purely local extension, a note-taker, a productivity timer, a per-site settings tool, can skip it entirely and store its state with the browser's own storage.local or IndexedDB APIs, which work offline with no external dependency and no account requirement. What you give up by skipping Supabase is exactly what it adds: cross-device sync and any concept of a user account. If the extension might grow a sync feature later, it's fine to start on storage.local and add Supabase when that need becomes real; retrofitting cloud storage onto local-first code mainly means writing a sync layer, not restructuring the WXT or React parts of the codebase.

When does the Supabase free tier stop covering an extension with a growing user base?

Supabase's free tier caps out around 500 MB of database storage and 50,000 monthly active users, limits sized for typical web-app traffic rather than an extension's usage pattern. An extension with many users each storing a small amount of data, settings, bookmarks, short notes, tends to hit the storage ceiling well before the MAU one, since each user's footprint is tiny but the user count can climb fast once the extension shows up in a store's search results. The jump to Pro at $25/mo removes those caps and adds daily backups; see the Pricing section for the full breakdown. Watch database size specifically, not user count, as the leading indicator the free tier is running out.

Does Supabase Auth's OAuth sign-in work inside an extension's popup?

Not out of the box. Supabase Auth's default OAuth flow redirects the browser to a callback URL, but an extension's popup closes the moment the user clicks away to a provider's login screen, which kills the redirect before it finishes. The fix is to route the flow through the extension APIs built for this: chrome.identity.launchWebAuthFlow (or Firefox's equivalent) opens the OAuth screen in its own window, and you register the extension's chrome-extension callback URL as a valid redirect URI in the Supabase project's Auth settings. Once that's wired up, you exchange the returned token by calling supabase.auth.setSession() directly instead of letting the client library manage the browser redirect itself. It's a one-time setup cost specific to running Supabase Auth inside an extension context, not a limitation of Supabase Auth on its own.

Can I eject from WXT later if I need finer manifest control?

Yes. WXT compiles down to a standard Manifest V3 extension, plain manifest.json, background service worker, content scripts, popup HTML, so the output isn't locked into a proprietary format. If a feature genuinely needs manual manifest.json control WXT's config doesn't expose, you can inspect the built output in .output/ and hand-maintain a manifest from there, keeping the same React and TypeScript source files and swapping only the build step. Most projects never need this: WXT's config covers the manifest fields real extensions actually vary, permissions, content-script matches, icons, and ejecting means taking over cross-browser packaging and hot module replacement yourself. It's a real escape hatch, but a rarely-used one.

Scores

Popularity
2/5
Learning Curve
3/5
Flexibility
3/5
Performance
4/5
Portability
2/5

Tools in the Browser Extension Starter Stack

Frontend Frameworks

Programming Languages

Databases

Authentication

Frontend Framework (choose one)

Add-ons (optional — add any, or none)

CI/CD

Styling

Analytics

Browser Extension Starter Pricing

Free to start

WXT, React, Tailwind CSS and TypeScript are open-source and free. Supabase covers storage and auth on its free tier, moving to $25/mo (Pro) as usage grows. Publishing carries one-time store fees: $5 for the Chrome Web Store and $19 for Microsoft Edge, which sit outside the stack.

Core frameworksFree (open source)

WXT, React, Tailwind CSS and TypeScript are free.

Backend (Supabase)Free–$25/mo

Free tier for storage and auth; Pro is $25/mo as you scale.

Store feesNot included

The Chrome Web Store charges a one-time $5 and Microsoft Edge $19 to publish.