Create Goose Graphics Style

End-to-end skill that turns a single reference image into a published Gooseworks style — analyzes the image, drafts the slim style spec, renders a hero example plus 2-3 additional formats via Playwright, writes the `gooseworks-style.json` manifest, and publishes via `npx gooseworks styles publish` so other agents can discover it.

How to use it

  1. Hit Copy SKILL.md — or use the Claude Code line below to get every file.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/design/composites/goose-graphics-create-style#main ~/.claude/skills/goose-graphics-create-style

For one project only, change the path to .claude/skills/goose-graphics-create-style. This skill also uses gooseworks-style.json — copying SKILL.md alone won't be enough. See the folder on GitHub.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text429 lines
goose-graphics-create-style/SKILL.md429 lines17.0 KBpushed 96d agoRawView on GitHub

Create Goose Graphics Style

Authors a new graphics style and publishes it to the central Gooseworks library via npx gooseworks styles publish. The output is a working directory with a gooseworks-style.json manifest plus a hero rendered example and 2-3 additional examples that demonstrate the aesthetic flexing across formats.

When to use this skill

Use when the user has a reference image and wants the aesthetic available as a reusable, discoverable style — so any future /goose-graphics --style <slug> --format <any> call can render against it.

Always check first: run npx gooseworks styles list (or npx gooseworks styles search "warm editorial") to see whether a community-published style already covers the look. If one fits, just use it via the regular goose-graphics flow.

Prerequisites

  • The goose-graphics skill must be installed in the same workspace — this skill uses its screenshot/screenshot.js to render examples. Install via:
    npx gooseworks install --claude --with goose-graphics
    
    (Swap --claude for --cursor or --codex as needed.) See the install page on the hub for the canonical command: https://skills.gooseworks.ai/skills/goose-graphics
  • The screenshot tool's dependencies must be installed (goose-graphics/screenshot/node_modules/ must exist). If not:
    cd <path-to>/goose-graphics/screenshot && npm install && npx playwright install chromium
    
  • The user must be signed in to Gooseworks (npx gooseworks login) for publish to authenticate.

Invocation

/goose-graphics-create-style --ref <image-path> [--name <slug>] [--mood <mood-group>]
  • --ref <image-path> (required) — path to the reference image (PNG/JPG/WebP).
  • --name <slug> (optional) — desired style slug in lowercase-kebab-case (e.g., pillow-block, neon-dashboard). If omitted, propose 2-3 candidate names after analyzing the image and ask the user to pick.
  • --mood <mood-group> (optional) — which moodGroup the style belongs to. One of: Dark & Moody, Light & Editorial, Organic & Warm, Bold & Energetic, Retro & Cinematic, Structural & Technical, Friendly Corporate. If omitted, infer from the image and confirm.

If the user says "I want a new style for goose-graphics" without args, ask for the reference image path first, then proceed.

Outputs (in a working directory)

<working-dir>/
  gooseworks-style.json   # manifest (see "Manifest format" below)
  poster.png              # hero example (REQUIRED — exactly one with isHero: true)
  carousel.png            # additional examples (recommend 2-3 across formats)
  infographic.png
  ...

The backend rejects publish with an empty examples array or with no hero — exactly one example must be marked isHero: true.

Standard Brief

All examples are generated using the same brief used by the rest of the catalog, so users can compare styles apples-to-apples:

Brief: 5 Tips for Building a Startup in 2026

Tips (use these verbatim, adapt phrasing per style voice):

  1. Ship fast, learn faster
  2. Build AI into the core
  3. Hire for leverage, not headcount
  4. Obsess over 10 users before 10,000
  5. Revenue beats runway

Always use this brief. Do not invent your own — it makes the catalog inconsistent.

Workflow

