← Back to Skills Marketplace
bewareofddog

ClawTime Setup

by bewareofddog · GitHub ↗ · v1.2.0
cross-platform ⚠ suspicious
603
Downloads
0
Stars
0
Active Installs
3
Versions
Install in OpenClaw
/install clawtime-setup
Description
Install, configure, start, and troubleshoot ClawTime — a private self-hosted webchat UI for OpenClaw with passkey (Face ID) auth, Piper TTS voice, and 3D ava...
README (SKILL.md)

ClawTime — Local Installation with Cloudflare Tunnel

ClawTime is a private webchat UI connecting to the OpenClaw gateway via WebSocket. Features: passkey (Face ID/Touch ID) auth, Piper TTS voice, 3D avatar.

Why Cloudflare is required: WebAuthn (passkeys) need HTTPS on a real domain. http://localhost only works on the same machine — not from a phone on your network.

Architecture

iPhone/Browser → https://portal.yourdomain.com → Cloudflare Tunnel → localhost:3000 (ClawTime) → ws://127.0.0.1:18789 (OpenClaw Gateway)

Prerequisites

  • Node.js v22+
  • cloudflared CLI: brew install cloudflared
  • A domain with DNS on Cloudflare (free tier works)
  • OpenClaw running: openclaw status
  • (Optional) Piper TTS + ffmpeg for voice

Installation Steps

1. Clone & install

cd ~/Projects
git clone https://github.com/youngkent/clawtime.git
cd clawtime
npm install --legacy-peer-deps

2. Set up Cloudflare Tunnel

# Login to Cloudflare
cloudflared tunnel login

# Create named tunnel
cloudflared tunnel create clawtime

# Configure routing
# Edit ~/.cloudflared/config.yml:

~/.cloudflared/config.yml:

tunnel: clawtime
credentials-file: /Users/YOUR_USER/.cloudflared/\x3Ctunnel-id>.json

ingress:
  - hostname: portal.yourdomain.com
    service: http://localhost:3000
  - service: http_status:404

Then in Cloudflare DNS dashboard: add a CNAME record:

  • Name: portal → Target: \x3Ctunnel-id>.cfargotunnel.com (Proxied ✅)

3. Configure OpenClaw gateway

The gateway must whitelist ClawTime's origin:

openclaw config patch '{"gateway":{"controlUi":{"allowedOrigins":["https://portal.yourdomain.com"]}}}'
openclaw gateway restart

⚠️ PUBLIC_URL must match this origin exactly — it's used as the WebSocket origin header for device auth.

4. Start ClawTime server

Minimum (no TTS):

cd ~/Projects/clawtime
PUBLIC_URL=https://portal.yourdomain.com \
SETUP_TOKEN=\x3Cyour-setup-token> \
GATEWAY_TOKEN=\x3Cgateway-token> \
node server.js

With Piper TTS:

cd ~/Projects/clawtime
PUBLIC_URL=https://portal.yourdomain.com \
SETUP_TOKEN=\x3Cyour-setup-token> \
GATEWAY_TOKEN=\x3Cgateway-token> \
BOT_NAME="Beware" \
BOT_EMOJI="🌀" \
TTS_COMMAND='python3 -m piper --data-dir ~/Documents/resources/piper-voices -m en_US-kusal-medium -f /tmp/clawtime-tts-tmp.wav -- {{TEXT}} && ffmpeg -y -loglevel error -i /tmp/clawtime-tts-tmp.wav {{OUTPUT}}' \
node server.js

