MCPcopy
hub / github.com/exo-explore/exo

github.com/exo-explore/exo @v1.0.71 sqlite

repository ↗ · DeepWiki ↗ · release v1.0.71 ↗
2,598 symbols 11,883 edges 216 files 686 documented · 26%
README

exo logo

exo: Run frontier AI locally. Maintained by exo labs.

Discord X License: Apache-2.0


exo connects all your devices into an AI cluster. Not only does exo enable running models larger than would fit on a single device, but with day-0 support for RDMA over Thunderbolt, makes models run faster as you add more devices.

Features

  • Automatic Device Discovery: Devices running exo automatically discover each other - no manual configuration.
  • RDMA over Thunderbolt: exo ships with day-0 support for RDMA over Thunderbolt 5, enabling 99% reduction in latency between devices.
  • Topology-Aware Auto Parallel: exo figures out the best way to split your model across all available devices based on a realtime view of your device topology. It takes into account device resources and network latency/bandwidth between each link.
  • Tensor Parallelism: exo supports sharding models, for up to 1.8x speedup on 2 devices and 3.2x speedup on 4 devices.
  • MLX Support: exo uses MLX as an inference backend and MLX distributed for distributed communication.
  • Multiple API Compatibility: Compatible with OpenAI Chat Completions API, Claude Messages API, OpenAI Responses API, and Ollama API - use your existing tools and clients.
  • Custom Model Support: Load custom models from HuggingFace hub to expand the range of available models.

Dashboard

exo includes a built-in dashboard for managing your cluster and chatting with models.

exo dashboard - cluster view showing 4 x M3 Ultra Mac Studio with DeepSeek v3.1 and Kimi-K2-Thinking loaded

4 × 512GB M3 Ultra Mac Studio running DeepSeek v3.1 (8-bit) and Kimi-K2-Thinking (4-bit)

Benchmarks

