August 2026 - ✨ An assistant that builds your graphs and more !

✨ An assistant that builds your graphs

Describe what you want and it draws the graph. "Give the Veteran role at level 25, but only to boosters" — it proposes a complete graph. You will find the ✨ panel in the top-right of the editor, on the reward graph as well as on custom commands in graph mode.

It proposes, it never applies. The proposal waits in the thread with Apply and Discard, and your graph is not touched until you click. That is not a formality: a graph hands out roles, sends DMs and grants XP to real members.

It is checked before you are even offered the button. A card that does not exist, an "Assign role" with no role selected, a link pointing nowhere — the problems are listed in place of the button. Those are exactly the mistakes that would save without complaint and then never fire.

The thread belongs to your whole team, live. Everyone sees who asked what, and the model's reasoning is one click away under each answer. While it is working the composer is locked for everyone, so two requests never fight over the same canvas.

It can see every server in your team, so "set this up like on my other server" is a question it can answer. Your API keys and tokens, on the other hand, are masked from it, and it can only ever write a graph, on the server you have open.

You can bring your own model: your own key, or your own OpenAI-compatible endpoint — that is how you point it at a model running on your own machine.

📖 Graph Assistant

⌨️ Text command prefix

Your members can type !rank instead of /rank. A new Text commands setting sits at the top of the Features page: a prefix of 1 to 5 characters, per server. It is empty by default — nothing changes until you set one.

What it covers: all your custom commands (simple and graph mode), the games (!hangman !rps !trivia !8ball !love !bingo start), the leveling lookups (!rank !leaderboard !top !boosters) and !trends.

What it does not cover, and why we stand by it: moderation stays slash-only. A slash command carries the permissions Discord enforces itself, and that you can further restrict by role and by channel in Settings → Integrations. A message bypasses all of that — exposing !ban would hand out a back door to your own Discord settings.

What is technically impossible: anything that opens a form (Wordle, Forms, reports, tickets). Discord only opens a pop-up in response to an interaction, and a message is not one.

Two differences worth knowing: a reply meant to be private becomes a public reply deleted after 30 seconds, and a message that runs a command earns no XP — it is a command, not conversation. Automod and the honeypot still inspect it normally.

📖 Text commands and the prefix

📥 Import levels from another bot

Coming from another leveling bot? Nobody has to be reset to zero. A new Import tab in Leveling pulls XP straight from MEE6 (as long as the MEE6 leaderboard is public), or from a JSON file exported from any other bot.

Preview before anything is written: how many members, which ones already have XP here, and a sample of the top of the leaderboard. Nothing is written until you confirm.

The part we would rather explain than hide: two bots can store the same XP and show a different level, because the curve is not the same. The preview measures the gap on your real data — "412 of 900 comparable members would change level" — and lets you choose: keep our curve, or adopt the source's so nobody loses a level.

You also choose what happens on a collision (keep the higher XP / replace / leave alone), and role rewards can be imported into the graph. No level-up message is sent and no reward fires retroactively — this is a migration, not an event.

ℹ️ Every graph card explains itself

Each card in the editor now carries a small (i), on the reward graph and on custom commands alike.

What makes it do nothing — the genuinely useful part. Several cards are skipped in silence when a required field is empty: an "Assign role" with no role, a "Send a message" with no text. Nothing was logged and nothing was flagged; the graph simply ran without them. The panel names the exact field.

Two conditions fail the other way, and it says so too: Has role with no role selected never passes, so everything after it is unreachable. Does not have role with no role always passes, so it filters nothing.

The variables valid on that card are listed right where you write the message.

On a custom command, what the card cannot read is crossed out. A command carries less than a leveling event: it knows the level, XP, streak, prestige, roles and ages, but it has no notion of the state before. An "XP threshold" trigger therefore has nothing to compare and will never fire — now visible at a glance instead of discovered on a silent graph.

One word on the model, written plainly: cards do not pass values to one another. Everything a card reads comes from the event that started the graph and reads the same in every card — which is why {user} works even on a card wired directly to the trigger.

📖 The wiki also documents, for the first time, the AND/OR/NOT trap: they judge the cards wired into them, not the ones after — and a gate with nothing wired in lets everything through (AND/NOT) or blocks everything (OR), with no error shown.

📦 Get a copy of your personal data

A new Your personal data section on your profile. You ask, we prepare it, you download a JSON file. No email to write and no form to fill: this is the GDPR right of access and portability, self-service.

