A desktop client for OpenClaw AI assistant. Built with Electron, React, and TypeScript.
- Chat Interface: Clean, modern chat UI with message bubbles and streaming support
- Agent Selection: Switch between different AI agents
- Thinking Mode: Toggle extended thinking for complex tasks
- Sessions Management: Create, view, and manage chat sessions
- Skills Viewer: Browse available agent skills and their triggers
- Cron Jobs: View and manage scheduled tasks
- Dark/Light Theme: Full theme support with system preference detection
- Cross-Platform: Windows and macOS support
Main chat interface with sidebar and skills panel
# Clone the repository
git clone git@github.com:jakeledwards/openclaw-widget.git
cd openclaw-widget
# Install dependencies
npm install
# Run in development mode
npm run devThe app connects to your local OpenClaw instance. Default configuration:
- Server URL:
wss://your-server.localorws://localhost:8080
- Make sure your OpenClaw server is running on your local network.
- In the app, open Settings (gear icon).
- Set Server URL to your local WebSocket endpoint (for example:
ws://192.168.1.50:8080). - If your server requires auth, set Authentication Mode and enter your Gateway Token/Password.
- Click Save & Connect.
You must be connected to Tailscale before the app can reach your OpenClaw server.
- Connect your computer to Tailscale.
- Get your server's Tailscale hostname or IP.
- In the app, open Settings (gear icon).
- Set Server URL to your Tailscale endpoint (for example:
wss://your-server.tailnet-123.ts.net). - If your server requires auth, set Authentication Mode and enter your Gateway Token/Password.
- Click Save & Connect.
You can configure the connection details directly in the application by clicking the Settings (Gear) icon in the top bar.
Available Options:
- Server URL: The WebSocket URL of your OpenClaw instance.
- Validation: Must start with
ws://(insecure) orwss://(secure). - Example:
wss://your-server.localorws://localhost:8080
- Validation: Must start with
- Authentication Mode: Toggle between Token and Password authentication.
- Gateway Token/Password: The credential for your OpenClaw instance (if enabled).
Settings are automatically persisted between sessions. If you change the URL or credentials, click Save & Connect to apply the changes and attempt a reconnection.
ClawControl supports two authentication modes, matching your server's gateway.auth.mode setting:
| Mode | Server Config | Auth Payload |
|---|---|---|
| Token | gateway.auth.mode = "token" |
{ token: "your-token" } |
| Password | gateway.auth.mode = "password" |
{ password: "your-password" } |
Select the mode that matches your OpenClaw server configuration.
When connecting to a server with a self-signed or untrusted SSL certificate, you may encounter a certificate error.
To resolve:
- ClawControl will detect the certificate error and show a modal
- Click "Open URL to Accept Certificate" to open the HTTPS URL in your browser
- Accept the browser's certificate warning (e.g., "Proceed to site" or "Accept the risk")
- Close the browser tab and retry the connection in ClawControl
You can change this in the app settings or by modifying src/store/index.ts.
# Start development server with hot reload
npm run dev
# Run type checking
npm run typecheck
# Run tests
npm run test
# Run tests once
npm run test:runnpm run build:winOutput: release/ClawControl Setup.exe and release/ClawControl Portable.exe
npm run build:macOutput: release/ClawControl.dmg
Building Windows packages from Linux/WSL requires Wine. For best results:
- Build Windows packages on Windows
- Build macOS packages on macOS
clawcontrol/
├── electron/ # Electron main process
│ ├── main.ts # Main process entry
│ └── preload.ts # Preload script (IPC bridge)
├── src/
│ ├── components/ # React components
│ │ ├── ChatArea.tsx
│ │ ├── InputArea.tsx
│ │ ├── RightPanel.tsx
│ │ ├── Sidebar.tsx
│ │ ├── TopBar.tsx
│ │ ├── SettingsModal.tsx
│ │ ├── CertErrorModal.tsx
│ │ ├── SkillDetailView.tsx
│ │ └── CronJobDetailView.tsx
│ ├── lib/
│ │ └── openclaw-client.ts # WebSocket client
│ ├── store/
│ │ └── index.ts # Zustand state management
│ ├── styles/
│ │ └── index.css # Main stylesheet
│ ├── App.tsx
│ └── main.tsx
├── build/ # App icons and build assets
└── scripts/ # Utility scripts
ClawControl communicates with OpenClaw using a custom frame-based protocol (v3) over WebSocket. The protocol uses three frame types:
Request Frame - Client to server RPC calls:
{
type: 'req',
id: '1',
method: 'chat.send',
params: { sessionKey: 'session-123', message: 'Hello!' }
}Response Frame - Server responses to requests:
{
type: 'res',
id: '1',
ok: true,
payload: { /* result data */ }
}Event Frame - Server-pushed events (streaming, presence, etc.):
{
type: 'event',
event: 'chat',
payload: { state: 'delta', message: { content: '...' } }
}On connect, the server sends a connect.challenge event. The client responds with:
{
type: 'req',
id: '1',
method: 'connect',
params: {
minProtocol: 3,
maxProtocol: 3,
role: 'operator',
client: { id: 'gateway-client', displayName: 'ClawControl', version: '1.0.0' },
auth: { token: 'your-token' } // or { password: 'your-password' }
}
}Sessions
sessions.list- List all sessions (supportsincludeDerivedTitles,includeLastMessage,limit)sessions.delete- Delete a session by keysessions.patch- Update session properties (e.g., label)
Chat
chat.send- Send a message (sessionKey,message,thinking)chat.history- Get messages for a session
Agents
agents.list- List available agents
Skills
skills.status- List skills with full metadata (enabled state, requirements, install options)skills.update- Enable/disable a skillskills.install- Install a skill
Cron Jobs
cron.list- List scheduled jobscron.get- Get full cron job detailscron.update- Update job status (active/paused)
Chat responses stream via event frames:
chatevent withstate: 'delta'- Partial content chunkschatevent withstate: 'final'- Complete messageagentevent withstream: 'assistant'- Alternative streaming format
- Electron - Desktop app framework
- React 18 - UI framework
- TypeScript - Type safety
- Vite - Build tool
- Zustand - State management
- Vitest - Testing framework
MIT



