OptionalCreativeVersion 4.0.0

ASCII Art Skill for Hermes Agent: Banners, Cowsay, Boxes, Images

ASCII art: pyfiglet, cowsay, boxes, image-to-ascii.

Written by Neura Market from the official Hermes Agent documentation for Ascii Art. Commands, paths, and version numbers are reproduced from the source unchanged.

Read the official documentation

The ASCII Art skill gives a Hermes Agent nine different ways to produce text art: FIGlet banners, cowsay characters, decorative boxes, colored toilet output, image conversion, and a handful of remote services. It is an optional creative skill, so you install it when a task calls for terminal art rather than shipping it with every agent. Reach for it when you need a banner for a README, a framed notice, a quick QR code in the terminal, or a way to turn a screenshot into something you can paste into a chat.

What it does

The skill is a routing layer over existing command-line programs and free HTTP endpoints. Nothing here requires an API key. Some tools run locally (pyfiglet, cowsay, boxes, toilet, ascii-image-converter, jp2a); others are plain curl calls against public services (asciified, ascii.co.uk, the GitHub Octocat endpoint, qrenco.de, wttr.in). The skill's job is to pick the right one for the request and to know the fallback when a tool is missing.

In practice you will use it for four kinds of output: large text banners, character-wrapped messages, framed text, and converted images. A fifth category covers pre-made art and small utilities like QR codes and weather reports. The final section describes generating art directly with a Unicode palette when nothing else fits.

Before you start

The skill is optional and installed on demand. Its path is optional-skills/creative/ascii-art, version 4.0.0, authored by 0xbyt4 and Hermes Agent, under the MIT license. It is listed for linux, macos, and windows.

Each tool has its own prerequisite, and the source is explicit about which ones need installation:

  • pyfiglet needs pip install pyfiglet --break-system-packages -q.
  • cowsay and boxes are installed through the system package manager (sudo apt install on Debian/Ubuntu, brew install on macOS).
  • toilet needs toilet and toilet-fonts on Debian/Ubuntu, or brew install toilet on macOS.
  • ascii-image-converter is installed via snap or go install.
  • jp2a is installed via sudo apt install jp2a -y.
  • The asciified API, ascii.co.uk, the Octocat endpoint, qrenco.de, and wttr.in need only curl and network access.

Nothing in the source states that any of these tools are pre-installed. Treat every local tool as something you may need to install before the skill can use it, and prefer the remote alternatives when installation is not an option.

Tool 1: Text banners with pyfiglet

pyfiglet renders a string as large ASCII lettering using FIGlet fonts. The source lists 571 built-in fonts, which is enough that font choice becomes the main creative decision.

Setup

pip install pyfiglet --break-system-packages -q

Usage

python -m pyfiglet "YOUR TEXT" -f slant
python -m pyfiglet "TEXT" -f doom -w 80    # Set width
python -m pyfiglet --list_fonts             # List all 571 fonts

The first command renders your text in the slant font. The second sets an explicit width of 80 columns, which matters when the default output would wrap or overflow. The third prints every available font name, useful when you want to try something the recommended list does not cover.

Recommended fonts

StyleFontBest for
Clean & modernslantProject names, headers
Bold & blockydoomTitles, logos
Big & readablebigBanners
Classic bannerbanner3Wide displays
CompactsmallSubtitles
CyberpunkcyberlargeTech themes
3D effect3-dSplash screens
GothicgothicDramatic text

Tips

  • Preview 2-3 fonts and let the user pick their favorite
  • Short text (1-8 chars) works best with detailed fonts like doom or block
  • Long text works better with compact fonts like small or mini

The font table is a starting point, not a rule. Detailed fonts need short input because each glyph is wide; compact fonts keep long strings from spilling across the terminal. When the user has no preference, showing two or three candidates is faster than guessing.

Tool 2: Text banners with the asciified API

When pyfiglet is not installed, or when you want a banner without touching the local environment, the asciified service does the same job over HTTP. It supports 250+ FIGlet fonts and returns plain text, so there is nothing to parse.

Usage (via terminal curl)

# Basic text banner (default font)
curl -s "https://asciified.thelicato.io/api/v2/ascii?text=Hello+World"

