Skip to main content

Feature Flags

Manage feature flags to control feature availability across the platform.

Overview​

Feature flags let administrators globally enable or disable features without redeploying. They are used as kill-switches for platforms, widgets, integrations, features, bot modules, automation actions, copyright providers, event types, and system-level controls.

Managing Flags​

Access feature flag management via Admin > Feature Flags (/feature-flags). The page renders:

  • A search box filtering on label and key.
  • An "{enabled} of {total} enabled" summary.
  • One tab per category, each with an enabled/total badge. Only categories that actually contain flags get a tab.
  • Inside a tab, one row per flag showing its label, its key in monospace, and a switch.

Toggling a switch immediately persists the change via PATCH /v1/admin/feature-flags/{id} (GraphQL adminUpdateFeatureFlag).

The switch is rendered behind a feature-flags:edit gate - admins holding only feature-flags:read see a plain On / Off label instead of a control. The API itself enforces features:edit on the write and features:read on the read, so an admin needs both feature-flags:edit (to see the switch) and features:edit (for the call to succeed).

Categories​

The admin UI orders category tabs like this:

  1. platform
  2. feature
  3. widget
  4. integration
  5. bot_module
  6. automation
  7. copyright_provider
  8. event
  9. system

Categories are derived from the flags actually returned, so a category with no flags gets no tab. automation, copyright_provider, and event are reserved category names in that ordering - no flag is seeded into them today.

Flag Reference​

system category​

System flags are admin-scope, user-scope flags that apply to the platform as a whole rather than to individual accounts.

