Wereldwijd beschikbaar
Projecten

OlaEcuador — Een surfvoorspelling die haar eigen huiswerk controleert

OlaEcuador — Een surfvoorspelling die haar eigen huiswerk controleert
30 september 2026
OlaEcuador beantwoordt één vraag: wanneer is het echt de moeite om de zee in te gaan? De app scoort elk uur van de komende week voor een stuk van de Ecuadoraanse Pacifische kust, zowel voor surfen als voor een gewone stranddag, door gratis golf- en windmodellen te combineren met de officiële INOCAR-getijden, het lokale daglicht en de eigen zeestaatwaarschuwingen van INOCAR. Ik ontwierp en bouwde het — de datapijplijn, de scoring, de kaart, de grafieken en de interface. Wat het meer maakt dan weer een andere forecast-skin is het stuk dat de meeste voorspellingen overslaan: het is gebouwd om uit te zoeken of zijn eigen cijfers kloppen. Dit is een validatieproject, en eerlijkheid over onzekerheid is het hele punt. De Ecuadoraanse kust wordt slecht bediend door de grote surfvoorspellingen. De globale modellen bestaan, maar ze worden gesampled offshore, in diep water, en het cijfer waar een surfer om geeft — de golf die om 7 uur 's ochtends echt breekt in Montañita — is het product van een tiental lokale factoren die die modellen wegfilteren. De eerlijke startvraag was dus niet "hoe toon ik een voorspelling?", maar: zeggen gratis modeldata, gesampled op zo'n 5 km offshore, iets nuttigs over de golven die surfers hier echt krijgen? De eerste release is bewust afgebakend als een validatie-spike op twee spots, Montañita en Engabao, om precies dat te beantwoorden voor we doen alsof we de hele kust dekken. Rond die vraag ontwerpen, en niet rond een mooie forecast-kaart, heeft al de rest bepaald. Elk uur krijgt een surfscore uit factoren die elkaar vermenigvuldigen, zodat één slechte factor het hele uur naar beneden trekt — precies zoals surfen in werkelijkheid werkt:
100 · size · (0.4 + 0.6·period) · (0.15 + 0.85·wind) · tide · rain · daylight
  • Grootte is niet de ruwe modelhoogte. Elke deining wordt geschaald naar exposure — volle punten binnen het swell window van de spot, aflopend naar nul zodra de hoek 30° buiten dat venster komt, en nog verder gereduceerd wanneer de deining schuin aankomt. De blootgestelde deining wordt omgezet in een brekende hoogte (met de relatie van Komar en Gaudiano uit 1983), over de deiningen gecombineerd op energie, en vergeleken met de ideale golf van de spot.
  • Wind wordt gewogen op hoe onshore hij is ten opzichte van de richting waarin het strand kijkt. Onshore wind telt bijna volledig tegen de score; offshore raakt ze nauwelijks.
  • Getij vergelijkt de INOCAR-stand met de omliggende uren en matcht die met het voorkeursgetij van de spot. Het verzacht een score, maar maakt ze nooit nul.
  • Een aparte stranddagscore is een gewogen meetkundig gemiddelde van kalm water, lichte wind, geen regen, zon en warmte, maal daglicht — want "een fijne dag aan het strand" en "goede surf" zijn verschillende vragen.
  • INOCAR-waarschuwingen overrulen alles: een waarschuwing voor ruwe zee zet een plafond op de score, een zeer ruwe zee maakt ze zo goed als nul, en die uren worden nooit als "beste" voorgesteld.