# With a specific font
curl -s "https://asciified.thelicato.io/api/v2/ascii?text=Hello&font=Slant"
curl -s "https://asciified.thelicato.io/api/v2/ascii?text=Hello&font=Doom"
curl -s "https://asciified.thelicato.io/api/v2/ascii?text=Hello&font=Star+Wars"
curl -s "https://asciified.thelicato.io/api/v2/ascii?text=Hello&font=3-D"
curl -s "https://asciified.thelicato.io/api/v2/ascii?text=Hello&font=Banner3"

# List all available fonts (returns JSON array)
curl -s "https://asciified.thelicato.io/api/v2/fonts"

Tips

  • URL-encode spaces as + in the text parameter
  • The response is plain text ASCII art, no JSON wrapping, ready to display
  • Font names are case-sensitive; use the fonts endpoint to get exact names
  • Works from any terminal with curl, no Python or pip needed

The case sensitivity is the detail that trips people up. Slant and slant are not interchangeable here, even though pyfiglet accepts the lowercase form. If a font request fails, query the fonts endpoint first and copy the name exactly.

Tool 3: Cowsay for message art

cowsay wraps a message in a speech bubble attached to an ASCII character. It is the right choice when the text itself is the point and you want it delivered with personality rather than scale.

Setup

sudo apt install cowsay -y    # Debian/Ubuntu
# brew install cowsay         # macOS

Usage

cowsay "Hello World"
cowsay -f tux "Linux rules"       # Tux the penguin
cowsay -f dragon "Rawr!"          # Dragon
cowsay -f stegosaurus "Roar!"     # Stegosaurus
cowthink "Hmm..."                  # Thought bubble
cowsay -l                          # List all characters

The -f flag selects the character file. cowthink swaps the speech bubble for a thought bubble. cowsay -l prints the available character names, which is the fastest way to confirm what is installed on a given machine.

Available characters (50+)

beavis.zen, bong, bunny, cheese, daemon, default, dragon, dragon-and-cow, elephant, eyes, flaming-skull, ghostbusters, hellokitty, kiss, kitty, koala, luke-koala, mech-and-cow, meow, moofasa, moose, ren, sheep, skeleton, small, stegosaurus, stimpy, supermilker, surgery, three-eyes, turkey, turtle, tux, udder, vader, vader-koala, www

Eye/tongue modifiers

cowsay -b "Borg"       # =_= eyes
cowsay -d "Dead"       # x_x eyes
cowsay -g "Greedy"     # $_$ eyes
cowsay -p "Paranoid"   # @_@ eyes
cowsay -s "Stoned"     # *_* eyes
cowsay -w "Wired"      # O_O eyes
cowsay -e "OO" "Msg"   # Custom eyes
cowsay -T "U " "Msg"   # Custom tongue

The single-letter flags change the character's expression without changing the character. -e and -T take a string argument, so you can supply your own eye and tongue glyphs when the presets do not fit the tone.

Tool 4: Boxes for decorative borders

boxes draws a frame around whatever text you pipe into it. The source lists 70+ built-in designs, ranging from plain borders to themed art.

Setup

sudo apt install boxes -y    # Debian/Ubuntu
# brew install boxes         # macOS

Usage

 echo "Hello World" | boxes                    # Default box
echo "Hello World" | boxes -d stone           # Stone border
echo "Hello World" | boxes -d parchment       # Parchment scroll
echo "Hello World" | boxes -d cat             # Cat border
echo "Hello World" | boxes -d dog             # Dog border
echo "Hello World" | boxes -d unicornsay      # Unicorn
echo "Hello World" | boxes -d diamonds        # Diamond pattern
echo "Hello World" | boxes -d c-cmt           # C-style comment
echo "Hello World" | boxes -d html-cmt        # HTML comment
echo "Hello World" | boxes -a c               # Center text
boxes -l                                       # List all 70+ designs

The -d flag picks the design. -a c centers the text inside the frame. boxes -l lists every design available on the system. The c-cmt and html-cmt designs are worth remembering when the output is going into source code rather than a terminal: they produce comment syntax instead of a visual border.

Combine with pyfiglet or asciified

python -m pyfiglet "HERMES" -f slant | boxes -d stone
# Or without pyfiglet installed:
curl -s "https://asciified.thelicato.io/api/v2/ascii?text=HERMES&font=Slant" | boxes -d stone

Piping a banner into boxes is the most common composition in this skill. Both variants produce the same result; the second exists so the pipeline still works on a machine without Python.

Tool 5: TOIlet for colored text art

