Feature Description
webcmd has a logo but no character. Nothing greets a fresh npm install -g @agentrhq/webcmd, and webcmd --help opens with wordmark art that carries no personality.

This proposes Weaver: a chunky block spider who drops in on a thread when you install webcmd, and stands beside the wordmark in the help banner.
││
││
││
▓▓ ▓▓
██████████
▓▓██ ● ● ██▓▓
▓▓██ ▾ ██▓▓
██████████
▓▓ ▓▓ ▓▓ ▓▓
In the help banner, beside the existing wordmark:
▓▓ ▓▓ ██╗ ██╗███████╗██████╗ ██████╗███╗ ███╗██████╗
██████████ ██║ ██║██╔════╝██╔══██╗██╔════╝████╗ ████║██╔══██╗
▓▓██ ● ● ██▓▓ ██║ █╗ ██║█████╗ ██████╔╝██║ ██╔████╔██║██║ ██║
▓▓██ ▾ ██▓▓ ██║███╗██║██╔══╝ ██╔══██╗██║ ██║╚██╔╝██║██║ ██║
██████████ ╚███╔███╔╝███████╗██████╔╝╚██████╗██║ ╚═╝ ██║██████╔╝
▓▓ ▓▓ ▓▓ ▓▓ ╚══╝╚══╝ ╚══════╝╚═════╝ ╚═════╝╚═╝ ╚═╝╚═════╝
The seven animation frames, played once on install. The blink swaps ● for ─; the leg rows shift one column as he lands:
|
|
| 01 drops in on a thread |
05 settles |
| 02 descends further |
06 blinks |
| 03 lands, stance shifts |
07 rests |
| 04 bounce |
|
Use Case
The mascot argues for itself on product grounds, not only on taste. A spider that crawls a site once and weaves what it learns into its web is sitemap memory — it draws "explore once, execute forever" without a sentence of explanation.
As a user, I want the install to feel like something arrived, the way it does for other agent CLIs. As a project, webcmd gets a character it can put on docs, stickers, and merchandise later — which a wordmark alone cannot do.
Proposed Solution
src/mascot.ts holds the art, the seven frames, the renderer and the animator. ACCENT_RGB / SHADE_RGB move to src/brand.ts so #56C5FF is declared once and shared with the help banner.
- The sprite joins
ROOT_HELP_BANNER_PARTS as a third column. Total banner width becomes 73 display columns — the wordmark's 52, a two-column gutter, and Weaver's 18 — leaving headroom inside an 80-column terminal. The Hangul-filler spacer row is left untouched.
scripts/postinstall.js animates the drop on a global install; src/hosted/setup.ts greets first-run setup.
docs/webcmd-weaver.svg is a vector twin generated from the same sprite, so the terminal character and the illustrated one cannot drift.
Two constraints shaped the implementation:
The art is filled block glyphs, not box-drawing outlines. Each part of Weaver is a different character (█ body, ▓ legs, ● eyes) rather than the same character in a different color. That keeps color purely additive, which is what preserves the existing invariant at command-presentation.test.ts:170 — stripping ANSI from a colored help screen must return the plain one byte for byte. All 14 existing banner tests pass untouched, including the local/hosted byte-identity assertions.
Animation is gated on the output stream being a TTY, not on prompting being possible. Piped installs get a single static frame with no escape sequences, CI gets nothing (the existing process.env.CI guard), and WEBCMD_NO_MASCOT=1 opts out entirely. webcmd list -f json and the other machine-readable paths are untouched.
14 new tests cover frame geometry (every frame the same size, or the in-place redraw tears), the additive-color property, cursor restoration when a write throws mid-animation, and a guard that the frames inlined in scripts/postinstall.js match src/mascot.ts — that script must run with no build step, so it cannot import the module.
Alternatives Considered
- Half-block
▀ sprites with truecolor foreground and background. Double the vertical resolution, but stripped of ANSI they degrade to a rectangle of identical ▀ characters. That breaks the additive-color invariant and makes piped output meaningless.
- Animating the browser-run spinner. Deliberately left out: that is hot-path output agents parse, and it is a much larger review surface. Worth a follow-up only if this lands well.
- A new character unrelated to the existing mark. Weaver's body is the terminal window from
docs/webcmd.svg with legs, so it reinforces the brand rather than asking for a second identity.
Happy to change the character, the palette, or drop any of the three surfaces — the art lives behind one module, so the placement is easy to trim.
Feature Description
webcmd has a logo but no character. Nothing greets a fresh

npm install -g @agentrhq/webcmd, andwebcmd --helpopens with wordmark art that carries no personality.This proposes Weaver: a chunky block spider who drops in on a thread when you install webcmd, and stands beside the wordmark in the help banner.
In the help banner, beside the existing wordmark:
The seven animation frames, played once on install. The blink swaps
●for─; the leg rows shift one column as he lands:Use Case
The mascot argues for itself on product grounds, not only on taste. A spider that crawls a site once and weaves what it learns into its web is sitemap memory — it draws "explore once, execute forever" without a sentence of explanation.
As a user, I want the install to feel like something arrived, the way it does for other agent CLIs. As a project, webcmd gets a character it can put on docs, stickers, and merchandise later — which a wordmark alone cannot do.
Proposed Solution
src/mascot.tsholds the art, the seven frames, the renderer and the animator.ACCENT_RGB/SHADE_RGBmove tosrc/brand.tsso#56C5FFis declared once and shared with the help banner.ROOT_HELP_BANNER_PARTSas a third column. Total banner width becomes 73 display columns — the wordmark's 52, a two-column gutter, and Weaver's 18 — leaving headroom inside an 80-column terminal. The Hangul-filler spacer row is left untouched.scripts/postinstall.jsanimates the drop on a global install;src/hosted/setup.tsgreets first-run setup.docs/webcmd-weaver.svgis a vector twin generated from the same sprite, so the terminal character and the illustrated one cannot drift.Two constraints shaped the implementation:
The art is filled block glyphs, not box-drawing outlines. Each part of Weaver is a different character (
█body,▓legs,●eyes) rather than the same character in a different color. That keeps color purely additive, which is what preserves the existing invariant atcommand-presentation.test.ts:170— stripping ANSI from a colored help screen must return the plain one byte for byte. All 14 existing banner tests pass untouched, including the local/hosted byte-identity assertions.Animation is gated on the output stream being a TTY, not on prompting being possible. Piped installs get a single static frame with no escape sequences, CI gets nothing (the existing
process.env.CIguard), andWEBCMD_NO_MASCOT=1opts out entirely.webcmd list -f jsonand the other machine-readable paths are untouched.14 new tests cover frame geometry (every frame the same size, or the in-place redraw tears), the additive-color property, cursor restoration when a write throws mid-animation, and a guard that the frames inlined in
scripts/postinstall.jsmatchsrc/mascot.ts— that script must run with no build step, so it cannot import the module.Alternatives Considered
▀sprites with truecolor foreground and background. Double the vertical resolution, but stripped of ANSI they degrade to a rectangle of identical▀characters. That breaks the additive-color invariant and makes piped output meaningless.docs/webcmd.svgwith legs, so it reinforces the brand rather than asking for a second identity.Happy to change the character, the palette, or drop any of the three surfaces — the art lives behind one module, so the placement is easy to trim.