# Gateway on macOS (external launchd)
OpenSoul.app no longer bundles Node/Bun or the Gateway runtime. The macOS app expects an external opensoul CLI install, does not spawn the Gateway as a child process, and manages a per‑user launchd service to keep the Gateway running (or attaches to an existing local Gateway if one is already running).
# Install the CLI (required for local mode)
You need Node 22+ on the Mac, then install opensoul globally:
bash
npm install -g opensoul@<version>The macOS app’s Install CLI button runs the same flow via npm/pnpm (bun not recommended for Gateway runtime).
# Launchd (Gateway as LaunchAgent)
Label:
ai.opensoul.gateway(orai.opensoul.<profile>; legacycom.opensoul.*may remain)
Plist location (per‑user):
~/Library/LaunchAgents/ai.opensoul.gateway.plist(or~/Library/LaunchAgents/ai.opensoul.<profile>.plist)
Manager:
- The macOS app owns LaunchAgent install/update in Local mode.
- The CLI can also install it:
opensoul gateway install.
Behavior:
- “OpenSoul Active” enables/disables the LaunchAgent.
- App quit does not stop the gateway (launchd keeps it alive).
- If a Gateway is already running on the configured port, the app attaches to it instead of starting a new one.
Logging:
- launchd stdout/err:
/tmp/opensoul/opensoul-gateway.log
# Version compatibility
The macOS app checks the gateway version against its own version. If they’re incompatible, update the global CLI to match the app version.
# Smoke check
bash
opensoul --version
OPENSOUL_SKIP_CHANNELS=1 \
OPENSOUL_SKIP_CANVAS_HOST=1 \
opensoul gateway --port 18999 --bind loopbackThen:
bash
opensoul gateway call health --url ws://127.0.0.1:18999 --timeout 3000