Install on macOS
This guide covers installing Astromesh Node on macOS 13 (Ventura) and later.
Prerequisites
Section titled “Prerequisites”| Requirement | Version | Check |
|---|---|---|
| macOS | 13 (Ventura)+ | sw_vers -productVersion |
| Architecture | Apple silicon (arm64) or Intel (x86_64) since v0.1.10; up to v0.1.9, Apple silicon only | uname -m |
| Python | None — the archive carries its own CPython 3.12 in /usr/local/opt/astromesh/python (since v0.1.9) | — |
| Network | Outbound to LLM provider or local Ollama | — |
Download
Section titled “Download”Node archives are attached to the node-v* releases on GitHub (the repository’s “latest” release is the core, so releases/latest/download/... does not find them). There is one archive per architecture, arm64 (Apple silicon) and x86_64 (Intel); uname -m picks the right one:
VERSION=0.1.10ARCH=$(uname -m)curl -LO https://github.com/monaccode/astromesh/releases/download/node-v${VERSION}/astromesh-node-${VERSION}-macos-${ARCH}.tar.gzUp to v0.1.9 there was a single astromesh-node-<version>-macos.tar.gz, built for Apple silicon only.
Install
Section titled “Install”The archive has no top-level folder, so extract it into one and run the installer script:
mkdir astromesh-nodetar -xzf astromesh-node-${VERSION}-macos-${ARCH}.tar.gz -C astromesh-nodecd astromesh-nodesudo ./install.shThe installer:
- Copies the bundled CPython and the virtualenv to
/usr/local/opt/astromesh/{python,venv}/, replacing any previous copy, and symlinksastromeshdandastromeshctlinto/usr/local/bin/ - Creates
/Library/Application Support/Astromesh/{config,data}and/Library/Logs/Astromesh/ - Creates the
_astromeshsystem user (no login shell) - Copies the launchd plist to
/Library/LaunchDaemons/com.astromesh.daemon.plist(it does not load it)
Verify the installation:
astromeshctl versionExpected output:
astromesh-cli 0.3.1astromesh core 0.61.0Gatekeeper (macOS Security)
Section titled “Gatekeeper (macOS Security)”On first run, macOS Gatekeeper may block the binaries because they are not from the Mac App Store. To allow them:
sudo xattr -d com.apple.quarantine /usr/local/bin/astromeshdsudo xattr -d com.apple.quarantine /usr/local/bin/astromeshctlOr open System Settings > Privacy & Security and click “Allow Anyway” after the first blocked execution.
Configure
Section titled “Configure”The launchd plist starts the daemon with --config "/Library/Application Support/Astromesh/config", but sudo astromeshctl init writes to /etc/astromesh/ when run as root. Run the wizard in dev mode from the Astromesh folder so it writes where the daemon reads:
cd "/Library/Application Support/Astromesh"sudo astromeshctl init --devFor a non-interactive setup:
sudo astromeshctl init --dev --role full --non-interactiveThis creates config/runtime.yaml and config/providers.yaml. The macOS archive ships neither role profiles nor sample agents, so the wizard writes an empty runtime.yaml (all services on, port 8000 — the full defaults) and no agents: add your *.agent.yaml files to config/agents/. An API key you enter goes to /Library/Application Support/Astromesh/.env, which launchd does not read — set it in the plist’s EnvironmentVariables instead.
See Configuration for the full schema.
Start the Service
Section titled “Start the Service”Load and start the launchd daemon:
sudo launchctl load /Library/LaunchDaemons/com.astromesh.daemon.plistTo stop:
sudo launchctl unload /Library/LaunchDaemons/com.astromesh.daemon.plistThe daemon is configured with KeepAlive = true — launchd restarts it automatically if it exits, and loads it at boot once installed in /Library/LaunchDaemons/.
Verify
Section titled “Verify”astromeshctl statuscurl http://localhost:8000/v1/healthLog Access
Section titled “Log Access”launchd writes the daemon’s stdout and stderr to /Library/Logs/Astromesh/:
tail -f /Library/Logs/Astromesh/astromeshd.err.logtail -f /Library/Logs/Astromesh/astromeshd.out.logFilesystem Paths
Section titled “Filesystem Paths”| Path | Purpose |
|---|---|
/Library/Application Support/Astromesh/config/ | Configuration files |
/Library/Application Support/Astromesh/data/ | Persistent state |
/Library/Logs/Astromesh/ | Log files |
/usr/local/opt/astromesh/venv/ | Virtualenv (astromeshd, astromeshctl symlinked into /usr/local/bin/) |
/Library/LaunchDaemons/com.astromesh.daemon.plist | launchd unit |
Upgrade
Section titled “Upgrade”Unload the daemon, then download, extract and run sudo ./install.sh as above — since v0.1.9 it replaces the old python/ and venv/ itself. The installer does not reload the daemon; load it yourself:
sudo launchctl unload /Library/LaunchDaemons/com.astromesh.daemon.plist# download + extract + sudo ./install.shsudo launchctl load /Library/LaunchDaemons/com.astromesh.daemon.plistUninstall
Section titled “Uninstall”sudo launchctl unload /Library/LaunchDaemons/com.astromesh.daemon.plistsudo rm /Library/LaunchDaemons/com.astromesh.daemon.plistsudo rm /usr/local/bin/astromeshd /usr/local/bin/astromeshctlsudo rm -rf /usr/local/opt/astromeshTo remove all configuration and data:
sudo rm -rf "/Library/Application Support/Astromesh" /Library/Logs/Astromeshsudo dscl . -delete /Users/_astromeshNext Steps
Section titled “Next Steps”- Configuration — Customize runtime.yaml and profiles
- CLI Reference — Full astromeshctl reference
- Troubleshooting — Common macOS issues