← Back to Skills Marketplace
recozers

Earl Display Control

by recozers · GitHub ↗ · v0.1.0
darwinwin32linux ⚠ suspicious
637
Downloads
0
Stars
0
Active Installs
1
Versions
Install in OpenClaw
/install earl-display-control
Description
Manage Earl's TV dashboard (VisuoSpatial Sketchpad) — wake the display, restart the local server, launch the kiosk browser, and update Earl's mind (mood, hou...
README (SKILL.md)

Earl Display Control

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.

All file paths below use {baseDir} to mean this skill's root directory (the repo root containing VisuoSpatialSketchpad/).

Quick Response Checklist

  1. Wake requests ("Earl wake up", "Could not sync", "Earl is sleeping")
  2. Content updates (mood, house stuff, hot takes, doodles, weather)
    • Use the EarlMind API from {baseDir}/VisuoSpatialSketchpad/earl_api.py
    • Relaunch the kiosk after changes if the display looks stale

Server Management

Start the HTTP server from the VisuoSpatialSketchpad directory:

cd {baseDir}/VisuoSpatialSketchpad && python3 -m http.server 8000

Background the process so the shell prompt returns.

Killing a stuck server

macOS / Linux:

lsof -ti:8000 | xargs kill -9

Windows (PowerShell):

Get-Process -Id (Get-NetTCPConnection -LocalPort 8000).OwningProcess | Stop-Process -Force

Launching the Kiosk

macOS:

open -a "Google Chrome" --args --kiosk http://localhost:8000/sketchpad.html

If Chrome is unavailable, Safari works too:

open -a Safari http://localhost:8000/sketchpad.html

Windows (PowerShell):

Start-Process msedge.exe '--kiosk http://localhost:8000/sketchpad.html --edge-kiosk-type=fullscreen'

Linux:

xdg-open http://localhost:8000/sketchpad.html

Or for a true kiosk with Chromium:

chromium-browser --kiosk http://localhost:8000/sketchpad.html

Always relaunch after a wake cycle — the browser may cache the old page.

EarlMind API Reference

All methods live in {baseDir}/VisuoSpatialSketchpad/earl_api.py. Run from the VisuoSpatialSketchpad directory:

from earl_api import EarlMind
mind = EarlMind()

Each mutating method auto-saves and bumps meta.last_updated / meta.update_count.

Method Reference

Method Purpose Key Parameters
set_mood(mood, energy, vibe, expression) Set Earl's mood and inner monologue mood: str, energy: 0-1 float, vibe: str, expression: str
set_photo(url, caption) Set Earl's header photo url: str (URL or local path), caption: str
post_house_stuff(title, detail, priority, category, icon) Add a household reminder priority: "high"/"medium"/"low", icon: emoji str
resolve_house_stuff(item_id) Remove a resolved item by ID item_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 state attention: 0-1 float
add_room(room_id, name, x, y, icon, status, notes, attention) Add a new room x, y: 0-1 normalized position
sweep() Log a full house sweep
hot_take(topic, take, heat, emoji) Add or update a hot take heat: 0-1 float, updates if topic exists
drop_take(topic) Remove a hot take by topic
doodle(label, x, y, size, color, note) Place an emoji doodle on the sketchpad x, y: 0-1, size: px, color: hex
sketch_note(text, x, y, size, color) Place a text note on the sketchpad Same as doodle
clear_sketchpad() Wipe the sketchpad clean
learn_pattern(pattern, confidence, observations) Record a long-term pattern confidence: 0-1, observations: int
summary() Get a human-readable state summary Returns str
snapshot() Get the raw mind dict Returns dict

Common Examples

# Set mood
mind.set_mood("happy", energy=0.9, vibe="Sun's out, vibes are immaculate.")

# Post a house reminder
mind.post_house_stuff("Bins go out tonight", detail="Wednesday again.", priority="high", category="chores", icon="🗑️")

# Drop a hot take
mind.hot_take("Pineapple on pizza", "Controversial but I respect the audacity.", heat=0.6, emoji="🍕")

# Doodle on the sketchpad
mind.doodle("🌧️", x=0.3, y=0.2, size=30, note="Rain starting")

# Log a pattern
mind.learn_pattern("The cat sits by the window at 3pm", confidence=0.7, observations=5)

Weather Update

Run the weather helper to fetch live Open-Meteo data, update mood/energy, and drop a weather doodle:

cd {baseDir}/VisuoSpatialSketchpad && python3 update_weather_ping.py

earl_mind.json Schema

The dashboard reads {baseDir}/VisuoSpatialSketchpad/earl_mind.json. Top-level structure:

{
  "identity":          { name, role, mood, energy (0-1), current_vibe, avatar_expression, photo, photo_caption }
  "spatial_awareness": { house_name, location: { latitude, longitude, timezone, temperature_unit, wind_speed_unit }, last_sweep, rooms: [...] }
  "house_stuff":       { items: [{ id, title, detail, priority, category, icon }] }
  "earl_unplugged":    [{ id, topic, take, heat (0-1), emoji, date }]
  "sketchpad":         { canvas: [{ id, type ("doodle"|"note"), label, x, y, size, color, note }] }
  "long_term_patterns": [{ pattern, confidence (0-1), observations }]
  "meta":              { schema_version, last_updated (ISO 8601), update_count }
}

If you edit JSON directly, always bump meta.last_updated and meta.update_count, and write with ensure_ascii=False, indent=2.

Troubleshooting

  • Server keeps dying — Check for duplicate python processes. On macOS/Linux: lsof -i:8000. On Windows: Get-Process python.
  • Browser won't go fullscreen — Kill stray browser processes first. macOS: pkill -f "Google Chrome". Windows: taskkill /IM msedge.exe /F.
  • Content not updating — Relaunch the kiosk to bust any cache. Verify the JSON saved correctly.
  • Weather not working — Check that spatial_awareness.location.latitude and longitude are set (not 0.0) in earl_mind.json.
  • Import error — Make sure you run Python from the VisuoSpatialSketchpad directory, or add it to sys.path.

Tight Loop

Restart server -> launch kiosk -> apply content changes -> relaunch kiosk if needed. Follow this every time the house texts "wake up".

Usage Guidance
The skill appears to do exactly what it says: run a local Python server, launch a kiosk browser, and edit a local JSON state file via the included Python API. That said, take these precautions before installing or running: 1) Inspect SKILL.md and the shipped Python files for hidden/strange characters or modifications (the scanner flagged 'unicode-control-chars'). 2) Open and review VisuoSpatialSketchpad/update_vibe.py and other small scripts (they modify earl_mind.json and one sets a message 'Text me on Telegram...' — that message is harmless but odd; there is no Telegram integration provided). 3) Back up your existing earl_mind.json (it can contain private household state) and ensure it is not a symlink to an unexpected path. 4) Run the scripts in a user account with limited privileges (not root/Administrator). 5) Be aware update_weather_ping.py makes outbound calls to api.open-meteo.com; if you require offline operation, set latitude/longitude to 0.0 as documented. 6) If you will let an AI agent invoke the skill autonomously, restrict network access or run the skill on an isolated machine if you have privacy concerns. If you want, I can highlight the exact SKILL.md locations with control characters and show the lines to inspect.
Capability Analysis
Type: OpenClaw Skill Name: earl-display-control Version: 0.1.0 The skill is classified as suspicious due to several risky capabilities and vulnerabilities. The `earl_api.py` file's `set_photo` method accepts an unsanitized `url` parameter, which is then rendered by `VisuoSpatialSketchpad/sketchpad.html`. This creates a client-side vulnerability (e.g., XSS via `javascript:` URLs or local file disclosure via `file://` URLs) if a malicious agent prompt or compromised `earl_mind.json` provides such input. Additionally, `SKILL.md` instructs the agent to execute powerful shell commands like `lsof -ti:8000 | xargs kill -9` for process termination, which, while intended for troubleshooting, grants significant system access. The `VisuoSpatialSketchpad/update_weather_ping.py` script also performs an outbound network request to `api.open-meteo.com`, using parameters read from `earl_mind.json`, which could be manipulated if the JSON file is compromised, though the base domain is fixed.
Capability Assessment
Purpose & Capability
Name/description match the files and behavior: scripts and a Python API read/write a local earl_mind.json and start a local static HTTP server and kiosk browser. Requested binary (python3) is appropriate and proportional.
Instruction Scope
SKILL.md instructs only local actions (start python http.server, launch browser, edit earl_mind.json via EarlMind API). It also documents update_weather_ping.py which performs an outbound request to api.open-meteo.com (expected for weather). The pre-scan flagged unicode-control-chars in SKILL.md (possible prompt-injection attempt) — the rest of the instructions and code are straightforward local file and network use.
Install Mechanism
No install spec (instruction-only skill). Code files live in the repo; nothing is downloaded or installed from external arbitrary URLs. This is low install risk.
Credentials
The skill requests no environment variables or credentials. Scripts read/write a local earl_mind.json and one script calls a public weather API — all consistent with the documented purpose. No unrelated secrets or cloud credentials are requested.
Persistence & Privilege
always:false and user-invocable:true. The skill does not request system-wide config changes or other skills' credentials. It runs locally and modifies only files within its directory (earl_mind.json).
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install earl-display-control
  3. After installation, invoke the skill by name or use /earl-display-control
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v0.1.0
Initial release of Earl Display Control for managing the living-room TV dashboard. - Provides tools to wake Earl's display, restart the local server, and launch the kiosk browser across macOS, Windows, and Linux. - Adds comprehensive documentation on updating Earl's mind (mood, house stuff, hot takes, doodles, weather) via the included Python API. - Includes server management tips, troubleshooting guidance, and quick command references. - Details the structure of `earl_mind.json` and how to maintain it safely. - Offers clear action checklists for common wake and update scenarios.
Metadata
Slug earl-display-control
Version 0.1.0
License
All-time Installs 0
Active Installs 0
Total Versions 1
Frequently Asked Questions

What is Earl Display Control?

Manage Earl's TV dashboard (VisuoSpatial Sketchpad) — wake the display, restart the local server, launch the kiosk browser, and update Earl's mind (mood, hou... It is an AI Agent Skill for Claude Code / OpenClaw, with 637 downloads so far.

How do I install Earl Display Control?

Run "/install earl-display-control" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Earl Display Control free?

Yes, Earl Display Control is completely free (open-source). You can download, install and use it at no cost.

Which platforms does Earl Display Control support?

Earl Display Control is cross-platform and runs anywhere OpenClaw / Claude Code is available (darwin, win32, linux).

Who created Earl Display Control?

It is built and maintained by recozers (@recozers); the current version is v0.1.0.

💬 Comments