# trua på Netlify

Dette prosjektet bruker en statisk frontend og en server-side Netlify Function. Netlify Forms er fjernet. Påmeldinger sendes som JSON til `/api/submit-bio`, valideres på serveren, krypteres med AES-256-GCM og lagres i Netlify Blobs.

## Behandlingsflyt

1. Brukeren fyller ut e-post, by, kjønn, ukas bio og samtykker.
2. Nettleseren sender dataene over HTTPS til Netlify Function.
3. Funksjonen validerer feltene og avviser honeypot-/ugyldige innsendinger.
4. Matchingssignaler uten e-post sendes til xAI/Grok gjennom server-side API-kall. API-nøkkelen ligger aldri i nettleseren.
5. Hele profilen, inkludert e-post, krypteres med AES-256-GCM før den lagres i Netlify Blobs.
6. Det lagres en SHA-256-hash av den krypterte pakken. Dersom `AUDIT_CHAIN_WEBHOOK_URL` er konfigurert, kan bare denne hashverdien sendes til en ekstern revisjonskjede eller blokkjede. Personopplysninger og dekrypterbare nøkler skal aldri sendes til blokkjeden.

## Miljøvariabler i Netlify

| Variabel | Påkrevd | Beskrivelse |
|---|---:|---|
| `TRUA_ENCRYPTION_KEY` | Ja | Base64-kodet tilfeldig nøkkel på nøyaktig 32 byte. Lagres kun som hemmelig miljøvariabel. |
| `XAI_API_KEY` | For AI | API-nøkkel for den offisielle xAI/Grok-API-en. |
| `XAI_MODEL` | Nei | Modellnavn. Standard er `grok-4-1-fast-non-reasoning`; bekreft tilgjengelig modell i xAI-kontoen før produksjon. |
| `AUDIT_CHAIN_WEBHOOK_URL` | Nei | Server-endepunkt for anonym hash/revisjonsregistrering. |
| `AUDIT_CHAIN_SECRET` | Nei | Hemmelighet som sendes til revisjonsendepunktet. |

Generer krypteringsnøkkelen med `openssl rand -base64 32`. Nøkkelen må sikkerhetskopieres i en separat hemmelighetsbehandler. Mister man nøkkelen, kan ikke lagrede profiler dekrypteres. Bytt ikke nøkkelen uten en dokumentert nøkkelrotasjonsprosess.

## AI og personvern

AI-en skal bare motta nødvendige matchingssignaler: by, kjønn, studentfilter og bio. E-post og interne identifikatorer sendes ikke til modellen. I den nåværende flyten sendes bio-teksten til xAI for matching etter at brukeren har gitt eget AI-samtykke. Før produksjonssetting må xAIs databehandlerbetingelser, lagringstid, eventuell bruk til modelltrening, region og sletting dokumenteres og godkjennes.

Kryptering av lagring betyr at data krypteres før Netlify Blobs. Under transport brukes HTTPS/TLS. Når en AI-leverandør skal analysere tekst, må funksjonen dekryptere eller bruke den nylig innsendte teksten i minnet for å lage forespørselen. Dette er ikke det samme som ende-til-ende-kryptering mot AI-leverandøren. Hvis det kreves at ingen ekstern modell ser råtekst, må det bygges en lokal eller selvhostet modellflyt.

## Drift og videre arbeid

Netlify Blobs er valgt som enkel lagring for piloten. Før større lansering bør prosjektet få autentisert administrasjon, tilgangslogger uten persondata, rate limiting, e-postverifisering, slettingsjobb for sikkerhetskopier, nøkkelrotasjon, backup-/restore-prosedyre og en separat match-jobb som ikke eksponerer kandidatdata til klienten.

Det er ikke implementert en konkret blokkjedeintegrasjon i denne pakken. `AUDIT_CHAIN_WEBHOOK_URL` er et kontrollert grensesnitt for en senere integrasjon. Den eksterne mottakeren må dokumentere at den kun tar imot hash, hendelsestype og tidspunkt, og ikke logger request-body eller IP-adresser på en måte som kobler hash til en person.
