Chat Interface¶
The chat interface is Skippy's primary interaction method - a floating, always-on-top window for instant AI access.
Window Design¶
Layout¶
┌─────────────────────────────────────────┐
│ 🍺 Skippy ⚡ ● ━ ✕ │ ← Header
│ the Magnificent │
├─────────────────────────────────────────┤
│ │
│ You: What's the weather? │ ← Chat Display
│ │
│ 🍺 Skippy: Let me check the weather │
│ for you... │
│ │
├─────────────────────────────────────────┤
│ Session: main | Model: claude-4 | 2.5k │ ← Status Bar
├─────────────────────────────────────────┤
│ Ask Skippy anything... 🎤 ➤ │ ← Input Area
└─────────────────────────────────────────┘
Header Elements¶
| Element | Description |
|---|---|
| 🍺 Avatar | Skippy's beer emoji (customizable) |
| Title | "Skippy the Magnificent" |
| 🔊/🔇 | TTS toggle button |
| ⚡ | Streaming indicator (green=active) |
| ● | Connection status dot |
| ━ | Minimize to tray |
| ✕ | Quit application |
Chat Display¶
Message Types¶
Your Messages
Skippy's Responses
System Messages
WhatsApp Messages
Thinking Display¶
When enabled, Skippy shows its reasoning process:
Thinking Block
🧠 Thinking
The user is asking about weather. I should use the web_search tool to get current conditions for their location...
Toggle via:
- Tray menu → 🧠 Show Thinking
- Or modify
show_thinkingin config.json
Input Methods¶
Text Input¶
- Click the input field
- Type your message
- Press Enter or click ➤
Auto-Focus
When you activate the window (click it or use tray), the input field automatically focuses.
Image Input¶
- Copy an image:
- Screenshot (Win+Shift+S)
- Right-click image → Copy
- Any image in clipboard
- Focus Skippy's input field
- Press Ctrl+V
- Image preview appears
- Type optional question
- Press Enter
Preview Display:
Images are automatically:
- Saved to
temp/latest_image.png - Scaled down if >4MB (for vision model limits)
- Referenced in the message for AI analysis
Voice Input¶
See Voice Input for detailed voice instructions.
Streaming Responses¶
How It Works¶
When using WebSocket streaming:
- You send a message
- Connection to OpenClaw gateway
- Response streams in real-time (word by word)
- Cursor (▌) shows active streaming
- Final response displayed when complete
Status Updates During Response¶
| Status | Meaning |
|---|---|
| 🧠 Thinking... | Processing your request |
| 🔧 web_search... | Using a tool |
| 🔧 exec... | Running a command |
| Ready | Response complete |
Conversation History¶
Session Persistence¶
Skippy maintains conversation history via OpenClaw sessions:
- Session ID: Configured in
config.json(default: "skippy-desktop") - History Location:
~/.openclaw/agents/main/sessions/<session_id>.jsonl
Loading History¶
Access via tray menu → 📜 Load Recent History
This displays:
- Current session information
- Model being used
- Token count
- Last activity channel
Metadata Display¶
After each response, the status bar shows:
| Metric | Description |
|---|---|
| Time | Response duration |
| Model | AI model used |
| Tokens | Total tokens (k = thousands) |
| Cost | Estimated cost |
Keyboard Shortcuts¶
| Shortcut | Action |
|---|---|
| Enter | Send message |
| Ctrl+V | Paste image |
| Escape | Minimize to tray |
Window Behavior¶
Always On Top¶
Skippy stays above other windows for quick access. To temporarily hide:
- Click ━ to minimize to tray
- Double-click tray icon to restore
Dragging¶
Click and drag anywhere on the window (except input field) to reposition.
Default Position¶
On startup, Skippy positions itself in the bottom-right corner of your primary monitor, 20 pixels from the edge.
Connection Modes¶
WebSocket Streaming (Preferred)¶
- Green dot and ⚡ indicator
- Real-time streaming responses
- Lower latency
CLI Fallback¶
- Orange dot
- Uses
openclaw agentcommand - Full response appears at once
- Automatic fallback if WebSocket fails
Check connection status:
Customization¶
Window Size¶
Fixed at 450x450 pixels for consistent display.
Colors¶
Current theme (dark mode):
- Background:
#1a1a2e→#16213egradient - Text:
#e0e0e0 - Accent:
#FFD700(gold) - Your messages:
#4FC3F7(light blue) - Skippy:
#FFD700(gold) - WhatsApp:
#25D366(green)
Modify in apply_styles() method in skippy.py.