Reference

llms.txt and Copy Markdown

The Laravolt docs site publishes itself in a form that large language models (LLMs) and coding agents can consume directly — an llms.txt index, a full-text llms-full.txt, a .md mirror of every page, and an in-page Copy Markdown control with quick links to ChatGPT and Claude.

This page explains what the feature serves, where each artifact lives, and how it is implemented. It mirrors the approach used by Rspress SSG-MD but is implemented for our Remix + Markdoc pipeline.

What gets served

Unlike a static-site setup, nothing is generated at build time. The Remix server renders the artifacts on demand from the same content/**/page.md sources that power the HTML pages:

URLPurpose
/llms.txtHuman- and LLM-readable index. Title, short description, and a list of every page grouped by version and section. Follows the llmstxt.org convention.
/llms-full.txtEvery page concatenated, with route headers. Useful when a model can accept large context and you want the whole docs in one shot.
/<route>.mdPer-page markdown mirror. For example /forms/overview.md returns the raw Markdoc source of that page. The home page is /index.md.

A representative llms.txt snippet:

Text
# Laravolt

> Laravolt is a digital empowerment platform...

## Laravolt v7 — Introduction

- [Introduction](/introduction.md): Laravolt v7 is an AI-ready Laravel...
- [Installation](/getting-started/installation.md): Install Laravolt v7...

The .md mirrors are the same raw Markdoc you see in content/.../page.md. Markdoc tags ({% callout %}, {% quick-links %}) are kept intact — they do not hurt LLM comprehension and keep the response small.

The "Copy Markdown" control

Every docs page renders an action row below its title:

  • Copy Markdown — fetches the current route's .md mirror and places it on the clipboard.
  • View as Markdown — opens the .md mirror directly; copy its URL to paste into any tool that can fetch a URL.
  • Open in ChatGPT — opens chatgpt.com in a new tab with a prompt pointing at this page's .md URL.
  • Open in Claude — opens claude.ai in a new tab with the same prompt.

The prompt is intentionally conservative:

Text
Read https://<your-domain>/forms/overview.md and help me understand,
summarize, and answer questions about the content.

Feel free to adjust the phrasing in app/assets/llms-copy.ts if your users prefer a different prompt.

How routes map to files

The mirror URL is the page URL with .md appended (or /index.md at the root):

SourceRouteMirror URL
content/page.md//index.md
content/v7/introduction/page.md/introduction/introduction.md
content/v7/forms/overview/page.md/forms/overview/forms/overview.md

Because everything is served from the live route handlers, there is no generator to run and no .gitignore bookkeeping — editing a page updates its .md mirror, llms.txt, and llms-full.txt immediately.

Pointing AI tools at the docs

Publish the following URLs once the site is deployed:

  • https://<your-domain>/llms.txt — index for agents that support llms.txt.
  • https://<your-domain>/llms-full.txt — everything, concatenated.
  • https://<your-domain>/<route>.md — per-page access.

Anecdotally, the per-page .md URL is the most useful day-to-day: it is cheap to fetch, keeps context windows small, and plays well with the View as Markdown action.

Implementation pointers

If you need to customize behaviour, these are the files to edit:

  • app/lib/llms.ts — builds llms.txt and llms-full.txt from the navigation tree, and maps routes to .md mirror URLs.
  • app/actions/controller.tsx — the route handlers: llmsTxt, llmsFullTxt, and the .md branch of the catch-all page action.
  • app/ui/docs-layout.tsxLlmsActions, the server-rendered action row under the page title.
  • app/assets/llms-copy.ts — client-side wiring: clipboard copy and the ChatGPT / Claude prompt links.

Limitations

  • Markdoc tags are preserved verbatim. An LLM that has never seen the syntax may try to render {% callout %} literally. In practice, recent models ignore it, but if you want strict CommonMark, strip Markdoc tags in the .md branch of the page action before responding.
  • Only pages linked from the navigation (app/lib/navigation.ts) appear in llms.txt and llms-full.txt. Unlinked pages still get .md mirrors, but are not indexed.
  • The prompt used for ChatGPT / Claude hints at reading a URL; both services accept the query parameter but the exact rendering depends on their product decisions at the time of click.
Previous
Custom generators