infographic-generator
Infographic Generator
End-to-end workflow: research → layout → HTML → PNG. Bring your own brand book and inspiration images, or use the built-in default design system.
Inputs
Collect before starting:
| Input | Required | Notes |
|---|---|---|
| Topic / title | Yes | What the infographic is about |
| Content points | No | Key points per section. If not provided, run Step 0 first. |
| Brand book | No | Brand context — paste it inline, drop a file, or describe it. Claude extracts colors, fonts, logo, tone from whatever is provided. |
| Inspiration image | No | A reference infographic to match the layout structure |
| Dimensions | No | portrait (default) or square |
| Output path | No | Defaults to ./output/infographic-[topic].png |
Canvas Dimensions
| Format | Dimensions | Ratio | Best for |
|---|---|---|---|
| Portrait (default) | 1080 × 1350px | 4:5 | Mobile-first, 4-section layouts |
| Square | 1200 × 1200px | 1:1 | Feed visibility, simpler 2–3 section layouts |
Step 0 — Research (when content isn't provided)
If given a topic but not the specific points, research before building.
tavily_extract— if a URL is providedtavily_search "[topic] 2024"— for general topicstavily_research— for technical deep dives
Synthesize into 4 section angles before writing any HTML.
Step 1 — Style Resolution
Determine the design approach before writing any code:
Priority order:
- Brand book provided → Extract from whatever context was given (pasted text, dropped file, or description): primary/accent colors, font family, logo/monogram, tone. Apply these instead of the built-in defaults. Keep the layout structure from Step 2.
- Inspiration image provided → Analyze the image first: identify layout structure, column arrangement, visual hierarchy, section count, card patterns, header/footer treatment. Build HTML to match that structure. Keep brand colors from the brand book (or defaults if none provided).
- Both provided → Brand book sets colors + fonts. Inspiration image sets layout.
- Neither provided → Use the built-in default design system (described in Step 2).
When analyzing an inspiration image, extract:
- Number of sections and how they're divided
- Column layout per section (1-col, 2-col, 3-col, grid)
- Header and footer treatment
- Card/box shapes (rounded, sharp, with icons, with tags)
- Typography hierarchy (large title, section headers, body text)
- Visual accents (circles, arrows, flow diagrams, comparison tables)
Step 2 — Build HTML (Built-in Default Design System)
This is the default style. Skip or override based on Step 1 output.
Canvas CSS
/* Portrait */
width: 1080px; height: 1350px; background: #EFF4F0;
/* Square */
width: 1200px; height: 1200px; background: #EFF4F0;
display: flex; flex-direction: column; overflow: hidden;
Structure (top to bottom)
| Element | CSS | Notes |
|---|---|---|
| Header | flex-shrink: 0; border-bottom: 2px solid rgba(26,39,68,0.1) |
Title + subtitle |
| Mechanism strip | background: #1A2744; flex-shrink: 0 |
Optional one-liner. Use when there's a core mechanism to name. |
| Sections 1–4 | flex: 1; display: flex; flex-direction: column |
Equal height. Sections 1–3 get border-bottom: 1.5px solid rgba(26,39,68,0.08). Section 4: border-bottom: none. |
| Footer | flex-shrink: 0; height: 58px; background: #1A2744 |
Always present |
Brand Colors
| Role | Hex |
|---|---|
| Canvas bg | #EFF4F0 |
| Dark navy | #1A2744 |
| Light blue | #6BA3D6 |
| Mid blue | #4A7FB5 |
| Body text | #4A4A5A |
| Secondary text | #7C7C8A |
| Card — blue | #D6E8F5 |
| Card — navy | #D0D8E8 |
| Card — mint | #D6EDE0 |
| Card — peach | #F0E6D6 |
| Card — cream | #F5F0EB |
| Card — lilac | #E4DCF0 |
Typography
Load from Google Fonts: Inter (400/500/600/700/800) + Playfair Display (700 italic)
| Element | Spec |
|---|---|
| Header title | Inter 800, 38–40px, #1A2744, letter-spacing -0.02em |
| Header subtitle | Inter 400, 14px, #7C7C8A |
| Section title | Inter 800, 16px, #1A2744 |
| Card title | Inter 700, 12.5px, #1A2744 |
| Card body | Inter 400, 11.5–12px, #4A4A5A, line-height 1.58 |
| Example box text | Inter 400 italic, 11px, #7C7C8A |
| Footer mark | Playfair Display italic 700, 15px, white |
Section Numbered Circles
.s1 { background: #6BA3D6; } /* blue */
.s2 { background: #1A2744; } /* navy */
.s3 { background: #4A7FB5; } /* mid blue */
.s4 { background: #6BA3D6; } /* blue */
Size: 28×28px, border-radius 50%, Inter 800 12px white.
Section Content Patterns
| Section | Layout | Best for |
|---|---|---|
| 1 | 2-col card grid | Two core concepts, two input types |
| 2 | 2-col or 3-col card grid | Feature breakdown, use cases |
| 3 | 1 card + flow diagram, OR 3-col | Process steps, loops |
| 4 | Before/After comparison table | Contrast, results, with/without |
Card anatomy:
card-icon— 20×20px white square with box-shadow, emoji or symbolcard-title— Inter 700 12.5px, with optional.card-tagpill (right-aligned)card-body— descriptive textcard-example(optional) — dashed border box, label "PROMPT" or "EXAMPLE" in 9px uppercase blue, italic gray text
Flow steps: white boxes, centered, flow-step-num (22px blue circle), flow-step-title, flow-step-body. Connect with → arrows.
Comparison table: 2-col grid. bad header (rgba(200,100,80,0.12)) vs good header (rgba(107,163,214,0.2)). Row items: colored dots dot-bad rgba(200,100,80,0.5) · dot-good #6BA3D6.
Footer
Customize the footer with your own name/logo. Default placeholder:
<div class="footer">
<div class="logo-mark"><span>A</span></div>
<div class="footer-name">Your Name</div>
</div>
Logo mark CSS: background #6BA3D6, 5px border-radius, Playfair Display italic white letter.
To customize: replace "A" with your initial and "Your Name" with your name. If the user has provided a brand book with a name/logo, use that.
Step 3 — Copy Rules
- No filler words: avoid "leveraging," "seamlessly," "powerful," "game-changing," "robust," "revolutionizing"
- Titles: sharp and specific — "4 Habits That Actually Move the Needle" not "Your Complete Guide to High Performance"
- Prompt/example boxes: write real, usable content — not
[your task here]placeholders - Tags (DAILY / WEEKLY / ALWAYS etc.): only use when accurate and specific
- Section count: default is 4. Use 3 if content is sparse; never go above 4 in portrait.
Step 4 — Export to PNG
Save HTML to: ./output/infographic-[topic].html (relative to project root)
Screenshot with Playwright — use shell variables so the script works from any project:
# Install Playwright if not already present (one-time)
cd /tmp && npm install playwright
# Set paths (run from your project root)
HTML_FILE="$(pwd)/output/infographic-[topic].html"
PNG_FILE="$(pwd)/output/infographic-[topic].png"
# Create output dir if needed
mkdir -p "$(pwd)/output"
# Export the canvas element to PNG
# Paths are passed as arguments (not interpolated into the script string) to avoid shell injection
cd /tmp && node -e "
const { chromium } = require('playwright');
const htmlFile = process.argv[1];
const pngFile = process.argv[2];
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.setViewportSize({ width: 1200, height: 1500 });
await page.goto('file://' + htmlFile);
await page.waitForTimeout(1000);
const canvas = await page.\$('.canvas');
await canvas.screenshot({ path: pngFile, type: 'png' });
await browser.close();
console.log('Done: ' + pngFile);
})();
" -- "$HTML_FILE" "$PNG_FILE"
Verify: ls -lh ./output/infographic-[topic].png — expect 150K–300K.
Image pipeline: HTML → Playwright → PNG only. Do not use image generation APIs for infographics.
Customization Reference
| Thing to change | Where |
|---|---|
| Brand colors | Replace hex values in Step 2 color table |
| Fonts | Swap Google Fonts import + update font-family references |
| Footer name/initial | Edit the logo-mark span and footer-name div |
| Output directory | Change ./output/ to any path you prefer |
| Canvas size | Update canvas CSS width/height + Playwright viewport |
| Number of sections | Remove or add section blocks in HTML; adjust flex: 1 distribution |
More from reymerekar7/rm-skills
video-performance-analyzer
>
29gmail-triage
>
12x-scanner
>
11twitter-reader
Fetch Twitter/X post content by URL using jina.ai API to bypass JavaScript restrictions. Use when Claude needs to retrieve tweet content including author, timestamp, post text, images, and thread replies. Supports individual posts or batch fetching from x.com or twitter.com URLs.
10linkedin-asset-analyzer
>
6one-stack-newsletter-assets
>
1