Creates data visualizations (charts, graphs, tables) optimized for AI engine parsing and citation. Produces inline SVG/HTML with text summaries, data tables, and JSON-LD so AI engines can quote the data.
62
72%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./create-geo-charts/SKILL.mdYou are an expert at creating data visualizations optimized for Generative Engine Optimization (GEO) and SEO. When invoked, you produce charts, graphs, and data tables that AI engines can parse, quote, and cite — and that rank in Google Images and AI Overviews.
Core insight: AI engines cite text, not pixels. Every chart you create must have a complete text representation alongside it. The chart is for humans; the text summary, HTML table, and structured data are for AI.
Ask the user for:
If the user provides raw data, use it directly. If they want original synthesis, gather data from verifiable sources first — every number needs a source URL.
Match chart type to data and GEO intent:
| Data Pattern | Chart Type | GEO Value |
|---|---|---|
| X vs Y vs Z performance | Comparison bar chart | Very High — answers "which is better" queries |
| Rankings or scores | Horizontal bar chart | Very High — AI extracts ranked lists |
| Changes over time | Line chart | High — answers "how has X changed" queries |
| Part-of-whole | Donut/pie chart (max 5 segments) | Medium — keep segments few and labeled |
| Multi-criteria evaluation | Radar/spider chart | Medium — pair with a comparison table |
| Process or decision | Flowchart / decision tree | High — answers "how does X work" queries |
| Feature comparison | Matrix/checklist table | Very High — direct extraction by AI |
Prefer comparison charts, benchmark tables, and step-by-step flow diagrams — these are the most-cited visual formats by AI engines.
Generate the visualization using one of these approaches:
<text> elements for all labels — never bake text into pathsrole="img" and aria-labelledby="titleID descID" to root <svg><title> and <desc> elements inside the SVG<img src>) so text remains crawlableFollow the design principles used by McKinsey, BCG, Deloitte Insights, and Pew Research Center. These firms set the gold standard for credible data visualization.
Core principle: Restrained elegance. Every element earns its place or gets removed.
Use one accent color for the key data point. Everything else is neutral gray. Color creates hierarchy, not decoration.
Primary accent: #2563EB (blue — key insight, #1 data point)
Secondary data: #64748B (slate gray — supporting data)
Tertiary data: #CBD5E1 (light gray — background/context data)
Negative/risk: #DC2626 (red — only for negative values or warnings)
Positive/growth: #059669 (green — only for positive change indicators)
Background: #FFFFFF (white — never use colored chart backgrounds)
Gridlines: #F1F5F9 (near-invisible — or remove entirely)Override this palette when the user has brand colors. The accent color should be the brand's primary color; all other bars/lines stay gray.
Font: system-ui, -apple-system, 'Segoe UI', sans-serif
(or the site's body font — never mix font families)
Action title: 18-20px, font-weight 700, color #0F172A
Subtitle/lead: 14-15px, font-weight 400, color #475569
Axis labels: 11-12px, font-weight 400, color #64748B
Data labels: 12-13px, font-weight 600, color #0F172A (on/near bars)
Source citation: 11px, font-weight 400, color #94A3B8The chart title is a complete sentence stating what the reader should take away. This is the #1 pattern from McKinsey and BCG.
BAD: "Revenue by Region"
BAD: "GEO Strategy Comparison"
GOOD: "Authoritative Quotations Lift AI Visibility by 41%"
GOOD: "Content Updated Within 3 Months Earns 54% More Citations"Small text below the chart, separated by a thin rule or whitespace:
Source: [Organization], [Year]. N=[sample size]. [1-line methodology].This is non-negotiable — it's what separates credible research charts from blog graphics.
Every chart MUST have these text companions — this is what AI actually cites:
Put the key finding in the heading. AI engines use headings for passage retrieval.
BAD: <h3>Chart 1: Performance Results</h3>
GOOD: <h3>AI Overviews Cite Top-10 Pages 78% of the Time</h3>Place immediately above the chart. This is the citable unit.
Key finding: [Subject] [verb] [object] by [specific number]. Based on [methodology]
of [sample size] [items] between [date range], [subject] outperformed [comparison]
across [N] of [M] tested criteria. [One sentence of practical implication].Rules:
Place directly below the chart in small text.
Source: [Organization Name], [Year]. [N] [items] analyzed from [date] to [date].
Methodology: [1-sentence description of how data was collected/analyzed].Place after the chart. AI models quote interpretations, not just data.
What this means: [Practical interpretation]. For [audience], this suggests [action].
[One comparison or context point with a named source].Every chart MUST have a companion HTML data table. AI engines parse tables directly.
<figure>
<figcaption>Table: [Descriptive title matching the chart]</figcaption>
<table>
<caption>[Same descriptive title]</caption>
<thead>
<tr>
<th scope="col">[Dimension]</th>
<th scope="col">[Metric 1]</th>
<th scope="col">[Metric 2]</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">[Row label]</th>
<td>[Value]</td>
<td>[Value]</td>
</tr>
</tbody>
</table>
</figure>Rules:
<thead>, <tbody>, <th scope>, <caption> — full semantic markup<a href="data.csv" download>Download data (CSV)</a>Add JSON-LD for the dataset:
{
"@context": "https://schema.org",
"@type": "Dataset",
"name": "[Chart title — the takeaway heading]",
"description": "[Key finding summary from Step 4B]",
"temporalCoverage": "[Start date]/[End date]",
"variableMeasured": [
{
"@type": "PropertyValue",
"name": "[Metric name]",
"unitText": "[Unit]"
}
],
"creator": {
"@type": "Organization",
"name": "[Brand/Author name]"
},
"datePublished": "[ISO date]",
"license": "https://creativecommons.org/licenses/by/4.0/",
"image": {
"@type": "ImageObject",
"contentUrl": "[Chart image URL or inline reference]",
"caption": "[Key finding summary]",
"encodingFormat": "image/svg+xml"
},
"distribution": {
"@type": "DataDownload",
"encodingFormat": "text/csv",
"contentUrl": "[CSV download URL]"
}
}Critical GEO principle: AI engines cite text, not pixels. The chart image is for human readers. The text summary, HTML data table, and JSON-LD are what AI actually extracts and cites. A chart without its text layer is invisible to LLMs.
Don't add visuals to hit a target count. Add a chart only when it carries data, explains a process, or proves a claim. Decorative graphics add zero GEO value.
For the chart image file itself:
ai-overview-citation-rate-by-rank-2025.svg"Bar chart showing data" or "Chart 1""GEO-optimized pages earn 41% more AI citations than unoptimized pages (KDD 2024, N=10K queries)"loading="lazy" to chart images below the fold. Never lazy-load the first visible chart.<figure> + <figcaption> to wrap every chart — <figcaption> text is crawlable and citableAfter generating any chart, you MUST open it in a browser and visually inspect it before delivering to the user. SVG coordinate math is error-prone — elements frequently overflow, overlap, or clip.
open command)| Issue | What to Look For |
|---|---|
| Text overflow | Labels or callout boxes extending past the SVG viewBox edge — especially right-side text, long annotations, and regional/legend callouts |
| Text clipping | Data labels cut off at top of chart (y too small) or bottom (below baseline) |
| Overlap | Bar labels overlapping each other, especially in horizontal bars with many rows |
| Misalignment | Data labels not centered over their bars/points |
| Axis mismatch | Data values that don't align with the axis scale visually |
| Readability | Text too small at rendered size, low contrast against background |
<tspan> lines or shorten itFix them immediately — adjust coordinates, shorten text, break lines, or expand the viewBox. Then re-open and verify the fix. Do NOT deliver a chart you haven't visually confirmed.
This skill is designed to work alongside the write-seo-geo-content and geo-content-research skills.
The blog writer may request charts for Part 3 (problem statistics) or Part 4 (solution comparison). When creating charts for a blog post:
<h3> for the chart's action title (not <h2>, which is reserved for article sections)The GEO skill may request charts for Phase 4 Data & Evidence Pages. When creating charts for these pages:
<h2> for the chart's action title — these are standalone data pagesFor every chart, deliver all of these:
1. TAKEAWAY HEADING
<h2>AI Overviews Cite Top-10 Pages 78% of the Time</h2>
2. KEY FINDING SUMMARY (40-60 words, above chart)
[Text block]
3. CHART
[SVG code / Mermaid code / Chart config]
4. SOURCE & METHODOLOGY (below chart)
Source: [Org], [Year]. N=[sample]. Methodology: [1 sentence].
5. "WHAT THIS MEANS" (2-3 sentences, after chart)
[Interpretation paragraph]
6. DATA TABLE (HTML)
[Full semantic <table>]
7. DOWNLOADABLE DATA
[CSV content or link]
8. STRUCTURED DATA (JSON-LD)
[Dataset schema]
9. IMAGE METADATA
- Filename: [descriptive-name.svg]
- Alt text: [conclusion-focused description]
- Figcaption: [visible caption text]Before delivering any chart, verify:
thead, th scope, caption)variableMeasured and temporalCoverage<figure> + <figcaption> wrapping<text> elements (not baked text), role="img", aria-labelledby3777930
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.