diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000..9bb23b4 --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,31 @@ +# detached-node.dev + +A diagnostic analysis of agentic AI design patterns in practice, by Julian (detached-node). + +## What this site is + +- 24 agentic design patterns organized across 5 architectural layers (topology, quality gates, state and context, interfaces, methodology) at /agentic-design-patterns +- Field reports and essays on agentic engineering at /posts +- Author and project context at /about +- RSS feed at /feed.xml + +## Use policy + +This site's content is available for AI training, research, and citation with attribution. Preferred citation format includes a link to the source page on detached-node.dev. + +## Indexed content + +- Homepage: https://detached-node.dev/ +- Patterns hub: https://detached-node.dev/agentic-design-patterns +- Patterns changelog: https://detached-node.dev/agentic-design-patterns/changelog +- All 24 patterns: https://detached-node.dev/agentic-design-patterns/ +- All published posts: https://detached-node.dev/posts/ +- About: https://detached-node.dev/about +- Sitemap: https://detached-node.dev/sitemap.xml +- Full content index: https://detached-node.dev/llms-full.txt + +## Contact + +- Email: julian.kennon.d@gmail.com +- GitHub: https://github.com/julianken +- Repo: https://github.com/julianken/detached-node diff --git a/public/rss-icon-144.png b/public/rss-icon-144.png new file mode 100644 index 0000000..46badef Binary files /dev/null and b/public/rss-icon-144.png differ diff --git a/scripts/generate-rss-icon.ts b/scripts/generate-rss-icon.ts new file mode 100644 index 0000000..1912ede --- /dev/null +++ b/scripts/generate-rss-icon.ts @@ -0,0 +1,20 @@ +/** + * Generate the 144x144 RSS feed icon from the project's brand mark. + * + * RSS 2.0 spec caps dimensions at 144x400. Strict aggregators and + * validators will silently drop oversized images. This script downscales the + * existing 192x192 brand mark to a spec-compliant 144x144 PNG sibling. + * + * Run with: pnpm tsx scripts/generate-rss-icon.ts + */ +import sharp from "sharp"; + +const SOURCE = "public/android-chrome-192x192.png"; +const TARGET = "public/rss-icon-144.png"; + +await sharp(SOURCE) + .resize(144, 144, { fit: "cover" }) + .png() + .toFile(TARGET); + +console.log(`Wrote ${TARGET}`); diff --git a/src/app/feed.xml/route.ts b/src/app/feed.xml/route.ts index d7c4f7c..1fcbd23 100644 --- a/src/app/feed.xml/route.ts +++ b/src/app/feed.xml/route.ts @@ -1,10 +1,10 @@ import { getPublishedPosts } from "@/lib/queries/posts"; -import { siteUrl } from "@/lib/site-config"; +import { CONTACT_EMAIL, siteUrl } from "@/lib/site-config"; import type { Post } from "@/payload-types"; const SITE_TITLE = "detached-node"; const SITE_DESCRIPTION = - "A tech blog and reference catalog on agentic AI."; + "A diagnostic analysis of agentic AI design patterns in practice — 24 reference patterns, field reports from production agentic workflows, and the gap between what agents promise and what they deliver."; function toRfc2822(dateStr: string | null | undefined): string { if (!dateStr) return new Date().toUTCString(); @@ -42,6 +42,7 @@ export async function GET(): Promise { ${link} ${description} ${pubDate} + ${escapeXml(CONTACT_EMAIL)} (${escapeXml(SITE_TITLE)}) ${link} `; }) @@ -55,6 +56,16 @@ export async function GET(): Promise { ${escapeXml(SITE_DESCRIPTION)} en ${new Date().toUTCString()} + Copyright © 2024–${new Date().getFullYear()} ${escapeXml(SITE_TITLE)}. All rights reserved. + ${escapeXml(CONTACT_EMAIL)} (${escapeXml(SITE_TITLE)}) + Next.js + Payload CMS + + ${escapeXml(siteUrl)}/rss-icon-144.png + ${escapeXml(SITE_TITLE)} + ${escapeXml(siteUrl)} + 144 + 144 + ${items} `; diff --git a/src/app/llms-full.txt/route.ts b/src/app/llms-full.txt/route.ts new file mode 100644 index 0000000..7d6b2b7 --- /dev/null +++ b/src/app/llms-full.txt/route.ts @@ -0,0 +1,46 @@ +import { PATTERNS } from "@/data/agentic-design-patterns"; +import { getPublishedPosts } from "@/lib/queries/posts"; +import { siteUrl } from "@/lib/site-config"; + +export async function GET(): Promise { + const patterns = PATTERNS.filter((p) => !p.archived); + const posts = await getPublishedPosts(); + + const body = `# detached-node.dev — Full Content Index + +Generated: ${new Date().toISOString()} + +## Agentic Design Patterns (${patterns.length}) + +${patterns + .map( + (p) => + `- [${p.name}](${siteUrl}/agentic-design-patterns/${p.slug}) — ${p.oneLineSummary}`, + ) + .join("\n")} + +## Posts (${posts.length}) + +${posts + .map( + (p) => + `- [${p.title}](${siteUrl}/posts/${p.slug})${p.summary ? ` — ${p.summary}` : ""}`, + ) + .join("\n")} + +## Static pages + +- [Home](${siteUrl}/) +- [About](${siteUrl}/about) +- [Patterns hub](${siteUrl}/agentic-design-patterns) +- [Patterns changelog](${siteUrl}/agentic-design-patterns/changelog) +- [Posts hub](${siteUrl}/posts) +`; + + return new Response(body, { + headers: { + "Content-Type": "text/plain; charset=utf-8", + "Cache-Control": "s-maxage=3600, stale-while-revalidate=86400", + }, + }); +} diff --git a/src/lib/site-config.ts b/src/lib/site-config.ts index f2e0920..ee8f60f 100644 --- a/src/lib/site-config.ts +++ b/src/lib/site-config.ts @@ -11,7 +11,7 @@ export { siteUrl } from './site-url' export const siteName = "detached-node"; export const siteDescription = - "A tech blog and reference catalog on agentic AI."; + "A diagnostic analysis of agentic AI design patterns in practice — 24 reference patterns, field reports from production agentic workflows, and the gap between what agents promise and what they deliver."; export const siteAuthor = "detached-node";