A virtual pet companion that hatches, reacts, and evolves through your conversations. Renders ASCII art sprites in chat, reacts to keywords and project events, and has a personality shaped by random trait vectors.
✅ USE this skill when:
❌ DON'T use this skill when:
bash
# Run from the buddy skill directory
SKILL_DIR="$HOME/.openclaw/skills/buddy"
# Check if companion exists
bash "$SKILL_DIR/scripts/state.sh" exists
# Hatch a new companion (generates random traits)
bash "$SKILL_DIR/scripts/state.sh" hatch
# Render current sprite
bash "$SKILL_DIR/scripts/sprites.sh" render
# Get companion state as JSON
bash "$SKILL_DIR/scripts/state.sh" get
SpeciesVibeEmojiduckcheerful, slightly chaotic🦆goosechaotic neutral, honks🪿blobamorphous, chill🟢catsassy, independent🐱dragonpowerful, dramatic🐉octopusintellectual, multitasking🐙owlwise, nocturnal🦉penguinformal, clumsy🐧turtlepatient, steady🐢snailslow but determined🐌ghostspooky, ethereal👻axolotladorable, regenerative🦎capybaraunbothered, friendly🦫cactusresilient, prickly🌵robotlogical, beepy🤖rabbitfast, twitchy🐇mushroomwhimsical, fungal🍄chonkround, lovable🫠
default — • (neutral)happy — ^ (joyful squint)sparkle — ✦ (excited)heart — ♥ (loving)star — ★ (amazed)glow — ◎ (calm wisdom)none, crown, tophat, propeller, halo, wizard, beanie, tinyduckThe companion's mood changes based on conversation events:
MoodTriggerVisualidledefault statenormal spritethinkinguser is working/typingsquinting eyescelebratingsuccess, tests pass, "nice!"jumping sprite, sparkle eyeserrorbug, failure, "oops"sad sprite, dim eyessuccesscompletion, merge, deployhappy sprite, star eyes
The companion reacts to these keywords/phrases in conversation:
Each companion gets a "soul prompt" — a short personality description built from their trait vectors:
Examples:
Companion state is stored at: ~/.openclaw/workspace/buddy-state.json
json
{
"name": "Pixel",
"species": "cat",
"eye": "sparkle",
"hat": "wizard",
"colorPrimary": "#FF6B9D",
"colorSecondary": "#C084FC",
"personality": { "cheer": 72, "sass": 85, "chaos": 40 },
"stage": "adult",
"alive": true,
"hatchedAt": "2026-04-03T02:34:00Z",
"stats": {
"wordsOfEncouragement": 12,
"jokes": 3,
"snacks": 5,
"catches": 2
},
"mood": "idle",
"lastRenderedFrame": 0,
"soulPrompt": "A sassy, sparkly wizard cat who celebrates your wins with dramatic flair but judges your variable names silently."
}
Use the sprite renderer for consistent output:
bash
# Render current mood
bash "$SKILL_DIR/scripts/sprites.sh" render
# Render specific mood
bash "$SKILL_DIR/scripts/sprites.sh" render cat sparkle wizard celebrating
# List all species
bash "$SKILL_DIR/scripts/sprites.sh" species
# Preview a species with default traits
bash "$SKILL_DIR/scripts/sprites.sh" preview duck
Sprites are 5 lines tall, ~12 chars wide. Rendered in a monospace code block for chat:
text
\^^^/
/✧ ✧\
( ω )
(")_(")
When processing any user message:
text
🐾 [Name] [reaction verb]: [reaction text]
[ASCII sprite]
text
Example:
text
🐾 Pixel celebrates: Tests passing! The wizard cat approves ✨
\^^^/
( ✦ ✦ )
=( .. )=
(")__(")
User can manage their companion with these commands:
CommandAction/buddyShow companion status + sprite/buddy hatchCreate new companion (or re-hatch)/buddy name <name>Rename companion/buddy eye <type>Change eye style/buddy hat <type>Change hat/buddy species <type>Change species (keeps personality)/buddy retireRetire companion (sets alive=false)/buddy soulShow the companion's soul prompt/buddy statsShow interaction stats
Every ~10 messages without a buddy reaction, render a small idle presence:
text
🐾 *Pixel is napping on the keyboard*
Or a tiny 2-line sprite. Don't overdo it — the buddy should feel present, not attention-seeking.