尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Nederlandstalige weerapp voor watishetweer.nl. De applicatie combineert actuele en verwachte weerdata met een centrale interpretatielaag, neerslag, luchtkwaliteit, pollen, waarschuwingen en Nachtzicht. Cloudflare Pages is het enige productieplatform. De productieflow draait vanuit GitHub Actions en bouwt met:檢視完整 README ↗
Nederlandstalige weerapp voor watishetweer.nl. De applicatie combineert actuele en verwachte weerdata met een centrale interpretatielaag, neerslag, luchtkwaliteit, pollen, waarschuwingen en Nachtzicht.
Cloudflare Pages is het enige productieplatform. De productieflow draait vanuit GitHub Actions en bouwt met:
npm run build:cloudflare
De build assembleert de canonieke bronbestanden en gecontroleerde buildlagen tot public/. Daarna voegt scripts/cloudflare-output.js de Cloudflare Pages-configuratie toe en deployt .github/workflows/cloudflare-production.yml exact de main-SHA: eerst als releasekandidaat (Pages-preview op branch release-candidate) met readiness en volledige smoke, en pas daarna hetzelfde artifact naar production. Een rode kandidaat laat de live site ongemoeid. Wijzig daarom niet handmatig bestanden in public/; die map wordt opnieuw opgebouwd.
Belangrijke ingangen:
index.html — hoofdtemplate en primaire browserlogica.interpretatie-engine.js — centrale interpretatielogica.build-weather.js — assembleert het productie-artifact en bindt de serviceworker-cache aan de app-shell.scripts/ — afgebakende build-, verificatie- en regressielagen.api/ — gedeelde serverroute-logica die door Cloudflare Pages Functions wordt aangeroepen.functions/api/ — dunne Cloudflare Pages Functions-wrappers.functions/_middleware.js — securityheaders voor dynamische Cloudflare-responses.cloudflare/_headers — securityheaders voor statische Cloudflare-responses.cloudflare/_routes.json — expliciete Pages Functions-routing.wrangler.jsonc — Cloudflare Pages-projectconfiguratie.De huidige publieke serverroutes zijn:
api/forecast.mjs — beschermde server-side forecastfallback (Visual Crossing, met WeatherAPI als noodfallback) voor actuele, uur- en zevendaagse forecastdata.api/plaatsnaam.mjs — reverse geocoding voor Mijn locatie wanneer de directe BigDataCloud-resolutie niet genoeg oplevert.api/neerslag.mjs — actuele en korte-termijnneerslag via de beschikbare providerlaag.api/waarschuwingen.mjs — officiële weerwaarschuwingen op basis van de gekozen locatie.functions/api/admin/seo.js — privé SEO-dashboard-API achter Cloudflare Access; zie .github/SEO_DASHBOARD_SETUP.md.Serverlogica staat in lib/. De functions/api/*.js-bestanden zijn alleen de Cloudflare-ingangen en horen geen tweede implementatie van de route te bevatten.
Open-Meteo blijft de primaire forecastbron. Alleen bij een fout of wanneer de volledige Open-Meteo-request na tweeënhalve seconde nog niet gereed is, starten de lichte Open-Meteo-fallback en de same-origin route /api/forecast binnen hetzelfde begrensde fallbackvenster. Die route probeert eerst Visual Crossing en valt daarna terug op WeatherAPI; geldige volledige antwoorden van beide providers worden tien minuten in de Cloudflare edge-cache bewaard. De eerste volledige, gevalideerde zevendaagse dataset wint; verliezende requests worden afgebroken.
De providersleutels mogen uitsluitend als versleutelde Cloudflare Pages-secrets VISUAL_CROSSING_API_KEY en WEATHERAPI_KEY in zowel preview als production worden ingesteld. Zet een sleutel nooit in browsercode, GitHub Actions-output of een repositorybestand. Omdat de app zeven dagen toont, is een WeatherAPI Starter-abonnement of hoger vereist; een driedaagse Free-response faalt bewust gesloten.
De standaardfallback is de publieke Nominatim-dienst van OpenStreetMap. De serverroute rondt coördinaten af, gebruikt een herkenbare product-User-Agent en geeft cache-instructies mee.
De basis-URL kan optioneel zonder codewijziging worden omgezet naar een andere Nominatim-compatible dienst:
NOMINATIM_BASE_URL=https://geo.example.nl/nominatim
Zonder deze variabele blijft https://nominatim.openstreetmap.org de standaard. Een expliciet ingestelde maar ongeldige URL faalt gesloten; de applicatie schakelt dan niet stil terug naar de publieke dienst.
Een waarschuwing wordt alleen als plaatsgebonden kaart doorgegeven wanneer de server expliciet bewijs voor die plaatsdekking heeft. Landbrede of onbekende scope wordt niet als lokale waarschuwing gepresenteerd.
Amerikaanse meldingen (NWS) tonen altijd hun specifieke gebeurtenis; er is geen algemene kop meer. De server (lib/nws-gebeurtenissen.cjs) kent alle gebeurtenistypen van api.weather.gov/alerts/types (fixture: scripts/fixtures/nws-gebeurtenistypen.json) en geeft per melding titelNl (alleen bij een zekere vertaling), klasse (waarschuwing, waakzaamheid, advies of melding), ernstNl en prioriteit mee. Is de vertaling onzeker, of is het type nieuw, dan staat de officiële Engelse naam in de kop (lang="en"). ernstNl is de ernst die de Amerikaanse weerdienst zelf opgeeft (CAP severity: gering, matig, ernstig, extreem of niet opgegeven) en wordt altijd met die bronvermelding getoond; het is geen KNMI- of MeteoAlarm-kleurcode. Berichten met een andere status dan Actual (testberichten) worden niet getoond. Engelstalige bezoekers zien de officiële Engelse naam. De oudere tabellen in scripts/final-audit-20260901.js (kaarten) en scripts/staff-audit-20260826.js (briefing) zijn alleen nog de terugval voor een antwoord zonder titelNl; een nieuwe vertaling hoort in lib/nws-gebeurtenissen.cjs en een nieuwe officiële naam ook in de namenlijst van taal/en.js (scripts/nws-gebeurtenissen.test.js bewaakt beide). De lijst staat op prioriteit (ernst van de bron, daarna soort melding, daarna begin); de dringendste drie staan direct zichtbaar en elke andere actieve waarschuwing staat in de uitklap "+ N andere waarschuwingen". Verschillende meldingen worden nooit samengevoegd: ook als de bron er één gedeelde tekst bij geeft (Miami: Rip Current Statement en Coastal Flood Advisory), blijft elke kaart met haar volledige officiële tekst staan. Alleen een identiek object (zelfde titel, einde en gebied) wordt één kaart.
De MeteoAlarm-feed per land kan groot zijn (Spanje: 3,5 MB, ruim 7 seconden). De route wacht hooguit 4 seconden en geeft anders het landbrede Atom-antwoord; de download loopt dan via waitUntil door. In caches.default komt een compacte kopie (alleen lopende waarschuwingen en de gebruikte velden; Spanje ongeveer 0,2 MB) die vijf minuten vers is en tot een kwartier bruikbaar blijft terwijl op de achtergrond een nieuwe wordt opgehaald. Die cache is per Cloudflare-datacenter.
Seizoenspagina's zoals /witte-kerst/ en /oud-en-nieuw/ hebben een vaste URL die ieder jaar terugkomt. Iedere pagina is alleen configuratie in scripts/seizoenspagina.config.js (datums, plaatsen, teksten); het sjabloon (scripts/generate-seizoenspaginas.js) en de browserlogica (scripts/seizoenspagina-runtime.js) zijn gedeeld. Buiten de 7-daagse verwachting toont de pagina alleen wanneer de verwachting verschijnt; daarbinnen haalt hij de echte Open-Meteo-verwachting op. Er is geen lange-termijnverwachting en geen klimaatstatistiek. De pagina's staan in de sitemap en als footerlink op iedere weerpagina.
/nachtzicht/ zet de Nationale Parken op een rij (donkerste eerst), /nachtzicht/<park>/ toont per park de komende nachten en /maan/ de maanfase en de komende hoofdfasen. De parken en hun coördinaten staan in scripts/nachtzicht.config.js (Wikidata); een park doet alleen mee als de RIVM-lichtkaart (lichtvervuiling-nl.json) rond het park volledig is, waardoor parken aan de landsgrens ontbreken. De pagina's tonen exact de nachtscore, het oordeel en het kijkvenster van het blok Nachtzicht: scripts/nachtzicht-bron.js neemt bij de build de rekenfuncties en teksten letterlijk over uit de app (index.html, senior-correctness-v2.js, scripts/mobile-screenshot-polish.js, scripts/final-global-correctness-20260901.js, nederlandse-weergrammatica.js) en faalt als een anker verdwijnt. scripts/nachtzicht-pariteit-browser.test.js legt de pagina's naast de echte app; verander je Nachtzicht in de app, dan faalt die test tot de pagina's meegaan. De maanfasen op /maan/ volgen Meeus (Astronomical Algorithms). Een geopende pagina blijft kloppen: de uitkomst wordt per uur lokaal opnieuw berekend en de verwachting wordt hoogstens een uur oud gehouden (één gewone aanvraag, zonder betaalde reserve; bij een storing blijft het getoonde staan en meldt de regel "Verwachting van HH:MM" hoe oud het is); de uurwaarden van de parkgrafiek staan ook als uitklapbare tabel (zie scripts/nachtzicht-runtime.js). Seizoenspagina's verversen op dezelfde manier stil binnen dezelfde toestand.
| Onderdeel | Bron |
|---|---|
| actuele, uur- en dagverwachting | Open-Meteo primair; Visual Crossing en WeatherAPI als server-side fallback |
| locatie zoeken | Open-Meteo Geocoding |
| luchtkwaliteit en pollen | Open-Meteo Air Quality (CAMS) |
| reverse geocoding | BigDataCloud, met Nominatim-compatible serverfallback |
| waarschuwingen VS | National Weather Service |
| waarschuwingen Europa | MeteoAlarm |
| kaartondergrond | CARTO / OpenStreetMap-attributie |
Zon- en maanstanden worden lokaal berekend. Bronvermeldingen die leveranciers vereisen staan in de interface en mogen niet zonder inhoudelijke controle worden verwijderd.
De minimale lokale kwaliteitsketen is:
npm test
De Cloudflare-productiebuild is:
npm run build:cloudflare
De repository bevat daarnaast echte browsercontroles voor Chromium en WebKit, mobiele en desktopbreedtes, performance, neerslagrandgevallen, internationale locaties en serviceworker/offlinegedrag. Na iedere productiedeploy vergelijkt de wereldmonitor zes klimaatzones op mobiel en desktop met de Open-Meteo-respons waarmee de pagina werkelijk rendert. Een aparte live monitor meet in Chromium en WebKit de tijd tot zichtbare data en een bruikbare grafiek, het aantal externe verzoeken, dubbele forecastaanvragen, scroll/rendering en onverwachte Cloudflare Analytics-injectie. GitHub Actions is de uiteindelijke merge-eis; een wijziging hoort niet gemerged te worden op basis van alleen een lokale groene subset.
Belangrijke contracten die expliciet worden getest:
0 worden;Cloudflare-CDN-Cache-Control;De serviceworker-versie wordt tijdens de build afgeleid van de definitieve app-shell. Verhoog of wijzig daarom niet handmatig een cacheversie om een wijziging zichtbaar te krijgen. De gedeelde build- en postbuildhelpers vernieuwen en verifiëren de cachehash nadat het artifact is gewijzigd.
Werk via een aparte branch en pull request. Houd wijzigingen klein en bewijsbaar:
Weerformules, interpretatiebeleid, waarschuwing-scope en andere productregels horen niet als screenshotpatch of plaats-specifieke uitzondering te worden aangepast. Nieuwe oplossingen moeten generiek blijven voor huidige en toekomstige locaties.
Gebruik een rollback alleen bij een bewezen productiestoring of ernstige regressie. Productie hoort altijd herleidbaar te blijven tot een GitHub-SHA.
weather-build-sha.main.Cloudflare production exact de nieuwe main-SHA naar Pages.WeatherNow production smoke: homepage, www-redirect, securityheaders, sitemap, kernroutes, API-contracten en de wereldwijde mobiel/desktopmatrix moeten groen zijn.Verwijder oude Cloudflare Pages-deployments niet routinematig; immutable deployments blijven nuttig voor vergelijking en incidentanalyse.
Voor architectuur, accountgrenzen, secrets zonder geheime waarden, databronnen, deploy, monitoring, kostencontrole, incidentherstel en veelvoorkomende wijzigingen: