From c4fb5fbfe0d2309f896dae0d6f0a7f7175dc2e8f Mon Sep 17 00:00:00 2001 From: Stephen DeLorme Date: Wed, 17 Jun 2026 14:18:01 -0400 Subject: [PATCH] Add agent-readiness surfaces (robots.txt, sitemap, llms.txt, markdown) Make the site discoverable and consumable by AI agents and crawlers: - public/robots.txt: crawl rules, explicit AI crawler groups (GPTBot, ClaudeBot, Google-Extended, etc.), a Content-Signal line, and a Sitemap: reference. - app/sitemap.ts: /sitemap.xml generated from content. - app/llms.txt/route.ts: /llms.txt index linking every event/post/page to its plain-markdown mirror. - app/md/[...slug] + middleware.ts: serve a plain-markdown version of any content page, reached via /
/.md URLs or an Accept: text/markdown request. HTML stays the default for browsers. - next.config.js headers(): RFC 8288 Link headers pointing agents at llms.txt/sitemap and each page's .md alternate; metadata adds a . - Footer with a subtle /llms.txt link. Scoped to a static content site: OAuth/MCP/WebMCP/DNS-AID/api-catalog items from the audit don't apply and were skipped. --- AGENTS.md | 11 ++++ app/[contentType]/[slug]/page.tsx | 1 + app/layout.tsx | 2 + app/llms.txt/route.ts | 65 +++++++++++++++++++++ app/md/[...slug]/route.ts | 48 ++++++++++++++++ app/page/[slug]/page.tsx | 1 + app/sitemap.ts | 24 ++++++++ components/Footer.tsx | 20 +++++++ lib/agent-content.ts | 96 +++++++++++++++++++++++++++++++ lib/site-metadata.ts | 6 ++ middleware.ts | 41 +++++++++++++ next.config.js | 34 ++++++++++- public/robots.txt | 44 ++++++++++++++ 13 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 app/llms.txt/route.ts create mode 100644 app/md/[...slug]/route.ts create mode 100644 app/sitemap.ts create mode 100644 components/Footer.tsx create mode 100644 lib/agent-content.ts create mode 100644 middleware.ts create mode 100644 public/robots.txt diff --git a/AGENTS.md b/AGENTS.md index 500dd13..adffe1e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -39,6 +39,17 @@ Use `yarn` here, not `pnpm`: the repo is pinned to Yarn 1 and includes `yarn.loc - `meetup.ts`: shared meetup/site metadata used on the homepage. - `public/`: static assets. +## Agent & crawler discovery +The site exposes machine-readable surfaces for AI agents and crawlers. These are generated from content, so they stay current automatically — no manual updates when adding events/posts. +- `public/robots.txt`: crawl rules, explicit AI crawler (GPTBot, ClaudeBot, Google-Extended, …) groups, a `Content-Signal` line (contentsignals.org), and a `Sitemap:` reference. +- `app/sitemap.ts`: generates `/sitemap.xml` from `allDocs`. +- `app/llms.txt/route.ts`: serves `/llms.txt` (llmstxt.org) — a plain-text index linking every event/post/page to its `.md` mirror. +- `app/md/[...slug]/route.ts`: serves the plain-markdown mirror of any content page. Reached via `middleware.ts`, which rewrites `/
/.md` URLs and `Accept: text/markdown` requests onto it. HTML stays the default for browsers. +- `lib/agent-content.ts`: shared helpers (read from Contentlayer `allDocs`, not the filesystem) backing all of the above. +- `next.config.js` `headers()`: adds RFC 8288 `Link` headers (homepage → llms.txt/sitemap; content pages → their `.md` alternate). +- `buildPageMetadata` adds a `` to content pages via the `markdownPath` option. +- Footer (`components/Footer.tsx`) carries a subtle `/llms.txt` link. + ## Maintenance guidelines - Prefer small content and styling changes over broad refactors. - Do not rename or move large content folders unless you also update the content loading logic. diff --git a/app/[contentType]/[slug]/page.tsx b/app/[contentType]/[slug]/page.tsx index d14f776..611eb05 100644 --- a/app/[contentType]/[slug]/page.tsx +++ b/app/[contentType]/[slug]/page.tsx @@ -61,6 +61,7 @@ export async function generateMetadata({ params }: PageProps): Promise pathname, image, type: 'article', + markdownPath: `${pathname}.md`, }) } diff --git a/app/layout.tsx b/app/layout.tsx index 83f8fed..618568e 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -3,6 +3,7 @@ import './globals.css' import { IBM_Plex_Serif, Inter } from 'next/font/google' import Header from '@/components/Header/Header' +import Footer from '@/components/Footer' import type { Metadata } from 'next' import { ThemeProvider } from './theme-provider' import { meetup } from '@/meetup' @@ -59,6 +60,7 @@ export default function RootLayout({
{children} +