PinchChat

PinchChat

[![CI](https://github.com/MarlBurroW/pinchchat/actions/workflows/ci.yml/badge.svg)](https://github.com/MarlBurroW/pinchchat/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org/) [![Docker](https://img.shields.io/badge/docker-ghcr.io-blue)](https://github.com/MarlBurroW/pinchchat/pkgs/container/pinchchat) [![Website](https://img.shields.io/badge/website-GitHub%20Pages-blueviolet)](https://marlburrow.github.io/pinchchat/) **A sleek, dark-themed webchat UI for [OpenClaw](https://github.com/openclaw/openclaw) โ€” monitor sessions, stream responses, and inspect tool calls in real-time.** > ๐Ÿ–ผ๏ธ *Screenshot coming soon โ€” [contributions welcome](https://github.com/MarlBurroW/pinchchat/issues)!* ## โœจ 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) ```bash 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: ```bash 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. ```bash 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: ```env VITE_GATEWAY_WS_URL=ws://localhost:18789 VITE_LOCALE=en # or "fr" for French UI ``` ### Production build ```bash 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://: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 ```mermaid graph TD subgraph Browser["๐ŸŒ PinchChat (Browser)"] Login["LoginScreen
credentials"] App["App.tsx
router"] UI["Chat + Sidebar
main UI"] Hook["useGateway
WebSocket state machine
auth ยท sessions ยท messages"] Login --> App --> UI App & UI --> Hook end Hook <-->|"WebSocket (JSON frames)"| Gateway["๐Ÿ”Œ OpenClaw Gateway
ws://host:18789"] Gateway <-->|API| LLM["๐Ÿค– LLM Provider
Anthropic, OpenAI, etc."] ``` ### 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 1. **Login** โ€” User enters gateway URL + token โ†’ stored in `localStorage` 2. **Connect** โ€” `useGateway` opens a WebSocket and authenticates with the token 3. **Sessions** โ€” Gateway pushes session list; user selects one in the sidebar 4. **Messages** โ€” Messages stream in via WebSocket frames; the hook assembles partial chunks into complete messages 5. **Send** โ€” User input (+ optional file attachments) is sent as a JSON frame over the WebSocket ## ๐Ÿ›  Tech Stack - [React](https://react.dev/) 19 - [Vite](https://vite.dev/) 7 - [Tailwind CSS](https://tailwindcss.com/) v4 - [Radix UI](https://www.radix-ui.com/) primitives - [highlight.js](https://highlightjs.org/) via rehype-highlight - [Lucide React](https://lucide.dev/) icons - [react-markdown](https://github.com/remarkjs/react-markdown) with GFM ## ๐Ÿ“„ License [MIT](LICENSE) ยฉ Nicolas Varrot ## ๐Ÿ“‹ Changelog See [CHANGELOG.md](CHANGELOG.md) for a detailed history of changes. ## ๐Ÿค Contributing Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. ## ๐Ÿ”— Links - [OpenClaw](https://github.com/openclaw/openclaw) โ€” the AI agent platform PinchChat connects to