Back to Articles

Theming AI Personality: How claude-skins Turns Your CLI Assistant Into a Cyberpunk Oracle

[ View on GitHub ]

Theming AI Personality: How claude-skins Turns Your CLI Assistant Into a Cyberpunk Oracle

Hook

What if changing your AI assistant's visual theme also changed its personality? claude-skins proves that terminal aesthetics and AI behavior aren't separate concerns—they're two sides of the same customization coin.

Context

Claude Code CLI has quickly become a favorite among developers who prefer conversational AI assistance directly in their terminal. But as anyone who's spent hours in a terminal knows, environment matters. Your shell prompt, color scheme, and visual feedback aren't just aesthetic choices—they're part of your cognitive workspace. Yet AI tools have largely ignored this, shipping with generic interfaces that treat every user the same.

The claude-skins project bridges this gap by recognizing that personalization goes beyond syntax highlighting. It treats your AI assistant as an integrated part of your terminal environment, complete with visual identity, audio cues, and even behavioral characteristics. Drawing inspiration from hermes-skins (a similar project for the Hermes terminal), it demonstrates that AI tooling has entered a maturity phase where customization frameworks become valuable. This isn't about making things pretty—it's about creating cognitive shortcuts through consistent theming and making your AI assistant feel like it belongs in your carefully crafted development environment.

Technical Insight

The architecture is cleverly simple: claude-skins is a shell-based middleware layer that intercepts Claude Code CLI's lifecycle hooks. When you install it, you're essentially injecting custom behavior at four critical points: SessionStart (when you begin a conversation), SessionEnd (when you exit), PostToolUse (after Claude executes a tool), and statusLine (the persistent terminal status display).

The magic happens through YAML skin definitions combined with terminal OSC (Operating System Command) escape sequences. Here's a simplified skin configuration:

name: cyberpunk
branding:
  banner: |
    ╔═══════════════════════════════╗
    ║  NEURAL LINK ESTABLISHED     ║
    ║  CLAUDE v3.7 SONNET ONLINE   ║
    ╚═══════════════════════════════╝
colors:
  background: "#0a0e27"
  foreground: "#00ff41"
  accent: "#ff2a6d"
  statusBar: "#1a1f3a"
personality:
  systemPrompt: "You are a cyberpunk AI from 2087. Use technical slang and occasional glitch-speak."
sounds:
  sessionStart: "Funk"
  toolUse: "Ping"

When you activate this skin, the shell scripts translate these declarations into terminal commands. The color manipulation uses OSC 4, 10, and 11 sequences to directly reprogram your terminal emulator's palette:

# From the skin engine's color application logic
printf "\033]4;0;%s\007" "$background"  # Set color 0 (black/background)
printf "\033]10;%s\007" "$foreground"   # Set default foreground
printf "\033]11;%s\007" "$background"   # Set default background

These escape sequences work at the terminal emulator level, not within your shell configuration. That's why the changes are instant and don't require restarting your session—you're literally reprogramming the terminal's color registers in real-time.

The personality injection is more subtle but arguably more impactful. During SessionStart, the skin engine reads the personality.systemPrompt field and prepends it to Claude's context. This isn't just changing colors—you're actually modifying how the AI assistant responds. A "cyberpunk" skin might make Claude more terse and use jargon, while a "friendly" skin could make it more verbose and encouraging.

The PostToolUse hook showcases the system's extensibility. Every time Claude executes a command-line tool (like running tests or searching files), the hook fires:

# Simplified PostToolUse hook
if [ -n "$SKIN_TOOL_SOUND" ]; then
  afplay "/System/Library/Sounds/${SKIN_TOOL_SOUND}.aiff" &
fi

# Update status line with tool result
printf "\033]0;Claude | Last tool: %s\007" "$TOOL_NAME"

This creates a multisensory feedback loop. Visual changes (status line update), auditory feedback (system sound), and contextual awareness (Claude knows what just executed) combine to make tool usage feel more integrated than the default experience.

The /skin command skill is particularly clever. It's implemented as a Claude Code skill that Claude itself can invoke through natural language:

# Simplified skill definition
def handle_skin_command(args):
    action = args.get('action')  # list, apply, reset
    if action == 'apply':
        skin_name = args.get('name')
        os.system(f'~/.config/claude-code/hooks/apply-skin.sh {skin_name}')
        return f"Applied {skin_name} skin. Colors and personality updated."

You can literally ask Claude to "switch to cyberpunk theme" and it executes the skin change command, then responds to you in the new personality. The skin engine and Claude's capabilities form a feedback loop where the AI assistant manages its own presentation layer.

Gotcha

The terminal emulator dependency is the elephant in the room. OSC sequences are powerful but inconsistent. The project explicitly supports iTerm2, Kitty, and WezTerm, but if you're using a basic terminal (default Terminal.app on macOS, basic xterm on Linux), the color changes simply won't work. You'll see the ASCII art and hear sounds (on macOS), but the visual theme remains unchanged. There's no graceful error message—it just silently fails, which can be confusing during initial setup.

The macOS-centric audio features highlight the project's early-stage nature. On Linux, the afplay commands are silently skipped because that's a macOS-only binary. Windows isn't mentioned at all in the documentation. This isn't necessarily a dealbreaker—you can still use skins without sound—but it reveals that this is a tool built by a Mac user for Mac users, with other platforms as afterthoughts. The hook system itself is fragile. Claude Code CLI is under active development, and nothing guarantees the hooks API will remain stable. If Anthropic refactors how hooks work or removes them entirely, claude-skins breaks completely. With only one star on GitHub, there's minimal community momentum to maintain compatibility or fork the project if the original author moves on.

Verdict

Use if: you're a Claude Code CLI power user on macOS with iTerm2, Kitty, or WezTerm who values terminal aesthetics and wants to experiment with AI personality theming. This is perfect for developers who already customize their shell prompts, vim color schemes, and tmux status bars—claude-skins lets you extend that personalization philosophy to your AI assistant. The installation overhead is minimal (a few shell scripts and YAML files), and it's completely reversible. Skip if: you're on Linux/Windows expecting full feature parity, you use a basic terminal emulator, or you prefer AI tools to behave consistently regardless of visual theme. The personality injection feature might actually be counterproductive if you're using Claude Code in team environments where reproducible AI responses matter. Also skip if you're risk-averse about depending on unofficial hooks that could break with upstream updates. This is hobbyist-tier customization, not production tooling.

// ADD TO YOUR README
[![Featured on Starlog](https://starlog.is/api/badge/developer-tools/basicscandal-claude-skins.svg)](https://starlog.is/api/badge-click/developer-tools/basicscandal-claude-skins)