Step 1 — Receive & analyze the image

  1. Read the image with the Read tool (it supports PNG/JPG/WebP natively).

  2. Work through this analysis checklist explicitly. Write the analysis out in plain text before moving on — do not skip ahead.

    Palette — identify 3-6 dominant colors. For each, propose a hex value in the right family (you cannot extract exact hex; pick well-balanced values). Classify each by role: background/canvas, primary surface, accent, secondary accent, text, muted text, borders/dividers, any neon/highlight color.

    Typography — heading face (serif / sans / slab / mono), body face (same or different family), weight range, tracking (negative / normal / positive), line-height (tight / generous), overall feel (geometric / humanist / elegant / technical / rounded / condensed). Map to a Google Fonts equivalent (Inter, Fraunces, Playfair Display, Space Grotesk, IBM Plex Mono, etc.).

    Layout & shape language — corner radius (sharp / 12px / 28px squircle / pill / circle), borders (yes / no), shadows (yes / no / subtle), tile density, alignment, whether elements overlap.

    Signature visual moves — what makes this style THIS style? Examples: "pillowy 28px squircle tiles with hero numerals bottom-right", "blush canvas + oversized black serif money stats", "dark jewel surfaces + neon pink pill labels". Lead with these — they differentiate the style across formats.

    Mood / category — dark/light, calm/loud, premium/playful. Use this to pick the moodGroup if not provided.

  3. Critical separation of concerns: A style is an aesthetic SYSTEM (palette + typography + signature visual moves) that flexes across all formats. It is NOT a fixed composition. If your analysis describes "5 cards in a bento grid" or "3 vertical insight cards," you are mixing format into style. Re-frame in terms of palette, typography, and signature visual moves that any format can adopt.

Step 2 — Pick name, slug, and moodGroup

If --name was provided, use it. Otherwise propose 2-3 candidates derived from the signature moves (e.g. pillow-block, pastel-ledger, neon-dashboard) and ask the user to pick. Slug must be lowercase-kebab-case ([a-z0-9-]+).

Collision check: run npx gooseworks styles get <slug> — if the catalog returns a hit, the slug is taken. Suggest an alternative.

