New: Earn 20% as an AgentAlley affiliate. Share your link and earn on every sale you refer. Join now New: Earn 20% as an affiliate. Join now

Generate a professional PDF report from a GEO audit

GEO PDF Report Generator (pandoc pipeline)

by zubair-trabzada · MIT license · ★ 10,775 on GitHub · v2.0.0 · updated Sep 21

GEO PDF Report Generator (pandoc pipeline) cover

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)
Claude Codenpx skills add zubair-trabzada/geo-seo-claude --skill geo-report-pdf -g -a claude-code
Claude Code (manual)mkdir -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-pdf
Windows (PowerShell)New-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" -Force
Claude.ai / desktopDownload the ZIP and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md5.0 KB
Read the files here
zubair-trabzada/38382941 file
SKILL.md
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

  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
1---
2name: geo-report-pdf
3description: 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.
4version: 2.0.0
5author: geo-seo-claude
6tags: [geo, pdf, report, client-deliverable, professional]
7allowed-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 
17No Python dependencies. No ReportLab. No JSON data wrangling.
18 
19## How It Works
20 
211. Read `GEO-AUDIT-REPORT.md` in the current directory (created by `/geo audit`)
222. Extract cover metadata from the report (brand name, domain, GEO score, date, locations)
233. Run `pandoc` with the bundled CSS + HTML template to produce a self-contained `GEO-REPORT.html`
244. Run Chrome headless to print the HTML to `GEO-REPORT.pdf`
25 
26The 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 
35Look 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 
39Read 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```bash
55pandoc 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 
73Replace `<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```bash
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 
91Tell 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 
View all files on GitHub →

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
View creator

Similar skills

See all →
SkillOptimize content for AI Overviews , ChatGPT web searchAI Search / GEO Optimization (May 2026)AgriciDaniel/claude-seo · by AgriciDanielOptimize content for AI Overviews (formerly SGE), ChatGPT web search, Perplexity, and other AI-powered search experiences. Generative Engine Optimization (GEO) analysis including brand mention signals, AI crawler accessibility, llms.txt compliance, passage-level citability scoring, and platform-specific optimization. Use when user says "AI Overviews", "SGE", GEO", "AI search", "LLM optimization", "Perplexity", "AI citations", ChatGPT search", or "AI visibility".★ 17.4k GitHub starsSkillGeolocate or chronolocate a photo with tool-verifiedgeo-sleuth (v2)Oldcircle/geo-sleuth · by OldcircleGeolocate or chronolocate a photo with tool-verified reasoning (where was this taken / when was it taken / photo geolocation / geo-guessing). Given one or more photos, intake.py does metadata, OCR and reverse image search (Baidu/Yandex) in one command; clues and candidates go on a candidate board (board.py) that ranks them and gives the next step; clues.py looks up calling codes, driving side, plates and area codes from region packs; for satellite and street view the machine ranks first and you look only at the top few (CLIP in sat_scan.py, DINOv2+SIFT in match.py); plus sun and shadow math, OSM Overpass and DEM skylines. Every conclusion is checked against real data; output is coordinates + error radius, evidence images and tiered confidence. Use when the user shares a photo and asks where was this taken / geolocate this / when was this taken / 这是哪 / 在哪拍的 / 帮我定位这张照片 / 网络迷踪 / 图寻 / 几点拍的.★ 3.4k GitHub starsSkillMeasure real AI-engine visibilityAI visibilityRyze-AI-Adgent/open-seo-mcp-skills · by Ryze-AI-AdgentMeasure real AI-engine visibility — traffic from ChatGPT, Perplexity, Claude, Gemini and which pages they cite — from actual GA4 referral data, not prompt sampling. Use when asked "AI visibility", "GEO/AEO check", "do LLMs cite us", "traffic from ChatGPT", or "how do we show up in AI search".★ 3.1k GitHub starsSkillUse GEO and AEO as legacy labels for AI citation readinessAI Search SEO: Citation StrategiesAgriciDaniel/claude-blog · by AgriciDanielUse GEO and AEO as legacy labels for AI citation readiness. For Google, the★ 2.2k GitHub starsSkillSEO·AEO·GEO·LLMO·NEO 다섯 레인을 진단하고 직접 구현하며fire-your-seo-agency — 운영 절차leopard627/fire-your-seo-agency · by leopard627SEO·AEO·GEO·LLMO·NEO(네이버) 다섯 레인을 진단하고 직접 구현하며, 인용되는 콘텐츠를 계속 생산하는 서브 블로그·콘텐츠 운영 파이프라인까지 세팅하는 스킬. 사이트를 검색엔진·답변엔진·생성 AI·네이버 AI 브리핑이 인용하는 1차 소스로 만든다. "SEO 해줘", "AI에 인용되게 해줘", "네이버 노출 늘려줘", "llms.txt 만들어줘", "블로그 만들어줘/글 써줘", "콘텐츠 백로그·캘린더 잡아줘", "낡은 글 갱신해줘" 류 요청에 사용. Use for "audit my site's SEO", "get my site cited by ChatGPT/Perplexity/AI Overviews", "improve search visibility", "create llms.txt", "answer engine / generative engine optimization", "set up a blog that gets cited", "content backlog / calendar / refresh", and any AI-search-visibility request.★ 716 GitHub starsSkillRun a unified SEO and GEO audit for a website, pageSEO GEO Audit Skilldageno-agents/seo-geo-audit · by dageno-agentsRun a unified SEO and GEO audit for a website, page, or domain. Use when the user asks for a full SEO audit, GEO audit, AI visibility review, EEAT review, entity audit, authority audit, or wants one prioritized report that combines technical findings, content quality, trust signals, and AI citation readiness.★ 175 GitHub stars

More from zubair-trabzada

SkillAI crawler access analysisAI Crawler Access Analysis Skillzubair-trabzada/geo-seo-claude · by zubair-trabzadaAI 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.★ 10.8k GitHub starsSkillAct as the advertising engine for /market ads <urlAd Creative & Copy Generationzubair-trabzada/ai-marketing-claude · by zubair-trabzadaYou are the advertising engine for /market ads <url>. You generate complete ad campaigns across platforms with full copy variations,…★ 2.7k GitHub starsSkillPaste in your website and marketing copyBrand Voice Analysis and Guidelines Generationzubair-trabzada/ai-marketing-claude · by zubair-trabzadaPaste in your website and marketing copy, and get back a clear guide anyone on your team can follow to sound like your brand every time.★ 2.7k GitHub starsSkillAct as a comprehensive AI sales intelligenceAI Sales Team — Main Orchestratorzubair-trabzada/ai-sales-team-claude · by zubair-trabzadaYou are a comprehensive AI sales intelligence and outreach system for Claude Code. You help founders, sales teams, agency owners, and…★ 1.4k GitHub starsSkillAct as the cold outreach engine for /sales outreachCold outreach sequence generatorzubair-trabzada/ai-sales-team-claude · by zubair-trabzadaYou are the cold outreach engine for /sales outreach <prospect>. You generate complete, personalized, ready-to-send cold email sequences…★ 1.4k GitHub starsSkillAct as the company research engine for /sales research <urlCompany Research & Firmographic Analysiszubair-trabzada/ai-sales-team-claude · by zubair-trabzadaYou are the company research engine for /sales research <url>. You produce deep, structured intelligence on a prospect company covering 8…★ 1.4k GitHub stars