MODIFIED BUILD

SonoBus, patched

A fix for the SonoBus connection bug that stops the AU / VST3 plugin connecting on macOS. Build it yourself in one command. Free software, GPLv3.

Build it on your Mac

One command. It fetches the source, applies the fix, builds a universal binary (Apple Silicon and Intel), signs it, and installs the plugins for your DAW. Takes 15–40 minutes, mostly unattended.

curl -fsSLO https://vanini.space/static/downloads/sonobus/build-on-mac.sh bash build-on-mac.sh

You need Xcode command line tools (xcode-select --install) and Homebrew; the script installs cmake itself and tells you plainly if anything is missing.

Building locally avoids Gatekeeper entirely. The quarantine flag is only applied to downloaded files, so a plugin compiled on your own machine loads with no warning and nothing to work around.

What gets installed

  • ~/Library/Audio/Plug-Ins/VST3/SonoBus.vst3 — shows as “SonoBus”
  • ~/Library/Audio/Plug-Ins/VST3/SonoBusInstrument.vst3 — shows as “SonoBus Instrument”
  • ~/Library/Audio/Plug-Ins/Components/SonoBus.component — AU
  • ~/Applications/SonoBus.app — standalone

Quit and reopen your DAW afterwards so it rescans plugins.

If you had the official SonoBus installed before: its copies live in the system-wide /Library/Audio/Plug-Ins/ and your DAW may keep loading those instead of the patched ones — the bug then looks like it came back. The script checks for them at the end and prints the exact lines to move them aside. SonoBus is two plugins (“SonoBus” and “SonoBus Instrument”); both old copies need moving.

What this fixes

Upstream SonoBus has a bug where the AU and VST3 plugin fails to connect to a connection server, while the standalone app connects fine. It surfaces as “Connect failed: Invalid argument” — or, worse, as nothing at all.

Three bugs, one code path

  1. Name resolution reported the wrong error. The client resolved hostnames with gethostbyname() and reported failures using errno — which that function never sets. The message shown was whatever stale value happened to be in errno. When that value was 0, the caller read the failure as success and hung silently forever.
  2. Malformed addresses became a broadcast address. inet_addr() signals failure with a value indistinguishable from a valid 255.255.255.255, and the result was never checked — so bad input parsed out of untrusted network messages silently turned into a broadcast address.
  3. Connecting used select(), which breaks past 1024 open files. This is the one that actually produces the error. select() cannot handle a file descriptor at or above 1024; a DAW with a real session keeps far more files open than that, so the plugin’s socket lands above the limit, FD_SET overflows its buffer, and the connect fails with a bare “Invalid argument”. The standalone app keeps few files open and never hits it — which is exactly the plugin-only, sometimes-it-works pattern people report. Fixed by moving to poll(), which has no such limit.

Fully compatible with standard SonoBus. The patch changes nothing on the wire. You can still join groups with anyone running the official build, on the default server or any other.

Installing

Unzip, then copy the plugins into your user plug-in folders:

cp -R SonoBus.vst3 ~/Library/Audio/Plug-Ins/VST3/ cp -R SonoBus.component ~/Library/Audio/Plug-Ins/Components/

Clearing the quarantine flag

These plugins are ad-hoc signed but not notarized, so macOS marks them as quarantined after download and your DAW will refuse to load them. Clear it once:

xattr -dr com.apple.quarantine ~/Library/Audio/Plug-Ins/VST3/SonoBus.vst3 xattr -dr com.apple.quarantine ~/Library/Audio/Plug-Ins/Components/SonoBus.component

Then quit and reopen your DAW so it rescans plugins.

Source code and licence

SonoBus is free software licensed under the GNU General Public License v3. This is a modified version, and the modifications are published here as required by that licence.

  • Original project: github.com/sonosaurus/sonobus
  • Changes made: name resolution moved to getaddrinfo(), address parsing moved to inet_pton(), the connect wait moved from select() to poll(), connect failures forced to a non-zero return, and macOS network entitlements added to the build.
  • Modified: August 2026.

Apply to a clean upstream checkout with git apply. It applies to both main and develop.