render-icon-pipeline
About
This skill runs a visualization pipeline to render icons from existing glyphs for skills, agents, and teams. It handles palette generation, data building, manifest creation, and icon rendering. Developers must always use the `build.sh` script as the entry point, never calling Rscript directly.
Quick Install
Claude Code
Recommendednpx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/render-icon-pipelineCopy and paste this command in Claude Code to install this skill
Documentation
Render Icon Pipeline
Run viz pipeline end-to-end → render icons from existing glyphs. Palette gen, data build, manifest create, icon render for skills, agents, teams.
Canonical entry: bash viz/build.sh [flags] from project root, or bash build.sh [flags] from viz/. Script handles platform detection (WSL, Docker, native), R binary select, step ordering. Never call Rscript direct for build scripts — that path only for MCP server config.
Use When
- After create/modify glyph fns
- After add new skills, agents, teams to registries
- Icons need re-render for new/updated palettes
- Full pipeline rebuild (after infra changes)
- Setting up viz env first time
In
- Optional: Entity type —
skill,agent,team,all(defaultall) - Optional: Palette — specific name or
all(defaultall) - Optional: Domain filter — specific domain for skill icons (e.g.
git,design) - Optional: Render mode —
full,incremental,dry-run(defaultincremental)
Do
Step 1: Verify Prereqs
Ensure env ready for rendering.
- Confirm
viz/build.shexists:ls -la viz/build.sh - Verify Node.js available:
node --version - Check
viz/config.ymlexists (platform-specific R path profiles):ls viz/config.yml
build.sh handles R binary resolution auto — no need verify R paths manually. WSL → /usr/local/bin/Rscript (WSL-native R), Docker → container R, native Linux/macOS → Rscript from PATH.
→ build.sh, Node.js, config.yml present.
If err: config.yml missing → pipeline falls back to system defaults. Node.js missing → install via nvm.
Step 2: Run Pipeline
build.sh exec 5 steps in order:
- Generate palette colors (R) →
palette-colors.json+colors-generated.js - Build data (Node) →
skills.json - Build manifests (Node) →
icon-manifest.json,agent-icon-manifest.json,team-icon-manifest.json - Render icons (R) →
icons/+icons-hd/WebP files - Generate terminal glyphs (Node) →
cli/lib/glyph-data.json
Full pipeline (all types, all palettes, std + HD):
bash viz/build.sh
Incremental (skip icons existing on disk):
bash viz/build.sh --skip-existing
Single domain (skills only):
bash viz/build.sh --only design
Single entity type:
bash viz/build.sh --type skill
bash viz/build.sh --type agent
bash viz/build.sh --type team
Dry run (preview no rendering):
bash viz/build.sh --dry-run
Std size only (skip HD):
bash viz/build.sh --no-hd
All flags after build.sh passed through to build-all-icons.R.
→ Icons rendered to viz/public/icons/<palette>/ + viz/public/icons-hd/<palette>/.
If err:
- renv hang on NTFS: viz
.Rprofilebypassesrenv/activate.R+ sets.libPaths()direct. Ensure run fromviz/(build.sh does auto viacd "$(dirname "$0")") - Missing R pkgs: Run
Rscript -e "install.packages(c('ggplot2', 'ggforce', 'ggfx', 'ragg', 'magick', 'future', 'furrr', 'digest'))"from R env build.sh selects - No glyph mapped: Entity needs glyph fn — use
create-glyphbefore rendering
Step 3: Verify Output
Confirm render completed.
- Check file counts match:
find viz/public/icons/cyberpunk -name "*.webp" | wc -l find viz/public/icons-hd/cyberpunk -name "*.webp" | wc -l - Check reasonable file sizes (2-80 KB per icon)
- Run
audit-icon-pipelinefor comprehensive check
→ File counts match manifest entry counts. Sizes in expected range.
If err: counts don't match → some glyphs errored during render. Check build log for [ERROR] lines.
CLI Flag Reference
All flags passed through build.sh → build-all-icons.R:
| Flag | Default | Description |
|---|---|---|
--type <types> | all | Comma-separated: skill, agent, team |
--palette <name> | all | Single palette or all (9 palettes) |
--only <filter> | none | Domain (skills) or entity ID (agents/teams) |
--skip-existing | off | Skip icons with existing WebP files |
--dry-run | off | List what would be generated |
--size <n> | 512 | Output dimension in pixels |
--glow-sigma <n> | 4 | Glow blur radius |
--workers <n> | auto | Parallel workers (detectCores()-1) |
--no-cache | off | Ignore content-hash cache |
--hd | on | Enable HD variants (1024px) |
--no-hd | off | Skip HD variants |
--strict | off | Exit on first sub-script failure |
What build.sh Does Internally
For ref only — do NOT run these manually:
cd viz/
# 1. Platform detection: sets R_CONFIG_ACTIVE (wsl, docker, or unset)
# 2. R binary selection: WSL → /usr/local/bin/Rscript, Docker → same, native → Rscript
# 3. $RSCRIPT generate-palette-colors.R
# 4. node build-data.js
# 5. node build-icon-manifest.js --type all
# 6. $RSCRIPT build-all-icons.R "$@" (flags passed through)
# 7. node build-terminal-glyphs.js
Docker Alternative
Pipeline can also run in Docker:
cd viz
docker compose up --build
Runs full pipeline in isolated Linux env + serves on port 8080.
Check
- Ran
bash viz/build.sh(not bareRscript) - Palette colors generated (JSON + JS)
- Data files built from registries
- Manifests generated from data
- Icons rendered for target types + palettes
- File counts match
- Sizes in expected range (2-80 KB)
Traps
- Calling Rscript direct: Never
Rscript build-icons.RorRscript generate-palette-colors.Rmanually. Alwaysbash build.sh [flags]. Direct calls bypass platform detection + may use wrong R binary (Windows R via~/bin/Rscriptwrapper instead of WSL-native R at/usr/local/bin/Rscript). Note: Windows R path in CLAUDE.md + guides for MCP server config only, not build scripts. - Wrong cwd:
build.shCDs to own dir auto (cd "$(dirname "$0")"), so call from anywhere:bash viz/build.shfrom project root works. - Stale manifests:
build.shruns Steps 1-5 in order, manifests always regen before render. Only need manifests no render →node viz/build-data.js && node viz/build-icon-manifest.js(Node steps no need R). - renv not activated:
.Rprofileworkaround needs running fromviz/—build.shhandles. Using--vanillaor running R from another dir skips it. - Parallel on Windows: Windows no support fork-based parallelism — pipeline auto-selects
multisessionviaconfig.yml.
→
- audit-icon-pipeline — detect missing glyphs + icons before render
- create-glyph — create new glyph fns for entities missing icons
- enhance-glyph — improve existing glyphs before re-render
GitHub Repository
Related Skills
content-collections
MetaThis skill provides a production-tested setup for Content Collections, a TypeScript-first tool that transforms Markdown/MDX files into type-safe data collections with Zod validation. Use it when building blogs, documentation sites, or content-heavy Vite + React applications to ensure type safety and automatic content validation. It covers everything from Vite plugin configuration and MDX compilation to deployment optimization and schema validation.
polymarket
MetaThis skill enables developers to build applications with the Polymarket prediction markets platform, including API integration for trading and market data. It also provides real-time data streaming via WebSocket to monitor live trades and market activity. Use it for implementing trading strategies or creating tools that process live market updates.
creating-opencode-plugins
MetaThis skill helps developers create OpenCode plugins that hook into 25+ event types like commands, files, and LSP operations. It provides the plugin structure, event API specifications, and implementation patterns for JavaScript/TypeScript modules. Use it when you need to intercept, monitor, or extend the OpenCode AI assistant's lifecycle with custom event-driven logic.
sglang
MetaSGLang is a high-performance LLM serving framework that specializes in fast, structured generation for JSON, regex, and agentic workflows using its RadixAttention prefix caching. It delivers significantly faster inference, especially for tasks with repeated prefixes, making it ideal for complex, structured outputs and multi-turn conversations. Choose SGLang over alternatives like vLLM when you need constrained decoding or are building applications with extensive prefix sharing.
