GEO Starter JSON-LD
This module generates schema.org structured data for published content pages, emitting only facts that are actually displayed on the page. It is specifically designed to work with the GEO Starter recipe's content model and supports Service, Evidence Source, and FAQ pages. The generated data is intended to make content more discoverable and understandable by machines, with a strong emphasis on accuracy and only emitting data when it can be reliably represented.
A governed content model only helps machines if they can read it. GEO Starter JSON-LD builds that reading surface: one schema.org graph per page, emitted only on the full canonical view of a published node, and only for what the page actually renders.
The structured data never claims more than the visible page shows: if a fact is not rendered, it is not emitted. Invalid or inflated structured data is worse than none, so when in doubt the module emits nothing.
This is the companion module for the GEO Starter recipe. It reads GEO Starter's content model. It is not a general-purpose JSON-LD tool.
What It Emits
- Service pages emit a
Serviceobject plus the page'sWebPage, carrying the service summary, primary action, topic, audience, review date, and cited sources. - Answer pages emit a
Questionwith its accepted answer: the page's title is the question, and the direct-answer field is the answer, with cited sources. - Article pages emit an
Articlewith headline, summary, author, dates, and cited sources; review information is carried on the page'sWebPagemetadata. - Evidence Source pages emit a
CreativeWorkwith the external source link and publisher. This is what makes a citation on another page resolve to a real, inspectable source. - FAQ sections emit a
FAQPage, but only when the section has at least two visible, non-empty question-and-answer pairs. Thin or empty FAQs emit nothing. - Step-list sections emit a
HowToonly when at least two complete steps are visibly rendered. No HowTo rich-result eligibility is claimed. - Card-grid sections emit linked
ItemListentries only when the visible formatter shows linked labels. - Contact panels can add a provider
ContactPoint,PostalAddress, and structuredhoursAvailablevalues to Service output. - Citations between pages resolve by stable
@id. If a cited source is unpublished, its citation is dropped, not left dangling.
Emission Rules
Structured data is only as good as its honesty, so the module enforces these rules:
- It emits only on a published node's own full page. Teasers, search results, and editor previews emit nothing.
- It emits only fields the page actually renders and the requester can view. Nested Paragraph output follows the configured rendered-entity view mode; reference-derived labels and URLs fail closed when the visible formatter does not render those values.
- It strips markup, encodes safely, and emits nothing at all on any error.
- It carries full cache metadata, including every cited source, so the structured data refreshes when the node or a source it cites changes.
Relationship To GEO Starter
- It is required by the GEO Starter recipe and installed automatically with it.
- It reads GEO Starter's fields and Paragraph types. On a site without that content model, it has nothing to emit.
- It ships as its own Composer package because a Drupal recipe cannot carry a module on disk. The recipe requires it; you do not install it separately.
Scope And Honest Limits
- Implemented and fresh-install validated:
Service,Answer,Article,Evidence Source, gatedFAQPage,HowTo, andItemList, plus provider contact, address, and opening-hours data. - Unit, Kernel, Functional, and FunctionalJavascript coverage ships with the module.
tools/jsonld-probe.phpprovides a separate installed-site fidelity check;tools/schema-domain-check.pychecks schema.org property placement. - The project repository records historical schema.org and Rich Results checks. Those checks do not prove current rich-result eligibility; each release is gated separately by its exact-tag CI and released-artifact checks.
- The optional
geo_starter_jsonld_llmssubmodule publishes an anonymous, language-specific/llms.txtindex. llms.txt is a community proposal, not a search standard; this module does not treat it as a ranking or citation mechanism. - No guaranteed AI citations, rankings, rich results, or answer-engine placement. The module makes content inspectable. It does not promise outcomes.
Requirements
- The GEO Starter recipe, or a site that uses its content model.
- Drupal 11 and Paragraphs. No dependency patches.
- The supported recipe installation path uses Drupal CMS.
Documentation And Support
README.mdfor design and settings.- Use the Drupal.org issue queue for support.
Depends on
Dependencies of the latest stable release
- Paragraphs
- node Drupal core
Required by
Tracked projects that depend on this one
No tracked projects depend on this one yet.
Activity
Release Timeline
Releases
| Version | Type | Core | Notes | Release date | |
|---|---|---|---|---|---|
| 1.2.0 | Stable | 11 | Access-parity hardening for JSON-LD and llms.txt. Hidden, inaccessible, or formatter-suppressed content now fails closed; Article publication dates come only from a visible governed field. | Jul 21, 2026 | |
| 1.1.1 | Stable | 11 | Jul 19, 2026 | ||
| 1.1.0 | Stable | 11 | Adds the geo_starter_jsonld_llms submodule: an auto-generated, access-checked /llms.txt site index of governed content for LLM crawlers and agents. Parent emission unchanged; purely additive. | Jun 11, 2026 | |
| 1.0.0 | Stable | 11 | First stable release. Promoted unchanged from 1.0.0-rc1, whose released-artifact install proof passed (composer resolves and installs the package from drupal.org). Enters the stable 1.x contract. | Jun 8, 2026 | |
| 1.0.0-rc1 | Pre-release | 11 | Release candidate for the first stable 1.0.0. No functional change from 1.0.0-beta1; proves the published artifact before the stable tag. Enters the stable 1.x contract. | Jun 8, 2026 | |
| 1.0.0-beta1 | Pre-release | 11 | First beta: stability contract adopted; drops the invalid rating-less Review snippet; adds the geo_starter_jsonld_markup submodule for semantic section rendering. | Jun 7, 2026 | |
| 1.0.0-alpha3 | Pre-release | 11 | Jun 2, 2026 | ||
| 1.0.0-alpha2 | Pre-release | 11 | Jun 2, 2026 | ||
| 1.0.0-alpha1 | Pre-release | 11 | May 31, 2026 |