Elke score draagt haar opbouw in componenten en haar redenen in mensentaal mee, zodat de interface altijd kan uitleggen waarom een uur scoort zoals het scoort, in plaats van alleen een cijfer te tonen. Het kustdashboard is een MapLibre-kaart van het live zeestaatveld — een raster van oceancellen, gekleurd op golfhoogte, met pijlen voor de richting waarin de golven lopen, omschakelbaar naar het windveld — met elke spot gekleurd op haar score. Je kunt op play drukken en door de week scrubben om de deining te zien aankomen. Rond de kaart staan KPI-tegels met sparklines, een spotranking, een swell rose tegen het werkvenster van elke spot, en een meteogram. Het spotlab is waar het echte werk bovendrijven komt. Een negen dagen lange heatmap van scores per uur opent in een uurdetail met de redenen en een strandkompas. Het tekent de INOCAR-getijcurve tegen het eigen gemodelleerde getij van Open-Meteo, zodat je ziet dat ze het oneens zijn. En het legt de modelspreiding bloot: drie golfmodellen tegen zes windmodellen, achttien combinaties, omdat ze dicht bij de kust zo ver uit elkaar liggen dat het verbergen ervan oneerlijk zou zijn. Elke voorspelling kan gezag uitstralen. Deze is gebouwd om nagetrokken te worden. Voor of na een sessie open je de spot, tik je het uur aan en leg je in het field log vast wat er echt gebeurde: een score van één tot vijf, de grootte in voet, de wind die je voelde, en waar de info vandaan kwam — je eigen sessie, of wat lokale surfers en scholen meldden. Elke invoer bevriest wat alle achttien modelcombinaties op dat moment voor dat uur voorspelden. Daarna rangschikt een agreement-tabel de combinaties op gemiddelde fout en bias. Vanaf twintig invoeren per spot zegt ze welk golf- en windmodel je dicht bij deze kust kunt vertrouwen, en of de score systematisch te optimistisch is. Als een spot consistent in één richting fout zit, past een tuning-paneel de oriëntatie, het swell window, het beste getij of de ideale grootte aan, en herscorét de pagina live. Die lus — voorspellen, de werkelijkheid vastleggen, de kloof meten, bijstellen — is het product. Al de rest staat in functie daarvan. De validatietooling bouwen leverde meteen inzichten op die de moeite waard zijn, en dat is precies de bedoeling ervan:
  • De getijden van INOCAR voor 2026 bestaan als open data — een uurlijkse CSV in lokale tijd — maar dekken negen stations, niet de vijfentwintig die je zou verwachten. La Libertad ligt het dichtst bij beide spots. Het eigen gemodelleerde getij van Open-Meteo klopt qua fase tot op ongeveer een uur, maar schiet door in amplitude, dus de officiële INOCAR-data wint.
  • Het mariene modelraster is grof — zo'n negen kilometer — en landcellen geven niets terug, dus de app koppelt elke spot bewust aan een zinvolle oceancel in plaats van aan de louter dichtstbijzijnde.
  • De modellen zijn het dicht bij de kust grondig oneens. In een vroege run varieerde de voorspelde dagpiek in Montañita van 37 tot 77, afhankelijk van de modelcombinatie. Het ene model noemde de primaire deining een windzee met korte periode, terwijl een ander voor exact hetzelfde uur een groundswell met lange periode rapporteerde. De wind 's middags liep over de modellen van 6 tot 20 km/u. Die onenigheid is precies wat het field log moet beslechten — en precies waarom een voorspelling met één cijfer voor deze kust een zelfverzekerde leugen zou zijn.
  • Framework: Next.js 16 (App Router, statische pagina's die elke 3 uur verversen) en React 19.
  • Kaart: MapLibre GL met OpenFreeMap-tiles — geen API-sleutel, commercieel gebruik toegestaan.
  • Grafieken: ECharts, tree-shaken, voor het meteogram, de tijdlijn en de swell rose.
  • Data: mariene en weermodellen van Open-Meteo (alle combinaties opgehaald in één gebatchte call), INOCAR-getijden-CSV's, INOCAR-zeestaatwaarschuwingen.
  • Styling: plain CSS custom properties met een licht en een donker thema.
  • Testing: Vitest over de scoring en de getijdenparser.
  • Tooling: een command-line-"spike" die de uurlijkse tabel voor elke spot en modelcombinatie print en elk uur naar CSV dumpt, zodat de modelvergelijking zonder browser kan draaien.
De scoring is pure TypeScript zonder eigen input of output, ongewijzigd gedeeld tussen de server, de command line en de browser — wat betekent dat de geplande job die scores naar een database schrijft exact dezelfde code kan hergebruiken als de interface. Afbakenen op een vraag, niet op een kustlijn. De gedisciplineerde zet was twee spots en een validatielus shippen in plaats van een voorspelling voor de hele kust die af uitziet en fout kan zijn. Een voorspelling die je niet kunt checken, is decoratie. Meningsverschil tussen modellen is een designprobleem, geen bug om te verbergen. De reflex is één model kiezen en een proper cijfer tonen. Dicht bij deze kust zou dat oneerlijk zijn, dus de spreiding wordt bewust getoond en het field log bestaat om ze op termijn te herleiden tot een onderbouwde keuze. Gratis data heeft echte beperkingen, en ze benoemen is het werk. De gratis tier van Open-Meteo is niet-commercieel, het mariene raster is grof, en het gemodelleerde getij schiet door. Elk daarvan staat in het project opgeschreven in plaats van weggewerkt, want de geloofwaardigheid van een voorspelling is precies haar eerlijkheid over wat ze niet weet. Een werkende, eerlijke voorspelling voor surfen en stranddagen voor twee Ecuadoraanse spots, verpakt in de tooling om te bewijzen of ze vertrouwen verdient — de kaart om de week te zien, het lab om een uur te begrijpen, en het field log om de voorspelling af te meten tegen de zee zelf. Ze is gebouwd om pas naar de rest van de kust uit te breiden wanneer de data dat verdient, en elk stuk van de scoring is al zo gevormd dat het zonder rewrite naar een geplande backend kan. De site is zorgvuldig over wat ze is: ze toont wanneer de omstandigheden aangenaam lijken, niet wanneer ze veilig zijn. Respecteer de vlaggen, de redders en de waarschuwingen van INOCAR.

Website op maat

Vertel me in een paar regels wat je doet en wat je wil bereiken. Je krijgt binnen twee werkdagen een reactie met een eerlijke inschatting en een voorstel voor een intake van 30 minuten.

Vraag een voorstel