Skip to main content

Permissions

Lumio uses role-based access control (RBAC) to manage what each team member can do within an account.

How It Works

Each account has roles (e.g., Owner, Moderator, Viewer). Each role has a set of permissions. When a user performs an action, the system checks if their role grants the required permission.

Permission checks run on all four protocol surfaces with the same resource:action strings:

  • RESTrequire_permission() in route handlers
  • GraphQLPermissionGuard on resolvers
  • WebSocket — channel-subscribe gate in crates/lo-websocket/src/gate.rs
  • Frontend<Gate permission> and hasPerm() in client code

The WebSocket layer maps each account-scoped channel to a single :read permission (e.g. chat:\{account_id\}chat:read, events:\{account_id\}events:read). See WebSocket → RBAC gate for the full mapping. A user without the permission receives code: "UNAUTHORIZED" on subscribe.

Default Roles

Owner

Full account access. System role (cannot be deleted). Has all permissions.

Moderator

Chat moderation, event monitoring, and Spotify playback control.

CategoryPermissions
Eventsevents:read, events:create, events:userinfo
Overlaysoverlays:read
Spotifyspotify:read, spotify:playback, spotify:queue, spotify:playlist, spotify:device
Chatchat:read, chat:write, chat:userinfo, chat:delete, chat:ban, chat:timeout, chat:notes, chat:raid, chat:poll, chat:prediction, chat:refresh_user
Connectionsconnections:read
Uploadsuploads:read
Rewardsrewards:read
Automationsautomations:read, automations:execute, automations:history
Soundssounds:read, sounds:play

Viewer

Read-only access to events and overlays.

CategoryPermissions
Eventsevents:read, events:userinfo
Overlaysoverlays:read
Soundssounds:read

Custom roles can be created under Dashboard > Settings > Roles.

Permission Reference

Events

PermissionDescription
events:readView events, notifications, and event history
events:createSend test events and manage notifications
events:deleteDelete events and clear event history
events:userinfoView user cards and profiles from event entries

Overlays

PermissionDescription
overlays:readView overlay configurations
overlays:createCreate new overlays
overlays:editEdit existing overlays
overlays:deleteDelete overlays
overlays:manage-accessManage overlay access control and bypass per-overlay restrictions

Spotify

PermissionDescription
spotify:readView now playing state, queue, devices, playlists, and search tracks
spotify:playbackControl playback: play, pause, skip, previous, seek, volume, shuffle, repeat
spotify:queueAdd tracks to the playback queue
spotify:playlistManage playlists: create, rename, delete, add/remove tracks, start playlist playback
spotify:deviceTransfer playback between Spotify devices
spotify:workerStart and stop the manual Spotify worker connect

Chat

PermissionDescription
chat:readView chat messages, history, and emotes
chat:writeSend chat messages
chat:userinfoView user profiles, follow status, and moderation log
chat:deleteDelete chat messages
chat:banBan and unban users
chat:timeoutTimeout users
chat:notesView and manage user notes
chat:raidCancel active raids
chat:pollEnd active polls
chat:predictionEnd active predictions
chat:refresh_userManually refresh a user's platform profile data

Connections

PermissionDescription
connections:readView connected platforms and credentials
connections:createConnect new platforms
connections:editUpdate connection credentials
connections:deleteDisconnect platforms

Settings

PermissionDescription
settings:readView account settings
settings:editModify account settings

Automations

PermissionDescription
automations:readView automations and their configuration
automations:createCreate new automations
automations:editEdit automation metadata, nodes, edges
automations:deleteDelete automations
automations:executeManually trigger and start/stop automations
automations:historyView execution history and debug logs

Members

PermissionDescription
members:readView the members list and all invitations
members:createCreate invites, search users for direct invites
members:editChange member roles, create/edit/delete custom roles
members:deleteRemove members from the account, revoke pending invites

Uploads

PermissionDescription
uploads:readView uploaded files
uploads:createUpload new files
uploads:deleteDelete uploaded files

Rewards

PermissionDescription
rewards:readView channel point rewards
rewards:createCreate new rewards
rewards:editEdit existing rewards
rewards:deleteDelete rewards

