Back to Articles

Theme Your CLI Agent: How Hermes-Skins Uses Braille Art and YAML Cascading for Terminal Aesthetics

[ View on GitHub ]

Theme Your CLI Agent: How Hermes-Skins Uses Braille Art and YAML Cascading for Terminal Aesthetics

Hook

While most developers customize their shell prompts and terminal emulators, few realize you can theme individual CLI applications with the same granularity—including ASCII art, loading spinners, and even the text your AI agent displays while 'thinking'.

Context

Command-line interfaces have always walked a fine line between functionality and personality. Early Unix tools were strictly utilitarian—grep doesn't care about your feelings. But as CLI tools evolved into interactive experiences (think htop, lazygit, or modern package managers), developers started caring about aesthetics. The rise of AI-powered CLI agents like Hermes introduces a new dimension: these tools spend significant time 'thinking' between your input and their response, creating dead air that begs for visual interest.

Hermes-skins emerged from this gap. When your AI agent is processing a complex query, staring at a blinking cursor feels primitive. The repository provides a theming system that lets Hermes users inject personality into their terminal sessions—whether that's the retro green-on-black of 1980s BBSs, the dystopian aesthetic of Cyberpunk's Netrunners, or the ominous red warnings of Alien's MOTHER system. Unlike terminal emulator themes that paint everything with the same brush, hermes-skins operates at the application layer, allowing surgical customization of a single tool without affecting your broader environment.

Technical Insight

The architecture is elegantly minimal: YAML files that declare visual properties, loaded by Hermes's built-in skin engine through cascading inheritance. Each skin lives as a standalone .yaml file in ~/.hermes/skins/, structured around four core sections: colors (28+ distinct keys for different UI elements), branding (ASCII art and product names), spinner text (the messages displayed during processing), and metadata.

Here's a dissection of the Cyberpunk-inspired 'netrunner' skin:

name: "netrunner"
author: "joeynyc"
version: "1.0"

colors:
  primary: "#00ff41"          # Classic Matrix green
  secondary: "#ff006e"        # Hot pink accent
  error: "#ff3864"            # Neon red
  warning: "#ffbe0b"          # Electric yellow
  info: "#00b4d8"             # Cyber blue
  prompt: "#00ff41"
  response_text: "#e0e0e0"
  thinking_spinner: "#ff006e"

branding:
  banner: |
    ⣿⣿⣿⡇⢸⣿⣿⣿
    ⣿⣿⣿⡇⢸⣿⣿⣿  N E T R U N N E R
    ⠿⠿⠿⠇⠸⠿⠿⠿  jacking in...
  product_name: "HERMES//NR"
  tagline: "ghost in the shell"

spinner:
  verbs:
    - "breaching ICE"
    - "spoofing credentials"
    - "routing through proxies"
    - "decrypting response"

The color system goes far beyond simple foreground/background pairs. Hermes's skin engine maps these 28+ keys to specific UI components: prompt controls the color of your input line, thinking_spinner affects the loading animation, error and warning create visual hierarchy in output messages, and granular keys like code_block_border and table_header style structured data differently from prose.

The braille art deserves special attention. Standard ASCII art uses characters like #, *, and @ to create images, but braille Unicode characters (U+2800 through U+28FF) offer 256 patterns per character cell, enabling far more detailed graphics in the same terminal space. The pattern ⣿⣿⣿⡇⢸⣿⣿⣿ creates a stylized border that would require 3-4x more characters with traditional ASCII. This is critical for banner art that needs to render quickly without scrolling the actual content off-screen.

The cascading inheritance model is where the architecture gets clever. Users can create minimal skins that override just a few values:

name: "midnight"

colors:
  primary: "#4a5568"
  secondary: "#718096"
  error: "#fc8181"

When Hermes loads this skin, its skin_engine.py merges it over the default skin—any undefined keys (branding, spinner verbs, the other 25 color values) inherit from the base theme. This prevents repetition and allows rapid experimentation. Want to test a new color scheme? Change three lines. The engine uses Python's dictionary merge with the default skin as the base layer, user skin as the override layer, and explicit None checks to preserve intentional minimalism.

The spinner verbs add narrative flavor that conventional loading indicators lack. Instead of generic 'Loading...' text, themed skins inject contextual messages. The 'vault-tec' Fallout theme displays verbs like 'consulting Mr. Handy', 'checking radiation levels', and 'accessing vault database'—turning wait time into environmental storytelling. Hermes cycles through these strings randomly during processing, so a 10-second query might show three different messages, maintaining visual interest.

From a maintenance perspective, the repository's structure is intentionally flat—no complex directory hierarchies, no build process, no dependencies beyond YAML parsing. Each skin is self-contained, making contribution trivial: fork, add a YAML file, submit a PR. This low barrier has resulted in 30+ community-contributed themes ranging from 'dracula' (the ubiquitous purple scheme) to 'telemate' (a loving recreation of 1990s BBS terminal software).

Gotcha

The most obvious limitation is hard dependency: hermes-skins has zero standalone value. If you don't use the Hermes CLI agent, these YAML files are digital paperweights. Unlike Starship prompts or Oh My Zsh themes that enhance general terminal usage, this repository enhances exactly one tool. If Hermes development stalls or you switch to a different CLI agent, your theme collection becomes instant legacy code.

The cosmetic-only nature cuts both ways. While the 'vault-tec' skin displays Fallout branding and themed spinner text, it doesn't change how Hermes behaves functionally. The AI model, response quality, and command parsing remain identical—you're just looking at different colors and ASCII art. For developers who prioritize function over form, investing time in theme customization offers no productivity return. The 'MOTHER' Alien theme won't make your code reviews faster; it just makes them spookier.

Terminal environment compatibility presents practical friction. Unicode braille art requires UTF-8 support and fonts with complete braille glyph coverage. Older terminal emulators, Windows Command Prompt (pre-Windows Terminal), or SSH sessions into legacy systems may render banner art as blank boxes or question marks. The 28-color system assumes at minimum 256-color terminal support—developers still using 16-color profiles will see degraded output where carefully chosen accent colors collapse into basic ANSI equivalents. Testing your custom skin across environments (local terminal, tmux sessions, different SSH hosts) becomes necessary if you work in heterogeneous infrastructure.

Verdict

Use if: You're an active Hermes CLI agent user who spends significant terminal time and values aesthetic customization—the theming system is well-designed and the community themes offer instant personality injection. Also use if you're building your own CLI tool and want to study a minimal, elegant approach to user-facing theme systems; the cascading inheritance model and separation of concerns (colors/branding/dynamic text) provide a clean reference implementation. Finally, use if you appreciate retro computing aesthetics or pop culture references in your tooling; the existing theme collection is legitimately fun for cyberpunk fans, Fallout enthusiasts, or anyone nostalgic for 1990s BBS culture. Skip if: You don't use Hermes and have no plans to adopt it—this repository has zero applicability outside that ecosystem. Skip if you're philosophically opposed to 'unproductive' terminal customization and prefer stock interfaces; the cosmetic-only nature means you're investing time for aesthetic returns, not functional improvements. Skip if you work primarily in constrained environments (legacy terminals, corporate SSH bastions, embedded systems) where Unicode and color support are unreliable; you'll spend more time debugging rendering issues than enjoying themes.