deploy-macos
Skill3.8k starsChanged 20 days agoApache-2.0View on GitHub
Use this skill when deploying, installing, launching, or serving mesh-llm on a macOS machine (local or remote over SSH), including installing a release, shipping a dev build bundle, codesign/quarantine fixes, choosing a model, and verifying it serves.
- Pipes a download into a shell
- Reads credentials
- Deletes or force-pushes
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 7 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 10
Use this when standing up mesh-llm on a macOS machine — either installing a release or shipping a locally built dev binary to a remote Mac …
- Distinctive: line 82
No Apple-issued identity is needed for SSH/interactive-shell launches.
- Distinctive: line 84
Verify the version on the remote matches what you built:
- Distinctive: line 104
If that happens, for the affected app/binary identity:
- Distinctive: line 106
Avoid re-signing it between attempts (a new signature can reset the remembered decision).
- Distinctive: line 114
Check System Settings > Privacy & Security > Local Network.
- Distinctive: line 125
Treat the network preflight as passed only after both nodes report an iroh
- Distinctive: line 133
If no alert appears, keep the process alive after its first failed LAN operation: macOS can fail to display the alert for very short-lived …
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
deploy-macos
Use this when standing up mesh-llm on a macOS machine — either installing a release or shipping a locally built dev binary to a remote Mac for testing.
This is the macOS counterpart to deploy-linux-gpu. The current binary embeds
the staged llama.cpp runtime: the bundle is a single mesh-llm binary.
There is no rpc-server, no llama-server, and no .dylib set anymore — if
you see instructions mentioning those, they are outdated.
Related skills/docs:
deploy-linux-gpu— remote Linux/CUDA nodesdeploy-windows— Windows nodesmesh-join— creating/joining private and public meshes (tokens, NAT, multi-node)connect-agents— pointing Goose/Claude Code/OpenCode/Pi at a running meshmesh/docs/USAGE.md— install details, service mode, model storagemesh/docs/CLI.md— full command and model-ref reference
The one rule that matters most
mesh-llm resolves and downloads the model itself. Pass --model <ref> and
it fetches the GGUF into the standard Hugging Face cache on first use. Do NOT
pre-download with hf/huggingface-cli, do NOT scp GGUFs around. (Only
--gguf takes a local file path you manage yourself.)
Install path A: official release (most cases)
curl -fsSL https://raw.githubusercontent.com/Mesh-LLM/mesh-llm/main/install.sh | bashThe binary lands at ~/.local/bin/mesh-llm (may not be on a non-interactive
SSH PATH — use the full path or bash -lc). Metal is the macOS backend; the
installer picks it automatically.
To install as a per-user background service (launchd agent) in the same step:
curl -fsSL https://raw.githubusercontent.com/Mesh-LLM/mesh-llm/main/install.sh | bash -s -- --serviceService files: ~/Library/LaunchAgents/com.mesh-llm.mesh-llm.plist, shared env
in ~/.config/mesh-llm/service.env, startup models in ~/.mesh-llm/config.toml.
Install path B: dev build to a remote Mac
Build and bundle locally (from the repo):
just release-build # serious testing must use the release binary
just bundle # /tmp/mesh-llm-bundle.tar.gz (single mesh-llm binary)Ship and unpack:
scp -P <SSH_PORT> /tmp/mesh-llm-bundle.tar.gz user@host:
ssh -p <SSH_PORT> user@host 'mkdir -p ~/bin && tar xzf mesh-llm-bundle.tar.gz -C ~/bin --strip-components=1'Check quarantine xattrs when another transfer path was used
This scp and tar path does not normally add or propagate
com.apple.quarantine. If the binary came through another transfer path and
the attribute is present, remove it before retrying:
if xattr -p com.apple.quarantine ~/bin/mesh-llm >/dev/null 2>&1; then
xattr -d com.apple.quarantine ~/bin/mesh-llm
fi
codesign --verify --verbose=2 ~/bin/mesh-llm # re-sign ad-hoc only if this failsNo Apple-issued identity is needed for SSH/interactive-shell launches.
Verify the version on the remote matches what you built:
~/bin/mesh-llm --versionTroubleshooting: macOS Local Network privacy (same-LAN join/split failures, relay-only peers)
This is not a deploy precondition. Launching an ad-hoc/linker-signed binary from SSH or an interactive shell is the normal lab path and has worked across our Macs repeatedly. Use this section when a same-LAN join or split fails, two Macs on the same LAN connect via relay instead of directly, or a GUI app / launch agent shows a Local Network alert — check this before diagnosing iroh.
macOS Local Network privacy is keyed to the responsible code and its code signature. Replacing or ad-hoc re-signing a development binary can therefore change the identity whose decision macOS remembers. A GUI app or launch agent may show a blocking Local Network alert on the logged-in desktop even though the same network is reachable from an interactive shell.
If that happens, for the affected app/binary identity:
- Avoid re-signing it between attempts (a new signature can reset the
remembered decision); for GUI apps/launch agents prefer a stable identity. Verify with
codesign --verify --verbose=2 <path>and recordcodesign -dv --verbose=4 <path> 2>&1in the lab evidence. - Launch it once from the same responsible app/service context intended for the test while a user is logged in at the Mac. Trigger a mesh join or mDNS operation, then accept the Local Network alert on that Mac. Repeat on every Mac participating in the test.
- Check System Settings > Privacy & Security > Local Network. If the responsible app is listed, make sure access is enabled. macOS offers no supported command to query or reset an individual program from the undetermined state, so scripts must not claim this check passed merely because a raw UDP probe worked.
- Authorize the exact launch context that will run the test. For a
CLI-launched repro over SSH, use the held foreground TTY described by
remote-observable-process. If a per-user launchd agent or GUI app will run the workload, launch that exact agent/app while a user is logged in and accept its prompt before diagnosis; an SSH TTY does not authorize a different responsible app. - Treat the network preflight as passed only after both nodes report an iroh
direct path,
observed_via_relay=false, and anobserved_direct_remote_addrwhose IP matches the intended LAN address of the peer.direct_addr_available=truealone only proves that some direct address was observed. An invitation containing a LAN candidate, a raw UDP probe, or a working relay path does not prove the deployed process has Local Network access.
If no alert appears, keep the process alive after its first failed LAN operation: macOS can fail to display the alert for very short-lived processes. Rule this out before debugging iroh candidate selection. See Apple TN3179, Understanding local network privacy.
Launch
Serve a model and join the public mesh:
mesh-llm serve --model unsloth/Qwen3.6-27B-GGUF:UD-Q4_K_XL --auto--autodiscovers and joins the community mesh; local serving and mesh joining happen together.- Without
--auto(and without--join/--discover) you create a private mesh and an invite token is emitted — see themesh-joinskill. --modelaccepts catalog names,repo:QUANT,repo/file.gguf, or a full HF URL.--gguf /path/file.ggufserves a local file directly.- API on
:9337, management console on:3131(override with--port/--console).
Notes / gotchas:
- Do NOT use
--headlessto "go quiet" — it only disables the embedded web UI and does nothing for backgrounding. For machine-readable output use--log-format json. - Model load takes time. Poll
/v1/modelsuntil your model appears before concluding anything is broken. - For background test runs from an agent:
bash -c 'nohup mesh-llm serve --model <ref> --auto > /tmp/mesh.log 2>&1 & disown'. For persistence across reboots, prefer the--serviceinstall.
Verify it's actually serving
# Ports bound
lsof -nP -iTCP:9337 -iTCP:3131 -sTCP:LISTEN
# Models (union of local + mesh peers)
curl -s http://localhost:9337/v1/models
# Status / peers
curl -s http://localhost:3131/api/status
# Inference — the returned "model" field tells you which node/model answered
curl -s http://localhost:9337/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"auto","messages":[{"role":"user","content":"hi"}],"max_tokens":16}'To force your local model specifically, pass its exact id from /v1/models
instead of auto.
Logs and state
~/.mesh-llm/runtime/<pid>/logs/skippy-native.log— embedded llama.cpp/skippy native logs. Check here first if a model fails to load.~/.mesh-llm/key— persistent node identity.~/.mesh-llm/config.toml— startup models and defaults for baremesh-llm serve.- HF cache (
~/.cache/huggingface/...) — downloaded GGUFs; you generally never need to touch this.
Stop / clean up
mesh-llm stop # scoped stop of tracked instances (preferred)
# emergency only: use the PID for the specific instance being validated
kill -9 <mesh-llm-pid>A clean stop removes the instance runtime dir under ~/.mesh-llm/runtime/.
Troubleshooting
| Symptom | Cause | Fix |
| Exit 137 (SIGKILL) after launch | Quarantine xattr possible if another transfer path was used | Check xattr -p com.apple.quarantine; if present remove it, then verify the signature as above |
mesh-llm: command not found over SSH | ~/.local/bin not on non-interactive PATH | Full path or bash -lc |
Empty /v1/models | Model still downloading/loading | Wait; watch skippy-native.log |
| "No inference server available" | Election in progress or load failed | Check stderr + skippy-native.log |
| Stale runtime dir after crash | Unclean exit | rm -rf ~/.mesh-llm/runtime/<stale_pid>/ (auto-GC'd after 1h too) |
Trending
Quiet since April.about the whole repository
Who's talking about michaelneale/mesh-llm
- A Hacker News story“Pool spare GPU capacity to run LLMs at larger scale”Hacker News · Mar 24, 2026 · 11 points
- @rusttrending.bsky.social“michaelneale / mesh-llm: reference impl with llama.cpp compiled to distributed inference across machines, …”Bluesky · Apr 11, 2026 · 2 likes
- @yug1224.com“複数のLLMを連携させてタスクをこなすための分散型エージェントフレームワークらしい 複雑なワークフローを構築する際に役立ちそうかな yug1224 starred michaelneale/mesh-llm…”Bluesky · Apr 8, 2026 · 1 likes
- Mesh-LLM/mesh-llm“Add mesh-llm MoE planning, analysis, and ranking contribution commands”GitHub · Apr 11, 2026
- Mesh-LLM/mesh-llm“Simplify model for node states”GitHub · Apr 10, 2026
The biggest 5 of 18 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 18
Talked about on GitHub, Bluesky and Hacker News (18 times).
On GitHub · 15
- Apr 11, 2026Add mesh-llm MoE planning, analysis, and ranking contribution commands — Mesh-LLM/mesh-llm0 reactions · 1 comment
- Apr 10, 2026Simplify model for node states — Mesh-LLM/mesh-llm0 reactions · 2 comments
- Apr 10, 2026revise mesh publication rules — Mesh-LLM/mesh-llm0 reactions · 1 comment
- Apr 5, 2026Roll out config as local node config first, then reconcile mesh-wide desired state — Mesh-LLM/mesh-llm0 reactions · 2 comments
- Apr 3, 2026CommitLLM sumi capture: working on Apple Silicon Q8_0 — michaelneale/llama.cpp0 reactions
10 more on GitHub
- Apr 2, 2026Add hardware runtime status enrichment without changing model metadata sources — Mesh-LLM/mesh-llm0 reactions
- Apr 2, 2026Design owner identity propagation and direct verification — Mesh-LLM/mesh-llm0 reactions · 4 comments
- Apr 2, 2026Design owner keystore and Rust signed+encrypted message primitives — Mesh-LLM/mesh-llm0 reactions
- Apr 2, 2026Track splitting PR #130 into smaller rollout PRs — Mesh-LLM/mesh-llm0 reactions · 2 comments
- Apr 2, 2026research: mesh-llm integration — p2p inference mesh + model sharding under obol-stack economic layer — ObolNetwork/obol-stack0 reactions
- Apr 2, 2026[WIP] Make PR 103 mergable on top of PR 127 — Mesh-LLM/mesh-llm0 reactions
- Apr 2, 2026refactor: decompose mesh.rs and app/mod.rs into focused submodules — Mesh-LLM/mesh-llm0 reactions · 1 comment
- Mar 28, 2026Autoupdater — Mesh-LLM/mesh-llm0 reactions
- Mar 27, 2026Add a staged auto-updater for release bundles — Mesh-LLM/mesh-llm0 reactions
- Mar 27, 2026Add generic bulk transfer support to mesh plugins — Mesh-LLM/mesh-llm0 reactions
On Bluesky · 2
- Apr 11, 2026michaelneale / mesh-llm: reference impl with llama.cpp compiled to distributed inference across machines, with real end to end demo ★720… — @rusttrending.bsky.social2 likes and reposts
- Apr 8, 2026複数のLLMを連携させてタスクをこなすための分散型エージェントフレームワークらしい 複雑なワークフローを構築する際に役立ちそうかな yug1224 starred michaelneale/mesh-llm… — @yug1224.com1 likes and repost
On Hacker News · 1
- Mar 24, 2026Pool spare GPU capacity to run LLMs at larger scale11 points · 3 comments
Other versions1 project uses a version of this.
Word for word · 1
- Mesh-LLM/mesh-llm★ 3.5k100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository32 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .github/AGENTS.mdAGENTS.md
- mesh/AGENTS.mdAGENTS.md
- skippy/AGENTS.mdAGENTS.md
- benchmark-tuneSkill
- config-settings-managementSkill
- connect-agentsSkill
- deploy-linux-gpuSkill
- deploy-windowsSkill
- hf-bf16-gguf-conversion-jobsSkill
- hf-gguf-quant-jobsSkill
- hf-layer-package-jobsSkill
- hf-quant-and-layer-package-jobsSkill
- kv-tool-loop-stabilitySkill
- llama-patch-changesSkill
- llama-stage-patch-changesSkill
- manage-ciSkill
- mesh-joinSkill
- metrics-serverSkill
- plugin-web-ui-extensionSkill
- release-notesSkill
- release-validationSkill
- remote-observable-processSkill
- skippy-cache-family-benchSkill
- skippy-correctnessSkill
- skippy-family-certificationSkill
- skippy-metricsSkill
- skippy-model-packageSkill
- skippy-promptSkill
- skippy-servingSkill
- skippy-spec-benchSkill
- telemetry-privacy-reviewSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

