You’ve heard about OpenClaw—the open-source personal AI agent that runs locally on your machine, connects to 25+ messaging platforms, and gives you real control over your AI infrastructure. Now you want to get it running on your Mac. Smart move. But here’s the thing: macOS gives you options, and each one has tradeoffs you should understand before you commit.
Whether you’re sitting at an M1 MacBook Pro or a brand-new M4 Mac Studio, this guide walks you through every path forward. We’ll cover Docker Desktop (the straightforward route), native Node.js installation via Homebrew (the performance option), and the specific considerations that matter on Apple Silicon.
Why macOS Deserves Special Attention
macOS is weird in the best way. It’s Unix underneath, but Apple’s done enough customization that generic “install this on Linux” guides don’t quite work. Factor in Apple Silicon—the M1, M2, M3, M4, and M5 chips—and you’ve got a genuinely different architecture than Intel x86. Some tools run natively, some run through Rosetta 2 emulation, and some are… well, let’s just say they have opinions about where you can put things.
OpenClaw knows about these quirks. It’s designed to work smoothly on Apple Silicon. But you need to make the right choice upfront, because switching methods midstream is annoying.
The Three Installation Paths: Which One Is For You?
Let’s be honest about what each path actually means:
Docker Desktop: Containerized, isolated, easy rollback. Your OpenClaw instance runs in its own sandbox. Updates are cleaner. But you’re trading some performance for convenience, and Docker Desktop on Mac has its own overhead.
Native Node.js (Homebrew): Runs directly on your system. Faster. Closer to the metal. But you’re managing Node.js versions, npm packages, and system dependencies yourself. Rollback means knowing what you changed.
Docker Desktop with Apple Silicon Native Images: Best of both worlds—if you set it up right. Docker Desktop on Mac can use native ARM64 images now, eliminating Rosetta 2 emulation entirely.
Most people starting out? Docker Desktop. Most people who’ve been running OpenClaw for a while? Native Node.js. We’ll cover both thoroughly.
Path 1: Docker Desktop Installation (The Easy Route)
Prerequisites
You’ll need:
- macOS 11 (Big Sur) or later (M1 or Intel)
- At least 8GB of RAM (16GB recommended for comfortable usage)
- About 4GB of disk space for Docker, another 2-3GB for OpenClaw
- An Apple ID or download permission (Docker Desktop needs it)
Step 1: Install Docker Desktop
Head to docker.com/products/docker-desktop and grab the installer. Here’s the important part: there are two versions. You want the one for Apple Silicon if you have an M-series chip. Docker Desktop detects your architecture and defaults correctly, but verify the download says “Apple Silicon” not “Intel Chip.”
Run the installer. It’ll ask for your password—Docker Desktop needs privileged access to manage the virtualization layer.
Once installed, open Docker Desktop from Applications. You’ll see the Docker menu appear in your menu bar. Wait for it to say “Docker Desktop is running”—not “starting,” but actually running. On the first launch, this takes a couple of minutes. Go grab coffee.
Step 2: Verify Docker Installation
Open Terminal and run:
docker --version
You should see something like Docker version 24.0.6. Good sign. Now test that it actually works:
docker run hello-world
This downloads a tiny test image and runs it. You’ll see a bunch of text ending with “Hello from Docker!” If you see that, Docker is properly installed.
Step 3: Clone OpenClaw
Pick a directory where you want OpenClaw to live. Your home directory is fine. Most people use something like ~/projects/ or just put it in ~/.openclaw/ (OpenClaw’s default workspace location). Let’s go with:
cd ~
git clone https://github.com/open-claw/openclaw.git
cd openclaw
Step 4: Configure Your Workspace
OpenClaw stores everything—your skills, memory, conversations, platform tokens—in a workspace directory. On macOS, this defaults to ~/.openclaw/.
Create it:
mkdir -p ~/.openclaw/
This directory will contain:
config.yaml: Platform connections and settingsskills/: Your skill definitionsmemory/: Knowledge base and conversation historysoul.md: Your agent’s personality and behavior guidelines
You don’t need to populate these yet—OpenClaw will create defaults when it first runs.
Step 5: Build and Run with Docker
Navigate to your openclaw directory and build the Docker image:
docker build -t openclaw:latest .
This takes 2-3 minutes. Docker is downloading Node.js, installing dependencies, setting up the environment. Watch the output. If you see warnings, don’t panic—they’re usually fine. If you see errors (red text that says “Error”), something went wrong. Note the error and check the Docker output.
Once built, run it:
docker run -d \
--name openclaw \
-v ~/.openclaw:/root/.openclaw \
-p 8080:8080 \
openclaw:latest
What’s happening here:
-d: Run in detached mode (background)--name openclaw: Give the container a name so you can reference it-v ~/.openclaw:/root/.openclaw: Mount your workspace directory into the container-p 8080:8080: Expose port 8080 (OpenClaw’s default API port)openclaw:latest: The image to run
Verify it’s running:
docker ps
You should see your openclaw container listed. Check the logs:
docker logs openclaw
You’re looking for a line that says something like “OpenClaw initialized” or “Listening on port 8080.” If you see errors here, we’ve got troubleshooting to do.
Docker Desktop Performance on Apple Silicon: The Reality
Here’s what people don’t tell you: Docker Desktop on macOS is slower than native installation. Not catastrophically slower, but noticeably. There’s a virtualization layer—Docker Desktop runs a lightweight Linux VM under the hood. Even on Apple Silicon with native ARM64 images, there’s overhead.
Typical latency increases you might see:
- File I/O: 10-15% slower
- Memory startup: Container takes 30-40% longer to initialize
- CPU-intensive tasks: 5-8% slower
- Network: Usually identical
For most OpenClaw usage—responding to messages, processing memory, running skills—you won’t notice. You’re waiting for the LLM backend to respond anyway, which dominates. But if you’re running bulk data processing or training a custom skill, you’ll feel the difference.
The tradeoff: isolation, easier rollback, no system clutter. For most people, that’s worth it.
Path 2: Native Node.js Installation via Homebrew (The Performance Route)
Why Choose Native?
You want maximum performance. You’re comfortable managing Node.js yourself. You want OpenClaw to feel like a native application, not a container. You plan to run it long-term and want the fastest possible execution.
Prerequisites
- macOS 11 or later
- At least 4GB of RAM (8GB recommended)
- About 1.5GB disk space for Node.js and OpenClaw
- Command line comfort level
Step 1: Install Homebrew (If You Don’t Have It)
Homebrew is macOS’s package manager. If you don’t have it, install it:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Follow the prompts. It’ll ask for your password and might take a few minutes. On Apple Silicon Macs, Homebrew is native—no emulation required.
Verify installation:
brew --version
Step 2: Install Node.js via Homebrew
brew install node
Homebrew installs the latest LTS version. OpenClaw requires Node.js 18.x or later, so you’re good. The installation includes npm (Node’s package manager), which you’ll need.
Verify:
node --version
npm --version
You should see versions like v20.x.x and 10.x.x.
Step 3: Clone OpenClaw
cd ~
git clone https://github.com/open-claw/openclaw.git
cd openclaw
Step 4: Install Dependencies
npm install
This reads the package.json file and installs all required packages. On Apple Silicon, npm is smart about downloading arm64-native bindings when available. This step takes 2-5 minutes depending on your internet speed.
Watch for warnings—npm warns about outdated packages but usually they’re fine. Errors are red and scary. If you see errors, check npm’s output. Common issues:
- Missing build tools: Run
xcode-select --install - Permission errors: Don’t use
sudo. Fix withnpm install -g npm@latest
Step 5: Create and Configure Your Workspace
mkdir -p ~/.openclaw
Create the initial config:
cp config.example.yaml ~/.openclaw/config.yaml
Edit ~/.openclaw/config.yaml with your text editor. You’ll configure:
- Platform tokens (Slack, Discord, Telegram, etc.)
- LLM backend settings
- Workspace paths
- Log level
For your first run, the defaults are fine. You can add platform tokens later.
Step 6: Start OpenClaw
npm start
You’ll see startup output. OpenClaw initializes its memory system, loads skills, connects to configured platforms. Within a few seconds, you should see “OpenClaw ready” or similar. The process stays running in the foreground.
To run in the background, use:
npm start &
Or use a process manager like pm2 for long-term deployment:
npm install -g pm2
pm2 start openclaw
pm2 logs openclaw
Performance Reality Check: Native vs Docker
Let’s talk numbers on Apple Silicon:
| Metric | Docker Desktop | Native Node.js | Difference |
|---|---|---|---|
| Startup time | 3-5 seconds | 1-2 seconds | 2-3x faster |
| Memory footprint | 200-300MB base | 40-60MB base | 4-5x less |
| File I/O (100 file read) | 800ms | 700ms | 10-15% faster |
| Message latency | ~20ms overhead | None | Noticeable if you care |
For actual conversation latency, the LLM response time (usually 1-5 seconds) dwarfs any infrastructure differences. But startup matters. Boot time matters. Memory efficiency matters if you’re running on a MacBook Air.
Native installation is genuinely faster. It’s the right choice if performance is a priority.
Apple Silicon Specific Considerations: What You Actually Need to Know
Rosetta 2 and Why You Care (Or Don’t)
Apple Silicon Macs include Rosetta 2—a transparent emulation layer that runs Intel code. It’s actually pretty good. When Docker Desktop uses native ARM64 images, Rosetta is irrelevant. When it doesn’t, code runs at about 80-85% native speed.
OpenClaw? All its dependencies support Apple Silicon natively now. No Rosetta overhead. You get true native speed.
M-Series Performance Tiers and Optimization
Apple’s M-series chips vary, and it’s worth understanding what you get at each tier:
- M1/M2: 8-core CPU (4 performance + 4 efficiency), 7-10 core GPU. Solid for OpenClaw. M1 MacBook Air handles continuous OpenClaw usage beautifully.
- M3/M4: 8-12 core CPU (better efficiency cores). Overkill for OpenClaw specifically. You’ll get faster response times, but the difference is 5-10% speed improvement—noticeable in benchmarks, not in daily use.
- M5: Coming in 2026, expect 15-20% faster performance than M4.
The honest truth: even M1 handles OpenClaw beautifully. You don’t need the latest chip. M2 MacBook Air? Totally fine. Will run 10+ simultaneous conversations without breaking a sweat.
Performance Optimization by Chip:
M1 MacBook Air: Can run 1-2 instances comfortably. Expect 2-3 second response latency.
M1 Pro/Max: Can run 3-5 instances simultaneously. LLM API calls dominate, so infrastructure barely matters. Response latency still 2-3 seconds (bottlenecked by LLM backend, not Mac hardware).
M2/M3/M4: Overkill for OpenClaw alone. These machines shine when you’re running multiple services (OpenClaw + local LLM via Ollama + other services). That’s a different conversation.
Thermal Performance on Mac: Understanding Your Hardware
Macs don’t have traditional cooling like PCs. M-series chips are thermally efficient. Running CPU-intensive tasks might cause throttling, but this is intentional, not a failure. Let’s be specific:
MacBook Air (no fan, passive cooling):
- Normal operation: 30-50C
- Running OpenClaw + active usage: 50-65C
- Running local LLM: 70-80C (thermal throttling begins)
- Maximum safe: 95C (designed safety limit)
You’ll feel warmth on the aluminum chassis. This is fine. Macs are built for this. Aluminum dissipates heat excellently.
MacBook Pro (has fan):
- Normal operation: 30-45C
- Running OpenClaw + active usage: 50-60C
- Running local LLM: 65-75C
- Fan spins up around 70C (very quiet)
- Maximum safe: 97C
The fan is nearly silent. You’ll barely notice it spinning.
Mac Mini / Mac Studio (desktop, active cooling):
- These machines have better thermal design than laptops
- Thermal throttling is uncommon
- Can run multiple instances + local LLMs simultaneously
Real scenario breakdown:
Your MacBook Air is running OpenClaw. You ask it a complex question. The agent needs to make 5 API calls, fetch a web page, and run local processing.
- Seconds 0-2: LLM processes your question (not using much CPU, waiting for API response)
- Seconds 2-4: Web fetch (network bound, not CPU bound)
- Seconds 4-6: Processing results (30-40% CPU for 2-3 seconds)
- During second 5, CPU hits 100%, Mac temperature climbs to 65-70C
- Fan might spin up slightly (if Pro) or you feel warmth (if Air)
- Seconds 6-8: Response returned
This is normal operation. Your Mac isn’t in distress. The thermal throttling at 80C+ exists to protect the hardware—you’ve got 15C of headroom before that triggers.
If you run local LLMs via Ollama:
Running a 7B-parameter model on M1 is different. That’s CPU-intensive, sustained inference.
- CPU: 100% for 20-30 seconds
- Temperature: 80-85C (possible thermal throttling)
- Performance: Inference might drop 5-15% as throttling activates
- This is fine. Still not a problem. Your Mac stays safe.
The thermal design is intentional. Apple’s engineering team says “keep it under 100C.” If you approach that, throttle. It’s safety, not a bug.
Docker Desktop vs Native Performance Comparison on Apple Silicon
Docker Desktop on Mac has an interesting performance profile on Apple Silicon:
Docker Desktop with native ARM64 images (which OpenClaw uses):
- No Rosetta 2 overhead
- Virtualization overhead: ~10-15% slower than native
- Startup: 3-5 seconds (Linux VM initialization)
- Memory: Base 200-300MB (Linux VM overhead)
Native Node.js via Homebrew:
- No virtualization, pure native
- Startup: 1-2 seconds
- Memory: Base 40-60MB
- Performance: 100% native speed
The difference sounds significant, but in practice:
- LLM inference dominates (1-5 second wait)
- Network latency dominates for web calls (200-500ms minimum)
- File I/O differences (Docker slower by ~50-100ms)
If you’re building an app where response time is critical and you need under 100ms latency per request, Docker matters. For typical OpenClaw usage, it’s invisible.
Real numbers on M1 MacBook Air:
Task: Process Slack message → call Claude API → respond
Native Node.js:
- Parse message: 2ms
- Call LLM API: 2,000ms (wait for response)
- Format response: 3ms
- Total: ~2,005ms
Docker Desktop:
- Parse message: 2ms (Docker overhead added)
- Call LLM API: 2,000ms
- Format response: 3ms
- Total: ~2,005-2,050ms
Difference: 45ms on a 2 second operation. Invisible to user.
Docker’s overhead appears in file-heavy operations (analyzing large repos, processing big datasets). For typical message processing, negligible.
Battery Impact Analysis (for Laptop Users)
If you’re running OpenClaw on a MacBook Air with battery:
Idle (OpenClaw running, not processing):
- M1 MacBook Air: 80-95W system power draw
- OpenClaw: ~10-20W (depending on platform connections)
- Battery life: ~8-9 hours unplugged
Active usage (processing messages):
- Peak CPU during inference: ~25-40W
- Overall system: 100-120W
- During active phase: Drops maybe 20-30 minutes from battery life (for 30 seconds of processing)
- Sustained usage (OpenClaw constantly processing): ~5-6 hours unplugged
Practical reality:
If you’re running OpenClaw on a laptop unplugged, plug in when you’re using it actively. If you’re using it as a background service, it draws enough power that you’ll want AC power.
For reference, Slack also runs in background and draws similar power. If you’re comfortable running Slack unplugged, you’re comfortable running OpenClaw.
Docker vs Native battery impact:
Native Node.js is marginally more efficient (~5-10W less under load), but the difference is small enough that Docker’s added overhead is negligible in battery calculations.
Use whichever installation method you prefer. Battery impact is not the deciding factor.
Comparison: Docker vs Native Side-by-Side
| Factor | Docker Desktop | Native Node.js |
|---|---|---|
| Installation time | 15 minutes | 10 minutes |
| Performance | 85-95% native | 100% native |
| Upgrades | Clean, repeatable | Manual management |
| Rollback | Easy (restart container) | Manual (restore node_modules) |
| System clutter | None (isolated) | Adds Node.js system-wide |
| Development | Good (can modify image) | Better (instant feedback) |
| Memory usage | Higher (VM overhead) | Lower |
| First-time user? | Recommended | Advanced |
| Long-term reliability? | Excellent | Excellent |
Post-Installation: Actually Using OpenClaw
Regardless of which path you chose, you now have OpenClaw running. Next steps:
- Configure platforms: Edit your config.yaml to add Slack tokens, Discord webhooks, etc.
- Customize your SOUL.md: OpenClaw’s personality lives in
~/.openclaw/soul.md. Edit this to define how your agent behaves. - Add skills: Skills live in
~/.openclaw/skills/. Each skill is a SKILL.md file defining what your agent can do. - Monitor: Use
docker logs openclaw(Docker) or check stdout (native) to watch what’s happening.
Troubleshooting: When Things Don’t Work
Docker Desktop Won’t Start
- Check if virtualization is enabled in your Mac’s settings
- Restart Docker Desktop (quit and reopen)
- Check available disk space (Docker needs room)
- If all else fails, uninstall and reinstall Docker Desktop
OpenClaw Crashes Immediately
Check the logs. The error message tells you what’s wrong:
- “ENOENT: no such file or directory”: Workspace doesn’t exist or can’t be accessed
- “Port 8080 in use”: Something else is using that port. Kill it or configure a different port.
- “Module not found”: Dependencies didn’t install. Try
npm installagain.
Node.js Installation Issues
node --version
npm --version
If npm is missing, reinstall with brew reinstall node. If version is wrong, use nvm for version management:
brew install nvm
nvm use 20
File Permission Issues
macOS has some quirks with file permissions. If you get permission errors:
chmod -R u+rw ~/.openclaw/
This gives your user read-write access to the workspace. Don’t use sudo unless you want to create permission headaches later.
Performance Tuning: Getting the Most Out of Your Mac
Before we dive into advanced config, let’s talk about squeezing performance. Both Docker and native installations benefit from understanding your hardware.
Memory Allocation (Docker)
Docker Desktop on Mac lets you control how much RAM the Linux VM gets:
- Open Docker Desktop preferences
- Go to Resources
- Set Memory slider to 6-8GB (leaving your Mac 4-8GB free)
Too much RAM allocated? Your Mac gets sluggish. Too little? OpenClaw runs out of memory and gets OOM-killed.
The sweet spot depends on your Mac’s total RAM:
- 8GB total: Allocate 4GB to Docker, keep 4GB for macOS
- 16GB total: Allocate 8-10GB, keep 6GB for macOS
- 32GB+ total: Allocate 16GB+, you’re fine
Docker on Apple Silicon is efficient. Even 4GB allocation handles most workloads.
CPU and Network (Docker)
Docker Desktop also controls CPU cores. The default is reasonable—it uses whatever cores are available. Don’t fiddle with this unless you’re having issues.
Network: Docker’s networking on Mac uses a lightweight virtualization bridge. It’s transparent. Incoming connections work via localhost (127.0.0.1). If you want external apps (on your network) to reach OpenClaw, you need more config—beyond scope here.
Native Node.js: No Tuning Needed
Native Node.js runs directly on your Mac’s hardware. No allocation decisions. It uses what it needs. Simple.
The only tuning: if you run the pm2 process manager, you can limit workers:
apps:
- name: openclaw
script: node
args: index.js
instances: 2 # Max 2 worker processes
max_memory_restart: 500M # Restart if it hits 500MB
But for typical usage, default settings are fine.
Advanced Configuration: Getting More Out of OpenClaw
Both installation paths support deeper configuration once you’re running. Let’s talk about what experienced users typically do.
Memory Management and Optimization
OpenClaw’s memory system—the knowledge base that powers context awareness—can be tuned. In your config.yaml, you’ll find memory settings:
memory:
backend: sqlite # or postgresql for production
retention_days: 90
max_conversations: 1000
embedding_model: sentence-transformers
On macOS, the defaults are sensible. But here’s what advanced users know: if you’re running on a MacBook Air with limited RAM, lowering max_conversations and retention_days helps. If you’re on a Mac Studio with 96GB, crank them up.
Memory storage happens in ~/.openclaw/memory/. On native installation, this is your filesystem. Docker mounts it, so performance is slightly worse. If you’re processing high volumes of conversations, native wins here.
Platform Token Management
Adding tokens to config.yaml is straightforward, but doing it securely matters. Never hardcode tokens in version control.
Instead, use environment variables:
platforms:
slack:
token: ${SLACK_TOKEN}
discord:
token: ${DISCORD_TOKEN}
Then set them in your shell:
export SLACK_TOKEN="xoxb-your-token-here"
export DISCORD_TOKEN="your-discord-token"
For Docker, pass them at runtime:
docker run -d \
--name openclaw \
-e SLACK_TOKEN="xoxb-..." \
-e DISCORD_TOKEN="..." \
-v ~/.openclaw:/root/.openclaw \
-p 8080:8080 \
openclaw:latest
This keeps secrets out of your workspace files.
Skill Development and Testing
Skills are the extension system. Each skill is a SKILL.md file in ~/.openclaw/skills/. Writing custom skills is beyond this guide, but here’s what to know for your installation:
On native Node.js, you can hot-reload skills. Edit a skill file, and OpenClaw picks up the change in seconds. Development is fast.
On Docker, file changes require container restart. Less convenient for development. But if you’re just using existing skills, irrelevant.
If you plan to develop custom skills, native installation is better. If you’re consuming community skills, Docker is fine.
Workspace Backup Strategy
We mentioned this briefly, but it deserves expansion. Your workspace is your inventory:
~/.openclaw/
├── config.yaml # Platform tokens, settings
├── soul.md # Personality guidelines
├── skills/ # 5-20 skill files
├── memory/ # Conversation history (can be huge)
└── logs/ # Activity logs
Memory can grow. If you’ve been running OpenClaw for months, memory/ might be 500MB-2GB. Full backups matter.
Backups on macOS are easy with Time Machine:
sudo tmutil addexclusion -p ~/.openclaw # Add to Time Machine
Actually, don’t. You want explicit versioned backups:
tar -czf ~/openclaw-backup-$(date +%Y%m%d).tar.gz ~/.openclaw/
This creates a compressed archive. Store it somewhere safe.
Monitoring and Logging
OpenClaw logs to stdout (native) or Docker logs. On macOS, you can redirect to a file:
npm start >> ~/.openclaw/logs/openclaw.log 2>&1 &
Then tail it:
tail -f ~/.openclaw/logs/openclaw.log
Watch for patterns: repeated errors, connection failures, memory spikes. Occasional warnings are fine. Patterns suggest issues.
Docker logging is easier:
docker logs -f openclaw
The -f flag follows new logs in real-time. Press Ctrl+C to stop.
Migration: Switching Between Installation Methods
You started with Docker. Now you want native speed. Or vice versa. Here’s how:
Docker → Native
- Stop Docker:
docker stop openclaw - Backup workspace:
cp -r ~/.openclaw ~/.openclaw.docker-backup - Install native Node.js (Homebrew)
- Clone OpenClaw source
npm installnpm start
Your workspace files are untouched. Everything transfers cleanly.
Native → Docker
- Stop native:
npm stoporCtrl+C - Backup workspace:
cp -r ~/.openclaw ~/.openclaw.native-backup - Verify
~/.openclawexists (should) - Build Docker image:
docker build -t openclaw:latest . - Run container with workspace mount
Also transfers cleanly.
Between installations, the only dependency is your workspace files. Skills, memory, config—it all stays.
Troubleshooting: Common Gotchas on macOS
“npm ERR! Error: EACCES: permission denied”
This means npm is trying to write to system directories without permission. Don’t use sudo. Instead:
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
export PATH=~/.npm-global/bin:$PATH
Add that export to your shell profile (~/.zshrc on modern Macs):
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
What this does: By default, npm wants to install global packages to /usr/local/ which requires sudo. Instead, you’re telling it to use a directory in your home folder where you have write permission.
Why not sudo?: If you use sudo for npm, package installations run as root. This causes permission issues later when you try to use those packages as a regular user. It’s a permission mess waiting to happen. Avoid it.
Docker: “Error response from daemon: dial unix /var/run/docker.sock: connect: permission denied”
Docker Desktop didn’t start properly. Quit it, reopen it, wait for the menu bar icon to stabilize.
If that doesn’t work:
- Check Activity Monitor for Docker processes (Cmd+Space, type Activity Monitor)
- Force quit any lingering Docker processes
- Reopen Docker Desktop from Applications
- Wait for “Docker Desktop is running” message (not just “starting”)
If still broken: Restart your Mac. This clears the socket file that Docker uses.
OpenClaw: “Port 8080 already in use”
Something else is using that port. Find it:
lsof -i :8080
You’ll see what’s using it. Common culprits:
- Old OpenClaw instance still running
- Some other local development server
- Occasionally, a system service
If it’s an old OpenClaw instance, kill it:
kill -9 <PID>
Or configure OpenClaw to use a different port in config.yaml:
server:
port: 8081
Then restart OpenClaw.
Git: “fatal: not a git repository”
You didn’t properly clone OpenClaw. Make sure you’re in the directory with .git:
ls -la | grep git
If you don’t see .git/, reclone:
cd ..
rm -rf openclaw
git clone https://github.com/open-claw/openclaw.git
cd openclaw
Why this happens: You accidentally ran git clone from inside the openclaw directory (creating openclaw/openclaw/), or you extracted a ZIP file instead of cloning. Clone using git, not ZIP.
“Cannot find module ‘openclaw'”
Dependencies didn’t install. Run:
npm install
npm install --global # Sometimes needed for global deps
If that doesn’t work, nuclear option:
rm -rf node_modules package-lock.json
npm install
This reinstalls everything from scratch. Takes 2-5 minutes.
If that still fails: Check for Apple Silicon compatibility. Make sure you installed Node.js via Homebrew (native ARM64), not downloading Intel binaries.
node -p process.arch
Should return “arm64” on M-series Macs. If it returns “x64”, you have Intel Node.js running under Rosetta—performance is fine, but rebuilds are slower.
“ENOTDIR: not a directory” or permission errors in workspace
Your ~/.openclaw/ directory doesn’t exist or has wrong permissions:
# Create it
mkdir -p ~/.openclaw
# Ensure you own it
chmod -R u+rw ~/.openclaw
Don’t use sudo unless you’ve created the directory with sudo (then you have to sudo everything).
Docker: “Cannot connect to Docker daemon”
Docker Desktop is installed but not running. Open Applications, find Docker.app, double-click to launch it.
Wait for the menu bar icon to become active (the whale icon in the top right). This takes 10-30 seconds on first launch.
OpenClaw starts but immediately crashes
Check the logs:
Native Node.js:
npm start
# Look for error messages in the output
Docker:
docker logs openclaw
Common crash causes:
-
“ENOENT: no such file” → Workspace directory missing
-
Fix:
mkdir -p ~/.openclaw/ -
“Port already in use” → Another process on 8080
-
Fix: Change port or kill the other process
-
“Module not found” → Dependencies didn’t install
-
Fix:
npm installagain -
“Cannot read property ‘token’ of undefined” → Missing config
- Fix: Create
config.yamlwith platform tokens
Look at the full error message. The first line usually tells you exactly what’s wrong.
“M1/Apple Silicon-specific” build failures
Some npm packages don’t have pre-built binaries for ARM64. During npm install, they try to compile from source.
This requires build tools. Install them:
xcode-select --install
This is a one-time setup. Takes a few minutes. After this, npm can compile native modules.
Docker Desktop memory/CPU issues
On M1 Macs, Docker sometimes uses excessive resources. Check Docker preferences:
- Open Docker Desktop
- Click menu bar icon → Preferences
- Go to Resources
- Adjust Memory slider (recommend 6-8GB of your total)
- Keep CPU default (uses all cores when needed)
- Click Apply & Restart
If OpenClaw constantly crashes with “out of memory,” reduce the memory allocated to OpenClaw or split into multiple instances.
File permission issues after updates
Sometimes git pulls or npm updates create files with wrong permissions:
# Fix recursive ownership
chmod -R u+rw ~/.openclaw/
# If still broken (rare):
sudo chown -R $(whoami) ~/.openclaw/
Avoid the sudo version unless absolutely necessary. It creates cascading permission issues.
OpenClaw seems slow after update
After updating OpenClaw or Node.js, rebuild native dependencies:
npm ci # Clean install
npm rebuild # Rebuild native modules
npm start
This ensures everything is compiled for your exact system architecture.
“Xcode license has not been accepted”
If you see this during npm install:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license accept
Then retry your npm command.
Git authentication issues (for cloning)
If cloning fails with “Permission denied”:
- You need SSH keys set up
- Generate one:
ssh-keygen -t ed25519 - Add public key to GitHub (GitHub.com → Settings → SSH Keys)
- Try cloning again
Or, use HTTPS instead:
git clone https://github.com/open-claw/openclaw.git
(HTTPS works but prompts for GitHub personal access token. SSH is smoother after one-time setup.)
When to Use Docker vs Native: Final Decision Matrix
Let’s be explicit. Here’s how to choose:
Use Docker if:
- You’re new to command line
- You want zero system impact
- You don’t plan to develop custom skills
- You like containerized isolation
- You want simple upgrades
Use Native if:
- You want maximum performance
- You develop custom skills
- You’re comfortable with Node.js
- You’re running on limited resources (MacBook Air)
- You want instant feedback on changes
Most beginners gravitate Docker. Most advanced users go native. Neither is wrong.
When to Upgrade Your Installation
You’ve got OpenClaw running. When do you switch methods?
- Started with Docker, want better performance? → Migrate to native
- Running native, want easier updates? → Consider Docker
- Both work fine for most people. Switching is optional.
The migration is painless. Your workspace transfers instantly. So don’t agonize over the choice. Pick one, get running, iterate later.
Final Thoughts
OpenClaw on macOS is genuinely easy. Both installation paths work. Docker is newbie-friendly and beginner-proof. Native is faster and gives you more control. Apple Silicon support is excellent—you’re not dealing with emulation nonsense anymore.
Pick the path that matches your comfort level and use case. Both will be humming along, running your personal AI agent, in under 30 minutes.
The setup is straightforward. The real power comes after: connecting platforms, building skills, training your agent’s personality. That’s where OpenClaw becomes yours.
Questions or stuck? The OpenClaw community is helpful. Check the GitHub issues, the Discord, the docs. We’ve all been where you are.
Happy running.