Skip to main content
Righteous

Docs / Embeds / Builder

Embed builder

Write a code on the left. Watch it render on the right. Nothing is saved and nothing is sent anywhere. Variables fill in with sample values so you can see the real shape.

This preview is an approximation

It is a separate implementation of the bot's own parser, so it can disagree with what Discord actually renders. Use it to check your shape quickly, not as proof. The bot is the authority.

Your code

261 characters · 7 chunks

Preview

Classic embed
RighteousAPPnow

streets LastFM

thumb

174 Plays | 637895 Total Plays • Today at 11:14

Markdown does not work everywhere

This is the single thing people get wrong. Discord applies different rules to different parts of an embed, and the preview above matches them.

WhereBold etcLinksNote
{author:}nonoPlain text. Documented in the bot's own source.
{footer:}nonoPlain text, same as the author line.
{title:}yesnoBlue and clickable ONLY with a {url:} tag. On its own it is bold white.
field nameyesnoSame rule as a title.
{description:}yesyesEverything works here.
field valueyesyesEverything works here too.
any V2 textyesyesV2 is one markdown block, so the author rule inverts.

The author rule is documented in the bot's own source. The rest is Discord platform behaviour. Note a title is only blue when the code carries a {url:} tag; on its own it is plain bold white.

How the syntax works

Three rules cover almost everything.

{tag: value}

One tag per pair of braces. Name, colon, then whatever it holds.

$p

Separates one tag from the next. Every chunk between two markers is exactly one thing.

&&

Splits arguments inside one tag. Resolved by what each one is, not by its position.

Build it up

1. The smallest embed there is

{description: Hello from Righteous}

One tag. No $p needed, because there is nothing to separate it from.

2. Colour and a title

{color: #11ABE4}$p{title: Server rules}$p{description: Read them before posting.}

A title with no {url:} is bold white, not blue. Add {url: https://...} to make it a link.

3. Fields, and the && split

{title: Ticket opened}$p{field: Opened by && {user.mention} && inline}$p{field: Channel && {channel.name} && inline}

Name, value, then the word inline to sit them side by side. Drop inline and each field takes a full row.

4. Buttons resolve by kind

{button: <:lastfmlogo:854491882688348180> && {user.url} }$p{button: blue && Click me}$p{button: Gone && disabled}

An emoji, a url, a style word and a label can appear in any order. A button with neither label nor emoji is dropped.

5. The full now-playing card

{color: #9f7873}$p{thumbnail: {album.cover}}$p{timestamp:}$p{footer: {track.plays} Plays | {user.plays} Total Plays}$p{author: {user.fmname} LastFM && {user.avatar}}$p{field: Song && [{track.name}]({track.url})}$p{field: Artist && [{artist.name}]({artist.url})}

The real default, with every hardcoded link swapped for the variable that produces it.

6. Components V2

{v2:}$p{section:[**{user.name}**]({user.url}) `{user.plays}x`
[**{track.name}**]({track.url}) `{track.plays}x`
[**{artist.name}**]({artist.url}) `{artist.plays}x`
[**{album.name}**]({album.url}) `{album.plays}x` && {album.cover}}$p{button: <:lastfmlogo:854491882688348180> && {user.url} }$p{button: <:SpotifyLogo:658824737115471892> && {spotify.url} }$p{separator:}$p{button: {spotify.listening} && disabled}$p{button:{artist.crown} && disabled}$p{button: {spotify.liked} && disabled}

{v2:} switches renderer. The {section:} is its own text block with the album art as its accessory, and the buttons sit below a separator.

7. Auto-delete

{description: This will clean itself up.} ++delete 30

++delete is not a tag. It's an ACTION directive, stripped off the end before anything else parses the code. This one deletes the message 30 seconds after it sends (1-600 allowed).

Every tag

{title}{description}{url}{color}{colour}{timestamp}{image}{thumbnail}{footer}{author}{field}{button}{content}{v2}{gallery}{section}{separator}

The dimmed ones are Components V2 blocks. Add {v2:} anywhere and the whole code switches renderer. A {section:} is its own text block with one accessory beside it, and it must have one: text on its own is dropped.

Where a code can go

Anywhere the bot sends something you control. Around two dozen commands and surfaces take one:

,customembed,welcomemessage,goodbyemessage,boostmessage,unboostmessage,joindm,stickymessage,ticket,trap,custommessage,lf mode,lf server npmode,pages,editembed,webhooks send/levels embeds/config panel
See every variable →