diff --git a/README.md b/README.md
index 8166ca3..173f78f 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,13 @@ Fast web client for OpenClaw.
Currently in beta.
-## Setup
+## Installation
+
+```bash
+curl -fsSL https://webclaw.dev/install | bash
+```
+
+## Other option
Create `apps/webclaw/.env.local` with `CLAWDBOT_GATEWAY_URL` and either
`CLAWDBOT_GATEWAY_TOKEN` (recommended) or `CLAWDBOT_GATEWAY_PASSWORD`. These map
diff --git a/apps/landing/public/install b/apps/landing/public/install
new file mode 100644
index 0000000..bf756cc
--- /dev/null
+++ b/apps/landing/public/install
@@ -0,0 +1,93 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+REPO_URL="https://github.com/ibelick/webclaw"
+APP_DIR="webclaw"
+ENV_FILE="apps/webclaw/.env.local"
+TRACKING_URL="https://collector.onedollarstats.com/events"
+
+cat <<'EOF'
+ ▄▄ ▄▄
+ ██ ██
+██ ██ ▄█▀█▄ ████▄ ▄████ ██ ▀▀█▄ ██ ██
+██ █ ██ ██▄█▀ ██ ██ ██ ██ ▄█▀██ ██ █ ██
+ ██▀██ ▀█▄▄▄ ████▀ ▀████ ██ ▀█▄██ ██▀██
+
+Fast web client for OpenClaw
+
+EOF
+
+function track_install() {
+ if ! command -v curl >/dev/null 2>&1; then
+ return
+ fi
+
+ local os
+ local arch
+ os="$(uname -s 2>/dev/null || echo "unknown")"
+ arch="$(uname -m 2>/dev/null || echo "unknown")"
+
+ curl -sS -X POST \
+ -H "Content-Type: application/json" \
+ -d "{\"name\":\"install\",\"event\":\"install\",\"properties\":{\"source\":\"install-script\",\"os\":\"${os}\",\"arch\":\"${arch}\"}}" \
+ "$TRACKING_URL" >/dev/null 2>&1 || true
+}
+
+track_install
+
+if ! command -v git >/dev/null 2>&1; then
+ echo "git is required but not found."
+ exit 1
+fi
+
+if ! command -v pnpm >/dev/null 2>&1; then
+ echo "pnpm is required but not found."
+ echo "Install it with: corepack enable && corepack prepare pnpm@latest --activate"
+ exit 1
+fi
+
+if [ -d "$APP_DIR" ]; then
+ echo "Directory '$APP_DIR' already exists. Skipping clone."
+else
+ git clone "$REPO_URL" "$APP_DIR"
+fi
+
+cd "$APP_DIR"
+pnpm install
+
+echo ""
+printf "Create %s now? [Y/n]: " "$ENV_FILE"
+read -r create_env
+
+if [ -z "$create_env" ] || [ "$create_env" = "y" ] || [ "$create_env" = "Y" ]; then
+ if [ -f "$ENV_FILE" ]; then
+ printf "%s already exists. Overwrite? [y/N]: " "$ENV_FILE"
+ read -r overwrite_env
+ if [ "$overwrite_env" != "y" ] && [ "$overwrite_env" != "Y" ]; then
+ echo "Keeping existing $ENV_FILE"
+ create_env="skip"
+ fi
+ fi
+
+ if [ "$create_env" != "skip" ]; then
+ printf "CLAWDBOT_GATEWAY_URL: "
+ read -r gateway_url
+ printf "CLAWDBOT_GATEWAY_TOKEN: "
+ read -r gateway_token
+
+ mkdir -p "$(dirname "$ENV_FILE")"
+ {
+ echo "CLAWDBOT_GATEWAY_URL=$gateway_url"
+ echo "CLAWDBOT_GATEWAY_TOKEN=$gateway_token"
+ } > "$ENV_FILE"
+
+ echo "Wrote $ENV_FILE"
+ fi
+else
+ echo "Skipping env file. Create it later at $ENV_FILE with:"
+ echo "CLAWDBOT_GATEWAY_URL=..."
+ echo "CLAWDBOT_GATEWAY_TOKEN=..."
+fi
+
+echo ""
+echo "Next step: pnpm -C apps/webclaw dev"
diff --git a/apps/landing/src/app.tsx b/apps/landing/src/app.tsx
index f8a1d39..a36bb07 100644
--- a/apps/landing/src/app.tsx
+++ b/apps/landing/src/app.tsx
@@ -256,10 +256,7 @@ export function App() {
Installation
@@ -270,7 +267,7 @@ pnpm run dev`}
style={{ pointerEvents: "auto" }}
>
- ©2026{" "}
+ ©{new Date().getFullYear()}{" "}
=6'}
+ lefthook-darwin-arm64@1.13.6:
+ resolution: {integrity: sha512-m6Lb77VGc84/Qo21Lhq576pEvcgFCnvloEiP02HbAHcIXD0RTLy9u2yAInrixqZeaz13HYtdDaI7OBYAAdVt8A==}
+ cpu: [arm64]
+ os: [darwin]
+
+ lefthook-darwin-x64@1.13.6:
+ resolution: {integrity: sha512-CoRpdzanu9RK3oXR1vbEJA5LN7iB+c7hP+sONeQJzoOXuq4PNKVtEaN84Gl1BrVtCNLHWFAvCQaZPPiiXSy8qg==}
+ cpu: [x64]
+ os: [darwin]
+
+ lefthook-freebsd-arm64@1.13.6:
+ resolution: {integrity: sha512-X4A7yfvAJ68CoHTqP+XvQzdKbyd935sYy0bQT6Ajz7FL1g7hFiro8dqHSdPdkwei9hs8hXeV7feyTXbYmfjKQQ==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ lefthook-freebsd-x64@1.13.6:
+ resolution: {integrity: sha512-ai2m+Sj2kGdY46USfBrCqLKe9GYhzeq01nuyDYCrdGISePeZ6udOlD1k3lQKJGQCHb0bRz4St0r5nKDSh1x/2A==}
+ cpu: [x64]
+ os: [freebsd]
+
+ lefthook-linux-arm64@1.13.6:
+ resolution: {integrity: sha512-cbo4Wtdq81GTABvikLORJsAWPKAJXE8Q5RXsICFUVznh5PHigS9dFW/4NXywo0+jfFPCT6SYds2zz4tCx6DA0Q==}
+ cpu: [arm64]
+ os: [linux]
+
+ lefthook-linux-x64@1.13.6:
+ resolution: {integrity: sha512-uJl9vjCIIBTBvMZkemxCE+3zrZHlRO7Oc+nZJ+o9Oea3fu+W82jwX7a7clw8jqNfaeBS+8+ZEQgiMHWCloTsGw==}
+ cpu: [x64]
+ os: [linux]
+
+ lefthook-openbsd-arm64@1.13.6:
+ resolution: {integrity: sha512-7r153dxrNRQ9ytRs2PmGKKkYdvZYFPre7My7XToSTiRu5jNCq++++eAKVkoyWPduk97dGIA+YWiEr5Noe0TK2A==}
+ cpu: [arm64]
+ os: [openbsd]
+
+ lefthook-openbsd-x64@1.13.6:
+ resolution: {integrity: sha512-Z+UhLlcg1xrXOidK3aLLpgH7KrwNyWYE3yb7ITYnzJSEV8qXnePtVu8lvMBHs/myzemjBzeIr/U/+ipjclR06g==}
+ cpu: [x64]
+ os: [openbsd]
+
+ lefthook-windows-arm64@1.13.6:
+ resolution: {integrity: sha512-Uxef6qoDxCmUNQwk8eBvddYJKSBFglfwAY9Y9+NnnmiHpWTjjYiObE9gT2mvGVpEgZRJVAatBXc+Ha5oDD/OgQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ lefthook-windows-x64@1.13.6:
+ resolution: {integrity: sha512-mOZoM3FQh3o08M8PQ/b3IYuL5oo36D9ehczIw1dAgp1Ly+Tr4fJ96A+4SEJrQuYeRD4mex9bR7Ps56I73sBSZA==}
+ cpu: [x64]
+ os: [win32]
+
+ lefthook@1.13.6:
+ resolution: {integrity: sha512-ojj4/4IJ29Xn4drd5emqVgilegAPN3Kf0FQM2p/9+lwSTpU+SZ1v4Ig++NF+9MOa99UKY8bElmVrLhnUUNFh5g==}
+ hasBin: true
+
levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
@@ -5708,6 +5769,49 @@ snapshots:
kleur@4.1.5: {}
+ lefthook-darwin-arm64@1.13.6:
+ optional: true
+
+ lefthook-darwin-x64@1.13.6:
+ optional: true
+
+ lefthook-freebsd-arm64@1.13.6:
+ optional: true
+
+ lefthook-freebsd-x64@1.13.6:
+ optional: true
+
+ lefthook-linux-arm64@1.13.6:
+ optional: true
+
+ lefthook-linux-x64@1.13.6:
+ optional: true
+
+ lefthook-openbsd-arm64@1.13.6:
+ optional: true
+
+ lefthook-openbsd-x64@1.13.6:
+ optional: true
+
+ lefthook-windows-arm64@1.13.6:
+ optional: true
+
+ lefthook-windows-x64@1.13.6:
+ optional: true
+
+ lefthook@1.13.6:
+ optionalDependencies:
+ lefthook-darwin-arm64: 1.13.6
+ lefthook-darwin-x64: 1.13.6
+ lefthook-freebsd-arm64: 1.13.6
+ lefthook-freebsd-x64: 1.13.6
+ lefthook-linux-arm64: 1.13.6
+ lefthook-linux-x64: 1.13.6
+ lefthook-openbsd-arm64: 1.13.6
+ lefthook-openbsd-x64: 1.13.6
+ lefthook-windows-arm64: 1.13.6
+ lefthook-windows-x64: 1.13.6
+
levn@0.4.1:
dependencies:
prelude-ls: 1.2.1