Feature flags
Two layers, not one. A superadmin grants which features a tenant is allowed to use at all - platform entitlements, managed from the Tenants page's "Flags" dialog on each tenant's row, covered on this page. A tenant admin then separately turns granted features on for their own workspace, on their own Feature settings page - a granted-but-not-yet-turned-on feature stays off by default, same as an ungranted one, just without the "ask your platform administrator" message.
What's configurable
Enable AI features
Off by default for every tenant. Controls whether that tenant's instructors can use AI-assisted authoring in the Course Builder Studio - generating lesson content and diagrams from a prompt. When off, those entry points don't appear in the Studio at all (no disabled/grayed-out state); the backend also rejects the underlying API calls, so this can't be bypassed from the client.
Knowledge base
A family of flags gating the RAG pipeline (see Knowledge base & Ask about this course), each off by default:
- Documents in knowledge base - whether instructors can upload new course documents for ingestion. Turning this off only blocks new uploads; already-uploaded documents stay listable/previewable/ deletable.
- Knowledge base for generation - whether the AI content-generation routes (lesson content, diagrams, exam questions, etc.) retrieve course material to ground their output. Not a hard gate like the other two - with this off, generation still works, it just never gets course-material grounding.
- Learner Q&A - whether the "Ask about this course" widget's backend route is reachable at all. The widget itself also checks this flag client-side and renders nothing when it's off, but that's a UX nicety - the route enforces it regardless.
Learners read published versions
Off by default. A single flag, not a family like Knowledge base -
there is no tenant-admin opt-in layer under it. When on, a member's
course/module/lesson/exam reads (and lesson completion, progress, and
practice-answer saves) come from the last published version rather
than the working copy an instructor may still be editing; an
instructor's own reads are unaffected (they always see the working
copy, plus a ?view=published toggle in the Studio to preview what
learners see). See Course Builder Studio
for what publishing means with this on, and docs/ADR.md's ADR-074 for
the full design. Off, a tenant's published courses behave exactly as
before this feature existed - an edit reaches learners the moment it's
saved.
Enable social login
Off by default. Lets a tenant admin choose which social login buttons
(Google, Apple - the only two the platform currently supports) their
own members see on the mobile app's sign-in screen, from their own
Feature settings page. Cosmetic gating only -
it decides which buttons render, not which sign-ins Cognito itself
will accept (see docs/ADR.md's ADR-058). See Signing
in for what a member
actually sees.
How it's stored
Tenant flags live in one JSONB column (tenants.flags), the same
storage shape branding uses - a free-form dict validated only at the
API boundary, not a column per flag. Adding a new flag later needs no
schema change, just a new key.