Skip to content

Direct Installation

SnapDog is distributed as lightweight native binaries. The current release workflow publishes Linux (x86_64, aarch64), macOS (x86_64, aarch64), and Windows (x86_64, aarch64) artifacts.


Ensure your target machine meets the following requirements:

  • Linux: Kernel 5.4 or higher. ALSA (Advanced Linux Sound Architecture) is required for local audio output interfaces.
  • macOS: macOS 12 (Monterey) or higher.
  • Windows: Windows 10/11 or Windows Server 2019+ (supported when running as a background service).

AUR helper tools can be used to install the latest pre-compiled binary or build SnapDog directly from the Arch User Repository.

Terminal window
# Install the server and audio client
yay -S snapdog snapdog-client
# Enable and start both services (the packages install their systemd units)
sudo systemctl enable --now snapdog snapdog-client

If you prefer to install the pre-compiled binaries manually:

  1. Download the correct archive for your architecture from the GitHub Releases page.
  2. Extract the archive and copy the binary to /usr/local/bin:
    Terminal window
    tar -xzf snapdog-vX.Y.Z-x86_64-unknown-linux-gnu.tar.gz
    sudo mv snapdog /usr/local/bin/
    sudo chmod 755 /usr/local/bin/snapdog

If you want to compile SnapDog with custom target optimizations, you can build it from source using Cargo.

Ensure your development machine has the required system libraries installed:

  • Debian/Ubuntu: sudo apt install build-essential pkg-config clang libasound2-dev libavahi-compat-libdnssd-dev
  • macOS: Xcode Command Line Tools are sufficient.
  1. Clone the repository:
    Terminal window
    git clone https://github.com/SnapDogRocks/snapdog.git
    cd snapdog
  2. Build the release binary:
    Terminal window
    cargo build --release -p snapdog
  3. The compiled binary will be available at target/release/snapdog.

This section is only for the direct binary download and source builds. The AUR and APT packages install their own systemd units, and Homebrew runs SnapDog through brew services.

Create /etc/systemd/system/snapdog.service. It matches the unit the packages ship, with the binary in /usr/local/bin:

[Unit]
Description=SnapDog multiroom audio server
After=network-online.target sound.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/snapdog --config /etc/snapdog/snapdog.toml
Restart=on-failure
RestartSec=5
DynamicUser=yes
SupplementaryGroups=audio
StateDirectory=snapdog
WorkingDirectory=/var/lib/snapdog
ConfigurationDirectory=snapdog
ProtectSystem=strict
ProtectHome=yes
NoNewPrivileges=yes
PrivateTmp=yes
[Install]
WantedBy=multi-user.target

Then load and start it:

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable --now snapdog

For the audio client, use snapdog-client.service from the repository the same way and change its ExecStart to /usr/local/bin/snapdog-client.

Create ~/Library/LaunchAgents/cc.snapdog.server.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>cc.snapdog.server</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/snapdog</string>
<string>--config</string>
<string>/Users/Shared/snapdog.toml</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>

SnapDog supports two primary Snapcast compilation backends. You can select the backend using Cargo feature flags:

  • snapcast-embedded (Default & Recommended): Integrates the Snapcast server directly into the Rust daemon binary (leveraging our native Rust port of the original C++ Snapcast codebase via the snapcast-* crates). This mode is strongly recommended because it manages group synchronization inline, supports proprietary float PCM channels for parametric EQ corrections, and doesn’t require maintaining an external binary.
  • snapcast-process: Spawns and manages a standalone C++ snapserver process in the background. Choose this only if you must rely on advanced C++ features or legacy external pipe encoders.