Secure, asynchronous chat between a static web app and a local AI bot.
Woodwire is an event-driven system for private, multimodal communication between a browser-based PWA and a local bot process. The frontend stays static and credential-free, while a Cloudflare Worker and AWS services coordinate message flow.
π Quick Start | π€ OpenClaw | π Architecture | π Docs
Woodwire captures the spirit of this project. I'm the type who would choose build a wood cabin in the mountains β except in this case it's not a cabin, it's a "wooden" telephone line to my local AI. The name evokes both the analog simplicity of a cabin phone line and the digital connection to an AI that lives on your own machine.
While Woodwire supports multiple AI backends (OpenClaw, Ollama, or mock), it's designed with OpenClaw as the first-class integration. If you're looking for a secure, locally-hosted chat interface for OpenClaw, Woodwire is built for you.
- Private & Encrypted β Messages stay in your control; optional client-side AES-256-GCM encryption
- Credential-Free Frontend β Static PWA with no hardcoded secrets; all auth happens at the edge
- Zero-Trust Gateway β Cloudflare Worker validates every request with a shared passphrase
- Multimodal β Text, images, audio attachments; automatic voice transcription and synthesis
- Outbound-Only Bot β Local bot never exposes ports; all communication is pull-based via SQS + S3
- No Build Required β Frontend is vanilla HTML/CSS/JS; deploy directly to S3/CloudFront or GitHub Pages
- Infrastructure as Code β CloudFormation templates for reproducible AWS deployments
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β INBOUND PIPELINE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β [ Browser PWA ] βββΊ [ Cloudflare Worker ] βββΊ [ AWS SQS ] β
β (Static) (Zero-trust auth) (Event buffer) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1. User sends message from PWA
2. Worker validates X-Woodwire-Auth header
3. Message is forwarded to SQS queue
4. Local bot polls SQS and processes
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β OUTBOUND PIPELINE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β [ Local Bot ] βββΊ [ Private S3 Bucket ] βββΊ [ Browser polls]β
β (OpenClaw/etc) (outbox/ responses) (via Worker) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1. Bot processes inbound message
2. Bot writes response to S3 outbox/
3. Browser polls Worker for status
4. Worker retrieves response from S3 and returns to browser
Woodwire follows the monorepo layout defined in ADR-006:
woodwire/
βββ src/ # PWA frontend (HTML/CSS/JS) β deploys to S3/CloudFront
βββ bot/ # Local Python bot (SQS poller, LLM orchestrator)
βββ worker/ # Cloudflare Worker source (zero-trust gateway)
βββ infra/ # AWS CloudFormation templates (IaC)
βββ meta/ # ADRs, design docs, philosophy
βββ .github/ # CI/CD workflows
Each component has its own detailed documentation:
- QUICK_START.md β Setup guide from AWS account to running chat
- src/README.md β Frontend architecture, accessibility, conventions
- worker/README.md β Cloudflare Worker API contract, auth, deployment
- bot/README.md β Local bot setup, AI backends, voice support, troubleshooting
- infra/README.md β AWS infrastructure stacks, IAM setup, parameters
To get up and running:
-
Follow the QUICK_START.md for step-by-step AWS, Worker, bot, and PWA setup
-
Or skip to component-specific docs:
- Setting up AWS? See infra/README.md
- Deploying the Worker? See worker/README.md
- Running the bot? See bot/README.md
- Customizing the frontend? See src/README.md
Before committing, run the project's linters and tests:
# Pre-commit hooks
pip install pre-commit
pre-commit run --all-files
# Markdown linting
npx --yes markdownlint-cli2 "**/*.md"
# HTML linting
npx --yes htmlhint "src/**/*.html"
# Bot unit tests
cd bot
uv sync
python -m unittest discover -s tests -v
# Worker tests
npx --yes vitest run worker/index.test.jsDevelopment standards and contributor expectations are documented in meta/DEVELOPMENT_PHILOSOPHY.md. Please read this before contributing.
This project uses Architecture Decision Records (ADRs) to document significant design choices. Before proposing a major change, review existing ADRs in meta/adr/.
Optional AES-256-GCM encryption between browser and bot:
# Generate a 32-byte base64 key
openssl rand -base64 32
# Set on bot
export WOODWIRE_E2EE_KEY=your-base64-key
python bot/main.py
# Set in PWA settings (exact same key)The Cloudflare Worker intentionally does not receive this keyβit never has the ability to decrypt messages.
For backwards compatibility, unencrypted messages continue to work.
This project was built for personal use. While you're welcome to clone, fork, and use it, expect limited maintenance. For bugs, ideas, or questions, feel free to open an issueβbut understand that responses may be infrequent.
See CONTRIBUTING.md for more details.
This project is licensed under the MIT License.
- GitHub OpenClaw β Local LLM backend
- Cloudflare Workers Documentation
- AWS CloudFormation Documentation