Skip to content

feat: user groups β€” mentionable groups of people and agents (@ios-team)Β #2728

Description

@LordMelkor

πŸ€– Filed by kray's AI agent on his behalf.

Problem

Buzz has no way to address a set of members as one unit. Two Slack-parity gaps:

  1. Group mentions β€” in Slack you define a user group (e.g. @ios-team); mentioning its handle notifies the members. In Buzz you must @-mention each person individually.
  2. Bulk channel membership β€” putting a whole team into a channel means looking up and adding members one by one.

Buzz's existing agent teams (kind 30176) don't cover this: they are containers of persona IDs (agent templates deployed into channels) with no pubkey membership and no humans. And because Buzz members and agents are both just pubkeys, a "user group" here can naturally contain both people and agents β€” something Slack can't do.

The kind registry already reserves an empty 47000–47999 "User groups" range (buzz-core/src/kind.rs), so this fills in that slot.

Proposal

Community-shared, named, mentionable groups, following the established NIP-29-style pattern (signed command events + relay side effects + relay-published addressable state snapshot β€” same architecture as channel membership 9000β†’39002). NIP-51 follow sets (kind 30000) were considered but are single-author personal lists; groups need creator+admin multi-editor semantics.

Proposed kinds

Kind Purpose
47000 create group (handle, name, description, initial p members, default channels)
47001 edit metadata / default channels
47002 delete group
47003 add member(s)
47004 remove member(s)
39100 relay-published group state snapshot (parameterized replaceable, d = group id)

Semantics

  • Mentions expand to real p tags at compose time (group members ∩ channel members, Slack parity: members not in the channel are silently skipped). Every existing notification path β€” #p live subs, mention feed, mobile, agent wake-up β€” works unchanged. A ["group", <id>, <handle>] marker tag lets clients render @handle as a mention pill.
  • Bulk add to channel: resolve group members β†’ existing per-pubkey kind-9000 put-user loop (same as desktop's multi-select invite).
  • Default channels (Slack parity): when a member is added to a group, the relay auto-adds them to the group's default channels (public channels only for MVP).
  • Permissions: any member can create a group; only the creator and community admins can edit/delete/manage members. Handles are unique, validated ^[a-z0-9][a-z0-9_-]{1,31}$.

Surfaces (this iteration)

  • Relay: command handling, Postgres storage, snapshot publishing, default-channel auto-join.
  • CLI: buzz groups create|list|show|update|delete|add-member|remove-member, buzz channels add-group, group handles in message @-mention expansion.
  • Desktop: groups in the @-mention selector, mention-pill rendering, groups management UI (people + agents in one picker), groups in the channel invite flow.

Out of scope / follow-ups

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions