agents/vector-art/SKILL.md
Vector art assets (characters, objects, scenes) sources for SVG/Canvas and how to animate them
npx skillsauth add sanand0/scripts vector-artInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Follow the Puppet Master architecture: assign each asset category a dedicated source, then composite and animate in-browser.
| Role | Source | Access | Notes | | ------------- | ----------------------- | ----------------- | ------------------------------------------ | | Actors | DiceBear (Open Peeps) | HTTP API | Deterministic characters with poses/moods | | Scenes | unDraw | Static slug index | Background illustrations for contexts | | Objects | Iconify | HTTP API + search | Searchable props, consistent per set | | Clipart | Openverse / OpenClipart | HTTP API | General SVG search, CC0/open license | | Logos | Simple Icons | CDN URL | Brand assets, no auth | | Props | Lucide / Phosphor | NPM import | Small objects, animate as React components | | Animation | GSAP or anime.js | JS library | Translate/morph entire SVG groups |
Deterministic avatar generation. Same seed = same character across scenes.
Base: https://api.dicebear.com/9.x/
SVG: GET https://api.dicebear.com/9.x/{style}/svg?seed={name}&{params}
Key styles for storytelling:
open-peeps — hand-drawn humans, supports pose + face params (RECOMMENDED)avataaars — cartoon facesmicah — minimal illustrated charactersOpen Peeps params:
face= scared | happy | sad | rage | explaining | ...
body= standing | sitting | ...
seed= any string — use character name for consistency
Example:
https://api.dicebear.com/9.x/open-peeps/svg?seed=Alice&face=happy&body=standing
Docs: https://www.dicebear.com/how-to-use/http-api/
REST API, CORS-open, no auth. 200k+ SVGs across 100+ sets.
Search: GET https://api.iconify.design/search?query={term}&limit=10
Fetch SVG: GET https://api.iconify.design/{prefix}/{name}.svg
List sets: GET https://api.iconify.design/collections
Search response fields: icons[] — each is "{prefix}:{name}"
Illustration-grade sets (use for visual consistency):
flat-color-icons — colorful objectsnoto-emoji — expressive emoji-styleopenmoji — open emojitwemoji — Twitter emoji styleExample flow:
const res = await fetch("https://api.iconify.design/search?query=tree&limit=5");
const { icons } = await res.json(); // e.g. ["flat-color-icons:tree"]
const [prefix, name] = icons[0].split(":");
const svg = await fetch(`https://api.iconify.design/${prefix}/${name}.svg`).then((r) => r.text());
High-quality MIT-licensed scene illustrations (office, team, error states, etc.).
No live search API. Use a static slug index:
undraw-js or react-undraw-illustrationsURL pattern (once you have a slug):
https://undraw.co/illustrations/{slug} ← browse
SVG direct: not publicly CDN'd — use NPM package or embed via react-undraw
Agent strategy: maintain a curated keyword→slug map for your narrative's scene types
(e.g., "office" → "working_late", "error" → "fixing_bugs").
Searches across open-licensed media including SVGs from Wikimedia, Flickr, etc.
Search: GET https://api.openverse.org/v1/images/?q={query}&extension=svg
Response fields: url, thumbnail, license, license_url, creator, source
Notes:
license field before usecc0, pdm, by, or by-sa licensesAll CC0. Native SVG. Style is inconsistent but good for prototyping.
Search: GET https://openclipart.org/search/?query={term}&format=json
Docs: https://openclipart.org/developers
Large archive; must handle attribution carefully.
Search: GET https://commons.wikimedia.org/w/api.php
?action=query
&generator=search
&gsrsearch=filetype:svg {query}
&gsrlimit=10
&prop=imageinfo
&iiprop=url|extmetadata
&format=json
Key response fields: imageinfo[].url, extmetadata.LicenseShortName, extmetadata.Artist
Always store attribution. Prefer CC0/PD results.
Fetch: https://cdn.simpleicons.org/{slug}.svg
Slugs match lowercase brand names (e.g., github, openai, typescript).
No auth, no search needed.
Large library (~5M icons), full search API.
Search: GET https://api.thenounproject.com/v2/icon?query={term}
Auth: OAuth 1.0
Docs: https://api.thenounproject.com/documentation.html
Free tier: public domain icons only. Returns attribution string — must display it.
Before using any fetched SVG in rendering, freeze it locally with a manifest entry:
{
"id": "unique-local-id",
"source": "iconify",
"source_url": "https://api.iconify.design/flat-color-icons/tree.svg",
"license": "MIT",
"creator": "",
"sha256": "...",
"tags": ["tree", "nature", "plant"]
}
GSAP (industry standard, free for most uses):
gsap.to("#character", { x: 400, duration: 2, ease: "power2.inOut" });
gsap.timeline().to("#actor", { y: -20, duration: 0.3 }).to("#actor", { y: 0, duration: 0.3 });
anime.js (lighter alternative, fully open source):
anime({ targets: "#character", translateX: 400, duration: 2000, easing: "easeInOutQuad" });
Key principle: Animate entire SVG groups (<g> elements) via translate/scale rather than
trying to manipulate internal paths — external SVGs often have unpredictable internal structure.
Need a CHARACTER? → DiceBear open-peeps (seed=name, set face/body params)
Need a SCENE/BG? → unDraw (keyword→slug map) or Openverse (filter license=cc0)
Need an OBJECT/PROP?→ Iconify search → pick flat-color-icons set for consistency
Need a BRAND LOGO? → Simple Icons CDN
Need ANYTHING ELSE? → Openverse search → verify license → freeze to manifest
Animating? → GSAP timeline; target <g> wrappers; translate whole elements
Style consistency? → Commit to ONE Iconify set for all non-character assets
<img src=".svg"> if you need to animate internal partsdocumentation
To write in Anand's style in blog posts, talk summaries, interview questions, emails, ...
testing
Use vitest + jsdom for fast, lightweight unit tests for front-end apps
tools
Tips on using uv and uvx (Python build tools) effectively with GitHub, Torch, etc.
tools
How to plan & break down large, complex tasks