2c8ae5f62806ae5408f957031627a81bea0b6c42
Parallel scraping with Puppeteer blocks the Node.js event loop, preventing SSE events from flushing. Sequential processing means each store completes, sends its event, and the client sees it before the next store starts. Also sorts stores so cheerio-based (fast) stores run first, giving the user results sooner while Puppeteer stores load. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Price Hunter
A self-hosted price comparison engine. Search across multiple online stores simultaneously, compare prices, and find the cheapest option — all from a single, clean interface.
Features
- Unified search — One search bar, all your stores, results sorted by price
- Store management — Add stores with CSS selector configs, organize by category
- Store testing — Per-store test pages to verify scraping before going live
- Categories & groups — Filter searches by category or custom store groups
- Scrape health — Monitor success rates, response times, and error logs per store
- Self-hosted — All data stays local. No ads, no tracking, no external dependencies.
Quick Start
Development
npm install
cd src/client && npm install && cd ../..
npm run dev
Open http://localhost:5173 (frontend) — API runs on http://localhost:3000.
Docker
docker compose up
Open http://localhost:3000.
Tech Stack
- Backend: Node.js, Fastify, sql.js (SQLite)
- Frontend: SvelteKit, Tailwind CSS
- Scraping: Cheerio (CSS selectors)
- Deployment: Docker
Adding a Store
- Go to Stores > Add Store
- Fill in the store name, base URL, and search URL (use
{query}as the search term placeholder) - Define CSS selectors for: product container, name, price, link, and optionally image
- Save and use the Test page to verify results
- Enable the store to include it in searches
License
MIT
Description
Languages
Svelte
50.7%
TypeScript
45.8%
CSS
1.6%
JavaScript
1%
Dockerfile
0.6%
Other
0.3%