llms.txt + llms-full.txt — give the model the corpus directly
The splash now serves the llms.txt standard at /llms.txt (a 132 KB link index, grouped by source repo) and /llms-full.txt (the full 5.7 MB corpus concatenated as raw markdown). LLM crawlers and agentic tools that follow the convention can ingest 460 hand-authored context-v documents in one fetch.
Why Care?
The whole point of Context Vigilance is give the agent the right context, in the right shape, before you ask it for code. But until tonight, an agent landing on this splash had to crawl 460 individual HTML pages, strip the chrome, and re-assemble the corpus to actually use any of it. That's exactly the failure mode the practice is supposed to fix.
The llms.txt standard — a small, deliberate convention published in 2024 — solves this with two files at the site root: /llms.txt (a markdown link index) and the optional /llms-full.txt (the full text concatenated). Both go in once, generate at build time, and any LLM crawler or agentic tool that follows the convention can ingest the entire corpus in a single HTTP request.
This entry adds both. The splash now speaks the protocol it has been preaching.
What's New?
/llms.txtatsplash/src/pages/llms.txt.ts— markdown link index of the entire published corpus. 132 KB, 557 lines. Sections: opening blockquote with the site lede, a Reference block (search, full content, source repo, org), and a Corpus block grouped bysource_repo_slugwith each entry rendered as- [Title](canonical url): lede(lede falls back todescriptionthensummarythen omits if none)./llms-full.txtatsplash/src/pages/llms-full.txt.ts— every published corpus entry's raw markdown body concatenated, separated by---. Each entry preceded by a metadata header (title, source repo, source path, canonical URL, last-modified date if present). 5.7 MB total, sorted by source repo then by title for stable diffs.Both endpoints respect the publish gate — same filter the corpus pages use:
publish !== false && private !== true. Anything the splash doesn't render isn't in the LLM-facing files either.Built statically at deploy time — the endpoints are Astro static routes, so they're rendered to
dist/llms.txtanddist/llms-full.txtonce per deploy. No runtime cost. Build time impact: ~30ms total for both files combined.
How the format breaks down
The spec is small enough to summarize:
# Site Title
> One-line description (blockquote)
Optional details paragraph
## Section name
- [Link title](full url): optional one-line description
- [Link title](full url)That's it. No XML, no JSON, no schema validator. Just markdown an LLM already knows how to parse. Our /llms.txt follows this verbatim. The ## Corpus section uses ### <repo-slug> sub-sections so a model can see the source distribution at a glance — useful when 460 documents are spread unevenly across 27 projects.
/llms-full.txt is not part of the strict spec — it's an optional companion the spec mentions for ingest. We emit it because the whole point of this site is "the corpus is the proof," and forcing a model to fetch 460 URLs to actually read the proof would be silly.
A spec-conformance gap (resolved when DNS lands)
The llms.txt convention assumes the file lives at the host root: https://contextvigilance.com/llms.txt. Until DNS for contextvigilance.com flips, this splash deploys under a path: https://lossless-group.github.io/context-vigilance-kit/llms.txt.
That means convention-based discovery (a crawler that just GETs /llms.txt from the host) won't find this splash's file until the custom domain lands — it'll hit lossless-group.github.io/llms.txt, which doesn't exist. Tools pointed explicitly at the path-based URL still work today.
The same gap affects every Lossless splash deployed under a path on lossless-group.github.io. The fix is the custom-domain rollout already on the roadmap — when astro.config.mjs flips base to '/' and the site config to the custom domain, the file lives at the host root and convention discovery starts working. No code change needed in the endpoints — they read import.meta.env.SITE and BASE_URL at build time and emit absolute URLs accordingly.
What this enables next
Cross-splash propagation. The endpoint shape ports cleanly to the other splashes (
astro-knots/splash,content-farm/splash,lfm/splash). Each one has a different content collection — astro-knots's rolled-up changelogs, content-farm's plugin docs, lfm's spec — so the intro paragraph differs per splash, but the loop-and-emit logic is identical. Next pass.Astro Knots client sites. Smaller surface area (a personal portfolio doesn't need
/llms-full.txtover a 5 MB corpus), but the simple/llms.txtwith site purpose + key page links is a one-evening rollout across the eight client sites.Better-than-default LLM citations. When a model ingests
/llms-full.txt, every entry has its canonical URL in the metadata header. Models that cite back to canonical URLs (Claude, ChatGPT with browsing) can now point readers at the exact corpus page rather than at the splash root.
Verification
$ pnpm build
... 464 page(s) built in 7.93s
$ ls -lh dist/llms*.txt
.rw-r--r--@ 132k dist/llms.txt
.rw-r--r--@ 5.7M dist/llms-full.txtAfter deploy, the live URLs will be:
https://lossless-group.github.io/context-vigilance-kit/llms.txthttps://lossless-group.github.io/context-vigilance-kit/llms-full.txt
Human verification: open /llms.txt in a browser, confirm it renders as text/markdown with the corpus link index. Curl /llms-full.txt and pipe to wc -c — should be in the multi-MB range.
LLM verification: ask a model to fetch /llms.txt, then ask a follow-up that requires content only present in a specific corpus entry. If the model can answer with citation, the round-trip works.
Source of truth: prose lives in markdown, not TypeScript
The first cut of this shipment had the voice and framing baked directly into the endpoint TypeScript files — opening blockquote, "Treat context with the same vigilance as code…" lede, the entire Reference section, the corpus intro. That's exactly the wrong shape: humans don't tweak language inside a .ts file, they tweak it in markdown.
The fix landed in the same day: the prose moved to splash/src/llms/llms.md and splash/src/llms/llms-full.md, with a small README at splash/src/llms/README.md documenting the token vocabulary. The endpoints became pure assemblers — they import template from '../llms/llms.md?raw', build a token map (SITE_NAME, ENTRY_COUNT, REPO_COUNT, SEARCH_URL, LLMS_FULL_URL, LLMS_INDEX_URL, CORPUS_INDEX, CORPUS_BODIES), substitute {{TOKEN}} placeholders, and emit. No prose lives in TypeScript anymore.
The user-facing output is byte-identical (still 132 KB / 5.7 MB). The developer-facing change is that anyone wanting to tweak how Context Vigilance describes itself to LLMs now edits a markdown file with no code review involved — the same way they'd tweak any other human-authored prose in the kit.
See also
The endpoint code:
splash/src/pages/llms.txt.ts,splash/src/pages/llms-full.txt.tsThe prose templates:
splash/src/llms/llms.md,splash/src/llms/llms-full.md,splash/src/llms/README.mdToday's analytics shipment (sibling entry):
changelog/2026-05-09_01.md
