Skip to main content
The starboard feature reposts messages to a dedicated channel once they accumulate enough reactions. It handles duplicates (updating the existing embed rather than reposting), tracks star counts, and removes a post from the starboard if reactions drop below the threshold.

How it works

  1. A member reacts to a message with the configured emoji (default: any emoji via wildcard *).
  2. The bot counts qualifying reactions, excluding the message author’s own reaction if self-starring is disabled.
  3. When the count reaches threshold, the bot posts an embed to the starboard channel.
  4. If reactions are added or removed, the embed is updated in place.
  5. If the count drops below threshold, the starboard post is deleted.

Configuration

config.json
{
  "starboard": {
    "enabled": false,
    "channelId": null,
    "threshold": 3,
    "emoji": "*",
    "selfStarAllowed": false,
    "ignoredChannels": []
  }
}
Set enabled to true and provide a channelId to activate.

Fields

FieldTypeDefaultDescription
enabledbooleanfalseEnable or disable the starboard
channelIdstringnullChannel ID where starred messages are posted
thresholdnumber3Minimum reactions to trigger a starboard post
emojistring"*"Emoji to watch, or "*" for any emoji
selfStarAllowedbooleanfalseWhether the message author’s own reaction counts
ignoredChannelsstring[][]Channel IDs excluded from starboard tracking

Emoji configuration

ValueBehavior
"*"Wildcard — tracks any emoji, picks the one with the highest count
"⭐"Tracks only the ⭐ emoji
"<:name:id>"Tracks a specific custom emoji
The wildcard "*" is the most flexible option. It surfaces whatever emoji the community naturally gravitates toward.

Self-star prevention

When selfStarAllowed is false (the default), the bot fetches up to 100 reactors and subtracts 1 from the count if the message author is among them. The check is skipped if fetching reactors fails — in that case the full count is used.

Ignored channels

Messages in ignoredChannels are never posted to the starboard, even if they exceed the threshold. The starboard channel itself is always excluded to prevent feedback loops.
config.json
{
  "starboard": {
    "ignoredChannels": [
      "111222333444555666",
      "777888999000111222"
    ]
  }
}

Starboard embed

Each starboard post contains:
  • Author — display name and avatar of the original message author
  • Content — the message text (if any)
  • Image — the first image attachment or embed image from the original message
  • Source — link to the original channel
  • Stars — emoji and count
  • Jump — direct link to the original message
  • Timestamp — when the original message was sent
The embed header line reads:
⭐ 5 | #channel-name

Database deduplication

The bot tracks starboard posts in a starboard_posts table keyed by the source message ID. When a post already exists:
  • If the count increased — the existing embed is edited in place.
  • If the count dropped below threshold — the embed is deleted and the database record is removed.
  • If the starboard message was manually deleted — the bot reposts it and updates the record.
Deleting the starboard channel or the starboard message and then re-adding reactions can cause duplicate posts if the record still exists in the database. Use /reactionrole delete or clean up the starboard_posts table directly to reset state.

Build docs developers (and LLMs) love