(The user may omit slug from the manifest; the backend auto-generates one. On 409 the CLI prompts you to accept the server's suggested slug; pass --yes at publish time to auto-accept.)

If --mood was provided, use it. Otherwise pick the best fit from the seven moodGroup values (see §Invocation) and confirm.

Step 3 — Draft the slim style spec

This becomes the designMd field of the manifest in step 5. Hold it in memory; do not write it to disk until step 5 packages it into the manifest. Mirror the structure of canonical slim specs (e.g. dot-grid-stat, pillow-block, blush-annual, neon-dashboard) — fetch one as a reference if unsure of the shape:

npx gooseworks styles get dot-grid-stat

Required sections, in this order:

  1. Title (h1) — display name (Title Case).
  2. Tagline paragraph — 2-3 sentences describing the aesthetic and the signature move. End with the vibe / brand analogy.
  3. ## Palette — markdown table with Hex | Role columns. Include semi-transparent variants (rgba(...)) where the style uses them.
  4. ## Typography — Google Fonts <link> block, font CSS variable lines, then a type table with columns Role | Font | Size | Weight | Line-height | Tracking. Include rows for hero, display, body, label, caption, brand. End with a Principles sub-list (3-5 bullets).
  5. ## Layout — bullet list. Must include a "Format padding" line listing per-format padding (carousel/infographic/slides/poster/story/chart/tweet). Then 4-6 aesthetic-principle bullets.
  6. ## Do / Don't — two sub-lists, 5 bullets each.
  7. ## CSS snippets:root variables block, then 1-2 ready-to-paste HTML snippets demonstrating the signature move (e.g. a hero tile, a card, a CTA pill).

Keep it under ~200 lines / 8KB. Aesthetic-only — no fixed compositions. Minimum length is 50 chars (the manifest validator's floor); the sweet spot for the catalog is 2000-6000 chars.

Step 4 — Render hero + 2-3 additional examples

Pick a hero format (the one example that best showcases the aesthetic), plus 2-3 additional formats so the catalog tile shows variety. Hero priority order:

poster > carousel > infographic > slides > chart > story > tweet

i.e. start at poster and walk down until you hit a format that fits the aesthetic well.

For each example, generate HTML at the format's exact dimensions using the slim spec's palette, fonts, and signature visual moves, and the standard brief above. Format dimensions:

Format Dimensions Notes
poster 1080×1350 portrait Hero composition with all 5 tips
infographic 1080×variable Tall vertical, 5 tip sections stacked
carousel 1080×1080 Single representative cover slide
slides 1920×1080 Single representative widescreen slide
story 1080×1920 vertical Single representative story slide
chart 1080×1080 Bar / line / block chart of stats from the 5 tips
tweet 1080×1080 Testimonial card on decorative background, NOT a poster

Critical: the tweet format is a simulated tweet/testimonial card centered on a decorative background styled with the new aesthetic — not a poster. Background uses the new style's palette/shapes; the centered card looks like a real social-media post (avatar, display name, handle, body, timestamp, engagement metrics).

HTML rules (apply to every example):

  • Self-contained single HTML file — inline <style> block + Google Fonts <link>.
  • Fixed pixel sizes only. NO vw/vh/%/rem/em/clamp().
  • Outer dimensions match the format spec exactly: html, body { width: Xpx; height: Ypx; overflow: hidden; }. Infographic is the exception: width fixed, height grows.
  • Use exactly the palette hex codes and font links from the slim spec — do not invent new colors.
  • Maintain the signature visual moves across every example. If a format can't fit the move comfortably, scale it down — do not abandon it.

Render each via the screenshot tool, writing PNGs directly into the working directory (one PNG per format, named after the format slug):

node <path-to>/goose-graphics/screenshot/screenshot.js \
  --format <format> \
  --input <path-to-html> \
  --output <working-dir>/<format>.png \
  --font-delay 1500

Single-file vs directory input: carousel, slides, and story are "multi-file" formats by default — if --input is a directory, the tool renders every .html file inside it to numbered slide-NN.png files in the --output directory. For the single representative slide we want here, pass a single .html file as --input and a single PNG path as --output — the tool detects the file input and writes one PNG. The other formats (poster, infographic, chart, tweet) are always single-file.

Common failure modes:

  • Content overflows the fixed canvas → reduce font sizes or simplify layout.
  • Fonts not loaded → bump --font-delay to 2000.
  • Playwright/chromium not installed → run the install command from Prerequisites.

Step 5 — Write gooseworks-style.json

Match the shape documented in goose-graphics/SKILL.md §17.1. Required:

{
  "name": "Desert Sunset",
  "slug": "desert-sunset",
  "description": "Warm dusk gradients with rust and amber on cream paper. Editorial serif headlines paired with a single sans-serif accent. Built for DTC beauty product launches, lifestyle long-form, and event posters where you want a confident, sun-soaked, high-end magazine feel.",
  "designMd": "# Desert Sunset\n\n…full slim spec markdown from step 3 — palette table, typography table, layout rules, do/don'ts, CSS snippets…",
  "moodGroup": "Organic & Warm",
  "tags": ["warm", "desert", "editorial", "serif", "dtc"],
  "palette": [
    { "hex": "#E06A2C", "role": "primary" },
    { "hex": "#3A1F1A", "role": "ink" },
    { "hex": "#F5EFE7", "role": "paper" }
  ],
  "examples": [
    { "format": "poster", "isHero": true, "file": "./poster.png", "caption": "Hero render" },
    { "format": "carousel", "file": "./carousel.png" },
    { "format": "story", "file": "./story.png" }
  ]
}

Constraints to respect:

  • name: 1-120 chars
  • slug: optional kebab-case [a-z0-9-]+; backend auto-generates if absent. A 409 collision returns a server-suggested slug — the CLI handles the retry.
  • description: 20-1000 chars (required). See guidelines below.
  • designMd: minimum 50 chars (required) — the spec from step 3.
  • moodGroup: optional; one of the seven values listed in §Invocation.
  • tags: array of 3-10 lowercase strings. See guidelines below.
  • palette: array of { hex: "#RRGGBB", role?: string }.
  • examples: array, minimum 1 entry, exactly one with isHero: true.
  • examples[].format: slug of an existing graphics format (any from npx gooseworks formats list).
  • examples[].file: relative path to the PNG in the working directory.

Step 6 — Visual QA

Read 2-3 of the rendered PNGs (the hero plus the most distinct two) and visually verify:

  • Aesthetic matches the reference image's vibe.
  • Signature visual moves appear consistently across formats.
  • No obvious overflow, broken layout, or missing fonts.
  • If you rendered a tweet, it looks like a real social-media post, not a poster.

If anything looks off, fix the HTML and re-render. Don't ship broken examples.

Step 7 — Publish

cd <working-dir>
npx gooseworks styles publish

The CLI reads gooseworks-style.json, validates it client-side, uploads the manifest plus the example PNGs, and registers the style in the catalog.

Slug-collision UX: if the slug is taken, the CLI prompts Slug 'X' is taken. Use 'Y' instead? with the server's suggestion. Pass --yes to auto-accept (useful for scripted runs):

npx gooseworks styles publish --yes

Success output:

Published style: <slug>
https://skills.gooseworks.ai/styles/<slug>

Exit codes: 0 success, 1 transient/auth (network, 401, 5xx), 2 user error (400 validation, 403 not owner, 413 file too large, declined 409).

Amending a published style later:

npx gooseworks styles update <slug>

Same manifest format; no slug-collision retry (the slug is locked).

Step 8 — Confirm

Tell the user:

  • The published slug and the catalog URL.
  • The dimensions/formats used for the examples.
  • The exact command future agents will use to render with the new style: /goose-graphics --style <slug> --format <format> --brief "...".

Description-writing guidelines (load-bearing)

The description is what makes the style discoverable by AI agents searching the catalog. Treat it as a search index, not flavor text.

  • 50-200 words, keyword-dense.
  • Lead with mood + use case. "Bold magazine-cover energy for product launches and event posters."
  • Mention typography signals. "Massive condensed sans-serif headlines paired with a delicate body serif."
  • Mention palette signals. "Rust orange + cream + near-black."
  • Mention industry / audience fit if relevant. "DTC beauty, indie publishing, event flyers."
  • Avoid generic adjectives alone. "Beautiful," "modern," "clean" mean nothing without concrete signals — pair them with palette, typography, or industry context.

Tag-writing guidelines

3-10 lowercase tags. Cover:

  • Mood: warm, dark, energetic, calm
  • Density: sparse, dense
  • Formality: corporate, editorial, playful
  • Era: mid-century, y2k, retro
  • Industry-fit: saas, dtc, beauty, finance

Skip tags that just restate the slug.

Notes on existing patterns to reuse

  • Fetch a canonical slim spec to mirror its shape: npx gooseworks styles get dot-grid-stat, npx gooseworks styles get pillow-block, npx gooseworks styles get blush-annual, npx gooseworks styles get neon-dashboard.
  • goose-graphics/screenshot/screenshot.js is the rendering pipeline; it sets format-specific viewport and capture mode.
  • npx gooseworks formats get <format> returns each format's spec and content limits — fetch the relevant one if you're unsure how a format should behave.

Anti-patterns to avoid

  • Don't bake a fixed composition into the style spec. "5-tile bento" or "3 vertical insight cards" is composition, not style. Style = palette + typography + signature visual moves.
  • Don't ship without a hero example. The backend rejects manifests with no isHero: true entry.
  • Don't render the tweet as a poster. It must be a testimonial card on a decorative background.
  • Don't invent your own brief for the examples. Always use "5 Tips for Building a Startup in 2026" with the five canonical tips.
  • Don't skip the visual QA step. A render that overflows or has missing fonts is worse than no example.
  • Don't publish without checking npx gooseworks styles list first — if the look already exists in the catalog, point the user at it instead of publishing a duplicate.
1---
2name: goose-graphics-create-style
3description: >
4 End-to-end skill that turns a single reference image into a published
5 Gooseworks style — analyzes the image, drafts the slim style spec, renders
6 a hero example plus 2-3 additional formats via Playwright, writes the
7 `gooseworks-style.json` manifest, and publishes via
8 `npx gooseworks styles publish` so other agents can discover it. Mirrors
9 goose-graphics-create-format but for styles.
10tags: [design, content]
11---
12 
13# Create Goose Graphics Style
14 
15Authors a new graphics style and publishes it to the central Gooseworks
16library via `npx gooseworks styles publish`. The output is a working
17directory with a `gooseworks-style.json` manifest plus a hero rendered
18example and 2-3 additional examples that demonstrate the aesthetic flexing
19across formats.
20 
21## When to use this skill
22 
23Use when the user has a reference image and wants the aesthetic available
24as a reusable, discoverable style — so any future
25`/goose-graphics --style <slug> --format <any>` call can render against it.
26 
27**Always check first:** run `npx gooseworks styles list` (or
28`npx gooseworks styles search "warm editorial"`) to see whether a
29community-published style already covers the look. If one fits, just use
30it via the regular `goose-graphics` flow.
31 
32## Prerequisites
33 
34- The `goose-graphics` skill must be installed in the same workspace —
35 this skill uses its `screenshot/screenshot.js` to render examples.
36 Install via:
37 ```bash
38 npx gooseworks install --claude --with goose-graphics
39 ```
40 (Swap `--claude` for `--cursor` or `--codex` as needed.) See the install
41 page on the hub for the canonical command:
42 https://skills.gooseworks.ai/skills/goose-graphics
43- The screenshot tool's dependencies must be installed
44 (`goose-graphics/screenshot/node_modules/` must exist). If not:
45 ```bash
46 cd <path-to>/goose-graphics/screenshot && npm install && npx playwright install chromium
47 ```
48- The user must be signed in to Gooseworks (`npx gooseworks login`) for
49 `publish` to authenticate.
50 
51## Invocation
52 
53```
54/goose-graphics-create-style --ref <image-path> [--name <slug>] [--mood <mood-group>]
55```
56 
57- `--ref <image-path>` (required) — path to the reference image
58 (PNG/JPG/WebP).
59- `--name <slug>` (optional) — desired style slug in lowercase-kebab-case
60 (e.g., `pillow-block`, `neon-dashboard`). If omitted, propose 2-3
61 candidate names after analyzing the image and ask the user to pick.
62- `--mood <mood-group>` (optional) — which `moodGroup` the style belongs
63 to. One of: `Dark & Moody`, `Light & Editorial`, `Organic & Warm`,
64 `Bold & Energetic`, `Retro & Cinematic`, `Structural & Technical`,
65 `Friendly Corporate`. If omitted, infer from the image and confirm.
66 
67If the user says "I want a new style for goose-graphics" without args, ask
68for the reference image path first, then proceed.
69 
70## Outputs (in a working directory)
71 
72```
73<working-dir>/
74 gooseworks-style.json # manifest (see "Manifest format" below)
75 poster.png # hero example (REQUIRED — exactly one with isHero: true)
76 carousel.png # additional examples (recommend 2-3 across formats)
77 infographic.png
78 ...
79```
80 
81The backend rejects `publish` with an empty `examples` array or with no
82hero — exactly one example must be marked `isHero: true`.
83 
84## Standard Brief
85 
86All examples are generated using the same brief used by the rest of the
87catalog, so users can compare styles apples-to-apples:
88 
89> **Brief:** `5 Tips for Building a Startup in 2026`
90>
91> **Tips (use these verbatim, adapt phrasing per style voice):**
92> 1. Ship fast, learn faster
93> 2. Build AI into the core
94> 3. Hire for leverage, not headcount
95> 4. Obsess over 10 users before 10,000
96> 5. Revenue beats runway
97 
98Always use this brief. Do not invent your own — it makes the catalog
99inconsistent.
100 
101## Workflow
102 
103### Step 1 — Receive & analyze the image
104 
1051. Read the image with the `Read` tool (it supports PNG/JPG/WebP natively).
1062. Work through this analysis checklist explicitly. **Write the analysis
107 out in plain text before moving on** — do not skip ahead.
108 
109 **Palette** — identify 3-6 dominant colors. For each, propose a hex
110 value in the right family (you cannot extract exact hex; pick
111 well-balanced values). Classify each by role: background/canvas,
112 primary surface, accent, secondary accent, text, muted text,
113 borders/dividers, any neon/highlight color.
114 
115 **Typography** — heading face (serif / sans / slab / mono), body face
116 (same or different family), weight range, tracking (negative / normal /
117 positive), line-height (tight / generous), overall feel
118 (geometric / humanist / elegant / technical / rounded / condensed).
119 Map to a Google Fonts equivalent (Inter, Fraunces, Playfair Display,
120 Space Grotesk, IBM Plex Mono, etc.).
121 
122 **Layout & shape language** — corner radius (sharp / 12px / 28px
123 squircle / pill / circle), borders (yes / no), shadows
124 (yes / no / subtle), tile density, alignment, whether elements overlap.
125 
126 **Signature visual moves** — what makes this style THIS style?
127 Examples: "pillowy 28px squircle tiles with hero numerals
128 bottom-right", "blush canvas + oversized black serif money stats",
129 "dark jewel surfaces + neon pink pill labels". Lead with these — they
130 differentiate the style across formats.
131 
132 **Mood / category** — dark/light, calm/loud, premium/playful. Use this
133 to pick the `moodGroup` if not provided.
134 
1353. **Critical separation of concerns:** A style is an aesthetic SYSTEM
136 (palette + typography + signature visual moves) that flexes across all
137 formats. It is NOT a fixed composition. If your analysis describes
138 "5 cards in a bento grid" or "3 vertical insight cards," you are
139 mixing format into style. Re-frame in terms of palette, typography,
140 and signature visual moves that any format can adopt.
141 
142### Step 2 — Pick name, slug, and moodGroup
143 
144If `--name` was provided, use it. Otherwise propose 2-3 candidates derived
145from the signature moves (e.g. `pillow-block`, `pastel-ledger`,
146`neon-dashboard`) and ask the user to pick. Slug must be
147lowercase-kebab-case (`[a-z0-9-]+`).
148 
149**Collision check:** run `npx gooseworks styles get <slug>` — if the
150catalog returns a hit, the slug is taken. Suggest an alternative.
151 
152(The user may omit `slug` from the manifest; the backend auto-generates
153one. On 409 the CLI prompts you to accept the server's suggested slug;
154pass `--yes` at publish time to auto-accept.)
155 
156If `--mood` was provided, use it. Otherwise pick the best fit from the
157seven `moodGroup` values (see §Invocation) and confirm.
158 
159### Step 3 — Draft the slim style spec
160 
161This becomes the `designMd` field of the manifest in step 5. Hold it in
162memory; do not write it to disk until step 5 packages it into the
163manifest. Mirror the structure of canonical slim specs (e.g.
164`dot-grid-stat`, `pillow-block`, `blush-annual`, `neon-dashboard`) — fetch
165one as a reference if unsure of the shape:
166 
167```bash
168npx gooseworks styles get dot-grid-stat
169```
170 
171Required sections, in this order:
172 
1731. **Title (h1)** — display name (Title Case).
1742. **Tagline paragraph** — 2-3 sentences describing the aesthetic and the
175 signature move. End with the vibe / brand analogy.
1763. **`## Palette`** — markdown table with `Hex | Role` columns. Include
177 semi-transparent variants (`rgba(...)`) where the style uses them.
1784. **`## Typography`** — Google Fonts `<link>` block, font CSS variable
179 lines, then a type table with columns `Role | Font | Size | Weight |
180 Line-height | Tracking`. Include rows for hero, display, body, label,
181 caption, brand. End with a **Principles** sub-list (3-5 bullets).
1825. **`## Layout`** — bullet list. **Must include a "Format padding" line**
183 listing per-format padding
184 (carousel/infographic/slides/poster/story/chart/tweet). Then 4-6
185 aesthetic-principle bullets.
1866. **`## Do / Don't`** — two sub-lists, 5 bullets each.
1877. **`## CSS snippets`**`:root` variables block, then 1-2
188 ready-to-paste HTML snippets demonstrating the signature move
189 (e.g. a hero tile, a card, a CTA pill).
190 
191Keep it under ~200 lines / 8KB. Aesthetic-only — no fixed compositions.
192Minimum length is 50 chars (the manifest validator's floor); the sweet
193spot for the catalog is 2000-6000 chars.
194 
195### Step 4 — Render hero + 2-3 additional examples
196 
197Pick a hero format (the one example that best showcases the aesthetic),
198plus 2-3 additional formats so the catalog tile shows variety. **Hero
199priority order:**
200 
201```
202poster > carousel > infographic > slides > chart > story > tweet
203```
204 
205i.e. start at `poster` and walk down until you hit a format that fits the
206aesthetic well.
207 
208For each example, generate HTML at the format's exact dimensions using the
209slim spec's palette, fonts, and signature visual moves, and the standard
210brief above. Format dimensions:
211 
212| Format | Dimensions | Notes |
213|---|---|---|
214| poster | 1080×1350 portrait | Hero composition with all 5 tips |
215| infographic | 1080×variable | Tall vertical, 5 tip sections stacked |
216| carousel | 1080×1080 | Single representative cover slide |
217| slides | 1920×1080 | Single representative widescreen slide |
218| story | 1080×1920 vertical | Single representative story slide |
219| chart | 1080×1080 | Bar / line / block chart of stats from the 5 tips |
220| tweet | 1080×1080 | **Testimonial card on decorative background**, NOT a poster |
221 
222**Critical:** the tweet format is a simulated tweet/testimonial card
223centered on a decorative background styled with the new aesthetic — not a
224poster. Background uses the new style's palette/shapes; the centered card
225looks like a real social-media post (avatar, display name, handle, body,
226timestamp, engagement metrics).
227 
228**HTML rules** (apply to every example):
229 
230- Self-contained single HTML file — inline `<style>` block + Google Fonts
231 `<link>`.
232- Fixed pixel sizes only. NO `vw`/`vh`/`%`/`rem`/`em`/`clamp()`.
233- Outer dimensions match the format spec exactly:
234 `html, body { width: Xpx; height: Ypx; overflow: hidden; }`. Infographic
235 is the exception: width fixed, height grows.
236- Use exactly the palette hex codes and font links from the slim spec —
237 do not invent new colors.
238- Maintain the signature visual moves across every example. If a format
239 can't fit the move comfortably, scale it down — do not abandon it.
240 
241Render each via the screenshot tool, writing PNGs **directly into the
242working directory** (one PNG per format, named after the format slug):
243 
244```bash
245node <path-to>/goose-graphics/screenshot/screenshot.js \
246 --format <format> \
247 --input <path-to-html> \
248 --output <working-dir>/<format>.png \
249 --font-delay 1500
250```
251 
252**Single-file vs directory input:** carousel, slides, and story are
253"multi-file" formats by default — if `--input` is a directory, the tool
254renders every `.html` file inside it to numbered `slide-NN.png` files in
255the `--output` directory. For the single representative slide we want
256here, pass a single `.html` file as `--input` and a single PNG path as
257`--output` — the tool detects the file input and writes one PNG. The
258other formats (poster, infographic, chart, tweet) are always single-file.
259 
260Common failure modes:
261 
262- Content overflows the fixed canvas → reduce font sizes or simplify
263 layout.
264- Fonts not loaded → bump `--font-delay` to 2000.
265- Playwright/chromium not installed → run the install command from
266 Prerequisites.
267 
268### Step 5 — Write `gooseworks-style.json`
269 
270Match the shape documented in `goose-graphics/SKILL.md` §17.1. Required:
271 
272```json
273{
274 "name": "Desert Sunset",
275 "slug": "desert-sunset",
276 "description": "Warm dusk gradients with rust and amber on cream paper. Editorial serif headlines paired with a single sans-serif accent. Built for DTC beauty product launches, lifestyle long-form, and event posters where you want a confident, sun-soaked, high-end magazine feel.",
277 "designMd": "# Desert Sunset\n\n…full slim spec markdown from step 3 — palette table, typography table, layout rules, do/don'ts, CSS snippets…",
278 "moodGroup": "Organic & Warm",
279 "tags": ["warm", "desert", "editorial", "serif", "dtc"],
280 "palette": [
281 { "hex": "#E06A2C", "role": "primary" },
282 { "hex": "#3A1F1A", "role": "ink" },
283 { "hex": "#F5EFE7", "role": "paper" }
284 ],
285 "examples": [
286 { "format": "poster", "isHero": true, "file": "./poster.png", "caption": "Hero render" },
287 { "format": "carousel", "file": "./carousel.png" },
288 { "format": "story", "file": "./story.png" }
289 ]
290}
291```
292 
293**Constraints to respect:**
294 
295- `name`: 1-120 chars
296- `slug`: optional kebab-case `[a-z0-9-]+`; backend auto-generates if
297 absent. A 409 collision returns a server-suggested slug — the CLI
298 handles the retry.
299- `description`: 20-1000 chars (**required**). See guidelines below.
300- `designMd`: minimum 50 chars (**required**) — the spec from step 3.
301- `moodGroup`: optional; one of the seven values listed in §Invocation.
302- `tags`: array of 3-10 lowercase strings. See guidelines below.
303- `palette`: array of `{ hex: "#RRGGBB", role?: string }`.
304- `examples`: array, **minimum 1 entry**, **exactly one** with
305 `isHero: true`.
306- `examples[].format`: slug of an existing graphics format
307 (any from `npx gooseworks formats list`).
308- `examples[].file`: relative path to the PNG in the working directory.
309 
310### Step 6 — Visual QA
311 
312Read 2-3 of the rendered PNGs (the hero plus the most distinct two) and
313visually verify:
314 
315- Aesthetic matches the reference image's vibe.
316- Signature visual moves appear consistently across formats.
317- No obvious overflow, broken layout, or missing fonts.
318- If you rendered a tweet, it looks like a real social-media post, not a
319 poster.
320 
321If anything looks off, fix the HTML and re-render. Don't ship broken
322examples.
323 
324### Step 7 — Publish
325 
326```bash
327cd <working-dir>
328npx gooseworks styles publish
329```
330 
331The CLI reads `gooseworks-style.json`, validates it client-side, uploads
332the manifest plus the example PNGs, and registers the style in the
333catalog.
334 
335**Slug-collision UX:** if the slug is taken, the CLI prompts
336`Slug 'X' is taken. Use 'Y' instead?` with the server's suggestion. Pass
337`--yes` to auto-accept (useful for scripted runs):
338 
339```bash
340npx gooseworks styles publish --yes
341```
342 
343**Success output:**
344 
345```
346Published style: <slug>
347https://skills.gooseworks.ai/styles/<slug>
348```
349 
350**Exit codes:** `0` success, `1` transient/auth (network, 401, 5xx), `2`
351user error (400 validation, 403 not owner, 413 file too large, declined
352409).
353 
354**Amending a published style later:**
355 
356```bash
357npx gooseworks styles update <slug>
358```
359 
360Same manifest format; no slug-collision retry (the slug is locked).
361 
362### Step 8 — Confirm
363 
364Tell the user:
365 
366- The published slug and the catalog URL.
367- The dimensions/formats used for the examples.
368- The exact command future agents will use to render with the new style:
369 `/goose-graphics --style <slug> --format <format> --brief "..."`.
370 
371## Description-writing guidelines (load-bearing)
372 
373The description is what makes the style discoverable by AI agents
374searching the catalog. Treat it as a search index, not flavor text.
375 
376- **50-200 words, keyword-dense.**
377- **Lead with mood + use case.** "Bold magazine-cover energy for product
378 launches and event posters."
379- **Mention typography signals.** "Massive condensed sans-serif headlines
380 paired with a delicate body serif."
381- **Mention palette signals.** "Rust orange + cream + near-black."
382- **Mention industry / audience fit if relevant.** "DTC beauty, indie
383 publishing, event flyers."
384- **Avoid generic adjectives alone.** "Beautiful," "modern," "clean" mean
385 nothing without concrete signals — pair them with palette, typography,
386 or industry context.
387 
388## Tag-writing guidelines
389 
3903-10 lowercase tags. Cover:
391 
392- **Mood:** `warm`, `dark`, `energetic`, `calm`
393- **Density:** `sparse`, `dense`
394- **Formality:** `corporate`, `editorial`, `playful`
395- **Era:** `mid-century`, `y2k`, `retro`
396- **Industry-fit:** `saas`, `dtc`, `beauty`, `finance`
397 
398Skip tags that just restate the slug.
399 
400## Notes on existing patterns to reuse
401 
402- Fetch a canonical slim spec to mirror its shape:
403 `npx gooseworks styles get dot-grid-stat`,
404 `npx gooseworks styles get pillow-block`,
405 `npx gooseworks styles get blush-annual`,
406 `npx gooseworks styles get neon-dashboard`.
407- `goose-graphics/screenshot/screenshot.js` is the rendering pipeline; it
408 sets format-specific viewport and capture mode.
409- `npx gooseworks formats get <format>` returns each format's spec and
410 content limits — fetch the relevant one if you're unsure how a format
411 should behave.
412 
413## Anti-patterns to avoid
414 
415- **Don't bake a fixed composition into the style spec.** "5-tile bento"
416 or "3 vertical insight cards" is composition, not style. Style =
417 palette + typography + signature visual moves.
418- **Don't ship without a hero example.** The backend rejects manifests
419 with no `isHero: true` entry.
420- **Don't render the tweet as a poster.** It must be a testimonial card
421 on a decorative background.
422- **Don't invent your own brief** for the examples. Always use "5 Tips
423 for Building a Startup in 2026" with the five canonical tips.
424- **Don't skip the visual QA step.** A render that overflows or has
425 missing fonts is worse than no example.
426- **Don't publish without checking `npx gooseworks styles list` first**
427 if the look already exists in the catalog, point the user at it instead
428 of publishing a duplicate.
429 

Discussion