Thank you for your interest in contributing to the llm-d website! This repository manages the documentation website and follows both general project guidelines and website-specific processes.
Before making changes, check if the content is synced:
- Look for "Content Source" banners at the bottom of pages
- If banner exists: Click "edit the source file" to edit in the source repository
- If no banner: The content is local to this repository - proceed with PR below
| Content Type | Location | How to Edit |
|---|---|---|
| Synced Content | Architecture docs, guides, component docs | Edit in source repo (follow banner link) |
| Local Content | Blog posts, community pages, website config | Edit in this repository |
| Component Documentation | Auto-generated from component repos | Add to components-data.yaml |
For content without "Content Source" banners:
-
Fork & Clone
git clone https://github.com/YOUR-USERNAME/llm-d.github.io.git cd llm-d.github.io npm install -
Create Branch
git checkout -b docs/your-change-description
-
Test Locally
npm start
-
Commit & Push
git add . git commit -s -m "docs: your change description" git push origin docs/your-change-description
-
Open Pull Request with preview link for reviewers
There are three different approaches for adding remote content, depending on the content type:
| Content Type | How to Add | Configuration File |
|---|---|---|
| Components | Edit YAML file | components-data.yaml |
| Guides | Edit generator file | guide-generator.js |
| Other Content | Copy template + import | example-readme.js.template → remote-content.js |
Quick Decision Tree:
- Adding a component README? → Edit
components-data.yaml - Adding a guide from the main repo? → Edit
guide-generator.js - Adding other documentation? → Copy template, edit, and import
Components are automatically generated from components-data.yaml:
-
Edit the YAML file:
# Edit remote-content/remote-sources/components-data.yaml -
Add your component entry:
components: # ... existing components - name: llm-d-your-component org: llm-d # GitHub organization sidebarLabel: Your Component # Display name in sidebar description: Description of your component sidebarPosition: 8 version: v1.0.0 # Version tag for Latest Release page keywords: - llm-d - keywords
-
Test:
npm start
What happens:
- Component README.md from
mainbranch →/docs/architecture/Components/your-component.md - Appears in sidebar under "Components"
- Listed on Latest Release page
For external projects (outside llm-d org):
components:
- name: gateway-api-inference-extension
org: kubernetes-sigs # External organization
skipSync: true # Don't sync README, link to GitHub instead
sidebarLabel: Gateway API Extension
description: Description
sidebarPosition: 8
version: v0.1.0For other architecture documentation (design docs, patterns, ADRs):
- Use Option 3 (template-based) and place in
remote-content/remote-sources/architecture/ - See README.md "Adding Other Architecture Documentation" section
Guides are configured in the guide-generator.js file, not via templates:
-
Edit the generator file:
# Edit remote-content/remote-sources/guide/guide-generator.js -
Add your guide to the
DYNAMIC_GUIDESarray:const DYNAMIC_GUIDES = [ // ... existing guides { dirName: 'your-guide-folder', // Directory in llm-d/llm-d/guides/ title: 'Your Guide Title', description: 'Brief description for SEO', sidebarPosition: 15, keywords: ['llm-d', 'your', 'keywords'] } ];
This will sync
guides/your-guide-folder/README.md→docs/guide/Installation/your-guide-folder.md -
For nested guides with custom paths, use
sourceFileandtargetFilename:{ dirName: 'parent-folder/nested-guide', // Source directory path sourceFile: 'guides/parent-folder/nested-guide/README.md', // Explicit source title: 'Nested Guide Title', description: 'Guide description', sidebarPosition: 16, targetFilename: 'parent-folder/nested-guide.md', // Custom output path keywords: ['llm-d', 'nested', 'guide'] }
Example:
guides/workload-autoscaling/README.wva.md→docs/guide/Installation/workload-autoscaling/wva.md -
Test:
npm start
Note: Guides always sync from the main branch of the llm-d/llm-d repository.
For content that doesn't fit the component or guide pattern (e.g., community docs, architecture overviews):
-
Choose the right directory based on content type:
architecture/→docs/architecture/community/→docs/community/
-
Copy the template:
# Choose appropriate directory cp remote-content/remote-sources/example-readme.js.template \ remote-content/remote-sources/DIRECTORY/my-content.js # Example: cp remote-content/remote-sources/example-readme.js.template \ remote-content/remote-sources/community/my-doc.js
-
Edit configuration in the new file:
- Update repository name
- Set output directory and filename
- Configure title, description, sidebar position
- Note the
../imports for utils (since you're in a subdirectory)
-
Import in
remote-content/remote-content.js:import myContentSource from './remote-sources/DIRECTORY/my-content.js'; const remoteContentPlugins = [ // ... existing sources myContentSource, // Add your source ];
-
Test:
npm start
See the "Remote Content System" section in the main README.md for detailed technical information.
Components are auto-generated! Just add to remote-content/remote-sources/components-data.yaml:
components:
# ... existing components
- name: llm-d-your-component
org: llm-d
sidebarLabel: Your Component
description: Component description
sidebarPosition: 10
version: v1.0.0 # For Latest Release page display
keywords:
- llm-d
- your keywordsImportant Notes:
- The
versionfield is for display only on the Latest Release page - Component README content is always synced from the
mainbranch - Version tags do NOT affect which content gets synced
For details on how component versioning works and how to update for new releases, see the Component Version Management section in README.md.
This project follows the main llm-d Contributing Guidelines:
- DCO Sign-off Required: Use
git commit -s - All changes via PR: No direct pushes to main
- Review required: Maintainer approval needed
- Preview deployments: Available for all PRs
Blog posts are local content managed directly in this repository. Follow this step-by-step process to create a new blog post:
Blog posts are stored in the /blog/ directory with a specific naming convention:
# Format: YYYY-MM-DD_slug-title.md
# Example: 2025-10-15_my-new-blog-post.md
touch blog/2025-10-15_my-new-blog-post.mdEvery blog post must start with YAML frontmatter. Here's the required structure:
---
title: "Your Blog Post Title"
description: "A brief description of your blog post for SEO and previews"
slug: your-blog-post-slug
date: 2025-10-15T09:00
authors:
- authorkey1
- authorkey2
tags: [blog, updates, llm-d, your-tags]
---Frontmatter Fields:
title: The display title of your blog postdescription: Brief description for SEO and social media previewsslug: URL-friendly version (used in/blog/your-slugURL)date: Publication date in ISO format with timeauthors: Array of author keys fromblog/authors.ymltags: Array of tags for categorization (seeblog/tags.ymlfor existing tags)
Authors are managed in blog/authors.yml. To add a new author:
# In blog/authors.yml
yourauthorkey:
name: Your Full Name
title: Your Job Title, Company
url: https://github.com/yourusername
image_url: https://avatars.githubusercontent.com/u/12345?v=4
email: your.email@company.com # optionalThen reference the author in your blog post frontmatter:
authors:
- yourauthorkeyAuthor Image Options:
Option 1: GitHub Avatar (Recommended)
image_url: https://avatars.githubusercontent.com/u/12345?v=4Option 2: Local Image File
-
Add your image to the
static/img/blogs/directory:# Place your image file here cp your-photo.jpg static/img/blogs/yourname.jpg -
Reference it in
authors.yml:yourauthorkey: name: Your Full Name image_url: /img/blogs/yourname.jpg
Option 3: External URL
image_url: https://your-website.com/path/to/your-photo.jpgExamples from existing authors:
- GitHub avatar:
robshawuseshttps://avatars.githubusercontent.com/u/114415538?v=4 - Local image:
cnulanduses/img/blogs/cnuland.webp
After the frontmatter, write your blog post in Markdown:
---
# frontmatter here
---
# Your Blog Post Title
Your opening paragraph should provide a compelling introduction to your topic.
<!-- truncate -->
The `<!-- truncate -->` tag splits your post on the main blog listing page. Content above this tag appears in the preview, content below is only shown on the full post page.
## Your Content Sections
Continue with your blog post content...Image Organization: Create a dedicated folder for your blog post images:
# Create folder for your blog post
mkdir -p static/img/blogs/your-blog-slug/
# Add your images
cp your-image.png static/img/blogs/your-blog-slug/Reference Images in Markdown:

<small>*__FIGURE 1__: Caption describing your image or diagram.*</small>Examples from existing posts:
- See
blog/2025-09-24_kvcache-wins-you-can-see.mdfor image usage examples - Images are stored in
static/img/blogs/kv-cache-wins/
Enhance your blog post with visual callouts:
:::tip Key Takeaway
Important points or tips for readers
:::
:::note Additional Context
Supplementary information or context
:::Examples:
- See callout usage in
blog/2025-09-24_kvcache-wins-you-can-see.md - See tip examples in
blog/2025-06-25_community_update.md
Before submitting, test your blog post locally:
npm start
# Navigate to http://localhost:3000/blog to see your postFollow the standard contribution process:
git checkout -b blog/your-blog-post-slug
git add blog/your-blog-post.md static/img/blogs/your-blog-slug/
git commit -s -m "blog: add your blog post title"
git push origin blog/your-blog-post-slugThen open a pull request. The PR will automatically generate a preview deployment for review.
- File named with correct format:
YYYY-MM-DD_slug.md - Complete frontmatter with all required fields
- Author(s) added to
blog/authors.ymlif new -
<!-- truncate -->tag placed after introduction - Images stored in
/static/img/blogs/your-slug/folder - Images referenced with proper paths and captions
- Tags added (check
blog/tags.ymlfor existing ones) - Content tested locally with
npm start - Pull request includes preview link for reviewers
If you're converting content from Google Docs:
- Export as Markdown from Google Docs Note: Images are embedded in the markdown so remove those at the bottom of the markdown before step 2.
- Save images separately by exporting as HTML/ZIP to get image files
- Place images in
/static/img/blogs/your-blog-slug/folder - Update image references to use
/img/blogs/your-blog-slug/filename.pngformat - Add frontmatter and
<!-- truncate -->tag as described above - Review and test locally before submitting
The website uses an optimized system based on content type:
- Components: Auto-generated from YAML for consistency
- Guides: Generator-based for flexible directory mapping
- Other content: Template-based for maximum customization
Yes! Keywords are rendered as HTML meta keywords tags for SEO:
<meta name="keywords" content="llm-d,inference scheduler,request routing">This helps search engines understand page content and improve discoverability. While modern search engines don't rely heavily on keywords meta tags, they're still used by some search engines and can help with content categorization.
Yes! The YAML supports any GitHub organization via the org field:
components:
- name: llm-d-modelservice
org: llm-d-incubation # Different orgThe system automatically constructs the URL:
https://raw.githubusercontent.com/llm-d-incubation/llm-d-modelservice/main/README.md
Currently synced orgs:
llm-d(main org)llm-d-incubation(experimental components)kubernetes-sigs(external, withskipSync: true)
The build system automatically transforms GitHub markdown to work with Docusaurus:
- GitHub callouts (e.g.,
> [!NOTE]) → Docusaurus admonitions (:::note) - HTML tab markers (
<!-- TABS:START -->) → Docusaurus Tabs components - Relative links → Absolute GitHub links (to prevent broken links)
- Relative images → GitHub raw URLs
- HTML tags → MDX-compatible format
Your source files remain unchanged - transformations only apply to the synced copy.
This ensures the documentation always reflects the latest development state. Version tags in components-data.yaml are for display on the Latest Release page only and don't affect which content gets synced.
Yes! When you open a pull request, Netlify automatically creates a preview deployment. The preview URL is posted as a comment on your PR.
For synced content from other repositories, you'll need to test changes locally (see README.md "Testing content from a feature branch" section).
When a new llm-d release is published:
- Run the sync script:
node remote-content/remote-sources/sync-release.mjs - Review changes:
git diff remote-content/remote-sources/components-data.yaml - Commit and push:
git add remote-content/remote-sources/components-data.yaml && git commit -m "Update to llm-d vX.Y.Z"
The script automatically updates:
- Release version and date
- Component version tags (for Latest Release page display)
- Container image versions
Note: This only updates version numbers for display. Component READMEs always sync from the main branch during the build process.
For detailed information, see Component Version Management in README.md.
Version tags (in components-data.yaml):
- Displayed on the Latest Release page
- Show which versions were included in a release
- Updated by the
sync-release.mjsscript
Synced content (READMEs, guides, docs):
- Always pulled from the
mainbranch - Updated during each build
- Independent of version tags
Example: A component with version: v0.6.0 in YAML will show "v0.6.0" on the Latest Release page, but its README content comes from the main branch, not from the v0.6.0 release tag.
- General questions: Join the llm-d Slack
- Website issues: Create an issue
- Content questions: Check if content is synced, then edit in appropriate repository
- Technical details: See README.md for architecture and transformation details