> ## Documentation Index
> Fetch the complete documentation index at: https://supastack.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For the full documentation corpus in one file, fetch: https://supastack.dev/llms-full.txt

# De resterende providersleutels verzamelen

Korte walkthroughs voor de diensten die overblijven: AI-providers, Trigger.dev, S3-opslag, Sentry of PostHog, Turnstile en uw domein.

## Hoe deze pagina te gebruiken

Elke sectie hieronder is één complete setup-walkthrough: maak het account, vind de sleutel, stel de env-namen in, verifieer. Neem alleen de secties voor diensten die uw product shippt — een site zonder AI-features heeft de eerste nooit nodig, en de kit blijft draaien met elke sectie hier overgeslagen.

Dezelfde geheimregels als overal: API-sleutels en webhookgeheimen blijven server-only, alleen waarden met het voorvoegsel `NEXT_PUBLIC_`/`EXPO_PUBLIC_` mogen de client bereiken, productiegeheimen leven in de geheimopslag van de host, en de devserver leest env pas opnieuw bij een herstart.

[Terug naar de accountchecklist](https://supastack.dev/nl/docs/web/external-accounts.md)


## AI-providersleutels

De `AI_PROVIDER` van de kit accepteert `openai`, `anthropic`, `openai-compatible` en `openrouter` — plus `fake`, de standaard lokale stand-in. Kies er een; de providersleutel is het enige benodigde account, want model-id's en prijzen komen uit de databasecatalogus van de kit, niet uit env-variabelen.

OpenAI: [platform.openai.com](https://platform.openai.com) → API keys → Create new secret key → kopieer `sk-…` → `OPENAI_API_KEY`. Anthropic: [console.anthropic.com](https://console.anthropic.com) → API Keys → Create Key → `sk-ant-…` → `ANTHROPIC_API_KEY`. Beiden factureren per token — een paar dollar krediet dekt ontwikkeling.

OpenRouter routeert elk catalogusmodel via één sleutel: [openrouter.ai](https://openrouter.ai) → Keys → Create Key → `sk-or-…` → `AI_PROVIDER=openrouter` plus `OPENROUTER_API_KEY`; optionele `OPENROUTER_APP_NAME`/`OPENROUTER_SITE_URL` sturen attributieheaders. `openai-compatible` dekt elk OpenAI-vormig endpoint: `OPENAI_COMPATIBLE_API_KEY` plus `OPENAI_COMPATIBLE_BASE_URL`.

Verifieer: herstart, voer één AI-taak uit en verwacht een echt modelantwoord in plaats van de deterministische nep. Een opstartfout die de sleutel noemt betekent dat de providervlag aan staat zonder zijn sleutel. Een echt antwoord heeft ook `JOB_PROVIDER=trigger` uit de Trigger.dev-sectie hieronder nodig plus één ingeschakeld model in de catalogus van de kit — [AI instellen](https://supastack.dev/nl/docs/web/setup-ai.md) behandelt die setup.

```
# apps/web/.env.local — pick ONE provider
AI_PROVIDER=openai
OPENAI_API_KEY=sk-…

# or AI_PROVIDER=anthropic
# ANTHROPIC_API_KEY=sk-ant-…

# or AI_PROVIDER=openrouter
# OPENROUTER_API_KEY=sk-or-…

# or AI_PROVIDER=openai-compatible
# OPENAI_COMPATIBLE_API_KEY=…
# OPENAI_COMPATIBLE_BASE_URL=https://your-endpoint/v1
```


## Trigger.dev

Sla over tenzij het product echte achtergrondtaakruns nodig heeft — `JOB_PROVIDER=local` plaatst jobs in de wachtrij in het geheugen zonder ze uit te voeren, wat goed is voor ontwikkeling.

1. Open [app.trigger.dev](https://app.trigger.dev) → meld u aan → maak een project.

2. Kopieer twee waarden: de project-ref `proj_…` uit de settings van het project of de dashboard-URL → `TRIGGER_PROJECT_REF`, en de geheime sleutel van de API keys-pagina van het project (`tr_dev_…` voor de dev-omgeving, `tr_prod_…` voor productie) → `TRIGGER_SECRET_KEY`. Beiden blijven server-only.

3. De taken van de kit leven al in `apps/web/trigger` en `apps/web/trigger.config.ts` leest `TRIGGER_PROJECT_REF`. Voer vanuit `apps/web` `npx trigger.dev@latest dev` uit — het registreert de taken bij uw project en voert ze lokaal uit tegen de dev-sleutel.

Verifieer: het dev-commando logt de geregistreerde taken; zet er een in de wachtrij in de app en zie het uitvoeren in de Runs-lijst van het dashboard. Gedeployde omgevingen voeren `corepack pnpm --filter @supastack/web trigger:deploy` uit om de taakset te publiceren.

```
# apps/web/.env.local
JOB_PROVIDER=trigger
TRIGGER_PROJECT_REF=proj_…
TRIGGER_SECRET_KEY=tr_dev_…   # tr_prod_… in production

# run the worker alongside the app, from apps/web:
cd apps/web
npx trigger.dev@latest dev
```


## S3-compatibele opslag (Cloudflare R2)

Sla over tenzij het product bestanden opslaat — `STORAGE_PROVIDER=memory` houdt uploads in-proces voor ontwikkeling.

Elke S3-compatibele bucket werkt; Cloudflare R2 is de gratis-tier-vriendelijke keuze. 1. Open [dash.cloudflare.com](https://dash.cloudflare.com) → R2 Object Storage → Create bucket, geef het een naam en behoud de standaard locatiehint.

2. Open terug op het R2-overzicht Manage R2 API Tokens → Create API token → permissie Object Read & Write, gescoped naar die bucket → Create. Kopieer de Access Key ID, de Secret Access Key en het getoonde S3-endpoint — `https://<account-id>.r2.cloudflarestorage.com`.

3. Stel de env-namen hieronder in. `STORAGE_REGION=auto` is de R2-conventie — de kit gebruikt standaard `us-east-1`, wat R2 ook accepteert. `STORAGE_FORCE_PATH_STYLE` staat standaard al aan voor custom endpoints, wat R2 wil. Publieke bestanden serveren heeft bovendien `STORAGE_PUBLIC_BASE_URL` of CDN-bedrading nodig; private bestanden hebben niets meer nodig.

Verifieer: herstart en upload via de app — het object verschijnt in de R2-bucketbrowser. Een signature- of 403-fout betekent dat het token geen object read/write op die bucket heeft; maak een vers token dat correct gescoped is.

```
# apps/web/.env.local
STORAGE_PROVIDER=s3
STORAGE_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com
STORAGE_REGION=auto
STORAGE_BUCKET=your-bucket
STORAGE_ACCESS_KEY_ID=…          # server-only
STORAGE_SECRET_ACCESS_KEY=…      # server-only
# STORAGE_PUBLIC_BASE_URL=       # optional public-URL base
```


## Sentry of PostHog (optioneel)

Volledig optioneel: elke observability-waarde is standaard unset en de kit draait prima zonder — voeg dit toe wanneer u foutrapporten en analytics in productie wilt.

Sentry voor fouten: [sentry.io](https://sentry.io) → maak een project → kies het Next.js-platform → het setupscherm toont de DSN `https://…@….ingest.sentry.io/…` → `SENTRY_DSN`. Exceptions bereiken dan Sentry getagd met correlation-id's; de gratis tier is genoeg om te beginnen.

PostHog voor productanalytics in plaats daarvan: [posthog.com](https://posthog.com) → maak een project → kopieer de project-API-sleutel `phc_…` → `NEXT_PUBLIC_POSTHOG_KEY` plus `NEXT_PUBLIC_POSTHOG_HOST` (`https://us.i.posthog.com`, of uw EU-host). Die twee zijn by design publieke browserwaarden; `SENTRY_DSN` blijft server-side. `ALERT_WEBHOOK_URL` post optioneel faal-meldingen naar een Slack-compatibel endpoint.

Verifieer: herstart, veroorzaak een testexception (of speel Sentry's sample-event af) en bevestig dat het in de Issues-lijst van het project landt.

```
# apps/web/.env.local — all optional
SENTRY_DSN=https://…@….ingest.sentry.io/…

NEXT_PUBLIC_POSTHOG_KEY=phc_…
NEXT_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com

# ALERT_WEBHOOK_URL=https://hooks.slack.com/services/…
```


## Cloudflare Turnstile

Botbescherming voor de publieke formulieren en credential-endpoints — `CAPTCHA_PROVIDER=off` is standaard, dus voeg het toe voordat u registratie voor vreemden opent. Gratis.

1. Open [dash.cloudflare.com](https://dash.cloudflare.com) → Turnstile → Add widget → geef het een naam en vermeld de hostnamen: `localhost` voor ontwikkeling plus uw echte domein → Create.

2. Kopieer beide waarden: de Site Key — publiek by design, hij rendert in het widget → `NEXT_PUBLIC_TURNSTILE_SITE_KEY` — en de Secret Key, die de server gebruikt om te verifiëren → `TURNSTILE_SECRET_KEY`.

3. `CAPTCHA_PROVIDER=turnstile` schakelt het in; het opstarten faalt met de naam van welke sleutel ook ontbreekt. De captcha-gids somt exact op welke oppervlakken het widget beschermt.

Verifieer: open `/auth` of het contactformulier — het widget rendert; inzendingen zonder opgeloste uitdaging worden geweigerd. Als het widget nooit laadt, staat de hostnaam die u bekijkt niet op de lijst van het widget.

[Zie welke formulieren Turnstile beschermt](https://supastack.dev/nl/docs/web/captcha.md)

```
# apps/web/.env.local
CAPTCHA_PROVIDER=turnstile
NEXT_PUBLIC_TURNSTILE_SITE_KEY=0x…   # public by design
TURNSTILE_SECRET_KEY=0x…             # server-only
```


## Een eigen domein

Eén aankoop bij elke registrar — Cloudflare Registrar, Porkbun, Namecheap werken allemaal. Niets hiervan kopieert naar env; het domein verschijnt in de Services ID, Resend-DNS, Turnstile-hostnamen en OAuth-return-URL's die u onderweg heeft geconfigureerd.

Twee manieren om het naar de app te wijzen: voor Cloud Run gebruikt u de domeinmapping in de deploymentgids — een paar consoleklikken plus de DNS-records die Google opsomt. Of verplaats DNS naar Cloudflare-nameservers (de registrar wisselt twee records) — optioneel, maar ook de nette manier om R2-publieke buckets en Turnstile-hostnamen op één plek te beheren.

[Het domein mappen op Cloud Run](https://supastack.dev/nl/docs/web/deploy-google-cloud.md)

[Stel daarna de database in](https://supastack.dev/nl/docs/web/setup-database.md)


Wil je verdergaan met de configuratie? Lees [Database instellen](https://supastack.dev/nl/docs/web/setup-database.md).


## Volgende

[Database instellen](https://supastack.dev/nl/docs/web/setup-database.md)
