- “AI assistant dashboard”
- “OpenClaw browser control”
For OpenClaw v2026.2 | This article assumes you have completed basic installation and want to manage OpenClaw via the browser.
TL;DR: Access Web UI at http://127.0.0.1:18789. It includes Chat (conversation), Sessions, Config, Nodes, Logs, and Skills pages. Canvas is an Agent-driven visual workspace for creating charts, dashboards, and interactive interfaces. Remote access: Tailscale Serve or SSH tunnel. Mobile Canvas is available in iOS/Android apps.
Web Control UI
Accessing Web UI
After starting the Gateway, open your browser and visit:
http://127.0.0.1:18789
Interface Overview
flowchart LR
subgraph WebUI["Web Control UI"]
Chat[Chat]
Sessions[Sessions]
Config[Config]
Nodes[Nodes]
Logs[Logs]
Skills[Skills]
end
subgraph Features["Features"]
F1[Real-time Chat]
F2[Session Management]
F3[Config Editing]
F4[Node Control]
F5[Log Viewing]
F6[Skill Management]
end
Chat --> F1
Sessions --> F2
Config --> F3
Nodes --> F4
Logs --> F5
Skills --> F6
Page Features
Chat
| Feature | Description |
|---|---|
| Message Input | Supports text, Markdown, and code blocks |
| Message History | Displays full conversation history |
| Tool Calls | Shows tool invocation process and results |
| Thinking Process | Optional display of Agent thinking process |
| Token Statistics | Shows token usage |
| Model Switching | Quick switch between models |
Sessions
| Feature | Description |
|---|---|
| Session List | View all active sessions |
| Session Details | View status and config of a single session |
| Session Actions | Reset, delete, or export sessions |
| Session Switching | Switch between different sessions |
| Session Isolation | View sessions by channel or user |
Config
| Feature | Description |
|---|---|
| Config Editing | Edit config files online |
| Config Validation | Real-time config syntax validation |
| Config Hot Reload | Takes effect without restart |
| Config Export | Export config backup |
| Config History | View config change history |
Nodes
| Feature | Description |
|---|---|
| Node List | View connected device nodes |
| Node Status | Shows online status and permissions |
| Node Control | Enable/disable node features |
| Node Pairing | Pair new nodes |
Logs
| Feature | Description |
|---|---|
| Real-time Logs | Stream system logs |
| Log Filtering | Filter by level or module |
| Log Search | Keyword search in logs |
| Log Export | Download log files |
Skills
| Feature | Description |
|---|---|
| Skill List | View installed skills |
| Skill Installation | Install skills from ClawHub |
| Skill Config | Configure skill parameters |
| Skill Toggle | Enable/disable skills |
Configuring Web UI
{
"web": {
"enabled": true,
"port": 18789,
"bind": "loopback",
"auth": {
"mode": "password",
"password": "your-secure-password"
},
"theme": "dark"
}
}
| Config Option | Description | Default |
|---|---|---|
enabled |
Enable Web UI | true |
port |
Listen port | 18789 |
bind |
Bind address | loopback |
auth.mode |
Auth mode | none |
auth.password |
Access password | - |
theme |
Theme | dark |
Remote Access
Option 1: Tailscale
{
"gateway": {
"tailscale": {
"mode": "serve"
}
}
}
Access via Tailscale network:
https://your-tailnet-name.ts.net
Option 2: SSH Tunnel
# Create SSH tunnel on local machine
ssh -L 18789:localhost:18789 user@remote-server
# Then access
http://localhost:18789
Option 3: Reverse Proxy
Using Caddy or Nginx:
Caddyfile:
your-domain.com {
reverse_proxy localhost:18789
}
Canvas Visual Workspace
What is Canvas?
Canvas is an Agent-driven visual workspace. The Agent can:
- Create dynamic charts
- Build interactive interfaces
- Display real-time data
- Generate dashboards
- Embed external content
Canvas Architecture
flowchart TB
subgraph Agent["Agent"]
PROMPT[Analyze Request]
GEN[Generate A2UI]
EXEC[Execute Actions]
end
subgraph Canvas["Canvas Runtime"]
RENDER[Render Engine]
STATE[State Management]
EVENT[Event Handling]
end
subgraph UI["User Interface"]
DISPLAY[Display Canvas]
INTERACT[User Interaction]
end
Agent --> Canvas
PROMPT --> GEN
GEN --> RENDER
RENDER --> DISPLAY
DISPLAY --> INTERACT
INTERACT --> EVENT
EVENT --> EXEC
Basic Usage
Using Canvas in Chat
User: Create a simple todo app
Agent: I'll create a todo Canvas app...
[Generates Canvas components]
Canvas Commands
| Command | Description |
|---|---|
/canvas create |
Create new Canvas |
/canvas show |
Show current Canvas |
/canvas clear |
Clear Canvas |
/canvas export |
Export Canvas |
Canvas Components
Text Component
canvas.text({
content: "Hello, World!",
style: {
fontSize: "24px",
color: "#333",
fontWeight: "bold"
}
})
Button Component
canvas.button({
label: "Click Me",
onClick: () => {
console.log("Button clicked!")
},
style: {
background: "#3b82f6",
color: "white"
}
})
List Component
canvas.list({
items: ["Item 1", "Item 2", "Item 3"],
onSelect: (item) => {
console.log(`Selected: ${item}`)
}
})
Chart Component
canvas.chart({
type: "bar",
data: {
labels: ["Jan", "Feb", "Mar"],
datasets: [{
label: "Revenue",
data: [100, 200, 150]
}]
}
})
Form Component
canvas.form({
fields: [
{ name: "username", type: "text", label: "Username" },
{ name: "email", type: "email", label: "Email" },
{ name: "submit", type: "submit", label: "Submit" }
],
onSubmit: (data) => {
console.log("Form submitted:", data)
}
})
Practical Examples
Example 1: Data Dashboard
// Agent-generated Canvas code
canvas.render(`
<Dashboard>
<Header title="Sales Dashboard" />
<Row>
<Card title="Total Revenue" value="$125,430" trend="+12%" />
<Card title="Active Users" value="3,245" trend="+5%" />
<Card title="Conversion Rate" value="4.2%" trend="-1%" />
</Row>
<Row>
<Chart type="line" data={revenueData} title="Revenue Trend" />
<Chart type="bar" data={usersData} title="User Growth" />
</Row>
</Dashboard>
`)
Example 2: Interactive Calculator
canvas.render(`
<Calculator>
<Display value={display} />
<Keypad>
<Button onClick={() => input('7')}>7</Button>
<Button onClick={() => input('8')}>8</Button>
<Button onClick={() => input('9')}>9</Button>
<Button onClick={() => input('/')}>/</Button>
// ... more buttons
</Keypad>
</Calculator>
`)
const state = { display: '0' }
function input(value) {
state.display = calculate(state.display, value)
canvas.update()
}
Example 3: Real-time Monitor
canvas.render(`
<Monitor>
<Header title="System Monitor" />
<Metrics>
<Metric
label="CPU Usage"
value={cpuUsage}
threshold={80}
unit="%"
/>
<Metric
label="Memory"
value={memoryUsed}
threshold={90}
unit="GB"
/>
<Metric
label="Disk I/O"
value={diskIO}
unit="MB/s"
/>
</Metrics>
<Chart type="line" data={historyData} realtime />
</Monitor>
`)
// Update data periodically
setInterval(() => {
cpuUsage = getCpuUsage()
memoryUsed = getMemoryUsed()
diskIO = getDiskIO()
canvas.update()
}, 1000)
Canvas API
canvas.render(template)
Render Canvas content.
canvas.render(`
<Container>
<Text>Hello</Text>
</Container>
`)
canvas.update()
Update Canvas state.
state.count++
canvas.update()
canvas.clear()
Clear Canvas.
canvas.clear()
canvas.snapshot()
Get Canvas snapshot.
const image = await canvas.snapshot()
canvas.eval(code)
Execute code in Canvas context.
await canvas.eval(`
document.getElementById('counter').innerText = '${count}'
`)
A2UI Component Library
Canvas uses the A2UI (Agent-to-UI) component library:
Layout Components
| Component | Description |
|---|---|
<Container> |
Container |
<Row> |
Horizontal layout |
<Column> |
Vertical layout |
<Grid> |
Grid layout |
<Card> |
Card container |
Data Display
| Component | Description |
|---|---|
<Text> |
Text |
<Heading> |
Heading |
<List> |
List |
<Table> |
Table |
<Chart> |
Chart |
Interactive Components
| Component | Description |
|---|---|
<Button> |
Button |
<Input> |
Input field |
<Select> |
Dropdown select |
<Checkbox> |
Checkbox |
<Form> |
Form |
Canvas and Agent Collaboration
Agent Creates Canvas
User: Help me create a project progress tracking panel
Agent: Sure, I'll create a project progress tracking Canvas...
The Agent will:
- Analyze requirements
- Design layout
- Generate Canvas code
- Render the interface
Canvas Triggers Agent
When users interact with Canvas, they can trigger Agent actions:
canvas.button({
label: "Generate Report",
onClick: async () => {
await agent.send("Generate monthly report")
}
})
Using Canvas on Different Devices
macOS
Canvas displays as a standalone window:
openclaw canvas show
iOS
Canvas is integrated in the iOS Node App:
- Open OpenClaw iOS App
- Switch to Canvas tab
Android
Canvas is integrated in the Android Node App:
- Open OpenClaw Android App
- Switch to Canvas tab
Web
Canvas displays in Web UI:
- Open http://localhost:18789
- Click Canvas tab
Configuring Canvas
{
"canvas": {
"enabled": true,
"theme": "dark",
"autoUpdate": true,
"updateInterval": 1000,
"maxComponents": 100,
"persistState": true
}
}
| Config Option | Description | Default |
|---|---|---|
enabled |
Enable Canvas | true |
theme |
Theme | dark |
autoUpdate |
Auto-update state | true |
updateInterval |
Update interval (ms) | 1000 |
maxComponents |
Max component count | 100 |
persistState |
Persist state | true |
Summary
Web Control UI and Canvas make OpenClaw more than a chat assistant—they turn it into a full interaction platform:
- Web UI: Browser control panel for managing everything
- Canvas: Agent-driven visual workspace
- A2UI: Rich component library for rapid interface building
- Cross-device: Unified experience on macOS, iOS, Android, and Web
With these features, you can have the Agent create dashboards, management interfaces, and interactive tools, greatly expanding the AI assistant’s application scenarios.
Key Takeaways:
- Mastered Web Control UI features and usage
- Learned Canvas basics and components
- Understood the A2UI component library
- Learned how Canvas collaborates with the Agent
- Mastered Canvas usage across multiple devices
Changelog:
- 2026-02-26: Initial release, based on OpenClaw v2026.2
Series Navigation:
- ← Previous: Agent Personality Customization
- → Next: Multi-Agent Routing and Session Isolation