Moodboard
Assemble a section-by-section visual moodboard for a page. For every section the report shows the current state large, the problems identified beside it, a grid of benchmark screenshots each captioned with the practice it demonstrates, the best practices grouped by discipline, and the recommendation for the brand.
This is the page altitude, visual-first output of Web Anatomy. It generates its own content: it captures the live page section by section (the same on-page reading audit-page does) and pulls benchmarks per section from the MCP (the same retrieval find-examples does), then composes both into one scrollable board.
How moodboard differs from the neighbors
Keep the routing clean. The closest neighbor is benchmark-compare, and they share the same MCP retrieval underneath, so the distinction matters.
benchmark-compare takes one target (a URL, screenshot, or pasted section) and returns a verdict: a gap analysis where each gap is labeled HIGH, MEDIUM, or LOW. The screenshots are evidence for the gaps. Use it to answer "how far is this from the winners, and what is the biggest gap."
moodboard takes the whole page and returns a reference board: every section in scroll order, the current state large beside the problems, and a grid of benchmark screenshots as the centerpiece. The screenshots are the point. Use it to answer "what should each block look like, as a brief I can hand to design or import into Figma." It does not score gaps.
find-examples is one section's swipe file. research-best-practices is a narrative report. improve-page is a grounded rework with copy-paste fixes.
In short: benchmark-compare scores a gap on one target; moodboard composes the page-wide visual reference you build from.
Output Behavior
Always write:
.webanatomy/moodboard/{page}-{YYYY-MM-DD}/report-data.json
.webanatomy/moodboard/{page}-{YYYY-MM-DD}/report.html
.webanatomy/moodboard/{page}-{YYYY-MM-DD}/report.md
.webanatomy/moodboard/{page}-{YYYY-MM-DD}/references/
The HTML report is the primary visual output. Chat is only a short summary and a pointer to the saved files. Do not dump the whole moodboard into chat.
If the environment cannot write files, explain the blocker and provide a compact inline version.
Deterministic Report Renderer
When file access is available, do not hand-write the final HTML. Write the structured report-data.json first, then run the shared renderer from this skill pack:
node <skill-dir>/scripts/render-report.mjs --input=.webanatomy/moodboard/{page}-{YYYY-MM-DD}/report-data.json
Resolve <skill-dir> relative to this SKILL.md. The renderer validates the data, materializes every image into references/ (downloads each screenshotUrl, copies each local screenshotPath), rewrites the JSON with localImage paths so the report is self-contained, and renders "screenshot unavailable" when an image cannot be fetched. Pass --no-download to skip materialization, --force-download to refetch.
Only fall back to hand-written HTML if the renderer cannot be run.
report-data shape (schema webanatomy.moodboard.v1)
Top level:
title (required), summary (required, used as the TL;DR)
sections (required, non-empty array)
- optional
eyebrow, subtitle, brand (labels the recommendation box, e.g. "Hiway"), target { name, url }, footer
Each entry in sections:
name (required) and optional emoji
meta: { "label": "...", "kind": "p0" | "do" | "" }[] rendered as chips (priority, action, effort, impact, goal). kind "p0" tints red, "do" tints accent.
current: { "screenshotPath" | "screenshotUrl": "...", "caption": "...", "localImage"?: "..." } shown large on the left
currentState: one factual sentence describing the section as it is today
problems: string[] the issues identified, shown beside the current screenshot
benchmarks: { "company": "...", "sourceUrl": "...", "screenshotUrl" | "screenshotPath": "...", "caption": "...", "bestPractice": "..." }[] rendered as a grid, each with the practice it shows below it
bestPractices: string[], each prefixed with a discipline tag in brackets, optionally ending in · sources. Example: "[COPY] Lead the H1 with a quantified outcome · Legalstart, Shine". Tags: COPY, DESIGN-UX, VISUEL, PREUVE (see references/moodboard-method.md).
recommendations: string[] (or { title, text }[]) the actions for the brand
Use screenshotPath for local current-state captures, screenshotUrl for hosted benchmark images. Both are materialized into references/.
Step 1 - Resolve Page And Sections
Identify the page and the ordered list of sections to cover. Use the canonical section taxonomy from the house style (hero, value_proposition, trust, testimonial, pricing, faq, cta, plus features, how_it_works, problem, use_cases, navbar, footer, about). Order sections by where they appear on the page, or by priority when the user wants a worklist.
Step 2 - Generate The Content (canonical path)
The skill produces the per-section content itself. Do not assume any external document exists. For each section, in order:
- Capture the current state. Browse the live page and capture one screenshot per section. Confirm each section in the DOM after a full scroll before stating anything about it. Save captures locally and reference them with
screenshotPath.
- Diagnose current + problems. Write one factual
currentState line and the problems for the section, framed as opportunities about the page (this is the same on-page reading audit-page performs). Never assert an element is missing from a screenshot alone; confirm in the DOM or write "could not verify".
- Pull benchmarks from the MCP. Use the
webanatomy MCP search_sections for the section type (industry and locale from .agents/webanatomy-context.md) to get benchmark examples, their screenshots, and their stealable moves. Each becomes a benchmarks[] entry: screenshotUrl + a bestPractice caption naming the visible practice. Confirm the MCP is available first; if not, say so and use a clearly labeled static fallback.
- Synthesize. Roll the stealable moves into the discipline-tagged
bestPractices (see references/moodboard-method.md), then write the recommendations for the brand.
Keep internal scores, thresholds, and marker coordinates hidden. Translate them into visible practices.
Optional shortcut: import a prior audit
If a structured per-section audit already exists (an audit-page output, or an external doc such as a Notion module database), import it instead of re-diagnosing, to save work. Map: current state to currentState + current, problem to problems, benchmark images and captions to benchmarks[].screenshotUrl + bestPractice, the discipline list to bestPractices, the recos to recommendations. Carry the content faithfully; do not summarize it away. This is a convenience, not a requirement: the skill runs end to end without it.
Step 3 - Screenshots
Every section needs one current-state image. Every benchmark needs one image. Use screenshotPath for local current captures and screenshotUrl for hosted benchmark images. The renderer materializes all of them into references/ so the folder is portable and shareable as a link.
references/ is renderer-owned. Save current-state captures outside it (a sibling _captures/ dir, or the project's screenshots dir) and point screenshotPath there. Do not save captures into references/: the renderer copies sources into references/ with its own NN-slug names, so a source kept inside would be duplicated. On each run the renderer clears its own NN- files first, so re-rendering after a section count or order change leaves no orphans.
Step 4 - Render And Summarize
Run the renderer. Then respond in chat with: the page covered, the number of sections, the highest-priority section, and the report path. Keep it short.
Guardrails
- Follow the shared house style in
webanatomy-setup/references/house-style.md: no em-dashes, frame as "The X..." not "Your X...", frame problems as opportunities, never expose framework internals (no rubric ids, scores, thresholds, or marker coordinates), and match the Locale from .agents/webanatomy-context.md when present.
- Use
P0/P1/P2/P3 for ungrounded priority chips. Do not mix with the HIGH/MEDIUM/LOW gap scale.
- Never assert an element is missing from a screenshot alone. Confirm in the DOM after a full scroll, or write "could not verify".
- Do not promise conversion lifts. State the move and the reasoning.
- Keep benchmark captions to the visible practice, not internal scoring.
1---2name: moodboard3description: The page-level Moodboard in Web Anatomy. Build a section-by-section visual reference board for a whole page (homepage, landing page, money page): for every section, the current state captured large, the problems identified, a grid of benchmark screenshots with the practice each one shows, the discipline-tagged best practices, and the recommendation. Use when the user asks for a moodboard, a section-by-section reference board, a visual brief for a redesign, a design reference deck, a redesign inspiration board, "show me each section against competitors," "build a moodboard for my homepage," "what should each block look like," or a board to hand to design or import into Figma. The skill generates the content itself: it captures the live page section by section and pulls benchmarks from the Web Anatomy MCP. It does not depend on any external doc. How it differs from the neighbors: benchmark-compare scores one target against winners and labels each gap HIGH/MEDIUM/LOW (a verdict on one URL or section); moodboard 4---56# Moodboard78Assemble a section-by-section visual moodboard for a page. For every section the report shows the current state large, the problems identified beside it, a grid of benchmark screenshots each captioned with the practice it demonstrates, the best practices grouped by discipline, and the recommendation for the brand.910This is the **page altitude, visual-first** output of Web Anatomy. It generates its own content: it captures the live page section by section (the same on-page reading `audit-page` does) and pulls benchmarks per section from the MCP (the same retrieval `find-examples` does), then composes both into one scrollable board.1112## How moodboard differs from the neighbors1314Keep the routing clean. The closest neighbor is `benchmark-compare`, and they share the same MCP retrieval underneath, so the distinction matters.1516- **`benchmark-compare`** takes **one** target (a URL, screenshot, or pasted section) and returns a **verdict**: a gap analysis where each gap is labeled `HIGH`, `MEDIUM`, or `LOW`. The screenshots are evidence for the gaps. Use it to answer "how far is this from the winners, and what is the biggest gap."17- **`moodboard`** takes the **whole page** and returns a **reference board**: every section in scroll order, the current state large beside the problems, and a grid of benchmark screenshots as the centerpiece. The screenshots are the point. Use it to answer "what should each block look like, as a brief I can hand to design or import into Figma." It does not score gaps.18- **`find-examples`** is one section's swipe file. **`research-best-practices`** is a narrative report. **`improve-page`** is a grounded rework with copy-paste fixes.1920In short: benchmark-compare scores a gap on one target; moodboard composes the page-wide visual reference you build from.2122## Output Behavior2324Always write:2526- `.webanatomy/moodboard/{page}-{YYYY-MM-DD}/report-data.json`27- `.webanatomy/moodboard/{page}-{YYYY-MM-DD}/report.html`28- `.webanatomy/moodboard/{page}-{YYYY-MM-DD}/report.md`29- `.webanatomy/moodboard/{page}-{YYYY-MM-DD}/references/`3031The HTML report is the primary visual output. Chat is only a short summary and a pointer to the saved files. Do not dump the whole moodboard into chat.3233If the environment cannot write files, explain the blocker and provide a compact inline version.3435## Deterministic Report Renderer3637When file access is available, do not hand-write the final HTML. Write the structured `report-data.json` first, then run the shared renderer from this skill pack:3839```bash40node <skill-dir>/scripts/render-report.mjs --input=.webanatomy/moodboard/{page}-{YYYY-MM-DD}/report-data.json41```4243Resolve `<skill-dir>` relative to this `SKILL.md`. The renderer validates the data, materializes every image into `references/` (downloads each `screenshotUrl`, copies each local `screenshotPath`), rewrites the JSON with `localImage` paths so the report is self-contained, and renders "screenshot unavailable" when an image cannot be fetched. Pass `--no-download` to skip materialization, `--force-download` to refetch.4445Only fall back to hand-written HTML if the renderer cannot be run.4647### report-data shape (schema `webanatomy.moodboard.v1`)4849Top level:5051- `title` (required), `summary` (required, used as the TL;DR)52- `sections` (required, non-empty array)53- optional `eyebrow`, `subtitle`, `brand` (labels the recommendation box, e.g. "Hiway"), `target` `{ name, url }`, `footer`5455Each entry in `sections`:5657- `name` (required) and optional `emoji`58- `meta`: `{ "label": "...", "kind": "p0" | "do" | "" }[]` rendered as chips (priority, action, effort, impact, goal). `kind` "p0" tints red, "do" tints accent.59- `current`: `{ "screenshotPath" | "screenshotUrl": "...", "caption": "...", "localImage"?: "..." }` shown large on the left60- `currentState`: one factual sentence describing the section as it is today61- `problems`: `string[]` the issues identified, shown beside the current screenshot62- `benchmarks`: `{ "company": "...", "sourceUrl": "...", "screenshotUrl" | "screenshotPath": "...", "caption": "...", "bestPractice": "..." }[]` rendered as a grid, each with the practice it shows below it63- `bestPractices`: `string[]`, each prefixed with a discipline tag in brackets, optionally ending in ` · sources`. Example: `"[COPY] Lead the H1 with a quantified outcome · Legalstart, Shine"`. Tags: `COPY`, `DESIGN-UX`, `VISUEL`, `PREUVE` (see references/moodboard-method.md).64- `recommendations`: `string[]` (or `{ title, text }[]`) the actions for the brand6566Use `screenshotPath` for local current-state captures, `screenshotUrl` for hosted benchmark images. Both are materialized into `references/`.6768## Step 1 - Resolve Page And Sections6970Identify the page and the ordered list of sections to cover. Use the canonical section taxonomy from the house style (`hero`, `value_proposition`, `trust`, `testimonial`, `pricing`, `faq`, `cta`, plus `features`, `how_it_works`, `problem`, `use_cases`, `navbar`, `footer`, `about`). Order sections by where they appear on the page, or by priority when the user wants a worklist.7172## Step 2 - Generate The Content (canonical path)7374The skill produces the per-section content itself. Do not assume any external document exists. For each section, in order:75761. **Capture the current state.** Browse the live page and capture one screenshot per section. Confirm each section in the DOM after a full scroll before stating anything about it. Save captures locally and reference them with `screenshotPath`.772. **Diagnose current + problems.** Write one factual `currentState` line and the `problems` for the section, framed as opportunities about the page (this is the same on-page reading `audit-page` performs). Never assert an element is missing from a screenshot alone; confirm in the DOM or write "could not verify".783. **Pull benchmarks from the MCP.** Use the `webanatomy` MCP `search_sections` for the section type (industry and locale from `.agents/webanatomy-context.md`) to get benchmark examples, their screenshots, and their stealable moves. Each becomes a `benchmarks[]` entry: `screenshotUrl` + a `bestPractice` caption naming the visible practice. Confirm the MCP is available first; if not, say so and use a clearly labeled static fallback.794. **Synthesize.** Roll the stealable moves into the discipline-tagged `bestPractices` (see references/moodboard-method.md), then write the `recommendations` for the brand.8081Keep internal scores, thresholds, and marker coordinates hidden. Translate them into visible practices.8283### Optional shortcut: import a prior audit8485If a structured per-section audit already exists (an `audit-page` output, or an external doc such as a Notion module database), import it instead of re-diagnosing, to save work. Map: current state to `currentState` + `current`, problem to `problems`, benchmark images and captions to `benchmarks[].screenshotUrl` + `bestPractice`, the discipline list to `bestPractices`, the recos to `recommendations`. Carry the content faithfully; do not summarize it away. This is a convenience, not a requirement: the skill runs end to end without it.8687## Step 3 - Screenshots8889Every section needs one current-state image. Every benchmark needs one image. Use `screenshotPath` for local current captures and `screenshotUrl` for hosted benchmark images. The renderer materializes all of them into `references/` so the folder is portable and shareable as a link.9091`references/` is renderer-owned. Save current-state captures **outside** it (a sibling `_captures/` dir, or the project's screenshots dir) and point `screenshotPath` there. Do not save captures into `references/`: the renderer copies sources into `references/` with its own `NN-slug` names, so a source kept inside would be duplicated. On each run the renderer clears its own `NN-` files first, so re-rendering after a section count or order change leaves no orphans.9293## Step 4 - Render And Summarize9495Run the renderer. Then respond in chat with: the page covered, the number of sections, the highest-priority section, and the report path. Keep it short.9697## Guardrails9899- Follow the shared house style in `webanatomy-setup/references/house-style.md`: no em-dashes, frame as "The X..." not "Your X...", frame problems as opportunities, never expose framework internals (no rubric ids, scores, thresholds, or marker coordinates), and match the Locale from `.agents/webanatomy-context.md` when present.100- Use `P0`/`P1`/`P2`/`P3` for ungrounded priority chips. Do not mix with the `HIGH`/`MEDIUM`/`LOW` gap scale.101- Never assert an element is missing from a screenshot alone. Confirm in the DOM after a full scroll, or write "could not verify".102- Do not promise conversion lifts. State the move and the reasoning.103- Keep benchmark captions to the visible practice, not internal scoring.