TOIlet is a FIGlet-style renderer with ANSI color effects and visual filters. Use it when the output is going to a real terminal and you want color, not when it is going into a file or a chat message.

Setup

sudo apt install toilet toilet-fonts -y    # Debian/Ubuntu
# brew install toilet                      # macOS

Usage

toilet "Hello World"                    # Basic text art
toilet -f bigmono12 "Hello"            # Specific font
toilet --gay "Rainbow!"                 # Rainbow coloring
toilet --metal "Metal!"                 # Metallic effect
toilet -F border "Bordered"             # Add border
toilet -F border --gay "Fancy!"         # Combined effects
toilet -f pagga "Block"                 # Block-style font (unique to toilet)
toilet -F list                          # List available filters

-f selects the font, --gay and --metal apply color effects, and -F applies a filter. Filters and color effects can be combined, as the border --gay example shows. toilet -F list prints the filters available on the installed version.

Filters

crop, gay (rainbow), metal, flip, flop, 180, left, right, border

Note: toilet outputs ANSI escape codes for colors, works in terminals but may not render in all contexts (e.g., plain text files, some chat platforms).

That caveat is the deciding factor for toilet. If the destination strips or displays escape codes literally, the output will be unreadable. Check where the art is going before choosing this tool over pyfiglet.

Tool 6: Image to ASCII art

The skill covers two converters for PNG, JPEG, GIF, and WEBP input. They differ in installation method and format support.

Option A: ascii-image-converter (recommended, modern)

# Install
sudo snap install ascii-image-converter
# OR: go install github.com/TheZoraiz/ascii-image-converter@latest
ascii-image-converter image.png                  # Basic
ascii-image-converter image.png -C               # Color output
ascii-image-converter image.png -d 60,30         # Set dimensions
ascii-image-converter image.png -b               # Braille characters
ascii-image-converter image.png -n               # Negative/inverted
ascii-image-converter https://url/image.jpg      # Direct URL
ascii-image-converter image.png --save-txt out   # Save as text

The flags map to distinct output styles: -C for color, -b for Braille glyphs, -n for an inverted rendering, -d for explicit width and height. It also accepts a URL directly, which saves a download step, and --save-txt writes the result to a text file.

Option B: jp2a (lightweight, JPEG only)

sudo apt install jp2a -y
jp2a --width=80 image.jpg
jp2a --colors image.jpg              # Colorized

jp2a is the smaller option, but the source labels it JPEG only. If the input is PNG, GIF, or WEBP, use ascii-image-converter instead.

Tool 7: Search pre-made ASCII art

Sometimes the fastest answer is art someone already drew. The skill uses curl to fetch it.

Source A: ascii.co.uk (recommended for pre-made art)

ascii.co.uk organizes classic ASCII art by subject. The art sits inside HTML <pre> tags, so the workflow is: fetch the page, then extract the art with a short Python script.

URL pattern: https://ascii.co.uk/art/{subject}

Step 1, Fetch the page:

curl -s 'https://ascii.co.uk/art/cat' -o ~/.hermes/cache/scratch/ascii_art.html

Step 2, Extract art from pre tags:

import os, re, html
with open(os.path.expanduser('~/.hermes/cache/scratch/ascii_art.html')) as f:
    text = f.read()
arts = re.findall(r'<pre[^>]*>(.*?)</pre>', text, re.DOTALL)
for art in arts:
    clean = re.sub(r'<[^>]+>', '', art)
    clean = html.unescape(clean).strip()
    if len(clean) > 30:
        print(clean)
        print('\n---\n')

The script reads the saved HTML, pulls every <pre> block, strips remaining tags, unescapes HTML entities, and prints pieces longer than 30 characters. The length filter removes fragments that are too small to be useful.

Available subjects (use as URL path):

  • Animals: cat, dog, horse, bird, fish, dragon, snake, rabbit, elephant, dolphin, butterfly, owl, wolf, bear, penguin, turtle
  • Objects: car, ship, airplane, rocket, guitar, computer, coffee, beer, cake, house, castle, sword, crown, key
  • Nature: tree, flower, sun, moon, star, mountain, ocean, rainbow
  • Characters: skull, robot, angel, wizard, pirate, ninja, alien
  • Holidays: christmas, halloween, valentine

Tips:

  • Preserve artist signatures/initials, important etiquette
  • Multiple art pieces per page, pick the best one for the user
  • Works reliably via curl, no JavaScript needed

