angeo / module-llms-txt

angeo/module-llms-txt

Magento 2 module for AI Engine Optimization (AEO). Generates spec-compliant llms.txt and llms-full.txt per llmstxt.org standard, plus streaming JSONL for vector indexing. Multi-store, multi-website, CLI, cron, async admin UI, Page Builder-aware sanitization, customer-group pricing, atomic writes, ETag/Cache-Control, .md mirrors.

magento2-module 2.4.6-2.4.9 Compatible Based on composer requirements only QA: failed MIT
Viewing version 2.1.0. Latest version is 3.0.5. Switch to latest

Angeo LLMs.txt — Magento 2

Packagist
License
PHP

Generates spec-compliant llms.txt and JSONL files for ChatGPT, Claude, Gemini, and Perplexity AI visibility.

Part of the Angeo AI Commerce Suite — open-source Magento 2 modules for AI Engine Optimization (AEO).
GitHub: github.com/angeo-dev · Website: angeo.dev


Installation

composer require angeo/module-llms-txt
bin/magento setup:upgrade
bin/magento cache:flush

Usage

CLI

# Generate for all active stores
bin/magento angeo:llms:generate

# Generate for a specific store
bin/magento angeo:llms:generate --store=en_us

# Skip JSONL (llms.txt only)
bin/magento angeo:llms:generate --no-jsonl

# Skip llms.txt (JSONL only)
bin/magento angeo:llms:generate --no-llms

Admin UI

Stores → Configuration → Angeo → LLMs.txt → click Generate Now.

Cron

Runs automatically every day at 02:00 server time. Each store is emulated in AREA_FRONTEND context so that URLs and locale always resolve to correct frontend values.

bin/magento cron:run --group=default

Generated files

Files are written to pub/media/angeo/llms/ and served via a PHP controller:

URL File
yourstore.com/llms.txt pub/media/angeo/llms/llms_default.txt
yourstore.com/llms.jsonl pub/media/angeo/llms/llms_default.jsonl

Multi-store: each store gets its own file (llms_en_us.txt, llms_de.txt, etc.) served at the store's base URL.


llms.txt format

Output follows the llmstxt.org spec — H1 title, metadata block, ## sections with markdown links:

# My Store

> Store URL: https://mystore.com
> Currency: USD
> Locale: en-US

## Categories

