Productarchitectuur
Een transparant overzicht van de data-pipeline, scoring engine, zoekstack en redactionele workflows die Puurly aandrijven.
Systeemoverzicht
Open Food Facts API
Bron van producten + nutrients
Ingest worker
Normaliseert + dedupliceert
Scoring engine
0–100 per product
Postgres + Redis
Persistent + cache
Search index
Hybride keyword + vector
Data-pipeline
Pull
Cron pulls delta van Open Food Facts elke 6 uur.
Normalize
Eenheden, ingrediëntmapping, taaldetectie (NL eerst).
Score
Scoring engine berekent 4 pijlers en grade.
Publish
Versie wordt cache-busted; CDN edge-invalidate.
Scoring engine
function score(product):
nutri = nutriScore(product.nutriments) # 0..100, weight 0.35
nova = novaScore(product.novaGroup) # 0..100, weight 0.30
add = additivesScore(product.ingredients) # 0..100, weight 0.25
sust = sustainabilityScore(product) # 0..100, weight 0.10
total = round(0.35*nutri + 0.30*nova + 0.25*add + 0.10*sust)
grade = totalToGrade(total) # A..E
return { total, grade, breakdown: { nutri, nova, add, sust } }Voeding
35%
NOVA
30%
Additieven
25%
Duurzaamheid
10%
Rules engine — voorbeelden
Als: Bevat E951 (aspartaam) en suiker > 10g
Dan: Cap grade ≤ C
Als: NOVA = 4
Dan: Penalty −15 punten
Als: Vezels > 6g én NOVA ≤ 2
Dan: Bonus +5 punten
Als: Bevat palmolie
Dan: Sustainability −20 punten
Als: Zout > 1.5g/100g
Dan: Penalty −10 punten
Als: Volkoren als eerste ingrediënt
Dan: Bonus +5 punten
Rollen en toegang
Gebruiker
- · Zoeken
- · Favorieten
- · Profiel
Redacteur
- · Producten beheren
- · Blog publiceren
- · Inzendingen modereren
Admin
- · Gebruikers
- · Categorieën
- · Platforminstellingen
SEO & GEO
- • Server-side rendering voor elke productpagina
- • Schema.org Product + NutritionInformation
- • Edge caching per markt (NL, BE)
- • Auto-gegenereerde sitemap per categorie
- • Localized URLs en metadata (NL/EN klaar)
- • Core Web Vitals onder Google-grenzen