| name | data-broker-removal |
| description | Scaffolds and manages a full-stack data broker removal application. Use when building an Incogni-like service with automated opt-out workers, a user dashboard, and a REST API. Supports project initialization, broker catalog management, and Playwright worker generation. |
| compatibility | Requires Node.js 20+, Docker, and Playwright. |
Data Broker Removal Skill
Scaffolds a monorepo with three packages:
packages/api — Fastify REST API + PostgreSQL
packages/worker — Playwright automation workers + BullMQ job queue
packages/dashboard — Next.js user dashboard
packages/shared — TypeScript types and database schema
Commands
/skill:data-broker-removal init <project-name>
Scaffolds a new project in ./<project-name>/.
./scripts/init.sh <project-name>
Sets up:
- Root
package.json with pnpm workspaces + Turborepo
docker-compose.yml (PostgreSQL 16 + Redis 7)
- Each package with dependencies, TypeScript config, and starter code
- Database migration schema
- A sample broker catalog with 5 entries
/skill:data-broker-removal add-broker
Interactive prompt (or pass JSON) to append a broker to the catalog.
./scripts/add-broker.sh
./scripts/add-broker.sh '{"name":"Spokeo","domain":"spokeo.com","method":"form","optOutUrl":"https://www.spokeo.com/opt_out","requiredFields":["fullName","email","address"],"selectors":{"name":"[data-testid=optout-name]","email":"[data-testid=optout-email]","submit":"[data-testid=optout-submit]"},"verificationType":"email_link","region":["US"],"category":"people-search"}'
/skill:data-broker-removal generate-worker <broker-id>
Generates a Playwright worker script for a specific broker using its catalog entry.
./scripts/generate-worker.sh <broker-id>
Outputs packages/worker/src/brokers/<broker-id>.ts.
Project Structure After Init
<project-name>/
├── docker-compose.yml
├── turbo.json
├── package.json
├── packages/
│ ├── shared/
│ │ └── src/
│ │ ├── schema.sql
│ │ ├── types.ts
│ │ └── broker-catalog.json
│ ├── api/
│ │ └── src/
│ │ ├── server.ts
│ │ ├── db.ts
│ │ ├── routes/
│ │ │ ├── users.ts
│ │ │ ├── brokers.ts
│ │ │ └── requests.ts
│ │ └── jobs/
│ │ └── scheduler.ts
│ ├── worker/
│ │ └── src/
│ │ ├── worker.ts
│ │ ├── scheduler.ts
│ │ ├── browser-pool.ts
│ │ └── brokers/
│ │ └── index.ts
│ └── dashboard/
│ └── src/
│ ├── app/ # Next.js App Router — note `src/app/` prefix
│ │ ├── page.tsx
│ │ ├── layout.tsx
│ │ └── dashboard/
│ │ └── page.tsx
│ └── lib/
│ └── api.ts
Running the Project
cd <project-name>
pnpm infra:up
pnpm db:migrate
cd packages/api && pnpm dev
cd packages/worker && pnpm dev
cd packages/dashboard && pnpm dev
Design Decisions
- Monorepo: Separate concerns; workers crash independently from API.
- BullMQ over Redis: Retry with backoff, concurrency controls, dead-letter queues.
- Playwright in Docker: One container per job to isolate sessions, cookies, and fingerprints.
- PostgreSQL: ACID for request state; JSONB for broker configs.
- Next.js: Familiar, Incogni uses it.