Replace the disparate gradient/orange/red color scheme with a single soft sky-blue (rgb 56,189,248) that subtly intensifies as usage grows. Opacity ramps from 0.35 at low usage to 1.0 at full context. Applies to both sidebar session bars and header token bar.
PinchChat
A sleek, dark-themed webchat UI for OpenClaw — monitor sessions, stream responses, and inspect tool calls in real-time.
🖼️ Screenshot coming soon — contributions welcome!
✨ Features
- 🔧 Tool call visualization — see what your agent is doing in real-time: colored badges, visible parameters, expandable results. The killer feature missing from every other chat UI.
- 💬 GPT-like interface — sessions in a sidebar, switch between conversations. Familiar if you've used ChatGPT or Claude.
- 📋 Multi-session navigation — browse all active sessions including cron jobs, sub-agents, and background tasks
- ⚡ Live streaming — watch the agent think and write token by token
- 📊 Token usage tracking — progress bars per session so you know how much context is left
- 🖼️ Inline images — generated or read images render directly in chat with lightbox preview
- 🎯 Chat-focused — no settings menus or config panels cluttering the screen. Just the conversation.
- 🌐 i18n — English and French built-in, easy to extend
🚀 Quick Start
Docker (recommended)
docker run -p 3000:80 ghcr.io/marlburrow/pinchchat:latest
Open http://localhost:3000 and enter your OpenClaw gateway URL + token on the login screen.
Or use Docker Compose:
curl -O https://raw.githubusercontent.com/MarlBurroW/pinchchat/main/docker-compose.yml
docker compose up -d
From source
Prerequisites: Node.js 18+, an OpenClaw gateway running and accessible.
git clone https://github.com/MarlBurroW/pinchchat.git
cd pinchchat
npm install
cp .env.example .env
npm run dev
Optionally edit .env to pre-fill the gateway URL:
VITE_GATEWAY_WS_URL=ws://localhost:18789
VITE_LOCALE=en # or "fr" for French UI
Production build
npm run build
npx vite preview
Or serve the dist/ folder with nginx, Caddy, or any static file server.
⚙️ Configuration
All configuration is optional — credentials are entered at runtime via the login screen.
| Variable | Description | Default |
|---|---|---|
VITE_GATEWAY_WS_URL |
Pre-fill the gateway URL on the login screen | ws://<hostname>:18789 |
VITE_LOCALE |
UI language (en or fr) |
en |
Note: The gateway token is entered at runtime and stored in
localStorage— it is never baked into the build.
🏗 Architecture
graph TD
subgraph Browser["🌐 PinchChat (Browser)"]
Login["LoginScreen<br/><i>credentials</i>"]
App["App.tsx<br/><i>router</i>"]
UI["Chat + Sidebar<br/><i>main UI</i>"]
Hook["useGateway<br/><i>WebSocket state machine</i><br/>auth · sessions · messages"]
Login --> App --> UI
App & UI --> Hook
end
Hook <-->|"WebSocket (JSON frames)"| Gateway["🔌 OpenClaw Gateway<br/><code>ws://host:18789</code>"]
Gateway <-->|API| LLM["🤖 LLM Provider<br/><i>Anthropic, OpenAI, etc.</i>"]
Key Components
| File | Role |
|---|---|
src/hooks/useGateway.ts |
WebSocket connection, auth, message streaming, session management |
src/components/LoginScreen.tsx |
Runtime credential entry (stored in localStorage) |
src/components/Chat.tsx |
Message list with auto-scroll and streaming display |
src/components/ChatInput.tsx |
Input with file upload, paste, drag & drop, image compression |
src/components/ChatMessage.tsx |
Markdown rendering, tool calls, thinking blocks |
src/components/Sidebar.tsx |
Session list with token usage bars and activity indicators |
src/components/Header.tsx |
Connection status, token progress bar, logout |
src/lib/i18n.ts |
Lightweight i18n (English + French) |
src/lib/gateway.ts |
WebSocket protocol helpers and message types |
Data Flow
- Login — User enters gateway URL + token → stored in
localStorage - Connect —
useGatewayopens a WebSocket and authenticates with the token - Sessions — Gateway pushes session list; user selects one in the sidebar
- Messages — Messages stream in via WebSocket frames; the hook assembles partial chunks into complete messages
- Send — User input (+ optional file attachments) is sent as a JSON frame over the WebSocket
🛠 Tech Stack
- React 19
- Vite 7
- Tailwind CSS v4
- Radix UI primitives
- highlight.js via rehype-highlight
- Lucide React icons
- react-markdown with GFM
📄 License
MIT © Nicolas Varrot
📋 Changelog
See CHANGELOG.md for a detailed history of changes.
🤝 Contributing
Contributions are welcome! See CONTRIBUTING.md for guidelines.
🔗 Links
- OpenClaw — the AI agent platform PinchChat connects to
