Companies involved
Running this portal means other companies handle some of the data. This is the complete list as the code has it — not a general policy about which vendors might be used, but which ones this system actually talks to.
Three of them are optional and switch on only when they are configured. The status column reports what is switched on in the deployment you are reading this from, checked as the page loads rather than written down in advance.
Vercel
Always in useRuns the application. Every page you open and every action you take passes through it.
The deployment target — vercel.json, and the platform the app is built for.
The Postgres database (Supabase)
Always in useStores every record described on the “Your data” page. This is the system's single store of record.
The app connects to Postgres through Drizzle. That it is Supabase specifically comes from the project's own configuration, not from the code.
Vercel Blob
Not configured hereHolds the contents of files you upload. The storage path contains the uploading account's id. Links are unguessable but are served without a further sign-in check.
src/lib/attachments.ts picks this store only when a storage token is configured; without one, file contents are kept inside the database instead.
Microsoft Entra ID
In use hereSigns you in, and supplies your work email address, display name and tenant identifier. The portal never holds your corporate password.
src/auth.ts registers this sign-in provider only when its settings are present.
Resend
Not configured hereSends email — the recipient address and the full message text. It is the only delivery provider in the code.
src/lib/email/provider.ts. With no API key configured, messages are still composed and logged, but nothing leaves the system.
YouTube and Vimeo
Always in useNothing is sent to them by the portal. But opening a learning resource that has an embedded video makes your own browser contact that host, which is how any embedded video works.
src/lib/embed-hosts.ts — these two are the only outside origins this app may place in a frame, and the security headers enforce it.
What this list does not tell you
- Where the servers physically are. That depends on settings held in the hosting accounts, which this code cannot read. Naming a country here would be a guess.
- The paperwork behind each company — whether a processing agreement is signed, or whether any of them holds a certification. The application can see that a service is wired in. It cannot see a contract.
- Anyone further down the chain. These companies use suppliers of their own; that is between them and their own published information.
If you need any of those answers, ask your program administrator. They come from the organisation, not from this software.

