Skip to content
Get the kit

Tech stack

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.

TechnologyRoleWhy
WXTExtension frameworkGenerates per-browser MV3 manifests from one config, HMR dev builds, store-ready zips. The most actively maintained extension framework.
React 19UIPopup, side panel, and content-script UI share one component model and one hooks layer.
Tailwind CSS 4StylingMaterial 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)Everywhereany 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).

TechnologyRoleWhy
Firebase Auth or Supabase AuthSign-inStrategies 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, + HonoAPIOne router: checkout, webhooks, portal, usage. Free tiers cover development and early production.
Firestore or Postgres + RLSDataEntitlements and usage counters, with rules or row security that deny client writes to anything purchasable.
Stripe, Polar, or PaddlePaymentsOne 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.
TechnologyRoleWhy
AstroWebsite template (apps/site)Landing page, help center, privacy policy, terms, changelog, and the welcome page. Static output, rebranded from one config file.
TechnologyRoleWhy
pnpm workspaceMonorepoFast installs; pnpm build and pnpm test run in every package.
VitestUnit tests190+ unit tests across the packages, the extension, and the backend. The repository checks run on node --test, the Supabase function’s on deno test.
PlaywrightE2E21 test cases run against the real built extension in Chromium, including service-worker kill and revive.
GitHub ActionsCI and releasesLint, 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.