Beta β UI and features are actively evolving.
Double-click β Docker runs in lockdown β browser opens β done.
No Terminal. No Node.js. No PATH issues. No CLI.
Native SwiftUI app handles everything silently in the background.
Powered by Constructive
- Docker Desktop β required to run the OpenClaw container
β¬οΈ Download OpenClawLauncher.dmg
- Open the DMG and drag OpenClawLauncher.app to
/Applications - Double-click to launch
brew tap constructive-io/openclaw-launcher
brew install --cask openclaw-launchercurl -fsSL https://raw.githubusercontent.com/constructive-io/openclaw-launcher/main/scripts/run.sh | bashRequires: Docker, curl, python3, openssl
- Double-click OpenClawLauncher.app
- If Docker Desktop isn't installed, the app will guide you to download it
- The app pulls the OpenClaw image and launches the container
- Your browser opens automatically β paste the gateway token, sign in with your AI provider, and start chatting
That's it. Everything persists across restarts in ~/.openclaw-launcher/.
First launch? The app handles image pulling, token generation, and auth setup. Just follow the on-screen progress bar.
User double-clicks OpenClawLauncher.app
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Native SwiftUI Window β
β β
β ββ Setup βββββββββββββββββββββββββββββββββββββββββββ β
β β [ββββββββββββββββ] 50% β β
β β β³ Pulling Docker image... β β
β β β
4 steps completed β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββ Dashboard (after launch) ββββββββββββββββββββββββ β
β β π’ Container Status: Running 00:05:23 β β
β β π‘ Chat with your agent in the Control UI. β β
β β [ Open Control UI ] β β
β β [ View Logs ] [ Restart ] [ Stop ] β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β πβ Menu bar icon (green/yellow/red status) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ (browser opens automatically)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β http://localhost:18789 β Control UI (browser) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Paste token β Sign in with Anthropic/OpenAI β β
β β Chat with agent β β
β β Configure channels (WhatsApp, Telegram, etc.) β β
β β All settings managed here β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ (inside Docker, user never sees this)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Docker Container (LOCKDOWN MODE) β
β βββ --read-only (immutable root filesystem) β
β βββ --cap-drop ALL (zero Linux capabilities) β
β βββ --memory 2g (resource capped) β
β βββ --pids-limit 256 (no fork bombs) β
β βββ --no-new-privileges (no escalation) β
β βββ -p 127.0.0.1:18789 (localhost only, not LAN) β
β βββ non-root user (node:openclaw) β
β βββ tini as PID 1 (proper signal handling) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Progress bar during setup with current step and completion count
- Dashboard after launch with container status, health indicator, uptime timer
- Menu bar icon with green/yellow/red status dot and quick actions
- Health checks polling the gateway every 5 seconds
- Docker guidance with download link if Docker Desktop is not found
- OAuth + API key auth on first run, or skip and configure later in browser
If you cloned the repo or used the one-liner:
./run.sh # Start (or re-run)
./run.sh stop # Stop container
./run.sh start # Start stopped container
./run.sh logs # Follow container logs
./run.sh status # Check if running
./run.sh reset # Delete everything and start freshRequires Xcode (full install, not just Command Line Tools) for SwiftUI.
# Build .app + .dmg
cd app/macos && bash build.sh
# Output:
# dist/OpenClawLauncher.app β drag to /Applications
# dist/OpenClawLauncher.dmg β share with others
# Run tests
cd app/macos && swift testOr let CI build it β push to main and download the .dmg artifact from GitHub Actions.
openclaw-launcher/
βββ run.sh # Shell launcher (for devs)
βββ docker/
β βββ Dockerfile # Multi-stage build (targets: base, lite, full)
β βββ README.md # Flavor docs + build instructions
βββ app/macos/
β βββ Package.swift # Swift package manifest
β βββ Sources/
β β βββ OpenClawApp/
β β β βββ OpenClawApp.swift # App entry point + MenuBarExtra
β β βββ OpenClawLib/
β β βββ Models.swift # Data types, enums, errors
β β βββ LauncherViews.swift # SwiftUI views (dashboard, setup, cards)
β β βββ OpenClawLauncher.swift # Core logic (Docker, health, timers)
β β βββ AnthropicOAuth.swift # OAuth PKCE flow
β βββ Tests/OpenClawTests/ # Unit tests
β βββ build.sh # Compiles Swift β .app β .dmg
β βββ scripts/ # Build helpers (icon generation)
βββ docs/plan/ # Planning docs
βββ .github/workflows/ # CI (build + test)
Slim Docker images that install OpenClaw via npm β 70% smaller than upstream.
| Flavor | Tag | What's included | Image size |
|---|---|---|---|
| slim | slim |
OpenClaw + jq, ripgrep, fd, sqlite3 | ~300 MB |
| base | base |
slim + node-llama-cpp (local LLM) | ~500 MB |
| full | full |
base + Python 3, Playwright, ffmpeg | ~1.2 GB |
Recommended: Use base for future-proof local LLM support.
OPENCLAW_FLAVOR=base ./scripts/run.shSee docker/README.md for build instructions and full tool inventory.
The Docker container runs with maximum restrictions:
| Security Feature | Setting |
|---|---|
| Root filesystem | --read-only |
| Linux capabilities | --cap-drop ALL |
| Privilege escalation | --no-new-privileges |
| Memory limit | --memory 2g --memory-swap 2g |
| CPU limit | --cpus 2.0 |
| Process limit | --pids-limit 256 |
| Network exposure | 127.0.0.1 only (not LAN) |
| Container user | Non-root (node:openclaw) |
| PID 1 | tini (proper signal handling) |
| Temp filesystem | noexec,nosuid tmpfs |
| Gateway auth | Token required (auto-generated) |
The container cannot:
- Write to its own filesystem (read-only root)
- Gain new privileges or capabilities
- Exceed memory/CPU/process limits
- Be accessed from other machines on the network
- Run without authentication
OpenClaw is an AI agent β it calls Claude, GPT, Gemini, etc. to think. It needs credentials for that. The Control UI (in browser) handles this:
- OAuth sign-in: Click "Sign in with Anthropic" (uses your Claude Pro/Max sub)
- API key: Paste an Anthropic/OpenAI key in the settings panel
Nothing to edit in files or Terminal. All in the browser.
| Problem | Fix |
|---|---|
| "Docker not found" | Install Docker Desktop |
| App shows spinner | Docker Desktop might be starting (~30s) |
| Can't connect to UI | docker ps β ensure port 18789 is free |
| Lost gateway token | cat ~/.openclaw-launcher/.env |
| Want to start fresh | Delete ~/.openclaw-launcher/ folder |
Powered by Constructive