Install
openclaw skills install @asale-ai/geo-report-pdfGenerate 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.
openclaw skills install @asale-ai/geo-report-pdfbrew install pandoc/Applications/Google Chrome.app/No Python dependencies. No ReportLab. No JSON data wrangling.
GEO-AUDIT-REPORT.md in the current directory (created by /geo audit)pandoc with the bundled CSS + HTML template to produce a self-contained GEO-REPORT.htmlGEO-REPORT.pdfThe pandoc template (~/.claude/skills/geo/templates/geo-report-template.html) injects:
Look for GEO-AUDIT-REPORT.md in the current directory. If absent, tell the user to run /geo audit <url> first.
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 |
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.
"/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"
Tell the user:
GEO-REPORT.pdf was generated in the current directoryopen GEO-REPORT.pdf to preview itXX/100 are color-coded: ≥80 green, ≥65 blue, ≥50 amber, ≥35 orange, <35 redh3 headings containing "Critical / High / Medium / Low" get severity-colored left-border callout blocks (red / orange / yellow / green)@page)~/.claude/skills/geo/templates/geo-report-style.css~/.claude/skills/geo/templates/geo-report-template.htmlscoreColor() function in the template's <script> blockbreakBefore array in the template's <script> block| 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 |
# Markdown audit report -> styled HTML + PDF
seogeo report-pdf GEO-AUDIT-REPORT.md -o example-com-geo-report
# HTML only (no browser needed)
seogeo report-pdf GEO-AUDIT-REPORT.md --html-only
# Override the cover metadata
seogeo report-pdf GEO-AUDIT-REPORT.md --brand "Example Corp" --score 74
There is no pandoc dependency. Markdown is converted in-process, and the
PDF step drives whatever Chrome, Chromium, or Edge is already installed.
If none is found the command says so and names the SEOGEO_CHROME
override rather than failing obscurely.
The brand name defaults to the report's first H1 and the score to the
first NN/100 in the document, so a well-formed audit report needs no
flags at all.
What the styling gives you: a cover page with the score badge, section page breaks, severity-coloured callouts for headings containing Critical/High/Medium/Low, and tables that survive A4 pagination.