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. Account-level copyright detection (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 ControlBot Control dashboard page
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 DetectionAccount-level copyright detection
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:trovo, 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, Trovo, 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