Extend OpenClaw for a local-first AI assistant across Arm platforms
Introduction
Understand the architecture and local data boundaries
Prepare the DGX Spark host and local services
Configure and start the OpenClaw runtime on DGX Spark
Validate memory persistence and routing with Telegram and Qdrant
Validate document RAG, web search, and proactive tasks
(Optional) Port the app to a CPU-only Armv9 system
Next Steps
Extend OpenClaw for a local-first AI assistant across Arm platforms
Introduction
Understand the architecture and local data boundaries
Prepare the DGX Spark host and local services
Configure and start the OpenClaw runtime on DGX Spark
Validate memory persistence and routing with Telegram and Qdrant
Validate document RAG, web search, and proactive tasks
(Optional) Port the app to a CPU-only Armv9 system
Next Steps
Prepare the DGX Spark host environment
Confirm that the Arm CPU and NVIDIA GPU are visible:
uname -m
nvidia-smi
The expected CPU architecture is:
aarch64
You’ll use Docker Engine and Docker Compose to run services on your DGX Spark. For Docker installation steps, see the Docker Engine install guide .
Confirm Docker GPU access:
docker run --rm --gpus all ubuntu nvidia-smi
Install the NVIDIA driver and NVIDIA Container Toolkit so that this container can access the GPU.
You don’t need to install the vLLM Python package or start a vLLM server directly on the DGX Spark host. The project’s compose.yaml pulls a container image that already includes vLLM and starts the local inference server for you.
Configure Ollama for local embeddings
Unlike vLLM, Ollama isn’t included as a service in the project’s compose.yaml. Install and run Ollama separately on the DGX Spark host before starting the reference runtime.
Install Ollama using the official Linux installer :
curl -fsSL https://ollama.com/install.sh | sh
The project containers connect to Ollama through the Docker host gateway. Create a systemd override that configures Ollama to listen on the host interfaces:
sudo install -d -m 0755 /etc/systemd/system/ollama.service.d
printf '%s\n' '[Service]' 'Environment="OLLAMA_HOST=0.0.0.0:11434"' | \
sudo tee /etc/systemd/system/ollama.service.d/override.conf
Confirm the override file:
sudo systemctl cat ollama
The output should include the override:
# /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Reload systemd and restart Ollama:
sudo systemctl daemon-reload
sudo systemctl enable --now ollama
sudo systemctl restart ollama
Pull the embedding model that you’ll use:
ollama pull nomic-embed-text
Confirm that Ollama lists the model:
curl http://127.0.0.1:11434/api/tags
The output is similar to:
{
"models": [
{
"name": "nomic-embed-text:latest",
"capabilities": ["embedding"]
}
]
}
Start Qdrant for persistent vector storage
Create a Docker volume so that vector data remains available when the Qdrant container is replaced:
docker volume create openclaw-qdrant-data
Start Qdrant on the host using the official container image :
docker run -d \
--name openclaw-qdrant \
--restart unless-stopped \
-p 6333:6333 \
-p 6334:6334 \
-v openclaw-qdrant-data:/qdrant/storage \
qdrant/qdrant
The docker run command creates the container and is needed only the first time. If openclaw-qdrant already exists but is stopped, start it instead:
docker start openclaw-qdrant
Confirm that the Qdrant API responds:
curl http://127.0.0.1:6333/collections
The output is similar to:
{
"result": {"collections": []},
"status": "ok"
}
The empty list is expected at this stage before the reference runtime creates its collections. The runtime creates collections when you save or ingest content.
The project containers need access to Ollama and Qdrant. Restrict ports 11434, 6333, and 6334 to the host and its Docker networks.
Clone the reference repository
Clone the repository and check out the release that you’ll use:
git clone https://github.com/odincodeshen/openclaw-arm-continuum.git
cd openclaw-arm-continuum
git checkout v1.2
The tag fixes the tutorial source version. Unversioned container images and model artifacts can still change when downloaded.
What you’ve accomplished and what’s next
You’ve prepared the DGX Spark host, configured local embeddings, started Qdrant, and checked out the reference repository.
Next, you’ll configure the Telegram bot and start the OpenClaw runtime.