Releases: esmBot/esmBot
2025.10.0
This release adds a new command and performs some general maintenance.
Changes
- Added slide
- Added default Deno permissions to deno.json
- Updated Twemoji to v16.0.1
- Updated Oceanic to v1.13.0
- Changed filetype checking to use streams instead of buffers
- Refactored subcommand handling to take a more hierarchical approach
- Replaced emoji-regex-xs package with native Unicode property regexes
- Fixed bounce using a larger delay vector size than intended
- Fixed initial PostgreSQL schema
- Updated playing messages
- Updated packages
- Updated Lavalink plugins
- Updated translations (thanks al_ex427, lihaisapossu, Felli, Ricky-Tigg, and yhagahmi!)
2025.9.0
This release mainly focuses on internal refactoring and general maintenance.
The minimum required Node.js version has been bumped to 22.0.0.
Changes
- Added a native, directory-based subcommand system
- Added shard status to metrics
- Converted the base64 commands into directory subcommands
- Converted the music commands into directory subcommands
- Converted most watermark commands into directory subcommands
- Converted the qr commands into directory subcommands
- Switched to using glob in
node:fsfor reading command, locale, and event files - Fixed argument names on channel
- Updated packages
- Updated Lavalink plugins
- Updated translations (thanks Steffo, giahuy_08, PitocoHery, lihaisapossu, Atalanttore, MEWPASCO, and DangerStep!)
- Removed postInit function
2025.8.0
This release adds a new tag-related feature and fixes various bugs.
Changes
- Added a role-based permission system for tag creation
- Added support for TS commands on Node.js v22.18.0
- TS command loading now respects Node's
--no-experimental-strip-typesoption - Added SIGTERM handler
- Fixed user command counts not being properly added
- Fixed tags classic command not returning tag content
- Fixed image server count desyncs
- Changed how the image server sends images to avoid unhandled errors
- Changed image runner native function to use promises instead of callbacks
- Updated locales (thanks stani and Steffo!)
2025.7.0
This release adds some new commands, includes a major behind-the-scenes fix, and adds support for a new runtime.
esmBot now has native support for the Deno JavaScript runtime. See the Runtime Compatibility page in the docs for more info.
Changes
- Added hue
- Added powerdirector
- Added initial Deno support
- Fixed multiple memory allocation issues with the image natives under glibc
- Added support for loading TypeScript commands on Node.js when type stripping is enabled
- Added broadcast eval
- Added some new playing messages
- Added catch-all command option helper function
- Added optional
defaultArgparameter to command option helpers - Added support for specifying custom required parameters in image commands
- Changed the API of the generic image natives to be more usable
- Switched the JSON parser in the generic natives to simdjson
- Made soundplayer always get voice channels over REST
- Moved command load log inside the command handler so that reloads are logged as well
- Switched to using execFile instead of exec for git hash detection
- Improved performance of globe slightly
- Switched to using the correct Sentry package for each respective runtime
- Fixed imagereload not properly sending a reload broadcast on success
- Fixed IPC message loopback
- Fixed potential crash caused by an undefined output size
- Fixed env variables/servers being cleared on image command text output
- Updated locales (thanks Steffo, AxMilin, hernik, and MEWPASCO!)
- Updated packages
- Updated Lavalink plugins
- Removed check for higher database versions
- Removed convertpg.js script
2025.6.0
This release makes some small additions and bug fixes.
Changes
- Made the image detection check for forwarded media
- Fixed banner not properly getting users from slash command arguments
- Fixed music subcommands not using locales
- Switched to SQLite in container compose config
- Updated playing messages
- Updated locales (thanks Steffo and wiseparalyse!)
- Updated Lavalink plugins
- Removed dead CLI code
2025.5.2
This release makes some small additions and bug fixes.
Changes
- Added support for getting GIF stickers with sticker
- Added support for getting server avatars with avatar
- Added support for getting server banners with banner
- Fixed selected images being preferred over direct input
- Fixed avatar/banner not getting non-member users
- Updated locales (thanks Dirk, Eldamian0, fernzehen, and stolarchukboris!)
- Updated packages
2025.5.1
This release fixes some bugs and makes some tweaks.
Changes
- Output images are now automatically selected when posted in a user app context (#505)
- Fixed animated WEBP attachments and external images being processed as static (#504)
- Fixed metrics endpoint not returning command counts
- Fixed image detection not checking for the correct permission
- Fixed image detection not searching for images in DMs (#505)
- Fixed PM2 ecosystem file start path
- Fixed application command data being sent multiple times in PM2 environments
- Set macOS native builds to avoid building with ZXing by default
- Some very small memory usage tweaks
- Updated locales (thanks @t7ru!)
- Updated packages
- Removed unused edit command option
2025.5.0
This release brings many fixes, multiple under-the-hood improvements, and a major refactor of the JavaScript codebase.
The core of the bot has been converted to TypeScript; this adds an extra build step (except when using Bun), but has resulted in more maintainable code and many bugs being fixed. Command files are still written in regular JavaScript, but commands written in TypeScript are also now supported when using Bun.
Music commands are now disabled on the main instance. This is because running a music bot that pulls from multiple sources has become a very dangerous and risky cat-and-mouse game; I do not wish to engage in this, but music commands will remain available for self-hosters that are comfortable with playing it.
Self-hosters: if you are launching the bot directly using app.js, your start path will need to be updated to dist/app.js (or src/app.ts when using Bun). Additionally, libwebp has been dropped as a dependency and is no longer required. Backward-cpp has been added as an optional dependency for prettier crash logs on the native modules; if enabled, it will automatically be downloaded and linked if one of its dependencies is available.
(Apologies for the disorganized changelog; most of this was written on very little sleep!)
Changes
- Ported the core of the codebase to TypeScript
- Added fade
- Added a flag to change the amount of scaling on wide
- Added support for loading TypeScript commands and events when using Bun
- Added template support to locales
- Added SIGINT handler to bot process
- Heavily refactored avatar and banner
- Converted database plugins into classes
- Switched from libwebp to manual RIFF parsing on freeze and speed
- Switched to using AsyncWorker API for image jobs
- Added support for cancelling image jobs mid-execution
- Switched to subpath imports
- The processing message is now shown on WEBP images
- WEBP is now chosen as the default image format for Giphy images
- Image application commands now use upload limit sent by Discord
- Switched to using Components V2 for large image embeds
- Added many command class option helper functions
- The image server now autodetects supported image formats
- The current locale is now passed to voice channel leave handler
- Simplified error file contents
- Switched from Biome to ESLint/Prettier
- Refactored tags
- Made wide scale to a proper 19:1 ratio
- Made unknown property type error in image natives more descriptive
- Image servers are now picked at random
- Made database init retain counts for missing commands
- Switched to web-standard APIs for handling WebSocket events
- Aligned PM2 process IDs with their actual PM2 ID numbers
- Changed "emote" in description for emote to "emoji"
- Changed image job cache timeout from 5 to 15 minutes
- Improved initial pagination performance
- Blocked @discordjs/voice package from installing
- Finished extracting strings for localization
- Disabled cache on the Oceanic client used in the PM2 manager
- Switched PM2 processes to fork mode
- The interaction handler is now loaded even when application commands are disabled
- Lots of permission handling fixes with image commands
- Lots of music fixes
- Fixed snowflake detection across multiple commands
- Fixed filesize not being output properly when using freeze on a GIF
- Fixed issues with incorrect page height (#491)
- Fixed vague PostgreSQL migration error logs (#500, thanks @darwinx64!)
- Fixed unhandled errors when using classic commands without any roles cached
- Fixed crash when sending unimplemented type to image natives (#497)
- Many Docker fixes
- Optimized static images
- Updated locales (thanks enorsu, @t7ru, lihaisapossu, @Steffo99, brunozombi67, fl4rt4n, Dirk, lostmatter, Ghosty920, EsawMa, salgueiroso, miqheil, Ex_Mozarella, Eldamian0, antoj2, ketsunewa, shaylu, qtwnds, averageinternetgoose, and otf31!)
- Updated packages
- Updated Lavalink plugins
- Removed unused Sentry profiling
- Removed image job retry loop
- Removed ancient
- Removed wikihow
2025.1.1
This release brings a few improvements.
Changes
- Added support for AVIF images (static only for now, animation is not yet supported by the underlying libraries)
- Added support for WEBP images to speed
- Improved performance on circle
- Slightly simplified an equation on deepfry
- Fixed Discord REST proxy settings not being applied to PM2 manager and image API server
- Fixed an error being thrown when Lavalink returns an empty set of search results
- Extracted more strings for localization
- Updated localizations (thanks shalyu!)
- Removed a lot of seemingly unnecessary colorspace conversions
2025.1.0
This release adds support for a couple of things, fixes some bugs, you know the drill.
Following last release, it is now possible to contribute translations via Weblate: https://translate.codeberg.org/projects/esmbot
Self-hosters: libwebp is now a required dependency. Please install it (and its headers/dev package) to build the natives.
Changes
- Added animated WEBP image support
- Added a REST_PROXY env option for usage with Discord API proxies
- Added Bluesky profile link to info
- Ported circle to vips
- Adhere to new Discord size limits
- Extracted more strings for translation
- Switched random image commands to use files.esmbot.net instead of files.projectlounge.pw
- Made animation handling more generic
- Increased image size on banner to 4096 (thanks @ari-party!)
- Slightly increased performance on squish and bounce by reducing precision
- Disabled libvips operation cache
- Restricted image loading in libvips to specific formats
- Made emote return emotes present in both the original command message and the message the command is in reply to
- Set jpeg natives to use quality 1 by default
- Removed some unnecessary sanitization from base64 decode (thanks @jobin-b and @atommy3!)
- Fixed non-regional indicator codepoints being accepted on flag
- Fixed some non-HTTPS image search results not being properly filtered
- Fixed image search result embed links not being properly encoded
- Many i18n fixes
- Updated translations (thanks @grayairr, @Marioalexsan, and swetsen!)
- Updated packages
- Updated Lavalink plugins