Tokens

PermissionDescription
tokens:readView popout tokens and API keys
tokens:createCreate popout tokens and API keys
tokens:editEdit popout tokens and API keys
tokens:deleteRevoke popout tokens and API keys

Account

PermissionDescription
account:readView account settings and information
account:editEdit account settings (name, etc.)
account:deleteDissolve (permanently delete) the account

Plan

PermissionDescription
plan:readView account plan and billing information
plan:editChange account plan, manage subscription

Login Assignments (User-Level)

These permissions are user-level rather than account-level. Own assignments are always allowed for any authenticated user.

PermissionDescription
login-assignments:readView login assignments for the active account. Own assignments are always visible without this permission.
login-assignments:createAssign a login connection to an account on behalf of another user. Own assignments are always allowed without this permission.
login-assignments:deleteRemove a login assignment for the active account on behalf of another user. Own assignments are always removable without this permission.

Sessions (User-Level)

These permissions are user-level. Every authenticated user can manage their own sessions.

PermissionDescription
sessions:readView active browser sessions
sessions:deleteRevoke active browser sessions

Extension Developer (User/Team-Level)

Extension developer permissions gate access to the developer dashboard and extension management. They are exercised through developer team RBAC rather than account roles. See Team-Scoped Permissions for the team permission model.

PermissionDescription
extension-dev:readView extension developer dashboard and owned extensions
extension-dev:createCreate new extensions
extension-dev:editEdit owned extensions (metadata, code, assets)
extension-dev:deleteDelete owned extensions
extension-dev:publishSubmit extensions for review and publish approved versions
extension-dev:analyticsView extension analytics (installs, usage, ratings)
extension-dev:payoutsManage extension revenue payouts

Sounds

PermissionDescription
sounds:readView sounds
sounds:createUpload sounds
sounds:editEdit sound metadata
sounds:deleteDelete sounds
sounds:playPlay sounds in browser sources

Bot Modules

PermissionDescription
bot-modules:readView bot module configurations
bot-modules:editEdit bot module configurations
PermissionDescription
copyright:readView safe/blocked songs, copyright check results
copyright:editAdd to safe/blocked lists, import playlists
copyright:deleteRemove entries from safe/blocked lists

OBS

PermissionDescription
obs:readView OBS integration configuration and status
obs:editEdit OBS integration settings and remote control

Admin-Scope Permissions

Admin-scope permissions are checked against a user's admin role (not their account role). They gate the Lumio admin panel — /admin. The dashboard entry gate is admin:access, which is automatically included in every admin role.

Note: Some permissions (marked below) share an identical string with an account-scope permission but are enforced in a different context (require_admin_permission vs require_permission). This mirrors the bot-connections:* precedent.

Admin: Core Access

PermissionDescription
admin:accessDashboard entry gate. Auto-injected into every admin role.

Admin: Role Management

PermissionDescription
admin-roles:readView admin roles, their permissions, and member lists
admin-roles:createCreate new admin roles
admin-roles:editEdit role name, description, permissions, and user assignments
admin-roles:deleteDelete admin roles (is_system roles are protected server-side)

Admin: Privacy

PermissionDescription
admin:privacy-eraseErase persisted personal data on subject request (GDPR Art. 17). Currently powers DELETE /v1/admin/privacy/youtube/member/{id} to clear cached YouTube member-channel records across all accounts. Reserved for support tooling; assigned only to system_admin.

Admin: Developer Verifications

PermissionDescription
developer-verification:readView developer applications and their details
developer-verification:editApprove or reject developer applications

Admin: Feature Flags

PermissionDescription
features:readView feature flags
features:editToggle feature flags

Admin: Users & Accounts

PermissionDescription
users:readView users, login connections, and membership details
users:editEdit user display name, email, overrides, and manage login connections
users:deleteDelete users
accounts:readView account details, limits, features
accounts:editUpdate account name, plan, limits, feature overrides, members, reconnect flags, and primary connections
accounts:deleteDelete accounts

Admin: Providers

PermissionDescription
providers:readView platform provider configurations
providers:editToggle providers and sub-flags

