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.
Angeo LLMs.txt — Magento 2
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 withisEnabled()andisStoreExcluded()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 runsController: immediate 404 if module is disabled, store is inactive, or store is excluded in config
Fixed
getLocaleCode()returningnull— replaced withScopeConfigInterface::getValue('general/locale/code')scoped to store- Locale format normalized to BCP 47 (
en-US) instead of Magento's internalen_USformat getBaseUrl()returning admin URL in cron/CLI context — replaced withgetBaseUrl(URL_TYPE_WEB)
[2.0.0] — 2025-04-01
Added
bin/magento angeo:llms:generateCLI command with--store,--no-jsonl,--no-llmsoptionsAbstractGenerator— shared base class eliminating duplicate code betweenLlmsGeneratorandJsonlGenerator- 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 afterforeach— only the last item was encoded, all others silently dropped Cronnamespace triple-nested (LlmsTxt\LlmsTxt\LlmsTxt\Cron) — caused PHP fatal error on every cron run$outputinitialized before store loop — store N's file contained merged content from stores 1…NJsonl\CategoryProvidermissing 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/topub/media/angeo/llms/
[1.0.0] — 2025-01-01
Added
- Initial release
- Basic
llms.txtand JSONL generation for Magento 2 stores - Cron-based daily generation
- Admin UI generation button
| 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.
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.