Concise phase-by-phase plan to v1 on the Chrome Web Store. Mirrors the detailed planning doc the team uses internally; update this when a phase ships.
- Archived dead Python detectors and over-claimed CLIP docs to
archive/. - Rewrote
README.md, addedARCHITECTURE.md,ROADMAP.md,CHANGELOG.md,AGENTS.md. - Repo root is empty of source code, ready for the Vite project in Phase 1.
Goal: Vite + CRXJS + TypeScript + React + Tailwind project at the repo root that loads as an unpacked extension and reproduces the v0.1 click-to-scan flow without ML (mock results only). CI green.
npm init+ Vite +@crxjs/vite-plugin+ React + TypeScript + Tailwind.manifest.config.tswith the minimum-viable permission set (no<all_urls>).- Port v0.1 popup/options/content/background to TS + React.
- Add
offscreen.html+ offscreen TS entry (no model wired in yet). - GitHub Actions: typecheck + ESLint + Vitest + Vite build on every PR.
- A loadable
dist/that surfaces a "MOCK" badge on visible images.
Goal: Browser-side ONNX inference replaces mock; works on auth-gated images that v0.1 couldn't reach.
Detailed step-by-step is in IMPLEMENTATION.md §3. Don't restate decisions there.
- Default model:
Organika/sdxl-detectorat q8 — locked. Benchmark deferred to Phase 2.5. - Integrate
@huggingface/transformersin offscreen document. WebGPU with WASM fallback (device: 'auto'). - Pin to a specific model revision hash. GitHub Releases fallback via
scripts/mirror-model.sh. - Hybrid image fetch: canvas first; on
SecurityErrorfall back tofetch(src, {credentials:'include'})from the background SW. - IndexedDB cache keyed by
SHA-256(bytes) + modelId + provider. 7-day TTL. - Confidence threshold slider in Options. Default 0.55 for images. Below band → "Uncertain" badge.
- First-scan UX: progress bar in popup ("Loading detector — one-time, ~22 MB").
- Power-user
localImageModeloverride in Options.
Goal: Replace Organika/sdxl-detector with the best-performing model under 100 MB on a maintainer-curated test set. Run after Phase 2 ships and is in real use.
Detailed scaffold in IMPLEMENTATION.md §4.
- Maintainer curates ~30 known-AI + ~30 known-real images into
bench/fixtures/. - Agent runs
npm run benchagainst 3-4 candidates. - Output:
bench/results/YYYY-MM-DD.mdwith accuracy/F1/size table + recommendation. - Maintainer reviews; if approved, default model + revision SHA bumped, GH Releases mirror updated.
Goal: "Detect AI in selection" works for arbitrary text.
Detailed step-by-step in IMPLEMENTATION.md §5.
- Default model:
Hello-SimpleAI/chatgpt-detector-robertaat q8 (~32 MB). Document the known weakness on Claude/Gemini-generated text. - UX: right-click context menu + popup button on selected text. Toast only — no in-page highlights for v1.
- Min selection: 100 characters. Below → "Selection too short" toast.
- Default text threshold: 0.70 (more conservative than image's 0.55) — biases toward "Uncertain".
- Sliding-window aggregation for long passages: 512-token chunks with 64-token overlap, mean of per-chunk probabilities.
- Skip selections whose
activeElementis<input>or<textarea>.
Goal: Users with a Gemini/OpenAI/HF key get materially higher accuracy.
Detailed step-by-step in IMPLEMENTATION.md §6.
- Provider adapters under
src/detectors/{image,text}/{gemini,openai,hf}.ts. All implement sameClassificationResultshape. - LLM image classification uses structured JSON output (Gemini
responseSchema, OpenAIresponse_format: json_schema). HF uses real classifier endpoints. - Boost-mode failure → fall back to local with visible toast (locked default):
"Boost failed (rate limited) — using local model". - Client-side rate limiting: 10 RPM per provider, queue and trickle, settings override.
- Cache BYO results separately by provider in cache key.
- Options page: provider picker, masked key input, "Test" button, per-provider quota hint, fallback toggle, rate-limit input.
- Result UI tags the source:
Gemini · 94%vsLocal · 87%.
Goal: The product feels designed, not assembled.
- Refreshed badge / pill design. Light + dark theme aware. Accessible contrast.
- Popup main view: thumbnails of recent results, per-item "Why?" popover with raw scores, per-item "Mark wrong" feedback (stored locally for now).
- Right-click context menu items: "Analyze this image" (single-image mode), "Detect AI in selection".
- Keyboard shortcut:
Cmd/Ctrl+Shift+Ato scan visible images. - Light/dark theme detection.
Goal: Listing-ready.
- Privacy policy hosted on GitHub Pages.
- Single-purpose statement.
- Permission justifications.
- Promo art: 1280×800 hero, 440×280 small tile, 5 screenshots, optional 30-sec demo MP4.
- Store description (short + detailed).
Goal: One-command shipping. Real users can file issues.
- GitHub Action: tag-triggered build → zip → upload to Chrome Web Store via
chrome-webstore-upload-clias draft. npm version patch/minor/majorto bump.- Opt-in Sentry error reporting.
- Issue templates +
FEEDBACK.md.
These are intentionally deferred so v1 can ship in ~3–4 weeks:
- Hosted backend / our own inference API
- User accounts, auth, payments
- Anonymous telemetry (will revisit if real usage data becomes useful)
- A docs site (the archived Sphinx site is not coming back unless real users ask)
- Mobile / Firefox / Safari ports
- Provenance signals beyond the model (C2PA / EXIF / watermark detection)
- Local-model accuracy degrades over time as new generators ship. Plan to re-benchmark every ~3 months and bump the local model.
- Text detection has well-documented false-positive issues on non-native English writing and templated text. Default to "Uncertain" liberally.
- Boost-mode UX has a one-time friction cliff (find a key, paste it). Worth it for power users; we won't push it on casuals.