React Native Best Practices
vercel-labs/openreview
A prioritized rule set for React Native and Expo apps covering list performance, animation, navigation, UI patterns, state, rendering, monorepos and configuration.
Control HomeKit smart home accessories and view home events via homeclaw-cli.
$ npx skills add omarshahine/HomeClaw --skill homekit -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install omarshahine/HomeClaw homekit --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/omarshahine/HomeClaw.git skills-src && mkdir -p .claude/skills && cp -r skills-src/openclaw/skills/homekit .claude/skills/homekit && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "homekit" agent skill from https://github.com/omarshahine/HomeClaw/tree/main/openclaw/skills/homekit into .claude/skills/homekit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "homekit", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/omarshahine/HomeClaw/tree/main/openclaw/skills/homekitType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add omarshahine/HomeClaw --skill homekit -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install omarshahine/HomeClaw homekit --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/omarshahine/HomeClaw.git skills-src && mkdir -p .agents/skills && cp -r skills-src/openclaw/skills/homekit .agents/skills/homekit && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "homekit" agent skill from https://github.com/omarshahine/HomeClaw/tree/main/openclaw/skills/homekit into .agents/skills/homekit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "homekit", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add omarshahine/HomeClaw --skill homekit -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install omarshahine/HomeClaw homekit --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/omarshahine/HomeClaw.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/openclaw/skills/homekit .cursor/skills/homekit && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "homekit" agent skill from https://github.com/omarshahine/HomeClaw/tree/main/openclaw/skills/homekit into .cursor/skills/homekit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "homekit", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/omarshahine/HomeClaw.git --path openclaw/skills/homekit--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add omarshahine/HomeClaw --skill homekit -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install omarshahine/HomeClaw homekit --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/omarshahine/HomeClaw.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/openclaw/skills/homekit .gemini/skills/homekit && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "homekit" agent skill from https://github.com/omarshahine/HomeClaw/tree/main/openclaw/skills/homekit into .gemini/skills/homekit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "homekit", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install omarshahine/HomeClaw homekitInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add omarshahine/HomeClaw --skill homekit -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/omarshahine/HomeClaw.git skills-src && mkdir -p .github/skills && cp -r skills-src/openclaw/skills/homekit .github/skills/homekit && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "homekit" agent skill from https://github.com/omarshahine/HomeClaw/tree/main/openclaw/skills/homekit into .github/skills/homekit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "homekit", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add omarshahine/HomeClaw --skill homekit -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install omarshahine/HomeClaw homekit --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/omarshahine/HomeClaw.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/openclaw/skills/homekit .opencode/skills/homekit && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "homekit" agent skill from https://github.com/omarshahine/HomeClaw/tree/main/openclaw/skills/homekit into .opencode/skills/homekit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "homekit", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
homekitControl HomeKit smart home accessories and view home events via homeclaw-cli.
Homekit is an agent skill from omarshahine/HomeClaw. Control HomeKit smart home accessories and view home events via homeclaw-cli. Use when the user asks to control lights, locks, thermostats, fans, blinds, scenes, check device/sensor status, or view recent home activity/events. Examples: "turn off the stairs lights", "lock the front door", "what's the temperature", "run the movie scene", "close the blinds", "is the garage door open", "what happened at home today", "when was the front door last unlocked"
Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Mobile. The repository describes itself as: HomeKit smart home control via MCP — lights, locks, thermostats, and scenes for Claude Desktop, Claude Code, and OpenClaw. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit da69700. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
opensslpython3From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.openclaw.aigithub.comjustin.poehnelt.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
HOMECLAW_WEBHOOK_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Homekit loads about 6.3k tokens when it runs. Until then it costs about 116 tokens; SKILL.md has 1,864 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
erate a token and add it to `~/.openclaw/.env`:# Add to .env_TOKEN=<generated-token>' >> ~/.openclaw/.envAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from omarshahine/HomeClaw at commit da69700, republished under its MIT licence (© omarshahine). 1,864 words, ~6,344 tokens.
.claude/skills/homekit/SKILL.md (or your agent's skills folder).Before your first HomeKit action in a session, read memory/homekit-device-map.json.
This compact device map has every device as a flat list with display_name, id (UUID), room, type (semantic category), controls (writable characteristics), and state. It's optimized for fast LLM scanning and disambiguation.
Refresh the cache periodically or when devices may have changed:
homeclaw-cli device-map --format agent -o memory/homekit-device-map.jsondisplay_name and room from the cached maptype to disambiguate — lighting devices support brightness; power devices are on/off only. A "Closet Light" with type: power cannot dim.display_name for reading, id (UUID) for set, import-scene, and automations create commandscontrols before sending a command — if brightness isn't in controls, don't try to set ithomeclaw-cli device-map --format agent -o memory/homekit-device-map.json# Discovery
homeclaw-cli device-map --format agent # LLM-optimized flat list (default cache format)
homeclaw-cli device-map --format json # Full detail with aliases, manufacturer
homeclaw-cli device-map --format md # Markdown tables by room
homeclaw-cli device-map --home "<home>" --format agent # Scope map to one home
homeclaw-cli search "<query>" --json # Search by name/room/category
homeclaw-cli search "<query>" --home "<home>" --json
homeclaw-cli get "<name-or-uuid>" --json # Full detail on one device
homeclaw-cli get "<name-or-uuid>" --home "<home>" --json
homeclaw-cli list --room "Kitchen" --json # All devices in a room
homeclaw-cli list --home "<home>" --room "Kitchen" --json
# Control — always use UUID for reliability
homeclaw-cli set "<uuid>" power true # On/off
homeclaw-cli set "<uuid>" power true --home "<home>" # Multi-home: pin the home
homeclaw-cli set "<uuid>" brightness 50 # Lights (0-100)
homeclaw-cli set "<uuid>" target_temperature 72 # Thermostat
homeclaw-cli set "<uuid>" target_heating_cooling auto # HVAC: off/heat/cool/auto
homeclaw-cli set "<uuid>" lock_target_state locked # Locks: locked/unlocked
homeclaw-cli set "<uuid>" target_position 100 # Blinds (0=closed, 100=open)
# Multi-gang switches — one accessory, several channels sharing a service type
homeclaw-cli set "<uuid>" power true --service-name "Pendentes" # By service name
homeclaw-cli set "<uuid>" power true --service-id "<service-uuid>" # By service UUID (names can repeat)
homeclaw-cli set "<uuid>" power true --service-index 2 # By channel number (ServiceLabelIndex)
# Scenes
homeclaw-cli scenes --json # List all scenes
homeclaw-cli scenes --home "<home>" --json
homeclaw-cli get-scene "<name>" --json # Full detail: all actions (accessory, room, characteristic, value)
homeclaw-cli trigger "<scene-name>" # Run a scene
homeclaw-cli trigger "<scene-name>" --home "<home>"
homeclaw-cli import-scene scene.json --dry-run # Preview scene import
homeclaw-cli import-scene scene.json # Create scene from JSON
echo '{"name": "...", "actions": [...]}' | homeclaw-cli import-scene - # Read JSON from stdin (works from any directory, sandbox-safe)
homeclaw-cli delete-scene "<name-or-uuid>" --dry-run # Preview deletion
homeclaw-cli delete-scene "<name-or-uuid>" # Delete a scene
# Room assignment — supports UUID for duplicate names
homeclaw-cli assign-rooms rooms.json --dry-run # Preview room assignments
homeclaw-cli assign-rooms rooms.json # Assign accessories to rooms
echo '[{"accessory": "...", "room": "..."}]' | homeclaw-cli assign-rooms - # stdin also works here
# JSON format: bare array [{"uuid": "...", "room": "..."} or {"accessory": "...", "room": "..."}]
# (or the same array wrapped as {"assignments": [...]})
# Use "uuid" when multiple accessories share the same name (e.g., ceiling fan + light)
# Management — rename, rooms, zones
homeclaw-cli rename "<name-or-uuid>" "<new-name>" # Rename accessory
homeclaw-cli rename "<name-or-uuid>" "<new-name>" --dry-run # Preview rename
homeclaw-cli rename-room "<name-or-uuid>" "<new-name>" # Rename room
homeclaw-cli create-room "<name>" # Create room
homeclaw-cli remove-room "<name-or-uuid>" # Remove room
homeclaw-cli remove-accessory "<name-or-uuid>" # Remove accessory
homeclaw-cli create-zone "<name>" # Create zone
homeclaw-cli remove-zone "<name-or-uuid>" # Remove zone
homeclaw-cli add-room-to-zone "<room>" "<zone>" # Add room to zone
homeclaw-cli remove-room-from-zone "<room>" "<zone>" # Remove room from zone
# Automations (button programming)
homeclaw-cli automations list --json # List all automations
homeclaw-cli automations get "<name-or-uuid>" --json # Detail view
homeclaw-cli automations delete "<name-or-uuid>" [--dry-run]
homeclaw-cli automations enable "<name-or-uuid>"
homeclaw-cli automations disable "<name-or-uuid>"
# Create with inline actions (creates a scene named after the automation)
# ALWAYS use UUIDs for target accessories to avoid name collisions
homeclaw-cli automations create --name "Sarah's Room Open" \
--accessory "Office Button" \
--action "BE21C139-413A-50F9-B97F-B9BDA06302A8:power:true" \
--action "52195C6F-6FAA-5E52-AA56-840A6605EEAA:target_position:100" \
--press single --service-index 1
# Create with a named scene
homeclaw-cli automations create --name "Movie Mode" \
--accessory "Remote Button" \
--scene "Movie Time" \
--press single
# Press types: single (0), double (1), long (2)
# --action format: "UUID:property:value" (repeatable, UUID strongly preferred over names)
# --scene and --action are mutually exclusive
# Use --service-index for multi-button accessories (e.g., Aqara in fast mode)
# Note: inline actions create a visible scene (Apple uses a private API for hidden ones)
# Export to file (any format)
homeclaw-cli device-map --format agent -o memory/homekit-device-map.json
homeclaw-cli device-map --format md -o device-map.mdThe type field in the compact map tells you what a device IS. The controls array tells you exactly what you CAN set. Key distinctions:
| Type | What It Is | Typical Controls |
|---|---|---|
lighting | Dimmable light | power, brightness, sometimes hue, saturation, color_temperature |
power | On/off switch or smart plug | power only — no brightness |
climate | Thermostat, heater, fireplace | target_temperature, target_heating_cooling (off/heat/cool/auto) |
door_lock | Lock | lock_target_state (locked/unlocked) |
window_covering | Blinds, shades | target_position (0=closed, 100=open) |
sensor | Temp, humidity, motion, contact, leak | Read-only — no writable controls |
security | Cameras, water shutoff | Varies: active, power |
Critical: A device named "Closet Light" or "Under Cabinet" with type: power is a relay switch. Sending brightness 50 will fail. Always check controls first.
Some accessories expose the same characteristic on several services: a 3-gang wall switch has three power characteristics, one per channel. Every channel reports the same service_type, so --service-type cannot pick one.
set refuses to guess. When a characteristic exists on more than one service it fails with an ambiguity error listing every candidate:
Ambiguous: 'power' exists on multiple services. Pass service_name, service_index, or service_id to pick one
(service_type is identical across channels on multi-gang accessories):
- service_name: "Switch 1", service_index: 1, service_id: 5F2A..., service_type: 00000049-...
- service_name: "Switch 2", service_index: 2, service_id: 91C7..., service_type: 00000049-...
- service_name: "Pendentes", service_index: 3, service_id: B3E0..., service_type: 00000049-...Passing selectors that match no service is a different error ("No service on '<name>' matches the given selectors") which lists the same candidates, so an over-constrained retry says so instead of claiming the characteristic doesn't exist.
Copy one of those selectors into the retry. homeclaw-cli get "<uuid>" --json lists the same id, name, and index per service if you want them before writing.
set reads the characteristic back after writing and reports which service it hit:
{ "characteristic": "power", "value": "true", "verified": true,
"service": { "id": "B3E0...", "name": "Pendentes", "type": "00000049-...", "index": 3 } }If the device still reports the old value after a few re-reads, set fails rather than returning success. That is the point of the check: a write HomeKit accepted but the device ignored used to come back as success: true.
Write not applied: Wall Switch.Pendentes.power still reads false after writing true. Pass verify=false to accept unconfirmed writes.When no verdict is possible the response carries verification_skipped instead: not_readable (a write-only characteristic), read_failed (the readback errored or timed out), or disabled (you passed --no-verify / verify: false). None of these mean the write failed, only that it could not be confirmed.
Use --no-verify for accessories whose readback is unreliable. Verification already retries a few times, so a device that acknowledges a write and publishes the new value a moment later is not flagged.
HomeClaw logs all HomeKit events (characteristic changes, scene triggers, control actions) to disk. Query the event log to understand what happened recently:
# Recent events (default: last 50)
homeclaw-cli events --json
# Events from the last hour
homeclaw-cli events --since 1h --json
# Only characteristic changes (e.g. lights turning on/off)
homeclaw-cli events --type characteristic_change --json
# Last 200 events
homeclaw-cli events --limit 200 --jsonEvent types: characteristic_change, scene_triggered, accessory_controlled, homes_updated
Use events to answer questions like "what changed recently?", "when was the front door last unlocked?", or "what scenes were triggered today?".
HomeClaw pushes HomeKit events to OpenClaw via webhooks, enabling a dedicated AI agent to observe, classify, and react to real-world events — a door unlocking, a leak sensor triggering, or a scene activating.
Known Issue: OpenClaw 2026.3.1/2026.3.2 has a bug where
/hooks/wakesilently drops events (#33271). HomeClaw uses mapped webhooks (/hooks/homeclaw) which route throughhooks.mappingsand are not affected.
HomeClaw always POSTs to a single mapped endpoint: /hooks/homeclaw (configurable via webhookEndpoint in config.json). OpenClaw's hooks.mappings config resolves the "homeclaw" key and routes the event to the dedicated HomeClaw agent.
This means HomeClaw doesn't need to know about agentId, channel, deliver, model, or sessionKey — all routing intelligence lives in the OpenClaw config. HomeClaw just sends events; OpenClaw decides what to do with them.
Payload: {"text": "[label] event text", "mode": "now|next-heartbeat"} with Authorization: Bearer <token>, X-Request-ID (UUID), and X-Event-Timestamp (ISO8601) headers.
Home app / physical switch / Siri / manufacturer app
|
v
HomeKit (HMAccessoryDelegate push notification)
|
v
HomeClaw event logger (writes to events.jsonl)
|
+-- Battery event? --> Logged to disk only (never sent via webhook)
|
+-- Trigger matches? --> POST /hooks/homeclaw
|
+-- No trigger --> Logged to disk only (no webhook sent)
v (trigger matched)
OpenClaw gateway validates Bearer token
|
v
hooks.mappings resolves "homeclaw"
|
v
HomeClaw Agent (dedicated)
+-- Classifies: CRITICAL / NOTABLE / AMBIENT
+-- If CRITICAL/NOTABLE: a2a message to main agent (Lobster)
+-- If AMBIENT: log to agent memory onlyHomeClaw subscribes to HomeKit push notifications for all interesting characteristics. Events fire for changes from any source — Home app, physical switches, Siri, manufacturer apps, and the CLI.
A dedicated HomeClaw agent receives all webhook events and acts as an intelligent filter between your smart home and your main AI assistant:
Workspace files live in openclaw/agents/homeclaw/:
| File | Purpose |
|---|---|
AGENTS.md | Agent registration and capabilities |
IDENTITY.md | Agent persona and behavioral guidelines |
SOUL.md | Event classification rules and triage logic |
TOOLS.md | Available tools (read-only HomeKit queries via homeclaw-cli) |
Install the agent workspace:
openclaw agents install homeclaw /path/to/openclaw/agents/homeclawAdd the hooks block with a mappings entry to ~/.openclaw/openclaw.json:
"hooks": {
"enabled": true,
"token": "${HOMECLAW_WEBHOOK_TOKEN}",
"mappings": {
"homeclaw": {
"agentId": "homeclaw",
"sessionKey": "hook:homeclaw",
"deliver": true,
"channel": "last",
"allowUnsafeExternalContent": true
}
},
"internal": {
"enabled": true,
"entries": {
"audit-logger": { "enabled": true }
}
}
}| Field | Purpose |
|---|---|
agentId | Routes to the dedicated HomeClaw agent |
sessionKey | All events share a persistent hook:homeclaw session |
deliver | Agent responses are delivered to a messaging channel |
channel | "last" uses the most recent active channel |
allowUnsafeExternalContent | Permits HomeKit event text in agent prompts |
The mappings approach replaces the old defaultSessionKey + per-trigger action model. All routing decisions live in OpenClaw config, not in HomeClaw triggers.
openclaw agents install homeclaw /path/to/openclaw/agents/homeclawVerify the agent is registered:
openclaw agents listAdd the hooks block (shown above) to ~/.openclaw/openclaw.json.
Generate a token and add it to ~/.openclaw/.env:
# Generate a secure token
openssl rand -base64 24 | tr '+/' '-_' | tr -d '='
# Add to .env
echo 'HOMECLAW_WEBHOOK_TOKEN=<generated-token>' >> ~/.openclaw/.envRestart the gateway: openclaw gateway restart
homeclaw-cli config --webhook-url "http://127.0.0.1:18789" \
--webhook-token "<same-token>" \
--webhook-enabled trueOr use HomeClaw Settings > Webhook. Toggle Enable, enter the base URL, and paste the token.
The webhookEndpoint defaults to /hooks/homeclaw. HomeClaw appends this to your base URL automatically.
Open HomeClaw Settings > Webhook. Check the scenes and accessories you want to fire webhooks. Start with security accessories (locks, garage doors, leak sensors) and a few lights to verify.
Triggers can also be managed via the CLI:
# List current triggers
homeclaw-cli triggers
# Add a trigger for all state changes on an accessory
homeclaw-cli triggers add --label "Garage Door" --accessory-id "<uuid>"
# Add a trigger for a specific characteristic only
homeclaw-cli triggers add --label "Mailbox Open" --accessory-id "<uuid>" --characteristic contact_state
# Update a trigger's delivery mode
homeclaw-cli triggers update "<trigger-id>" --wake-mode now
# Remove a trigger
homeclaw-cli triggers remove "<trigger-id>"Note: Battery-related characteristics (
battery_level,low_battery) are automatically excluded from webhooks. They are still logged to the event log and cached for status queries, but never fire webhook triggers.
# Check webhook health
homeclaw-cli status
# Toggle a light from the Home app, then check
homeclaw-cli events --since 5m
# Check delivery logs
log show --predicate 'process == "HomeClaw" AND category == "webhook"' --last 5m --style compactLook for a System: line in the OpenClaw TUI, or check that the HomeClaw agent session (hook:homeclaw) shows incoming events.
Create triggers for both the garage door and front door. The HomeClaw agent correlates the sequence — garage opens, then front door unlocks within minutes — and reports an arrival to the main agent.
homeclaw-cli triggers add --label "Garage Door" --accessory-id "<garage-uuid>"
homeclaw-cli triggers add --label "Front Door" --accessory-id "<lock-uuid>" --characteristic lock_current_stateThe agent sees both events in its persistent session and recognizes the arrival pattern.
The HomeClaw agent classifies door unlocks by time of day. An unlock at 2am is CRITICAL; the same unlock at 6pm is NOTABLE. No special trigger config needed — the agent's classification logic handles it.
homeclaw-cli triggers add --label "Front Door" --accessory-id "<lock-uuid>" --characteristic lock_current_state --value unlockedLeak sensors should always fire immediately. The agent classifies any leak event as CRITICAL and sends an a2a alert to the main agent right away.
homeclaw-cli triggers add --label "Kitchen Leak" --accessory-id "<leak-uuid>" --characteristic leak_detected --wake-mode nowA contact sensor on the mailbox fires when opened. The agent classifies this as NOTABLE and reports it.
homeclaw-cli triggers add --label "Mailbox" --accessory-id "<mailbox-uuid>" --characteristic contact_stateScene triggers capture when someone runs the Good Night scene. The agent logs it as AMBIENT and uses it to learn bedtime patterns over time.
homeclaw-cli triggers add --label "Good Night" --scene-name "Good Night" --wake-mode nowThe agent builds a daily summary from all events in its session. No special trigger config — just ensure your key accessories have triggers enabled. The agent can be prompted to summarize via a2a from the main agent.
| Field | Type | Default | Description |
|---|---|---|---|
wake_mode | string | "next-heartbeat" | "now" (immediate) or "next-heartbeat" (batched, default) |
label | string | — | Human-readable name shown in webhook payload |
accessory_id | string | — | UUID of the accessory to watch |
characteristic | string | — | Specific characteristic to filter (omit for all) |
value | string | — | Only fire when characteristic equals this value |
scene_name | string | — | Scene name to watch (alternative to accessory triggers) |
critical | bool | false | Bypasses circuit breaker when true |
Deprecated fields (removed):
action,agent_id,agent_prompt,agent_name,agent_deliver. These are no longer needed — all routing is handled by OpenClaw'shooks.mappingsconfig.
| State | After | Behavior | Recovery |
|---|---|---|---|
| Normal | — | All webhooks delivered | — |
| Soft Open | 5 failures | Non-critical paused 5 min | Auto-resumes |
| Hard Open | 3 soft trips | All non-critical stopped | Toggle webhook off/on in Settings |
Critical triggers (critical: true) always bypass the circuit breaker.
next-heartbeat. Events batch into the next heartbeat cycle. Set wake_mode: "now" on triggers that need immediate delivery (leak sensors, door locks, scene triggers).critical: true sparingly. It bypasses the circuit breaker. Reserve it for events that must never be silently dropped (leaks, security events). Overusing it defeats the circuit breaker's protection.characteristic: "lock_current_state" and value: "unlocked" only fires on unlock, not on lock. Omit value to fire on any state change.homeclaw-cli status --json for webhook health: circuit_state, last_success, last_failure, total_dropped.The CLI follows AI-agent best practices:
--json flag needed.OUTPUT_FORMAT=json: Set this environment variable to force JSON output in all contexts.--dry-run on mutations: set --dry-run validates the accessory, characteristic, and value without writing to the device. delete-scene --dry-run confirms the scene exists without deleting.# Dry run: validate without actuating
homeclaw-cli set "Front Door" lock_target_state locked --dry-run
# Force JSON from any context
OUTPUT_FORMAT=json homeclaw-cli status"71F". Set with plain numbers.--json on read commands gives parseable output. Always use it when processing results."unreachable": true in the compact map.~/Library/Containers/com.shahine.homeclaw/Data/Library/Application Support/HomeClaw/events.jsonlcharacteristic_change events.The compact map is flat — no nested traversal needed:
# Find all reachable lights
python3 -c "
import json
d = json.load(open('memory/homekit-device-map.json'))
for dev in d['devices']:
if dev['type'] == 'lighting' and not dev.get('unreachable'):
print(dev['id'], dev['display_name'], dev['state'])
"Then homeclaw-cli set "<uuid>" power false for each.
© omarshahine, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in openclaw/skills/homekit of omarshahine/HomeClaw.
Open the folder on GitHubat commit da69700
Homekit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Homekit this skillomarshahine/HomeClaw | 175 | — | ~6.3k | Automated safety check: Notes | MIT | |
| React Native Best Practicesvercel-labs/openreview | 1.7k | 17 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Swiftui Protwostraws/SwiftUI-Agent-Skill | 5.2k | 2 repos | ~1.5k | Automated safety check: Pass | MIT | |
| Kortix Brandkortix-ai/suna | 20k | — | ~4k | Automated safety check: Pass | Custom licence | |
| Ip As LogoKartikLabhshetwar/better-shot | 2.4k | 1 repos | ~4.3k | Automated safety check: Pass | MIT | |
| Compose Multiplatform Patternsmonta-app/ocpp-emulator | 180 | 5 repos | ~2k | Automated safety check: Pass | Apache-2.0 |
vercel-labs/openreview
A prioritized rule set for React Native and Expo apps covering list performance, animation, navigation, UI patterns, state, rendering, monorepos and configuration.
twostraws/SwiftUI-Agent-Skill
Comprehensively reviews SwiftUI code for best practices on modern APIs, maintainability, and performance.
kortix-ai/suna
Load FIRST for anything that carries the Kortix look or voice: product or mobile UI, copy of any kind, decks, social, images, email, CLI output, anything with the logo, and reviews of these.
KartikLabhshetwar/better-shot
Generate extremely simple, cute, personified square character images with rounded heavy forms, two purposeful character colors, one solid background color, and a dominant lower-corner composition.
monta-app/ocpp-emulator
Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.
adamlyttleapps/claude-skill-aso-appstore-screenshots
Generate high-converting App Store screenshots by analyzing your app's codebase, discovering core benefits, and creating ASO-optimized screenshot images using Nano Banana Pro.
omarshahine/HomeClaw
A skill your agent uses when writing, reviewing, or refactoring SwiftUI code for iOS or macOS, including state management, view composition, performance, Liquid Glass adoption, or Instruments .trace…
omarshahine/HomeClaw
Analyze Swift Package Manager dependencies, package plugins, module variants, and CI-oriented build overhead that slow Xcode builds.
omarshahine/HomeClaw
Benchmark Xcode clean and incremental builds with repeatable inputs, timing summaries, and timestamped .build-benchmark/ artifacts.
omarshahine/HomeClaw
Apply approved Xcode build optimization changes following best practices, then re-benchmark to verify improvement.
omarshahine/HomeClaw
Orchestrate Xcode build optimization by benchmarking first, running the specialist analysis skills, prioritizing findings, requesting explicit approval, delegating approved fixes to…
omarshahine/HomeClaw
Analyze Swift and mixed-language compile hotspots using build timing summaries and Swift frontend diagnostics, then produce a recommend-first source-level optimization plan.
Categories
Control HomeKit smart home accessories and view home events via homeclaw-cli. Homekit is an agent skill from omarshahine/HomeClaw. Control HomeKit smart home accessories and view home events via homeclaw-cli.
Homekit fits situations like: the user asks to control lights; check device/sensor status; view recent home activity/events.
Run `npx skills add omarshahine/HomeClaw --skill homekit -a claude-code`. Or copy the skill folder (openclaw/skills/homekit in omarshahine/HomeClaw) into .claude/skills/homekit in your project. Claude Code loads it when a task matches its description.
Run `npx skills add omarshahine/HomeClaw --skill homekit -a codex`. Or copy the skill folder (openclaw/skills/homekit in omarshahine/HomeClaw) into .agents/skills/homekit in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add omarshahine/HomeClaw --skill homekit -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/homekit, .gemini/skills/homekit, .github/skills/homekit and .opencode/skills/homekit in your project.
Going by SKILL.md and its folder, Homekit needs the command-line tools its instructions call (openssl and python3) and credentials named HOMECLAW_WEBHOOK_TOKEN.
SKILL.md names 3 domains. As links in the text: docs.openclaw.ai, github.com and justin.poehnelt.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Homekit is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.3k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Homekit: React Native Best Practices (vercel-labs/openreview, 1.7k stars), Swiftui Pro (twostraws/SwiftUI-Agent-Skill, 5.2k stars), Kortix Brand (kortix-ai/suna, 20k stars) and Ip As Logo (KartikLabhshetwar/better-shot, 2.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
omarshahine (a GitHub user) maintains it in omarshahine/HomeClaw, which has 175 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 8, 2026.
Source: omarshahine/HomeClaw on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.