Local-first CLI for discovering and enriching local business leads using Google Places API (New), website audits, transparent opportunity scoring, contact extraction, intelligent dedupe, and HTML/CSV exports.
- Node.js 20 + TypeScript
- SQLite (file-based,
leadminer.sqlite) - HTTP via
undici - HTML parsing via
cheerio - Optional Playwright screenshots (
--screenshots)
- Install dependencies:
npm install- Configure environment variables:
export GOOGLE_MAPS_API_KEY="your_google_maps_key"
# Optional, only for --llm-pitches
export OPENAI_API_KEY="your_openai_key"- Build:
npm run build- Run:
npx leadminer run --lat 40.7128 --lng -74.0060 --radius-miles 20 --category dentist --enriched 100 --export-dir ./outleadminer run \
--lat 40.7128 \
--lng -74.0060 \
--radius-miles 20 \
--category dentist \
--enriched 100 \
--discover-target 160 \
--export-dir ./out \
--max-concurrency 6 \
--places-qps 5--radius-miles 20--enriched 100--discover-target 160--category dentist- center defaults to
40.7128,-74.0060
--screenshots: enable browser fallback + thumbnails--llm-pitches: generate two LLM pitch variants for top leads--top-pitches N: defaults to20--dry-run: uses cached Places data only (website fetches still run unless cached)--max-concurrency N: defaults to6--places-qps N: defaults to5
Dentist:
leadminer run --category dentist --export-dir ./out/dentistRealtor:
leadminer run --category realtor --export-dir ./out/realtorAuto repair:
leadminer run --category auto_repair --export-dir ./out/auto- Lower
--discover-targetto reduce Places detail calls. - Lower
--enrichedto reduce website audits/contact crawls. - Keep
--places-qpsmoderate to avoid bursty request patterns. - Use
--dry-runto iterate on export/audit logic from cached Places data. - Re-runs benefit from SQLite caches:
- Places responses (
places_raw) - Website-level audits/contacts (
website_cache) - Place+website audit cache (
leadstable keyed byplace_id+website_normalized)
- Places responses (
out/leads.csvout/report.htmlout/screenshots/*.jpg(only with--screenshots)
npm testUnit tests cover:
- website normalization
- realtor confidence/status
- opportunity scoring + tiers
- dedupe rules
- viewport/CTA fixture checks