Admin: Infrastructure

PermissionDescription
system-keys:readView system API keys
system-keys:editCreate and delete system API keys
oauth-clients:readView OAuth client registrations
oauth-clients:editCreate, edit, and delete OAuth clients

Admin: Ideas Moderation

PermissionDescription
ideas:moderate_readView all ideas with moderation details (reports, flags, internal notes)
ideas:moderate_statusChange idea status (approve, reject, mark as planned, close)
ideas:moderate_editEdit any idea regardless of ownership
ideas:moderate_deleteDelete any idea regardless of ownership
ideas:moderate_commentEdit or delete any comment on ideas regardless of ownership

Admin: User Roles

PermissionDescription
user-roles:readView user roles and their permissions
user-roles:createCreate new user roles
user-roles:editEdit user role name, description, permissions, and assignments
user-roles:deleteDelete user roles (is_system roles are protected server-side)

Admin: Shared with Account Scope

The following permissions are declared in both admin scope and account scope. They share the same string value but are enforced by different guards:

PermissionCategoryNotes
copyright:readCopyrightSeeded on system_admin admin role
copyright:editCopyrightSeeded on system_admin admin role
copyright:deleteCopyrightSeeded on system_admin admin role
obs:readOBSSeeded on system_admin admin role
obs:editOBSSeeded on system_admin admin role
bot-modules:readBot ModulesSeeded on system_admin admin role
bot-modules:editBot ModulesSeeded on system_admin admin role

User-Scoped Permissions

User-scoped permissions are global — they are not tied to a specific account. They control access to platform-wide features that exist outside the account context, such as the Ideas Hub. User-scoped permissions are assigned via user roles (user_roles / user_role_permissions), not account roles. Enforcement uses auth.require_user_permission() on the backend.

Ideas Hub

PermissionDescription
ideas:readRead ideas
ideas:createCreate new ideas
ideas:editEdit own ideas
ideas:deleteDelete own ideas
ideas:voteVote on ideas
ideas:comment_readRead comments on ideas
ideas:comment_createCreate comments on ideas
ideas:comment_editEdit own comments
ideas:comment_deleteDelete own comments

Default User Roles

Three system user roles are seeded by default:

Member

Assigned to all users automatically. Grants full Ideas Hub participation.

CategoryPermissions
Ideasideas:read, ideas:create, ideas:edit, ideas:delete, ideas:vote
Commentsideas:comment_read, ideas:comment_create, ideas:comment_edit, ideas:comment_delete

Restricted

Limited to read-only access.

CategoryPermissions
Ideasideas:read
Commentsideas:comment_read

Moderator

Full user permissions plus admin-level moderation capabilities. The five ideas:moderate_* permissions are admin-scoped — see Admin: Ideas Moderation above.

CategoryPermissions
Ideasideas:read, ideas:create, ideas:edit, ideas:delete, ideas:vote
Commentsideas:comment_read, ideas:comment_create, ideas:comment_edit, ideas:comment_delete
Moderation (admin-scoped)ideas:moderate_read, ideas:moderate_status, ideas:moderate_edit, ideas:moderate_delete, ideas:moderate_comment

Team-Scoped Permissions (Developer Teams)

Team-scoped permissions control what each member can do within a developer team. They are separate from both account-scope and admin-scope permissions and are defined in crates/lo-auth/src/rbac.rs::team. Enforcement uses require_team_permission() in REST handlers and an equivalent helper in GraphQL resolvers. Permissions are cached in Redis per (team_id, user_id) pair.

Extension Development

PermissionDescription
team-extensions:createCreate extensions within the team
team-extensions:editEdit team extensions (metadata, code, assets)
team-extensions:deleteDelete team extensions
team-extensions:publishSubmit extensions for review and release
team-extensions:analyticsView extension analytics (installs, usage, ratings)
team-versions:createCreate new extension versions
team-versions:editEdit extension versions

Secrets

PermissionDescription
team-secrets:readRead team secrets (API keys, webhooks)
team-secrets:editEdit team secrets

Testers