KeyLabelDescription
system:account_creationAccount CreationControls whether users may create new streaming accounts. When disabled globally, all users are blocked from creating accounts. Per-user overrides (see Users) can grant or deny individual users regardless of the global setting.
system:copyright_public_directoryPublic Copyright DirectoryKill-switch for the unauthenticated /music surface on the marketing site (landing page, song browser, playlists, detail pages, reports). When off, the /music link disappears from header + footer and every page under /music/* returns 404. The account-level Copyright Manager flag (feature:copyright_detection) is unaffected.
system:copyright_public_quick_checkPublic Copyright Quick CheckNarrower kill-switch for just the inline paste-a-URL quick-check widget on /music. The rest of the directory stays live when this is off. Typically used for rollout or to shed API load.
system:ideas_hubIdeas HubMaster switch for the Ideas Hub, including the admin moderation surfaces.
system:ideas_hub_publicIdeas Hub (Public)Controls whether the Ideas Hub is reachable without authentication.
feature:extension_developmentExtension DevelopmentSeeded in the system category despite the feature: key prefix. Gates the extension developer surfaces.

feature category​

Feature flags gate individual dashboard pages and major feature areas.

Turning a feature:* flag off - globally, per plan, or per account - removes the sidebar entry and closes the route. Every page under the feature's URL prefix (a deep link such as /dashboard/widgets/{id}/designer, not just /dashboard/widgets) then renders the "feature unavailable" page naming the layer that disabled it, and the API rejects the matching requests.

KeyLabelDescription
feature:botsBot ControlChat bot sections of the Connections group (settings window)
feature:bot_modulesBot ModulesBot Modules configuration page
feature:bot_commandsBot CommandsBot Commands management page
feature:musicMusicMusic feature (player page + popout, Spotify polling worker, track events, REST/GraphQL controls). Gates the entire music stack. The overlay widget and the {song} bot variable are gated separately by widget:spotify_now_playing.
feature:connectionsConnectionsConnections page umbrella - disabling hides the entire Connections section
feature:multichatMultichatCross-platform combined chat
feature:automationAutomation EngineAutomation builder and execution
feature:copyright_detectionCopyright ManagerAccount-level song lists, status lookups, reports, and moderation; no background copyright check runs
feature:streamelementsStreamElementsStreamElements tip ingestion
feature:obs_remoteOBS RemoteOBS WebSocket remote control feature - gates the OBS integration dashboard page and all OBS config endpoints
feature:advanced_overlaysAdvanced OverlaysAdvanced overlay builder features (e.g. multi-plan-only widget library, custom CSS)
feature:overlay_foldersOverlay FoldersFolder organisation in the overlay list
feature:overlay_accessOverlay Access ControlPer-overlay access restrictions
feature:overlay_sharingOverlay Shared LinksShared overlay links
feature:custom_botCustom Bot AccountAllows the account to register a custom bot identity per platform instead of using the shared Lumio bot
feature:multi_accountMulti-AccountOwning more than one streaming account
feature:extensionsExtensionsThe extension platform
feature:extension_paidPaid ExtensionsPaid extension purchases
feature:widgetsWidget GalleryThe widget gallery
feature:soundsSound UploadsSound uploads for extensions

Whether a flag is on for a given plan is a separate, per-plan decision made in the Plans Feature Grid - the flag here is the global kill-switch only.

widget category​

Widget flags gate overlay widgets that render inside a broadcast overlay.

KeyLabelDescription
widget:obs_browser_sourceOBS Browser SourceOBS Browser Source widget - overlay element that renders in OBS via browser source
widget:spotify_now_playingSpotify Now PlayingGates the Spotify Now Playing overlay widget and the {song} chat-bot variable (both surfaces that embed "now playing" data in a broadcast). Does not gate the music player, popout, worker, or API controls - those live behind feature:music.
widget:chat_boxChat BoxChat Box overlay widget
widget:event_listEvent ListEvent List overlay widget
widget:sub_goalSub GoalSub Goal overlay widget
widget:viewer_countViewer CountViewer Count overlay widget
widget:stream_uptimeStream UptimeStream Uptime overlay widget

integration category​

Integration flags gate third-party tool integrations displayed in the Connections integrations modal.

KeyLabelDescription
integration:shopifyShopifyShopify e-commerce integration. Shopify is registered as an integration-only platform, so it does not appear on the Providers page.
integration:obs_websocketOBS WebSocketOBS WebSocket integration entry in the integrations modal - must be enabled for users to save or delete OBS connection settings
integration:streamerbotStreamer.botStreamer.bot integration

platform category​

One master flag per platform (platform:twitch, platform:youtube, platform:kick, platform:discord, platform:spotify) plus :login / :channel / :bot sub-flags for the connection types each platform supports. These are what the Providers page toggles.

bot_module category​

bot_module:link_protection, bot_module:spam_protection, bot_module:word_filter, bot_module:timed_messages, and feature:bot_module_extensions (seeded into the bot_module category despite the feature: key prefix).

Flag Taxonomy Rules​

Use the correct category when adding new flags:

CategoryUse for
feature:*Dashboard pages and major feature areas
widget:*Overlay widgets only (things that render inside a broadcast overlay)
integration:*Third-party integrations in the integrations modal
platform:{x} / platform:{x}:{type}Streaming platforms (Twitch, YouTube, Kick, Discord) - master switch + login/channel/bot sub-flags
system:*Admin-scope system switches with user-scope resolution (e.g., system:account_creation)
bot_module:*Individual bot moderation modules (link protection, spam protection, etc.)

Resolution Chain​

Flag resolution differs by scope:

Account-scope flags (feature:*, widget:*, integration:*, platform:*, bot_module:*):

  1. GLOBAL_OFF - the flag is disabled globally (admin kill-switch). Stops here.
  2. PLAN_LOCKED - the flag requires a plan the account does not have.
  3. ACCOUNT_OVERRIDE - an explicit per-account override set by an admin.
  4. Enabled (no reason set).

User-scope flags (system:account_creation):

  1. USER_OVERRIDE - the user has an explicit per-user override (allow or deny). Stops here.
  2. GLOBAL_OFF - the global flag is disabled. Stops here.
  3. Enabled (no reason set).

The reason field on FeatureStatus reflects the first layer that returned enabled=false. When a flag is enabled the reason field is null.

Permissions​

  • feature-flags:read - the admin page and sidebar entry
  • feature-flags:edit - renders the toggle switch in the admin UI
  • features:read - the API read (adminFeatureFlags, adminFeatureFlagsDetail, GET /v1/admin/feature-flags)
  • features:edit - the API write (adminUpdateFeatureFlag, adminUpdateFeatureFlagDetail, PATCH /v1/admin/feature-flags/{id})

An admin who is meant to flip flags needs feature-flags:read + feature-flags:edit for the UI and features:read + features:edit for the API calls behind it.

The dashboard entry itself is gated on admin:access. System admins (is_system: true) implicitly receive all admin permissions.

API​

UI actionGraphQLREST
List flagsadminFeatureFlagsGET /v1/admin/feature-flags
List flags with detail (description, default_for_accounts)adminFeatureFlagsDetailGET /v1/admin/feature-flags/detail
Toggle a flagadminUpdateFeatureFlagPATCH /v1/admin/feature-flags/{id}
Update flag detailadminUpdateFeatureFlagDetailPUT /v1/admin/feature-flags/{id}/detail