Instance Role System#
Pufferblow supports a role and privilege system that is scoped to each home instance. Roles are not global across the fediverse. Each instance owner defines its own local roles, assigns them to local members, and the client fetches the live role catalog from the active instance instead of relying on a hardcoded list.
Role Model#
Every instance is seeded with immutable system roles:
owneradminmoderatoruser
The built-in roles are protected. They cannot be deleted or edited through the instance role-management API.
Owners can create additional custom roles from the privilege catalog. Those roles remain local to the instance that created them.
Privilege Catalog#
Roles are composed from existing privilege identifiers. The current catalog includes:
create_usersdelete_usersedit_usersview_usersreset_user_tokenscreate_channelsdelete_channelsedit_channelsmanage_channel_usersview_private_channelssend_messagesdelete_messagesedit_messagesview_messagesmanage_server_settingsmanage_server_privilegesmanage_storageview_server_statsban_usersmute_usersmoderate_contentview_audit_logsmanage_blocked_ipsupload_filesdelete_filesview_filesmanage_background_tasks
Privilege Resolution#
When a client loads the current user profile, the API now includes:
roles_idsresolved_rolesresolved_privileges
This allows the client to stay dynamic. A custom role created on one instance appears in the dashboard and control panel without shipping a client update.
API Endpoints#
Role management lives under /api/v1/system:
POST /api/v1/system/roles/listPOST /api/v1/system/privileges/listPOST /api/v1/system/rolesPUT /api/v1/system/roles/{role_id}DELETE /api/v1/system/roles/{role_id}PUT /api/v1/system/users/{user_id}/roles
Current rules:
any authenticated user can list roles and privileges
only the instance owner can create, edit, delete, or assign roles
the
ownerrole cannot be assigned through the editorsystem roles remain immutable
Client Behavior#
The control panel now requests the role catalog and privilege catalog directly from the active home instance.
That means:
member role badges are dynamic
role assignment is dynamic
the control panel exposes a dedicated
Rolessection for role catalog and member assignment workcontrol-panel surfaces can be hidden when the current account lacks the matching privilege on that instance
Privilege-Backed Behavior#
Custom roles now affect real server behavior. Examples:
create_channelsallows channel creationdelete_channelsallows channel deletionmanage_channel_usersallows private-channel membership changesview_private_channelsallows private-channel visibility and accessdelete_messagesallows moderation deletion of messagesmanage_server_settingsallows server info and runtime-config changesview_server_statsallows access to activity metrics and overview dataview_audit_logsallows access to recent activity logsmanage_blocked_ipsallows blocked IP list, block, and unblock operationsupload_files,view_files,delete_files, andmanage_storageback storage operationsmanage_background_tasksallows background task status and on-demand task execution
Fediversed Architecture Notes#
The role system follows the current fediversed Pufferblow model:
authentication happens against one home instance at a time
roles and privileges belong to that home instance
remote actors are still handled through federation and ActivityPub flows
remote instances do not project their own local role catalogs into your home instance
This keeps moderation and access control local to the instance that owns the community data.