The file covers both halves of your identity: your panel account (profile, sessions, teams, chat messages, tickets, invoices) and, if you linked Discord, your levels on each server, your birthday, your games, your giveaway entries and your moderation history. Without Discord linked the second half is absent — the panel has no way to know which Discord member you are. The file says so itself.

Anything about someone else is masked: the moderator behind a sanction, the member behind a report. You see that the sanction exists, when and why — not who issued it. The file lists the fields that were removed. It works both ways: whoever reported you does not learn your name from their own export.

One export at a time, and we tell you what it costs before you click: the page shows the estimated wait if you ask now, then your place in the queue and a countdown. You do not have to keep the page open — an email arrives when it is ready.

The file is kept 7 days, then deleted. A copy of your entire history sitting on a disk forever is a risk with no upside. One request per day — and if an export fails, the limit does not apply, you can retry right away.

The privacy policy has been updated accordingly.

📜 The activity log now says what changed

Before: "Wordle settings updated". Now: a before/after table listing the fields that actually moved, with both values — on feature configs, game settings, Server Logs, counters, statroles and the text prefix.

Nothing is listed that did not change: saving a form without touching anything no longer writes a misleading entry, and a "1" coming back from a form over a stored 1 is not a modification.

Lists are compared whole (adding one channel to a whitelist is one change, not ten), and nested settings read as a path (categories.voice.enabled).

A token or a secret is never written: the entry says it was changed, and both sides show ••••••••.

All three levels (server / team / backoffice) finally share the same filters: search, category, exact action, person, date range, server. The dropdowns are built from what actually exists in your log. Active filters show as clickable pills, with four counters above the table.

The log is now translated in all 13 languages, viewer and pages included.

🏅 A role for winners

A new Games won metric in Statroles. A "Champion" role at 50 wins, granted on its own.

One rule for the whole hub: mini-game wins and solved Wordles count together — not one rule per game. (8-ball and the love calculator have no winner, so they do not count: those are rounds, not wins.)

The role arrives with the win that triggered it, not at the member's next message — that is the difference with the message and voice metrics, which are evaluated when the member speaks.

Requires the Games feature to be enabled, the same way the message and voice metrics require Leveling.

📝 Each game picks what it logs

A new Engagement log setting on each of the 7 games: never, wins only, or every round. Until now only wins were logged, and that was fixed in code.

Why per game rather than one global switch: a Wordle happens once a day per member, an /rps every five seconds. "Every round" on Wordle gives a readable digest; the same option on RPS drowns the rest of the log.

What "every round" unlocks: hangman losses (with the word), drawn RPS duels (one line naming both players), failed Wordles, bingos nobody won. 8-ball and the love calculator, which have no winner, finally appear — they only offer never / every round.

Nothing changes for existing servers until they open the setting: the defaults reproduce the previous behaviour exactly.

🔧 Fixes worth naming

Disabling a feature now stops what it sends. A server that turned Scheduled messages off kept receiving them for as long as the schedule existed. The same, more quietly, for Social alerts (an alert prepared just before the cut still went out) and for embed sending, which never checked the feature was on. Your settings do not move: nothing goes out during the pause, and everything resumes when you re-enable — once, not once per missed occurrence.

New {prestige} variable in reward graph and custom command messages. Prestige could already be tested as a condition, but there was no way to display it — you could reserve a message for prestige 3 without being able to write "prestige 3". After a Trigger prestige action, {prestige} announces the rank just reached, not the one being left. The full list of message variables is now in the wiki.

Win XP is finally paid everywhere. Winning an /rps duel or a bingo granted no XP at all even though "XP per win" is a setting in the panel — only the reward graph fired. Fixed, and those wins now show up in Server Logs (Engagement) like the others.

Announcement channels are offered again in every channel picker (11 pages): they were being filtered out silently even though the bot can post there perfectly well. Both kinds are now told apart at a glance (# text, 📢 announcement).

Social alerts: YouTube stopped resolving @handles (and cached the failure for 6 hours) and Reddit returned 403. Both work again, and error messages are readable — a full HTML page used to be displayed in the panel.

Rock Paper Scissors duels: the challenger's move is no longer visible before the opponent plays, and a challenge no longer pings anyone.

Seven missing shortcuts were added to the dashboard server card: Moderation, Reports, Tickets, Social alerts, Embed Builder, Birthdays, Forms.