Skip to main content

Feature Flags

Manage feature flags to control feature availability across the platform.

Overview​

Feature flags control availability without redeploying. The feature, widget, integration, and bot_module categories use four release states. Other categories keep a global On/Off switch.

Managing Flags​

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

  • A search box filtering on label and key.
  • A summary of release states and the number of flags in each state.
  • One tab per category, each with an active/total badge. Only categories that actually contain flags get a tab.
  • Inside a tab, one row per flag showing its label and key. User-facing categories show release-state controls; other categories show an On/Off switch.

The On/Off switch saves through PATCH /v1/admin/feature-flags/\{id\} (adminUpdateFeatureFlag). Release-state controls save through PUT /v1/admin/feature-flags/\{id\}/state (adminSetFeatureState). Switching to or from Off, or leaving a live rollout, requires confirmation.

Write controls are rendered behind both feature-flags:edit and features:edit gates; otherwise the page shows read-only state. 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 report form /legal/abuse stays available, without its Song option. 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 plan includes a flag is a separate decision in the Plans Feature Grid. A plan cannot bypass the Off kill switch or an account that has not yet been reached by a rollout.

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.)

Release states and rollout​

The four release states apply only to flags in the feature, widget, integration, and bot_module categories:

StateAvailability
OffNobody. This is the global kill switch; it wins even over an account override set to On.
Overrides onlyOnly accounts with an explicit override set to On. New user-facing flags start here; existing flags retain their stored state.
RolloutAccounts with an On override, plus accounts already reached by the rollout whose plans include the feature. An Off override still blocks the feature.
OnThe account override wins over the plan setting, which wins over default_for_accounts.

To test with selected accounts, leave the flag in Overrides only and turn on an override in each account's Feature Overrides card. No plan edit is required. system: and platform: flags use their existing On/Off behavior.

Staged rollout​

Choose Rollout to schedule either Batch mode (accounts per batch, interval, start date/time) or Percent mode (increasing percentage stages at scheduled times). Choose all plans or selected plans. The dialog previews eligible accounts, steps and estimated completion. A reached account stays reached unless you roll back. Accounts created while a rollout runs can enter a later step.

The status shows reached/total accounts, current and total steps, the next step and an estimated end. You can edit future steps, pause, resume or roll back to an earlier batch/stage; rollback pauses the rollout. Leaving Rollout cancels the live rollout. After the final step, an all-plan rollout moves to On automatically. A selected-plan rollout is marked Completed and stays in Rollout; moving it to On would release the feature to other plans and requires an operator action.

Waiting time for new accounts​

A feature in Rollout or On may wait for a new account to reach a configured age (hours or days). An optional spread window assigns each account a stable release time across that window, avoiding a simultaneous unlock. The setting applies only to accounts created after it is saved. The release time is based on the channel/account creation time, not when a user joined. An On override bypasses the wait; an Off override still blocks access. The dashboard shows Not released yet and the scheduled availability date where known. The save dialog warns when a paid plan includes the feature, because paying accounts would wait for it.

Release notifications​

A rollout can enable Notify reached accounts. The release settings can enable Notify new accounts when the waiting time ends. Both switches require an English and German release text: a feature name (1–120 characters) and one sentence about what it does (1–500 characters). The editor previews the mail in both languages. Keep the text factual and specific to this feature; do not include prices, plan names, upgrade prompts, or other features. Rollout and waiting-time notices require the account to become eligible under its plan, without an explicit override.

For one account, the Feature Overrides confirmation offers Notify account when an operator switches an override ON. This is off by default and uses the same fixed notice. If no release text exists, it uses the flag label as the name and omits the feature description. A manual move of the global flag to On and automatic rollout completion do not send notices. Eligible recipients can turn this notification off in notification settings.

Resolution Chain​

Flag resolution differs by scope:

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

  1. Off returns GLOBAL_OFF for everyone, including On overrides.
  2. Overrides only requires an On override; Rollout also accepts accounts already reached whose plan includes the feature. Pending access returns NOT_RELEASED and may include unlockAt.
  3. On applies the account override, then the plan setting, then default_for_accounts. A denied plan returns PLAN_LOCKED; an Off account override returns ACCOUNT_OVERRIDE.
  4. Enabled access has no disabled reason. Checks without an account treat Overrides only and Rollout as off.

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
Read release settings and rolloutadminFeatureRelease, adminFeatureRolloutGET /v1/admin/feature-flags/{id}/release, GET /v1/admin/feature-flags/{id}/rollout
Schedule and control rolloutadminCreateFeatureRollout, adminUpdateFeatureRollout, adminPauseFeatureRollout, adminResumeFeatureRollout, adminRollBackFeatureRollout/v1/admin/feature-flags/{id}/rollout, /v1/admin/feature-rollouts/{id}
Set state, waiting time or notificationadminSetFeatureState, adminSetFeatureNewAccountDelay, adminSetFeatureNewAccountNotifyPUT /v1/admin/feature-flags/{id}/{state,new-account-delay,new-account-notify}
Edit release textadminSetFeatureReleaseText, adminDeleteFeatureReleaseTextPUT / DELETE /v1/admin/feature-flags/{id}/release-text