llms.txt for Gatsby
Two approaches for Gatsby: a zero-config static file in static/, or programmatic generation in gatsby-node.js using the GraphQL data layer to build links from your content.
Last updated:
Option 1: static file in static/
Gatsby copies everything in the static/ directory directly into the public/ build output. Place your file at static/llms.txt
and it will be available at /llms.txt after gatsby build.
# Gatsby static file approach
#
# Place your file at: static/llms.txt
# Gatsby copies everything in static/ directly to the public/ build output.
#
# Project structure:
# your-gatsby-site/
# ├── static/
# │ └── llms.txt ← add this
# ├── src/
# └── gatsby-config.js
This approach requires no code changes and works with all Gatsby deployment targets: Netlify, Vercel, Cloudflare Pages, AWS Amplify, and self-hosted.
Option 2: generate in gatsby-node.js
For sites where documentation pages are sourced from Markdown, MDX, or a CMS via the Gatsby data
layer, use the onPostBuild lifecycle hook in gatsby-node.js to generate llms.txt after the build completes. This ensures
the link list is always in sync with your content.
// gatsby-node.js
// Generate llms.txt from your GraphQL data layer
const { writeFileSync } = require('fs');
const { resolve } = require('path');
exports.onPostBuild = async ({ graphql }) => {
// Query your documentation pages (adjust the query to your data model)
const result = await graphql(`
query {
allMarkdownRemark(
filter: { frontmatter: { collection: { eq: "docs" } } }
sort: { frontmatter: { order: ASC } }
) {
nodes {
frontmatter {
title
description
}
fields {
slug
}
}
}
}
`);
if (result.errors) {
throw result.errors;
}
const docs = result.data.allMarkdownRemark.nodes;
const siteUrl = 'https://yoursite.com';
const links = docs
.map(
(doc) =>
`- [${doc.frontmatter.title}](${siteUrl}/docs/${doc.fields.slug}/): ${doc.frontmatter.description ?? ''}`
)
.join('\n');
const content = [
'# Your Site',
'',
'> One-sentence description of your project.',
'',
'## Documentation',
'',
links,
'',
'## Optional',
'',
`- [Changelog](${siteUrl}/changelog/): Release history.`,
].join('\n');
// Write to public/ (Gatsby's build output directory)
writeFileSync(resolve(__dirname, 'public', 'llms.txt'), content, 'utf-8');
};
The onPostBuild hook receives the same graphql function used in page queries.
Adjust the query to match your data model — the example uses allMarkdownRemark but you
can query any Gatsby source plugin (allMdx, allContentfulPage, etc.).
Gatsby plugin approach
If you prefer a plug-and-play solution, several community plugins generate llms.txt automatically. Search npm for gatsby-plugin-llms-txt. Alternatively, the approach above in gatsby-node.js is straightforward enough that a custom plugin adds little value for most
projects.
You can also use gatsby-plugin-sitemap as a reference — it uses the same onPostBuild pattern to write an XML file to public/.
Verify
# Build
gatsby build
# Check generated file
cat public/llms.txt | head -10
# After deploying, verify the live URL
curl -I https://yoursite.com/llms.txt
# Expected: content-type: text/plain; charset=utf-8 Related guides
- How to create llms.txt — templates and checklist.
- llms.txt format reference — spec details.
- Eleventy guide — another static site generator approach.
- Next.js guide — React framework with SSR.
- Validator · Generator.