Lossless Changelog
product

MemoPop's splash speaks all three discovery protocols — llms.txt, sitemap.xml, robots.txt

The memopop-site splash now serves the same machine-readable discovery surface that landed in context-vigilance-kit over the past two days, ported with the adaptations memopop needs — two content collections instead of one, provenance via `from` instead of `source_repo_slug`, and no publish gate to mirror. LLM crawlers get `/llms.txt` + `/llms-full.txt`, search engines get `sitemap-index.xml` + `robots.txt`, and the head of every page carries explicit `rel="sitemap"` and `rel="alternate" type="text/markdown"` hints.

Michael StatonMusic Editoraugmented with Claude Code on Claude Opus 4.7 (1M context)

Why Care?

A splash page that no one can find is a splash page that doesn't exist. Until tonight, the memopop-site splash spoke only HTML — fine for humans, opaque to every other audience. Now it speaks three machine-readable protocols at once: /llms.txt for LLM crawlers and agentic tools that follow the llms.txt convention, sitemap-index.xml for search engines, and a robots.txt that points the latter at the former. The same <head> carries rel="sitemap" and rel="alternate" type="text/markdown" hints so any tool that looks there discovers the relevant file without parsing robots.

This is the second splash in the Lossless family to wear the full discovery surface. The first was context-vigilance-kit (llms.txt landed there on 2026-05-09, the sitemap+robots+OG trio landed there on 2026-05-11). The interesting work here wasn't what to ship — the spec was solved — it was what to adapt. Memopop's content shape is different enough from CVK's that a clean copy-paste of the endpoints wouldn't have worked.

What's New?

  • /llms.txt at src/pages/llms.txt.ts — markdown link index of the splash's two content collections (changelog + context-v), grouped by source peer (orchestrator engine, this site, workspace notes), with the lede from each entry as the link description. Lives at https://lossless-group.github.io/memopop-ai/llms.txt after deploy.

  • /llms-full.txt at src/pages/llms-full.txt.ts — every entry from both collections concatenated as raw markdown, each preceded by a metadata header (title, kind, source peer, source path, canonical URL, last-modified date). Sorted deterministically: by from first, then changelog before context-v within each peer, then date desc within (kind, from). Build is reproducible.

  • @astrojs/sitemap integration in astro.config.mjs — auto-generates sitemap-index.xml + sitemap-0.xml at build time. Filter excludes the two /llms.txt endpoints (LLM-facing, not for search engines) and the 404 page. Dependency added at ^3.7.2.

  • public/robots.txt — three lines, no bot denied; the Sitemap: pointer at the absolute URL is the load-bearing part.

  • Two new <link> tags in BaseLayout.astro — explicit hints to discovery tools that look in <head>: rel="sitemap" pointing at the XML index, rel="alternate" type="text/markdown" pointing at /llms.txt.

  • A src/llms/ source-of-truth directory with llms.md, llms-full.md, and a README.md documenting the token vocabulary. The endpoints are pure assemblers — they import the template via Vite's ?raw, substitute {{TOKEN}} placeholders, and emit. No prose lives in TypeScript.

How it works

                      ┌──────────────────────┐
                      │   memopop-site       │
                      │   /                  │
                      └──────────┬───────────┘
                                 │
       ┌─────────────────────────┼─────────────────────────┐
       │                         │                         │
       ▼                         ▼                         ▼
  /sitemap-index.xml        /llms.txt              <head> hints:
  /robots.txt               /llms-full.txt           rel="sitemap"
                                                     rel="alternate"
       │                         │                         │
       ▼                         ▼                         ▼
   search engines           LLM crawlers              both audiences
   (Google, Bing)           (ingest tools)            in-page

Three protocols, three audiences, one corpus that's just the union of changelog and context-v.

What changed versus the context-vigilance-kit reference

Three things didn't port cleanly, and the differences are worth reading if you're going to port this to a third splash:

  1. Two collections, not one. CVK's splash has a single corpus collection — flat list of hand-authored and collated context-v entries. Memopop has changelog and context-v as two separate Astro content collections (see src/content.config.ts). The endpoints read both. The llms.txt output has two sections (## Changelog and ## Context-V); the llms-full.txt concatenates from both, with a Kind: field in each entry's metadata header so an LLM ingesting the file can disambiguate.

  2. Provenance via from, not source_repo_slug. CVK's corpus is collated from many sibling repos via a local script that stamps source_repo_slug on every entry. Memopop's union loader instead stamps from, from_kind, and from_path — these identify which peer in the monorepo (orchestrator-engine, memopop-site, workspace-itself) the entry came from. Grouping in /llms.txt happens by from. Helper utilities for reading these fields already exist in src/lib/provenance.ts; the new endpoints just use them.

  3. No publish/private gate. CVK's endpoints filter out entries where publish === false or private === true, matching the corpus pages' gate. Memopop's [...slug].astro pages currently render every entry without filtering. The endpoints match that behavior so the HTML and LLM-facing views never disagree. Anchored note in llms.txt.ts: if a publish gate is later added to the page templates, re-derive the predicate in the endpoints to keep the two in sync.

The spec-conformance gap (same as CVK)

The llms.txt convention, the robots.txt convention, and sitemap discovery all assume the file lives at the host root: https://contextvigilance.com/llms.txt, https://memopop.ai/robots.txt. Until DNS for a custom domain lands, this splash deploys under a path on GitHub Pages: https://lossless-group.github.io/memopop-ai/.

That means convention-based discovery (a crawler GET-ing /llms.txt or /robots.txt from the host root) won't find this splash's files — it'll hit lossless-group.github.io/llms.txt, which is GitHub's. Crawlers pointed explicitly at the path-based URL via sitemap submission, the rel="sitemap" link in <head>, or the rel="alternate" link in <head> still work today. The endpoints read import.meta.env.SITE and BASE_URL at build time and emit absolute URLs, so no code change is needed when the domain flips — the same files start working spec-conformantly.

Verification

After build, the four artifacts should land in dist/:

$ bun run build
... pages built
$ ls -lh dist/llms*.txt dist/sitemap*.xml dist/robots.txt
.rw-r--r--@ <KB>   dist/llms.txt
.rw-r--r--@ <MB>   dist/llms-full.txt
.rw-r--r--@ <KB>   dist/sitemap-0.xml
.rw-r--r--@ <KB>   dist/sitemap-index.xml
.rw-r--r--@ ~100B  dist/robots.txt

(Exact sizes depend on entry count; build the splash to see actuals.)

Live URLs after deploy:

  • https://lossless-group.github.io/memopop-ai/llms.txt

  • https://lossless-group.github.io/memopop-ai/llms-full.txt

  • https://lossless-group.github.io/memopop-ai/sitemap-index.xml

  • https://lossless-group.github.io/memopop-ai/robots.txt

Human check: open /llms.txt in a browser, confirm it renders as text/markdown with two sections (## Changelog, ## Context-V), each grouped by source peer. Curl /llms-full.txt and pipe to wc -c — should be in the multi-MB range once the corpus grows.

What's next

Three more splashes in the Lossless family still need the trio: astro-knots/splash, content-farm/splash, and lfm/splash. Each one has a different content shape — astro-knots's rolled-up changelogs from many sibling sites, content-farm's plugin docs, lfm's spec — so the intro prose in each src/llms/llms.md differs per splash, but the assembler logic (load template → substitute tokens → emit) is identical. The CVK and memopop versions are now the two reference implementations to crib from.

Also worth: an OG card for this splash. CVK got one in the same shipment but memopop's was deferred — it needs its own DESIGN.md imagery: recipe before generation, and that hasn't been authored yet. Tracked as a follow-up.