<!--
hoody-display Subskill (http)
Auto-generated by Hoody Skills Generator
Generated: 2026-06-20T00:45:51.243Z
Model: mimo-v2.5-pro + fixer:mimo-v2.5-pro
Mode: http


Tokens: 7449

DO NOT EDIT MANUALLY - Changes will be overwritten on next generation
-->

# hoody-display Subskill Documentation

## Overview

**What is hoody-display?**  
hoody-display provides fully embeddable, multiplayer desktop environments accessible via URL. It allows you to control GUI applications, capture screen content, manage windows, and simulate user input programmatically. This service makes remote desktops as accessible as web pages.



**How it fits Hoody philosophy:**  
hoody-display embodies Hoody's "desktop as a service" approach. Each display instance runs in its own container with a unique URL, enabling secure, isolated access. It supports multiple concurrent users interacting with the same desktop, fulfilling the multiplayer vision.

---

## Common Workflows

### Health Check & Basic Monitoring

```
# Check service health (always HTTP 200 when up)
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/health"

# Get comprehensive display information
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/info"
```

### Screenshot & Thumbnail Management

```
# Capture fresh screenshot (returns image)
curl -s -o screenshot.png "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/screenshot"

# Get screenshot metadata without image data
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/screenshot/info"

# Get latest screenshot
curl -s -o latest.png "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/screenshot/last"

# Get specific screenshot by timestamp
curl -s -o "timestamp-1234567890.png" "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/screenshot/1234567890"

# Get thumbnail (320x180 scaled)
curl -s -o thumbnail.png "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/thumbnail"

# List all available screenshots
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/screenshots"
```

### Clipboard Operations

```
# Get current clipboard content
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/clipboard"

# Set clipboard content
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/clipboard" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Pasted text content"
  }'
```

### Window Management

```
# List all windows
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/windows"

# Get active window
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/window/active"

# Get window properties
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/window/{WINDOW_ID}/properties"

# Focus a window
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/window/focus" \
  -H "Content-Type: application/json" \
  -d '{
    "windowId": "window-123"
  }'

# Move a window
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/window/move" \
  -H "Content-Type: application/json" \
  -d '{
    "windowId": "window-123",
    "x": 100,
    "y": 200
  }'

# Close a window
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/window/close" \
  -H "Content-Type: application/json" \
  -d '{
    "windowId": "window-123"
  }'
```

### Mouse Control

```
# Move mouse to absolute coordinates
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/mouse/move" \
  -H "Content-Type: application/json" \
  -d '{
    "x": 500,
    "y": 300
  }'

# Move mouse relative to current position
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/mouse/move-relative" \
  -H "Content-Type: application/json" \
  -d '{
    "x": 50,
    "y": -20
  }'

# Get current mouse location
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/mouse/location"

# Click at current position
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/mouse/click"

# Double-click
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/mouse/double-click"

# Scroll (up or down direction)
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/mouse/scroll" \
  -H "Content-Type: application/json" \
  -d '{
    "direction": "down"
  }'
```

### Keyboard Input

```
# Type text
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/keyboard/type" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello World"
  }'

# Press key combination
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/keyboard/key" \
  -H "Content-Type: application/json" \
  -d '{
    "keys": ["ctrl+c"]
  }'

# Hold down a key
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/keyboard/key-down" \
  -H "Content-Type: application/json" \
  -d '{
    "key": "Shift_L"
  }'

# Release a key
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/keyboard/key-up" \
  -H "Content-Type: application/json" \
  -d '{
    "key": "Shift_L"
  }'
```

---

## Advanced Operations

### Screenshot-Based Automation Pattern

1. **Capture initial state:**
   ```
   curl -s -o state1.png "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/screenshot"
   ```

2. **Perform actions and verify:**
   ```
   # Click at specific coordinates
   curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/input/click-at" \
     -H "Content-Type: application/json" \
     -d '{"x": 250, "y": 180}'
   
   # Wait for action to complete
   curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/input/wait" \
     -H "Content-Type: application/json" \
     -d '{"milliseconds": 1000}'
   
   # Capture new state
   curl -s -o state2.png "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/screenshot/last"
   ```

### Multi-Step Input Batch

```
# Execute multiple actions in sequence
curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/input/batch" \
  -H "Content-Type: application/json" \
  -d '[
    {"action": "click", "x": 100, "y": 200},
    {"action": "type", "text": "username"},
    {"action": "key", "keys": ["Tab"]},
    {"action": "type", "text": "password"},
    {"action": "key", "keys": ["Return"]}
  ]'
```

### Error Recovery Pattern

```
# Attempt operation with verification
while true; do
  # Get current window list
  WINDOWS=$(curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/windows")
  
  # Check if target window exists
  if echo "$WINDOWS" | grep -q "Target App"; then
    # Focus and interact with window
    curl -s -X POST "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/window/focus" \
      -H "Content-Type: application/json" \
      -d '{"windowId": "target-window-id"}'
    break
  fi
  
  # Wait and retry
  sleep 2
done
```

### Performance Optimization

```
# Use thumbnails for monitoring (faster, smaller)
while monitoring; do
  # Capture thumbnail (320x180, faster transfer)
  curl -s -o "monitor-$(date +%s).jpg" "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/thumbnail/last"
  sleep 5
done
```

### Display Geometry Awareness

```
# Get display dimensions
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/input/display-geometry"

# Get window geometry
curl -s "https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com/api/v1/display/window/{WINDOW_ID}/geometry"
```

---

## Quick Reference

### Most Common Endpoints

| Operation | Endpoint | Method |
|-----------|----------|--------|
| Health Check | `/api/v1/display/health` | GET |
| Capture Screenshot | `/api/v1/display/screenshot` | GET |
| Get Latest Screenshot | `/api/v1/display/screenshot/last` | GET |
| List Windows | `/api/v1/display/windows` | GET |
| Move Mouse | `/api/v1/display/mouse/move` | POST |
| Click | `/api/v1/display/mouse/click` | POST |
| Type Text | `/api/v1/display/keyboard/type` | POST |
| Get Clipboard | `/api/v1/display/clipboard` | GET |
| Set Clipboard | `/api/v1/display/clipboard` | POST |
| Get Window Properties | `/api/v1/display/window/{windowId}/properties` | GET |

### Essential Parameters

- **Mouse positioning:** `x`, `y` (integers)
- **Keyboard input:** `text` (string), `keys` (array of strings)
- **Clipboard:** `text` (string)
- **Window operations:** `windowId` (string)
- **Scroll direction:** `"up"` or `"down"`

### Typical Response Formats

**Health Check:**
```
{
  "status": "healthy",
  "timestamp": 1234567890
}
```

**Window List:**
```
[
  {
    "id": "window-123",
    "name": "Terminal",
    "focused": true
  }
]
```

**Screenshot Info:**
```
{
  "timestamp": 1234567890,
  "width": 1920,
  "height": 1080,
  "format": "png"
}
```

**Mouse Location:**
```
{
  "x": 500,
  "y": 300
}
```

### Base URL Pattern

```
https://{PROJECT_ID}-{CONTAINER_ID}-display-{SERVICE_ID}.{NODE}.containers.hoody.com
```

### Critical Notes

1. All endpoints use `/api/v1/display/` prefix
2. Always use `-s` flag with curl to suppress progress output
3. Never invent endpoints beyond the provided inventory
4. For container creation/discovery, refer to core SKILL.md
5. Throttle requests to avoid overwhelming the display server