Automated summary
This skill drives the visual state of the OpenLoomi Loomi Pet inside Claude Code and walks the user through customizing its sprites and theme via the file system.
Strengths
- Explicitly lists the 9 universal states and flags which ones are watcher-only and must not be set from Claude.
- Breaks customization into a clear decision tree: built-in theme, custom character, single-sprite override, making a custom theme the default.
- Honestly documents what the bridge cannot do (no theme switch, no sprite override) and points to the right config files instead.
- Validates state names before any HTTP call and degrades gracefully when the OpenLoomi endpoint does not exist yet.
Limitations
- The POST /api/pet/state endpoint may be missing on the target runtime, in which case the bridge only reports 'would have set state' without raising an error.
- Theme switching and adding custom characters happen only through the context menu or files outside the plugin, never through the bridge.
- The skill is tied to the OpenLoomi plugin and its runtime and has no effect outside that ecosystem.
Use it when the user wants their Loomi Pet to react, change state, swap between fox and capybara, or bring in a custom character.
Avoid it when the user has not installed the OpenLoomi plugin or is looking for generic UI control unrelated to the pet.
Security analysis
CautionThe skill relies on Bash to run a fixed node script that sends state updates over HTTP to the local OpenLoomi runtime. The script validates state names before making any request and falls back gracefully if the endpoint is missing. No destructive commands, exfiltration, or obfuscation are described, but the combination of Bash execution and network calls warrants a caution rating rather than safe.
- •Uses Bash to execute a node script with wildcard arguments (Bash(node ${CLAUDE_PLUGIN_ROOT}/scripts/loomi-bridge.mjs *)).
- •The bridge script makes HTTP POST requests to a local API endpoint (/api/pet/state), which is network activity for legitimate state changes.
Examples
/openloomi:pet happy — the build just passed, make Loomi celebrate.I'd rather see the capybara than the fox — how do I switch my Loomi Pet theme?I drew my own cat sprites. Where do I put them so Loomi uses my cat as a pet theme?name: openloomi-pet description: "OpenLoomi Pet sprite & state helper for Claude Code. Use when the user wants to change their Loomi Pet state, switch theme, drop in a custom character, override individual sprites, or ask Claude to mirror its lifecycle onto the pet. Triggers: pet state, /openloomi:pet, set pet, loomi pet, pet to happy, pet to working, pet to thinking, fox sprite, capybara sprite, custom pet theme, pet-custom, pet-config, override pet sprite." allowed-tools: Bash(node ${CLAUDE_PLUGIN_ROOT}/scripts/loomi-bridge.mjs *)
OpenLoomi Pet Sub-skill
The Loomi Pet has 9 universal state names. The plugin ships the fox
(loomi-*) sprite set for branding; the OpenLoomi runtime's
state-resolution watcher renders the matching sprite for whichever
theme you have active (fox or capybara, or any folder under
~/.openloomi/pet-custom/). State set:
| State | When to use |
|---|---|
| happy | A task just completed successfully |
| idle | Loomi is waiting for the next loop tick (watcher-only — do not set from Claude) |
| juggling | Multiple sub-agents are running |
| needsinput | Permission prompt / elicitation dialog visible |
| presenting | Fresh decision requires the user's review (watcher-only — do not set from Claude) |
| sleeping | Local hour outside 6–22 with no pending work (watcher-only — do not set from Claude) |
| sweeping | User dismissed a card just now (watcher-only) |
| thinking | Between steps, awaiting LLM response |
| working | A tool call is in progress (PreToolUse hook fires this) |
Available commands
node ${CLAUDE_PLUGIN_ROOT}/scripts/loomi-bridge.mjs pet <state>— synchronous, returns JSON; use only when the user explicitly asks.- Hooks call
state <name>automatically (fire-and-forget, 2s timeout).
Sprite set is hardcoded in the bridge — invalid state names are rejected
before any HTTP call. The endpoint POST /api/pet/state may not yet exist
in the target OpenLoomi runtime; the bridge falls back to "would have set
state to X — pending OpenLoomi endpoint" without raising an error.
Help the user customize their pet's appearance
The bridge only drives the state — sprite overrides and theme folders
are file-based and live outside the plugin. When the user asks to "change
the pet's look" or "add a custom character", walk them through the file
system. Do not try to write pet-config.json from the bridge; the
bridge has no such command and the runtime's file watcher does the work.
Decision tree
- "I just want the other built-in" → right-click Loomi →
Theme → Fox/Theme → Capybara. Persisted in~/.openloomi/pet-config.jsonunderactiveTheme. Long-press (~600 ms) is the fallback ifcontextmenuis swallowed by the host. - "I want my own character" → drop a folder at
~/.openloomi/pet-custom/<name>/with PNGs named after the states. The watcher auto-discovers it within ~250 ms and the theme appears in the menu. - "I want to change just one sprite" → edit
~/.openloomi/pet-config.json'soverridesmap. Wins over both built-ins and custom-theme sprites for the matching(theme, state)pair. - "I want to make my theme the default" → set
activeThemeto the custom theme's folder name.
What the bridge can and can't do
| User intent | Bridge role |
| ------------------------------------------ | -------------------------------------------------------------------------- |
| Flip to happy mid-task | /openloomi:pet happy — yes |
| Switch fox ↔ capybara | No — that's a menu action or pet-config.json edit; do not try the bridge |
| Add a custom character | No — direct them to ~/.openloomi/pet-custom/<name>/ and the file watcher |
| Override a single sprite | No — direct them to ~/.openloomi/pet-config.json's overrides map |
| Diagnose "the pet isn't switching themes" | Direct them to the troubleshooting section in pet docs |
| Drive the pet from their own tool | Direct them to POST /api/pet/state — see Pet API |
Filename conventions to communicate
When guiding the user through a custom theme, surface these conventions up-front:
- PNG only.
.gif,.webp,.apng,.lottieare silently ignored. - Bare or prefixed names both work.
idle.png,loomi-idle.png,capybara-thinking.png,my-pack-sweeping.pngall normalize correctly (case-insensitive). - One recognizable state PNG is enough. The folder is registered as a theme as soon as it has ≥1 normalized state stem; missing states fall through to the active theme's
idlesprite. - Hidden / dot-prefixed folders are ignored.
.git,.DS_Storeetc.
Override JSON shape to communicate
The overrides map is camelCase on the wire — activeTheme, customThemesDir. Snake_case keys silently no-op the assignment (a unit test in the runtime pins the contract). Use the exact shape:
{
"version": 1,
"activeTheme": "fox",
"customThemesDir": "~/.openloomi/pet-custom",
"overrides": {
"fox": {
"idle": "/absolute/path/to/my-fox-idle.png"
}
}
}
Absolute paths only — the runtime routes them through tauri::convertFileSrc, so relative paths and ~/ prefixes will not resolve.
Common pitfalls to surface
- The folder doesn't show up — usually a missing or mis-named state PNG. Run them through the filename convention table.
- Override doesn't apply — host log line
[loomi-pet/theme] failed to parse ~/.openloomi/pet-config.jsonmeans the JSON itself is malformed and defaults loaded. Host log line[loomi-pet/theme] failed to read <path>: <io error>means the path doesn't resolve. - Theme menu tick is wrong / stuck — almost always a camelCase vs snake_case wire-format mismatch. The widget reads
activeTheme, notactive_theme. sleeping/sweepingrejected by/api/pet/state— those are watcher-only vocabulary; the runtime returns400 invalid_state. Do not POST them from your tool.
What NOT to do from Claude
- Do not try to call
POST /api/pet/statewithsleepingorsweeping. The API rejects them; the watcher owns them. - Do not try to write
pet-config.jsonfrom the bridge. The bridge has no command for it; the file watcher owns updates. - Do not invent new state names.
CAPYBARA_STATESrejects them before any HTTP call. - Do not claim support for non-PNG sprite formats. The asset pipeline is static PNG only.
- Do not say "I'll set up your custom theme for you" if you can only walk them through the file system. The watcher does the work; you guide.
See also
- Customize your Loomi Pet (user docs) — full guide to themes, custom folders, overrides, troubleshooting
- Pet API —
POST /api/pet/statefor external tools - Attention Agent — the desktop pet as a whole
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/openloomi-pet-sprite-state-helper-mtwgrt9y/download' --output '.skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y/SKILL.md.part' && mv '.skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y/SKILL.md.part' '.skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
Tools declared by the author (check availability in your agent): Bash(node ${CLAUDE_PLUGIN_ROOT}/scripts/loomi-bridge.mjs *)
No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y/SKILL.md' && test -s '.skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/openloomi-pet' && cp -R '.skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y' '.claude/skills/openloomi-pet'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y'openskills read 'openloomi-pet-sprite-state-helper-mtwgrt9y'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/openloomi-pet-sprite-state-helper-mtwgrt9y/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
PDF Reader
Productivity
Read and extract text from PDF files, including documents, reports, contracts, and spreadsheets. Works with local files, URLs, and WhatsApp attachments. Use whenever PDF content is needed, even if not explicitly requested.
Discord Messaging Workflows
Productivity
Use the message tool to send, edit, and moderate Discord messages with interactive components.
Interactive Verdict Preview
Productivity
Generate an interactive HTML preview of keep/drop verdicts for maintainer review, then process the pasted feedback JSON.