- [All products](https://mystore.com/all-products.html)
- [Sale](https://mystore.com/sale.html)

## Products

- [Product name](https://mystore.com/product.html): 99.00 USD

## Pages

- [About us](https://mystore.com/about): About page description.

Configuration

Stores → Configuration → Angeo → LLMs.txt

Setting Scope Description Default
Enabled Global Enable/disable the module Yes
Exclude This Store Store View Skip this store from generation No
Include Products Store View Add ## Products section Yes
Include Categories Store View Add ## Categories section Yes
Include CMS Pages Store View Add ## Pages section Yes
Generate JSONL Store View Also generate .jsonl file Yes
Product limit Store View Max products (0 = unlimited) 5000

Extending with custom providers

Register additional content sections via di.xml:

<type name="Angeo\LlmsTxt\Model\LlmsGenerator">
    <arguments>
        <argument name="providers" xsi:type="array">
            <item name="my_custom" xsi:type="object">Vendor\Module\Model\Llms\Providers\MyProvider</item>
        </argument>
    </arguments>
</type>

Implement Angeo\LlmsTxt\Api\ProviderInterface:

public function provide(StoreInterface $store): string
{
    return "## My Section\n\n- [Item](url): description\n\n";
}

Testing

vendor/bin/phpunit -c app/code/Angeo/LlmsTxt/phpunit.xml

The Angeo AI Commerce Suite

Free, MIT-licensed Magento 2 modules — packagist.org/packages/angeo · github.com/angeo-dev

Module Packagist Purpose
angeo/module-aeo-audit CLI AEO audit — 8 signals scored
angeo/module-llms-txt This module — llms.txt + JSONL generator
angeo/module-openai-product-feed ChatGPT Shopping CSV product feed
angeo/module-openai-product-feed-api ACP REST API — 6 endpoints
angeo/module-rich-data JSON-LD schema — Product, Organization, FAQ, Breadcrumb

Install the full suite:

composer require angeo/module-aeo-audit angeo/module-llms-txt angeo/module-openai-product-feed angeo/module-openai-product-feed-api angeo/module-rich-data
bin/magento setup:upgrade && bin/magento cache:flush

Changelog

See CHANGELOG.md.


License

MIT — see LICENSE

Changelog

All notable changes to this project will be documented in this file.
Format follows Keep a Changelog.
This project adheres to Semantic Versioning.


[2.1.0] — 2025-04-29

Added

  • Model/Config.php — central config helper with isEnabled() and isStoreExcluded() methods
  • Store-level Exclude This Store setting in admin (Stores → Configuration → Angeo → LLMs.txt)
  • Global Enabled toggle now respected in CLI command, cron, generator, and controller
  • Stale file cleanup — disabled or excluded stores have their generated files deleted on next generation run
  • Cron: fixes admin URL being generated instead of frontend URL when cron runs
  • Controller: immediate 404 if module is disabled, store is inactive, or store is excluded in config

Fixed

  • getLocaleCode() returning null — replaced with ScopeConfigInterface::getValue('general/locale/code') scoped to store
  • Locale format normalized to BCP 47 (en-US) instead of Magento's internal en_US format
  • getBaseUrl() returning admin URL in cron/CLI context — replaced with getBaseUrl(URL_TYPE_WEB)

[2.0.0] — 2025-04-01

Added

  • bin/magento angeo:llms:generate CLI command with --store, --no-jsonl, --no-llms options
  • AbstractGenerator — shared base class eliminating duplicate code between LlmsGenerator and JsonlGenerator
  • Single ProviderInterface — replaces two identical interfaces from v1
  • Per-store exception safety — one failing store no longer blocks others; errors are logged
  • Files moved to pub/media/angeo/llms/ and served via PHP controller (no direct web access to media dir)
  • Admin config: product limit, JSONL toggle, per-store settings

Fixed

  • JSONL providers: json_encode() was called after foreach — only the last item was encoded, all others silently dropped
  • Cron namespace triple-nested (LlmsTxt\LlmsTxt\LlmsTxt\Cron) — caused PHP fatal error on every cron run
  • $output initialized before store loop — store N's file contained merged content from stores 1…N
  • Jsonl\CategoryProvider missing root category filter — returned system categories (ID 1, 2) and categories from all store views

Changed

  • Output format now follows llmstxt.org spec: H1 title, ## sections, markdown links
  • Files relocated from pub/media/ to pub/media/angeo/llms/

[1.0.0] — 2025-01-01

Added

  • Initial release
  • Basic llms.txt and JSONL generation for Magento 2 stores
  • Cron-based daily generation
  • Admin UI generation button
Versions
Version Stability QA Status Released
3.0.5 stable Fail 2026-06-04 19:39:51
3.0.4 stable Not tested 2026-06-03 18:23:19
3.0.3 stable Not tested 2026-06-03 18:04:49
3.0.2 stable Not tested 2026-06-03 17:46:25
3.0.1 stable Not tested 2026-06-03 16:17:59
3.0.0 stable Not tested 2026-05-29 20:31:58
2.1.4 stable Not tested 2026-05-06 04:36:21
2.1.3 stable Not tested 2026-04-30 07:41:35
2.1.2 stable Not tested 2026-04-30 05:05:25
2.1.1 stable Not tested 2026-04-29 20:38:27
2.1.0 stable Not tested 2026-04-29 20:07:40
2.0.0 stable Not tested 2026-04-16 18:52:27
1.1.2 stable Not tested 2026-03-20 18:38:35
1.1.1 stable Not tested 2026-03-18 18:33:44

Requires 12

Package Constraint
ext-json *
ext-mbstring *
magento/framework >=102.0
magento/module-backend >=102.0
magento/module-catalog >=104.0
magento/module-catalog-inventory >=100.4
magento/module-catalog-url-rewrite >=100.4
magento/module-cms >=104.0
magento/module-config >=101.2
magento/module-store >=101.0
magento/module-url-rewrite >=102.0
php ~8.1.0||~8.2.0||~8.3.0||~8.4.0||~8.5.0

Requires-dev 3

Package Constraint
magento/magento-coding-standard ^32.0
phpstan/phpstan ^1.10
phpunit/phpunit ^10.5

No QA results yet

QA pipelines haven't run for this version. Status appears here once the vendor publishes a tagged release that gets ingested.

License
MIT
Homepage
https://angeo.dev/
Authors
Make it pay

Turn an existing module into recurring revenue.

If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.