diff --git a/CLAUDE.md b/CLAUDE.md
index 9813a43..567b400 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -11,7 +11,7 @@ Embeddable JavaScript chat widget for GoClaw AI agent gateway.
```
src/
├── index.ts Entry point, init(), window auto-attach
-├── types.ts All TypeScript interfaces
+├── types.ts All TypeScript interfaces (GoClawConfig — proxy-only, no direct mode)
├── websocket-client.ts WS connection, auth, RPC, events, reconnect
├── chat-widget.ts Shadow DOM UI, message rendering
├── markdown-renderer.ts Lightweight markdown→HTML
@@ -22,14 +22,30 @@ src/
└── wrappers/
├── react-wrapper.tsx React component
└── vue-wrapper.ts Vue 3 plugin
+server/ Backend proxy (keeps auth token server-side)
+├── src/
+│ ├── index.ts Entry point
+│ ├── proxy-config.ts Config from environment variables
+│ ├── proxy-server.ts HTTP + WebSocket server
+│ ├── websocket-proxy-session.ts Single client↔upstream proxy session
+│ └── connection-tracker.ts Per-IP connection rate limiting
+├── .env.example Example configuration
+├── package.json Server dependencies (ws)
+└── tsconfig.json Server TypeScript config
```
## Commands
```bash
-npm install # Install deps
-npm run dev # Dev server
+npm install # Install widget deps
+npm run dev # Widget dev server
npm run build # tsc --noEmit && vite build
npm run lint # Type-check only
+
+# Proxy server
+cd server && npm install
+npm run dev # Start proxy (tsx watch)
+npm run build # Compile to dist/
+npm start # Run compiled proxy
```
## Key Patterns
@@ -38,3 +54,4 @@ npm run lint # Type-check only
- GoClaw WebSocket Protocol v3 (req/res/event frames)
- Exponential backoff reconnection
- Async snippet loader pattern (like Intercom)
+- Proxy-only: backend injects auth token into WS connect frame, client never sees it (no direct mode)
diff --git a/README.md b/README.md
index 1b557ae..b3399c3 100644
--- a/README.md
+++ b/README.md
@@ -2,9 +2,19 @@
Embeddable chat widget for [GoClaw](https://goclaw.sh) AI agent gateway. Drop a `
+
+