Services and units

The units

Unit Scope Command
openmixer-server.service systemd user /usr/bin/openmixer-server --config /etc/openmixer/config.json
reac-pw.service systemd user /usr/bin/reac-pw, serving every segment declared in ~/.config/reac-pw/reac-pw.env, each configured by its own <iface>.env beside it. Packaged by reac-pw; openmixer writes the conf and drives the unit.
nginx.service system serves the static surface and proxies the server

Both openmixer units are installed by the openmixer-server package to /usr/lib/systemd/user/.

Why user units

The engine is a native PipeWire client. PipeWire runs per user session, so a system-scope service would attach to a different graph and find none of the operator's devices. The same reasoning applies to the transport, which publishes the stagebox as PipeWire nodes in that same graph.

The consequence is lingering: without loginctl enable-linger, systemd stops both units when the operator's last session ends.

Ordering

openmixer-server.service is ordered After=pipewire.service wireplumber.service and Wants=pipewire.service.

reac-pw.service is ordered After=pipewire.service network-online.target and wants both.

Neither waits for the other. The mixer copes with the stagebox arriving late, and the transport copes with the mixer restarting under it.

Everyday commands

systemctl --user status  openmixer-server reac-pw
systemctl --user restart openmixer-server
systemctl --user restart reac-pw
systemctl --user stop    openmixer-server
journalctl --user -u openmixer-server -f

Restarting the transport is safe with a box connected: the stagebox re-runs its handshake by itself and is normally back within seconds.

Capabilities on the transport

/usr/bin/reac-pw carries file capabilities cap_net_raw,cap_sys_nice=ep, applied by the reac-pw package's own scriptlet. CAP_NET_RAW is what lets it open the raw socket on the REAC interface; CAP_SYS_NICE is what lets it hold a real-time scheduling class for the packet cadence.

reac-pw.service verifies them before it execs, and fails with an explicit message if they are missing, rather than dying on a silent permission error inside the capture path.

getcap /usr/bin/reac-pw

NoNewPrivileges= is deliberately not set on that unit: the kernel ignores file capabilities across execve() when it is on, which would silently strip CAP_NET_RAW. Do not add it.

Unit overrides

Use drop-ins, never edits to the packaged files (an upgrade replaces those):

systemctl --user edit openmixer-server

Be aware that a file at ~/.config/systemd/user/openmixer-server.service — a whole unit, not a drop-in — shadows the packaged one and will make upgrades appear to have no effect. Check with:

systemctl --user list-unit-files | grep -E 'openmixer-server|reac-pw'

Both should resolve from /usr/lib/systemd/user/.