The part that turned out to matter most was validation. On my own sites it caught a Product schema with no offers and an Organization schema with no logo, both of which I had been shipping longer than I realized. That was the real reason I kept working on this. The llms.txt generation is included because it is cheap to do at build time, but I think the structured-data validation is the more useful part today.
Under the hood it is a small core package plus Vite and Astro adapters. The Vite side injects escaped JSON-LD during transformIndexHtml, emits llms.txt and patches robots.txt during generateBundle, and reports validation results at the end of the build. The adapters try hard to preserve existing machine-readable assets instead of taking them over by default.
If people here already solve this in a cleaner way, I would like to hear it. I am especially interested in whether the Vite/Astro adapter boundary is the right place for this, or whether most teams would rather keep these outputs in a separate prerender step.