Generate a professional PDF report from a GEO audit
GEO PDF Report Generator (pandoc pipeline)

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.
--- 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.
Overview
No Python dependencies. No ReportLab. No JSON data wrangling.
Manual install (npx, ZIP)
npx skills add zubair-trabzada/geo-seo-claude --skill geo-report-pdf -g -a claude-codemkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/zubair-trabzada/geo-seo-claude/tar.gz/383829485f86 \
| tar -xz -C ~/.claude/skills --strip-components=2 geo-seo-claude-383829485f86/skills/geo-report-pdfNew-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/3c6c734d1af100aaa4cd/geo-report-pdf.zip" -OutFile "$env:TEMP\geo-report-pdf.zip"; Expand-Archive "$env:TEMP\geo-report-pdf.zip" -DestinationPath "$HOME\.claude\skills" -ForceConnects with Agent Alley MCP · agentalley.io/mcp
Files included
SKILL.md5.0 KB
Read the files here
zubair-trabzada/
Show the full text121 lines
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
- Read
GEO-AUDIT-REPORT.mdin the current directory (created by/geo audit) - Extract cover metadata from the report (brand name, domain, GEO score, date, locations)
- Run
pandocwith the bundled CSS + HTML template to produce a self-containedGEO-REPORT.html - 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.pdfwas generated in the current directory- File size
- Optionally:
open GEO-REPORT.pdfto 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/100are color-coded: ≥80 green, ≥65 blue, ≥50 amber, ≥35 orange, <35 red - Finding sections —
h3headings 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
breakBeforearray 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 |
| 1 | |
| 2 | name geo-report-pdf |
| 3 | 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. |
| 4 | version 2.0.0 |
| 5 | author geo-seo-claude |
| 6 | tags [geo, pdf, report, client-deliverable, professional] |
| 7 | allowed-tools Read, Grep, Glob, Bash, Write |
| 8 | |
| 9 | |
| 10 | # GEO PDF Report Generator (pandoc pipeline) |
| 11 | |
| 12 | ## Prerequisites |
| 13 | |
| 14 | **pandoc** — `brew install pandoc` |
| 15 | **Google Chrome** — must be installed at `/Applications/Google Chrome.app/` |
| 16 | |
| 17 | No Python dependencies. No ReportLab. No JSON data wrangling. |
| 18 | |
| 19 | ## How It Works |
| 20 | |
| 21 | Read `GEO-AUDIT-REPORT.md` in the current directory (created by `/geo audit`) |
| 22 | Extract cover metadata from the report (brand name, domain, GEO score, date, locations) |
| 23 | Run `pandoc` with the bundled CSS + HTML template to produce a self-contained `GEO-REPORT.html` |
| 24 | Run Chrome headless to print the HTML to `GEO-REPORT.pdf` |
| 25 | |
| 26 | The pandoc template (`~/.claude/skills/geo/templates/geo-report-template.html`) injects: |
| 27 | A full-bleed dark navy cover section with the GEO score badge |
| 28 | Per-section cover metadata (date, business type, locations, platform) |
| 29 | JavaScript that runs inside Chrome before printing to color-code score cells and severity-tag finding sections |
| 30 | |
| 31 | ## Workflow |
| 32 | |
| 33 | ### Step 1: Check for audit report |
| 34 | |
| 35 | Look for `GEO-AUDIT-REPORT.md` in the current directory. If absent, tell the user to run `/geo audit <url>` first. |
| 36 | |
| 37 | ### Step 2: Extract cover metadata from the report |
| 38 | |
| 39 | Read the top of `GEO-AUDIT-REPORT.md` and extract: |
| 40 | |
| 41 | | Field | Where to find it | |
| 42 | |---|---| |
| 43 | | `brand_name` | First H1 title (after "GEO Audit Report:") | |
| 44 | | `domain` | Second bold line (e.g. `**Domain:** alexamediasolutions.com`) | |
| 45 | | `geo_score` | Line matching `## Overall GEO Score: XX / 100` | |
| 46 | | `score_label` | Word after the score on that same line (e.g. "Poor", "Fair", "Good") | |
| 47 | | `date` | `**Audit Date:**` line | |
| 48 | | `business_type` | `**Business Type:**` line | |
| 49 | | `locations` | `**Locations:**` line | |
| 50 | | `platform` | `**CMS:**` line | |
| 51 | |
| 52 | ### Step 3: Run pandoc |
| 53 | |
| 54 | |
| 55 | pandoc GEO-AUDIT-REPORT.md \ |
| 56 | --to html5 \ |
| 57 | --standalone \ |
| 58 | --embed-resources \ |
| 59 | --template ~/.claude/skills/geo/templates/geo-report-template.html \ |
| 60 | --css ~/.claude/skills/geo/templates/geo-report-style.css \ |
| 61 | --metadata title="GEO Audit Report — <brand_name>" \ |
| 62 | --metadata brand_name="<brand_name>" \ |
| 63 | --metadata domain="<domain>" \ |
| 64 | --metadata geo_score="<geo_score>" \ |
| 65 | --metadata score_label="<score_label>" \ |
| 66 | --metadata date="<date>" \ |
| 67 | --metadata business_type="<business_type>" \ |
| 68 | --metadata locations="<locations>" \ |
| 69 | --metadata platform="<platform>" \ |
| 70 | -o GEO-REPORT.html |
| 71 | |
| 72 | |
| 73 | 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. |
| 74 | |
| 75 | ### Step 4: Run Chrome headless |
| 76 | |
| 77 | |
| 78 | "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \ |
| 79 | --headless=new \ |
| 80 | --disable-gpu \ |
| 81 | --no-sandbox \ |
| 82 | --print-to-pdf="$(pwd)/GEO-REPORT.pdf" \ |
| 83 | --print-to-pdf-no-header \ |
| 84 | --no-pdf-header-footer \ |
| 85 | --virtual-time-budget=5000 \ |
| 86 | "file://$(pwd)/GEO-REPORT.html" |
| 87 | |
| 88 | |
| 89 | ### Step 5: Report completion |
| 90 | |
| 91 | Tell the user: |
| 92 | `GEO-REPORT.pdf` was generated in the current directory |
| 93 | File size |
| 94 | Optionally: `open GEO-REPORT.pdf` to preview it |
| 95 | |
| 96 | ## What the PDF Contains |
| 97 | |
| 98 | **Cover page** — Dark navy gradient, brand name, domain, GEO score badge (colored by score), audit date, business type, locations, CMS platform |
| 99 | **Score tables** — Cells containing `XX/100` are color-coded: ≥80 green, ≥65 blue, ≥50 amber, ≥35 orange, <35 red |
| 100 | **Finding sections** — `h3` headings containing "Critical / High / Medium / Low" get severity-colored left-border callout blocks (red / orange / yellow / green) |
| 101 | **Section page breaks** — Major sections (High Priority, 90-Day Roadmap, Component Score Summary, Generated Schema) break to new pages automatically |
| 102 | **Code blocks** — JSON schema templates render with dark theme monospace styling |
| 103 | **Page footer** — Brand name · GEO Audit · date + page numbers (via CSS `@page`) |
| 104 | |
| 105 | ## Customizing the Report |
| 106 | |
| 107 | **Colors / typography** — Edit `~/.claude/skills/geo/templates/geo-report-style.css` |
| 108 | **Cover layout** — Edit `~/.claude/skills/geo/templates/geo-report-template.html` |
| 109 | **Score thresholds for color-coding** — Edit the `scoreColor()` function in the template's `<script>` block |
| 110 | **Which sections get page breaks** — Edit the `breakBefore` array in the template's `<script>` block |
| 111 | |
| 112 | ## Troubleshooting |
| 113 | |
| 114 | | Problem | Fix | |
| 115 | |---|---| |
| 116 | | `pandoc: command not found` | `brew install pandoc` | |
| 117 | | Chrome not found | Check path: `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome` | |
| 118 | | PDF is blank / empty | Increase `--virtual-time-budget` to 8000 | |
| 119 | | Cover metadata missing | Check GEO-AUDIT-REPORT.md has the standard header format | |
| 120 | | Fonts not loading | PDF is rendered offline; system fonts are used as fallback — this is expected | |
| 121 |
Details
- Version
- 2.0.0
- Updated
- Sep 21, 2026
- License
- MIT
- Stars on the repo
- ★ 10,775
- Checked
- Source
- zubair-trabzada/geo-seo-claude ↗
- Creator
- zubair-trabzada · 30 listings
Similar skills
See all →
SkillOptimize content for AI Overviews , ChatGPT web searchAI Search / GEO Optimization (May 2026)
SkillGeolocate or chronolocate a photo with tool-verifiedgeo-sleuth (v2)
SkillMeasure real AI-engine visibilityAI visibility
SkillUse GEO and AEO as legacy labels for AI citation readinessAI Search SEO: Citation Strategies
SkillSEO·AEO·GEO·LLMO·NEO 다섯 레인을 진단하고 직접 구현하며fire-your-seo-agency — 운영 절차
SkillRun a unified SEO and GEO audit for a website, pageSEO GEO Audit SkillMore from zubair-trabzada
SkillAI crawler access analysisAI Crawler Access Analysis Skill
SkillAct as the advertising engine for /market ads <urlAd Creative & Copy Generation
SkillPaste in your website and marketing copyBrand Voice Analysis and Guidelines Generation
SkillAct as a comprehensive AI sales intelligenceAI Sales Team — Main Orchestrator
SkillAct as the cold outreach engine for /sales outreachCold outreach sequence generator
SkillAct as the company research engine for /sales research <urlCompany Research & Firmographic Analysis