- Remove puppeteer dependency, use puppeteer-core instead (no bundled Chromium)
- Remove local launch fallback from browser-scraper
- Fail fast with clear error if CHROMIUM_WS is not set
- Simplify closeBrowser to disconnect only
Docker Chromium container is now required for JS-rendered stores.
Dev: docker compose -f docker-compose.dev.yml up -d
Prod: docker compose up (starts both app + chromium)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Switch puppeteer to puppeteer-extra with stealth plugin to
bypass Cloudflare bot detection
- Add Ronis.hr store config (JS-rendered, 48 products per page)
- Stealth mode patches navigator.webdriver, chrome runtime, and
other fingerprints that Cloudflare checks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add browser-scraper.ts using Puppeteer for JS-heavy stores
- Add render_js flag to store model, migration, YAML sync, and UI
- Scraper engine auto-selects cheerio vs Puppeteer based on flag
- Store forms include JS rendering toggle in Advanced section
- Create first store config: HG Spot (Croatian electronics retailer)
- Update Dockerfile with Chromium for production Puppeteer support
Tested: HG Spot returns 15 products per page with correct names,
prices (EUR), links, and images using headless browser rendering.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Stores can now be defined as YAML files in the stores/ directory.
On startup, YAML files are synced into the database. Changes made
via the admin UI are written back to YAML files automatically.
- Add store-sync service (load from files, export to files, write-back)
- Add /api/stores/sync and /api/stores/export endpoints
- Add Sync/Export buttons to admin UI
- Mount stores/ volume in Docker
- Include example store config template
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>