Skip to content

docs(seo): JSON-LD, Open Graph, git-dated sitemap lastmod, llms.txt, robots.txt - #532

Merged
robfrank merged 1 commit into
mainfrom
docs/seo-structured-data
Nov 12, 2026
Merged

robfrank merged 1 commit into
mainfrom
docs/seo-structured-data

Conversation

@robfrank

@robfrank robfrank commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

Build and UI fixes from the 2026-11-12 SEO audit of docs.arcadedb.com. #531 has the content and title fixes; the two PRs don't depend on each other.

Changes

Structured data and social tags (audit item 4). docs/ui/supplemental/partials/head-meta.hbs overrides the default bundle's empty partial. It adds:

  • Open Graph tags (og:title, og:description, og:url, og:image, og:type) and Twitter tags (twitter:card summary).
  • One JSON-LD @graph per page:
    • WebSite (https://docs.arcadedb.com/#website): isPartOf points at arcadedb.com #website, publisher at #organization.
    • BreadcrumbList: component home, then the nav trail, then the page. All URLs are absolute, and crumbs without a link are skipped.
    • TechArticle (WebPage on a component home): about points at https://arcadedb.com/#software, and publisher and author at #organization. The Organization and SoftwareApplication nodes are referenced by @id only.

The graph is built in helpers/jsonld.js and serialized with JSON.stringify, so quotes and entities in titles can't break the script block. @id, url and og:url all use page.canonicalUrl, which is extensionless. site.url was already set in the playbook.

Home title (item 2). head-title.hbs drops the :: ArcadeDB Documentation suffix when the page title is the site title. The home page is now just "ArcadeDB Documentation".

Sitemap lastmod (item 5). The new scripts/sitemap-lastmod.py runs as part of npm run build (via npm run seo). It replaces Antora's build timestamp with the last commit date of each page's source (src/main/asciidoc/…, or scripts/templates/ for the home and Get Started pages). The deploy checkout now uses fetch-depth: 0. On a shallow clone the script leaves the sitemap untouched rather than writing one shared date. The 21 arcadedb-python URLs get no lastmod, because their source is in another repo.

llms.txt (item 6). The new scripts/generate-llms-txt.py writes /llms.txt from the generated nav: one H2 per nav group and 226 links, each with its meta description, plus the Python component pages. It links the HTML pages, because Cloudflare's WAF 403s *.md.

robots.txt (item 7). Removes the comment claiming Cloudflare prepends a content-signal block; it doesn't, and the live file confirms this. Adds the same Content-Signal: search=yes, ai-train=yes, ai-input=yes line that arcadedb.com serves.

CLAUDE.md documents all of the above.

Verification

Ran migrate.sh + npm run build locally, then checked the output:

  • On all 247 sitemap pages, the JSON-LD parses, and @id, url and og:url all equal <link rel="canonical">. No .html and no &quot; appear inside the script block.
  • 245 pages carry a BreadcrumbList.
  • The home page has WebSite + WebPage and og:type website.
  • The arcadedb sitemap has 104 distinct lastmod values, all from git.
  • llms.txt has 226 links.

Not done here: Rich Results Test on the deployed pages, and the Cloudflare items (WAF .md rule, docs2 301, cache rules, HSTS).

🤖 Generated with Claude Code

From the 2026-11-12 SEO audit of docs.arcadedb.com.

- head-meta.hbs: Open Graph and Twitter tags and a JSON-LD @graph per
  page (WebSite, BreadcrumbList, TechArticle; WebPage on a component
  home). about/publisher/author point at the arcadedb.com #software and
  #organization nodes by @id. The graph is built in a jsonld helper and
  serialized with JSON.stringify; @id, url and og:url are the extensionless
  canonical URL.
- head-title.hbs: the docs home is "ArcadeDB Documentation" instead of
  "ArcadeDB Documentation :: ArcadeDB Documentation".
- sitemap-lastmod.py: each sitemap URL gets the last commit date of its
  source instead of the build timestamp; the deploy checkout now fetches
  full history. arcadedb-python URLs get no lastmod (their source is in
  another repository).
- generate-llms-txt.py: /llms.txt from the nav, linking the HTML pages
  (Cloudflare blocks *.md paths for now).
- robots.txt: drop the comment claiming Cloudflare prepends a
  content-signal block (it does not) and add the same Content-Signal line
  arcadedb.com serves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mergify

mergify Bot commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

This pull request is merged.

@robfrank
robfrank merged commit 8f3706f into main Nov 12, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant