How to Build a Chrome Extension as a Solo Developer
Step-by-step guide to building a Chrome extension by yourself. Tech stack, timeline, costs, and practical advice.
What You're Building
A Chrome extension is a small program that runs inside the browser and modifies or enhances the browsing experience. Think ad blockers, password managers, productivity tools, or AI-powered assistants that sit in your toolbar. It's one of the best solo developer projects because distribution is built in through the Chrome Web Store, and the barrier to entry is surprisingly low.
I built my first Chrome extension in a weekend. It was a simple tool that modified a website I used daily, and it taught me that extensions are basically just web development with some extra APIs.
Difficulty & Timeline
| Aspect | Detail |
|---|---|
| Difficulty | Easy to Medium |
| Time to MVP | 1-3 weeks |
| Ongoing Maintenance | Low |
| Monetization | Freemium, one-time purchase, or subscription |
Recommended Tech Stack
For the extension itself, use vanilla JavaScript or TypeScript. If you need a popup UI or options page, React or Svelte with a bundler like Vite works great. Vite is at version 8.0.14 and pulls roughly 122.6 million npm downloads a week as of late May 2026, so the tooling and community support are about as solid as web tooling gets. If you want Vite to handle the manifest, content scripts, and hot reload for you, the @crxjs/vite-plugin (version 2.4.0) is purpose-built for Manifest V3 extensions. For the backend (if you need one), a simple API on Railway or Vercel handles user accounts and premium features.
Chrome's Manifest V3 is the only standard worth learning now. Manifest V2 is fully retired. Chrome 138 was the last version that could run MV2 extensions, and starting with Chrome 139 the support was removed entirely for all users, including the enterprise policy that previously kept it alive. The Chrome Web Store stopped accepting new public MV2 extensions back in January 2022, so there is no path left for V2.
Step-by-Step Plan
Phase 1: Foundation (Week 1)
Start with the Chrome extension boilerplate. Create your manifest.json, a basic popup, and a content script that does ONE thing. The Chrome Extensions documentation is actually quite good, so follow their getting started guide.
Load it as an unpacked extension in Chrome's developer mode. Get the core functionality working on your local machine before you think about anything else. I spent my first day just understanding how content scripts, background workers, and popups communicate with each other. Once that clicks, everything else is straightforward.
Phase 2: Core Features (Week 2)
Build out the main value proposition. If your extension modifies web pages, get the content script logic solid. If it's a productivity tool, nail the popup UI. If it needs to talk to an API, set up the backend and handle authentication.
Test on at least 5 different websites if your extension interacts with page content. I've been burned by extensions that worked perfectly on one site but broke on others because of different DOM structures or Content Security Policies.
Phase 3: Polish & Launch (Week 3)
Create promotional images for the Chrome Web Store listing. The mandatory pieces are a 128x128 store icon, at least one screenshot at 1280x800 (640x400 is also accepted), and one 440x280 small promotional tile. If you want a shot at being featured in the store's marquee, you also need a 1400x560 marquee image, but that one is optional. Write a clear description that explains what the extension does in the first sentence. Set up a simple landing page.
Before you can publish anything, you have to register as a Chrome Web Store developer and pay a one-time $5 registration fee. That single payment covers your account, and you can publish up to 20 items under it, so there is no per-extension charge.
Submit to the Chrome Web Store. Official guidance says most extensions are reviewed within a few days, though it can stretch to a few weeks, and if your item sits in review past three weeks you should contact developer support. Reviews run slower for brand-new developer accounts and for extensions that request broad host permissions like <all_urls> or sensitive permissions like tabs, cookies, or webRequest. Keep your permissions tight and the wait stays short. While you wait, create a Firefox version (it's usually minimal changes with the WebExtensions API).
Monetization Strategy
Chrome extensions have several proven monetization models. The most common one for solo developers is freemium. Give away the core functionality for free and charge for premium features.
A one-time purchase of $5-15 works well for utility extensions. Subscriptions of $3-9/month work for extensions that provide ongoing value (like AI features that cost you API tokens). Use Stripe for payments and store license keys in your backend.
One approach I've seen work really well is offering a generous free tier that gets people hooked, then charging for power-user features. A thousand free users who tell their friends about your extension are worth more than fifty paid users who keep quiet.
Common Mistakes to Avoid
Requesting too many permissions. Users see a scary permissions dialog and bounce. Only request what you absolutely need. If your extension reads page content on specific sites, use host permissions for those sites only, not "all websites."
Ignoring Chrome Web Store SEO. Your listing title, description, and category matter. People search the store just like they search Google. Include relevant keywords naturally.
Not handling updates gracefully. Chrome auto-updates extensions, and if your update breaks something, users uninstall fast. Always test updates thoroughly before publishing.
Building a backend you don't need. Many extensions work entirely client-side. If you can store data in Chrome's local storage or sync storage, do that instead of building a server. Just know the ceilings before you commit. chrome.storage.sync gives you about 100 KB total (102,400 bytes), with a cap of 8,192 bytes per item and 512 items max, which is plenty for settings and preferences that follow the user across machines. chrome.storage.local gives you 10 MB total, which covers cached data and larger local state. If your data fits inside those numbers, you do not need a server at all. Less infrastructure means less maintenance.
Common Errors and Fixes
These are the snags that trip up almost everyone on their first Manifest V3 extension. All of them trace back to behavior documented in Chrome's official extension reference.
"Refused to execute inline script" in the console. Manifest V3 enforces a strict Content Security Policy that blocks inline JavaScript. You cannot put onclick handlers in HTML or <script> blocks with code inside them. Move all logic into separate .js files and attach event listeners with addEventListener instead. This catches people coming from older tutorials that used MV2 patterns.
Background code stops running after a while. In Manifest V3 the background page is a service worker, not a persistent page, so Chrome shuts it down when it goes idle and restarts it on the next event. Anything you stored in a plain in-memory variable is gone after that restart. Persist state with chrome.storage instead of module-level variables, and register your event listeners at the top level of the worker so they re-bind when the worker wakes up.
Service worker registration failed (Status code 15). This usually means a syntax error in your service worker or an import it cannot resolve. MV3 service workers run as modules only if you set "type": "module" in the background field of the manifest, otherwise import statements throw. Check the manifest entry and watch the "Errors" button on the extension card in chrome://extensions.
Manifest version 2 is no longer supported. If you load an old project and Chrome refuses it, the manifest still declares "manifest_version": 2. Chrome 139 and later removed MV2 support entirely. Set "manifest_version": 3 and migrate the affected APIs (most notably browserAction becomes action, and chrome.tabs.executeScript becomes chrome.scripting.executeScript).
Permissions warning scares users at install. Broad patterns like <all_urls> in host_permissions trigger the "Read and change all your data on all websites" warning and also slow your store review. Scope host permissions to the exact domains you touch, and prefer the activeTab permission when you only need access to the page the user clicked on.
Is This Worth Building?
Absolutely. Chrome extensions have low development costs, built-in distribution through the Chrome Web Store, and can reach millions of users. Some of the most successful solo developer products are Chrome extensions. Detailed SEO Extension, Momentum, GoFullPage. These are small teams or individuals making serious revenue from browser extensions.
The market is also less competitive than web apps. While there are millions of SaaS products, there are far fewer quality Chrome extensions in most niches. Find a specific workflow that people do in their browser, make it faster or better, and you've got a viable product.
The one risk is platform dependency. Chrome can change their extension policies or APIs, and you're at their mercy. But that's true of any platform play, and the Chrome Web Store isn't going anywhere.
Sources
All figures verified on 2026-05-30.
- Manifest V2 support timeline, Chrome for Developers (Chrome 138 last to support MV2, Chrome 139 removes it, store stopped accepting new MV2 in January 2022)
- Register your developer account, Chrome for Developers (one-time registration fee to publish)
- Chrome Web Store developer registration fee 2026, Extension Radar ($5 one-time fee, up to 20 items per account)
- Supplying images, Chrome for Developers (128x128 icon, 1280x800 or 640x400 screenshots, 440x280 small tile, 1400x560 marquee)
- Chrome Web Store review process, Chrome for Developers (most reviews within a few days, up to a few weeks, contact support after three weeks, broad permissions slow review)
- chrome.storage API reference, Chrome for Developers (sync 102,400 bytes total, 8,192 bytes per item, 512 items max; local 10 MB total)
- vite on npm registry (version 8.0.14)
- vite weekly downloads, npm API (about 122.6 million downloads in the last week)
- @crxjs/vite-plugin on npm registry (version 2.4.0)
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
Treating Video As Code With Remotion And fal
How I turned a script into a finished video with code instead of a timeline app, and why determinism is the real win for a solo dev.
Build Versus Buy For A Custom AI Feature
How to decide between an off-the-shelf AI tool and a custom AI feature, weighing control, cost, differentiation, and data with a clear framework.
Can One Developer Build Your Whole MVP
An honest look at whether a single full-stack developer can ship your whole MVP, when it works beautifully, and when you should bring in more people.