Join the #mesh-llm channel on the Goose Discord for discussion and questions.
This file covers local build and development workflows for this repository.
justcmake- Rust toolchain (
cargo) - Node.js 24 + npm (for UI development)
macOS: Apple Silicon. Metal is used automatically.
Linux NVIDIA: x86_64 with an NVIDIA GPU. Requires the CUDA toolkit (nvcc in your PATH). On Arch Linux, CUDA is typically at /opt/cuda; on Ubuntu/Debian it's at /usr/local/cuda. Auto-detection finds the right SM architecture for your GPU.
Linux AMD: ROCm/HIP is supported when ROCm is installed. Typical installs expose hipcc, hipconfig, and rocm-smi under /opt/rocm/bin.
Linux Vulkan: Vulkan is supported when the Vulkan development files and glslc are installed. On Ubuntu/Debian, install libvulkan-dev glslc. On Arch Linux, install vulkan-headers shaderc.
Windows: just build auto-detects cuda, hip/rocm, vulkan, or cpu. You can override with just build backend=cuda (or rocm, vulkan, cpu). Metal is not supported on Windows.
Build everything (llama.cpp fork, mesh binary, and UI production build):
just buildOn Linux, just build auto-detects CUDA vs ROCm vs Vulkan. For NVIDIA, make sure nvcc is in your PATH first:
# Arch Linux
PATH=/opt/cuda/bin:$PATH just build
# Ubuntu/Debian
PATH=/usr/local/cuda/bin:$PATH just buildFor NVIDIA builds, the script auto-detects your GPU's CUDA architecture. To override:
just build cuda_arch=90 # e.g. H100For AMD ROCm builds, you can force the backend explicitly:
just build backend=rocmTo override the AMD GPU target list:
just build backend=rocm rocm_arch="gfx90a;gfx942;gfx1100"For Vulkan builds, force the backend explicitly:
just build backend=vulkanFor CPU-only builds (no GPU acceleration):
just build backend=cpuOn Windows, you can override the detected backend if needed:
just build backend=vulkan
just build backend=cpu
just build backend=cuda cuda_arch=90Windows release bundles use dedicated Windows release recipes:
just release-build-cuda-windows
just release-bundle-cuda-windows v0.X.0GitHub Actions uses hosted windows-2022 runners for compile-only Windows CI and release packaging. The workflow installs CUDA, HIP SDK, and Vulkan SDK on demand before invoking the same just recipes.
Create a portable bundle:
just bundleUse this two-terminal flow for UI development.
Terminal A (run mesh-llm yourself):
mesh-llm --port 9337 --console 3131If mesh-llm is not on your PATH:
./target/release/mesh-llm --port 9337 --console 3131Terminal B (run Vite with HMR):
just ui-devOpen:
http://127.0.0.1:5173
ui-dev defaults:
- Serves on
127.0.0.1:5173 - Proxies
/api/*tohttp://127.0.0.1:3131
Overrides:
# Different backend API origin for /api proxy
just ui-dev http://127.0.0.1:4141
# Different Vite dev port
just ui-dev http://127.0.0.1:3131 5174just stop # stop mesh/rpc/llama processes
just test # quick test against :9337
just compat-smoke ~/.cache/huggingface/hub/<model>.gguf # optional 2-node + 1-client Python/Node/LiteLLM smoke
just --list # list all recipesCI uses dorny/paths-filter to skip jobs when unchanged areas of the repo are modified. A changes detection job runs first on every push and PR, then each build job gates on its output.
| Changed paths | linux / macos |
linux_cuda / linux_rocm / linux_vulkan / windows |
|---|---|---|
mesh-llm/src/**, Cargo.*, Justfile, scripts/**, mesh-llm/build.rs, mesh-llm/plugin/**, mesh-llm/tests/**, mesh-llm/proto/** |
✅ runs | ✅ runs |
mesh-llm/ui/** |
✅ runs | ⏭ skipped |
**/*.md, docs/**, anything else |
⏭ skipped | ⏭ skipped |
Manual workflow_dispatch |
✅ runs | ✅ runs |
To confirm builds are skipped on a docs-only change, open a PR and push a commit that touches only a .md file (e.g. add a blank line to README.md). All build jobs should appear as Skipped in the Actions tab — only the changes job runs.
To confirm UI-only changes skip the GPU backend jobs, push a commit touching only mesh-llm/ui/**. The linux and macos jobs run; linux_cuda, linux_rocm, linux_vulkan, and windows are skipped.
If you add a new Rust crate, build script, or test directory, add its path to the rust filter in .github/workflows/ci.yml under the changes job so it correctly triggers the build matrix.
Memory bandwidth benchmark source files live in benchmarks/. These are optional — they are not compiled by just build. Each target platform requires its own toolchain.
just benchmark-build-apple # macOS Apple Silicon — requires swiftc (ships with Xcode)
just benchmark-build-cuda # NVIDIA GPU — requires CUDA toolkit (nvcc)
just benchmark-build-hip # AMD GPU — requires ROCm (hipcc)
just benchmark-build-intel # Intel Arc GPU — requires Intel oneAPI (icpx) — UNVALIDATEDOn Windows, use the dedicated recipes:
just benchmark-build-cuda-windows
just benchmark-build-hip-windows
just benchmark-build-intel-windowsThese produce .exe binaries next to mesh-llm.exe.
AMD note: The AMD benchmark (
benchmarks/membench-fingerprint.hip) has not been tested on real AMD hardware. The recipe is provided for reference only.
Intel Arc note: The Intel Arc benchmark (
benchmarks/membench-fingerprint-intel.cpp) has not been tested on real Intel Arc hardware. The recipe is provided for reference only.
All recipes output to mesh-llm/target/release/, the same directory as the mesh-llm binary. The detect_bin_dir() function in mesh-llm probes that directory at runtime, so benchmark binaries are discovered automatically.
The just bundle recipe automatically includes membench-fingerprint if it has been built:
just benchmark-build-apple && just bundleIf the binary is not present, just bundle prints a note and continues without it — the bundle is still valid.
CUDA, HIP, and Intel binaries are not included in the Unix tarball bundle; they must be compiled on the target platform.
On Windows release packaging, any membench-fingerprint*.exe binaries present in mesh-llm/target/release/ are included automatically in the generated .zip.