PermissionDescription
team-testers:manageManage extension testers

Team Members

PermissionDescription
team-members:readRead team member list
team-members:inviteInvite new team members
team-members:editEdit team member roles
team-members:removeRemove team members

Team Settings

PermissionDescription
team-settings:readRead team settings
team-settings:editEdit team settings

Payouts

PermissionDescription
team-payouts:readRead team payout information
team-payouts:editEdit team payout configuration

Default Team Roles

Three roles are seeded for every new developer team:

Owner (team-owner)

System role (cannot be deleted). All 18 team permissions.

Admin (team-admin)

Manage extensions and team members. All permissions except team-settings:edit, team-payouts:edit, and team-members:remove.

Member (team-member)

View and develop extensions. Permissions: team-extensions:create, team-extensions:edit, team-extensions:analytics, team-versions:create, team-members:read, team-secrets:read, team-settings:read.

Popout Tokens

Popout tokens inherit specific permissions when created. A popout token can only have permissions that the creating user's role grants. For example, a Moderator cannot create a popout token with settings:write.

Overlay Tokens

Overlay tokens (lm_overlay_*) have no RBAC permissions. They cannot access any REST or GraphQL endpoint. Their sole capability is subscribing to the overlay:{key} WebSocket channel where the token's bound overlay_id matches the resolved overlay key.

  • has_permission(_) always returns false
  • Cannot broadcast to any channel
  • Cannot subscribe to any channel other than the one matching their bound overlay
  • Rate-limited at 600 requests/min (same tier as Popout tokens)

Shared Overlay Tokens

Shared overlay tokens (lm_share_*) provide temporary, time-limited access to a specific overlay. They are designed for sharing overlays with collaborators or backup streaming setups without granting permanent account access.

  • Prefix: lm_share_ (9 characters)
  • Body: 32 random bytes, hex-encoded (64 characters)
  • Total length: 73 characters
  • Transport: ?token=lm_share_… query parameter or Authorization: Bearer lm_share_… header
  • Rate-limited at 600 requests/min (same tier as Popout and Overlay tokens)
  • has_permission(_) always returns false
  • Cannot access REST or GraphQL endpoints
  • Can only subscribe to the overlay:{key} WebSocket channel matching the token's bound overlay
  • Server checks expiry every heartbeat tick (5s) — disconnects with TOKEN_EXPIRED when elapsed
  • Server checks DB revocation every 30 seconds — disconnects with TOKEN_REVOKED if revoked

Token Types

TypePrefixLengthPurpose
System Keylm_sys_71Internal service-to-service auth
User API Keylm_usr_71External API access
JWTlm_ + eyJ...variableSession-based auth
Popout Tokenlm_pop_71Non-expiring overlay/popout access
Overlay Tokenlm_overlay_75Per-overlay browser source access
Shared Overlay Tokenlm_share_73Temporary shared overlay link

Extension Permissions

Extension tokens (lm_ext_*) have no RBAC permissions (has_permission() always returns false). Instead, extensions declare required permissions in lumio.config.json and are granted only those capabilities at install time. The Lumio API validates each action call against the extension's declared permission set.

Available Extension Permissions

Extensions can request the following permissions:

PermissionDescriptionReview level
events:readRead events from the Lumio event busStandard
events:writeEmit custom eventsStandard
chat:readRead chat messagesStandard
chat:sendSend chat messagesStandard
chat:deleteDelete chat messagesEnhanced
chat:banBan and unban users, timeout usersEnhanced
obs:controlControl OBS scenes, sources, streaming, recordingStandard
overlays:editUpdate overlay layer propertiesStandard
spotify:controlControl Spotify playback, queue, volumeStandard

Enhanced review: Extensions requesting chat:ban or chat:delete receive additional scrutiny during the approval process. Reviewers verify that the extension implements appropriate safeguards (e.g., confirmation prompts, configurable thresholds, exempt role support) and that the moderation logic does not create excessive false positives. The chat:ban permission grants ban, unban, and timeout capabilities through a single declaration.

API Keys

User API keys inherit all permissions of the user's account role. Rate limits differ by auth type — see Authentication.