Page actions
Copy Markdown, raw source URLs, llms.txt, Edit on GitHub, and opening a page in ChatGPT or Claude.
Every page has a line under its title and description. On the left it says when the page
last changed, from its updated frontmatter or its last git commit, and how long it takes to
read when that is three minutes or more. A change in the last month reads as "Updated 3 days
ago", with the date in its tooltip. If the page changed since the reader last opened it, the
line also says "Changed since your last visit", with the dot the sidebar puts on that page.
On the right are the page's actions. They let a reader copy the page's source, edit it on GitHub, or open it in an AI chat tool.
Copy Markdown
Copies the page's Markdown source to the clipboard, including the frontmatter. You can paste it straight into a chat with a model, which then has the page without fetching anything.
Raw Markdown
Every page is also served as plain Markdown:
/docs/writing/markdown the page
/docs/_vellum/raw/writing/markdown.md its source
The raw route returns text/markdown and follows gating with no extra
configuration: a page the reader cannot see returns a 404 here as well.
vellum:export writes the same files to _vellum/raw/, so the raw links also work on a
static site.
Each raw response names its HTML page in a Link: <...>; rel="canonical" header, so
search engines treat the HTML page as the original. When
versions are enabled, raw responses also carry an X-Vellum-Docs-Version header naming
the version. A page with a last-updated date, from its updated frontmatter or its last
git commit, gets a Last-Modified header; a page without one gets none. The body stays
the file as written.
The changelog has a raw copy too, at /docs/_vellum/raw/changelog.md, served from
changelog.path. It leaves out [Unreleased] whenever the HTML page does. See
Release notes.
For agents
The raw Markdown is also useful to tools that read docs on their own, such as coding agents. Vellum points them to it in four ways and offers a search endpoint as well.
llms.txt. /docs/llms.txt is an index of the docs in the
llms.txt format: the site name, the index page's description, then
the sidebar as ## sections in sidebar order, with a line per page linking to its raw
Markdown.
# Acme
> Everything about Acme.
## Docs
- [Home](https://example.com/docs/_vellum/raw/index.md): Everything about Acme.
## Getting started
- [Installation](https://example.com/docs/_vellum/raw/getting-started/installation.md)
Each top-level folder is a section, with anything nested in it flattened in. A run of
top-level pages is a section too, headed by the titled separator above it, or by the root
meta.json title (Docs without one) before any separator. When a run picks up again
after a folder, its heading repeats with "(continued)", so no two sections share a name.
The page description follows the link when the page has one.
The changelog is listed too, linking to its raw Markdown. It sits where the sidebar puts
it, or, when the sidebar does not list it, last under ## Optional, the heading llms.txt
reserves for links an agent can skip when it is short on room.
llms-full.txt. /docs/llms-full.txt is every page's Markdown source in one file, in
sidebar order. Each page starts with a header block between two lines of 80 =
characters:
================================================================================
Title: Installation
URL: https://example.com/docs/getting-started/installation
Version: v2
Updated: 2026-09-17
================================================================================
Version only appears when versions are enabled, and Updated only when the page has a
last-updated date. The changelog belongs to no one version, so its block has no Version,
and its source leaves out [Unreleased] whenever the HTML page does.
Both files are built from the same navigation as the sidebar and the
sitemap, with the same rules: gated pages are left out even for a
signed-in reader, since each is one public file. They cover the latest version only.
Links are absolute when app.url is an origin and root-relative otherwise.
vellum:export writes both at the export root. Set agents.llms_txt to false to turn
them off.
Agents look for llms.txt at the site root, so both files are also served at /llms.txt
and /llms-full.txt, on route.domain when that is set. Vellum only adds these routes
when your app has no route for the same path, and a route your app defines takes
precedence. Set agents.llms_txt_root to false to keep them
under the docs prefix only.
The links in llms.txt point under /docs/_vellum/raw/, so keep that path open in
robots.txt. Search engines has the rules to use.
An alternate link. Every page's head has
<link rel="alternate" type="text/markdown"> pointing at its raw Markdown, and the
response sends the same URL in a Link header.
Content negotiation. Request a page with Accept: text/markdown and the response is
the raw Markdown instead of HTML, the same body the raw route returns. This applies when
Accept lists text/markdown with a higher preference than text/html, so browsers
still get HTML. Gating applies as it does on the raw route. Page responses send Vary: Accept so a
cache keeps the two apart. Set agents.content_negotiation to false to turn it off.
A search endpoint. /docs/_vellum/search?q= runs the same search as the browser and
returns the top sections as JSON, for clients that cannot use the browser's index. See
Search.
Open in ChatGPT / Open in Claude
Both open the chat tool with a prompt that points to the page's raw Markdown URL.
The model has to fetch that URL, so this only works for docs on the public internet. For docs on localhost or behind a login, use Copy Markdown and paste the source instead.
Note: Why the raw Markdown URL
The raw file contains only the page content. A model reading the rendered page also has to process the navigation, sidebar and other layout, which uses more tokens and gives less accurate answers.
Edit on GitHub
Set repo to the base URL of your docs directory in source control:
'repo' => 'https://github.com/acme/app/edit/main/resources/docs',
Vellum appends the page's path relative to vellum.path, so
resources/docs/billing/invoices.md becomes
https://github.com/acme/app/edit/main/resources/docs/billing/invoices.md.
The link only appears when repo is set. Use an /edit/ URL to open GitHub's editor,
or a /blob/ URL to open the file view.
No link is shown for a file whose real path is outside vellum.path, so a symlinked page
cannot expose a path from elsewhere on disk.
Changing them
The actions have no config option. To change them, override the view. Vellum registers its
views under the vellum namespace, so a file at the matching path in your app takes
precedence:
resources/views/vendor/vellum/components/docs/page-actions.blade.php
Creating that file replaces the shipped view, and an empty file removes the actions and
leaves the date beside them. To change or remove the whole line, override
components/docs/page-meta.blade.php the same way. You do not need to publish anything
first. The same works for every other Vellum view.
Warning
Views are not frozen the way config keys and frontmatter are. An override is a copy and does not receive fixes or markup changes from later releases, so keep it as small as you can.