ExtensionStart makes opinionated choices so you do not have to. Each one
is replaceable, but together they are a stack that ships to the stores
today and stays maintainable after launch.
| Technology | Role | Why |
|---|
| WXT | Extension framework | Generates per-browser MV3 manifests from one config, HMR dev builds, store-ready zips. The most actively maintained extension framework. |
| React 19 | UI | Popup, side panel, and content-script UI share one component model and one hooks layer. |
| Tailwind CSS 4 | Styling | Material 3 color roles (bg-background, text-foreground, bg-brand, and the rest) that flip with the theme, drawn from one of six palettes. Stock Tailwind colors are off and lint-banned, so every surface stays consistent. |
| TypeScript (strict) | Everywhere | any is a lint error. The typed messaging protocol makes background/UI contracts compile-time safe. |
The backend is a choice, made once in the wizard: Firebase or
Supabase, same routes and the same security model on either
(Supabase guide).
| Technology | Role | Why |
|---|
| Firebase Auth or Supabase Auth | Sign-in | Strategies built for MV3 service workers: firebase/auth/web-extension with a web-auth-flow, or a Supabase client with PKCE that keeps its session in the extension’s IndexedDB. Guest-first linking on both. |
| Cloud Functions v2 or a Supabase Edge Function, + Hono | API | One router: checkout, webhooks, portal, usage. Free tiers cover development and early production. |
| Firestore or Postgres + RLS | Data | Entitlements and usage counters, with rules or row security that deny client writes to anything purchasable. |
| Stripe, Polar, or Paddle | Payments | One provider per deploy. Checkout, customer portal, webhooks. Polar and Paddle are merchants of record. Prices resolve by lookup key server-side; the client never sends an amount. |
| Technology | Role | Why |
|---|
| Astro | Website template (apps/site) | Landing page, help center, privacy policy, terms, changelog, and the welcome page. Static output, rebranded from one config file. |
| Technology | Role | Why |
|---|
| pnpm workspace | Monorepo | Fast installs; pnpm build and pnpm test run in every package. |
| Vitest | Unit tests | 190+ unit tests across the packages, the extension, and the backend. The repository checks run on node --test, the Supabase function’s on deno test. |
| Playwright | E2E | 21 test cases run against the real built extension in Chromium, including service-worker kill and revive. |
| GitHub Actions | CI and releases | Lint, typecheck, tests, and a remote-code audit on every push. A version tag packages the store zips into a GitHub Release and submits them after you approve. |
Want to swap something? The cores are framework-free and port-based, so
the seams are explicit. Start with the module system
to see what each part owns.