Mealjot

Blog

Waarom een eetdagboek zonder verbinding moet werken

Niet omdat offline een leuke technische uitdaging is, maar omdat de plekken waar je iets logt precies de plekken zijn waar je telefoon niets kan.

Gepubliceerd op 22 september 2026

Waar je eigenlijk logt

De kelder van de Albert Heijn onder een winkelcentrum. Het vliegtuig, tussen de kruiswagen en het uitstappen. De trein door Zeeland, waar je telefoon om de twee minuten van mast wisselt. Een festivalterrein waar twintigduizend mensen op dezelfde zendmast hangen. Het kantoor met de betonnen kern. Het restaurant in de kelder.

Dat zijn geen randgevallen. Dat is de lijst van plekken waar mensen eten en drinken dat ze zich later niet meer herinneren.

Wat een laadspinner kost

Een eetdagboek dat op dat moment een laadspinner laat zien, krijgt die regel nooit. Je zet je telefoon weg, je gaat de rij in, en tegen de tijd dat je weer bereik hebt weet je niet meer of het nou een klein of een groot broodje was.

En het is erger dan één ontbrekende regel, want een half gelogde dag liegt twee kanten op. De dagtotalen zijn te laag, en de onderdelen van de Eetscore die over mátigen gaan — zout, alcohol, gezoete dranken — zien er beter uit dan ze waren, juist omdat je ze vergat. Een dagboek met gaten is niet een beetje minder nauwkeurig; het staat er systematisch te gunstig in.

Hoe deze het doet: alles eerst lokaal

Bij de eerste keer inloggen haalt Mealjot de hele catalogus op als één bestand: 2.328 voedingsmiddelen met hun voedingswaarden en ruim negenduizend huishoudelijke maten. Ingepakt is dat ongeveer 762 kB; uitgepakt 7,4 MB, in de database van je browser.

Vanaf dat moment gaat zoeken nergens meer heen. De zoekindex draait op je telefoon, de porties staan erbij, en een regel loggen is een schrijfactie naar je eigen apparaat. Je dag terugkijken, je dagdoelen, je Eetscore: allemaal uit dezelfde lokale kopie. Er is geen scherm in de logstroom dat op een server wacht.

Dat is de omgekeerde volgorde van de meeste apps. Die vragen het aan de server en tonen ondertussen iets. Hier schrijft de app eerst op wat jij zei, en de server hoort het later.

En dan de synchronisatie

Wat je schrijft gaat ook in een uitgaande wachtrij. Zodra er verbinding is wordt die afgewerkt, en daarna haalt de app op wat er elders veranderd is. Je hoeft nergens op te drukken.

Twee apparaten die allebei iets veranderd hebben lossen dat op met de laatste schrijfactie: elke rij draagt het moment waarop hij voor het laatst is aangepast, en de nieuwste wint. Voor een dagboek is dat de goede afweging — het is geen bankrekening, en een verloren correctie is minder erg dan een scherm dat je vraagt een conflict op te lossen terwijl je in de rij staat.

Wissen gebeurt met een grafsteen in plaats van echt weggooien: de rij blijft staan met het moment waarop hij gewist is. Alleen zo leert je andere telefoon dat hij weg is, in plaats van hem bij de volgende synchronisatie vrolijk terug te sturen.

En de cursor waarmee de app bijhoudt wat hij al heeft gezien, schuift alleen op als hij iets ophaalt — nooit als hij iets verstuurt. Dat klinkt als een detail en is het niet: opschuiven na een verzending zou de rijen overslaan die je andere apparaat in de tussentijd schreef.

De app zelf moet ook opengaan

Een lokale database helpt niet als de pagina zelf niet laadt. Daarom wordt de schil van de app — het lege raamwerk, de stijlen, de lettertypen en de code van elk scherm — bij het eerste bezoek opgeslagen door een service worker, en daarna beantwoordt die elke navigatie zonder netwerk.

Die schil bevat met opzet niets persoonlijks: hij is voor iedere bezoeker dezelfde bytes. Je naam en je dagboek komen uit de lokale database, ná het laden. Dat is wat het mogelijk maakt om hem te bewaren zonder dat de volgende persoon die je telefoon vasthoudt iets van jou te zien krijgt.

Wat er nooit in een cache komt: alles onder /api, en elke deelpagina. Een deellink is een sleutel en een gedeelde dag is andermans dagboek — die horen niet op een apparaat achter te blijven. Alleen de openbare pagina's worden bewaard, zodat ook de voorpagina, deze blogpost en de privacyverklaring het zonder verbinding doen.

Wat offline níét kan

Een barcode opzoeken die nog niet op je apparaat staat: die komt uit Open Food Facts en daar is een verbinding voor nodig. Een foto laten lezen: die gaat in een wachtrij en wordt verstuurd zodra het weer kan, met bericht als het misgaat. Een account aanmaken, inloggen, exporteren of je account opheffen: allemaal via de server.

Die schermen zeggen dat ook, in plaats van een knop te tonen die niets doet. Dat is het verschil tussen offline werken en offline doen alsof.

Alle berichten

Laatst bijgewerkt op 22 september 2026