Over dit project
Wie er achter calorietje.nl zit, waarom het bestaat en hoe de cijfers tot stand komen.
Wie
Calorietje.nl wordt gebouwd en onderhouden door Erik de Boer, software engineer bij jump.nl. Het is een persoonlijk, niet-commercieel project. Bereikbaar via erik@jump.nl.
Waarom
Calorieën tellen via apps voelt vaak als zoeken naar een speld in een hooiberg. Calorietje combineert een foto van je maaltijd met een gestructureerde voedingsdatabase, zodat je in twee klikken weet wat je binnen hebt gekregen — zonder abonnement of advertenties. De app is ontstaan tijdens leertijd bij jump.nl en per ongeluk uitgegroeid tot een werkend product.
Hoe de cijfers tot stand komen
De voedingswaarden in de app zijn gebaseerd op de officiële Nederlandse NEVO-database (beheerd door RIVM / Voedingscentrum). Voor fotoanalyse gebruikt calorietje Google Gemini, gecombineerd met vector-retrieval over NEVO via pgvector. Concrete pipeline:
- Je maakt een foto. Gemini herkent ingrediënten en geschatte hoeveelheden.
- De herkende ingrediënten worden gematcht tegen NEVO via semantische similarity (pgvector).
- Per match worden de macro's (kcal, eiwit, vet, koolhydraten) per gram opgehaald uit NEVO en geschaald naar de geschatte hoeveelheid.
- Je kunt elke match handmatig corrigeren of overrulen.
Twee onnauwkeurigheden om je bewust van te zijn: Gemini schat porties op basis van een 2D-foto (kan er flink naast zitten), en NEVO-waarden zijn gemiddelden, een specifiek product kan afwijken. Voor medische of klinische doeleinden zijn deze cijfers daarom niet geschikt; zie ook de gebruiksvoorwaarden.
Bron- en data-attributie
- NEVO Nederlandse voedingsstoffenbestand, beheerd door het RIVM/ Voedingscentrum. Gebruikt voor alle voedingswaarden in de app.
- Google Gemini LLM voor foto-herkenning en vrije-tekst-invoer. Draait via je eigen API-key.
- pgvector PostgreSQL-extensie voor semantisch zoeken op NEVO-items.
Privacy en data
Je API-key blijft op je apparaat, je voedingsdata staat in een eigen database in de EU, en je kunt je account zelf verwijderen via een bevestigingsstap met "VERWIJDER" en je huidige wachtwoord. Volledige uitleg in het privacybeleid.
De technische leerdoelen achter dit project:
- Feature-Sliced Design binnen Next.js App Router, met strikte laag-scheiding tussen app, views, widgets, features, entities en shared.
- PostgreSQL met pgvector voor semantisch zoeken op NEVO, zodat AI-uitvoer wordt verankerd in betrouwbare brondata.
- Retrieval-Augmented Generation met Google Gemini: foto-analyse + vector-retrieval + NEVO-grounding.
- Privacy-by-design door API-keys uitsluitend client-side te bewaren. Gebruikers houden de regie en de kosten van hun eigen LLM-gebruik in handen.
- Een complete authenticatie-laag opzetten: registratie met emailverificatie, wachtwoordreset en transactionele mails.
- Single sign-on via een externe provider als alternatief inlog-pad, met veilige accountkoppeling op een geverifieerd emailadres.
- Tailwind CSS met design-tokens en herbruikbare shared/ui componenten, UI-consistentie zonder externe componenten-bibliotheek.
- Self-hosted DevOps een eigen Linux VPS in de EU, handmatig ingericht (reverse proxy, TLS, process-management, database) om de hele stack te begrijpen.
- Gedisciplineerde Git-workflow met feature branches, pull requests, een vaste senior / coderabbit review op productiefalen, en idempotente databasemigraties.
Erik de Boer
erik@jump.nl