Two workspaces:
apps/
├── extension/ # Chrome MV3 extension (TypeScript + Vite)
└── site/ # moat.builtbylane.com — static, no build step
pnpm installNode 22 (.nvmrc), pnpm 9 (packageManager).
pnpm build— build every workspace that has abuildscript.pnpm test— run the extension's Playwright e2e suite.pnpm type-check— type-check the extension.pnpm lint/pnpm lint:fix— Biome across the whole repo.pnpm --filter moat dev— start the extension's Vite dev server (HMR).
- Extension —
pnpm --filter moat buildproducesapps/extension/dist/, which is what you upload to the Chrome Web Store (or load unpacked inchrome://extensions/for local testing). - Site —
apps/site/is a static directory. Cloudflare Pages deploys it directly: no build command, output directoryapps/site.
.github/workflows/ci.yml installs pnpm + Playwright on every PR and push to production, then runs lint → type-check → build → e2e.