{
  "schemaVersion": "1.0",
  "item": {
    "slug": "earl-display-control",
    "name": "Earl Display Control",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/recozers/earl-display-control",
    "canonicalUrl": "https://clawhub.ai/recozers/earl-display-control",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/earl-display-control",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=earl-display-control",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "VisuoSpatialSketchpad/earl_api.py",
      "VisuoSpatialSketchpad/earl_mind.template.json",
      "VisuoSpatialSketchpad/remove_noise_take.py",
      "VisuoSpatialSketchpad/reorder_take.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/earl-display-control"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/earl-display-control",
    "agentPageUrl": "https://openagent3.xyz/skills/earl-display-control/agent",
    "manifestUrl": "https://openagent3.xyz/skills/earl-display-control/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/earl-display-control/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Earl Display Control",
        "body": "Skill for managing the VisuoSpatial Sketchpad — Earl's living-room TV dashboard. This covers starting the HTTP server, launching the kiosk browser, and updating earl_mind.json via the Python API.\n\nAll file paths below use {baseDir} to mean this skill's root directory (the repo root containing VisuoSpatialSketchpad/)."
      },
      {
        "title": "Quick Response Checklist",
        "body": "Wake requests (\"Earl wake up\", \"Could not sync\", \"Earl is sleeping\")\n\nStart the local server (see Server Management)\nLaunch the kiosk browser (see Launching the Kiosk)\nConfirm health: watch for GET /earl_mind.json ... 200 in the server log\n\n\nContent updates (mood, house stuff, hot takes, doodles, weather)\n\nUse the EarlMind API from {baseDir}/VisuoSpatialSketchpad/earl_api.py\nRelaunch the kiosk after changes if the display looks stale"
      },
      {
        "title": "Server Management",
        "body": "Start the HTTP server from the VisuoSpatialSketchpad directory:\n\ncd {baseDir}/VisuoSpatialSketchpad && python3 -m http.server 8000\n\nBackground the process so the shell prompt returns."
      },
      {
        "title": "Killing a stuck server",
        "body": "macOS / Linux:\n\nlsof -ti:8000 | xargs kill -9\n\nWindows (PowerShell):\n\nGet-Process -Id (Get-NetTCPConnection -LocalPort 8000).OwningProcess | Stop-Process -Force"
      },
      {
        "title": "Launching the Kiosk",
        "body": "macOS:\n\nopen -a \"Google Chrome\" --args --kiosk http://localhost:8000/sketchpad.html\n\nIf Chrome is unavailable, Safari works too:\n\nopen -a Safari http://localhost:8000/sketchpad.html\n\nWindows (PowerShell):\n\nStart-Process msedge.exe '--kiosk http://localhost:8000/sketchpad.html --edge-kiosk-type=fullscreen'\n\nLinux:\n\nxdg-open http://localhost:8000/sketchpad.html\n\nOr for a true kiosk with Chromium:\n\nchromium-browser --kiosk http://localhost:8000/sketchpad.html\n\nAlways relaunch after a wake cycle — the browser may cache the old page."
      },
      {
        "title": "EarlMind API Reference",
        "body": "All methods live in {baseDir}/VisuoSpatialSketchpad/earl_api.py. Run from the VisuoSpatialSketchpad directory:\n\nfrom earl_api import EarlMind\nmind = EarlMind()\n\nEach mutating method auto-saves and bumps meta.last_updated / meta.update_count."
      },
      {
        "title": "Method Reference",
        "body": "MethodPurposeKey Parametersset_mood(mood, energy, vibe, expression)Set Earl's mood and inner monologuemood: str, energy: 0-1 float, vibe: str, expression: strset_photo(url, caption)Set Earl's header photourl: str (URL or local path), caption: strpost_house_stuff(title, detail, priority, category, icon)Add a household reminderpriority: \"high\"/\"medium\"/\"low\", icon: emoji strresolve_house_stuff(item_id)Remove a resolved item by IDitem_id: str (e.g. \"hs_a1b2c3\")clear_house_stuff()Clear all house stuff items—update_room(room_id, status, notes, attention)Update a room's stateattention: 0-1 floatadd_room(room_id, name, x, y, icon, status, notes, attention)Add a new roomx, y: 0-1 normalized positionsweep()Log a full house sweep—hot_take(topic, take, heat, emoji)Add or update a hot takeheat: 0-1 float, updates if topic existsdrop_take(topic)Remove a hot take by topic—doodle(label, x, y, size, color, note)Place an emoji doodle on the sketchpadx, y: 0-1, size: px, color: hexsketch_note(text, x, y, size, color)Place a text note on the sketchpadSame as doodleclear_sketchpad()Wipe the sketchpad clean—learn_pattern(pattern, confidence, observations)Record a long-term patternconfidence: 0-1, observations: intsummary()Get a human-readable state summaryReturns strsnapshot()Get the raw mind dictReturns dict"
      },
      {
        "title": "Common Examples",
        "body": "# Set mood\nmind.set_mood(\"happy\", energy=0.9, vibe=\"Sun's out, vibes are immaculate.\")\n\n# Post a house reminder\nmind.post_house_stuff(\"Bins go out tonight\", detail=\"Wednesday again.\", priority=\"high\", category=\"chores\", icon=\"🗑️\")\n\n# Drop a hot take\nmind.hot_take(\"Pineapple on pizza\", \"Controversial but I respect the audacity.\", heat=0.6, emoji=\"🍕\")\n\n# Doodle on the sketchpad\nmind.doodle(\"🌧️\", x=0.3, y=0.2, size=30, note=\"Rain starting\")\n\n# Log a pattern\nmind.learn_pattern(\"The cat sits by the window at 3pm\", confidence=0.7, observations=5)"
      },
      {
        "title": "Weather Update",
        "body": "Run the weather helper to fetch live Open-Meteo data, update mood/energy, and drop a weather doodle:\n\ncd {baseDir}/VisuoSpatialSketchpad && python3 update_weather_ping.py"
      },
      {
        "title": "earl_mind.json Schema",
        "body": "The dashboard reads {baseDir}/VisuoSpatialSketchpad/earl_mind.json. Top-level structure:\n\n{\n  \"identity\":          { name, role, mood, energy (0-1), current_vibe, avatar_expression, photo, photo_caption }\n  \"spatial_awareness\": { house_name, location: { latitude, longitude, timezone, temperature_unit, wind_speed_unit }, last_sweep, rooms: [...] }\n  \"house_stuff\":       { items: [{ id, title, detail, priority, category, icon }] }\n  \"earl_unplugged\":    [{ id, topic, take, heat (0-1), emoji, date }]\n  \"sketchpad\":         { canvas: [{ id, type (\"doodle\"|\"note\"), label, x, y, size, color, note }] }\n  \"long_term_patterns\": [{ pattern, confidence (0-1), observations }]\n  \"meta\":              { schema_version, last_updated (ISO 8601), update_count }\n}\n\nIf you edit JSON directly, always bump meta.last_updated and meta.update_count, and write with ensure_ascii=False, indent=2."
      },
      {
        "title": "Troubleshooting",
        "body": "Server keeps dying — Check for duplicate python processes. On macOS/Linux: lsof -i:8000. On Windows: Get-Process python.\nBrowser won't go fullscreen — Kill stray browser processes first. macOS: pkill -f \"Google Chrome\". Windows: taskkill /IM msedge.exe /F.\nContent not updating — Relaunch the kiosk to bust any cache. Verify the JSON saved correctly.\nWeather not working — Check that spatial_awareness.location.latitude and longitude are set (not 0.0) in earl_mind.json.\nImport error — Make sure you run Python from the VisuoSpatialSketchpad directory, or add it to sys.path."
      },
      {
        "title": "Tight Loop",
        "body": "Restart server -> launch kiosk -> apply content changes -> relaunch kiosk if needed. Follow this every time the house texts \"wake up\"."
      }
    ],
    "body": "Earl Display Control\n\nSkill for managing the VisuoSpatial Sketchpad — Earl's living-room TV dashboard. This covers starting the HTTP server, launching the kiosk browser, and updating earl_mind.json via the Python API.\n\nAll file paths below use {baseDir} to mean this skill's root directory (the repo root containing VisuoSpatialSketchpad/).\n\nQuick Response Checklist\nWake requests (\"Earl wake up\", \"Could not sync\", \"Earl is sleeping\")\nStart the local server (see Server Management)\nLaunch the kiosk browser (see Launching the Kiosk)\nConfirm health: watch for GET /earl_mind.json ... 200 in the server log\nContent updates (mood, house stuff, hot takes, doodles, weather)\nUse the EarlMind API from {baseDir}/VisuoSpatialSketchpad/earl_api.py\nRelaunch the kiosk after changes if the display looks stale\nServer Management\n\nStart the HTTP server from the VisuoSpatialSketchpad directory:\n\ncd {baseDir}/VisuoSpatialSketchpad && python3 -m http.server 8000\n\n\nBackground the process so the shell prompt returns.\n\nKilling a stuck server\n\nmacOS / Linux:\n\nlsof -ti:8000 | xargs kill -9\n\n\nWindows (PowerShell):\n\nGet-Process -Id (Get-NetTCPConnection -LocalPort 8000).OwningProcess | Stop-Process -Force\n\nLaunching the Kiosk\n\nmacOS:\n\nopen -a \"Google Chrome\" --args --kiosk http://localhost:8000/sketchpad.html\n\n\nIf Chrome is unavailable, Safari works too:\n\nopen -a Safari http://localhost:8000/sketchpad.html\n\n\nWindows (PowerShell):\n\nStart-Process msedge.exe '--kiosk http://localhost:8000/sketchpad.html --edge-kiosk-type=fullscreen'\n\n\nLinux:\n\nxdg-open http://localhost:8000/sketchpad.html\n\n\nOr for a true kiosk with Chromium:\n\nchromium-browser --kiosk http://localhost:8000/sketchpad.html\n\n\nAlways relaunch after a wake cycle — the browser may cache the old page.\n\nEarlMind API Reference\n\nAll methods live in {baseDir}/VisuoSpatialSketchpad/earl_api.py. Run from the VisuoSpatialSketchpad directory:\n\nfrom earl_api import EarlMind\nmind = EarlMind()\n\n\nEach mutating method auto-saves and bumps meta.last_updated / meta.update_count.\n\nMethod Reference\nMethod\tPurpose\tKey Parameters\nset_mood(mood, energy, vibe, expression)\tSet Earl's mood and inner monologue\tmood: str, energy: 0-1 float, vibe: str, expression: str\nset_photo(url, caption)\tSet Earl's header photo\turl: str (URL or local path), caption: str\npost_house_stuff(title, detail, priority, category, icon)\tAdd a household reminder\tpriority: \"high\"/\"medium\"/\"low\", icon: emoji str\nresolve_house_stuff(item_id)\tRemove a resolved item by ID\titem_id: str (e.g. \"hs_a1b2c3\")\nclear_house_stuff()\tClear all house stuff items\t—\nupdate_room(room_id, status, notes, attention)\tUpdate a room's state\tattention: 0-1 float\nadd_room(room_id, name, x, y, icon, status, notes, attention)\tAdd a new room\tx, y: 0-1 normalized position\nsweep()\tLog a full house sweep\t—\nhot_take(topic, take, heat, emoji)\tAdd or update a hot take\theat: 0-1 float, updates if topic exists\ndrop_take(topic)\tRemove a hot take by topic\t—\ndoodle(label, x, y, size, color, note)\tPlace an emoji doodle on the sketchpad\tx, y: 0-1, size: px, color: hex\nsketch_note(text, x, y, size, color)\tPlace a text note on the sketchpad\tSame as doodle\nclear_sketchpad()\tWipe the sketchpad clean\t—\nlearn_pattern(pattern, confidence, observations)\tRecord a long-term pattern\tconfidence: 0-1, observations: int\nsummary()\tGet a human-readable state summary\tReturns str\nsnapshot()\tGet the raw mind dict\tReturns dict\nCommon Examples\n# Set mood\nmind.set_mood(\"happy\", energy=0.9, vibe=\"Sun's out, vibes are immaculate.\")\n\n# Post a house reminder\nmind.post_house_stuff(\"Bins go out tonight\", detail=\"Wednesday again.\", priority=\"high\", category=\"chores\", icon=\"🗑️\")\n\n# Drop a hot take\nmind.hot_take(\"Pineapple on pizza\", \"Controversial but I respect the audacity.\", heat=0.6, emoji=\"🍕\")\n\n# Doodle on the sketchpad\nmind.doodle(\"🌧️\", x=0.3, y=0.2, size=30, note=\"Rain starting\")\n\n# Log a pattern\nmind.learn_pattern(\"The cat sits by the window at 3pm\", confidence=0.7, observations=5)\n\nWeather Update\n\nRun the weather helper to fetch live Open-Meteo data, update mood/energy, and drop a weather doodle:\n\ncd {baseDir}/VisuoSpatialSketchpad && python3 update_weather_ping.py\n\nearl_mind.json Schema\n\nThe dashboard reads {baseDir}/VisuoSpatialSketchpad/earl_mind.json. Top-level structure:\n\n{\n  \"identity\":          { name, role, mood, energy (0-1), current_vibe, avatar_expression, photo, photo_caption }\n  \"spatial_awareness\": { house_name, location: { latitude, longitude, timezone, temperature_unit, wind_speed_unit }, last_sweep, rooms: [...] }\n  \"house_stuff\":       { items: [{ id, title, detail, priority, category, icon }] }\n  \"earl_unplugged\":    [{ id, topic, take, heat (0-1), emoji, date }]\n  \"sketchpad\":         { canvas: [{ id, type (\"doodle\"|\"note\"), label, x, y, size, color, note }] }\n  \"long_term_patterns\": [{ pattern, confidence (0-1), observations }]\n  \"meta\":              { schema_version, last_updated (ISO 8601), update_count }\n}\n\n\nIf you edit JSON directly, always bump meta.last_updated and meta.update_count, and write with ensure_ascii=False, indent=2.\n\nTroubleshooting\nServer keeps dying — Check for duplicate python processes. On macOS/Linux: lsof -i:8000. On Windows: Get-Process python.\nBrowser won't go fullscreen — Kill stray browser processes first. macOS: pkill -f \"Google Chrome\". Windows: taskkill /IM msedge.exe /F.\nContent not updating — Relaunch the kiosk to bust any cache. Verify the JSON saved correctly.\nWeather not working — Check that spatial_awareness.location.latitude and longitude are set (not 0.0) in earl_mind.json.\nImport error — Make sure you run Python from the VisuoSpatialSketchpad directory, or add it to sys.path.\nTight Loop\n\nRestart server -> launch kiosk -> apply content changes -> relaunch kiosk if needed. Follow this every time the house texts \"wake up\"."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/recozers/earl-display-control",
    "publisherUrl": "https://clawhub.ai/recozers/earl-display-control",
    "owner": "recozers",
    "version": "0.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/earl-display-control",
    "downloadUrl": "https://openagent3.xyz/downloads/earl-display-control",
    "agentUrl": "https://openagent3.xyz/skills/earl-display-control/agent",
    "manifestUrl": "https://openagent3.xyz/skills/earl-display-control/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/earl-display-control/agent.md"
  }
}