Install
openclaw skills install scanwow-syncSync your OpenClaw agent with the ScanWow iOS app. Receive high-quality OCR scans from your phone directly into your agent's workspace via a secure webhook.
openclaw skills install scanwow-syncConnect your OpenClaw agent to your iPhone's camera using the ScanWow iOS app. Scan documents on your phone, let the on-device AI extract the text, and beam it instantly to your agent's workspace using Secure API Export.
ScanWow is available on the App Store.
Authorization header. Generate a strong, random token (e.g., openssl rand -hex 32).Run this on your OpenClaw host (or any server you control):
# save_scans.py
from http.server import HTTPServer, BaseHTTPRequestHandler
import json, os, secrets
# Generate a strong token: openssl rand -hex 32
TOKEN = os.environ.get("SCANWOW_TOKEN", "YOUR_SECRET_TOKEN")
SAVE_DIR = os.environ.get("SCANWOW_DIR", ".")
class ScanHandler(BaseHTTPRequestHandler):
def do_POST(self):
auth = self.headers.get("Authorization")
if auth != f"Bearer {TOKEN}":
self.send_response(401)
self.end_headers()
return
content_len = int(self.headers.get('Content-Length', 0))
if content_len > 5_000_000: # 5MB safety limit
self.send_response(413)
self.end_headers()
return
post_body = self.rfile.read(content_len)
data = json.loads(post_body)
# Sanitize filename to prevent path traversal
doc_id = data.get('id', 'doc').replace('/', '_').replace('..', '_')[:64]
filename = os.path.join(SAVE_DIR, f"scan_{doc_id}.md")
with open(filename, 'w') as f:
f.write(data.get('text', ''))
print(f"Saved scan: {filename}")
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(b'{"success":true}')
print(f"Listening for ScanWow scans on port 8000...")
HTTPServer(('127.0.0.1', 8000), ScanHandler).serve_forever()
Use one of these to make your local server reachable with TLS:
cloudflared tunnel --url http://localhost:8000ngrok http 8000tailscale funnel 8000Each scan sends a POST request with this JSON body:
{
"id": "uuid-string",
"text": "Extracted document text...",
"confidence": 0.98,
"pages": 1,
"timestamp": 1708531200000,
"isEnhanced": true
}
Headers:
Authorization: Bearer <your-token>Content-Type: application/jsonSCANWOW_TOKEN as an environment variable instead of hardcoding itSCANWOW_DIR to control where scans are saved127.0.0.1 by default (localhost only) for safety. Your HTTPS tunnel handles external access.