macOS

Moss runs natively on macOS 13+ (Apple silicon and Intel). The same single binary and web panel; only the platform layer (src/platform/macos.rs) differs.

Install

Script (verifies the SHA-256 before installing one file, runs nothing else):

curl -fsSL https://github.com/T1nkiePlayz/Moss/releases/latest/download/install.sh -o install.sh
less install.sh                       # read it first
sh install.sh --prefix "$HOME/.local" # or without --prefix for /usr/local/bin (uses sudo)

Homebrew: each release ships a moss.rb formula with the real checksums.

brew install --formula ./moss.rb
brew services start moss        # data and logs under $(brew --prefix)/var/moss and /var/log

By hand: download moss-<tag>-macos-aarch64.tar.gz (or -x86_64), check it with shasum -a 256 -c SHA256SUMS.txt and gh attestation verify, then copy moss somewhere on your PATH.

Gatekeeper

Files downloaded with curl or the install script are not quarantined. A tarball downloaded in a browser is, and the unsigned binary is then blocked on first launch (“cannot be opened because the developer cannot be verified”). Remove the flag once, after you have verified the checksum:

xattr -d com.apple.quarantine /usr/local/bin/moss

(Release binaries are ad-hoc signed by the linker, not notarised.)

Run

MOSS_AUTH=dev moss serve          # no sign-in, loopback only: for trying it out
moss doctor                       # checks data directory, port, Java and sign-in settings

For real use, sign-in works out of the box: the release includes the sign-in settings in .env (the launchd steps below copy it). Open the panel, sign in, and enter the setup token Moss wrote to <data dir>/setup-token to become the owner. To pin the owner by e-mail instead, add MOSS_OWNER_EMAILS=you@example.com to that file.

launchd

io.moss.controller.plist (in the tarball and in packaging/macos/) is a per-user LaunchAgent: KeepAlive, working directory, logs in ~/Library/Logs/Moss, settings sourced from ~/Library/Application Support/Moss/moss.env.

mkdir -p ~/Library/LaunchAgents ~/Library/Logs/Moss "$HOME/Library/Application Support/Moss"
sed "s#REPLACE_ME_HOME#$HOME#g" io.moss.controller.plist > ~/Library/LaunchAgents/io.moss.controller.plist
cp .env "$HOME/Library/Application Support/Moss/moss.env"   # the shipped sign-in settings; add options from moss.env.example
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/io.moss.controller.plist
launchctl kickstart -k gui/$(id -u)/io.moss.controller     # restart
launchctl bootout gui/$(id -u)/io.moss.controller           # stop

A LaunchAgent runs while you are logged in. For a headless Mac mini use a LaunchDaemon (see the comment in the plist) with a dedicated unprivileged user. Game servers are detached from Moss (AbandonProcessGroup), so restarting or upgrading Moss never stops them; Moss re-attaches by PID and start time.

Java

Moss finds Java in JAVA_HOME, /Library/Java/JavaVirtualMachines, and Homebrew (brew install openjdk@21, both /opt/homebrew and /usr/local). It never runs /usr/bin/java: on a Mac without a JDK that stub opens an “install Java” dialog. Settings > Java > Install downloads a checksum-verified Temurin JRE (macOS builds nest the runtime in Contents/Home) into the data directory. Removing a managed runtime is refused while a running server uses it.

What differs from Linux

Linux macOS
Memory, CPU and process limits cgroup v2 (needs a delegated cgroup, see packaging/moss.service) not available: limits are saved, shown as “not enforced” and reported as an info finding
Out-of-memory detection “killed by the memory limit” crash detail not available (the OS may kill a JVM silently)
Server memory metric cgroup memory.current resident set size (libproc)
CPU metric /proc libproc per process group
Host CPU / memory /proc/stat, /proc/meminfo ps and vm_stat (a few ms each, cached)
Service manager systemd launchd, or brew services
Prebuilt downloads linux-x86_64 macos-aarch64, macos-x86_64

A Mac that sleeps pauses its servers: keep it awake (caffeinate -s, or Energy settings) for a server that should stay up. Moss does not change power settings for you.