v2.5.2 Release Notes
We're introducing two new features — Sticky Message and Message Screenshot — and rebuilt the leveling images from the ground up. BotShader AI can now change your bot's settings for you, and the custom command error handler finally does what it says. This release also fixes modules not taking effect until a restart, speeds up bot pages, and closes several security issues around permissions and secrets.

|
|
Published: August 2, 2026BotShade has been updated to v2.5.2. This release brings two new features — Sticky Message and Message Screenshot — a complete rebuild of the leveling images, bot settings changes driven by BotShader AI, and a working implementation of custom command error handling. We also fixed modules that only took effect after a restart, along with several security issues involving permissions and secrets.
If you notice anything, please don’t hesitate to report it via the Support page.
Table of contents:
- Highlights
- Sticky Message — keep important notices at the bottom of the channel
- Message Screenshot — turn a conversation into a single image
- Leveling images, rebuilt
- BotShader AI can now change your bot’s settings
- Custom command error handling now works
- Modules take effect without a restart
- Log improvements
- Faster bot pages
- Security fixes
- Bug fixes
- Compatibility
- Support and community
Highlights
- Sticky Message is new. Keep a message — rules, sign-up instructions, a deadline — permanently at the bottom of a channel. When someone posts and it scrolls away, the bot reposts it automatically.
- Message Screenshot is new. Turn a selected range of messages into a single image that looks exactly like Discord. It includes an “Hide details” mode that masks names and avatars.
- Leveling images were rebuilt from the rendering layer up. Rank cards, leaderboards, and level-up notifications are all smoother and easier to read, and emoji in display names and titles now render instead of silently disappearing.
- BotShader AI can now change your bot’s settings. Ask for “set the daily bonus to 250” and the AI proposes the change as a card — nothing is applied until you approve it.
- Custom command error handlers now actually run, and you can trace which command failed and why from the logs.
- Fixed modules not appearing until the bot was restarted, even after enabling them in the dashboard.
- Security fixes, including a permission bypass via DMs. If you use environment variables in custom commands, please read Security fixes.
Sticky Message — keep important notices at the bottom of the channel
Rules, sign-up deadlines, how to participate — messages you want everyone to see scroll out of view as soon as the conversation moves on. Discord’s pin feature only files them into a list at the top, where nobody looking at the channel will see them.
Sticky Message keeps a message you choose permanently at the bottom of the channel. When someone posts and the sticky message is no longer last, the bot reposts it automatically.
How to use it
Run /sticky-message [channel] in Discord to open the settings panel. From there you can:
- Edit the body — the text of the sticky message
- Edit the embed — using the same shared editor as welcome messages and other features
- Pause / enable — stop it temporarily while keeping the configuration
- Remove the sticky — delete the configuration entirely
- List for this server — see every channel with a sticky message and jump straight to its settings
How reposting works
Reposts are limited to once every 10 seconds.
- In a quiet channel, the message is reposted immediately after someone speaks.
- In a busy channel, reposts are batched to once every 10 seconds. Reposting on every message would flood the channel with sticky messages.
- One final repost happens right after a burst settles, so nothing is missed.
Note that Discord has no way to move a message, so “pin to the bottom” is implemented by deleting the previous sticky message and posting it again. That’s why the sticky message briefly disappears before reappearing.
The Sticky Message page in the dashboard controls the feature’s on/off state and command permissions. The content itself is per channel, so configure it from the Discord panel.
Message Screenshot — turn a conversation into a single image
A conversation worth sharing, a decision thread, an explanation you want to keep — until now you had to share a link, or take a screenshot on your own device and crop it yourself.
Message Screenshot renders a selected range of messages into a single image that looks exactly like Discord.
Selecting a range
Discord has no “press and hold to select a range” gesture, so the range is chosen by running a context menu command twice.
- Right-click (or long-press on mobile) the first message in the range and run Select screenshot range from the Apps menu. A confirmation visible only to you records the starting point.
- Run the same command on the last message, and the image is generated for that range.
The starting point expires after 5 minutes. You can cancel it at any time from the button on the confirmation.
After the image is generated
Two buttons are attached to the result:
- Hide details — replaces display names with “Member A”, “Member B”, and so on, and avatars with plain colored circles. Role colors, role icons, the server name, the channel name, and the channel ID are hidden as well. The same person always gets the same label and color, so you can still follow who is replying to whom. Message text is left untouched.
- Switch theme — toggle between dark and light.
What gets reproduced
Role-colored display names, role icons, the bot “APP” badge, collapsed headers on consecutive messages, reply previews, bold / underline / strikethrough / inline code / code blocks, colored mentions and links, emoji (including custom server emoji), attached image previews, and the “(edited)” marker — the Discord look, reproduced as-is.
Limits
- Both you and the bot need to be able to see the channel (View Channel and Read Message History).
- Spoiler attachments are shown as a filename chip; the contents are never opened.
- Up to 6 attached images are included, at up to 5 MB each.
- There is a cap on how many messages fit in one image (configurable from 1 to 50 in the dashboard, with a conservative default). Anything beyond the cap is collapsed into a “truncated” notice.
The Message Screenshot page in the dashboard lets you configure whether results are visible only to the person who ran it, the default theme, the message cap per image, and context menu permissions.
Leveling images, rebuilt
Rank cards, leaderboards, and level-up notifications were all rebuilt on a new rendering foundation.
- Smooth edges. Circles, progress bars, and rounded corners had jagged edges; that’s fixed, and everything now renders at double resolution.
- Emoji render now. Emoji in display names and titles previously vanished entirely — including the 🏆 in the default title. They now render correctly, custom server emoji included.
- Rank card — the oversized background number that collided with the name and progress bar is gone, replaced by a level medallion with a progress ring.
- Leaderboard — each row is now its own card, and the top three get a medal and a medal-colored border. The podium layout was rebuilt as well.
- Level-up notification — gradient heading, celebration particles, and a before/after level display.
- Fixed the watermark overlapping the content.
Generation is faster and files are smaller too: rank cards now take about one fifth the time and one third the file size.
BotShader AI can now change your bot’s settings
Until now BotShader AI could only tell you which setting to change and where to find it — the actual change was yours to make in the UI. As of v2.5.2, the AI proposes the change itself, and applies it once you approve.
How it works
- With a bot settings page open, open the AI panel and say something like “set the daily bonus to 250” or “send level-up notifications to #general”.
- The AI presents the change as a card, listing each item as “before → after” along with its reasoning.
- Review it and press [Apply] to write the values into the settings form. Nothing is saved at this point. Save as usual from the save bar at the bottom of the page.
- If you don’t like the proposal, [Discard] throws it away.
In other words, the AI never saves on its own. You confirm twice: once to apply, once to save.
Guardrails
- Permission settings cannot be changed by the AI. Allowed roles, permission overrides, and anything else permission-related is out of scope.
- Editable items are limited to an explicit allowlist, so the AI can never invent a setting key that doesn’t exist. If a proposal touches something outside that list, only that item is rejected, with the reason shown.
- If a proposal includes a change that turns something off, the card shows a warning — highlighted in red for critical modules.
Related improvements
- While you’re on a bot’s page, that bot stays the AI’s target. Previously you had to re-select the bot for every message after the first.
- When the AI talks about settings, it now uses the labels shown on screen (“Daily bonus amount”) instead of internal keys like
economy.dailyBonus. - The proposal card is now collapsed to a single line by default. A handful of changes used to push the conversation off screen. Warnings and the [Apply] / [Discard] buttons stay visible even when collapsed, and a close button is always available.
- Opening a conversation from the history now keeps you in the panel. Previously, selecting a conversation closed the panel and moved you to the full-page view.
Custom command error handling now works
The command builder has had an error handler node for a while, but the bot side never implemented it — any failure produced the same generic message, “An error occurred while running the command.” In v2.5.2 it actually runs.
- Errors raised during execution are caught, and whatever you wired to the error handler runs.
- Inside the handler you can use
{Error.message}(what went wrong),{Error.detail},{Error.block}(where it happened), and{Error.type}(the error category). That’s enough to show users a friendly notice while sending the details to a staff channel. {Error.type}works in conditional branches too. Set it as the comparison target and the editor suggests the available category keys.- An error handler placed inside a function handles the error there and lets the function finish normally. Without one, the error bubbles up to the caller’s handler.
- The handler gets its own execution budget (15 seconds by default), so it still runs even when the command body has exhausted its own.
- The setting that makes handler output visible only to the person who ran the command now takes effect correctly.
Errors are traceable now
Errors that no handler caught are now traceable from the logs as well.
- Log details include a new Custom command card: the error category, why it went uncaught (no handler / nothing wired after the handler / the handler itself failed), the block where it happened, and the node ID.
- From that card you can jump straight to the node in the command builder.
- When the category is known, the message shown in Discord reflects it — for example, “check whether the function has been deleted.”
- Secrets that would otherwise appear in logs (environment variable values and the like) are redacted automatically.
Modules take effect without a restart
We fixed an issue where enabling a module in the dashboard left its commands completely absent from Discord until the bot was restarted.
Modules were only loaded at bot startup; a settings change applied while running could only toggle individual commands within already-loaded modules. As of v2.5.2, saving your settings loads or unloads the module itself. No restart required.
Log improvements
- Fixed successful commands being labeled “execution failed.” Custom command logs record three lifecycle stages (started / completed / failed), but the failure wording was used regardless of stage.
- Log categories were split into 29 groups; nearly everything used to land under “Feature”. A “Category” filter was added as well.
- Category tags now use one neutral style, and color is reserved for status (success, failure, and so on).
- Column widths in the log table are consistent now, so headers line up with rows.
Faster bot pages
- Bot data is now cached for the session. Leaving a bot page and coming back used to refetch four separate resources while the whole page sat behind a loading gate; short round trips no longer refetch at all. If you have unsaved edits, background refetching is skipped so your input is never overwritten.
- The navigation bar now stays visible while loading. Previously the entire page was replaced by a spinner, taking every link with it.
- Sidebar open/close animation was removed. Every toggle used to shift the whole page for about 0.3 seconds; it’s now instant.
- “Coming soon” modules are hidden from navigation. Nine unavailable entries (Webhook, invite tracking, social notifications, VALORANT shop, APEX stats, Fortnite stats, search, translation, weather) were filling the list and making the features you can actually use harder to find. They’ll be listed again when they ship.
Security fixes
These were found during an internal review. All of them are fixed and no action is required on your side — but if you use environment variables in custom commands, please read the first item.
- Fixed environment variables being readable through custom commands. The text-building step re-interpreted user input as a variable reference, so typing variable syntax into a command option could print the value of an environment variable that command referenced. As a precaution, if you store API keys or other secrets in custom command environment variables, consider rotating them.
- Fixed permission settings being bypassed in DMs. Allowed roles and required permissions were not evaluated when a command was run by DMing the bot. DM users are now evaluated under the same rules as in a server, as “a user with no roles and no server permissions.” Commands with no restrictions configured remain usable in DMs as before.
- API request redirects are now re-validated on every hop. The destination allowlist for the “API request” node only applied to the initial URL, so a redirect could steer the bot toward internal networks. Credentials are also dropped when a redirect crosses to a different host (previously an API key set in a request header was forwarded to the redirect target).
- Secrets are stripped from saved state for suspended commands. Data stored while a command waits for input could retain environment variable values and API responses in plain text.
- Closed an
@everyonemention path and a case where credentials could appear in logs. - Fixed a case where the same bot could run in two places at once, caused by internal locking that could release a lock held by another instance.
Bug fixes
Custom commands / command builder
- Fixed saving a command with the same name as an existing command group replacing that group and orphaning the commands inside it. Groups were excluded from the duplicate-name check.
- Moving a command, renaming a group, and renaming a command are now a single atomic operation. They previously ran as a change followed by a delete, which could duplicate or lose commands if it failed halfway.
- Opening a nonexistent command from a URL no longer shows a blank page. A failed fetch is now distinguished from “no such command” and offers a retry.
Projects
- Projects with bots still in them can no longer be deleted. The delete button is disabled, showing which bots are blocking it and what to do.
Bot
- Fixed reminders occasionally not being delivered. A database connection dropping at a specific moment could cause a scheduled reminder to be missed, breaking recurring chains at that point.
- Per-bot metrics are now exposed at
/metrics, fixing cases where internal measurements weren’t attributed to the right bot. API response times are recorded from real measurements as well.
UI
- Fixed confirmation modals (start, stop, and so on) appearing too high on the screen. A regression test was added.
- Module cards were 8px narrower than the “Enable feature” toggle above them; they now match.
- Fixed the icon and title in module headings not being vertically centered.
- The danger zone (delete and similar actions) was restyled to match the rest of the site.
- Message Screenshot moved from the “Fun” category to “Messages”.
Compatibility
Bots and command definitions you already use continue to work in v2.5.2. No migration is needed on your side.
The new Sticky Message and Message Screenshot modules are added to existing bots in the off state. Enable them from their pages in the dashboard when you want to use them.
Regarding DM usage: as described in Security fixes, commands with allowed roles or required permissions configured can no longer be run from DMs. Please take note if you relied on DM execution. Commands with no restrictions configured are unaffected.
Support and community
For questions, bug reports, or feature requests, please reach out through any of the following:
- Support page — contact form
- status.botshade.com — service status
Thank you for using BotShade.