A small Pebble/RePebble watch remote for OpenClaw agents.
Status: v0.5.2 live-hook candidate. Real-watch no-secret flow and bundled settings are verified; first live OpenClaw hook test is next. Not 1.0 yet.
The first/default profile is Otti Remote, but the protocol and OpenClaw hook surface are intentionally generic so other OpenClaw users can adapt it to their own agents.
This is not a wrist admin console. It is a narrow remote with fixed intents, server-side routing and conservative security defaults.
Pebble watchapp
-> AppMessage
-> PebbleKit JS on phone
-> HTTPS OpenClaw hook
-> mapped OpenClaw agent run
-> notification / watch response path
| Button | Intent | Meaning |
|---|---|---|
| Up | ping |
Check that the phone/hook path is reachable. |
| Select | status |
Ask for a short agent status card. |
| Down | last |
Show local last response or ask for the latest brief card. |
| Long Select | capture |
Start Pebble dictation where supported and send confirmed text. |
| Long Down | help |
Ask for a short help card. |
Design goals:
- quick wrist capture / push-to-talk
- "what needs my attention?" status at a glance
- tiny answer/report cards, not long chat on a watch
- cosy companion feel without unsafe automation powers
- reusable OpenClaw agent remote shape
The app intentionally targets microphone-capable platforms only:
basaltchalkdioriteemeryflintgabbro
aplite is excluded because this is a voice-oriented remote and should not imply dictation support where none exists.
- Open https://cloudpebble.repebble.com/.
- Connect/import this GitHub repository.
- If authorizing GitHub access, choose Only select repositories and select only this repo.
- Build the project.
- Run in emulator or install on a watch.
- Before configuring a hook token, press
UporSelect. - Expected no-secret result: the app reports a setup-missing state (
Setup fehlt/ endpoint or token missing), not a crash.
See CLOUDPEBBLE.md for the detailed path.
Install Pebble tooling:
uv tool install pebble-tool --python 3.13
pebble sdk install latest
pebble buildThe local workspace was verified with Pebble Tool 5.0.35 and SDK 4.9.169 using:
/home/node/.local/share/uv/tools/pebble-tool/bin/pebble buildThe older project-local .venv-pebble/bin/pebble path is intentionally not the acceptance path here; it has shown Python SDK environment mismatch failures.
The intended user journey is agent-guided:
Install app
→ ask your OpenClaw agent to set up the Pebble remote
→ paste endpoint/token into the app settings
→ press Ping
The phone-side PebbleKit JS expects these settings via the Pebble configuration webview/local storage:
- hook endpoint URL
- hook bearer token
- optional profile/agent display hints
- optional reply mode
Do not commit a real endpoint or token.
Use openclaw/pebble-intent.mapping.json as a placeholder example, not as a blind patch. Real deployment values must stay local to the deploying user. See docs/setup-journey.md for the setup contract.
Security defaults:
- dedicated bearer token
- non-obvious hook path
- small request bodies
allowRequestSessionKey=false- fixed intent allowlist
- routing and permissions decided server-side
- no shell/config/delete/external-send/API-spend actions from wrist intents
See SECURITY.md.
appinfo.json— legacy Pebble app metadata and AppMessage keys.package.json— current Pebble SDK metadata, target platforms and message keys.wscript— Pebble SDK build entry.src/c/main.c— watch UI, buttons, AppMessage, optional dictation.src/pkjs/index.js— phone-side HTTP client and config handling.src/pkjs/config.json— Clay settings UI bundled into the PBW.openclaw/pebble-intent.mapping.json— placeholder hook mapping.openclaw/transforms/pebble-intent.mjs— intent allowlist and prompt transform.tools/smoke-transform.mjs— offline transform smoke test.tools/smoke-hook.sh— local hook smoke helper.docs/known-issues.md— current emulator/device caveats.docs/setup-journey.md— intended agent-guided setup flow.docs/agent-setup-runbook.md— OpenClaw-agent-facing hook setup contract.docs/response-path.md— current v0.5 inbound status and v0.6 return-path design.docs/reachability.md— LAN/VPN/public HTTPS reachability choices.docs/publication-checklist.md— pre-release scan for secrets and private deployment traces.
node --check src/pkjs/index.js
node --check openclaw/transforms/pebble-intent.mjs
node tools/smoke-transform.mjs
OTTI_PEBBLE_DRY_RUN=1 ./tools/smoke-hook.sh capture 'Quote-safe text: "hi"'With a real hook configured locally:
OPENCLAW_PEBBLE_HOOK_URL='https://example/hooks-openclaw-pebble/pebble-intent' \
OPENCLAW_PEBBLE_HOOK_TOKEN='...' \
./tools/smoke-hook.sh statusCloudPebble/RePebble emulator may log app_timer.c:49: Timer 0 does not exist during dictation testing. If the app does not crash and remains responsive, treat this as an emulator dictation warning for now. Real watch + phone app dictation testing is still required for v0.4.
See docs/known-issues.md.
See ROADMAP.md. v1.0 requires real watch install testing, live hook verification, response-loop behavior, documentation, and a security review.
Issues and PRs are welcome. Please read CONTRIBUTING.md and redact logs/screenshots before posting.
MIT. See LICENSE.