/geo-report-pdf
Generate a professional PDF report from a GEO audit using pandoc + Chrome headless. Converts GEO-AUDIT-REPORT.md into a styled, client-ready PDF with a cover page, color-coded score tables, severity-tagged findings, and a 90-day roadmap.
$ npx -y skills add zubair-trabzada/geo-seo-claude --skill geo-report-pdf --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/geo-report-pdf
Context preview
The summary Claude sees to decide when to auto-load this skill.
Generate a professional PDF report from a GEO audit using pandoc + Chrome headless. Converts GEO-AUDIT-REPORT.md into a styled, client-ready PDF with a cover page, color-coded score tables, severity-tagged findings, and a 90-day roadmap.
SKILL.md
geo-report-pdf.SKILL.mdname: geo-report-pdf
description: Generate a professional PDF report from a GEO audit using pandoc + Chrome headless. Converts GEO-AUDIT-REPORT.md into a styled, client-ready PDF with a cover page, color-coded score tables, severity-tagged findings, and a 90-day roadmap.
version: 2.0.0
author: geo-seo-claude
tags: [geo, pdf, report, client-deliverable, professional]
allowed-tools: Read, Grep, Glob, Bash, Write
GEO PDF Report Generator (pandoc pipeline)
Prerequisites
- **pandoc** — `brew install pandoc`
- **Google Chrome** — must be installed at `/Applications/Google Chrome.app/`
No Python dependencies. No ReportLab. No JSON data wrangling.
How It Works
1. Read `GEO-AUDIT-REPORT.md` in the current directory (created by `/geo audit`) 2. Extract cover metadata from the report (brand name, domain, GEO score, date, locations) 3. Run `pandoc` with the bundled CSS + HTML template to produce a self-contained `GEO-REPORT.html` 4. Run Chrome headless to print the HTML to `GEO-REPORT.pdf`
The pandoc template (`~/.claude/skills/geo/templates/geo-report-template.html`) injects:
- A full-bleed dark navy cover section with the GEO score badge
- Per-section cover metadata (date, business type, locations, platform)
- JavaScript that runs inside Chrome before printing to color-code score cells and severity-tag finding sections
Workflow
Step 1: Check for audit report
Look for `GEO-AUDIT-REPORT.md` in the current directory. If absent, tell the user to run `/geo audit <url>` first.
Step 2: Extract cover metadata from the report
Read the top of `GEO-AUDIT-REPORT.md` and extract:
| Field | Where to find it | |---|---| | `brand_name` | First H1 title (after "GEO Audit Report:") | | `domain` | Second bold line (e.g. `**Domain:** alexamediasolutions.com`) | | `geo_score` | Line matching `## Overall GEO Score: XX / 100` | | `score_label` | Word after the score on that same line (e.g. "Poor", "Fair", "Good") | | `date` | `**Audit Date:**` line | | `business_type` | `**Business Type:**` line | | `locations` | `**Locations:**` line | | `platform` | `**CMS:**` line |
Step 3: Run pandoc
pandoc GEO-AUDIT-REPORT.md \
--to html5 \
--standalone \
--embed-resources \
--template ~/.claude/skills/geo/templates/geo-report-template.html \
--css ~/.claude/skills/geo/templates/geo-report-style.css \
--metadata title="GEO Audit Report — <brand_name>" \
--metadata brand_name="<brand_name>" \
--metadata domain="<domain>" \
--metadata geo_score="<geo_score>" \
--metadata score_label="<score_label>" \
--metadata date="<date>" \
--metadata business_type="<business_type>" \
--metadata locations="<locations>" \
--metadata platform="<platform>" \
-o GEO-REPORT.html
Replace `<field>` placeholders with values extracted in Step 2. If a field is not found in the report, omit that `--metadata` flag — the template has sensible defaults.
Step 4: Run Chrome headless
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--headless=new \
--disable-gpu \
--no-sandbox \
--print-to-pdf="$(pwd)/GEO-REPORT.pdf" \
--print-to-pdf-no-header \
--no-pdf-header-footer \
--virtual-time-budget=5000 \
"file://$(pwd)/GEO-REPORT.html"
Step 5: Report completion
Tell the user:
- `GEO-REPORT.pdf` was generated in the current directory
- File size
- Optionally: `open GEO-REPORT.pdf` to preview it
What the PDF Contains
- **Cover page** — Dark navy gradient, brand name, domain, GEO score badge (colored by score), audit date, business type, locations, CMS platform
- **Score tables** — Cells containing `XX/100` are color-coded: ≥80 green, ≥65 blue, ≥50 amber, ≥35 orange, <35 red
- **Finding sections** — `h3` headings containing "Critical / High / Medium / Low" get severity-colored left-border callout blocks (red / orange / yellow / green)
- **Section page breaks** — Major sections (High Priority, 90-Day Roadmap, Component Score Summary, Generated Schema) break to new pages automatically
- **Code blocks** — JSON schema templates render with dark theme monospace styling
- **Page footer** — Brand name · GEO Audit · date + page numbers (via CSS `@page`)
Customizing the Report
- **Colors / typography** — Edit `~/.claude/skills/geo/templates/geo-report-style.css`
- **Cover layout** — Edit `~/.claude/skills/geo/templates/geo-report-template.html`
- **Score thresholds for color-coding** — Edit the `scoreColor()` function in the template's `<script>` block
- **Which sections get page breaks** — Edit the `breakBefore` array in the template's `<script>` block
Troubleshooting
| Problem | Fix | |---|---| | `pandoc: command not found` | `brew install pandoc` | | Chrome not found | Check path: `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome` | | PDF is blank / empty | Increase `--virtual-time-budget` to 8000 | | Cover metadata missing | Check GEO-AUDIT-REPORT.md has the standard header format | | Fonts not loading | PDF is rendered offline; system fonts are used as fallback — this is expected |
Read more
name: geo-report-pdf description: Generate a professional PDF report from a GEO audit using pandoc + Chrome headless. Converts GEO-AUDIT-REPORT.md into a styled, client-ready PDF with a cover page, color-coded score tables, severity-tagged findings, and a 90-day roadmap. version: 2.0.0 author: geo-seo-claude tags: [geo, pdf, report, client-deliverable, professional] allowed-tools: Read, Grep, Glob, Bash, Write
GEO PDF Report Generator (pandoc pipeline)
Prerequisites
- **pandoc** — `brew install pandoc`
- **Google Chrome** — must be installed at `/Applications/Google Chrome.app/`
No Python dependencies. No ReportLab. No JSON data wrangling.
How It Works
1. Read `GEO-AUDIT-REPORT.md` in the current directory (created by `/geo audit`) 2. Extract cover metadata from the report (brand name, domain, GEO score, date, locations) 3. Run `pandoc` with the bundled CSS + HTML template to produce a self-contained `GEO-REPORT.html` 4. Run Chrome headless to print the HTML to `GEO-REPORT.pdf`
The pandoc template (`~/.claude/skills/geo/templates/geo-report-template.html`) injects:
- A full-bleed dark navy cover section with the GEO score badge
- Per-section cover metadata (date, business type, locations, platform)
- JavaScript that runs inside Chrome before printing to color-code score cells and severity-tag finding sections
Workflow
Step 1: Check for audit report
Look for `GEO-AUDIT-REPORT.md` in the current directory. If absent, tell the user to run `/geo audit <url>` first.
Step 2: Extract cover metadata from the report
Read the top of `GEO-AUDIT-REPORT.md` and extract:
| Field | Where to find it | |---|---| | `brand_name` | First H1 title (after "GEO Audit Report:") | | `domain` | Second bold line (e.g. `**Domain:** alexamediasolutions.com`) | | `geo_score` | Line matching `## Overall GEO Score: XX / 100` | | `score_label` | Word after the score on that same line (e.g. "Poor", "Fair", "Good") | | `date` | `**Audit Date:**` line | | `business_type` | `**Business Type:**` line | | `locations` | `**Locations:**` line | | `platform` | `**CMS:**` line |
Step 3: Run pandoc
pandoc GEO-AUDIT-REPORT.md \ --to html5 \ --standalone \ --embed-resources \ --template ~/.claude/skills/geo/templates/geo-report-template.html \ --css ~/.claude/skills/geo/templates/geo-report-style.css \ --metadata title="GEO Audit Report — <brand_name>" \ --metadata brand_name="<brand_name>" \ --metadata domain="<domain>" \ --metadata geo_score="<geo_score>" \ --metadata score_label="<score_label>" \ --metadata date="<date>" \ --metadata business_type="<business_type>" \ --metadata locations="<locations>" \ --metadata platform="<platform>" \ -o GEO-REPORT.html
Replace `<field>` placeholders with values extracted in Step 2. If a field is not found in the report, omit that `--metadata` flag — the template has sensible defaults.
Step 4: Run Chrome headless
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \ --headless=new \ --disable-gpu \ --no-sandbox \ --print-to-pdf="$(pwd)/GEO-REPORT.pdf" \ --print-to-pdf-no-header \ --no-pdf-header-footer \ --virtual-time-budget=5000 \ "file://$(pwd)/GEO-REPORT.html"
Step 5: Report completion
Tell the user:
- `GEO-REPORT.pdf` was generated in the current directory
- File size
- Optionally: `open GEO-REPORT.pdf` to preview it
What the PDF Contains
- **Cover page** — Dark navy gradient, brand name, domain, GEO score badge (colored by score), audit date, business type, locations, CMS platform
- **Score tables** — Cells containing `XX/100` are color-coded: ≥80 green, ≥65 blue, ≥50 amber, ≥35 orange, <35 red
- **Finding sections** — `h3` headings containing "Critical / High / Medium / Low" get severity-colored left-border callout blocks (red / orange / yellow / green)
- **Section page breaks** — Major sections (High Priority, 90-Day Roadmap, Component Score Summary, Generated Schema) break to new pages automatically
- **Code blocks** — JSON schema templates render with dark theme monospace styling
- **Page footer** — Brand name · GEO Audit · date + page numbers (via CSS `@page`)
Customizing the Report
- **Colors / typography** — Edit `~/.claude/skills/geo/templates/geo-report-style.css`
- **Cover layout** — Edit `~/.claude/skills/geo/templates/geo-report-template.html`
- **Score thresholds for color-coding** — Edit the `scoreColor()` function in the template's `<script>` block
- **Which sections get page breaks** — Edit the `breakBefore` array in the template's `<script>` block
Troubleshooting
| Problem | Fix | |---|---| | `pandoc: command not found` | `brew install pandoc` | | Chrome not found | Check path: `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome` | | PDF is blank / empty | Increase `--virtual-time-budget` to 8000 | | Cover metadata missing | Check GEO-AUDIT-REPORT.md has the standard header format | | Fonts not loading | PDF is rendered offline; system fonts are used as fallback — this is expected |
GEO-first SEO skill for Claude Code. Comprehensive AI search optimization for any website — citability scoring, AI crawler analysis, brand authority, schema markup, platform-specific optimization, and PDF reports. If you want learn how to sell this to real businesses, check out the skool community
Repo: zubair-trabzada/geo-seo-claude
Other skills on geo-seo-claude.
- /geo-audit
Full website GEO+SEO audit with parallel subagent delegation. Orchestrates a comprehensive Generative Engine Optimization audit across AI citability, platform analysis, technical infrastructure, content quality, and schema markup. Produces a composite GEO Score (0-100) with
Open skill - /geo-brand-mentions
Brand mention and authority scanner for AI visibility. Analyzes brand presence across platforms that AI models rely on for entity recognition and citation decisions. Produces a Brand Authority Score (0-100) with platform-specific recommendations.
Open skill - /geo-citability
AI citability scoring and optimization. Analyzes web page content to determine how likely AI systems (ChatGPT, Claude, Perplexity, Gemini) are to cite or quote passages from the page. Provides a citability score (0-100) with specific rewrite suggestions.
Open skill - /geo-compare
Monthly delta tracking and progress reporting for GEO clients. Compares two GEO audits (baseline vs. current), calculates score improvements across all categories, tracks action item completion, and generates a "here's your progress" client report. Use when user says "compare",
Open skill - /geo-content
Content quality and E-E-A-T assessment for AI citability — evaluate experience, expertise, authoritativeness, trustworthiness, and content structure
Open skill - /geo-crawlers
AI crawler access analysis. Checks robots.txt, meta tags, and HTTP headers to determine which AI crawlers can access the site. Provides a complete access map and recommendations for maximizing AI visibility while maintaining appropriate control.
Open skill

