Releases: bunkerlab-net/mochi
Releases · bunkerlab-net/mochi
Release v3.2.2
Immutable
release. Only release title and notes can be modified.
- Redesign
/config: the ten separate/config set-*subcommands are replaced by a single/config set <key> <value>, and/config get <key>now shows one setting's current value, accepted input, and how to change it (omit the key to list everything). Settings are picked from a dropdown of keys, andsetaccepts friendly values such astrue/false/yes/nofor toggles with clear validation errors. All/configreplies are now private (ephemeral), so viewing or changing settings no longer posts to the channel. - Remove the
/autoplaycommand in favor of/config set autoplay true|false, so every per-server setting is managed through/config. Autoplay behavior is unchanged and remains on by default. - Add a
/helpcommand that lists every available command and its description in a private (ephemeral) reply. The list is generated from the live command registry, so it always reflects the commands that are actually installed. - Align the bot's persona and branding with Mochi's East-Asian theme: reword user-facing replies (the error prefix
opebecomesaiya, theu betchaconfirmations becomehai, and the/clear,/pause, and/resumeflavor text is rethemed), rename the Compose data directory frommuse/tomochi/, and replace the logo with a new mochilogo.svg.
Release v3.2.1
Immutable
release. Only release title and notes can be modified.
- Improve autoplay variety: instead of preferring Last.fm and only falling back to YouTube's radio mix, Mochi now gathers related tracks from both sources together (when
LASTFM_API_KEYis set), de-duplicates across them, and shuffles the combined results before queuing. This blends the two recommendation styles and keeps refills varied; tracks already in the queue are still never repeated. - Remember the queue and voice channel across restarts: Mochi saves each server's queue, playback position, and current voice channel, so a restart or crash no longer loses your music. When it comes back online it rejoins the channel it was in and resumes the current track from where it left off.
/stopstill clears the queue and disconnects;/disconnectleaves the channel but keeps the queue, so a later/playor/joinresumes it. - Add
/joinand its alias/summon: pull Mochi into your current voice channel on demand. If the queue already has music it starts playing immediately; otherwise it waits in the channel. - Fix
/nexterroring out instead of skipping: command aliases that extend another command (like/nextand/summon) now declare their injected constructor, so the player is wired up correctly through the DI container. - Reduce audio dropouts on unreliable connections: Mochi now buffers a short cushion before playback starts and recovers from brief network stalls by reconnecting on dropped, failed, or timed-out streams, rather than treating a momentary interruption as the end of the track and skipping it.
- Lower CPU use during playback: when playing at full volume with the 'lower volume when people speak' option disabled, Mochi now passes audio straight through instead of re-encoding every frame. Adjusting the volume or enabling that option automatically restores full processing, so both continue to work.
Release v3.2.0
Immutable
release. Only release title and notes can be modified.
- Add SoundCloud support: paste a SoundCloud track, set, or user-profile link into
/playand Mochi streams the actual SoundCloud audio directly (resolved viayt-dlp, the same engine used for YouTube). No extra configuration or API keys are required.
Release v3.1.1
Immutable
release. Only release title and notes can be modified.
- Fix
/seekand/fseekmis-reading durations that combine a unit with a trailing number (e.g.1m30): such input was truncated to the leading number (1 second) instead of being parsed (90 seconds). Only a bare number is now treated as a seconds value; everything else is parsed as a duration.
Release v3.1.0
Immutable
release. Only release title and notes can be modified.
- Add autoplay: when the queue empties, Mochi finds music similar to the last track and keeps playing instead of going silent. It is enabled by default and can be toggled per-server with the new
/autoplaycommand. Similar tracks come from Last.fm when the optionalLASTFM_API_KEYis set (resolved to playable YouTube videos), and otherwise from YouTube's auto-generated radio mix, which needs no extra configuration. Autoplay also keeps playing when/skipempties the queue, and honors theautoAnnounceNextSongsetting when announcing new tracks.
Release v3.0.2
Immutable
release. Only release title and notes can be modified.
- Route all startup and runtime output through the logger: the banner, database-migration progress, the Discord connection/ready messages, and per-command activity now go through pino instead of
console.log/oraspinners, and dotenv's own startup banner is suppressed. Every line is now consistently formatted and parseable underLOG_FORMAT. - Add graceful shutdown: on
SIGINT/SIGTERMthe bot logs the signal, leaves any active voice channels, closes the Discord connection, and exits cleanly. - Shrink the runtime Docker image by installing production-only dependencies, so dev tooling (TypeScript, Biome, release tooling, type packages) is no longer shipped in the published image.
- Migrate the data layer from Prisma to Drizzle ORM on Bun's built-in
bun:sqlite, dropping the Prisma query engine, the Prisma CLI, and the libSQL client. This removes roughly 270 MB from the image and runs migrations in-process at startup instead of shelling out. Existing databases are adopted automatically with no data loss, and stored dates remain byte-compatible. Note: a remote libSQL/TursoDATABASE_URLis no longer supported (the database is a local SQLite file); a pre-Prisma (Sequelize) database must first be upgraded with a 3.0.1-or-earlier release. - Remove unused dependencies (
@distube/ytdl-core,@distube/ytsr,ytsr,delay,node-emoji,p-event,p-limit,sync-fetch) left over from earlier YouTube and utility code, the deprecated@types/libsodium-wrappersstub, and stale type packages (@types/bluebird,@types/ms,@types/validator,@types/node-emoji).
Release v3.0.1
Immutable
release. Only release title and notes can be modified.
- Fix chapter splitting (
/play … split: true): only the first chapter played because every chapter shared one cache entry keyed by the video URL; cache keys are now segment-aware (URL + offset + length). - Fix "The application did not respond" when skipping or resuming into a slow or unplayable track:
/skip,/next,/unskip, and/resumenow defer the interaction before resolving media, and an unplayable track is skipped to the next one instead of surfacing a spurious error (this also makes automatic queue advancement resilient to bad tracks). - Fix
/skip(and/unskip//seek) advancing an extra track: deliberately stopping the current stream to start a new one fired the queue's auto-advance handler a second time. The handler is now detached before the switch, so skipping moves exactly as far as requested. - Add structured logging via pino, configurable with
LOG_FORMAT(plaindefault,json, orecs) andLOG_LEVEL(infodefault). Command invocations, queue and track changes, and playback or media-extraction failures now surface in logs by default instead of being silent; verbose per-component detail is available atLOG_LEVEL=debug. - Build and publish a multi-arch pre-release image to
ghcr.io/bunkerlab-net/mochi:edge(and:sha-<commit>) on every push tomaster, so changes can be tested before a release.
Release v3.0.0
- Rebrand from Muse to Mochi and migrate to a Bun-native stack: Bun 1.3.14 (runtime, package manager, and bundler) on Node.js 24 and TypeScript 6, replacing yarn.
- Migrate the data layer to Prisma 7 with the Rust-free client and the libSQL driver adapter.
- Switch developer tooling to Biome (replacing ESLint) and
hkgit hooks (replacing Husky). - Run the Docker image as the non-root
bunuser and publish multi-arch (linux/amd64andlinux/arm64) images only toghcr.io/bunkerlab-net/mochi, built natively on pinned runners with layer caching. - Fix containerized playback on
linux/arm64by correcting the@discordjs/opussource build and loading the@snazzah/daveyvoice binding fromnode_modulesat runtime. - Replace deprecated discord.js APIs (
ready→clientReadyandephemeral→ message flags).