- 5-step
- Guided enrichment wizard
- 4
- Export formats (JSON / CSV / TSV / JSONL)
- Licensed
- Shipped as a signed Windows app
Tech stack
- Python
- Flask
- React
- Playwright
- Scrapling
- Google Maps
- SMTP
- PyInstaller
Problem
Sales and operations teams need enriched contact data — emails, phones, social links — pulled from thousands of company URLs, plus a reliable way to backfill the many records that are missing a website in the first place. Doing this by hand does not scale, and off-the-shelf tools don't push cleanly back into an existing CMS.
Approach
I built a Flask + Playwright + Scrapling backend with a React frontend. It pulls from a headless CMS or a pasted URL list, extracts emails / phones / social links with language detection and retryable crawling, and includes a Google-Maps website finder that runs before enrichment to populate missing sites. SMTP verification filters dead emails, a visual filter builder composes CMS queries without writing JSON, and results export to JSON / CSV / TSV / JSONL over a REST API or push back into the CMS. The whole suite is packaged for commercial distribution as a licensed Windows app with a signed, per-client licensing system.
Results
A real product delivered to clients — end-to-end from crawl to verified, exportable data. The step-by-step wizard (source → connect → fields → enrichment → export) makes it usable by non-developers, the visual filter builder replaces hand-written queries, and the licensing layer made per-client distribution safe.
Notable engineering
- Dual sources — pull from a headless CMS (Directus) collection or a pasted URL list.
- Extracts emails, phones and social links with language detection and retryable crawling.
- Google-Maps website finder (pre-enrichment) backfills missing company websites via Scrapling's stealth fetcher.
- SMTP email verification and a visual, drag-and-drop filter builder for CMS queries.
- Packaged for commercial distribution as a licensed Windows app with a keypair-based per-client licensing system (allow / revoke).
Screenshots & diagrams
Real UI captures and figures — source is private and client brands are not shown.
Deep dive
The suite is intentionally split into a pre-enrichment stage and an enrichment stage. Many source records lack a website at all, so the Google-Maps finder resolves a business listing to its real site first; only then does the enrichment pipeline crawl, extract, verify, and export. Each stage supports stop / resume and live progress, which matters when a run spans thousands of URLs.
On the extraction side, the contact extractor handles emails, phones, and social profiles with language detection and retry logic, while SMTP verification prunes undeliverable addresses before they ever reach an export. Delivering it as a signed, licensed Windows executable — built with PyInstaller and gated by a keypair licensing system — is what turned an internal tool into a distributable commercial product.