I built Search Crawler: A Reference Architecture using DDD and CQRS
Most DDD tutorials use a banking app or an e-commerce store as the example domain. Which is fine, but honestly… kind of boring. I wanted something with more moving parts — async jobs, queues, retri...

Source: DEV Community
Most DDD tutorials use a banking app or an e-commerce store as the example domain. Which is fine, but honestly… kind of boring. I wanted something with more moving parts — async jobs, queues, retries, anti-bot protection — so I built a full-stack Bing keyword scraper instead. The result is search-crawler: a NestJS + Next.js app where you upload a CSV of keywords, and it scrapes Bing search results for each one using Puppeteer, with a real-time dashboard to track progress. But the scraper itself isn't the point of this post. The point is how it's structured — and why I think a scraping system is actually a great domain for learning DDD, CQRS, and domain events. Let's dig in. Why a scraper is a great DDD domain A scraping system has a ton of natural domain complexity: A keyword isn't just a string — it has a lifecycle (queued → processing → completed/failed) Failures are domain concepts, not just exceptions (should we retry? how many times?) Multiple services need to react when a scrape