Skip to content
GEO AI
AnalyzerCLIDocumentationSpecificationContact
Documentation

Getting Started

  • Introduction
  • Quick Start
  • Choose Your Package

GEO Specification

  • Overview
  • llms.txt
  • AI Metadata
  • Crawler Rules
  • Structured Signals
  • Scoring
  • Recommendations

Packages

  • GEO AI Core
  • GEO AI Next
  • GEO AI Woo
  • GEO AI Shopify

Analyzer

  • Overview
  • Scoring
  • Recommendations

CLI

  • GEO AI CLI

Integrations

  • NestJSsoon
  • Laravelsoon

Reference

  • Configuration
  • API Reference
  • FAQ
DocsSpecificationRecommendations

Recommendations Specification

How the Analyzer generates, categorizes, and surfaces actionable recommendations — the Recommendation interface, all 15 recommendation codes grouped by category, and guidance on which fixes to tackle first.

Recommendation interface

Each checker emits zero or more Recommendation objects. The Analyzer aggregates them into the AIReadinessReport.recommendations array. The interface is defined in lib/analyzer/types.ts:

FieldTypeDescription
codestringA stable, uppercase snake_case identifier for the recommendation (e.g. ADD_LLMS_TXT). Use this field to programmatically identify and act on specific recommendations.
categoryAnalysisCategoryThe analysis category that produced this recommendation: llmsTxt, aiMetadata, crawlerRules, or structuredSignals.
titlestringA short, human-readable title suitable for display in a report or UI (e.g. “Create an llms.txt file”).
descriptionstringA detailed explanation of the issue and the corrective action to take. May include URLs, field names, or implementation guidance.

Recommendations are per-category

Each checker independently decides which recommendations to emit based on its own check result. A single analysis run can produce zero recommendations (all categories passing) or up to several recommendations if multiple categories have issues.

Recommendation codes

The following 15 codes are emitted by the four checkers. Codes are grouped by AnalysisCategory.

llmsTxt

CodeTrigger condition
ADD_LLMS_TXT/llms.txt returns HTTP 404. The file does not exist.
POPULATE_LLMS_TXT/llms.txt returns HTTP 200 but the response body is empty.
FIX_LLMS_TXT_CONTENT_TYPE/llms.txt is served with a non-text content type (not text/* or JSON).
IMPROVE_LLMS_TXT/llms.txt body is fewer than 100 characters, or contains no informative signals (no URLs, paths, or site description pattern).
FIX_LLMS_TXT_ACCESS/llms.txt returns an unexpected HTTP status other than 200 or 404 (e.g. 403, 500).

aiMetadata

CodeTrigger condition
COMPLETE_CRITICAL_METADATAAt least one critical tag is present but one or more are missing (partial warn state).
ADD_CRITICAL_METADATAAll four critical tags (<title>, meta[name="description"], meta[property="og:title"], meta[property="og:description"]) are absent (fail state).
IMPROVE_SUPPLEMENTAL_METADATAOne or more non-critical tags are missing and the overall status is warn. Emitted alongside COMPLETE_CRITICAL_METADATA when applicable.

crawlerRules

CodeTrigger condition
ADD_ROBOTS_TXT/robots.txt returns HTTP 404. No crawler rules are in place.
ALLOW_AI_CRAWLERSA global Disallow: / rule exists, or all 10 AI crawlers are explicitly blocked (fail state).
REVIEW_AI_CRAWLER_ACCESSA majority of AI crawlers (≥6 of 10) are blocked, or ≥5 are unspecified and ≥1 is blocked (warn state).

structuredSignals

CodeTrigger condition
ADD_JSONLDNo JSON-LD blocks found, but microdata or RDFa markup is present on the page.
ADD_STRUCTURED_DATANo structured data markup of any kind (JSON-LD, microdata, RDFa) is found. Emitted in both warn (sitemap present) and fail (no sitemap) states.
ADD_SITEMAPNo structured data markup and no valid /sitemap.xml found (fail state only).
FIX_INVALID_JSONLDOne or more <script type="application/ld+json"> blocks contain invalid JSON that cannot be parsed.

Prioritization

Because each AnalysisCategory contributes equally (25%) to the overall score, fixing a category from not_found (10 points) to pass (100 points) adds 22.5 points to the overall score. The order in which you address recommendations affects how quickly your score improves.

  • Start with llmsTxt and aiMetadata. Together they account for 50% of the score. Both are typically fast to implement — an llms.txt file and a complete <head> can be added in minutes. Address ADD_LLMS_TXT and ADD_CRITICAL_METADATA first.
  • Fix fail conditions before warn conditions. A fail result scores 20 points; a warn result scores 65 points. Moving from fail to pass gains 80 points in that category; moving from warn to pass gains only 35. Prioritize ALLOW_AI_CRAWLERS and ADD_CRITICAL_METADATA over REVIEW_AI_CRAWLER_ACCESS or IMPROVE_LLMS_TXT.
  • Address not_found before unknown. A not_found result (10 points) scores lower than unknown (40 points) because a 404 is a definitive signal that the resource is absent. Fix ADD_LLMS_TXT, ADD_ROBOTS_TXT, and ADD_STRUCTURED_DATA before investigating transient network issues.
  • Supplemental improvements last. Recommendations like IMPROVE_SUPPLEMENTAL_METADATA, ADD_JSONLD, and IMPROVE_LLMS_TXT refine an already-partial implementation. Address them after all fail and not_found conditions are resolved.

Use recommendation codes to automate fixes

GEO AI packages (@geo-ai/core, @geo-ai/next, etc.) generate the artifacts that resolve these recommendations. If your report contains ADD_LLMS_TXT, run the GEO AI generator to produce a compliant llms.txt. If it contains ADD_JSONLD, use the structured data generator to emit the correct JSON-LD blocks.
PreviousScoringNextGEO AI Core

On this page

  • Recommendation interface
  • Recommendation codes
  • Prioritization
GEO AI

AI Search Optimization

AnalyzerCLIDocumentationSpecificationContact

© 2026 GEO AI · Open Source · GPL-2.0 License