/ tech-stacks / Best Tech Stack for Building a Chrome Extension as a Solo Developer
tech-stacks 11 min read

Best Tech Stack for Building a Chrome Extension as a Solo Developer

The ideal tech stack for solo developers building a Chrome extension in 2026.

Hero image for Best Tech Stack for Building a Chrome Extension as a Solo Developer

Chrome extensions are weird. They look like web development, and they mostly are, but they have their own set of constraints that change which tools make sense. I've built three Chrome extensions, and the stack I settled on after the third one is dramatically different from what I started with.

My first extension was vanilla JavaScript with no build step. It worked, but managing 15 files without imports or TypeScript was chaos. My second used a full React setup with webpack, which was overkill for a popup that showed three buttons. The third one hit the sweet spot. Here's what I'd use now.

Layer Tool Current version Why
Language TypeScript 6.0.3 Type safety catches bugs before they hit users
Popup/Options UI React or Svelte React 19.2.6 / Svelte 5.56.0 Component-based, familiar tooling
Bundler Vite + CRXJS Vite 8.0.14 / @crxjs/vite-plugin 2.4.0 Hot reload for extensions, fast builds
Styling Tailwind CSS 4.3.0 Utility classes, works in content scripts too
Storage Chrome Storage API built into Chrome Syncs across devices, no backend needed
Backend (if needed) Supabase or Cloudflare Workers supabase-js 2.106.2 / wrangler 4.95.0 Only when you need accounts or server-side logic
Testing Vitest 4.1.7 Fast, works with TypeScript out of the box

Every version above is the latest published release as of 30 May 2026 (sources at the end). The headline reason this stack works is maturity. TypeScript pulls roughly 197.6 million npm downloads a week, React 129.3 million, Tailwind 106.9 million, and Vite 122.6 million. None of these are experiments. The two extension-specific pieces, CRXJS and the Chrome Storage API, sit on top of that mainstream base, so almost everything you learn transfers straight to ordinary web work.

Why This Stack Works for Solo Developers

The biggest challenge with Chrome extension development is the development experience. Without proper tooling, you make a change, rebuild, go to chrome://extensions, click reload, open your extension, and test. That cycle is painful.

CRXJS (the Vite plugin for Chrome extensions) fixes this completely. It gives you hot module replacement for your popup, options page, and even content scripts. Change a file, see the result immediately. No manual reloading. This alone saves hours per week during development.

The other thing that matters for solo developers is keeping the stack minimal. Chrome extensions have strict content security policies, limited access to web APIs in certain contexts, and multiple execution environments (popup, background worker, content script, options page). Each extra tool is another thing that might break in one of those environments.

Popup/Options UI: React or Svelte

Your extension popup and options page are just web pages. Use whatever frontend framework you're comfortable with. React (v19.2.6, about 245,300 GitHub stars and 129.3 million npm downloads a week) works great if that's your daily driver, and the sheer size of that ecosystem means every component library and tutorial you might want already exists. Svelte (v5.56.0, about 86,700 stars and 4.67 million weekly downloads) is my personal preference for extensions because the bundle size is smaller and there's no virtual DOM overhead, which matters when your popup needs to open instantly. Svelte is the smaller community of the two, so the trade is fewer ready-made parts in exchange for a leaner output bundle.

The popup has a hard constraint that most developers don't realize initially. It closes the moment the user clicks outside of it. This means you can't do async operations that take more than a second or two without the user seeing the popup disappear. Long-running operations should happen in the background service worker, with the popup just displaying results.

For the options page, you have more freedom. It opens in a full browser tab, so it can be as complex as you want. I've built options pages with tabbed layouts, import/export functionality, and real-time previews. Treat it like a mini web app.

Bundler: Vite + CRXJS

This is the combination that changed Chrome extension development for me. Before CRXJS, I used webpack with a custom configuration that I copy-pasted between projects and barely understood. CRXJS reads your manifest.json and automatically configures Vite to build all the entry points (popup, background, content scripts, options page) with the right settings.

Worth knowing about the size difference between these two. Vite itself is a giant (v8.0.14, about 80,900 GitHub stars, 122.6 million npm downloads a week) and underpins a huge slice of modern frontend tooling. CRXJS (@crxjs/vite-plugin, v2.4.0) is a much smaller niche project at roughly 4,100 stars and 221,700 weekly downloads, which is expected for a tool aimed only at extension authors. The practical upshot is that Vite is rock solid and CRXJS is the maintained but smaller bridge layer, so pin the plugin version and read its release notes before upgrading.

The hot reload is the killer feature. In content script development, you traditionally had to reload the extension AND refresh the page to see changes. With CRXJS, the content script updates live. This makes iterating on content scripts (which modify other websites) much faster.

One gotcha. CRXJS works with Manifest V3, which is the current standard. If you find old tutorials using Manifest V2, ignore them. The phase-out is finished, not pending. Google began disabling MV2 extensions on the stable channel in October 2024, set them to disabled-by-default on 31 March 2025, and removed the re-enable option entirely by late July 2025. The Chrome Web Store stopped accepting MV2 submissions well before that. Any tutorial that mentions background.scripts is from the old world.

Storage: Chrome Storage API

