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.
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.
The Recommended Stack
| 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.
Scaffold the project. Use
npm create vite@latest my-extension -- --template react-ts, install CRXJS Vite plugin, and create yourmanifest.json. CRXJS has a great getting started guide on their docs.Build the popup. Create a simple popup with your extension's core action. One button that does the main thing. Add Tailwind for styling.
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.
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.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.
- TypeScript version and stars: registry.npmjs.org/typescript, api.github.com/repos/microsoft/TypeScript, downloads api.npmjs.org typescript
- React version, stars, downloads: registry.npmjs.org/react, api.github.com/repos/facebook/react, api.npmjs.org react
- Svelte version, stars, downloads: registry.npmjs.org/svelte, api.github.com/repos/sveltejs/svelte, api.npmjs.org svelte
- Vite version, stars, downloads: registry.npmjs.org/vite, api.github.com/repos/vitejs/vite, api.npmjs.org vite
- CRXJS version, stars, downloads: registry.npmjs.org/@crxjs/vite-plugin, api.github.com/repos/crxjs/chrome-extension-tools, api.npmjs.org @crxjs/vite-plugin
- Tailwind CSS version, stars, downloads: registry.npmjs.org/tailwindcss, api.github.com/repos/tailwindlabs/tailwindcss, api.npmjs.org tailwindcss
- Vitest version, stars, downloads: registry.npmjs.org/vitest, api.github.com/repos/vitest-dev/vitest, api.npmjs.org vitest
- Zustand version, stars, downloads: registry.npmjs.org/zustand, api.github.com/repos/pmndrs/zustand, api.npmjs.org zustand
- Supabase stars, client version, free tier and Pro pricing: api.github.com/repos/supabase/supabase, registry.npmjs.org/@supabase/supabase-js, supabase.com/pricing
- Cloudflare Workers wrangler version, free and paid pricing: registry.npmjs.org/wrangler, Workers pricing
- Chrome Storage API quotas (QUOTA_BYTES, QUOTA_BYTES_PER_ITEM, MAX_ITEMS): developer.chrome.com storage reference
- Chrome Web Store $5 registration fee: developer.chrome.com webstore register
- Manifest V2 phase-out timeline: developer.chrome.com MV2 deprecation timeline
Like this? You'll like what I'm building too.
Two ways to support and get more of this work.
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 moreMY 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 WhopRelated Articles
AI Wrapper Stack Guide for Solo Developers
Complete guide to the AI wrapper stack - when to use it, setup, pros/cons, and alternatives.
Best Tech Stack for Building an AI Wrapper as a Solo Developer
The ideal tech stack for solo developers building an AI wrapper in 2026.
Best Tech Stack for an Analytics Dashboard as a Solo Developer
The best tech stack for building an analytics dashboard as a solo developer - frameworks, databases, hosting, and tools.