Candela — Product & Document Catalogue
A catalogue search system for lighting distributors. It ingests BMEcat 2005 / ETIM product data together with the manufacturer's PDF documents and builds a single SQLite database with full-text search on top, served through a small web interface.
In production
Candela was written for ENDA, a lighting distributor in Turkey, and runs there as the internal catalogue for the TRILUX range they represent. That installation is the reason the project exists — every feature was built against a real feed and real daily use, not designed speculatively.
On the 5th of each month it picks up TRILUX's new price list by itself: downloading it through the manufacturer portal, rebuilding the database and relinking the catalogues without anyone touching the server.
That instance is private — it holds a licensed dealer price list — so the public demo below is the same code running on a fully fictional dataset.
- Streaming ETL — the multi-gigabyte XML is parsed with
iterparse, holding one product in memory at a time, so memory use stays flat regardless of file size. - Search that fits the domain — exact matching on article number / EAN plus prefix full-text search over descriptions and series, via two FTS5 external-content indexes with diacritic folding.
- Searches inside the PDFs — documents are indexed page by page and returned as highlighted excerpts, with catalogue-to-product links that open a brochure at the right page.
- Multi-brand and bilingual — a new brand is added by dropping a directory in, with no code changes; German and English product text are both stored behind an EN/DE switch.
- Deployed, not just written — ships as Docker Compose; the app binds to localhost only and a reverse proxy terminates TLS in front of it. The monthly refresh signs into the manufacturer portal with Playwright, and accounts use per-person roles with scrypt-hashed passwords.
The demo runs on an invented brand with generated documents — no manufacturer's real data. Sign-in details are in the README.