Opening a container
Everything after it that starts with
box. (or container., etc.) belongs to that container. Open a second {box} to start a new one.
{layout} works the same way — {layout.text: ...}, {layout.media: ...} and so on — for text, galleries or button rows that sit directly in the message, above or below your containers.
What goes inside
Text and headers
Text and headers
# headings, -# subtext, lists and > quotes. A header without its own # renders at ## size.Separators
Separators
sep, divider, hr. large (or lg / big) adds more breathing room. invisible (or hidden) keeps the spacing but drops the line — {box.spacer} is shorthand for that.Images and galleries
Images and galleries
image, img, gallery, photo, pic. Up to 10 items separated by |, laid out in Discord’s gallery grid. Put spoiler: in front of a URL to blur it, and anything after the URL becomes its alt text.Only real https:// links are sent — an image that fails to resolve (say, a variable that came out empty) is left out rather than breaking the whole message.Files
Files
Accent colour and spoilers
Accent colour and spoilers
Set on the opening node, or separately afterwards:Same rules as embeds: the separator can be a dot, colon or space, and a named slot is preferred rather than required.
{box.dominant} pulls the colour from the first Discord-hosted image in the container — section thumbnails first, then media gallery images.A container has no author or footer, so there are only two slots worth naming:Container vs embed
Neither is better — they’re for different shapes of message.
Discord doesn’t let a Components V2 message carry plain content or embeds, so as soon as a script uses a container Mira adapts the rest for you:
{content} becomes loose text in the same spot, top-level buttons become a loose button row, and each embed is turned into a container that reads the same way. Stickers can’t be sent alongside containers.
A worked example
A welcome message that actually looks designed:Limits
Discord enforces these, not the bot:- 40 components total per message (every text, button, thumbnail and container counts)
- 5 buttons per row
- 4000 characters across all text in the message
- 10 items per media gallery, 3 texts per section