Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add bytefer/geo-seo-codex --skill geo-report-pdfgit clone --depth 1 https://github.com/bytefer/geo-seo-codexWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/bytefer/geo-seo-codex/geo-report-pdf)<a href="https://agentmods.dev/skills/bytefer/geo-seo-codex/geo-report-pdf"><img src="https://agentmods.dev/badge/skills/bytefer/geo-seo-codex/geo-report-pdf/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/bytefer/geo-seo-codex/geo-report-pdf"><img src="https://agentmods.dev/badge/skills/bytefer/geo-seo-codex/geo-report-pdf.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00065 | $0.01700 |
| Opus 5.5 | $0.00026 | $0.00680 |
| Sonnet 5.5 | $0.00013 | $0.00340 |
| Haiku 4.5 | $0.00006 | $0.00170 |
Grade A, and why
geo-report-pdf scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 152 lines — stays where its author put it; the contents beside it link to each section on GitHub.
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 <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
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 — <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
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 152 lines · 65 tokens per session scan A ae22db5851c0
geo-report-pdf is a skill published in the GitHub repository bytefer/geo-seo-codex (13 stars, last pushed 3mo ago), licensed MIT. It adds 65 tokens to every session and 1,700 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
autodoc-next-prospectus-audit
Audit one local prospectus PDF, DOC, or DOCX through PDRouter and download the annotated document with AutoDoc NEXT2.0.
ChatDOC Studio--KnowledgeMate
Create and operate ChatDOC Studio knowledge bases through pdrouter using a Bearer API key and JavaScript helpers. Use when Codex needs to upload one or more PDF/DOC/DOCX files, skip failed files without aborting the whole job, create a knowledge base from successful uploads, or call the ChatDOC Studio knowledge-base…
PDFlux-PDF2Markdown
Convert unstructured documents into LLM-ready structured data. Supports PDF, Word, PPT, and images; extracts paragraphs, formulas, tables, charts, and other elements in one step; generates up to 8 levels of headings; and outputs Markdown organized in reading order. Useful for field extraction, comparison and…
chatdoc-studio-api
ChatDOC Studio API usage guide - complete documentation and examples for PDF parsing, chat applications, agent applications, content retrieval, and data extraction APIs.
nature-paper-trans
A workflow for translating selected pages or a complete English research-paper PDF into a simplified-Chinese, image-based PDF. bioRxiv is not mentioned in the provided details; the workflow applies to research-paper PDFs generally.
nature-reader
A tool for creating Chinese-English, side-by-side readers from research papers. It can work from PDFs, DOI links, arXiv papers, publisher webpages, or pasted text, while keeping figures, tables, and equations connected to the surrounding explanation.