SKILL.md
ClawdBot UI Development
Complete guide for building the ClawdBot Control Panel - a PyQt6 desktop app for managing ClawdBot gateway, plugins, and settings.
Tech Stack
- UI Framework: PyQt6
- Package Manager: UV (uv add, uv run)
- Python: 3.11+
- Platforms: Windows + macOS
Architecture
clawdbot-ui/
├── pyproject.toml
├── main.py # Entry point
├── src/
│ ├── app.py # Application setup
│ ├── ui/
│ │ ├── window.py # Main window (all pages in one file)
│ │ ├── terminal.py # Log viewer widget
│ │ ├── command_dialog.py # Modal command runner
│ │ └── styles.py # Dark theme CSS
│ ├── core/
│ │ ├── process.py # Background process runner
│ │ └── version.py # Version checking (GitHub API)
│ └── utils/
│ └── platform.py # Platform detection
└── .agent/skills/ # 9 skills
Navigation Structure
4 Pages (tabs in sidebar):
- Dashboard - Gateway control, version info, logs
- ClawdHub - Plugin manager + Skills Management
- Terminal - Run any command with admin privileges
- Settings - Version display, maintenance operations
Sidebar Features:
- Brand section (logo, title, version)
- Quick Links (Skills, Docs) - open external URLs
- Status panel - gateway status + quick stop button
Dashboard Page
Main landing page for ClawdBot - manages gateway lifecycle and displays real-time logs.
Features
Gateway Control Card
Service Status Indicator
- Green "● Running" when gateway active
- Gray "● Stopped" when inactive
- Yellow "● Not Installed" when ClawdBot missing
Control Buttons (all 110px width)
- Start Service: Starts gateway (visible when stopped)
- Stop Service: Stops gateway (visible when running)
- Open Gateway: Opens
http://127.0.0.1:18789(visible when running) - Open UI: Gets dashboard URL with token via
clawdbot dashboard, opens in browser (visible when running)
Installation Management
Install ClawdBot (green button)
- Platform-specific install command
- Progress shown in terminal
Update Available
- Shows when newer version detected
- Format: "Update to vX.X.X"
Uninstall (red outline button)
- Runs
clawdbot uninstall --all --yes - Opens in CommandDialog
Service Logs Terminal
- Real-time streaming from gateway process
- ANSI color support
- Auto-scroll (pauseable)
- Copy Logs button (100px × 28px)
- Log dividers (
━━━━━━━) after each command for clarity
Key Methods:
_on_start() # Start gateway
_on_stop() # Stop gateway
_on_open_gateway() # Open http://127.0.0.1:18789
_on_open_ui() # Get token, open dashboard
_on_install() # Install ClawdBot
_on_update() # Update ClawdBot
_copy_logs() # Copy terminal to clipboard
ClawdHub Page
Plugin and skills manager for ClawdBot.
Features
ClawdHub CLI Management
Installation Status (auto-detected)
- "Checking..." on load
- "Installed (v1.2.3)" or "Not installed"
Action Buttons (fixed widths)
[Install](green) →npm install -g clawdhub undici[Update](white) →npm update -g clawdhub undici[Uninstall](red) →npm uninstall -g clawdhub
Skills Management Card
Skill Count Display: "X skills installed"
- Auto-updates after successful installation
- Counts folders in
{user_home}/clawd/skills/
Open Skills Folder Button (140px)
- Opens skills folder in File Explorer/Finder
- Creates folder if doesn't exist
- Path:
C:\Users\{username}\clawd\skills\(Windows)
Install Skills Card
Input Field
- Placeholder:
spotify or self-improving-agent - Auto-prepends
clawdhub install - Press Enter or click Install (80px × 36px)
Example Skills:
spotify
youtube
self-improving-agent
ClawdHub Logs
- Separate terminal from Dashboard
- Real-time output
- Copy Logs button
- Min height: 150px
Key Methods:
_on_install_clawdhub() # Install ClawdHub
_on_update_clawdhub() # Update ClawdHub
_on_uninstall_clawdhub() # Remove ClawdHub
_check_clawdhub() # Detect install status
_on_run_clawdhub_cmd() # Install skill (auto-prepends clawdhub install)
_on_open_skills_folder() # Open skills folder
Terminal Page
Run any command with admin privileges - general-purpose command execution.
Features
Run Command Card
Input Field
- Placeholder:
clawdbot configure or npm --version - No auto-prefix - runs exactly what you type
- Press Enter or click Execute (90px × 36px)
Admin Execution (Windows)
- Uses PowerShell with
Start-Process -Verb RunAs - macOS: Uses
osascriptfor admin privileges - Linux: Uses
sudo -S
Terminal Output
Buttons:
- Copy Logs (100px × 28px) - copy all output
- Clear Logs (100px × 28px) - clear terminal
Output Features:
- Real-time streaming
- Auto-scroll to bottom
- Command echo:
$ clawdbot configure - Completion:
✓ Command completed successfullyor✗ Command failed - Separator:
━━━━━━after each command
Key Methods:
_on_execute_terminal_cmd() # Execute command with admin
_on_terminal_cmd_finished() # Handle completion
_copy_terminal_logs() # Copy output to clipboard
_clear_terminal_logs() # Clear terminal
Settings Page
Configuration and maintenance operations.
Features
About ClawdBot Card
Version Information (auto-updated)
Version: v2026.1.24-3
Latest: v2026.1.24-3
Gateway: Running on port 18789
Maintenance Card
Action Buttons
- Check for Updates (auto-width) →
clawdbot update - Reset (80px) →
clawdbot reset --yes - Uninstall (100px, red) →
clawdbot uninstall --all --yes
All open in CommandDialog for progress display.
Key Methods:
_on_update() # Update ClawdBot
_on_reset() # Reset workspace/config
_on_uninstall() # Remove ClawdBot
Styling System
File: src/ui/styles.py
Button Styles
All buttons use fixed widths for consistency:
# actionBtn - White with black text
padding: 6px 14px
font-size: 12px
font-weight: 500
# dangerBtn - Red outline (matches actionBtn size)
background: transparent
color: #f85149
border: 1px solid #f85149
padding: 6px 14px
font-size: 12px
# primaryBtn - Cyan/teal
background: #00bfa5
color: #000000
# successBtn - Green
background: #22c55e
color: #000000
Dark Theme Colors
Background: #0a0f1a
Sidebar: #0f1419
Cards: #1a2535
Borders: #2a3545
Text: #ffffff / #b0b8c4 / #6b7280
Success: #22c55e
Error: #ef4444
Warning: #f59e0b
Platform-Specific Commands
Windows
["powershell", "-Command", "clawdbot gateway"]
macOS/Linux
["clawdbot", "gateway"]
Platform detection via is_windows() utility.
Key Patterns
Thread Safety
# ✅ Thread-safe
signal.emit(data)
# ❌ NOT thread-safe from worker thread
widget.setText(x)
Process Management
# Store runner as class variable
self.gateway_runner = ProcessRunner(cmd)
self.gateway_runner.output.connect(self.terminal.log)
self.gateway_runner.start()
Graceful Shutdown
def closeEvent(self, event):
if self.gateway_runner:
self.gateway_runner.stop()
self.gateway_runner.wait(3000)
event.accept()
Log Dividers
After each command completion:
self.terminal.log("━" * 60)
Makes logs more readable when multiple commands run.
File Organization
Why window.py is NOT split:
- Heavy state sharing across pages (
self.terminal,self.version_status, etc.) - Dashboard actions update Settings display
- Clear organization with
create*_page()methods - Splitting would require complex SharedState class
What IS separate:
terminal.py- Reusable widgetcommand_dialog.py- Reusable modalstyles.py- Centralized styling
Development Tips
- Button sizing: Always use
setFixedWidth()for uniform appearance - Visibility: Toggle with
setVisible()based on state - Threading: Store ProcessRunner as class variable to prevent crashes
- Updates: Call
checkversion()after all install/update/uninstall ops - Logs: Add dividers after command completion for readability