tier-list-image
Tier List Image
This skill turns a ranking into a real tier-board image.
Use it when the user wants:
- a classic
S / A / B / C / Dtier list - a custom ranking vocabulary, including Chinese labels like
夯爆了 / 夯 / 顶级 / 人上人 / NPC / 拉完了 - a shareable ranking image
- a power ranking board
- a meme or gaming tier board
- a visual ranking built from loose natural-language input
Do not use it for:
- generic posters or quote cards
- dashboards, charts, or tables without tier rows
- text-to-image illustration tasks
Requirements
Required:
- Node.js 18+
- the skill installed, for example:
npx skills add https://github.com/ericjy/inkframe/skills --skill tier-list-image
agent-browserinstalled and available onPATH- browser runtime installed for
agent-browser
Recommended agent-browser setup:
npm install -g agent-browser
agent-browser install
Optional:
- a local Chrome or Chromium executable if the user wants to pass
--browser-path
This skill does not require a repo checkout or pnpm install. The bundled scripts use Node built-ins and skill-local files.
If agent-browser cannot launch a browser in the current environment, generate the HTML and stop there instead of pretending the PNG render succeeded.
How The Agent Should Use This Skill
When helpful, present exactly 3 example prompt suggestions the user can copy and adapt. Make them progressively more specific:
- a very simple request
Example:
Make a tier list of pizza toppings. - a medium-detail request
Example:
Make a tier-list image of programming languages. Put Python and TypeScript in A, Go and Rust in B, and PHP in C. - a fully specified request with title, theme, aspect ratio, and explicit tier contents
Example:
Make a 4:5 editorial tier-list image titled "Best Languages for Human To Code In". S: English. A: Python, TypeScript. B: Rust, Go, SQL. C: Java, C#, Bash. D: C++, PHP, Ruby. F: COBOL, Assembly.
Keep them short, concrete, and aligned with this skill's actual capabilities.
Preserve the user's exact tier vocabulary and order when they use custom labels. Do not silently remap 夯爆了 / 夯 / 顶级 / 人上人 / NPC / 拉完了 or other custom labels to S / A / B / C / F.
Step 1: Convert Natural-Language Request To Tier-List Spec JSON
When the user gives a natural-language request:
Make me a 4:5 tier-list image for AI coding tools. Put Codex and Claude Code in S tier, Cursor and Windsurf in A tier, Copilot in B tier. Use the editorial theme.
Write a spec JSON like:
{
"title": "Best AI Coding Tools",
"theme": "editorial",
"watermark": true,
"canvas": {
"aspectRatio": "4:5"
},
"tiers": [
{
"key": "S",
"label": "S Tier",
"color": "#ff5f6d",
"items": ["Codex", "Claude Code"]
},
{
"key": "A",
"label": "A Tier",
"color": "#ffb347",
"items": ["Cursor", "Windsurf"]
},
{
"key": "B",
"label": "B Tier",
"color": "#ffdd00",
"items": ["Copilot"]
}
]
}
Be explicit when you inferred missing ranking structure.
If the user provides custom tier labels, keep them exactly in key and label, in the same top-to-bottom order they gave.
Step 2: Run render-tier-list.mjs With The Spec File
Run the renderer with the spec JSON file you wrote in Step 1.
Step 3: Report Where The Output Image Was Generated
Tell the user where the PNG was saved. If you kept the generated HTML, mention that path too.
Tier List Spec Schema
The renderer expects a spec JSON file.
Example:
{
"title": "Best Languages for Human To Code In",
"subtitle": "\"The compiler is now the LLM\"",
"theme": "editorial",
"footer": "Example schema showing all supported fields",
"watermark": true,
"canvas": {
"aspectRatio": "16:9",
"width": 1600,
"height": 900
},
"tiers": [
{
"key": "S",
"label": "S Tier",
"color": "#ff5f6d",
"layout": "detailed",
"items": [
{ "title": "English", "description": "The universal compile target" }
]
},
{
"key": "A",
"label": "A Tier",
"color": "#ff9f0a",
"layout": "detailed",
"items": [
{ "title": "Python", "description": "LLM's native tongue" },
{ "title": "TypeScript", "description": "Typed, versatile, full-stack" }
]
},
{
"key": "B",
"label": "B Tier",
"color": "#ffdd00",
"layout": "detailed",
"items": [
{ "title": "Rust", "description": "When correctness matters" },
{ "title": "Go", "description": "Simple, fast, boring (good)" },
{ "title": "SQL", "description": "Declarative data king" }
]
},
{
"key": "C",
"label": "C Tier",
"color": "#84cc16",
"layout": "detailed",
"items": [
{ "title": "Java", "description": "Enterprise gravity well" },
{ "title": "C#", "description": "Microsoft's Java" },
{ "title": "Bash", "description": "Glue that holds it all" }
]
},
{
"key": "D",
"label": "D Tier",
"color": "#3b82f6",
"layout": "detailed",
"items": [
{ "title": "C++", "description": "Power \u2260 productivity" },
{ "title": "PHP", "description": "Still runs half the web" },
{ "title": "Ruby", "description": "Beautiful but fading" }
]
},
{
"key": "F",
"label": "F Tier",
"color": "#a855f7",
"layout": "detailed",
"items": [
{ "title": "COBOL", "description": "Eternal legacy" },
{ "title": "Assembly", "description": "LLMs can't save you" }
]
}
]
}
Required top-level fields:
titletiers
Recommended top-level fields:
subtitlethemefootercanvaswatermark
Canvas rules:
- canvas geometry comes from
canvas canvas.aspectRatiois optional and defaults to4:5canvas.widthis optional and defaults to1600canvas.heightis optional and is derived from width plus aspect ratio- if both
canvas.widthandcanvas.heightare provided, that exact viewport is used
Supported canvas fields:
aspectRatiowidthheight
Watermark rules:
- watermark is on by default and renders
Find the tier-list-image skill at github.com/ericjy/inkframe - set
watermarktofalseto opt out - set
watermarkto a string to override the default text
Each tier should include:
keylabelcoloritems
Optional tier field:
layoutwithdetailed,compact, ordense
Each item may be either:
- a string
- or an object with
titleorname - plus optional
descriptionorsubtitle
Primary Command
Run:
node ${SKILL_DIR}/scripts/render-tier-list.mjs --spec <spec.json> --out <image.png>
Resolve SKILL_DIR as the directory containing this installed skill's SKILL.md.
Available flags:
--spec <path>required. Tier-list spec JSON.--out <path>required. Final PNG path.--html-out <path>optional. Keep the generated HTML file.--session <name>optional. Browser session name. Defaulttierlist-render.--wait-ms <ms>optional. Delay before screenshot. Default300.--browser-path <path>optional. Explicit browser executable path.--print-metadataoptional. Print render metadata to stdout.
Recommended example:
node ${SKILL_DIR}/scripts/render-tier-list.mjs \
--spec ./tier-spec.json \
--out ./out/tier-list.png \
--html-out ./out/tier-list.html
Fallback Debug Flow
If you need to debug the template or keep the steps separate:
- Generate HTML:
node ${SKILL_DIR}/scripts/generate-html.mjs <spec.json> <output.html>
- Screenshot it manually:
agent-browser --session tierlist --allow-file-access open file:///absolute/path/to/tier-list.html
agent-browser --session tierlist set viewport 1600 2000
agent-browser --session tierlist screenshot /absolute/path/to/tier-list.png
agent-browser --session tierlist close
Use the viewport returned by generate-html.mjs.
Output Contract
Unless the user asks otherwise, produce:
- a spec JSON file
- a local PNG file
- optionally an HTML file when
--html-outis useful
Tell the user where the PNG was saved. Mention the HTML path only if it was kept.
Renderer Behavior
The bundled template and scripts control the visual layout. Do not invent a separate layout structure in the prompt or in ad hoc HTML.
Important behavior:
- the renderer produces one tier section per tier
- item cards wrap automatically inside each tier section
- density is chosen automatically based on the amount of content and available space
- explicit tier
layoutshould only be used when the user clearly wants an override
Themes
Supported themes:
classiceditorialgaming-neon
Use the one the user asked for. If the user does not care, choose the one that best fits the subject matter.