- Open
chrome://extensions, enable Developer mode. - Load unpacked → select this folder (
fairline-seo/). - Pin the extension, browse any page, click the icon → Audit → Run audit.
Core audit is free forever, no account, zero network calls. The promise list in
promise.md is append-only and mirrored exactly in the popup Promise tab.
A feature can be added, never removed. QA must verify every promise item before each release.
- User clicks Export → sees one-time $9.99 prompt (not a subscription upsell).
- Stripe Checkout (backend) → payment → backend creates row in
licensestable → key emailed. - User enters key in popup Export tab or Options page →
verifyLicense(key)POSTs to backend → on valid, caches{licenseKey, licenseVerifiedAt}inchrome.storage.local. - Re-verify every 30 days when online. Offline: cached verification grants grace (exports keep working ≥30 days without network).
- If backend reports
revoked: true(refund), extension clears the key and reverts to free tier with a message — core audit keeps working.
licenses(key TEXT PK, email TEXT, stripe_payment_id TEXT, issued_at TEXT, revoked BOOL)
verifyLicense(key) in lib/license.js:
VERIFY_URLconfig placeholder (empty string = dev-only local format check) — set to the real endpoint, e.g.POST https://api.fairline-seo.com/v1/licenses/verify {key}→{valid, revoked, email}.- Current fallback accepts
FL-XXXX-XXXXformat locally for dev; set the real API URL before release. - Multi-device: the same key works on a user's own devices (not device-locked); the backend logs device count per key for abuse monitoring only.
- Refund/revoke: backend marks
revoked=true; extension re-checks every 30 days when online and reverts to free tier with a message.
{ licenseKey, licenseVerifiedAt, auditHistory: [last 20 {url, auditedAt, summary}] }
activeTab, storage only. Content script on <all_urls> (reads viewed page only, nothing transmitted). No background worker, no alarms.