Supabase
There are three values: a project URL and anon key (both browser-safe, used by the runtime) and a service-role key (server-only, used by@firstflow/runtime-server).
The runtime takes plain strings you read them however your stack exposes env. The two browser-safe values must use your bundler’s client-env prefix so they reach the browser; the service-role key must never carry such a prefix.
AI provider
Needed only if you wrap an LLM client with@firstflow/runtime-server or use the intent classifier. The widget, experiences, persistence, resume, and triggers all run without any AI key.
FirstFlow reads no API key. It wraps an LLM client you construct, so the key comes from wherever you supply it there is no FIRSTFLOW-owned key variable. There are three ways to provide it:
- Provider default env
- Your own env name
- OpenAI-compatible endpoint
Each provider SDK reads its own conventional variable. Set it and construct
the client with no arguments:
ff.wrap(...) / createAIClient(...) returns a normal client FirstFlow only observes the calls, it never owns the credentials. See the Server SDK.
Where the rest of the config lives
Most of what other tools put in environment variables, FirstFlow puts in code, because there is no server reading a.env:
Linking the front-end and back-end
user.id ties a person’s experiences (front-end) to their LLM activity (server SDK) pass the same one to both. The server SDK also takes a conversationId/sessionId, an id your own chat code owns, to group a transcript; FirstflowProvider does not use it. See Identity & auth.