npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

vitepress-plugin-llmstxt

v0.5.0

Published

VitePress plugin to generate llms.txt files automatically

Readme

VitePress Plugin LLMS Text

BANNER

License Version NPM Unpacked Size

This plugin automatically generates LLMS text files (llms.txt and llms-full.txt) for VitePress projects. It can be used to create useful metadata files and provide structured information for large language models (LLMs).

🗂️ Index

✨ Features

  • Simple to use (no configuration required).
  • lightweight and zero dependencies.
  • Automatically Generates a llms.txt of all pages.
  • Automatically Generates a llms-full.txt of all pages.
  • Automatically Generates .md files for each page.
  • Supports Ignoring certain routes.
  • Supports custom frontmatter addition.
  • Supports dynamic routes and i18n routes.
  • Supports transformation of page data via a callback.
  • Supports for building only certain files.
  • Generates a table of contents (TOC).
  • Follows the https://llmstxt.org/ standard.
  • Experimental support for VitePress v2.0.0-alpha.

🔑 Installation

Install the plugin:

npm install vitepress-plugin-llmstxt
# or
pnpm install vitepress-plugin-llmstxt
# or
yarn add vitepress-plugin-llmstxt
# or
bun add vitepress-plugin-llmstxt
# or
deno add vitepress-plugin-llmstxt

📖 Usage

Import and use the plugin in your VitePress configuration:

import { defineConfig } from 'vitepress';
import llmstxtPlugin from 'vitepress-plugin-llmstxt';

export default defineConfig({
  vite: {
    plugins: [llmstxtPlugin()],
  },
});

⚙️ Configuration

This plugin requires no configuration, but if you need specific settings, it can be flexibly configured to suit any use case.

The plugin supports the following configuration options:

hostname (string)

The base URL to use for generated links.

Examples

{
  hostname: 'https://example.org'
}

ignore (string[])

An array of glob patterns to exclude from processing.

  • The plugin will ignore all files that match the pattern
  • The files to ignore should be a global pattern of the local 'md' documentation files.

IMPORTANT vitepress-plugin-llmstxt uses import { createContentLoader } from 'vitepress' to load .md files. Because of this, the pattern must not start with a leading slash (/). Learn more

Examples

{
  ignore: [ '**/guide/index.md' ] // Ignore only guide index.
}
{
  ignore: [ '**/guide/core/*' ] // Ignore all core folder.
}
{
  ignore: [ '**/guide/core/*', '**/guide/api/*' ] // Ignore multiple patterns (all core and api folder)
}

llmsFile (boolean | object)

Whether to generate the main llms.txt file.
@default true

If passed as an object, you can control additional options:

indexTOC (boolean | 'only-llms' | 'only-web' | 'only-llms-links' | 'only-web-links')

Controls the content of the table of contents inside the llms.txt file.

  • 'only-llms' - Only the title with LLMs links
  • 'only-web' - Only the title with web links
  • 'only-llms-links' - Only the LLMs links
  • 'only-web-links' - Only the web links
  • true - Show both
  • false - No index included

Examples

{
  llmsFile: {
    indexTOC: 'only-llms'
  }
}

llmsFullFile (boolean)

Whether to generate the extended llms-full.txt file.
@default true

mdFiles (boolean)

Whether to generate a .md file for each route.
@default true

dynamicRoutes (boolean)

Support vitepress dynamic routes. @default true

transform (function)

A callback to transform each page's data before writing it.

{
  transform?: (data: {
    page: LlmsPageData
    pages: LlmsPageData[]
    vpConfig?: VPConfig
    utils: {
      getIndexTOC: (type: IndexTOC) => string
      removeFrontmatter: (content: string) => string
    }
  }) => Promise<LlmsPageData> | LlmsPageData
}

You can use this to mutate page.content, add or remove metadata, or conditionally skip pages.

Examples

{
  transform: async ({ page }) => {

    // Add a content before llms.txt content
    if (page.path === '/llms.txt')
      page.content = `Structured information designed to provide useful metadata to large language models (LLMs)\n\n` + page.content

    // Remove frontmatter from llms-full.txt
    if (page.path === '/llms-full.txt')
      page.content = utils.removeFrontmatter(page.content)

    // Add a title and an index table of contents in llms-full.txt
    if (page.path === '/llms-full.txt')
      page.content = '# LLMS Full\n\n' + utils.getIndexTOC('only-llms') + '\n\n' + page.content

    return page
  }
}

watch (boolean)

Whether to watch for changes to the source files and regenerate the llms.txt, llms-full.txt and .md files. @default false

This feature is only enabled in development mode.

💡 Examples

import { defineConfig } from 'vitepress';
import llmstxtPlugin from 'vitepress-plugin-llmstxt';

export default defineConfig({
  vite: {
    plugins: [
      llmstxtPlugin({
        hostname: 'https://example.com',
        ignore: ['*/api/**/*'],
        llmsFile: {
          indexTOC: 'only-llms',
        },
        llmsFullFile: true,
        mdFiles: false,
        transform: ({ page, pages }) => {
          if (page.path === '/llms.txt') {
            page.content = `Structured information designed to provide useful metadata to large language models (LLMs)\n\n` + page.content;
          }
          return page;
        },
      })
    ],
  },
});

Client examples

You can display your call information on the frontend. Here's an example:

.vitepress/theme/components/llmstxt.vue

<script setup>

import { useLLMsRouteData } from 'vitepress-plugin-llmstxt/client' 
import { useRoute, useData } from 'vitepress/client'
import { ref, watch } from 'vue'

const data     = useData()
const route    = useRoute()
const llmsPath = ref( useLLMsRouteData( route, data )?.path )

watch(
  route,
  newValue => llmsPath.value = useLLMsRouteData( newValue, data )?.path,
  { immediate: true },
)

</script>

<template>
  <div
    class="llmstxt-section"
    v-if="llmsPath"
  >
    <p class="outline-title">
      LLM Resources
    </p>
    <ul>
      <li>
        <a
          :href="llmsPath"
          target="_blank"
          class="VPLink link"
        >
          llms.txt
        </a>
      </li>
    </ul>
  </div>
</template>

<style>
  .llmstxt-section {
    margin: 25px 0px 5px 0px;
  }
  .llmstxt-section li {
    margin: 5px;
  }
  .llmstxt-section a {
    font-size: small;
    margin: 0;
    color: var(--vp-c-text-2);
    transition: color 0.5s;
  }
  .llmstxt-section a:hover {
    color: var(--vp-c-text-1);
    transition: color 0.25s;
  }
</style>

.vitepress/theme/index.{ts,js}

import DefaultTheme from 'vitepress/theme'
import { h }        from 'vue'
import Llmstxt from './components/llmstxt.vue'

/** @type {import('vitepress').Theme} */
export default {
  extends : DefaultTheme,
  Layout( ) {
    return h( DefaultTheme.Layout, null, { 'aside-outline-after': () => h( Llmstxt ) } )
  },
}

👨‍💻 Contribute

vitepress-plugin-llmstxt is an open source project and its development is open to anyone who wants to participate.


License Version NPM Unpacked Size