Running OpenClaw is not the same as launching a typical desktop app or SaaS tool. It’s an agentic system that stays active, listens for events, executes commands, and interacts with external services on your behalf. That means how you run it—where it lives, what it can access, and how it stays online—directly shapes both its usefulness and its risk profile.
Formerly known as Clawdbot (and briefly Moltbot), OpenClaw runs locally or on a server you control, rather than inside a managed cloud environment. This design gives users flexibility and transparency, but it also shifts operational responsibility to the person running it. There’s no managed runtime, no default guardrails, and no “set it and forget it” mode. Once OpenClaw is running, it behaves more like a long-lived service than a chat interface.
In this guide, we’ll focus specifically on how to run OpenClaw across common environments—from cloud deployments like DigitalOcean to local machines such as Mac minis, Windows PCs, and Linux servers. The goal isn’t to rush through commands, but to help you understand what’s actually happening when OpenClaw is running, what stays active in the background, and what trade-offs each environment introduces.
How to Run OpenClaw with DigitalOcean’s One-Click Deploy
Step 1 — Create an OpenClaw Droplet
- Sign in to your DigitalOcean account
- Click Create → Droplets
- Choose the Region closest to your location
- Under Choose an Image, select the Marketplace tab
- Search for Moltbot and select the Moltbot image
- (This image installs OpenClaw automatically)
- Choose a Droplet plan:
- Recommended: Basic plan
- Minimum: 4GB RAM (s-2vcpu-4gb) for stable performance
- Under Authentication:
- Select SSH Key
- Add your SSH key if not already configured
- Assign a hostname (example: openclaw-server)
- Click Create Droplet
Optional — Create an OpenClaw Droplet via API
- Use the DigitalOcean API to deploy OpenClaw programmatically
- Requires a DigitalOcean API token
curl -X POST -H 'Content-Type: application/json' \
-H 'Authorization: Bearer '$TOKEN'' -d \
'{"name":"choose_a_name","region":"nyc3","size":"s-2vcpu-4gb","image":"Moltbot"}' \
"https://api.digitalocean.com/v2/droplets"
Step 2 — Access the OpenClaw Server
- Wait a few minutes for the Droplet to initialize
- SSH into the Droplet using the public IPv4 address:
ssh root@your_droplet_ip
- OpenClaw 2026.1.24-1 is pre-installed with all dependencies
- A welcome message appears after login
Step 3 — Note the Dashboard URL
- In the terminal output, locate:
- Control UI & Gateway Access
- Copy the Dashboard URL
- This URL is used to access the OpenClaw web interface
Step 4 — Select an AI Provider
- Choose your LLM provider in the terminal:
- Anthropic (Claude) — supported by default
- Gradient AI — optional
- OpenAI — support coming soon
- Enter the required API key or secret
- OpenClaw is now connected to your LLM
Step 5 — Use OpenClaw (GUI or TUI)
Option 1: Text User Interface (TUI)
/opt/clawdbot-tui.sh
Option 2: Graphical User Interface (GUI)
- Open the copied Dashboard URL in your browser
- Authenticated automatically using the Gateway token
- Opens the default Chat interface
Step 6 — Verify OpenClaw Is Running
- Send a test message through the GUI or TUI
- Example input:
- “What files can you currently see on my computer?”
- OpenClaw returns visible files in its sandbox workspace
Step 7 — Install Skills
- OpenClaw includes 50+ skills by default
- To install new skills:
- Go to Skills in the dashboard
- Search for a skill (example: calendar)
- Click Install
- Skills enable:
- File management
- Web automation
- Calendar integrations
- System tasks
- Messaging workflows
How to Run OpenClaw on Windows
Recommended Approach: Windows Subsystem for Linux (WSL2)
- OpenClaw is not recommended to run natively on Windows
- The official and most stable method is WSL2 with Ubuntu
- OpenClaw’s CLI, Gateway, and tooling run inside Linux
- WSL2 ensures compatibility with:
- Node.js / Bun / pnpm
- Linux binaries
- Skills and system tooling
- Native Windows companion apps are planned, but not available yet
- WSL2 provides a full Linux environment with minimal setup
Step 1 — Install WSL2 and Ubuntu
- Open PowerShell as Administrator
- Install WSL2 with the default Ubuntu distribution:
wsl --install
Or install a specific Ubuntu version:
wsl --list --online
wsl --install -d Ubuntu-24.04
Step 2 — Enable systemd (Required)
- Open your Ubuntu (WSL) terminal
- Enable systemd support:
sudo tee /etc/wsl.conf >/dev/null <<'EOF'
[boot]
systemd=true
EOF
- Shut down WSL from PowerShell:
wsl --shutdown
- Reopen Ubuntu
- Verify systemd is running:
systemctl --user status
Step 3 — Install OpenClaw Inside WSL
- Follow the Linux installation flow inside WSL
- Clone the OpenClaw repository:
git clone https://github.com/openclaw/openclaw.git
cd openclaw
- Install dependencies and build:
pnpm install
pnpm ui:build
pnpm build
openclaw onboard
- This installs the CLI, UI, and prepares the Gateway
Step 4 — Install and Run the Gateway Service
- Inside WSL, install the Gateway as a service:
openclaw onboard --install-daemon
openclaw gateway install
openclaw configure
- Select Gateway service when prompted
- Repair or migrate the setup if needed:
openclaw doctor
Advanced — Expose OpenClaw Services Over LAN (Optional)
- WSL runs on a virtual network
- To access OpenClaw from another machine, ports must be forwarded
- The WSL IP changes after restarts, so rules may need refreshing
PowerShell (Admin) example:
$Distro = "Ubuntu-24.04"
$ListenPort = 2222
$TargetPort = 22
$WslIp = (wsl -d $Distro -- hostname -I).Trim().Split(" ")[0]
if (-not $WslIp) { throw "WSL IP not found." }
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=$ListenPort `
connectaddress=$WslIp connectport=$TargetPort
- Allow the port through Windows Firewall (one-time):
New-NetFirewallRule -DisplayName "WSL SSH $ListenPort" -Direction Inbound `
-Protocol TCP -LocalPort $ListenPort -Action Allow
- Refresh port forwarding after WSL restarts:
netsh interface portproxy delete v4tov4 listenport=$ListenPort listenaddress=0.0.0.0
netsh interface portproxy add v4tov4 listenport=$ListenPort listenaddress=0.0.0.0 `
connectaddress=$WslIp connectport=$TargetPort
Important Notes for Windows Users
- SSH access targets the Windows host IP, not the WSL IP
Example:
ssh user@windows-host -p 2222
- Remote nodes must use a reachable Gateway URL
Check status with:
openclaw status --all
- Use listenaddress=0.0.0.0 for LAN access
- Use 127.0.0.1 to keep services local only
- Scheduled Tasks can automate port refresh on login
Windows Companion App Status
- No native Windows companion app exists yet
- Contributions are welcome
- Current recommended setup remains WSL2 + Ubuntu
How to Run OpenClaw on macOS
macOS App Overview
- The macOS app is the menu-bar companion for OpenClaw
- It manages:
- Local permissions
- Gateway lifecycle
- macOS-specific capabilities
- Acts as a node that exposes macOS features to OpenClaw
- Runs locally or connects to a remote Gateway
What the macOS App Does
- Displays native notifications and status in the menu bar
- Manages macOS permission prompts (TCC), including:
- Notifications
- Accessibility
- Screen Recording
- Microphone
- Speech Recognition
- Automation / AppleScript
- Runs or connects to the Gateway (local or remote)
- Exposes macOS-only tools:
- Canvas
- Camera
- Screen Recording
- sytem.run
- Starts or stops the local node host service based on mode
- Optionally hosts PeekabooBridge for UI automation
- Installs the global CLI (openclaw) via npm or pnpm
- Bun is not recommended for Gateway runtime
Local vs Remote Mode
Local Mode (Default)
- Attaches to an existing local Gateway
- If none is running, enables it via launchd
Uses:
openclaw gateway install
Remote Mode
- Connects to a Gateway over SSH or Tailscale
- Does not start a local Gateway
- Starts a local node host service
- Allows the remote Gateway to reach this Mac
- The macOS app is not a child process of the Gateway
Launchd Control (macOS)
- Gateway runs as a per-user LaunchAgent
- Default label:
bot.molt.gateway
Profile-based label:
Start Gateway
launchctl kickstart -k gui/$UID/bot.molt.gateway
Stop Gateway
launchctl bootout gui/$UID/bot.molt.gateway
- Replace label with bot.molt.<profile> when using named profiles
- Legacy com.openclaw.* agents still unload correctly
Install the LaunchAgent via:
openclaw gateway install
Node Capabilities (macOS)
- The macOS app registers as a node
- Common node commands include:
Canvas
canvas.present
canvas.navigate
canvas.eval
canvas.snapshot
canvas.a2ui.*
Camera
camera.snap
camera.clip
Screen
screen.record
System
- system.run
- system.notify
- Node reports a permissions map to the Gateway
- Agents decide allowed actions based on this map
Node Service and App IPC
- In Remote mode:
- Headless node host service connects to Gateway via WebSocket
- system.run executes inside the macOS app
- Communication uses:
- Unix Domain Socket (UDS)
- Token authentication
- HMAC validation
- TTL enforcement
- Prompts and outputs remain inside the macOS app
Flow
- Gateway → Node Service (WebSocket)
- Node Service → macOS App (IPC)
Exec Approvals (system.run)
- Controlled from Settings → Exec Approvals in the macOS app
Rules stored locally at:
~/.openclaw/exec-approvals.json
Example Configuration
{
"version": 1,
"defaults": {
"security": "deny",
"ask": "on-miss"
},
"agents": {
"main": {
"security": "allowlist",
"ask": "on-miss",
"allowlist": [
{ "pattern": "/opt/homebrew/bin/rg" }
]
}
}
}
- Allowlist entries match resolved binary paths
- Choosing “Always Allow” adds the command automatically
- Environment overrides are filtered:
- PATH
- DYLD_*
- LD_*
- NODE_OPTIONS
- PYTHON*
- PERL*
- RUBYOPT
Deep Links (openclaw://)
- macOS app registers the openclaw:// URL scheme
Trigger an Agent
open 'openclaw://agent?message=Hello%20from%20deep%20link'
Supported Parameters
- message (required)
- sessionKey
- thinking
- deliver
- to
- channel
- timeoutSeconds
- key (unattended mode)
Safety Rules
- Without key: user confirmation required
- With a valid key: runs unattended (personal automation use)
Typical macOS Onboarding Flow
- Install and launch OpenClaw.app
- Complete permission checklist (TCC prompts)
- Confirm Local mode is active
- Ensure the Gateway is running
- Install CLI if terminal access is needed
Build and Development Workflow (Native)
Build macOS app:
cd apps/macos
swift build
swift run OpenClaw
Package app:
scripts/package-mac-app.sh
Debug Gateway Connectivity (macOS CLI)
- Test Gateway connectivity without launching the app
cd apps/macos
swift run openclaw-mac connect --json
swift run openclaw-mac discover --timeout 3000 --json
Connect Options
--url ws://host:port
--mode local|remote
--probe
--timeout <ms>
--json
Discovery Options
--include-local
--timeout <ms>
--json
Compare results with:
openclaw gateway discover --json
Remote Connection Plumbing (SSH Tunnels)
- Used in Remote mode
- Allows local UI to communicate with remote Gateway
Control Tunnel
- Purpose:
- Health checks
- Web chat
- Config
- Control-plane calls
- Local port:
- Remote port:
- Same Gateway port on remote host
Behavior
- Stable local port
- Reuses healthy tunnels
- Restarts tunnels automatically if needed
SSH Shape
ssh -N -L <local>:127.0.0.1:<remote>
- Loopback hides real client IP
- Use direct WS/WSS transport to preserve client IP
How to Run OpenClaw on macOS
macOS App Overview
- The macOS app is the menu-bar companion for OpenClaw
- It manages:
- Local permissions
- Gateway lifecycle
- macOS-specific capabilities
- Acts as a node that exposes macOS features to OpenClaw
- Runs locally or connects to a remote Gateway
What the macOS App Does
- Displays native notifications and status in the menu bar
- Manages macOS permission prompts (TCC), including:
- Notifications
- Accessibility
- Screen Recording
- Microphone
- Speech Recognition
- Automation / AppleScript
- Runs or connects to the Gateway (local or remote)
- Exposes macOS-only tools:
- Canvas
- Camera
- Screen Recording
- system.run
- Starts or stops the local node host service based on mode
- Optionally hosts PeekabooBridge for UI automation
- Installs the global CLI (openclaw) via npm or pnpm
- Bun is not recommended for Gateway runtime
Local vs Remote Mode
Local Mode (Default)
- Attaches to an existing local Gateway
- If none is running, enable it via launchd
Uses:
openclaw gateway install
Remote Mode
- Connects to a Gateway over SSH or Tailscale
- Does not start a local Gateway
- Starts a local node host service
- Allows the remote Gateway to reach this Mac
- The macOS app is not a child process of the Gateway
Launchd Control (macOS)
- Gateway runs as a per-user LaunchAgent
- Default label:
- Profile-based label:
Start Gateway
launchctl kickstart -k gui/$UID/bot.molt.gateway
Stop Gateway
launchctl bootout gui/$UID/bot.molt.gateway
- Replace label with bot.molt.<profile> when using named profiles
- Legacy com.openclaw.* agents still unload correctly
Install the LaunchAgent via:
openclaw gateway install
Node Capabilities (macOS)
- The macOS app registers as a node
- Common node commands include:
Canvas
canvas.present
canvas.navigate
canvas.eval
canvas.snapshot
canvas.a2ui.*
Camera
camera.snap
camera.clip
Screen
screen.record
System
- system.run
- system.notify
- Node reports a permissions map to the Gateway
- Agents decide allowed actions based on this map
Node Service and App IPC
- In Remote mode:
- Headless node host service connects to Gateway via WebSocket
- system.run executes inside the macOS app
- Communication uses:
- Unix Domain Socket (UDS)
- Token authentication
- HMAC validation
- TTL enforcement
- Prompts and outputs remain inside the macOS app
Flow
- Gateway → Node Service (WebSocket)
- Node Service → macOS App (IPC)
Exec Approvals (system.run)
- Controlled from Settings → Exec Approvals in the macOS app
Rules stored locally at:
~/.openclaw/exec-approvals.json
Example Configurationa
{
"version": 1,
"defaults": {
"security": "deny",
"ask": "on-miss"
},
"agents": {
"main": {
"security": "allowlist",
"ask": "on-miss",
"allowlist": [
{ "pattern": "/opt/homebrew/bin/rg" }
]
}
}
}
- Allowlist entries match resolved binary paths
- Choosing “Always Allow” adds the command automatically
- Environment overrides are filtered:
- PATH
- DYLD_*
- LD_*
- NODE_OPTIONS
- PYTHON*
- PERL*
- RUBYOPT
Deep Links (openclaw://)
- macOS app registers the openclaw:// URL scheme
Trigger an Agent
open 'openclaw://agent?message=Hello%20from%20deep%20link'
Supported Parameters
- message (required)
- sessionKey
- thinking
- deliver
- to
- channel
- timeoutSeconds
- key (unattended mode)
Safety Rules
- Without key: user confirmation required
- With a valid key: runs unattended (personal automation use)
Typical macOS Onboarding Flow
- Install and launch OpenClaw.app
- Complete permission checklist (TCC prompts)
- Confirm Local mode is active
- Ensure the Gateway is running
- Install CLI if terminal access is needed
Build and Development Workflow (Native)
Build macOS app:
cd apps/macos
swift build
swift run OpenClaw
Package app:
scripts/package-mac-app.sh
Debug Gateway Connectivity (macOS CLI)
- Test Gateway connectivity without launching the app
cd apps/macos
swift run openclaw-mac connect --json
swift run openclaw-mac discover --timeout 3000 --json
Connect Options
- --url ws://host:port
- --mode local|remote
- --probe
- --timeout <ms>
- --json
Discovery Options
- --include-local
- --timeout <ms>
- --json
- Compare results with:
openclaw gateway discover --json
Remote Connection Plumbing (SSH Tunnels)
- Used in Remote mode
- Allows local UI to communicate with remote Gateway
Control Tunnel
- Purpose:
- Health checks
- Web chat
- Config
- Control-plane calls
- Local port:
- Remote port:
- Same Gateway port on remote host
Behavior
- Stable local port
- Reuses healthy tunnels
- Restarts tunnels automatically if needed
SSH Shape
ssh -N -L <local>:127.0.0.1:<remote>
- Loopback hides real client IP
- Use direct WS/WSS transport to preserve client IP
How to Run OpenClaw on Android
Android Support Overview
- Android runs as a companion node app
- Android does not host the Gateway
- A running Gateway is required on:
- macOS
- Linux
- Windows (via WSL2)
- Android connects to the Gateway over WebSocket
- Setup involves:
- Gateway pairing
- Network discovery
- Node approval
System Control
- System services (launchd / systemd) live on the Gateway host
- Android does not manage the Gateway lifecycle
- Gateway management remains on the server or desktop machine
Connection Architecture
- Android Node App ⇄ Gateway
- Transport:
- mDNS / NSD (LAN)
- WebSocket
- Default Gateway endpoint:
ws://<gateway-host>:18789
- Pairing and authorization are Gateway-owned
Prerequisites
- A running Gateway on a “master” machine
- Android device or emulator can reach the Gateway:
- Same LAN via mDNS / NSD
- Same Tailscale tailnet (recommended)
- Manual host + port (fallback)
- Ability to run the openclaw CLI on the Gateway host (local or SSH)
Step 1 — Start the Gateway
On the Gateway host:
openclaw gateway --port 18789 --verbose
listening on ws://0.0.0.0:18789
Set gateway.bind to tailnet in:
~/.openclaw/openclaw.json
- Restart the Gateway or macOS menu-bar app
Step 2 — Verify Discovery (Optional)
From the Gateway host:
dns-sd -B _openclaw-gw._tcp local
- Use this only for debugging mDNS visibility
Tailnet Discovery Across Networks
- Android mDNS does not cross networks
- For Android ⇄ Gateway across locations:
- Use Wide-Area Bonjour / unicast DNS-SD
- Required steps:
- Create a DNS-SD zone (example: openclaw.internal.)
- Publish _openclaw-gw._tcp records
- Configure Tailscale split DNS to point to this zone
- CoreDNS examples available in the Bonjour documentation
Step 3 — Connect from the Android App
- Open the Android OpenClaw app
- The app runs a foreground service:
- Keeps Gateway connection alive
- Shows a persistent notification
- Navigate to Settings
- Under Discovered Gateways:
- Select your Gateway
- Tap Connect
- If discovery fails:
- Go to Advanced
- Choose Manual Gateway
- Enter host and port
- Tap Connect
- After first successful pairing:
- App reconnects automatically on launch
- Uses last known Gateway or manual endpoint
Step 4 — Approve Pairing (Gateway CLI)
On the Gateway host:
openclaw nodes pendingopenclaw nodes approve <requestId>
- Pairing details are managed by the Gateway
Step 5 — Verify Node Connection
Check node status:
openclaw nodes status
Or via Gateway call:
openclaw gateway call node.list --params "{}"
Step 6 — Chat and History
- Android uses the Gateway’s primary session key
- Chat history is shared across:
- Android
- Web Chat
- Other clients
- Core actions:
- History: chat.history
- Send message: chat.send
- Live updates (best-effort): chat.subscribe → event:"chat"
Step 7 — Canvas and Camera Capabilities
Gateway Canvas Host (Recommended)
- Use the Gateway canvas host for editable HTML/CSS/JS
- Canvas host:
Create:
~/.openclaw/workspace/canvas/index.html
Navigate Android node (LAN):
openclaw nodes invoke \
--node "<Android Node>" \
--command canvas.navigate \
--params '{"url":"http://<gateway-host>.local:18793/__openclaw__/canvas/"}'
Tailnet setups:
- Use MagicDNS name or tailnet IP
Example:
http://<gateway-magicdns>:18793/__openclaw__/canvas/
- Canvas features:
- Live reload on file changes
A2UI host at:
http://<gateway-host>:18793/__openclaw__/a2ui/
Canvas Commands (Foreground Only)
- canvas.eval
- canvas.snapshot
- canvas.navigate
- Use { "url": "" } or { "url": "/" } to return to scaffold
- Snapshot returns:
- { format, base64 }
- Default format: jpeg
- A2UI:
- canvas.a2ui.push
- canvas.a2ui.reset
- Legacy alias: canvas.a2ui.pushJSONL
Camera Commands (Foreground Only)
- Permission-gated commands:
- camera.snap (JPEG)
- camera.clip (MP4)
- Parameters and helpers documented in the Camera node reference
Conclusion
Running OpenClaw across platforms shows just how powerful agentic systems can be, but also how much responsibility they place on the user. Whether it’s cloud deployments, desktop environments, or mobile companion nodes, OpenClaw requires careful configuration, ongoing monitoring, and a strong security posture to avoid missteps.
That’s why many teams now look for an OpenClaw alternative that delivers similar automation benefits without exposing their systems to unnecessary risk. Multiple industry reports and independent analyses continue to highlight OpenClaw security issues, ranging from misconfigurations to overbroad system access. These concerns make OpenClaw better suited to advanced users who are comfortable managing their own infrastructure and security.
Knolli stands out as a powerful OpenClaw alternative built with security and operational control at its core. Instead of unrestricted system access, Knolli focuses on structured workflows, scoped permissions, and predictable outputs, making it a more secure choice for teams that want dependable AI copilots without the operational overhead.
If your goal is to move fast and stay secure, choosing a platform designed with guardrails from day one can make all the difference.