Composer is the dashboard's own message builder. Design any message from Discord's blocks, post it to a channel as OnyxBot, and update the posted copy later when the wording changes. It lives under Customize, then Composer, and it is the tool for announcements, server rules, an FAQ, a changelog, a welcome message, or a self-roles menu: anything you would otherwise write in an embed builder, with buttons that open tickets and toggle roles built in.
Starting a message
New message creates a blank message and opens the editor. The arrow beside it offers starters, each a real message a server posts every week, written so you edit the copy rather than the structure: an announcement, server rules, an FAQ, a changelog, and a welcome. Import from JSON takes a discohook export or a Discord message object and turns it into blocks; see below.
Give the message a name at the top of the editor. The name is for you and the list; members never see it.
Blocks
A message is a stack of blocks. Drag a block by its grip to reorder it, or use the arrows. Every block can be duplicated or deleted, and Add block at the bottom offers:
- Container: a card that groups blocks, with an optional accent color down its left edge and a spoiler switch that blurs it until a member clicks. A container has its own list of blocks inside it and its own Add block. Any block can be wrapped in a container from its toolbar, and a block inside a container can be moved back out.
- Section: one to three text blocks with a thumbnail or a button beside them.
- Text: Markdown, including headers, bold, lists, links, and small muted text written as
-# like this. - Gallery: up to 10 images shown as a grid, each with optional alt text and a spoiler switch.
- Separator: spacing, with or without a divider line.
- Buttons row: up to 5 buttons, or one select menu on its own.
Containers cannot be nested. The preview on the right is a close approximation; post the message to see it exactly in Discord.
Buttons and select menus
A button has a style: Blurple, Gray, Green, or Red, plus Link, which opens a URL, and Premium, which sells a SKU from your app's monetization. The four colored styles need something to do when clicked, and Composer offers the two things OnyxBot can do:
- Open a ticket in a category you pick. It works exactly like the button on a ticket panel, intake form included.
- Toggle a role. The member gets the role if they do not have it and loses it if they do. OnyxBot needs Manage Roles and its own role must sit above the one it hands out; the role picker warns when it does not.
A select menu is either a self-roles menu, where members pick the roles they want and end up holding exactly what they picked, or an open a ticket menu, where each option is a ticket category, the same as a panel dropdown. Give each option a label, a choice, and optionally a description and an emoji. A self-roles menu can allow several picks at once; set the minimum to 0 to let members clear every role from it.
Posting and updating
Save, or Ctrl+S and Cmd+S, stores the message. Post opens a dialog: pick the channel, and OnyxBot posts the message there as itself. Posting saves first if you have unsaved edits. The status in the header and in the list moves from Draft to Posting to Posted, or to Failed with the reason when Discord refused it, usually a missing permission in that channel.
Once a message has been posted, the dialog offers two choices. Post as new message sends a fresh copy to the channel you pick and leaves the earlier copy where it is. Update the posted message rewrites the copy OnyxBot already posted, in place, so pinned rules or an FAQ stay in the same spot with the same link.
Two settings travel with the message. Silent posts it without a push notification. Mentions decides what an @everyone, a role mention, or a user mention in the text actually pings; by default users can be pinged and roles and everyone cannot. Only turn these on when you mean to ping.
Templates
Every saved message is reusable. Duplicate in the list makes a copy with no posted message of its own, so posting it always sends a new copy. Keep a styled announcement as a template, duplicate it when there is news, and post the copy.
Importing from discohook
The JSON menu in the editor, and Import from JSON in the list, accept three shapes: a discohook export, a message object straight from Discord, and the JSON that Copy JSON produces in Composer. Components v2 messages come over block for block. Older messages are rebuilt: the content becomes a text block and every embed becomes a container, with the title, description, fields, image, thumbnail, footer, and author turned into blocks.
Before anything changes, the import lists what to check:
- Colored buttons arrive without an action, because other tools cannot know about your ticket categories and roles. Pick one for each, or make the button a link.
- A select menu arrives as a self-roles menu with its options kept; pick a role for each option.
- File blocks, user, role, mentionable, and channel select menus, and embed timestamps cannot be carried over and are left out.
Nothing is posted until you save and post it yourself.
Limits
Discord allows 40 components and 4,000 characters of text per message, counted across every block, and the meter under the blocks shows both. A row holds up to 5 buttons or one select menu, a select menu up to 25 options, a gallery up to 10 images, and a section up to 3 text blocks. Composer keeps a message to 20 top-level blocks so the tree stays readable; put more inside containers. Anything over a limit shows under the meter and blocks saving until it is fixed.
The free plan
The free plan keeps 3 saved messages per server; Pro removes the cap. Posting is free on every plan. Deleting a saved message removes it from the dashboard only. The copy already posted in Discord stays, though its buttons stop working once their message is gone.