Most Chrome extensions don't need a backend database. Chrome's Storage API gives you two main options. chrome.storage.local stays on the device, with a QUOTA_BYTES cap of 10485760 bytes (10 MB), and chrome.storage.sync syncs across the user's Chrome instances, with a QUOTA_BYTES cap of 102400 bytes (100 KB). The sync area has two extra limits that bite in practice. QUOTA_BYTES_PER_ITEM is 8192 bytes (8 KB), so a single big object can fail to write even when your total is well under 100 KB, and MAX_ITEMS is 512. There is also a chrome.storage.session area, in-memory and cleared on browser restart, with the same 10 MB cap as local.

For user preferences, feature toggles, and small datasets, chrome.storage.sync is perfect. Your users sign into Chrome on their laptop and their desktop, and the extension settings are the same on both. This is genuinely one of Chrome's best features for extension developers. Just remember the 8 KB per-item ceiling and split large blobs across keys or push them to local.

For larger data (cached content, history, logs), use chrome.storage.local. The 10 MB limit is generous enough for almost any extension that doesn't store media files, and you can lift it entirely with the unlimitedStorage permission if you really need to.

I'd only add a backend (Supabase, Firebase, or Cloudflare Workers) if you need user accounts, cross-browser sync beyond Chrome, or server-side processing. For a v1 extension, try to stay client-side only. Every backend you add is infrastructure you maintain.

If you do reach for one, both of my defaults have free tiers that comfortably cover a launch. Supabase (about 103,200 GitHub stars, @supabase/supabase-js at v2.106.2) gives you a free project with a 500 MB database, 50,000 monthly active users, 1 GB file storage, and 5 GB egress, with the Pro plan starting from $25 per month. Note that free Supabase projects pause after a week of inactivity, which is fine for a side project but something to watch. Cloudflare Workers (deployed via wrangler, currently v4.95.0) has a free plan of 100,000 requests per day, and the Workers Paid plan starts at $5 per month for 10 million requests plus $0.30 per additional million. Check current pricing before you commit, since both vendors revise tiers regularly.

Content Scripts: The Tricky Part

Content scripts run on web pages and are the most error-prone part of any Chrome extension. They execute in an isolated world but share the DOM with the page. This means your CSS might conflict with the page's CSS, and vice versa.

Use Shadow DOM for any UI you inject into pages. This isolates your styles completely. Without Shadow DOM, your Tailwind classes might affect the page, or the page's styles might break your injected elements. Tailwind (v4.3.0, about 95,200 GitHub stars and 106.9 million npm downloads a week) is the styling layer I reach for here, but its reset and utility classes will leak both ways without isolation. I spent an embarrassing amount of time debugging why my extension's button looked different on every website before learning about Shadow DOM isolation.

For communicating between content scripts and the background service worker, use chrome.runtime.sendMessage(). Keep messages small and serializable. Don't try to pass DOM elements or complex objects between contexts.

What I'd Skip

Webpack. Vite with CRXJS is simpler, faster, and has better DX. There's no reason to use webpack for a new Chrome extension in 2026 unless you have a very unusual requirement.

A full backend for v1. Resist the urge to add user accounts, analytics, and a server right away. Ship the extension with client-side storage, get users, and add server features when you have a real reason to.

Manifest V2 tutorials. If a tutorial mentions background.scripts or browser_action, it's V2 and outdated. Look for tutorials that reference background.service_worker and action.

Complex state management. For a Chrome extension, Zustand (v5.0.14, about 58,100 GitHub stars and 36.0 million npm downloads a week) or even React's built-in useState/useContext is plenty. You don't need Redux for a popup with three buttons and an options page. Zustand's appeal here is its tiny footprint, which matters when your popup has to open instantly.

End-to-end testing frameworks. Unit test your business logic with Vitest (v4.1.7, about 16,600 GitHub stars and 59.3 million npm downloads a week). Manually test the extension in Chrome. Automated E2E testing for Chrome extensions is possible with Puppeteer, but the setup cost isn't worth it until your extension is complex and has paying users.

Getting Started

Here's what I'd do this afternoon.

  1. Scaffold the project. Use npm create vite@latest my-extension -- --template react-ts, install CRXJS Vite plugin, and create your manifest.json. CRXJS has a great getting started guide on their docs.

  2. Build the popup. Create a simple popup with your extension's core action. One button that does the main thing. Add Tailwind for styling.

  3. Add a content script. If your extension interacts with web pages, create a content script that modifies a specific site. Start with just one site and expand later.

  4. Load and test. Run npm run dev, load the extension in Chrome developer mode (pointing to the output directory), and verify everything works with hot reload.

  5. Publish. Create a Chrome Web Store developer account, which costs a one-time $5 registration fee, then take screenshots, write a description, and submit. Review typically takes a few days.

Chrome extensions have a massive distribution advantage through the Web Store. The stack I've outlined gets you from idea to published extension as fast as possible while keeping the codebase maintainable as your extension grows. Start simple. Ship fast. Add complexity only when users ask for it.

Sources

Version numbers are the latest published release and download counts are for the week of 22 to 28 May 2026. All links checked on 30 May 2026.

Built by Kevin

Like this? You'll like what I'm building too.

Two ways to support and get more of this work.

Desktop App

HEARTH

A privacy-first Life OS for your desktop. Journal, tasks, and notes that stay on your machine. Coming soon, direct download from this site.

Read more
Digital Products

MY TOOLKITS

Receipts-first toolkits for shipping after hours, building Claude agents, publishing on Amazon, and more. The exact methods I used, not theory.

Browse on Whop

Need This Built?

Kevin builds products solo, from first version to live. If you want something like this made, work with him.