🔍 XEOLint
A fast, deterministic GEO and SEO linter & autofixer for Next.js
Philosophy • Installation • Usage • Rules
What is XEOLint?
XEOLint is an ESLint-like tool built specifically for Generative Engine Optimization (GEO) and SEO.
As search evolves toward LLM-driven engines (like ChatGPT Search, Perplexity, and AI Overviews), structural clarity and machine-readability are more important than ever. XEOLint statically analyzes your Next.js project (supporting both the app/ and pages/ routers) to ensure your content is perfectly structured for both traditional crawlers and modern AI agents.
⚡ The V1 Philosophy
- "ESLint for Discoverability": Useful, deterministic, and narrowly focused.
- Audit-First: Finds the missing metadata, broken hierarchies, and crawlability issues.
- Safe Autofixing: Modifies your code only when the fix is deterministic and extremely low-risk (e.g., generating missing
robots.txtorsitemap.xml). - Deep Next.js Support: Natively understands
export const metadata,"use client"directives, and<Head>tags.
🚀 Installation
XEOLint is distributed as a Python CLI tool.
pip install xeolint
(Note: XEOLint requires Python 3.9+)
🛠️ Usage
Navigate to the root of your Next.js project and run:
Audit (default — block format)
xeolint audit .
Output:
ERROR missing_title
File: src/pages/Terms.tsx
Message: No <title> found inside <Head> on this page route.
Fix: Inject a <title> element inside the Next.js <Head> component.
WARNING missing_canonical
File: src/pages/Terms.tsx
Message: No canonical URL defined for this page.
Fix: Add <link rel='canonical' href='...'> in <Head>.
✅ Passed: missing_robots_txt, missing_sitemap, missing_h1, ...
Summary: 5 errors · 9 warnings · 6 info · 12 passed
Audit (table format)
xeolint audit . --table
Fix
The fix command automatically generates missing files or metadata blocks when it is 100% safe to do so.
xeolint fix .
📐 The 20 Rules
🟢 Safe Auto-Fixes
These rules are automatically fixed when you run xeolint fix.
| Rule | What it checks |
|---|---|
missing_robots_txt |
robots.txt or app/robots.ts exists |
missing_sitemap |
sitemap.xml or app/sitemap.ts exists |
🔴 Errors (audit only)
| Rule | What it checks |
|---|---|
missing_title |
<title> or metadata.title is defined |
missing_h1 |
Page has an <h1> tag |
🟡 Warnings (audit only)
| Rule | What it checks |
|---|---|
missing_meta_description |
description is defined in metadata |
missing_canonical |
Canonical URL is defined |
missing_open_graph |
openGraph object in metadata |
missing_twitter_card |
twitter object in metadata |
page_noindex_risk |
Accidental noindex directives |
client_only_critical_content |
Heavy text hidden behind "use client" |
multiple_h1 |
More than one <h1> on a page |
weak_heading_hierarchy |
Heading levels are skipped (e.g. h1 → h3) |
missing_semantic_landmarks |
Missing <main>, <nav>, <footer> |
missing_alt_text |
Images missing meaningful alt text |
missing_json_ld |
No JSON-LD structured data found |
client_only_content_risk |
Multi-signal detection of heavy client-side rendering risk |
🔵 Info (audit only)
| Rule | What it checks |
|---|---|
unclear_page_purpose |
H1/hero text is too vague for GEO |
weak_entity_clarity |
Brand/product name missing from key areas |
missing_faq_or_structured_qa |
No FAQ section or FAQ schema |
orphan_risk_internal_linking |
Pages with no internal links pointing to them |
generic_anchor_text |
"Click here" / "Learn more" style links |
🤝 Contributing
Local Development
- Clone the repository.
- Initialize the environment:
python -m venv .venv source .venv/bin/activate pip install -e . pip install pytest
- Run the test suite:
pytest
Built to help your code be understood by machines.
Metadata
Release files for xeolint 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| xeolint-0.1.0.tar.gz | 16.5 kB | Without provenance | Details for xeolint-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| xeolint-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for xeolint-0.1.0-py3-none-any.whl |
Total release size: 49.2 kB
Release files / xeolint-0.1.0.tar.gz
| Download URL | xeolint-0.1.0.tar.gz |
|---|---|
| Size | 16.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f326765cf957e937190cc79661327400effdb1a22fbfa45b30d913e9e7696c9e
|
|
BLAKE2b-256 checksum How to use checksums |
1b56d1807b780a67f679c074c4dc46a2cd6d5763df20dd5b36d5e40cedfe7120
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.5
|
Release files / xeolint-0.1.0-py3-none-any.whl
| Download URL | xeolint-0.1.0-py3-none-any.whl |
|---|---|
| Size | 32.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ec8e104757f7e89ef62b8d38bafac07f726c004c0083b46359d60ca2b16e5a98
|
|
BLAKE2b-256 checksum How to use checksums |
cdde74d2c8054c9071f62f7f1b899267da32ccc1acdee43348830ace009d462c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.5
|
Security for xeolint 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.