The signature rule matters. Pre-made art often carries the artist's initials, and stripping them is bad form. When a page returns several pieces, choose one rather than dumping the whole set.

Source B: GitHub Octocat API (fun easter egg)

Returns a random GitHub Octocat with a wise quote. No auth needed.

curl -s https://api.github.com/octocat

This is a one-line call with no parameters. It is a novelty, not a production tool.

Tool 8: Fun ASCII utilities via curl

Two public services return ASCII art directly and need nothing installed.

QR Codes as ASCII Art

curl -s "qrenco.de/Hello+World"
curl -s "qrenco.de/https://example.com"

qrenco.de renders the supplied string as a QR code in ASCII. It is useful when you want a scannable code in a terminal or a plain-text document.

Weather as ASCII Art

curl -s "wttr.in/London"          # Full weather report with ASCII graphics
curl -s "wttr.in/Moon"            # Moon phase in ASCII art
curl -s "v2.wttr.in/London"       # Detailed version

wttr.in returns a weather report with ASCII graphics for the named location. The Moon path returns the moon phase instead. The v2 host serves a more detailed report.

Tool 9: LLM-generated custom art as fallback

When none of the tools above fit, the skill falls back to generating art directly with a fixed Unicode palette.

Character Palette

Box Drawing: ╔ ╗ ╚ ╝ ║ ═ ╠ ╣ ╦ ╩ ╬ ┌ ┐ └ ┘ │ ─ ├ ┤ ┬ ┴ ┼ ╭ ╮ ╰ ╯

Block Elements: ░ ▒ ▓ █ ▄ ▀ ▌ ▐ ▖ ▗ ▘ ▝ ▚ ▞

Geometric & Symbols: ◆ ◇ ◈ ● ○ ◉ ■ □ ▲ △ ▼ ▽ ★ ☆ ✦ ✧ ◀ ▶ ◁ ▷ ⬡ ⬢ ⌂

Rules

  • Max width: 60 characters per line (terminal-safe)
  • Max height: 15 lines for banners, 25 for scenes
  • Monospace only: output must render correctly in fixed-width fonts

The width and height caps exist because terminal rendering is the target. Exceeding 60 columns risks wrapping, and tall scenes push everything else off screen. The monospace rule is about alignment: box-drawing and block characters only line up in a fixed-width font.

Decision flow

The source closes with a routing table. It is worth internalizing because the skill's value is mostly in choosing the right tool quickly.

  1. Text as a banner → pyfiglet if installed, otherwise asciified API via curl
  2. Wrap a message in fun character art → cowsay
  3. Add decorative border/frame → boxes (can combine with pyfiglet/asciified)
  4. Art of a specific thing (cat, rocket, dragon) → ascii.co.uk via curl + parsing
  5. Convert an image to ASCII → ascii-image-converter or jp2a
  6. QR code → qrenco.de via curl
  7. Weather/moon art → wttr.in via curl
  8. Something custom/creative → LLM generation with Unicode palette
  9. Any tool not installed → install it, or fall back to next option

The last rule is the one that keeps the skill usable on a bare machine. Every local tool has a remote or generated fallback, so a missing dependency degrades the result rather than blocking the task.

When not to use it

The source does not list explicit exclusions, but two of its own notes point away from certain tools in certain contexts. TOIlet's ANSI output is unsuitable for plain text files and some chat platforms, so use pyfiglet or asciified when the destination is not a live terminal. jp2a is JPEG only, so non-JPEG images should go through ascii-image-converter. For anything that needs a diagram rather than text art, the related excalidraw skill is the better fit.

Limits and gotchas

  • Font names on the asciified API are case-sensitive. Query the fonts endpoint to get exact names.
  • Spaces in asciified text parameters must be URL-encoded as +.
  • TOIlet color output uses ANSI escape codes and may not render in all contexts.
  • jp2a handles JPEG only.
  • LLM-generated art must stay within 60 characters per line, 15 lines for banners, and 25 lines for scenes, and must use monospace-safe characters.
  • Pre-made art from ascii.co.uk may carry artist signatures; preserve them.
  • Every local tool in this skill may need installation first. The source does not state that any of them ship pre-installed.

What pairs with it

For diagrams and structured visuals rather than text art, the source points to the excalidraw skill. The two cover different needs: excalidraw for drawn diagrams, ASCII Art for terminal-friendly text output.

Skills the docs pair this with

More Creative skills