Platform admin
Connector credentials (Google, Notion, Slack…)
Credentials for the connector integrations — Google
(Drive / Docs / Sheets), Notion, Slack,
Qdrant, and Browserless — are
configured from the admin UI at
Settings → System → Integrations → Connector credentials.
They are stored encrypted in the database and layered
over config/services.php at boot, so you can connect (and
rotate) them without touching .env or redeploying.
How it works
Each value is held on the single app_settings row and
merged into config('services.*') by
AppSettingsOverrideServiceProvider — a non-empty DB value
wins over the .env default. Secrets (OAuth client secrets,
the Slack bot token, the Qdrant API key, the Browserless token) use
Laravel's encrypted cast, so the database never holds
plaintext. The form never sends a stored secret back to the browser —
it only reports whether one is set, and a blank field on save
keeps the existing value (type a new value to
replace it).
Connecting Google (Drive / Docs / Sheets)
- In the Google Cloud Console, create an OAuth client (type: Web application) with the read-only Drive / Docs / Sheets scopes.
- Add the Authorized redirect URI shown on the
connector form (it is your install's
/app/oauth/google/callbackURL). - Paste the Client ID and Client secret into the form and save. The redirect URI defaults to that callback, so you usually leave the override blank.
- A workspace owner can now connect their Google account from
/app/integrationsand add Google Doc / Sheet sources. The per-user access + refresh tokens are stored encrypted on the workspace'sIntegrationConnection(separate from these operator-level app credentials).
The others
- Notion — same shape as Google: client ID + secret,
redirect URI defaults to
/app/oauth/notion/callback. - Slack — the notifications bot token
(
xoxb-…). - Qdrant — cluster URL + API key (used when the vector provider is Qdrant rather than Cloudflare Vectorize).
- Browserless — URL + token for the crawler's headless-browser fallback.
The matching .env variables still work as a first-install
fallback, but anything set here overrides them — so once configured in
the UI, the DB is the source of truth.