Install
$ agentstack add skill-bytefer-geo-seo-codex-geo-report-pdf ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
GEO PDF Report Generator (pandoc pipeline)
Prerequisites
- pandoc — install through Homebrew, Chocolatey, Scoop, apt, or your platform package manager
- Chrome/Chromium-compatible browser — Google Chrome, Microsoft Edge, Chromium, or Brave
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 a Chrome/Chromium-compatible browser in headless mode to print the HTML to
GEO-REPORT.pdf
Resolve GEO_ROOT from CODEX_GEO_ROOT, the loaded plugin/repository root, or the classic installer path ${CODEX_HOME:-$HOME/.codex}/skills/geo. The pandoc template ($GEO_ROOT/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 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
GEO_ROOT="${CODEX_GEO_ROOT:-}"
if [ -z "$GEO_ROOT" ]; then
for candidate in "$PWD" "$PWD/.." "$PWD/../.." "${CODEX_SKILLS_DIR:-${CODEX_HOME:-$HOME/.codex}/skills}/geo"; do
if [ -f "$candidate/templates/geo-report-template.html" ]; then
GEO_ROOT="$candidate"
break
fi
done
fi
if [ -z "$GEO_ROOT" ]; then
echo "GEO runtime root not found. Set CODEX_GEO_ROOT to the geo-seo-codex plugin/repo root."
exit 1
fi
pandoc GEO-AUDIT-REPORT.md \
--to html5 \
--standalone \
--embed-resources \
--template "$GEO_ROOT/templates/geo-report-template.html" \
--css "$GEO_ROOT/templates/geo-report-style.css" \
--metadata title="GEO Audit Report — " \
--metadata brand_name="" \
--metadata domain="" \
--metadata geo_score="" \
--metadata score_label="" \
--metadata date="" \
--metadata business_type="" \
--metadata locations="" \
--metadata platform="" \
-o GEO-REPORT.html
Replace ` 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/Chromium headless
GEO_CHROME="${GEO_CHROME:-}"
if [ -z "$GEO_CHROME" ]; then
for candidate in \
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" \
"/Applications/Chromium.app/Contents/MacOS/Chromium" \
"/c/Program Files/Google/Chrome/Application/chrome.exe" \
"/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" \
google-chrome chromium chromium-browser chrome msedge; do
if command -v "$candidate" >/dev/null 2>&1 || [ -x "$candidate" ]; then
GEO_CHROME="$candidate"
break
fi
done
fi
if [ -z "$GEO_CHROME" ]; then
echo "Chrome/Chromium executable not found. Set GEO_CHROME to Chrome, Edge, Chromium, or Brave."
exit 1
fi
"$GEO_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, ` block - Which sections get page breaks — Edit the
breakBeforearray in the template's `` block
Troubleshooting
| Problem | Fix | |---|---| | pandoc: command not found | Install pandoc with the package manager for your platform | | Chrome not found | Set GEO_CHROME to a Chrome, Edge, Chromium, or Brave executable | | 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 |
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: bytefer
- Source: bytefer/geo-seo-codex
- License: MIT
- Homepage: https://www.bestalternative.dev/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.