PagesStatisk site uden byggetrin
Hver push til main bliver til en ny udgave på det globale net. Ingen build, ingen pipeline: HTML, CSS og JavaScript ligger i repoet, som de serveres. _headers sætter Content-Security-Policy, Permissions-Policy og cache-regler; wrangler.toml i roden holder bindingerne.
Pages FunctionsServerlogik ved siden af filerne
Gæstebogen (/api/sager), tællerne og de delbare sager (/sag/980-0007 med link-preview) er små funktioner i functions/. De kører i samme request som siden, i det datacenter der er tættest på dig.
Workers KVGæstebog og tællere
Et nøgle-værdi-lager med global replikering holder de rejste sager, forsøgene på at afgøre sagen og dagens besøgende, det sidste som daghashes, der udløber efter to døgn. Ingen cookies til det; sessionen til maskinparken er den eneste cookie, og den rummer intet om personen.
Workers + Service BindingTingets maskiner bag /api/ting-ai/
Tingets maskinpark bor i en selvstændig Worker. Pages kalder den gennem en service binding, altså et direkte kald mellem to Workers uden at røre det offentlige net. Workeren har ingen egen adresse.
Workers AITre modeller, ét budget
Retssal, Brian, avis og proveniens: Llama 3.3 70B med JSON-mode, så svar valideres mod et skema, før de vises. Billedbeviset: Llama 3.2 Vision beskriver, tekstmodellen oversætter. Bevisværkstedet: FLUX.1 schnell. Døgnkvoter reserveres i databasen, før modellen kaldes.
D1SQLite på kanten
Avisudgaver, sager, kvoter, idempotency-nøgler og rate limits ligger i en D1-database i Vesteuropa. Reservationer har en lease, så et nedbrud midt i et kald ikke låser dagens bevilling for evigt.
Durable ObjectsÉn sandhed om syv pladser
Den Store Afstemning er ét Durable Object pr. vadested med WebSocket Hibernation: alle forbindelser taler med samme instans, pladser tildeles atomisk, og objektet sover mellem beskederne uden at miste runden. En reconnect giver samme plads, ikke en ny stemme. Den samme teknik bærer den fælles stol: én stol for hele internettet, hvor serveren ejer positionen og rate-limiter hver gæst.
WorkflowsBureaukratiet sover vedvarende
En stolansøgning starter en Workflow-instans, der sover et minut, to timer og et døgn mellem sine trin. Den kører, mens din browser er lukket, og hvert trin er idempotent: et gentaget trin flytter aldrig sagen to skridt frem.
Cron TriggersAvisen trykkes én gang i døgnet
En timeplan i UTC med dato-guard i Europe/Copenhagen, så sommertid ikke giver to udgaver. En joblås i D1 sikrer, at to samtidige triggers stadig kun trykker én avis pr. sprog. Sidevisninger genererer aldrig noget.
R2Mediefiler uden udgående gebyr
Opdigtede fund og radioens lydfiler gemmes i en R2-bucket under en nøgle af valg, sprog, promptversion og model. Samme kombination hentes derfor kun én gang fra modellen; alle gæster deler filen.
AI GatewayÉn port foran alle modeller
Hvert AI-kald går gennem AI Gateway, der logger model, varighed og tokens, cacher identiske kald (samme prøvebillede beskrives kun én gang) og kan sætte sit eget loft. Sitets egne døgnkvoter gælder stadig; gatewayen er sikkerhedsnettet udenom.
Rate Limiting + TurnstileÉn stemme ad gangen, og helst fra et menneske
Workers' indbyggede rate limiting-binding tæller kald pr. session og endpoint i Cloudflares eget net. Gæstebogen og stolansøgningen beskyttes af Turnstile, en usynlig bot-kontrol uden billedgåder; tokenet valideres server-side og kan kun bruges én gang.
VectorizeBrians arkiv som vektorindeks
Det redaktionelle korpus (figurer, sagsakter, de virkelige fakta med kilder) indekseres som embeddings fra bge-m3. Brian finder de nærmeste uddrag til et spørgsmål og må kun citere dem. Gådens løsninger ligger ikke i indekset; de vælges stadig af serveren efter spoiler-niveau. Hittegodskontoret har sit eget namespace med et fast katalog, så svarene altid kommer fra kataloget og aldrig fra modellen.
Browser Run + ImagesEn browser på kanten
Link-previews af en delt sag (/sag/980-0007) tegnes som et rigtigt billede af en headless browser og gemmes i R2. Protokollen kan hentes som PDF fra samme browser. Images-bindingen normaliserer uploads i billedbeviset: orientering, metadata og størrelse, før modellen ser filen.
Netværk og sikkerhedHTTP/3, HSTS, CSP og ingen tredjeparter
Alt serveres over HTTP/3 fra Cloudflares net med HSTS. Content-Security-Policy tillader kun sitets egne scripts og Turnstile; AI-tekst escapes altid og bliver aldrig HTML. Sessioner er en signeret, HttpOnly-cookie uden personoplysninger. Web Analytics tæller uden cookies.
DNS og domæneNavnet bor på Cloudflares navneservere
tingsvad.dk har været familiens siden 90'erne. I dag svarer Cloudflares anycast-DNS (sid og val) på navnet fra hundredvis af byer på én gang, så opslaget sker tæt på den, der spørger. Zonen er signeret med DNSSEC (ECDSA P-256), og DS-posten ligger hos Punktum.dk, så en validerende resolver kan afvise forfalskede svar. Trafikken til sitet proxies gennem Cloudflare, så de rigtige IP-adresser bag Pages aldrig vises. Posten går udenom: MX-posterne peger på familiens almindelige mailudbyder, og sitet rører den aldrig.
DDoS, WAF og analyseEt værn, der er tændt, før nogen beder om det
Cloudflares DDoS-beskyttelse står foran alt trafik uden opsætning, og det forvaltede WAF-regelsæt stopper kendte angrebsmønstre, før de når Pages Functions og Workeren. Web Analytics tæller besøg med et lille script fra Cloudflares eget domæne, uden cookies, fingerprinting eller tredjeparter. Tingets egen besøgstæller nederst på siden er en daghash i KV (se kortet om Workers KV) og ved intet om, hvem du er. Network Error Logging (NEL) rapporterer forbindelsesfejl tilbage til Cloudflare, så sitet kan se, når noget ikke når frem.
Pages Functions + HTMLRewriterÉn navigation, ingen byggetrin
Siderne er almindelige HTML-filer med pladsholdere. En middleware (functions/_middleware.js) streamer hver side gennem HTMLRewriter og sætter topbar, navigation og footer ind fra /partials/, udfylder sprogskiftet ud fra sidens hreflang og markerer den side, du står på. _routes.json holder billeder og scripts uden om Functions, og fordi _headers ikke gælder for svar fra Functions, sætter middlewaren selv CSP og HSTS på HTML. Gamle links som /#gaestebog sendes videre af et lille script til den underside, hvor elementet nu bor.
Server-TimingVis maskineriet
Hvert panel i maskinparken kan folde sit maskineri ud: produkterne bag, det faktiske kald, svartiden målt i din browser og Workerens egne målinger af D1, Workers AI, R2, KV og Vectorize, sendt som en Server-Timing-header. Bindings pakkes ind i en lille proxy (worker/src/lib/timing.js), så målingen sker ét sted. Gemte resultater mærkes Gemt resultat, så det altid er tydeligt, om noget er live.
Én kanonDatoer og afgørelser ét sted
assets/kanon.json rummer universets faste tal: tinget sat i 980, de tre afgørelser og den seneste i 90'erne, tågedage og sommer. Siden læser filen, og Wrangler bundler den samme fil ind i Workeren ved deploy, så avisens FAKTA og forsidens tællere ikke kan glide fra hinanden. En talvagt fjerner sætninger med tal, modellen selv har fundet på.
QueuesRavnens postsæk
Bestillinger til Ravnecentralen lægges i køen tingsvad-ravn. Køen leverer mindst én gang, med genforsøg og en dead-letter-kø; fordi hver Workflow-instans har et fast navn (ravn-<job>-<forsøg>), gør en dobbeltlevering ingen skade. Køen er gratis på Workers Free.
Workflows + Browser RunBilag og revision, trin for trin
Ravnecentralens Workflow går fra modtaget over ravnen flyver til bilaget skrives (en PDF fra en fast, escapet skabelon i Browser Run, lagt i R2) og leveret; hvert trin er en idempotent overgang i D1, og skrivningen genforsøges. Revisionen er en anden Workflow, der hver morgen tager én side ad gangen med pause imellem, så den holder sig inden for Browser Runs gratis kvote.
Uden for CloudflareDet, browseren selv klarer
Service worker til offline og »føj til hjemmeskærm«, Web Audio til åen og vinden, canvas til udgravning og certifikat, Intl-API til dansk dato og årstid, localStorage til dine fund. Familiens e-mail går via MX-records til en almindelig mailudbyder; Pages rører dem ikke.