Status: In progress Owner: TBD Last updated: 2026-01-13
This specification defines a modern, LLM-first redesign of the Awesome Agentic Patterns site. The new experience moves from a traditional docs layout to a structured knowledge product with discovery tooling, decision support, machine-readable outputs, and a bold visual identity. The rearchitecture keeps the patterns/ folder as the source of truth but introduces a structured content model, a data pipeline, and a new static site frontend optimized for search, reuse, and AI ingestion.
- Specification approved for implementation.
- Stack selected: Astro + TypeScript.
- Deployment target: Vercel.
- Package manager: bun.
- Workspace layout: monorepo with
apps/web. - Launch milestone: 2026-01-27.
- MkDocs is removed; only patterns and curated content remain.
- Dark mode is in v1 scope.
- Guides will include:
HELP.md,LEARNINGS.md,PATTERN-LABELING.md,MIGRATION-TO-GIT-LABELS.md. - Decision Explorer: rules-based for v1 (ML-assisted deferred to v2).
- Backup deployment: No. Vercel-only for simplicity. Git history + local build = sufficient recovery.
- Graph library: D3.js (d3-force) for framework independence and smaller bundle.
- Content loader: Astro glob() with custom base path (no symlinks).
- Validation runtime: TypeScript with bun (not Python). Zod for schema validation.
- Data pipeline runtime: TypeScript with bun (consistent with validation).
- Data outputs:
apps/web/public/(Astro serves from here, build artifacts not committed).
- Replace the current MkDocs UX with a modern, fast, discovery-driven site.
- Make every pattern machine-readable and reusable (MD, JSON, and LLM formats).
- Add decision support features (compare, decision explorer, graph map).
- Preserve contributor flow (simple Markdown in
patterns/). - Improve navigation, search, and content reuse for humans and LLMs.
- Keep deployment static and low-cost (Vercel).
- Building an authenticated product or paid experience.
- Rewriting all existing pattern content in the first release.
- Replacing the Git-based contribution model with a CMS.
- Adding runtime backends that require persistent servers.
- Maintaining the MkDocs build pipeline.
- Builders: want quick, actionable patterns to ship product features.
- Researchers: want references, provenance, and cross-links.
- Operators: want reliability and safety guidance with checklists.
- Contributors: want a simple way to add or update patterns.
- Content-first: patterns drive site structure and navigation.
- LLM-friendly by default: every page has clean, structured outputs.
- Fast and frictionless: minimal clicks to find or compare patterns.
- Opinionated design: distinct visual identity, not a generic docs look.
- Stable URLs: patterns are canonical and versioned by slug.
Primary navigation:
- Home (overview, featured, entry points)
- Patterns (filterable index)
- Decision Explorer (question-driven recommendations)
- Compare (side-by-side patterns)
- Graph (relationship map)
- Packs (curated bundles)
- Guides (long-form how-tos)
- Contribute (how to add patterns)
Routes (v1):
- / (home)
- /patterns (index)
- /patterns/{slug} (pattern page)
- /compare?ids=a,b,c (comparison view)
- /decision (decision explorer)
- /graph (interactive map)
- /packs (curated bundles)
- /packs/{slug}
- /guides
- /guides/{slug}
- /llms.txt (LLM entry)
- /llms-full.txt (full pattern content)
- /data/patterns.json (structured pattern index)
- /data/patterns/{slug}.json (single pattern JSON)
Required fields:
---
id: "pattern.slug" # stable, lowercase, dot-separated
title: "Human-readable title"
summary: "One-sentence summary"
status: "proposed | emerging | established | validated-in-production | best-practice | experimental-but-awesome | rapidly-improving"
authors: ["Name (@handle)"]
category: "Orchestration & Control | Context & Memory | Feedback Loops | Learning & Adaptation | Reliability & Eval | Security & Safety | Tool Use & Environment | UX & Collaboration"
tags: [keywords, here]
source: "https://example.com/reference"
slug: "pattern-slug"
---
Optional fields:
---
based_on: ["Source or team"]
maturity: "early | maturing | mature"
complexity: "low | medium | high"
effort: "hours | days | weeks"
impact: "low | medium | high"
signals: ["When this pattern helps"]
anti_signals: ["When it is a bad fit"]
prerequisites: ["Prereq 1", "Prereq 2"]
related: ["other.pattern.id"]
anti_patterns: ["anti.pattern.id"]
tools: ["vector-db", "sandbox", "ci"]
domains: ["coding", "research", "ops"]
updated_at: "YYYY-MM-DD"
---
- Problem
- Solution
- How to use it
- Trade-offs
- References
Optional sections:
- When to use
- When not to use
- Signals
- Implementation checklist
- Variations
- Pitfalls
- Benchmarks
- Guides: longer multi-pattern workflows.
- Packs: curated lists of patterns by theme or use case.
- Glossary: standard definitions for cross-linking.
- Keep
patterns/as the canonical source of truth. - Keep repo-level documentation that directly supports contributors and users.
- Retire MkDocs-specific artifacts and generated outputs after Astro parity.
Initial keep list (adjust after audit):
README.mdCONTRIBUTING.mdTEMPLATE.mdHELP.mdLEARNINGS.mdPATTERN-LABELING.mdMIGRATION-TO-GIT-LABELS.md
Docs to surface as Guides:
HELP.mdLEARNINGS.mdPATTERN-LABELING.mdMIGRATION-TO-GIT-LABELS.md
- A strong narrative hero (why this exists, who it is for).
- Featured patterns and packs.
- Entry points for Builders, Researchers, Operators.
- Latest updates and newly added patterns.
- Faceted filters (category, maturity, complexity, tags, domains).
- Search bar with autocomplete.
- Pattern cards showing summary, status, and tags.
- Clean, skimmable layout with section nav.
- Copy as Markdown button (raw page content).
- Copy as JSON button (structured front matter + normalized sections).
- Inline related patterns and anti-patterns.
- Visual metadata pills (status, maturity, complexity).
- Select up to 4 patterns and compare key fields side-by-side.
- Show summary, signals, anti-signals, complexity, and trade-offs.
- Question-driven flow that recommends patterns with rationale.
- Outputs include a quick "why this fits" and "what to avoid."
- Implementation: Rules-based decision tree for v1 (ML-assisted deferred to v2).
- Rationale: Faster development, predictable behavior, easier debugging, clear rationale for recommendations.
- Future v2: Could enhance with ML for dynamic recommendations based on usage patterns.
- Interactive map of patterns and relationships.
- Filters by category, tag, maturity, and domain.
- Hover shows summary; click opens detail panel.
- Curated bundles (e.g., "Coding Agent MVP", "Safety First Stack").
- Each pack includes context and recommended order.
- /llms.txt with a concise index of canonical pattern URLs and metadata.
- /llms-full.txt with stable, minimal-noise pattern content.
- /data/patterns.json with structured metadata for ingestion.
- /data/patterns/{slug}.json for single-pattern retrieval.
- Provide "citation mode" anchors for pattern sections (stable IDs).
Design direction:
- Editorial, bold, modern, not a template docs look.
- High-contrast typography and generous spacing.
- Use a distinctive primary typeface and a serif body typeface.
- Subtle gradient or textured background, not flat color.
- Small, purposeful animations (page-load reveal, card hover lift).
Suggested typography (web-safe fallback acceptable):
- Headings: "Space Grotesk" or "Satoshi"
- Body: "Source Serif 4" or "Literata"
- Code: "JetBrains Mono" or "IBM Plex Mono"
Color system (example palette):
- Ink: #101214
- Paper: #f7f4ef
- Accent: #ff6a00
- Secondary: #0a7cff
- Muted: #8c8c8c
- Success: #12b76a
- Warning: #f79009
- Astro + TypeScript for static rendering.
- MDX for rich pattern content.
- Zod schema validation for front matter.
- Pagefind for search index.
- D3 or Visx for graph visualization.
- Deployment: Vercel (static output).
- Package manager: bun (monorepo).
apps/web/
astro.config.mjs
package.json
src/
content/
patterns/ # read from root patterns/ (symlink or custom loader)
guides/
packs/
pages/
index.astro
patterns/[slug].astro
compare.astro
decision.astro
graph.astro
packs/[slug].astro
guides/[slug].astro
components/
styles/
public/
data/
patterns.json
graph.json
llms.txt
llms-full.txt
- Parse
patterns/*.mdfront matter and body. - Validate schema and required headings.
- Generate structured JSON outputs.
- Generate
llms.txtandllms-full.txt. - Build static pages and search index.
- Keep
patterns/as source of truth. - Add missing front matter fields incrementally.
- Introduce a new build pipeline and retire MkDocs.
- Ship the new site behind a preview deployment first.
- Switch the main domain only after parity is reached.
- Remove MkDocs config, build steps, and generated artifacts after Astro parity.
- LCP < 2.0s on mobile for the home page.
- 95+ Lighthouse performance and accessibility scores.
- No client-side blocking scripts on initial load.
- WCAG 2.2 AA compliance.
- Keyboard navigation for all interactive components.
- Visible focus states and accessible color contrast.
- Canonical URLs for all patterns.
- JSON-LD structured data for patterns.
- Open Graph tags for social sharing.
- XML sitemap and RSS/Atom feeds for updates.
- Review and approve this specification. (done)
- Decide on the final stack (Astro vs alternatives). (done - Astro)
- Confirm target launch milestone (date or milestone). (done - 2026-01-27)
- Define the final front matter schema (required and optional fields).
- Add schema validation (Zod or Python) for
patterns/. - Update
patterns/TEMPLATE.mdto include new fields. - Add a migration script to backfill missing fields (summary, slug, id).
- Add lint checks for required sections and heading order.
- Create a build script to parse pattern files.
- Generate
public/data/patterns.json(index) from patterns. - Generate
public/data/patterns/{slug}.jsonper pattern. - Generate
public/llms.txtwith canonical URLs. - Generate
public/llms-full.txtwith normalized content. - Generate
public/data/graph.jsonfrom relationships. - Add sitemap and RSS feed generation.
- Create
apps/web/and initialize Astro + TypeScript. - Add global styles, typography, and color tokens.
- Build a base layout with header, footer, and nav.
- Implement a responsive grid and spacing system.
- Build the Home page with hero, entry points, and featured content.
- Build the Patterns index with filters and search.
- Build the Pattern page template with section nav.
- Add "Copy as Markdown" and "Copy as JSON" buttons.
- Build the Compare page with a selection workflow.
- Build the Decision Explorer flow (v1 rules-based).
- Build the Graph Explorer (v1 with basic filters).
- Integrate Pagefind and generate the search index.
- Add tag and category filters with URL sync.
- Implement related patterns and anti-pattern sections.
- Validate
llms.txtandllms-full.txtformats. - Add a "Copy prompt pack" feature for selected patterns.
- Add citation anchors and a copyable citation format.
- Ensure all existing patterns render correctly in the new site.
- Port any custom MkDocs styles to the new design system.
- Create redirects from old MkDocs URLs to new routes.
- Keep README auto-generation intact or replace it.
- Run Lighthouse and fix performance issues.
- Run accessibility checks and fix violations.
- Verify search index, JSON outputs, and LLM files.
- Deploy preview build and collect feedback.
- Switch production deployment to the new site.
Date: 2026-01-13
Context: Project migrating from MkDocs + Cloudflare Workers to Astro + Vercel. Question: whether to maintain Cloudflare/GitHub Pages as backup deployment.
Decision: No. Use Vercel as sole deployment target.
Rationale:
- Operational simplicity: Single deployment pipeline reduces complexity and error surface
- Vercel reliability: 99.99% uptime SLA; edge failures are exceptionally rare
- Migration velocity: Removes "maintain MkDocs fallback" option, forces completion
- DNS switching is slow: Real failover requires DNS propagation (minutes to hours)
- Git = backup: Repository history +
bun run buildprovides sufficient emergency recovery - Preview deployments: Vercel PR previews provide staging for testing
- Cost: No savings; both platforms have generous free tiers
Consequences:
- Remove
wrangler.toml,wranglerfrom package.json - Update
.github/workflows/deploy.ymlfor Vercel deployment - Archive DEPLOYMENT.md (MkDocs-specific instructions) after migration
- Domain DNS points to Vercel only
Revisit if: Vercel has sustained outage >1 hour (has never occurred).
Date: 2026-01-13
Context: Graph Explorer feature requires interactive network visualization. Options evaluated: D3.js vs Visx vs Sigma.js vs Cytoscape.js.
Decision: Use D3.js (d3-force module).
Rationale:
- Framework independence: Native Astro compatibility, no React runtime overhead
- Bundle size: ~15-20KB vs ~60KB+ for Visx + React
- Native force simulation: d3-force designed specifically for force-directed graphs
- Performance: Smaller JS = easier LCP < 2.0s target, higher Lighthouse scores
- Accessibility patterns: Documented keyboard nav and ARIA implementation guides
- Astro integration: Works with
client:loaddirective, no framework shim
Alternatives considered:
- Visx: React-specific, no force component (issue #429), adds React runtime
- Sigma.js: WebGL-based, handles 10K-100K nodes, overkill for ~50-100 patterns
- Cytoscape.js: ~200KB bundle, more complexity than needed
Implementation:
bun add d3-force d3-selection d3-zoom d3-dragConsequences:
- Manual accessibility implementation required (keyboard nav, ARIA, focus management)
- Learning curve for D3's imperative API
- Full control over interactions (hover, click, drag, zoom)
Revisit if: Graph scales to >500 nodes or requires WebGL performance.
Date: 2026-01-13
Context: Patterns live at repo root patterns/, Astro app in apps/web/. Need to load patterns into Astro content collections. Options: symlink patterns/ into apps/web/src/content/ vs custom loader reading from repo root.
Decision: Use Astro's native glob() loader with custom base path.
Implementation:
// apps/web/src/content/config.ts
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';
const patterns = defineCollection({
loader: glob({
pattern: '**/*.md',
base: '../../patterns' // Reads from repo root
}),
schema: z.object({
title: z.string(),
status: z.enum(['proposed', 'emerging', 'established', 'validated-in-production', 'best-practice', 'experimental-but-awesome', 'rapidly-improving']),
authors: z.array(z.string()),
category: z.string(),
tags: z.array(z.string()),
// ... other front matter fields
})
});
export const collections = { patterns };Rationale:
- Cross-platform reliability: Symlinks break on Windows (GitHub #8312, #12866), require
preserveSymlinks: trueworkaround - Git workflow: Symlinks are Git-tracked files that can fail on Windows clone; custom loader works for all contributors
- HMR support: Symlinks have file watching issues in monorepos (GitHub #8369); glob() loader has native HMR
- Astro v5 native: Content Layer API with glob() is the documented solution for external content
- Deployment: Vercel Linux builds handle glob() correctly; symlinks may have edge cases
- Developer experience: No special setup, no OS permissions, self-documenting code
- Future flexibility: Can extend to inline loader for data transformations if needed
Symlink disadvantages:
- Windows compatibility issues (requires Developer Mode/admin)
- Unknown Content Collection errors (GitHub #9088)
- Requires Vite
preserveSymlinks: trueconfiguration - Pre-Astro-v5 workaround, not the intended pattern
Consequences:
- Patterns remain at repo root as source of truth
- Contributors edit patterns in root
patterns/folder - Astro app reads via glob() loader with relative path
- No filesystem symlinks needed
- Cross-platform development works immediately
Revisit if: Astro content collection API changes significantly or glob() loader proves insufficient.
Date: 2026-01-13
Context: Current validation uses Python scripts (scripts/build_readme.py, ~600 lines). New stack is Astro + TypeScript + bun. Need validation for front matter schema, required headings, section order, and data pipeline (JSON/llms.txt generation).
Decision: Use TypeScript with bun for all validation and data pipeline scripts.
Rationale:
- Ecosystem alignment: Astro Content Collections use Zod natively; Zod already installed
- Single runtime: Build, validate, generate data all with TypeScript/bun (no Python on Vercel)
- Schema reuse: Zod schemas define once, use for validation + Astro types + runtime checks
- Performance: Bun is 20-40x faster than npm, 4× HTTP throughput vs Node, sub-second startup
- Build integration: Validation runs during Astro build (Content Collections auto-validate)
- Developer experience: One language, better IDE support, refactoring safety
- Ecosystem: gray-matter (5M+ downloads), remark, markdownlint vs python-frontmatter (stale)
Python disadvantages:
- Dual language maintenance (Python + TypeScript)
- Schema synchronization burden (Python validation ≠ Astro Zod schema)
- Custom YAML parser (only 30 lines) vs Zod's robust validation
- CI/CD complexity (two runtimes to install/configure)
Migration strategy:
- Port
build_readme.py→validate-patterns.ts(~2-3 days) - Port
git_pattern_dates.py→git-utils.ts(~1 day) - Create
build-data.tsfor JSON/llms.txt/graph.json generation (~2-3 days) - Remove Python dependencies from CI/CD (~1 day)
Implementation:
// scripts/validate-patterns.ts
import { z } from 'zod';
import matter from 'gray-matter';
const PatternSchema = z.object({
title: z.string().min(1),
status: z.enum(['proposed', 'emerging', 'established', 'validated-in-production', 'best-practice', 'experimental-but-awesome', 'rapidly-improving']),
authors: z.array(z.string()).min(1),
category: z.string(),
tags: z.array(z.string()),
// ... other fields
});
function validatePattern(filePath: string) {
const { data, content: body } = matter(readFileSync(filePath, 'utf-8'));
return PatternSchema.safeParse(data);
}Consequences:
- Remove Python from CI/CD pipeline
- Single
bun run buildcommand for validation + build - ~600 lines of Python to port to TypeScript
- Zod schemas become source of truth for validation
Revisit if: TypeScript validation proves insufficient or Python offers unique capabilities needed.
Date: 2026-01-13
Context: Data pipeline generates patterns.json, llms.txt, llms-full.txt, graph.json. Validation runtime already decided as TypeScript/Bun (Decision 004). Question: whether data pipeline should match or use different runtime.
Decision: Use TypeScript with bun (consistent with validation).
Rationale:
- Consistency: Single runtime across validation + data pipeline + Astro build
- Schema sharing: Data pipeline uses same Zod schemas as validation and Astro
- No cross-language boundary: Validation output → data pipeline generation in same process
- Performance: Bun speed benefits apply to data generation (100+ patterns → sub-second processing)
- Deployment: Vercel build only needs bun (no Python runtime)
- Maintainability: One language for entire build pipeline
- Type safety: TypeScript ensures JSON outputs match expected schema
Consequences:
- Single
bun run buildcommand runs validation + data generation + Astro build - Data pipeline scripts share types/validation logic with rest of codebase
- No Python dependency for data generation
Implementation:
// scripts/build-data.ts
import { getCollection } from 'astro:content';
import { writeFileSync } from 'fs';
export async function buildData() {
// Load validated patterns from Astro
const patterns = await getCollection('patterns');
// Generate outputs
writeFileSync('./public/data/patterns.json', JSON.stringify(patterns, null, 2));
writeFileSync('./public/llms.txt', generateLlmsTxt(patterns));
writeFileSync('./public/llms-full.txt', generateLlmsFullTxt(patterns));
writeFileSync('./public/data/graph.json', generateGraphJson(patterns));
}Revisit if: Data pipeline requirements outgrow TypeScript capabilities (unlikely).
Date: 2026-01-13
Context: Data pipeline generates patterns.json, llms.txt, llms-full.txt, graph.json. Monorepo structure has apps/web/ for Astro app. Question: Should outputs live in apps/web/public/ or repo root public/?
Decision: Use apps/web/public/ for all data pipeline outputs.
Rationale:
- Astro native: Framework serves static files from its
public/directory at root URL - Spec alignment: Repo layout (lines 234-258) already defines
apps/web/public/data/structure - Single-app monorepo: No shared location needed; only one app exists
- Build artifacts: Data files generated during
bun run build, not committed to Git - Canonical URLs:
/llms.txtand/data/patterns.jsonmap correctly fromapps/web/public/ - No symlinks: Decision 003 already rejected symlinks; copy steps add complexity
- Vercel compatible: Build output includes everything needed for deployment
Repo-root public/ disadvantages:
- Requires copy/symlink step from apps/web/public to repo root
- No clear purpose in single-app monorepo
- Adds build complexity without benefit
- Would need symlinks (already rejected)
Consequences:
- Data files are build artifacts (not in source control)
- Clean repository root (no public/ directory)
bun run buildgenerates outputs toapps/web/public/data/- Canonical URLs work:
/llms.txt→apps/web/public/llms.txt
Implementation:
// scripts/build-data.ts
const publicDir = new URL('../apps/web/public/', import.meta.url);
writeFileSync(new URL('data/patterns.json', publicDir), JSON.stringify(patterns));
writeFileSync(new URL('llms.txt', publicDir), generateLlmsTxt(patterns));
writeFileSync(new URL('llms-full.txt', publicDir), generateLlmsFullTxt(patterns));
writeFileSync(new URL('data/graph.json', publicDir), generateGraphJson(patterns));Revisit if: Second app added to monorepo that needs same data files.
Date: 2026-01-14
Context: Users need to cite patterns when using them in academic papers, blog posts, or documentation. Need a standard citation format.
Decision: Use APA-style citation format with pattern metadata.
Citation Format:
[Pattern Author(s)] ([Year]). [Pattern Title]. In *Awesome Agentic Patterns*. Retrieved [Date], from https://agentic-patterns.com/patterns/[slug]
Example:
Smith, J., & Doe, A. (2025). Reflection Loop. In *Awesome Agentic Patterns*. Retrieved January 14, 2026, from https://agentic-patterns.com/patterns/reflection
BibTeX Format:
@misc{agentic_patterns_[slug],
title = {[Pattern Title]},
author = {[Author(s)]},
year = {[Year]},
howpublished = {\\url{https://agentic-patterns.com/patterns/[slug]}},
note = {Awesome Agentic Patterns}
}Implementation:
- Add "Cite this pattern" button on pattern pages
- Copy citation to clipboard in both APA and BibTeX formats
- Include retrieval date in citation
- Use
updated_atfield for year if available, otherwise use current year
Rationale:
- APA is widely recognized in academic and technical writing
- BibTeX support for LaTeX users
- Stable URLs ensure citations remain valid
- Author attribution maintained from pattern frontmatter
Consequences:
- Patterns are citable in academic work
- Credit goes to original pattern authors
- Standard format improves consistency
Revisit if: Community requests additional citation formats (MLA, Chicago, etc.).
- Every pattern has a stable URL and renders with full metadata.
llms.txtandllms-full.txtexist and are up to date.- Pattern pages support copy as Markdown and JSON.
- Search, filters, compare, and graph features work on desktop and mobile.
- New site passes accessibility and performance targets.
- None.