Qwen3-235B (8-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

Benchmark - Qwen3-235B (8-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

<strong>Source:</strong> <a href="https://www.jeffgeerling.com/blog/2025/15-tb-vram-on-mac-studio-rdma-over-thunderbolt-5">Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5</a>

DeepSeek v3.1 671B (8-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

Benchmark - DeepSeek v3.1 671B (8-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

<strong>Source:</strong> <a href="https://www.jeffgeerling.com/blog/2025/15-tb-vram-on-mac-studio-rdma-over-thunderbolt-5">Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5</a>

Kimi K2 Thinking (native 4-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

Benchmark - Kimi K2 Thinking (native 4-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

<strong>Source:</strong> <a href="https://www.jeffgeerling.com/blog/2025/15-tb-vram-on-mac-studio-rdma-over-thunderbolt-5">Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5</a>

Quick Start

Devices running exo automatically discover each other, without needing any manual configuration. Each device provides an API and a dashboard for interacting with your cluster (runs at http://localhost:52415).

There are two ways to run exo:

Run from Source (macOS)

If you have Nix installed, you can skip most of the steps below and run exo directly:

nix run .#exo

Note: To accept the Cachix binary cache (and avoid the Xcode Metal ToolChain), add to /etc/nix/nix.conf:

trusted-users = root    (or your username)
experimental-features = nix-command flakes

Then restart the Nix daemon: sudo launchctl kickstart -k system/org.nixos.nix-daemon

Prerequisites: - Xcode (provides the Metal ToolChain required for MLX compilation) - brew (for simple package management on macOS)

bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - uv (for Python dependency management) - node (for building the dashboard)

bash brew install uv node - rust (to build Rust bindings, nightly for now)

bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup toolchain install nightly - macmon (for hardware monitoring on Apple Silicon)

Install the pinned fork revision used by this repo instead of Homebrew macmon. Homebrew macmon 0.6.1 still crashes on Apple M5.

bash cargo install --git https://github.com/vladkens/macmon \ --rev a1cd06b6cc0d5e61db24fd8832e74cd992097a7d \ macmon \ --force

Clone the repo, build the dashboard, and run exo:

# Clone exo
git clone https://github.com/exo-explore/exo

# Build dashboard
cd exo/dashboard && npm install && npm run build && cd ..

# Run exo
uv run exo

This starts the exo dashboard and API at http://localhost:52415/

Please view the section on RDMA to enable this feature on MacOS >=26.2!

Run from Source (Linux)

Prerequisites:

  • uv (for Python dependency management)
  • node (for building the dashboard) - version 18 or higher
  • rust (to build Rust bindings, nightly for now)

Installation methods:

Option 1: Using system package manager (Ubuntu/Debian example):

# Install Node.js and npm
sudo apt update
sudo apt install nodejs npm

# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install Rust (using rustup)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly

Option 2: Using Homebrew on Linux (if preferred):

# Install Homebrew on Linux
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Install dependencies
brew install uv node

# Install Rust (using rustup)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly

Note: The macmon package is macOS-only and not required for Linux.

Clone the repo, build the dashboard, and run exo:

# Clone exo
git clone https://github.com/exo-explore/exo

# Build dashboard
cd exo/dashboard && npm install && npm run build && cd ..

# Run exo
uv run exo

This starts the exo dashboard and API at http://localhost:52415/

Important note for Linux users: Currently, exo runs on CPU on Linux. GPU support for Linux platforms is under development. If you'd like to see support for your specific Linux hardware, please search for existing feature requests or create a new one.

Configuration Options:

  • --no-worker: Run exo without the worker component. Useful for coordinator-only nodes that handle networking and orchestration but don't execute inference tasks. This is helpful for machines without sufficient GPU resources but with good network connectivity.

bash uv run exo --no-worker

File Locations (Linux):

exo follows the XDG Base Directory Specification on Linux:

  • Configuration files: ~/.config/exo/ (or $XDG_CONFIG_HOME/exo/)
  • Data files: ~/.local/share/exo/ (or $XDG_DATA_HOME/exo/)
  • Cache files: ~/.cache/exo/ (or $XDG_CACHE_HOME/exo/)
  • Log files: ~/.cache/exo/exo_log/ (with automatic log rotation)
  • Custom model cards: ~/.local/share/exo/custom_model_cards/

You can override these locations by setting the corresponding XDG environment variables.

macOS App

exo ships a macOS app that runs in the background on your Mac.

exo macOS App - running on a MacBook

The macOS app requires macOS Tahoe 26.2 or later.

Download the latest build here: EXO-latest.dmg.

The app will ask for permission to modify system settings and install a new Network profile. Improvements to this are being worked on.

Custom Namespace for Cluster Isolation:

The macOS app includes a custom namespace feature that allows you to isolate your exo cluster from others on the same network. This is configured through the EXO_LIBP2P_NAMESPACE setting:

  • Use cases:
  • Running multiple separate exo clusters on the same network
  • Isolating development/testing clusters from production clusters
  • Preventing accidental cluster joining

  • Configuration: Access this setting in the app's Advanced settings (or set the EXO_LIBP2P_NAMESPACE environment variable when running from source)

The namespace is logged on startup for debugging purposes.

Uninstalling the macOS App

The recommended way to uninstall is through the app itself: click the menu bar icon → Advanced → Uninstall. This cleanly removes all system components.

If you've already deleted the app, you can run the standalone uninstaller script:

sudo ./app/EXO/uninstall-exo.sh

This removes: - Network setup LaunchDaemon - Network configuration script - Log files - The "exo" network location

Note: You'll need to manually remove EXO from Login Items in System Settings → General → Login Items.


Enabling RDMA on macOS

RDMA is a new capability added to macOS 26.2. It works on any Mac with Thunderbolt 5 (M4 Pro Mac Mini, M4 Max Mac Studio, M4 Max MacBook Pro, M3 Ultra Mac Studio).

Please refer to the caveats for immediate troubleshooting.

To enable RDMA on macOS, follow these steps:

  1. Shut down your Mac.
  2. Hold down the power button for 10 seconds until the boot menu appears.
  3. Select "Options" to enter Recovery mode.
  4. When the Recovery UI appears, open the Terminal from the Utilities menu.
  5. In the Terminal, type: rdma_ctl enable and press Enter.
  6. Reboot your Mac.

After that, RDMA will be enabled in macOS and exo will take care of the rest.

Important Caveats

  1. Devices that wish to be part of an RDMA cluster must be connected to all other devices in the cluster.
  2. The cables must support TB5.
  3. On a Mac Studio, you cannot use the Thunderbolt 5 port next to the Ethernet port.
  4. If running from source, please use the script found at tmp/set_rdma_network_config.sh, which will disable Thunderbolt Bridge and set dhcp on each RDMA port.
  5. RDMA ports may be unable to discover each other on different versions of MacOS. Please ensure that OS versions match exactly (even beta version numbers) on all devices.

Environment Variables

exo supports several environment variables for configuration:

Variable Description Default
EXO_DEFAULT_MODELS_DIR Default directory for model downloads and caches. Always first in the writable dirs list. ~/.local/share/exo/models (Linux) or ~/.exo/models (macOS)
EXO_MODELS_DIRS Colon-separated additional writable directories for model downloads. Checked in order after the default; first with enough free space is used. None
EXO_MODELS_READ_ONLY_DIRS Colon-separated read-only directories to search for pre-downloaded models (e.g., NFS mounts, shared storage). Models here cannot be deleted. None
EXO_OFFLINE Run without internet connection (uses only local models) false
EXO_ENABLE_IMAGE_MODELS Enable image model support false
EXO_LIBP2P_NAMESPACE Custom namespace for cluster isolation None
EXO_FAST_SYNCH Control MLX_METAL_FAST_SYNCH behavior (for JACCL backend) Auto
EXO_TRACING_ENABLED Enable distributed tracing for performance analysis false

Example usage:

# Use pre-downloaded models from NFS mount (read-only)
EXO_MODELS_READ_ONLY_DIRS=/mnt/nfs/models:/opt/ai-models uv run exo

# Download models to an external SSD (falls back to default dir if full)
EXO_MODELS_DIRS=/Volumes/ExternalSSD/exo-models uv run exo

# Run in offline mode
EXO_OFFLINE=true uv run exo

# Enable image models
EXO_ENABLE_IMAGE_MODELS=true uv run exo

# Use custom namespace for cluster isolation
EXO_LIBP2P_NAMESPACE=my-dev-cluster uv run exo

Using the API

exo provides multiple API-compatible interfaces for maximum compatibility with existing tools:

  • OpenAI Chat Completions API - Compatible with OpenAI clients
  • **Claude Messages

Extension points exported contracts — how you extend this code

ChatUploadedFile (Interface)
(no doc)
dashboard/src/lib/types/files.ts
ChatAttachment (Interface)
(no doc)
dashboard/src/lib/types/files.ts
NodeInfo (Interface)
(no doc)
dashboard/src/lib/stores/app.svelte.ts
TopologyEdge (Interface)
(no doc)
dashboard/src/lib/stores/app.svelte.ts
TopologyData (Interface)
(no doc)
dashboard/src/lib/stores/app.svelte.ts

Core symbols most depended-on inside this repo

get
called by 390
src/exo/master/image_store.py
append
called by 316
src/exo/utils/disk_event_log.py
start_soon
called by 77
src/exo/utils/task_group.py
send
called by 77
src/exo/utils/channels.py
from_bytes
called by 72
src/exo/shared/types/memory.py
add_connection
called by 60
src/exo/shared/topology.py
add_node
called by 54
src/exo/shared/topology.py
join
called by 50
src/exo/utils/channels.py

Shape

Method 1,138
Function 853
Class 562
Interface 40
Route 5

Languages

Python89%
TypeScript11%

Modules by API surface

dashboard/src/lib/stores/app.svelte.ts214 symbols
src/exo/api/main.py77 symbols
src/exo/api/types/api.py65 symbols
src/exo/worker/engines/mlx/auto_parallel.py64 symbols
src/exo/api/types/openai_responses.py55 symbols
src/exo/worker/tests/unittests/test_image/test_cancellation.py43 symbols
src/exo/utils/channels.py41 symbols
src/exo/worker/runner/llm_inference/batch_generator.py40 symbols
src/exo/worker/tests/unittests/test_runner/test_finish_reason_sse.py39 symbols
src/exo/download/download_utils.py37 symbols
src/exo/worker/engines/image/pipeline/runner.py36 symbols
src/exo/worker/engines/mlx/utils_mlx.py35 symbols

Dependencies from manifests, versioned

@sveltejs/adapter-static3.0.10 · 1×
@sveltejs/kit2.48.4 · 1×
@sveltejs/vite-plugin-svelte5.0.0 · 1×
@tailwindcss/vite4.0.0 · 1×
@types/d37.4.3 · 1×
@types/node22 · 1×
d37.9.0 · 1×
highlight.js11.11.1 · 1×
katex0.16.27 · 1×
marked17.0.1 · 1×
mode-watcher1.1.0 · 1×
pdfjs-dist5.6.205 · 1×

For agents

$ claude mcp add exo \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact