By pptaa
A tsundere cat mascot (and friends) reacting to Claude Code activity in a tmux pane
This plugin requires configuration values that are prompted when the plugin is enabled. Sensitive values are stored in your system keychain.
languageMessage language (ko | en)
${user_config.language}characterWhich mascot character to display (nabi | fubao)
${user_config.character}paneHeightHeight of the tmux pane in rows (8–30)
Admin access level
Server config contains admin-level keywords
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
${user_config.paneHeight}startupEmotionEmotion shown when a new session starts (neutral | happy | angry | shy | sad | surprised | love)
${user_config.startupEmotion}stopHookEnabledAuto-update mascot emotion at end of each Claude response
${user_config.stopHookEnabled}English · 한국어
A tsundere cat mascot (and friends) reacting to Claude Code activity in a tmux pane.
show_character with a contextual tsundere one-liner generated from the current turnStop hook scans the transcript for emotion keywords and picks a random line from the character's message pooltmux ≥ 3.0 (required — claude-mascot is tmux-only)uv ≥ 0.4 (manages the Python venv automatically)Install prerequisites:
# macOS (Homebrew)
brew install tmux uv
# Linux (Ubuntu example)
sudo apt install tmux
curl -LsSf https://astral.sh/uv/install.sh | sh
Inside Claude Code, register this repo as a marketplace, then install the plugin:
/plugin marketplace add PPTaa/claude-mascot
/plugin install claude-mascot@claude-mascot-marketplace
Then run claude inside a tmux session — the mascot pane appears at the bottom automatically.
Two characters ship with the plugin. Switch between them via the character userConfig.
| ID | Name | Renderer | Notes |
|---|---|---|---|
nabi | Nabi (tsundere cat) | programmatic | Programmatic ANSI art with blinking, tail, and decorations. Default. |
fubao | Fubao (느긋한 판다) | frames | Pre-rendered ANSI image frames produced from CC-licensed panda photos via chafa. |
Adding a frames-renderer character of your own:
characters/fubao/ — character.json ("renderer": "frames"), emotion_rules.json, messages.<lang>.json, art.py with RENDERER = "frames".characters/<name>/raw/ as <emotion>_<state>.{jpg,png,webp}.chafa locally (brew install chafa on macOS).uv run scripts/prerender.py <name> — generates frames/{small,medium,large}/*.txt.character enum in .claude-plugin/plugin.json.End users don't need chafa installed — the committed frames/ files are all the runtime needs.
All options live under pluginConfigs["claude-mascot@claude-mascot-marketplace"].options in ~/.claude/settings.json:
| Option | Type | Default | Description |
|---|---|---|---|
character | "nabi" | "fubao" | "nabi" | Which mascot character to display |
language | "ko" | "en" | "ko" | Message language |
paneHeight | number (8–30) | 14 | Height of the tmux pane in rows |
stopHookEnabled | boolean | true | Enable the transcript-scanning fallback at end of every response |
startupEmotion | emotion enum | "happy" | Emotion shown on fresh session start |
Example:
{
"pluginConfigs": {
"claude-mascot@claude-mascot-marketplace": {
"options": {
"language": "en",
"paneHeight": 16,
"startupEmotion": "neutral"
}
}
}
}
Each Claude turn the pane gets updated exactly once:
show_character(emotion, message) during the turn, a session-scoped marker file is written and that message stays on the pane. The Stop hook sees the marker and skips its fallback.Stop hook reads both the last user message and last assistant message from the transcript, runs regex classification, and picks a random line from the matching emotion pool defined in characters/<id>/messages.<lang>.json.| Emotion | Sample keywords |
|---|---|
| angry | 틀렸, 잘못 됐, wrong, mistake, 뒤질, 짜증, 바보, 멍청, angry, shut up |
| happy | 완료, 성공, 해결, done, passed, fixed |
| sad | 에러, 실패, error, failed, broken |
| shy | 감사, 고마, thank, 칭찬, 잘했 |
| surprised | ?!, 어?, wait, 갑자기 |
| neutral | (fallback when nothing matches) |
Exact patterns: characters/nabi/emotion_rules.json.
npx claudepluginhub pptaa/claude-mascot --plugin claude-mascotMemory compression system for Claude Code - persist context across sessions
Editorial "Web Designer" bundle for Claude Code from Antigravity Awesome Skills.
Permanent coding companion for Claude Code — survives any update. MCP-based terminal pet with ASCII art, stats, reactions, and personality.
Claude Code settings and skills for spec-driven development workflows
Full video production pipeline for Remotion — gives Claude eyes (video analysis), voice (TTS/voiceover), ears (music/SFX), stock footage, AI image/video generation, TikTok captions, 3D content, and more. By Dojo Coding Labs.