Skip to content

docs: content dates for sitemap lastmod, blog article tags, shorter title suffix - #1356

Open
devin-ai-integration[bot] wants to merge 10 commits into
mainfrom
devin/1791699138-sitemap-lastmod
Open

devin-ai-integration[bot] wants to merge 10 commits into
mainfrom
devin/1791699138-sitemap-lastmod

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

What

sitemap.xml stamped static pages, blog posts and integrations with the build time, and docs pages with git dates from Vercel's shallow clone (93 docs URLs in production share the clone boundary's date). lastmod changed on every deploy and didn't reflect real edits. Page titles also ended in " | OpenUI - The Open Standard for Intelligent UI".

Git history isn't reliable at build time on Vercel, so each page now declares when its content last changed, next to the content, and CI keeps those dates honest.

Changes

Content dates (docs/app/sitemap.ts)

  • Docs pages and blog posts: updatedAt frontmatter (blog falls back to date).
  • Integrations: updatedAt per entry in data.ts, so editing one no longer moves all of them. /integrations takes the latest entry.
  • Static pages: optional updatedAt in their metadata.ts. Benchmark pages set it from the same constants as their JSON-LD dateModified (methodology's date moves into METHODOLOGY_UPDATED_ISO); their agent.md and data files share the page's date. Pages without one get no lastmod.
  • /blog takes the latest post. lastmod is a calendar day; build time is never used.
  • Removed the fumadocs last-modified plugin and the git helper. No VERCEL_DEEP_CLONE needed.
  • Backfilled from full git history: the newest commit that changed reader-visible content, ignoring whitespace, prettier table re-padding and metadata-only frontmatter (seoTitle, featured, …).

CI check (.github/workflows/content-dates.yml)

  • A PR that edits a docs page or blog post must also change that file's updatedAt: line. New docs pages need one; new blog posts are dated by date. A few lines of shell, no script.
  • no-date-bump label skips it for edits readers won't notice (typos, featured flags). Documented in CONTRIBUTING.
  • Date format is already enforced by the frontmatter schema at build time.

One date source: lib/content-dates.ts decides a post's published and modified days once, as YYYY-MM-DD, for the sitemap, byline, OG tags and JSON-LD.

Blog posts: og:type article with article:published_time, article:modified_time and author. The byline shows "Updated " when a post has updatedAt. The BlogPosting and docs TechArticle structured data from #1405 read the same updatedAt for dateModified.

Titles: template is now %s | OpenUI (home title unchanged). The framework, language and methodology benchmark titles drop their hand-written " | OpenUI" (they render doubled in production today). The chat demo title is absolute so it keeps a single "| OpenUI Cloud Chat".

Main (#1362) already fixed the blog og:url, so this PR's earlier blog openGraph block was dropped in the merge.

Test Plan

Notes

  • Keep the CI check non-required: it only runs on PRs touching content paths.

Checklist

  • I linked a related issue, if applicable
  • I updated docs/README when needed
  • I considered backwards compatibility

Link to Devin session: https://app.devin.ai/sessions/66f61ece239f4d8bab982e7e2c651d91
Open in Devin Desktop: https://app.devin.ai/desktop/session/66f61ece239f4d8bab982e7e2c651d91?variant=devin
Requested by: @zahlekhan

🤖 Generated with Claude Code

…orten title suffix

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@vercel

vercel Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
openui-docs Ready Ready Preview Oct 13, 2026 1:47pm UTC

Request Review

zahlekhan and others added 5 commits October 13, 2026 16:48
Main's page-metadata helpers (#1362) already set og:url from the canonical
URL and keep the site image in SITE_OPEN_GRAPH, so the blog openGraph block
and the shared SITE_IMAGE from this PR are dropped in favor of main's. The
sitemap keeps the /demo routes added in #1397.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vercel builds from a shallow clone, so git dates are either missing or the
clone boundary's date. Each page now declares when its content last changed,
next to the content, and the sitemap reads that:

- Docs pages and blog posts: `updatedAt` frontmatter (blog falls back to
  `date`).
- Integrations: `updatedAt` per entry in data.ts, so editing one integration
  no longer moves all 20. /integrations takes the latest entry.
- Static pages: optional `updatedAt` in their metadata.ts. The benchmark
  pages set it from the same constants their JSON-LD dateModified uses
  (methodology's date moves into METHODOLOGY_UPDATED_ISO). Their agent.md and
  data files share the page's date. Pages without one get no lastmod.
- /blog takes the latest post.

lastmod is now a calendar day. The fumadocs last-modified plugin and
lib/git-last-modified.ts are removed.

Dates were backfilled from full git history: the newest commit that changed
reader-visible content (frontmatter minus metadata-only keys plus body,
ignoring whitespace and table-divider reflows; integrations via blame,
ignoring seoTitle and logo lines). Blog posts get updatedAt only when edited
after the commit that published them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion changes

docs/scripts/check-updated-at.mjs fails a PR that changes what readers see
without moving the page's `updatedAt` to a later, valid, non-future date:

- Pages under docs/content: body plus frontmatter, minus metadata-only keys
  (updatedAt, date, featured, seoTitle, ogImage and the layout flags).
- Integrations: each entry in data.ts, minus updatedAt, seoTitle and logo.

Whitespace-only edits and Markdown table padding that prettier re-flows don't
count. New docs pages and integrations need `updatedAt`; new blog posts are
dated by `date`. The no-date-bump label skips the check for typo-level edits.

The workflow checks out the PR merge commit with fetch-depth 2 and diffs it
against its first parent, so it needs no full clone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blog posts now report og:type article with article:published_time from
`date`, article:modified_time from `updatedAt ?? date`, and the author. The
byline shows "Updated <date>" when a post has `updatedAt`, so the date in the
sitemap, the OG tags and on the page agree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ate adds it

With the root title template shortened to "%s | OpenUI", the framework,
language and methodology benchmark titles would render "... | OpenUI |
OpenUI" (today they render "... | OpenUI | OpenUI - The Open Standard for
Intelligent UI"). The chat demo title, which names its own product suffix, is
now absolute so it doesn't gain a second one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zahlekhan zahlekhan changed the title docs: real content dates for sitemap lastmod, fix blog og:url, shorten title suffix docs: content dates for sitemap lastmod, blog article tags, shorter title suffix Oct 13, 2026
zahlekhan and others added 2 commits October 13, 2026 17:22
Same checks in about two thirds of the code: metadata fields are stripped
with one regex instead of a line-by-line field parser, integration entries
are split on their `  {` / `  },` lines, annotations point at the file
instead of a computed line, and the fix hint prints once. Renames now count
as new pages, which pass since every page carries an updatedAt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in #1405 (article structured data, docs seoTitle, fuller sitemap).

- Sitemap keeps the 7 pages #1405 adds; /blog stays dated by its latest post.
- Blog BlogPosting dateModified uses `updatedAt ?? date`, matching the OG
  modified_time and the byline.
- Docs TechArticle dateModified reads `updatedAt`, since this PR removes the
  git last-modified plugin.
- The methodology page's new OG modified_time uses METHODOLOGY_UPDATED_ISO.
- comparison.mdx gets updatedAt 2026-10-13: #1405 retitled the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zahlekhan and others added 2 commits October 13, 2026 19:06
…N-LD

lib/content-dates.ts decides a blog post's dates once (published = `date`,
modified = `updatedAt ?? date`) and formats every content date as
YYYY-MM-DD. The sitemap, the blog byline, its og:article times and its
BlogPosting JSON-LD, and the docs TechArticle JSON-LD all read from it, so
they can't drift apart. Open Graph and JSON-LD dates are now day strings,
like the benchmark pages already emit, instead of midnight timestamps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The rule is now just: a PR that edits a docs page or blog post must also
change that page's `updatedAt:` line (new docs pages need one; new blog
posts are dated by `date`). It runs as a workflow step, so
docs/scripts/check-updated-at.mjs is gone.

Dropped, since something else covers it or the label does:
- Date format: the frontmatter schema already rejects a bad updatedAt.
- Ignoring whitespace and metadata-only edits (featured, seoTitle): those
  PRs use the no-date-bump label.
- Integration entries: TypeScript requires updatedAt on new ones; bumping
  it on edits is left to review.

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

This branch was successfully deployed

1 active deployment
Preview — 7c9172f3 Deployed Oct 13, 2026 by vercel[bot]
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.

2 participants