Skip to main content

The oracle that tells you how AIs see your site — GEO/AEO audit CLI

Project description

Pythia

The oracle that tells you how AIs see your site.

PyPI Python License: MIT CI Coverage PyPI downloads

Pythia is a local-first CLI that audits any webpage for GEO (Generative Engine Optimization) and AEO (Answer Engine Optimization) — making sure AI systems like ChatGPT, Claude, Perplexity, and Mistral can read, cite, and recommend your content.

No API key. No SaaS. No cloud account. Works on any public URL. Pipe it into CI/CD and fail the build if your GEO score drops below threshold.

pip install pythia-geo
pythia audit https://example.com

Why GEO matters

Traditional SEO optimizes for crawlers. GEO optimizes for large language models that summarize, answer, and cite web content directly in their responses. If your site isn't structured for AI comprehension, you're invisible to a growing share of user queries.

Pythia checks 14 signals across three categories:

Category Weight What it covers
Structure 40% llms.txt, robots.txt bot policies, sitemap, JSON-LD
HTML 30% H1 uniqueness, heading hierarchy, title, meta description, OpenGraph
Content 30% Generic headings, FAQ patterns, E-E-A-T signals, structured lists

Quick start

# Audit a URL, print Markdown report
pythia audit https://example.com

# JSON output for CI integration
pythia audit https://example.com --format json

# French output
pythia audit https://example.com --lang fr

# Fail if score < 80 (default threshold: 70)
pythia audit https://example.com --threshold 80

# Save report to file
pythia audit https://example.com --output report.md

# List all available checks
pythia list-checks

Exit code: 0 if score ≥ threshold, 1 otherwise.


CI/CD integration

# .github/workflows/geo-audit.yml
- name: GEO audit
  run: |
    pip install pythia-geo
    pythia audit https://yoursite.com --threshold 70 --format json --output geo-report.json

Sample output

# Pythia GEO Audit — https://example.com

Score: 74/100  ●●●●●●●○○○  ❌ FAIL (threshold: 70)

## STRUCTURE (40%)  —  32/100

- ✅ PASS `llms_txt_present` — llms.txt found and accessible
- ⚠️  WARN `llms_full_txt_present` — llms-full.txt not found (optional but recommended)
- ✅ PASS `robots_ai_bots` — No AI bots blocked in robots.txt
- ✅ PASS `sitemap_accessible` — Sitemap found and accessible
- ❌ FAIL `jsonld_present_valid` — No JSON-LD structured data found

## HTML (30%)  —  25/100

- ✅ PASS `single_h1` — Exactly one H1 found
- ✅ PASS `heading_hierarchy` — Heading hierarchy is sequential
- ✅ PASS `title_length` — Title length is within 30–65 characters
- ⚠️  WARN `meta_description` — Meta description present but length is outside 70–160 characters
- ❌ FAIL `opengraph_minimal` — No OpenGraph tags found

## CONTENT (30%)  —  17/100

- ✅ PASS `generic_headings` — No generic headings detected
- ⚠️  WARN `faq_pattern` — No FAQ structure found
- ✅ PASS `eeat_signals` — Author and publication date detected
- ❌ FAIL `structured_content` — No structured content found (no lists or tables)

## Recommendations

- **`jsonld_present_valid`** — Add <script type="application/ld+json"> with Organization or Article schema
- **`opengraph_minimal`** — Add og:title, og:description, og:type meta tags
- **`structured_content`** — Use <ul>, <ol>, or <table> to structure your content

Checks reference

# ID Category PASS WARN FAIL
1 llms_txt_present structure /llms.txt accessible missing or empty
2 llms_full_txt_present structure /llms-full.txt accessible missing
3 robots_ai_bots structure no AI bots blocked robots.txt missing ≥1 bot blocked
4 sitemap_accessible structure sitemap found not found
5 jsonld_present_valid structure valid JSON-LD found malformed JSON none
6 single_h1 html exactly 1 H1 >1 H1 no H1
7 heading_hierarchy html no level gaps ≥1 gap
8 title_length html 30–65 chars out of range missing
9 meta_description html 70–160 chars out of range missing
10 opengraph_minimal html og:title + og:description + og:type 1–2 missing none
11 generic_headings content 0 generic 1–2 in H2+ H1 generic or ≥3
12 faq_pattern content FAQ detected none found
13 eeat_signals content author + date one of two neither
14 structured_content content ≥1 list or table none

AI bots checked by robots_ai_bots: GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, MistralAI-User.


About the name

In ancient Greece, Pythia was the Oracle of Delphi — the high priestess of Apollo who delivered prophecies to kings, generals, and philosophers. Seekers traveled from across the Mediterranean to ask her questions and receive pivotal answers that shaped history.

Today, LLMs are the new oracles. Ask ChatGPT about a product, a concept, a brand — and it will answer with the confidence of a Delphic prophecy. Whether your site appears in that answer, and how accurately it's represented, depends entirely on how well your content speaks to these modern oracles.

Pythia ensures the oracle speaks your truth.

The name also fits the Kryptide ecosystem: kryptos (κρυπτός) means "hidden" in Greek — Pythia is the one who reveals.


Contributing

Issues and PRs welcome. See the project conventions in CLAUDE.md.

Commit messages follow Conventional Commits: feat:, fix:, docs:, test:, chore:.


License

MIT — see LICENSE.


🇫🇷 En français

Pythia est un CLI Python qui audite n'importe quelle page web pour le GEO (Generative Engine Optimization) — l'optimisation pour les moteurs de réponse IA comme ChatGPT, Claude, Perplexity et Mistral.

Sans clé API. Sans SaaS. Fonctionne en local ou en CI/CD.

pip install pythia-geo
pythia audit https://monsite.fr --lang fr

14 vérifications réparties en trois catégories : structure (40%), HTML (30%), contenu (30%). Score sur 100. Seuil configurable (défaut : 70). Code de sortie 1 si sous le seuil.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pythia_geo-0.2.1.tar.gz (28.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pythia_geo-0.2.1-py3-none-any.whl (20.2 kB view details)

Uploaded Python 3

File details

Details for the file pythia_geo-0.2.1.tar.gz.

File metadata

  • Download URL: pythia_geo-0.2.1.tar.gz
  • Upload date:
  • Size: 28.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pythia_geo-0.2.1.tar.gz
Algorithm Hash digest
SHA256 0021187de733699ed7885e5a2fc6da84b6be7da4fdb35c0974883777c0c3d013
MD5 ffc025b0be2d0f1207d83f55db290b7f
BLAKE2b-256 556031b820ce89667120b70e264f558e391276a62398e9b5c7104074ae50686c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pythia_geo-0.2.1.tar.gz:

Publisher: publish.yml on BigFoot3/pythia

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pythia_geo-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: pythia_geo-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 20.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pythia_geo-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6a5a8ede349dd5d2df6c189c2d1680ea40dcdf5d9eaf73a80bc5fd6b811c58a5
MD5 0dd6949f445e5e6f39bc0a7f359c047d
BLAKE2b-256 6ac15089735e140e3bd1c27fb5f034357613b74ceb1016de581e79ac0dd7cd7c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pythia_geo-0.2.1-py3-none-any.whl:

Publisher: publish.yml on BigFoot3/pythia

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page