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:
platformfeaturewidgetintegrationbot_moduleautomationcopyright_providereventsystem
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.
| Key | Label | Description |
|---|---|---|
system:account_creation | Account Creation | Controls 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_directory | Public Copyright Directory | Kill-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_check | Public Copyright Quick Check | Narrower 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_hub | Ideas Hub | Master switch for the Ideas Hub, including the admin moderation surfaces. |
system:ideas_hub_public | Ideas Hub (Public) | Controls whether the Ideas Hub is reachable without authentication. |
feature:extension_development | Extension Development | Seeded 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.
| Key | Label | Description |
|---|---|---|
feature:bots | Bot Control | Chat bot sections of the Connections group (settings window) |
feature:bot_modules | Bot Modules | Bot Modules configuration page |
feature:bot_commands | Bot Commands | Bot Commands management page |
feature:music | Music | Music 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:connections | Connections | Connections page umbrella - disabling hides the entire Connections section |
feature:multichat | Multichat | Cross-platform combined chat |
feature:automation | Automation Engine | Automation builder and execution |
feature:copyright_detection | Copyright Manager | Account-level song lists, status lookups, reports, and moderation; no background copyright check runs |
feature:streamelements | StreamElements | StreamElements tip ingestion |
feature:obs_remote | OBS Remote | OBS WebSocket remote control feature - gates the OBS integration dashboard page and all OBS config endpoints |
feature:advanced_overlays | Advanced Overlays | Advanced overlay builder features (e.g. multi-plan-only widget library, custom CSS) |
feature:overlay_folders | Overlay Folders | Folder organisation in the overlay list |
feature:overlay_access | Overlay Access Control | Per-overlay access restrictions |
feature:overlay_sharing | Overlay Shared Links | Shared overlay links |
feature:custom_bot | Custom Bot Account | Allows the account to register a custom bot identity per platform instead of using the shared Lumio bot |
feature:multi_account | Multi-Account | Owning more than one streaming account |
feature:extensions | Extensions | The extension platform |
feature:extension_paid | Paid Extensions | Paid extension purchases |
feature:widgets | Widget Gallery | The widget gallery |
feature:sounds | Sound Uploads | Sound 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.
| Key | Label | Description |
|---|---|---|
widget:obs_browser_source | OBS Browser Source | OBS Browser Source widget - overlay element that renders in OBS via browser source |
widget:spotify_now_playing | Spotify Now Playing | Gates 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_box | Chat Box | Chat Box overlay widget |
widget:event_list | Event List | Event List overlay widget |
widget:sub_goal | Sub Goal | Sub Goal overlay widget |
widget:viewer_count | Viewer Count | Viewer Count overlay widget |
widget:stream_uptime | Stream Uptime | Stream Uptime overlay widget |
integration category
Integration flags gate third-party tool integrations displayed in the Connections integrations modal.
| Key | Label | Description |
|---|---|---|
integration:shopify | Shopify | Shopify e-commerce integration. Shopify is registered as an integration-only platform, so it does not appear on the Providers page. |
integration:obs_websocket | OBS WebSocket | OBS WebSocket integration entry in the integrations modal - must be enabled for users to save or delete OBS connection settings |
integration:streamerbot | Streamer.bot | Streamer.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:
| Category | Use 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:
| State | Availability |
|---|---|
| Off | Nobody. This is the global kill switch; it wins even over an account override set to On. |
| Overrides only | Only accounts with an explicit override set to On. New user-facing flags start here; existing flags retain their stored state. |
| Rollout | Accounts with an On override, plus accounts already reached by the rollout whose plans include the feature. An Off override still blocks the feature. |
| On | The 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:*):
- Off returns
GLOBAL_OFFfor everyone, including On overrides. - Overrides only requires an On override; Rollout also accepts accounts already reached whose plan includes the feature. Pending access returns
NOT_RELEASEDand may includeunlockAt. - On applies the account override, then the plan setting, then
default_for_accounts. A denied plan returnsPLAN_LOCKED; an Off account override returnsACCOUNT_OVERRIDE. - Enabled access has no disabled reason. Checks without an account treat Overrides only and Rollout as off.
User-scope flags (system:account_creation):
USER_OVERRIDE- the user has an explicit per-user override (allowordeny). Stops here.GLOBAL_OFF- the global flag is disabled. Stops here.- 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 entryfeature-flags:edit- renders the toggle switch in the admin UIfeatures: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 action | GraphQL | REST |
|---|---|---|
| List flags | adminFeatureFlags | GET /v1/admin/feature-flags |
List flags with detail (description, default_for_accounts) | adminFeatureFlagsDetail | GET /v1/admin/feature-flags/detail |
| Toggle a flag | adminUpdateFeatureFlag | PATCH /v1/admin/feature-flags/{id} |
| Update flag detail | adminUpdateFeatureFlagDetail | PUT /v1/admin/feature-flags/{id}/detail |
| Read release settings and rollout | adminFeatureRelease, adminFeatureRollout | GET /v1/admin/feature-flags/{id}/release, GET /v1/admin/feature-flags/{id}/rollout |
| Schedule and control rollout | adminCreateFeatureRollout, adminUpdateFeatureRollout, adminPauseFeatureRollout, adminResumeFeatureRollout, adminRollBackFeatureRollout | /v1/admin/feature-flags/{id}/rollout, /v1/admin/feature-rollouts/{id} |
| Set state, waiting time or notification | adminSetFeatureState, adminSetFeatureNewAccountDelay, adminSetFeatureNewAccountNotify | PUT /v1/admin/feature-flags/{id}/{state,new-account-delay,new-account-notify} |
| Edit release text | adminSetFeatureReleaseText, adminDeleteFeatureReleaseText | PUT / DELETE /v1/admin/feature-flags/{id}/release-text |