Skip to content

Releases: bunkerlab-net/mochi

Release v3.2.2

20 Jun 11:05
Immutable release. Only release title and notes can be modified.
4834254

Choose a tag to compare

  • 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, and set accepts friendly values such as true/false/yes/no for toggles with clear validation errors. All /config replies are now private (ephemeral), so viewing or changing settings no longer posts to the channel.
  • Remove the /autoplay command 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 /help command 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 ope becomes aiya, the u betcha confirmations become hai, and the /clear, /pause, and /resume flavor text is rethemed), rename the Compose data directory from muse/ to mochi/, and replace the logo with a new mochi logo.svg.

Release v3.2.1

16 Jun 13:21
Immutable release. Only release title and notes can be modified.
70ca71a

Choose a tag to compare

  • 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_KEY is 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. /stop still clears the queue and disconnects; /disconnect leaves the channel but keeps the queue, so a later /play or /join resumes it.
  • Add /join and 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 /next erroring out instead of skipping: command aliases that extend another command (like /next and /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

15 Jun 12:40
Immutable release. Only release title and notes can be modified.
f57c46a

Choose a tag to compare

  • Add SoundCloud support: paste a SoundCloud track, set, or user-profile link into /play and Mochi streams the actual SoundCloud audio directly (resolved via yt-dlp, the same engine used for YouTube). No extra configuration or API keys are required.

Release v3.1.1

15 Jun 09:39
Immutable release. Only release title and notes can be modified.
0143bfb

Choose a tag to compare

  • Fix /seek and /fseek mis-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

14 Jun 20:03
Immutable release. Only release title and notes can be modified.
d1b0af8

Choose a tag to compare

  • 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 /autoplay command. Similar tracks come from Last.fm when the optional LASTFM_API_KEY is 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 /skip empties the queue, and honors the autoAnnounceNextSong setting when announcing new tracks.

Release v3.0.2

14 Jun 18:20
Immutable release. Only release title and notes can be modified.
87a60a7

Choose a tag to compare

  • 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/ora spinners, and dotenv's own startup banner is suppressed. Every line is now consistently formatted and parseable under LOG_FORMAT.
  • Add graceful shutdown: on SIGINT/SIGTERM the 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/Turso DATABASE_URL is 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-wrappers stub, and stale type packages (@types/bluebird, @types/ms, @types/validator, @types/node-emoji).

Release v3.0.1

14 Jun 15:42
Immutable release. Only release title and notes can be modified.
bff1ddf

Choose a tag to compare

  • 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 /resume now 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 (plain default, json, or ecs) and LOG_LEVEL (info default). 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 at LOG_LEVEL=debug.
  • Build and publish a multi-arch pre-release image to ghcr.io/bunkerlab-net/mochi:edge (and :sha-<commit>) on every push to master, so changes can be tested before a release.

Release v3.0.0

14 Jun 13:41
de22d2e

Choose a tag to compare

  • 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 hk git hooks (replacing Husky).
  • Run the Docker image as the non-root bun user and publish multi-arch (linux/amd64 and linux/arm64) images only to ghcr.io/bunkerlab-net/mochi, built natively on pinned runners with layer caching.
  • Fix containerized playback on linux/arm64 by correcting the @discordjs/opus source build and loading the @snazzah/davey voice binding from node_modules at runtime.
  • Replace deprecated discord.js APIs (readyclientReady and ephemeral → message flags).