Blot
Character · riso look
A recurring mascot performs the idea; the look and palette are just parameters.
An agent skill for editorial illustrations. One character pack carries one of 17 looks, a palette resolves on top, and a Python engine renders through a subscription CLI, OpenRouter or the agent’s own image tool. I read the skill, ran the 121-test suite and every engine subcommand. This is a configurable house style, not a generic image generator.
Writers who want a consistent illustrated voice across posts, decks and docs.
One image per idea: an editorial scene, an explainer diagram, a mini-comic or a transparent cutout.
Five registers share one workflow: preflight, read and clarify, resolve the character, resolve the palette, generate reference-locked.
One idea per image. One image explains one idea: a key judgment, a flow, a before/after, a trap, a loop.
The mascot is the subject. A recurring mascot is the one performing the idea in every scene — the subject, never decoration.
Look travels with the pack. a character pack carries its style with it.
Explainers are pack-solved. A named pipeline or recipe is labeled stages inside that register — named phases in order, one connected system, pack-solved for this body, never a new look.
Keys are the user’s. Entering an API key is something the user does.
Pick a look. The tag is the file’s own opening; How it works lists its QA checks; quotes are its STYLE line and classic default palette, checked at build time.
Characters from the community packs, look samples, riso palette studies, explainers and a cutout comparison across backends. Click to enlarge.
Character · riso look
Character · woodcut look
Character · blueprint look
Character · riso look
Character · snes look
Character · fizz look
Character · enamel look
Character · riso look
Character · gouache look
Character · riso look
Character · chalk look
Character · gouache look
Character · sketchbook look
Character · riso look
Character · sketchbook look
Character · pixel look
Character · bloom look
Character · bricks look
Character · snes look
Character · pixel look
Character · woodcut look
Character · chalk look
Character · fizz look
Character · bricks look
Character · chalk look
Character · blueprint look
Character · phosphor look
Character · sketchbook look
Character · snes look
Character · bloom look
Character · clay look
Character · woodcut look
Character · bricks look
Character · manila look
Character · riso look
Character · bloom look
Character · felt look
Character · felt look
Character · fizz look
Character · felt look
Character · blueprint look
Character · felt look
Character · sketchbook look
Character · phosphor look
Character · clay look
Character · pixel look
Character · diorama look
Character · riso look
Character · chalk look
Character · manila look
Character · phosphor look
Character · bloom look
Character · enamel look
Character · pixel look
Character · diorama look
Character · diorama look
Character · snes look
Character · blueprint look
Look sample
Look sample
Look sample
Look sample
Look sample
Look sample
Look sample
Look sample
Look sample
Look sample
Riso palette study
Riso palette study
Riso palette study
Riso palette study
Riso palette study
Explainer register
Explainer register
Explainer register
Explainer register
Explainer register
Explainer register
Cutout backend comparison
Cutout backend comparison
Cutout backend comparison
Cutout backend comparison
Cutout backend comparison
Cutout backend comparison
scripts/illo.py is the only renderer. I ran each subcommand with a throwaway HOME so nothing touched a real config.
All runs used HOME=/tmp/illohome, nice and timeout, at commit 0b0abee.
| Run | Result | Note |
|---|---|---|
| pytest tests/ | 121 passed, 37 subtests | Run in a venv on the box. |
| doctor | exit 0 | No backend ready; points Grok Bot at the native path. |
| packs list / show | 57 packs | Fetches the community repo over the network. |
| generate, no backend | exit 1 | Clear setup message. A positional prompt is rejected; --prompt or --prompt-file is required. |
| generate --backend grok-bot | refused | Correct: native renders are agent-side. |
| keyout magenta test | RGBA PNG | Works; the manifest record says muse-native. |
| diagram_route.py | routes correctly | 5 phrasings matched composition.md. |
| repair-hermes-assets.sh | all OK | Nothing re-downloaded. |
| git status after runs | clean | newrun writes only to /tmp/illo. |
The record keyout writes always says "backend": "muse-native", so a Grok Bot cutout is mislabeled in the manifest and gallery.
It treats every argument as a request, so --help prints “editorial editorial default”.
The Grok Bot and Muse native flows live in SKILL.md; the engine only refuses them and records afterward.
Listing community packs fetches the remote repo on every call.
--allow-paid-fallback must be set before a subscription failure can spend OpenRouter credits.
diagram_route.py parses composition.md and is tested against it, so the prose and the code cannot drift.
Separate method from parameters. Character, look and palette are swappable files; the workflow never changes.
Make identity a technique. Riso is grain, offset and flat fills, not a color, so any palette still reads as the house style.
Anchor sets on the first good image. Every later render references the first one that passes the quality bar.
Write a manifest line per render. Galleries, comparisons and audits come for free.
Keep keys with the user. The agent runs init only for keyless native transports.
Each quote on this page is compared with its source file at build time; the build fails on any mismatch.