Skills scanwow-sync
Sync 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.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/brandons7/scanwow-sync" ~/.claude/skills/openclaw-skills-scanwow-sync && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/brandons7/scanwow-sync" ~/.openclaw/skills/openclaw-skills-scanwow-sync && rm -rf "$T"
manifest:
skills/brandons7/scanwow-sync/SKILL.mdsource content
ScanWow Sync
Connect 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.
How It Works
- You scan a document in ScanWow on your iPhone
- On-device OCR extracts the text (no images leave your phone)
- ScanWow sends the extracted text to your agent's webhook endpoint
- Your agent receives the scan and can process, file, or act on it
Security
- HTTPS required. Always use TLS for your webhook endpoint. Use Cloudflare Tunnels, ngrok, or Tailscale Funnel to expose your local server securely. Never run plain HTTP over the public internet.
- Bearer token authentication. Every request includes your secret token in the
header. Generate a strong, random token (e.g.,Authorization
).openssl rand -hex 32 - No images transmitted. ScanWow processes images on-device using Apple VisionKit. Only extracted text is sent to your webhook. No photos, no cloud storage, no image buckets.
- Token stored securely. In the ScanWow app, your API token is stored in iOS native secure storage, separate from app settings.
Setup Instructions
1. Start a Webhook Server
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()
2. Expose via HTTPS
Use one of these to make your local server reachable with TLS:
- Cloudflare Tunnel:
cloudflared tunnel --url http://localhost:8000 - ngrok:
ngrok http 8000 - Tailscale Funnel:
tailscale funnel 8000
3. Configure ScanWow
- Open ScanWow on your iPhone
- Tap the Settings gear
- Go to Secure API Export
- Enter your HTTPS endpoint URL
- Enter your secret token
- Turn it ON
Payload Format
Each 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/json
Tips
- Set
as an environment variable instead of hardcoding itSCANWOW_TOKEN - Use
to control where scans are savedSCANWOW_DIR - The server binds to
by default (localhost only) for safety. Your HTTPS tunnel handles external access.127.0.0.1 - Scans arrive in real-time, so your agent can process them immediately (file to a folder, extract data, trigger a workflow, etc.)