Sikkerhed hos qub

Ikrafttrædelsesdato: 23. september 2026 Version: 1.1 — gennemgang af implementeringsnøjagtighed


For forskere — hurtig reference:

Fulde detaljer er i §12 (Koordineret offentliggørelse).


Hvem vi er

qub.social drives af VSPRY AUSTRALIA PTY LIMITED (ABN 41 631 026 330), Level 38, 71 Eagle Street, Brisbane QLD 4000, Australien. Henvisninger til "qub", "vi", "os" og "vores" betyder den enhed.

Sikkerhedskontakt: support@qub.social med emnepræfikset [SECURITY].


1. Vores tilgang

qub er tillidsinfrastruktur. Produktet er værdiløst, hvis det ikke er sikkert, så sikkerhed er ikke en funktion — det er substratet. Denne side beskriver i konkrete termer, hvordan vi beskytter vores stack, dine data og integriteten af forseglet indhold.

Værdien af en verificerbar tidsbestemt forpligtelse vokser, efterhånden som mere af internettet bliver maskingenereret. En verificeret lagringstransaktion eller en forankring i transparensloggen kan fastslå, at ciphertext eksisterede senest på blokkens tidspunkt; det forseglede artefakt beviser separat indholdsintegritet, binding til drand-runden og eventuelle forfatterskabssignaturer. At holde disse påstande adskilt er den standard, denne side holdes op imod.

Vi beder dig ikke om at stole på os. Vi designer, så den tillid, der kræves af os, er så lille som muligt, og hvor tillid kræves, forklarer vi præcis, hvad der bliver stolet på, og hvorfor.

Tre principper driver enhver designbeslutning:


2. Trusselsmodel

2.1 Hvad vi beskytter imod

2.2 Hvad vi ikke kan beskytte imod

Vi er ærlige om vores begrænsninger. qub kan ikke forsvare sig mod:


3. Klient-side kryptografi

I browserens standardbeskedflow sker indholdskryptering før uploadanmodningen. To udtrykkelige stier er anderledes: Builder-/api/v1/seal sender bevidst klartekst og en K, som kalderen har genereret, til Workeren til forsegling i hukommelsen, og faseinddeling/medunderskrift af pagter sender den signerede strukturerede pagt til tjenesten, så den kan færdiggøre det bilaterale artefakt. Ingen af undtagelserne må forveksles med end-to-end-kryptering i browserstien.

3.1 Timelock-kryptering

qub bruger tlock — identitetsbaseret kryptering nøglet til en fremtidig drand-beacon-runde. Kryptering forløber i din browser ved hjælp af drand-netværkets offentlige nøgle; dekrypteringsnøglen frigives offentligt af drand-netværket, kun når mål-runden nås. Ingen, inklusive os, kan rekonstruere dekrypteringsnøglen på forhånd.

Vi sigter mod quicknet-kæden:

quicknet-kædens offentlige nøgle og genesis-tid er kompileret ind i klienten. Vi henter ikke kæde-parametre ved kørselstid, så en ondsindet node kan ikke substituere en kæde, vi kontrollerer.

3.2 Symmetrisk kryptering

tlock-skemaet ombryder en AES-256-GCM-indholdsnøgle. AES-GCM giver autentificeret kryptering: en enkelt bit vendt i ciphertext'en får dekryptering til at mislykkes, snarere end at producere stille-korrumperet klartekst.

3.3 Kanonisk serialisering

Protokolstrukturer serialiseres ved hjælp af deterministisk CBOR (RFC 8949 §4.2 core deterministic encoding). To implementeringer, der koder den samme logiske struktur, producerer identisk CBOR. Komplette forseglede payloads er ikke deterministiske: tlock og krypteringen af den ydre indpakning bruger frisk tilfældighed. Body-hashet beregnes over de rå body-bytes, mens den kanoniske kodning gør de omgivende signerede strukturer og wire-strukturer entydige.

Vi skrev CBOR-encoderen i hånden for både vores klient- og serverimplementeringer i stedet for at stole på et generisk serialiseringsbibliotek — kravet er nøjagtighed, ikke ergonomi, og property-tests kører i begge implementeringer for at verificere, at de stemmer overens.

