Repository navigation
docs: content dates for sitemap lastmod, blog article tags, shorter title suffix - #1356
Open
devin-ai-integration[bot] wants to merge 10 commits into
Open
devin-ai-integration[bot] wants to merge 10 commits into
devin-ai-integration[bot] wants to merge 10 commits into
Conversation
…orten title suffix Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Contributor
Author
|
I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".
|
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
4 of 5 tasks
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>
Merged
2 of 4 tasks
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>
…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>
abhithesys
approved these changes
Oct 13, 2026
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
sitemap.xmlstamped 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).lastmodchanged 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)updatedAtfrontmatter (blog falls back todate).updatedAtper entry indata.ts, so editing one no longer moves all of them./integrationstakes the latest entry.updatedAtin theirmetadata.ts. Benchmark pages set it from the same constants as their JSON-LDdateModified(methodology's date moves intoMETHODOLOGY_UPDATED_ISO); theiragent.mdand data files share the page's date. Pages without one get nolastmod./blogtakes the latest post.lastmodis a calendar day; build time is never used.VERCEL_DEEP_CLONEneeded.seoTitle,featured, …).CI check (
.github/workflows/content-dates.yml)updatedAt:line. New docs pages need one; new blog posts are dated bydate. A few lines of shell, no script.no-date-bumplabel skips it for edits readers won't notice (typos,featuredflags). Documented in CONTRIBUTING.One date source:
lib/content-dates.tsdecides a post's published and modified days once, as YYYY-MM-DD, for the sitemap, byline, OG tags and JSON-LD.Blog posts:
og:typearticle witharticle:published_time,article:modified_timeand author. The byline shows "Updated " when a post hasupdatedAt. The BlogPosting and docs TechArticle structured data from #1405 read the sameupdatedAtfordateModified.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 blogopenGraphblock was dropped in the merge.Test Plan
pnpm buildindocs/(after merging docs: article structured data, search titles for A2UI and comparison pages, fuller sitemap #1405): 154 URLs, 140 withlastmod. The 14 without are marketing and demo pages whosemetadata.tshas noupdatedAtyet:/,/openui-vs-json,/compare,/lab,/chat, the/demopages, and the pages docs: article structured data, search titles for A2UI and comparison pages, fuller sitemap #1405 added (/pricing,/cloud/*,/openclaw-os,/components)./blog/how-chatgpt-intelligent-ui-works:og:typearticle, published 2026-10-08, modified 2026-10-13, "Updated Tue Oct 13 2026" in the byline. A post withoutupdatedAtshows no "Updated".Benchmark methodology | OpenUI,Getting Started | OpenUI,Blockbuster report | OpenUI Cloud Chat.featuredonly) would need theno-date-bumplabel.pnpm types:check, eslint, prettier clean on changed code.Notes
Checklist
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