31 actions to do — 2 high, 10 medium, 10 low, 9 to get ahead.
Elements the competitors have that this page doesn't
Claims lacking statistics, citations or an author entity
Issues affecting crawlability, indexing and trust
No key-takeaways / TL;DR block · No table of contents · No comparison table · No FAQ block · No entity sameAs links · No llms.txt · No EntityMap published
| Content Structure | Complete Open Graph tags | 5/5 competitors |
| Content Structure | Open Graph image | 5/5 competitors |
| Authority Signals | Visible freshness date | 5/5 competitors |
| Data & Evidence | Cited sources | 5/5 competitors |
| Content Depth | Substantial depth (1,500+ words) | 5/5 competitors |
| Authority Signals | Structured data (JSON-LD) | 4/5 competitors |
| Authority Signals | Author entity | 3/5 competitors |
| Data & Evidence | Supporting statistics | 3/5 competitors |
| Topical Coverage | FAQ questions | 2/5 competitors |
| Content Depth | TL;DR block | 2/5 competitors |
Ranked by how many of the competitors already have it. Elements none of them carry are left out.
Open the action plan for every item with its fix.
Grouped by priority — technical, competitor and content gaps together. Where a ready-made fix exists, open the ▸ link beneath the item for paste-ready code, wording or an example; the rest describe what to change. “Get ahead” is what none of the competitors do yet.
None found on your page, but the competitors use it. Schema earns rich results and helps machines understand the page.
You: 0 blocks · Competitors: 1 (median)
Organization + WebSite — paste into <head>
<script type="application/ld+json">
[
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Readme",
"url": "https://readme.com"
},
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Readme",
"url": "https://readme.com"
}
]
</script>At ~601px it will truncate in Google.
<title>GEO For Developer Documentation — What GEO | Readme</title>
The competitor pages are substantially longer. Thin pages struggle to cover a topic fully — and to get cited.
You: 954 · Competitors: 2570 (median)
Named authorship is an E-E-A-T signal AI answers weigh. Most competitors show one.
You: no author shown · Competitors: 3/5 have it
Freshness matters for both search and AI. Add a visible date.
You: no publish/updated date · Competitors: 4/5 have it
Dates set to today; keep dateModified current when you edit.
<!-- visible on the page -->
<p>Last updated: <time datetime="2026-08-07">7 August 2026</time></p>
<!-- in your JSON-LD -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"url": "https://readme.com",
"datePublished": "2026-08-07",
"dateModified": "2026-08-07"
}
</script>Replace vague claims with concrete numbers, percentages and data points.
You: 0 · Competitors: 6 (median)
Examples to adapt — keep the attribution and re-verify each figure before publishing:
1 render-blocking script(s) in <head>.
2 of the competitors mark up BreadcrumbList schema and you don't.
BreadcrumbList — fill in the specifics, then paste into <head>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://readme.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "What GEO and AEO Mean for Developer Documentation",
"item": "https://readme.com/resources/what-geo-aeo-means"
}
]
}
</script>These competitors turn user questions into headings and place concise answers immediately below them. The ReadMe article is clear, but it does not demonstrate a repeatable question-to-answer template for API reference, quickstarts, troubleshooting, and conceptual docs.
Suggested heading: A Question-and-Answer Template for Developer Docs
Competitors cover refresh cadence, technical review, rich media, consolidation, redirects, date updates, and re-promotion. ReadMe mentions accurate dates and stale versions but lacks an operational workflow for deciding what to update, merge, remove, or redirect.
Suggested heading: How to Run a GEO Documentation Refresh
The competitors identify weak patterns such as generic definition posts and explain how teams can adapt existing programmes. ReadMe lists several common mistakes, but does not turn them into a prioritised migration plan for documentation, developer relations, support, and engineering teams.
Suggested heading: What to Stop, Start, and Keep
Competitors address technical review, performance, structured markup, and content architecture. ReadMe mentions sitemaps, robots, and schema, but not how teams should test rendered HTML, response status, canonicals, performance, or crawler access after deployment.
Suggested heading: Validate What Crawlers and Agents Actually Receive
Ordered steps are clean, quotable structure for how-to content.
You: no step list · Competitors: 3/5 have it
Declares the master URL and avoids duplicate-content confusion.
You: no canonical tag · Competitors: 5/5 have it
A table with clear headers is a format AI answers pull directly for “best/compare/vs” queries.
You: 0 · Competitors: some (median)
A named author with Person schema is an E-E-A-T signal AI answers weigh.
You: no author entity · Competitors: 3/5 have it
Person — fill in the author's name
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Author Name",
"url": "https://readme.com",
"jobTitle": "GEO For Developer Documentation",
"worksFor": {
"@type": "Organization",
"name": "Readme"
}
}
</script>1 links with no anchor text.
No og:image (blank social/AI card).
CSP helps guard against cross-site scripting.
Set on your server, or add a Cloudflare Transform Rule (Modify Response Header):
Content-Security-Policy: default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self' (tailor to your site; test in report-only first)
Without nosniff, browsers may MIME-sniff content.
Set on your server, or add a Cloudflare Transform Rule (Modify Response Header):
X-Content-Type-Options: nosniff
Protects against clickjacking in frames.
Set on your server, or add a Cloudflare Transform Rule (Modify Response Header):
X-Frame-Options: SAMEORIGIN
Prevents URLs leaking on downgrade.
Set on your server, or add a Cloudflare Transform Rule (Modify Response Header):
Referrer-Policy: strict-origin-when-cross-origin
Build a test harness that asks the same integration questions against current and deprecated versions, records cited URLs and code, and fails when an assistant recommends a retired endpoint or parameter. Tie each test case to the product release that could invalidate it.
Test whether each independently retrieved section still contains the endpoint, version, authentication assumption, units, and exceptions needed to interpret it. This turns the article's 'correct in chunks' principle into a measurable documentation quality gate.
Continuously compare narrative docs and examples with the canonical OpenAPI description for parameter names, required fields, status codes, and deprecations. Publish the parity result internally and block releases when high-risk contradictions appear.
For selected high-value questions, record not only whether ReadMe is cited but which exact passage supports each claim, whether the assistant combines incompatible versions, and whether the cited page is primary documentation or a third-party paraphrase.
Create tests from real ambiguous tickets, incomplete prompts, copied error messages, and unsafe requests. Score whether assistants ask for the missing version or environment instead of confidently producing a generic but wrong answer.
A short summary of the main points near the top gives AI a clean, quotable answer.
You: not on your page · Competitors: 2/5 have it
Drop this near the top of the page:
<p class="tldr"><strong>TL;DR:</strong> GEO and AEO for developer documentation mean helping AI systems find the canonical docs, retrieve a self-contained passage, and return technically correct guidance or a citation. Prioritise clear HTML, stable URLs, accurate versions and dates, tested examples, sensible schema, crawl access, and a repeatable prompt suite; treat llms.txt and other AI-specific signals as inexpensive experiments rather than proven shortcuts.</p>
Jump-links help both readers and AI segment and cite the right section.
You: not on your page · Competitors: 1/5 have it
None of your competitors publish an EntityMap yet — doing it now puts you in front of the field. It's a machine-readable index of your key concepts, each linked to Wikidata, that AI answer engines read directly.
A complete EntityMap for your site, ready to publish — each Wikidata/Wikipedia sameAs link has been checked and any that didn't resolve were removed. Save it as entitymap.json at your site root (https://readme.com/entitymap.json) and link it from your homepage. Spec: entitymap.org.
{
"version": "1.0",
"schema": "https://entitymap.org/spec/v1.0",
"publisher": {
"name": "ReadMe",
"url": "https://readme.com",
"sameAs": [
"https://www.linkedin.com/company/readme",
"https://github.com/readmeio"
]
},
"generated": "2026-08-07T00:00:00Z",
"entities": [
{
"entityId": "e_001",
"@type": "Organization",
"name": "ReadMe",
"description": "ReadMe provides a platform for creating, managing, and improving developer documentation and API references.",
"sameAs": "",
"relations": [
{
"predicate": "publishes",
"targetId": "e_002",
"targetName": "Developer documentation"
},
{
"predicate": "explains",
"targetId": "e_003",
"targetName": "Generative engine optimization"
},
{
"predicate": "explains",
"targetId": "e_004",
"targetName": "Answer engine optimization"
}
],
"hasChunks": [
"organization-overview",
"developer-documentation-resources"
]
},
{
"entityId": "e_002",
"@type": "Service",
"name": "Developer documentation",
"description": "Developer documentation explains how developers can understand, integrate with, and troubleshoot software products and APIs.",
"sameAs": "",
"relations": [
{
"predicate": "documents",
"targetId": "e_005",
"targetName": "Application programming interface"
},
{
"predicate": "uses",
"targetId": "e_006",
"targetName": "Structured data"
}
],
"hasChunks": [
"documentation-principles",
"api-reference",
"quickstarts"
]
},
{
"entityId": "e_003",
"@type": "DefinedTerm",
"name": "Generative engine optimization",
"description": "Generative engine optimization is the practice of making web content easier for generative AI systems to discover, interpret, select, and cite accurately.",
"sameAs": "",
"relations": [
{
"predicate": "appliesTo",
"targetId": "e_002",
"targetName": "Developer documentation"
},
{
"predicate": "relatedTo",
"targetId": "e_007",
"targetName": "Search engine optimization"
}
],
"hasChunks": [
"geo-definition",
"geo-for-developer-docs",
"geo-measurement"
]
},
{
"entityId": "e_004",
"@type": "DefinedTerm",
"name": "Answer engine optimization",
"description": "Answer engine optimization structures and supports content so answer systems can retrieve it and produce accurate direct responses.",
"sameAs": "",
"relations": [
{
"predicate": "appliesTo",
"targetId": "e_002",
"targetName": "Developer documentation"
},
{
"predicate": "relatedTo",
"targetId": "e_003",
"targetName": "Generative engine optimization"
}
],
"hasChunks": [
"aeo-definition",
"answer-ready-structure",
"aeo-measurement"
]
},
{
"entityId": "e_005",
"@type": "DefinedTerm",
"name": "Application programming interface",
"description": "An application programming interface is a defined interface through which software components communicate and exchange requests and responses.",
"sameAs": "https://www.wikidata.org/wiki/Q165194",
"relations": [
{
"predicate": "documentedBy",
"targetId": "e_002",
"targetName": "Developer documentation"
}
],
"hasChunks": [
"api-concepts",
"api-reference",
"api-examples"
]
},
{
"entityId": "e_006",
"@type": "DefinedTerm",
"name": "Structured data",
"description": "Structured data is machine-readable markup that explicitly identifies the entities, properties, and relationships described on a web page.",
"sameAs": "",
"relations": [
{
"predicate": "supports",
"targetId": "e_003",
"targetName": "Generative engine optimization"
}
],
"hasChunks": [
"schema-markup",
"json-ld-guidance"
]
},
{
"entityId": "e_007",
"@type": "DefinedTerm",
"name": "Search engine optimization",
"description": "Search engine optimization improves a site's ability to be crawled, understood, and surfaced in search results for relevant queries.",
"sameAs": "https://www.wikidata.org/wiki/Q180711",
"relations": [
{
"predicate": "relatedTo",
"targetId": "e_003",
"targetName": "Generative engine optimization"
}
],
"hasChunks": [
"seo-comparison",
"shared-foundations"
]
}
]
}Your page already answers questions of its own. These 8 are covered by the competitors and not by yours — adding them widens the range of searches you can be the answer to.
Questions the competitors answer that yours doesn't — with how many of them cover each one:
The raw signal readouts and detail behind the report — expand what you want to dig into.
| Signal | You | Competitors |
|---|---|---|
| Word count ▲ | 954 | 2570 |
| Paragraphs | 21 | 47 |
| Reading ease (Flesch) | 66 | 49 |
| Avg sentence length | 14w | 21w |
| Text-to-HTML ratio | 59% | 20.1% |
| Signal | You | Competitors |
|---|---|---|
| Subheadings (H2) ▲ | 6 | 8 |
| Sub-subheadings (H3) | 3 | 14 |
| Question headings | 8 | 3 |
| …answered (40+ words) | 6 | 2 |
| Lists (ul/ol) ▲ | 4 | 12 |
| Tables ▲ | 0 | 1 |
| Signal | You | Competitors |
|---|---|---|
| Title length | 58 chars | 57 chars |
| Meta description | Yes | 5/5 |
| H1 count | 1 | 1 |
| Canonical tag ▲ | No | 5/5 |
| Mobile viewport | Yes | 5/5 |
| HTTPS | Yes | 5/5 |
| Signal | You | Competitors |
|---|---|---|
| FAQ questions | 0 | — |
| Full answers (40+ words) | 0 | — |
| Avg answer length | 0w | — |
| FAQ schema | No | 1/5 |
| Signal | You | Competitors |
|---|---|---|
| Statistics / data points ▲ | 0 | 6 |
| Citations to sources ▲ | 0 | 13 |
| Authoritative citations | 0 | — |
| Expert quotations | 0 | — |
| Hedging density | 0.2/100w | 0.2/100w |
| Signal | You | Competitors |
|---|---|---|
| Key-takeaways / TL;DR | No | 2/5 |
| Table of contents | No | 1/5 |
| Comparison tables | 0 | — |
| Author entity (Person) ▲ | No | 3/5 |
| Entity sameAs | No | 0/5 |
| Content age (months) | — | 2 |
| Signal | You | Competitors |
|---|---|---|
| Internal links | 23 | 40 |
| External links | 13 | 25 |
| Video / media embeds | 0 | — |
| AI crawlers blocked | 0 | — |
| llms.txt present | No | 1/5 |
| EntityMap published | No | 0/5 |
| Address | https://readme.com/resources/what-geo-aeo-means |
| Status code | 200 |
| Indexability | Indexable |
| Content type | text/html; charset=utf-8 |
| Server response | 153 ms |
| URL folder depth | 2 |
| Generator (CMS) | — |
| Last modified | — |
| H1 | What GEO and AEO Mean for Developer Documentation |
| H1 / H2 / H3 | 1 / 6 / 3 |
| Total headings | 10 |
| Meta robots | — |
| Canonical | — |
| hreflang tags | 0 |
| Language | en |
| Character encoding | Declared |
| Favicon | Declared in <head> |
| Meta keywords | — |
| Open Graph complete | No |
| Twitter card | Yes |
| AMP page | No |
| Forms | 1 |
| iframes | 0 |
| Phone | — |
| support@readme.io | |
| — | |
| Postcode | — |
| Opening hours | No |
| Chatbot | Intercom · medium confidence |
| Booking mechanism | Chat only (booking via agent) |
| Star ratings shown | No |
| Testimonials / reviews | No |
| Video testimonials | No |
| AggregateRating schema | No |
| Review platforms | — |
| Word count (rendered) | 954 |
| Source word count (raw) | 3964 |
| Sentences | 69 |
| Avg sentence length | 14 words |
| Reading ease (Flesch) | 66 (Easy) |
| Paragraphs | 21 |
| JS-reliance ratio | 0.24 |
| Text-to-HTML ratio | 59% |
| Internal outlinks | 23 (19 unique) |
| External outlinks | 13 (13 unique) |
| Nofollow links | 0 |
| Broken jump-links | 0 |
| Images | 7 · alt coverage 100% |
| Image formats | 0 next-gen (WebP/AVIF) · 5 lazy-loaded · 0 decorative (empty alt) |
| Structured-data blocks | 0 |
| HTTPS | Yes |
| Mixed content | 0 |
| HSTS | Yes |
| Content-Security-Policy | No |
| X-Content-Type-Options | No |
| X-Frame-Options | No |
| Referrer-Policy | No |
| HTML size | 184 KB |
| <head> / <body> count | 1 / 1 |
| Invalid elements in <head> | 0 |
| Bad content-type | No |
| DOM size | 475 elements |
The on-page GEO analyser by John Lawson — every issue with a ready fix carries its own ▸ Fix with the paste-ready code, wording or example.
→ citationgap.johnlawson.dev