Skip to content
extension/start

Changelog

What has shipped in the kit, milestone by milestone.

RSS

Setup automation and QA fixes

Getting from clone to configured backend is now mostly automated:

  • API-driven Stripe setup: webhook endpoints and seeded products/prices are created through the Stripe API instead of dashboard clicking.
  • Backend doctor: one command that checks your Firebase/Stripe configuration and tells you exactly what’s missing.
  • QA-driven fixes: Account/Settings tabs now appear only for signed-in users, the sign-in spinner behaves, the highlighter got more robust on dynamic pages, and trial CTAs read correctly.
  • Standalone-deploy fixes, including renaming the deploy script so pnpm’s builtin no longer shadows it.

Content-script toolkit, e2e suite, and security hardening

Milestone 2 made the kit provable:

  • Content-script toolkit: the mountShadowUi helper (rem→px conversion, pinned base font, host-proof theming, in-shadow portals), SPA-navigation handling, debounced DOM observation, and a schema-enforced page-world bridge, demonstrated by the highlighter demo that persists highlights across reloads.
  • Playwright e2e suite: 12 specs driving the real built extension, including killing the service worker mid-flow, flipping entitlements live, and asserting the shadow UI on a deliberately hostile page.
  • Security hardening: a zero-remote-code audit of the built output in CI, a documented rationale for every manifest permission, and a supply-chain policy.
  • Observability: consent-gated error reporting to the kit’s own backend; no third-party error SDK.
  • Firefox: MV2 build with chrome-only APIs feature-guarded and web-ext lint in CI.
  • Plus the broadcasts banner (remote-data kill switch), the first-run welcome tour, and an accessibility pass across surfaces.

Stripe billing and the gate engine

The monetization layer landed end to end:

  • Stripe billing core on Cloud Functions: checkout, customer portal, and a webhook pipeline that is the only writer of entitlements: clients render state, the server decides it.
  • Client billing hooks: useEntitlement("paid"), credits, and a billing-states matrix backed by a storage snapshot the background maintains.
  • Gate engine: usage/time/feature triggers, an evaluator with cooldowns, escalation and chaining, the value-first preset, and one wall UI rendered identically in popup, sidepanel, options, and content scripts.
  • Server-side gate counters: events flush to the backend keyed by uid, because client-only counters can be wiped or forged.
  • Test depth: Firestore security-rules suite in the emulator, a Stripe test-clock lifecycle suite, and adapter contract tests.

Milestone 1: monorepo foundation

The first milestone turned a working single-app extension into the kit’s real architecture:

  • Restructured into a pnpm + Turborepo monorepo: the WXT extension app, framework-free core packages, and shared tooling config, with AGENTS.md as the single source of agent instructions.
  • Design system: one token file (neutral/accent/success/warning/danger scales, radius convention, bundled Inter variable font) with the stock Tailwind palette disabled and lint-banned, plus the @extensionstart/ui primitive kit (Button, Card, Input, Badge, Skeleton, Dialog, Toast).
  • MV3 lifecycle primitives in core-ext: storage-backed stores, defineAlarm, defineInit, defineMigrations, and a typed messaging protocol shared by every surface.
  • Auth strategy layer in core-auth: Google sign-in via chrome.identity.launchWebAuthFlow with the offscreen signInWithPopup fallback, plus email/password flows.
  • Vitest unit layer and a CI matrix that lints, typechecks, tests, and builds Chrome and Firefox zips on every commit.