En regressionstest bekræfter, at det kanoniske wire-format ikke indeholder nogen qub-brand byte-sekvens ud over protokol-primitive qub_id-feltnøglen. Wire-formatet er bevidst brand-agnostisk — enhver konform læser (vores eller en tredjeparts) kan gengive enhver qub fra permanent lager, uanset hvilken implementering der forseglede den. Testen er en snubletråd, der forhindrer en fremtidig ændring i utilsigtet at bage en brand-reference ind i bytes, der, når de først er i permanent lager, ikke kan omskrives.

3.4 Body-hashing og integritet før afsløring

Hver forseglet payload bærer et SHA3-256-hash af sine rå body-bytes. Hashet er bundet ind i qub_id og, når forfatterskabssignering er aktiveret, i V2-signaturinputtet. En læser genberegner det efter dekryptering og afviser en uoverensstemmelse.

Den 32-byte indholdsidentifikator qub_id udledes fra et 108-byte preimage, der dækker protokolversionen, indholdstypen, oprettelses- og oplåsningstidsstempler, et valgfrit udfaldstidsstempel (eller dets nulsentinel), den ønskede drand-runde, body-hashet og SHA3-256 af den valgfrie NFC-normaliserede titel. En gateway eller et CDN kan ikke ændre et bundet felt konsistent og stadig bestå genudledningen. Titler er begrænset til 100 NFC-kodepunkter og afvises ved den fælles klasse af fjendtlige kodepunkter og kontrolkodepunkter (herunder bidi-overrides, tegn uden bredde, tagblokken, BOM, C0, C1 og DEL).

3.5 Signering (ML-DSA-65)

Forfatter-signering bruger ML-DSA-65 (FIPS 204), et NIST-standardiseret post-kvante-signaturskema. Vi valgte bevidst en post-kvante-primitiv til signering, fordi forseglet indhold er permanent: en signatur, der verificerer i dag, skal stadig verificere årtier fra nu, herunder efter at storskala-kvantecomputere bliver praktiske.

Signeringsnøgler genereres i browseren. Den lokale hemmelighed indpakkes under en ikke-eksporterbar WebCrypto-nøgle før lagring i IndexedDB. Hvis funktionen til kontoomfanget genoprettelse på tværs af enheder bruges, lagres en AEAD-krypteret portabel nøgleblob på serversiden; dens ciphertext for den hemmelige nøgle bindes til det uforanderlige konto-id, og tjenesten validerer den offentlige konvolut, men kan ikke dekryptere det hemmelige materiale. Rå bytes fra den private nøgle sendes ikke til serveren. Offentlige nøgler og attesteringsoptegnelser opbevares til verifikation og identitetsvisning.

Samme in-browser tlock-dekryptering gælder inde i qub-embeddet: når en forseglet qub gengives gennem <qub-embed> på en tredjepartsside, sker dekryptering stadig i embed-iframen i læserens browser. Embeddet ændrer ikke tillidsmodellen — klartekst dekrypteres aldrig på en qub-server.

3.6 Offentlig tilskrivning — opt-in

Forseglede qubs bærer ingen on-chain-pointer til deres skaber, medmindre skaberen eksplicit vælger at vedhæfte en. Når du forsegler en qub, udsender reference-appen et Author lager-tag (et 64-tegns hex-fingeraftryk af din offentlige signeringsnøgle), kun når "Offentlig tilskrivning" er aktiveret på datovælger-trinnet. Med kontakten slået fra — standard — skrives intet Author-tag, og qub'en er utilskrevet i permanent lager: intet i lageret forbinder uploaden med din handle, din e-mail eller dine andre qubs. Med kontakten slået til, opløses fingeraftrykket til din @handle via attesteringskæden i §6.3 / §10, og læser-nedtællingen viser "Forseglet af @{handle}" før afsløring.

Dette er en bevidst sikring mod den enumeration-risiko, et altid-aktiveret Author-tag ville skabe: en tredjepart, der lærer en skabers fingeraftryk, kunne ellers gennemsøge permanent lager efter tagget og rekonstruere skaberens fulde historiske output. Opt-in-tilskrivning lukker den kanal — kun qubs, skaberen eksplicit vælger at tilskrive, dukker op under et fingeraftryk i permanent lager.

/u/{handle}-profilsiden er et verificeret-identitets-kort — handle, valgfrit visningsnavn + URL, "verificeret e-mail"-pille (ingen adresse) og det kryptografiske fingeraftryks korte form. Den lister ikke en skabers qubs. Besøgende, der vil se en specifik qub fra en skaber, følger den qub's leverings-URL direkte.

