Authorized website security scanner MVP inspired by TinyFish-style web-agent workflows.
apps/web: Next.js dashboard and API routesapps/worker: background scanner workerpackages/core: shared scan types, rules, storage, and reporting logic
- Same-origin public website crawling
- Optional authenticated browser scanning with test credentials or imported session cookies
- Safe, non-destructive checks only
- Findings report with evidence and remediation guidance
- Per-user accounts with isolated scans, artifacts, and reports
- Filesystem-backed storage for local development
- Production-ready storage adapters for hosted Postgres and Vercel Blob
- Install dependencies:
npm.cmd install- Install the Playwright browser:
npx.cmd playwright install chromium- Copy
.env.exampleto.env.localin the repo root and fill in the values you want to use locally.
If you want the worker to use the same hosted Neon and Blob config as Vercel, run this from the repo root:
vercel env pull .env.local --environment=productionSurfaceIQ now loads the repo-root .env.local for both apps/web and apps/worker, so one local env file can drive the full stack.
- Start both the web app and worker together:
npm.cmd run dev- If you prefer, you can still run them separately:
npm.cmd run dev:webnpm.cmd run dev:worker- Open
http://localhost:3000
For a public Vercel showcase before the full backend migration, set:
SURFACEIQ_APP_SECRET=replace-with-a-long-random-secret
SURFACEIQ_SHOWCASE_MODE=1
NEXT_PUBLIC_SURFACEIQ_SHOWCASE_MODE=1This keeps the hosted demo polished and read-only while the global database, queue, artifact storage, and worker stack are migrated.
To let users create accounts and run scans from the hosted Vercel URL, configure:
SURFACEIQ_APP_SECRET=replace-with-a-long-random-secret
DATABASE_URL=postgres://username:password@host:5432/surfaceiq
BLOB_READ_WRITE_TOKEN=vercel_blob_rw_token
SURFACEIQ_SHOWCASE_MODE=0
NEXT_PUBLIC_SURFACEIQ_SHOWCASE_MODE=0Then:
- Set the same values on the Vercel project for
apps/web. - Set the same
DATABASE_URL,BLOB_READ_WRITE_TOKEN, andSURFACEIQ_APP_SECRETon the deployed worker service. - Start the worker against the shared production database so it can claim pending scans and upload artifacts.
SurfaceIQ now auto-selects:
- local file storage when
DATABASE_URLis missing - hosted Postgres for users, sessions, scans, findings, pages, and run steps when
DATABASE_URLis present - Vercel Blob for artifacts when
BLOB_READ_WRITE_TOKENis present
- Create an account or sign in.
- Start a scan in one of three modes:
Public scanLogin with credentialsImport session cookies
- Watch the run workspace as SurfaceIQ records steps, screenshots, and findings.
- Review the generated report summary, findings table, recommendations, best-practice observations, and per-run evidence.
- Local development still stores users, sessions, scan state, steps, and findings in
.data/db.json - Local development still writes HTML and screenshot artifacts under
.artifacts - Production mode writes structured data to Postgres and artifacts to Vercel Blob
- Target credentials and imported session cookies are encrypted before persistence using
SURFACEIQ_APP_SECRET - The MVP does not perform destructive exploit payloads or aggressive injection attempts