Links
Tags
Creators
Details
0.3.0-beta.2+mc1.21.1
Compatibility
Changes
Changelog
0.3.0-beta.2
First published beta, for Minecraft 26.2 and 1.21.1. Other targets stay at
0.3.0-alpha.3. The 0.3.0-beta.1 tags pointed at the wrong commits, so the
release checks rejected them. They produced no release and remain reserved. The
only change since the tested commit is this version number and these notes.
Test evidence
- Target: Minecraft 1.21.1, NeoForge 21.1.235, Java 21, commit
65f0555, tested on macOS on Apple Silicon. - Automated tests and the scripted checklist (
neoforge/driver/checklist) pass in the real client and on a dedicated server: play, pause, resume, seek, stop, volume, several speakers, automatic stop, resource reload, rejoin, server restart, and a player without operator permission. - Sync between two clients on one machine: a late joiner's playback clock was within 10 ms of the first player's, and 5 ms after a seek. This compares playback clocks, not the sound itself.
- In-game tool install, YouTube link and music folder import pass on this target.
Not tested
- Nobody has listened to this build, including the volume slider change.
- Windows and Linux, including the tool downloads on those systems.
- Two computers over a real network, and multi-hour sessions.
/phonon tools update,allowToolInstall=false, and non-defaultaudioQuality.
Known issues
- Pausing a singleplayer game may leave audio behind the playback clock. This is suspected from the code and hasn't been measured.
- On 1.21.1, resource reload can log
Stop: Invalid name parameter. Playback recovers.
Getting started
- List the Speaker in the creative menu, unlock its recipe on picking up a jukebox, and add a first advancement.
- Offer to install yt-dlp, FFmpeg and Deno from chat when an operator needs them,
using pinned builds with verified checksums, then retry the add. Turn this off
with
allowToolInstall. Add/phonon toolsto see what was found and update yt-dlp. - Import audio files from
phonon_musicin the world folder on startup and on/phonon reload. /phonon addno longer needs a name or quotes: it can use the video's title.
Playback
- Follow the Jukebox/Note Blocks volume slider instead of Blocks.
- Show the vanilla "Now Playing" line when a nearby speaker starts a new track.
Messages
- Say why adding audio failed and what to do about it, instead of always blaming yt-dlp.
- Translate all GUI and command text, and add Simplified Chinese.
Fixes and settings
- Save the track list on every change, so
/phonon reloadno longer forgets tracks added since the server started. - Add the
audioQualityserver setting.
0.3.0-alpha.3
This alpha fixes bugs reported by players. It passes compilation and automated tests on every target. Manual gameplay testing is still outstanding, so this build remains alpha.
Fixes
- Restore speaker and config screen text on targets where the game skips colours with zero alpha.
- Run yt-dlp directly instead of probing it with a 5 second limit, which could report a slow start as "not found" and block the server thread.
- Log yt-dlp's output when it fails, and the
PATHwhen it cannot start. - Keep the track list highlight inside the selection box on Minecraft 1.21.1 through 1.21.8.
0.3.0-alpha.1
This is an alpha build. Every target passes compilation and automated tests, and selected targets pass server or client startup smoke tests, but each published Minecraft target still requires manual in-game validation before promotion to beta.
Performance
- Move OGG page indexing from whole-file reads to bounded sequential channel reads.
- Move server audio reads off the tick thread, keep file channels open per transfer, prefetch two chunks, and schedule players fairly under global and per-player byte budgets.
- Remove repeated packet splitting and full-buffer cache assembly from client streaming.
- Decode PCM directly into OpenAL-bound buffers and retain partial Vorbis frames without reallocating native scratch memory on every fill.
- Share compressed cached OGG bytes across speakers while keeping independent decoder state.
- Replace repeated collision ray clips with staggered block traversal for acoustic occlusion.
- Cache sorted audio metadata snapshots and normalized client search keys.
Reliability and security
- Add explicit stream IDs, ordered chunks, cancellation, reference-counted shared downloads, and safe forward-only stream reuse.
- Use monotonic local playback clocks and latency-adjusted state snapshots instead of comparing wall clocks across machines.
- Validate speaker interaction distance, resource IDs, actions, seek bounds, volume, packet collection sizes, strings, headers, chunks, and sample rates.
- Validate OGG Vorbis files before registration and bound direct downloads and converted file sizes.
- Save metadata and cached streams through temporary files with atomic replacement where supported.
- Enforce the configured client cache limit and clean incomplete cache files.
- Reset server and client streaming state across disconnects, resource reloads, and repeated integrated-server lifecycles.
Build and release management
- Add exact-target release branches for Minecraft 1.21.1 through 1.21.11, 26.1,
26.1.1, 26.1.2, and 26.2;
maintargets 26.2. - Pin each branch to its matching NeoForge release. Minecraft 1.21.x uses Java 21, while Minecraft 26.x uses Java 25.
- Remove unused Mixin declarations and replace the optional Cloth Config screen with a dependency-free vanilla screen.
- Add unit tests for OGG indexing, seek lookup, segmented buffering, playback clocks, metadata indexes, persistence, and stream sharing.
- Add explicit alpha, beta, and release channel mapping with version-qualified Minecraft tags and guarded GitHub publishing environments.
- Pass dedicated-server startup smoke tests on 1.21.1, 1.21.2, 1.21.4, 1.21.9, 26.1, and 26.2, plus a 26.2 client resource and audio-engine startup smoke test. The full multiplayer and playback checklist remains untested.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:eQMs1sDd:yGkesnjD"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:eQMs1sDd:yGkesnjD"
}

