Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

For maintainers

Building, testing, and shipping Slopwatch.

Day-to-day

pnpm dev            # Chromium with hot reload
pnpm dev:firefox    # Firefox via web-ext
pnpm test           # Vitest (unit + integration + component)
pnpm e2e            # Playwright (Chromium, MockProvider)
pnpm lint
pnpm typecheck
pnpm build / pnpm build:firefox

Definition of done for any change: pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm build:firefox all pass. CI runs the same plus the Chromium E2E.

Architecture (where things live)

  • entrypoints/background (orchestrator), popup, options, and inpage (the unlisted script injected at click time for extraction + Shadow-DOM highlights).
  • lib/ — pure, tested logic: extraction (Readability + feeds + segmenter), analysis (prompt, schema, mapper, budgeter), providers, orchestrator, cache, diagnostics, storage, messaging.

The full design lives in the repo: TDD.md, ROADMAP.md, TESTING.md, USABILITY.md, and CLAUDE.md (invariants + conventions).

Releasing

The step-by-step runbook is RELEASING.md. In short: green CI → manual Firefox smoke → bump package.json + CHANGELOG.md → tag vX.Y.Z → push. The release.yml workflow builds the Firefox package + AMO sources archive and the Chromium package, attaches them to a GitHub Release, and submits to the stores when credentials are configured as secrets.

Hard invariants

Inert by default (activeTab only, no <all_urls>); never a bare verdict (score + label with a permanent Uncertain band + reasoning); no data leaves the device except to the chosen provider; keys session-default and write-only; provider responses validated; page text treated as hostile. These are enforced throughout and must not regress.