Mood Board Creation
Class workflow for building visual mood boards: parse brief → source images → design palette → deliver → verify.
When to Use
Trigger on any request to build a mood board, visual reference board, inspiration board, or palette board — anime, brand, or project. Also use when the user asks to "grab images and colors" for a subject into Notion or an HTML page.
1. Parse the Brief
Extract: subject (character/franchise/brand), emphasis (one character? an arc? a texture?), and delivery target (Notion page, HTML artifact, image grid file). If the user names a brand (e.g. Cheonma), apply that brand's palette DNA; otherwise stay neutral.
2. Source Images (Free, Keyless APIs)
| Source | Endpoint | Key | Best for |
|---|---|---|---|
| Jikan (MyAnimeList) | GET api.jikan.moe/v4/characters?q=<name> then /v4/characters/{id}/pictures |
No | Official anime character galleries |
| Danbooru | GET danbooru.donmai.us/posts.json?tags=<tag>%20rating:g&limit=40 |
No (2-tag limit anonymous) | Fan art — sort client-side by score |
| AniList | POST graphql.anilist.co { Character(search:"<name>") { image { large } } } |
No | One official character portrait (great page cover) |
| Unsplash/Pexels | see unsplash-asset-images skill | varies | Photographic subjects, textures |
Rules:
- Always caption images with the artist (
tag_string_artiston Danbooru). - Prefer
rating:g/rating:scontent. - Skip multi-MB PNG originals for web embeds; prefer JPGs under ~2 MB.
- Check
image_width/image_height— mix orientations for grid interest.
3. Design the Palette
Derive 5–7 named swatches from the subject's canon aesthetic, not generic color theory. Each swatch: hex + evocative name + one-line usage note (e.g. #D7263D Kagune Crimson — rinkaku kagune, the ghoul eye). For anime, mine the source material: signature items, transformations, locations, other characters' influence.
4. Deliver
- Notion (when the user has Notion access): full pattern — page + cover + 3×3
column_listimage grid + colored callout swatches — inreferences/notion-mood-board.md. Verify withscripts/verify_notion_board.py. - HTML artifact: image grid + swatch row as a one-off page (see
sketchskill for throwaway mockup conventions).
5. Verify
Read back the delivered artifact. For Notion: fetch page (title/icon/cover set?) then walk block children including nested columns — count embedded images against what you intended. Report the live URL.
Pitfalls
- Jikan 504s when the MAL backend is down. One or two retries with backoff, then pivot to Danbooru (fan art) + AniList (official art). Don't burn the session retrying.
- execute_code sandbox does NOT inherit terminal env vars.
os.environ["NOTION_API_KEY"]fails there even when the terminal has it. Read keys from the profile dotenv inside the script:~/.hermes/profiles/<profile>/.env. - Notion image blocks are external embeds, not uploads. Notion links the source URL — if the CDN link dies, the tile breaks. Tell the user this trade-off.
- Notion block nesting: max 2 levels per API call.
column_list → column → imageis exactly 2 — fine. Deeper needs separate PATCH calls. - Notion API version header is required — use
Notion-Version: 2025-09-03(databases/data-sources split; see notion-api-basics).