⚠️ TTS Security Note: The {{TEXT}} placeholder is substituted into a shell command. ClawTime's server must sanitize text before substitution to prevent command injection. The server should strip or escape shell metacharacters (; | & $ \ ( ) { } \x3C >) from user input before passing it to the TTS command. If you're modifying the TTS pipeline, use child_process.execFile()with argument arrays instead ofchild_process.exec()` with string interpolation.

5. Start Cloudflare tunnel

cloudflared tunnel run clawtime

6. Register passkey (first time only)

  1. Open https://portal.yourdomain.com/?setup=\x3Cyour-setup-token> in Safari
  2. Follow the passkey (Face ID / Touch ID) prompt
  3. ❌ Do NOT use private/incognito mode — Safari blocks passkeys there
  4. ❌ Do NOT use Chrome on iOS — use Safari

After registration, access ClawTime at https://portal.yourdomain.com.


Environment Variables

Variable Required Description
PUBLIC_URL Public HTTPS URL (must match allowedOrigins in gateway config)
GATEWAY_TOKEN OpenClaw gateway auth token
SETUP_TOKEN For registration Passphrase for ?setup=\x3Ctoken> passkey registration URL
TTS_COMMAND For voice Piper command with {{TEXT}} and {{OUTPUT}} placeholders
BOT_NAME No Display name (default: "Beware")
BOT_EMOJI No Avatar emoji (default: "🌀")
PORT No Server port (default: 3000)

Storing Tokens Securely (recommended)

Instead of passing tokens as plaintext env vars or in plist files, store them in macOS Keychain:

# Store tokens in Keychain
security add-generic-password -s "clawtime-gateway-token" -a "$(whoami)" -w "YOUR_GATEWAY_TOKEN"
security add-generic-password -s "clawtime-setup-token" -a "$(whoami)" -w "YOUR_SETUP_TOKEN"

Then retrieve them at launch time:

GATEWAY_TOKEN=$(security find-generic-password -s "clawtime-gateway-token" -a "$(whoami)" -w) \
SETUP_TOKEN=$(security find-generic-password -s "clawtime-setup-token" -a "$(whoami)" -w) \
PUBLIC_URL=https://portal.yourdomain.com \
node server.js

This avoids storing secrets in plaintext on disk.


Device Authentication (Critical)

ClawTime authenticates with the OpenClaw gateway using Ed25519 keypair auth. This is where most installs break — see details in references/device-auth.md.

Quick summary:

  • Keypair auto-generated in ~/.clawtime/device-key.json on first run
  • Device ID = SHA-256 of raw 32-byte Ed25519 pubkey (NOT the full SPKI-encoded key)
  • Signature payload format: v2|deviceId|clientId|clientMode|role|scopes|signedAtMs|token|nonce
  • If device auth fails → delete ~/.clawtime/device-key.json and restart

Auto-Start on Boot (macOS launchd)

See references/launchd.md for plist templates for both the server and tunnel.


Managing Services

# Stop server
pkill -f "node server.js"

# Stop tunnel
pkill -f "cloudflared"

# View logs (if backgrounded)
tail -f /tmp/clawtime.log
tail -f /tmp/cloudflared.log

# Restart after code/config changes
pkill -9 -f "node server.js"; sleep 2; # then re-run start command

Getting the Gateway Token

# From macOS Keychain
security find-generic-password -s "openclaw-gateway-token" -a "$(whoami)" -w

# From config file
cat ~/.openclaw/openclaw.json | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('gateway',{}).get('token',''))"

Passkey Operations

# Reset passkeys (re-register from scratch)
echo '[]' > ~/.clawtime/credentials.json
# Restart server, then visit /?setup=\x3Ctoken>

# Reset device key (new keypair on next restart)
rm ~/.clawtime/device-key.json

Troubleshooting

See references/troubleshooting.md for all common errors and fixes. See references/device-auth.md for deep-dive on gateway auth issues.

Usage Guidance
Things to consider before installing: - Review the remote repo before running it: the installer will git clone https://github.com/youngkent/clawtime.git and run npm install and node server.js. Inspect server.js and package.json (and all npm dependencies) for unexpected network calls, credential exfiltration, or privileged actions. - Metadata mismatches: the registry claims no required env vars but SKILL.md requires PUBLIC_URL and GATEWAY_TOKEN; the installer also uses the 'openclaw' CLI but the top-level required binaries list omitted it. Expect to need the OpenClaw CLI and tokens. - Sensitive tokens: the installer will store GATEWAY_TOKEN and SETUP_TOKEN in your macOS Keychain (or ask you to paste them). That is reasonable for this use case, but ensure you trust the code that will read them at runtime. - Persistence: the docs encourage creating launchd agents (auto-start, KeepAlive). If you install, be prepared to remove those plists and start scripts to uninstall. - Supply-chain risk: npm install will fetch third‑party packages. If you cannot audit the repo and dependencies, consider running the service in an isolated environment (VM/container) or reviewing a pinned commit in the repo first. - TTS command injection: the documentation correctly warns that unescaped {{TEXT}} substituted into shell commands is dangerous; verify the server implementation does proper sanitization or uses execFile/argument arrays. - What would increase confidence: a trustworthy homepage or verified upstream repo, an explicit list of file changes the installer makes, and a quick manual review of server.js and package.json confirming no unexpected outbound network endpoints or secret uploads. Given the above inconsistencies and the fact the installer fetches and executes remote code, proceed only after code review or using an isolated environment.
Capability Analysis
Type: OpenClaw Skill Name: clawtime-setup Version: 1.2.0 The skill bundle is classified as suspicious due to a shell injection vulnerability in `scripts/install.sh`. The `openclaw config patch` command directly interpolates the `PUBLIC_URL` variable without proper sanitization, allowing for arbitrary command execution if a malicious `PUBLIC_URL` is provided. Additionally, `SKILL.md` explicitly warns about a command injection vulnerability in the ClawTime server's `TTS_COMMAND` if user input is not sanitized, highlighting a significant risk in the application being installed, though not a direct vulnerability in the skill's execution itself. There is no evidence of intentional malicious behavior like data exfiltration to unauthorized endpoints or stealthy backdoors.
Capability Assessment
Purpose & Capability
The name/description (installing a local ClawTime webchat behind a Cloudflare tunnel) aligns with the required binaries and actions (node, cloudflared, git, npm, keychain, filesystem). However registry metadata omitted the openclaw CLI although the install script and SKILL.md require and call 'openclaw' (the installer checks for it and attempts to use ~/.openclaw/openclaw.json). Also the top-level registry fields claim 'no required env vars' while SKILL.md documents PUBLIC_URL and GATEWAY_TOKEN as required.
Instruction Scope
SKILL.md and included docs instruct the agent to clone a GitHub repo, edit/write ~/.cloudflared/config.yml, create ~/Projects/clawtime, start services, and read/write local files (including ~/.openclaw/openclaw.json and keychain entries). These actions are consistent with installing a local web UI but are broad (filesystem, network, keychain). There is no obvious exfiltration endpoint in the docs, and the authors explicitly note TTS command injection risks and recommend safe patterns.
Install Mechanism
The included scripts clone and run code from https://github.com/youngkent/clawtime.git and run 'npm install' and 'node server.js' — i.e., the installer will fetch and execute third‑party code at runtime. While GitHub is a common host, the repo owner is unknown (no homepage provided) and npm dependencies introduce supply‑chain risk. There is no packaged install spec from a verified registry; the script performs persistent changes (writing start scripts, config files).
Credentials
The skill needs sensitive tokens (GATEWAY_TOKEN, SETUP_TOKEN) and PUBLIC_URL to function; requesting and storing these in macOS Keychain is proportionate. But the registry manifest claims 'no required env vars' while the SKILL.md marks PUBLIC_URL and GATEWAY_TOKEN as required — an inconsistency the user should notice. The installer also attempts to auto-read ~/.openclaw/openclaw.json to extract a token, which is related to the gateway purpose but means the script will access other local config files.
Persistence & Privilege
The skill does not declare always:true. However the provided instructions and scripts guide the user to create persistent launchd agents (KeepAlive: true) and write start scripts under ~/Projects and ~/.cloudflared, which grants long‑lived presence on the machine. This is expected for a local service but increases blast radius if the installed code is malicious.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install clawtime-setup
  3. After installation, invoke the skill by name or use /clawtime-setup
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.2.0
Fixed metadata: declares all required/optional binaries (node, git, cloudflared, python3, ffmpeg, piper), env vars, files, and permissions (network, keychain, filesystem). Resolves OpenClaw suspicious flag caused by under-documented installer scope.
v1.1.0
Security patch: tokens now stored in macOS Keychain instead of plaintext plists, added TTS command injection warning, launchd uses wrapper script for secure token loading
v1.0.0
Full ClawTime install guide — Cloudflare tunnel, passkey (Face ID) auth, Piper TTS, Ed25519 device auth deep-dive, launchd auto-start, and automated install script
Metadata
Slug clawtime-setup
Version 1.2.0
License
All-time Installs 0
Active Installs 0
Total Versions 3
Frequently Asked Questions

What is ClawTime Setup?

Install, configure, start, and troubleshoot ClawTime — a private self-hosted webchat UI for OpenClaw with passkey (Face ID) auth, Piper TTS voice, and 3D ava... It is an AI Agent Skill for Claude Code / OpenClaw, with 603 downloads so far.

How do I install ClawTime Setup?

Run "/install clawtime-setup" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is ClawTime Setup free?

Yes, ClawTime Setup is completely free (open-source). You can download, install and use it at no cost.

Which platforms does ClawTime Setup support?

ClawTime Setup is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created ClawTime Setup?

It is built and maintained by bewareofddog (@bewareofddog); the current version is v1.2.0.

💬 Comments