3.7 Ydre krypteringsindpakning

Selv efter at timelock-dekryptering er matematisk mulig — når drand-signaturen for den bundne runde er offentliggjort — ville det kanoniske timelock-lag alene lade en indekseringstjeneste massedekryptere qubs, der kan findes. Privat levering lukker den kanal med et yderligere symmetrisk lag omkring de timelock-krypterede bytes (Protokol §13). Offentlig levering udelader bevidst indpakningen, så notifikations-, embed- og opdagelseslinks kan fungere uden et hemmeligt fragment.

Indpakningen bruger AES-256-GCM, en NIST-standardiseret autentificeret cipher, med en frisk 256-bit nøgle K genereret pr. qub af din browsers CSPRNG. K er bundet til qub'ens qub_id som autentificerede yderligere data, så en nøgle fra én qub ikke kan genbruges til at dekryptere en anden qub.

K når aldrig vores servere i browserens private standardflow. Den er kodet ind i URL-fragmentet af delelinket (https://qub.social/c/<tx_id>#<base64url(K)>). Browsere transmitterer ikke URL-fragmenter til servere—RFC 3986 placerer fragmentet uden for anmodningen—så qub.social, lagergateways, CDN'er og anmodningsovervågning er blinde over for K i dette flow. Den lagrede OuterWrapper er genkendelig struktureret CBOR, men dens autentificerede ciphertext-felt skjuler den indre SealedQub-struktur og kan ikke åbnes uden K.

Netto-konsekvenser:

Workerens server-side /api/v1/seal-endpoint (brugt af AI-agenter og andre API-opkaldere) kræver, at opkalderen genererer K med en CSPRNG, beholder den lokalt og leverer den som wrapper_key_b64url. Workeren ser nødvendigvis både klartekst og K i hukommelsen på denne eksplicit betroede sti, men persisterer ingen af dem. En obligatorisk Idempotency-Key forhindrer et tabt svar i at skabe endnu en faktureret qub, mens den K, som opkalderen har beholdt, kan kombineres med den genafspillede, fragmentløse URL. Dette adskiller sig fra standard-browser-stien, hvor K aldrig når Workeren, medmindre skaberen eksplicit aktiverer genoprettelse.


4. Transport og edge

4.1 TLS

Browsertrafik til qub leveres over HTTPS ved Cloudflare-edge. Svar angiver HTTP Strict Transport Security (max-age=63072000; includeSubDomains; preload). Den nøjagtigt forhandlede TLS-version og cipher suite styres af den aktive edge-konfiguration og hævdes ikke af applikationskoden. Vi eksponerer ikke en separat origin-server, der kan nås direkte.

4.2 Indholdssikkerhed

Den kompilerede klient serveres med strenge content-type- og cache-headere. SPA-skallen er en enkelt origin. Vi indlejrer ikke tredjepartsscripts til analyser eller reklame. De to tredjeparts-berøringspunkter i produktet er begge snævert afgrænset: købsflowet forlader SPA'en helt med en fuld sideomdirigering til Stripe-hostet checkout (https://checkout.stripe.com/…) — Stripes UI udføres aldrig i vores origin, og vi ser aldrig kortdata — og forseglingsflowet indlæser Cloudflares Turnstile-widget, et privatlivs-bevarende CAPTCHA-alternativ, som Cloudflare gengiver inde i sin egen sandboxede iframe. Ingen af parterne kan læse resten af siden.

qub-embed-iframen (serveret fra qub.social/embed/{tx_id} og indlæst i tredjepartssider af embed.js) har sin egen Content-Security-Policy. Dens connect-src-tilladelsesliste er 'self', https://qub.social, https://arweave.net, https://ar-io.dev, https://permagate.io, https://api.drand.sh og https://drand.cloudflare.com. Iframen kører med sandbox="allow-scripts allow-top-navigation-by-user-activation" (ikke allow-same-origin): værtssiden kan ikke læse dens DOM, og den kan ikke navigere værten, medmindre brugeren har foretaget en handling.

4.3 CORS og fetch-omfang

Browser-klienten foretager fetch-anmodninger kun til:

Embeddets destinationer håndhæves af dets CSP. Hoved-SPA'ens tilsigtede destinationer ligger fast i kode og konfiguration og afprøves af browser- og integrationstjek; Subresource Integrity er ikke en kontrol af netværksdestinationer.

Embeddet henter lagrede bytes gennem de tilladte qub-/lager-origins, pakker private payloads ud i browseren med K fra sit URL-fragment og henter rundesignaturer til afsløringstidspunktet fra de to tilladte drand-origins. Hoved-SPA'en bruger fallback-sættet med fire endpoints i config/drand-endpoints.json (drand.cloudflare.com, api.drand.sh, api2.drand.sh og api3.drand.sh), så et udfald af ét endpoint ikke blokerer afsløring. Embed-CSP'en afviser forbindelser uden for sin udtrykkelige liste.


5. Server-side infrastruktur

5.1 Serverløs edge

Vores API kører helt på en administreret serverløs runtime ved edge. Der er ingen VM'er, ingen containere og ingen vedvarende serverprocesser, vi administrerer. Dette reducerer dramatisk den angrebsoverflade, vi er ansvarlige for: vi kører ikke et OS, en webserver eller en applikations-runtime, vi skal patche.

En separat public-CORS middleware anvendes Access-Control-Allow-Origin: * til den følgende implementerede sti-sæt: /embed.js, /embed/v1.js, alt under /embed/; /api/v1/telemetry; /api/v1/openapi.json; alt under /api/v1/qub/ (inklusive bytes, metadata, bevis, engagement, underret, og push-underveje); alt under /api/v1/log/; offentlige håndtag opslag under /api/v1/handle/; og offentlig avatar læser under /api/v1/identity/avatar/. Dets preflight-tilladelser GET, POST, og OPTIONS med Content-Type anmodningshoved. Denne præfiksbaserede overflade er bredere end kun de kald, som embed i øjeblikket foretager, så hver handler under disse præfikser skal fortsat håndhæve sin egen validering, autentificering, grænser for forespørgsler og misbrugsstyring. Andre API-stier beholder den qub.social-begrænsede CORS-politik.

5.2 Lagring

Browserens standardbeskedflow opbevarer ikke klartekst på qub-infrastruktur. Builder-/api/v1/seal håndterer klartekst og K i hukommelsen, men opbevarer ingen af delene. Faseinddeling af pagter opbevarer nødvendigvis den signerede strukturerede pagt, indtil den medunderskrives, trækkes tilbage eller udløber. Tilvalgt genoprettelse opbevarer en leveringskapabilitet (det fulde link med fragment), så den senere kan genoprettes. Derfor beskriver vi ikke hele lagringstien som »kun metadata«.

5.3 Hemmeligheder

Hemmeligheder (signerings-wallets, udbydertokens og HMAC-nøgler) leveres gennem platformens secret-/miljøbindingsmekanismer i stedet for kildekontrol. Runtime-komponenter modtager kun de bindinger, de har brug for. Procedurer for rotation og overlapning er komponentspecifikke; vi hævder ikke, at der findes én universel automatisk eller revideret rotationsmekanisme.

5.4 Logning og telemetri

Strukturerede JSON-logs skrives ved hver API-anmodning med et korrelations-ID overfladiseret i X-Request-Id-svarheaderen. Klient-telemetri er anonym — ingen enhedsidentifikator, ingen IP-adresse, ingen indholdsforhåndsvisning. Begivenheder bufres i hukommelsen og flushes på best-effort-basis; en mislykket flush kastes, ikke genforsøgt. Telemetri er designet til at kunne deaktiveres på netværkslaget uden at påvirke produktet.


6. Godkendelse

6.1 Magic-link-login

Login bruger et engangs-, HMAC-signeret token leveret til din e-mail-indbakke. Linket er gyldigt i 15 minutter, og indløsningen kræves atomisk, så samtidig eller genafspillet brug afvises sikkert. Når det lykkes, modtager browseren en uigennemsigtig __Host-qub_session-cookie med attributterne Secure, HttpOnly, SameSite=Strict og Path=/.

Sessioner har en grænse på 30 dages inaktivitet og en absolut grænse på 90 dage, roteres efter 24 timer og accepterer kun den umiddelbart foregående generation i en 120-sekunders henstandsperiode for mistede svar. Følsomme kontoændringer kræver godkendelse inden for de foregående 10 minutter. HMAC-signeringshemmeligheden er en platformsbinding; en isoleret læseadgang til metadata kan ikke i sig selv udstede et gyldigt token.

6.2 API-nøgler (udvikler-tier)

Udvikler-API-nøgler bruger præfikset qub_sk_ for nem genkendelse og grepability. Hver nøgle:

Admin-nøglehåndteringens endpoints er gated bag en separat admin-legitimering.

6.3 E-mail-attestering (forfatter-signering)

Binding af en e-mailadresse til en signeringsnøgle kræver:

  1. Besiddelse af den private signeringsnøgle (du signerer en udfordring)
  2. Besiddelse af e-mail-indbakken (du indtaster en 6-cifret kode leveret via e-mail)

Begge alene er utilstrækkelige. Tilbagekaldelse er en signeret optegnelse på din egen konto og træder i kraft øjeblikkeligt; læsere, der henter attesteringen, ser den tilbagekaldte tilstand og viser tilsvarende.


7. Betalinger

Kortindtastning og -behandling foregår i Stripes hostede checkout. Vi modtager aldrig kortnumre, udløbsdatoer eller CVC'er. Vi opbevarer Stripe-kunde- og abonnementsidentifikatorer, abonnementsstatus og periodedata i berettigelses-/API-nøgleoptegnelser, så adgang, fornyelser, måling, opsigelser og refusioner kan afstemmes. Stripes privatlivs- og sikkerhedserklæringer regulerer deres håndtering af betalingsdata.

Forseglings-endpointet krydstjekker berettigelses-optegnelsen mod enhedsidentifikatoren og, for loggede-ind-brugere, mod den tilknyttede identitet. En berettigelse kan ikke genbruges på tværs af enheder, uden at brugeren eksplicit gendanner den via magic-link-login.


8. Misbrugsmodstand

8.1 Botdetektion

Forseglingsflowet er gated af et privatlivs-bevarende CAPTCHA-alternativ, der ikke bruger cookies til sporing og ikke fingeraftrykker til reklame. En mislykket udfordring afvises af vores edge-Worker, før nogen forseglings-side-behandling sker.

8.2 Rate-limiting

Rate-limits håndhæves i flere lag:

Tællere og atomiske krav fordeles mellem KV, Durable Objects og platformens rate-limit-bindinger efter endpointets konsistenskrav. Rate-begrænsede anmodninger returnerer 429; endpoints, der kan beregne et nyt forsøgsinterval, medtager Retry-After.

8.3 Indholdsmoderation

Standardbrowser-upload-ruten kan ikke scanne kroppen: den modtager kun det klient-forseglede artefakt. Byggeren /api/v1/seal ruten ser klartekst midlertidigt, og aftalestaging holder strukturerede vilkår indtil færdiggørelse, men de tillid undtagelser gør ikke den generelle byte-blinde uploadsti til en indholdsscanner. Operationel moderation er en afvise liste på brugerlagsniveau: en afvist qub nægtes af vores viewer uanset, om den gemte payload stadig er tilgængelig. Afvisning fjerner ikke holdbare bytes, poster i gennemsigtighedslog eller permanentnetværksdata, der allerede er offentliggjort.

Misbrugsrapporter rate-limites ved hjælp af et envejs-hash af rapportørens IP; vi gemmer ikke IP'er i klartekst til dette formål.


9. Forsyningskæde og build-integritet

9.1 Toolchain-pinning

Compiler- og runtime-versioner fastgøres i repository-konfigurationen, og afhængigheder opløses gennem committede lockfiles. CI kontrollerer, at genererede filer er opdaterede, og at reproducerbarhedsfølsomme invarianter overholdes. Vi fremsætter ikke den stærkere påstand, at ethvert rent build er bit for bit identisk på alle understøttede maskiner.

9.2 Lints og statisk analyse

Workspacen aktiverer vores strengeste lint-grupper på deny-niveauet. CI behandler hver advarsel — inklusive dokumentationslink-advarsler — som et build-svigt. Dette er bevidst: vi bruger lint-strengheden som en snubletråd for subtile regressioner.

9.3 CI-porte

CI-workflowet dækker formatering og strenge lints; Rust-, WASM-/browser-, Worker-, embed- og API-tests; typekontrol; codedækning; mutations-/invariantkontroller; statisk analyse af afhængigheder og workflows; i18n-nøgler, -dækning, -drift og kontrol af fjendtlige kodepunkter; aktualitet af genererede dokumenter, API'er og vidensbase; dokumentinventar og interne linkkontroller; stylesheet- og bundtbudgetter samt OpenAPI-validering. Nogle dyre mutationsjobs er planlagte i stedet for at køre ved hvert push.

En enkelt påkrævet samlet ci-status forbliver rød, hvis et påkrævet job fejler. Workflows for beskyttede grene og deploy bruger dette resultat i stedet for at duplikere en mindre sikkerhedsport.

9.4 Mutationstest

Et ugentligt job kører mutationstest mod de sikkerhedskritiske rene moduler: hashing, kanonisk CBOR, seal, unlock, wire-format-newtypes, protokol-type-validatorer og handle-namespace. Mutationstest besvarer "fanger vores test-suite subtilt forkert kode?" — hvis en muteret implementering stadig består alle tests, ved vi, at vi har et test-coverage-hul og adresserer det.

9.5 Git-hooks

Lokale hooks (pre-commit, pre-push) spejler CI-portene, så regressioner fanges, før de forlader udviklerens maskine. Hooks installeres via et repo-script; de bypasses ikke i vores workflow, og CI er den autoritative port, hvis de springes over.


10. Test

Sikkerhedskritisk kode bærer tre slags tests:


11. Branch- og release-hygiejne

Featuregrene fremmer kun staging gennem en Gate 1-pull request: påkrævet grøn ci, ingen uløste ændringsanmodninger, ingen mergekonflikt og et rent gennemgået træ; mergingen bruger squash, og grenen slettes. main fremmes kun gennem Gate 2-pull requesten staging → main og bevarer afstamningen med en mergecommit. Direkte push til grenene er ikke release-workflowet.

Staging- og produktionsdeploys udløses fra tilstanden på de tilsvarende beskyttede grene staging og main efter CI. Pull request-kode og legitimationsoplysninger fra forks modtager ikke deploy-hemmeligheder.

Hemmeligheder brugt i deploy-workflows er afgrænset til deploy-miljøet af vores CI-platform. De er ikke tilgængelige for pull-request-workflows fra forks.


12. Koordineret offentliggørelse

Hvis du tror, du har fundet en sikkerhedssårbarhed i qub, vil vi gerne høre om det hurtigt, og vi forpligter os til at håndtere rapporten professionelt.

Vi bekræfter modtagelse inden for tre hverdage og holder dig informeret, mens vi undersøger. Med dit samtykke krediterer vi rapportører i release-notater.

12.1 Safe Harbor

Hvis din forskning følger reglerne ovenfor (god-tros-undersøgelse, ingen skade på andre brugere eller tjenesten, rimeligt offentliggørelsesvindue), forfølger vi ikke retlige skridt mod dig, og vi vil ikke bede retshåndhævelse om det. Vi behandler dit arbejde som autoriseret testning, og vi vil hellere have, at du finder fejlen, end at nogen anden gør det.

Denne Safe Harbor gælder for:

Den gælder ikke for social engineering af qub-teammedlemmer, denial-of-service-tests eller adgang til andre brugeres data ud over det, der er nødvendigt for at demonstrere problemet. Hvis du er i tvivl om, hvorvidt noget falder inden for Safe Harbor, så spørg først ved hjælp af samme [SECURITY]-emnepræfiks.


13. Ærlige begrænsninger

Sikkerhed er en praksis, ikke en tilstand. Nogle begrænsninger er værd at nævne direkte:


14. Ændringer af denne side

Væsentlige ændringer noteres ved at opdatere ikrafttrædelsesdatoen øverst. Hvor en ændring afspejler en konkret sikkerhedsforbedring, beskriver vi den kort i det offentlige ændringslog. Hvor en ændring afspejler en politisk afklaring, beskriver vi, hvad der ændrede sig, og hvorfor.

For spørgsmål om noget på denne side, send e-mail til support@qub.social med emnepræfikset [SECURITY].


15. Ændringslog

Version Ikrafttrædelsesdato Sammendrag
1.1 23. september 2026 Afstemte kryptografiske påstande, leveringsformer, lagring, CSP, sessioner, API-nøgler, betalinger, CI og release-workflow med det implementerede system.
1.0 2. maj 2026 Indledende offentliggørelse.