Structured Output Built for LLMs
Priority URLs — admin-authored list of "read these first" URLs with auto-inferred labels
Your store, readable by every AI assistant. Generates and serves /llms.txt and /llms-full.txt — the emerging llmstxt.org standard — so ChatGPT, Claude, Perplexity, Gemini and other LLM-powered search tools can ingest your catalog, polici…
Key Features:
Additional Services
Built-in from day one. No add-ons, no upsell, no licence keys to renew.
Priority URLs — admin-authored list of "read these first" URLs with auto-inferred labels
Featured Products — merchant-flagged via a configurable yes/no EAV attribute (default is_featured)
/llms.txt — compact Markdown (5–10 KB)
Dedicated cache type panth_llms_txt in System → Cache Management
Full Magento\Store\Model\App\Emulation wrap — URLs, currencies, and locales render in the target store's context regardless of which host…
Content-Type: text/plain; charset=utf-8
Panth LLMs.txt is a generator for Magento 2 and Adobe Commerce that publishes /llms.txt and /llms-full.txt so ChatGPT, Claude, Perplexity, and Gemini can index your catalog.
The emerging llmstxt.org standard tells large language models which pages on your site to read first and how your catalog is organized. This module generates both files from live Magento data — category tree, curated products, CMS pages, store metadata, company details — in proper Markdown with hierarchical nesting, so AI crawlers extract the right entities instead of guessing from raw HTML and inflating context windows with chrome.
Output is curated, not dumped: featured products come from a configurable EAV flag (default is_featured), bestsellers pull from sales_bestsellers_aggregated_yearly (indexer-driven, O(1) queries), and recent arrivals sort by created_at. Each product line carries name, URL, price, SKU, category, and a short description resolved from short_description → meta_description → first sentence of full description, with an auto-generated fallback.
Multi-store and multi-language are first-class — each store view publishes its own /llms.txt with its own URLs, currency, and locale. Built-in caching keeps the compact file under 10 KB on most catalogs while /llms-full.txt carries the expanded version with priority URLs, collections, and the company block.
The SEO landscape has shifted. Shoppers now ask ChatGPT, Claude, Perplexity and Gemini questions like "What's the best running jacket under $80 at Luma?" or "Does store X ship to Germany?" — and those LLMs answer based on what they can read from your site. Without guidance, they crawl your full HTML (slow, noisy, often blocked by JS-heavy themes) or fall back to their pre-training snapshot (outdated).
llms.txt — an emerging standard proposed by Jeremy Howard and supported by an active community — solves this cleanly. You serve a small, well-structured Markdown file at /llms.txt that gives every LLM a curated map of your site's most important URLs + context. The spec is deliberately designed to be:
## Store Overview, ## Category Tree, ## Featured Products, etc.)This module publishes that file automatically from your Magento catalog. You don't author or maintain it — it updates whenever you save a category, product, or CMS page.
Dual-format /llms.txt and /llms-full.txt generator built on live Magento catalog and CMS data.
general/store_information (email, phone, VAT)The v1.2 rewrite is a major output upgrade driven by real LLM-readability feedback. Every change exists to reduce token waste and improve semantic clarity:
| Before (v1.1) | After (v1.2) |
|---|---|
| Flat "Top Categories" list with duplicate names ("Tops" appearing under Men AND Women, indistinguishable) | Hierarchical Category Tree — nested Markdown list: Men → Tops → Jackets, Women → Tops → Tees, etc. |
"Top Products" dump sorted by updated_at |
Three curated sections: Featured (via merchant attribute), Best Sellers (via Magento's bestseller aggregate), Recent Arrivals |
Product lines: - Name (SKU X) |
Product lines: - [Name](url) — $45.00 — SKU — Category plus auto-generated short description on the next line |
Bare URL: / Generated: lines under the H1 |
Proper ## Store Overview block with URL, Type, Store View, Currency, Language, Generated timestamp |
| No way to highlight promotional landing pages | New ## Collections section — admin picks category IDs representing landing pages (Sale, New Arrivals, Eco) |
| No way to tell LLMs "these are my most important URLs" | New ## Priority URLs section — admin-authored list with optional labels |
| Admin form: one flat group | Admin form: organized into General, Content Limits, Curated Products, llms-full.txt fieldsets mirroring output sections |
Everything from v1.1 still works — caching, per-store emulation, tag-based invalidation, the dedicated cache type, company info section, URL rewrites. v1.2 is additive + quality-focused.
no-route, cookie notices, etc.)general/store_informationis_featured)sales_bestsellers_aggregated_yearly aggregate (top ordered qty, indexer-driven, O(1) queries)created_at DESC[Name](url) — Price — SKU — Category with optional one-line short descriptionshort_description → meta_description → first sentence of full description → auto-generated "Name — Category" fallback/llms.txt — compact Markdown (5–10 KB)/llms-full.txt — expanded with inline Shipping, Returns, FAQ, About-Us policy bodies (10–50 KB)panth_llms_txt in System → Cache ManagementMagento\Store\Model\App\Emulation wrap — URLs, currencies, and locales render in the target store's context regardless of which hostname the request came in on/llms.txt files per website or store viewContent-Type: text/plain; charset=utf-8X-Robots-Tag: noindex — prevents Google indexing the raw file as a pageX-Content-Type-Options: nosniffContent-Disposition: inline; filename="llms.txt"Cache-Control: public, max-age=3600 — CDN-friendlyThe improved /llms.txt looks like this (actual output from a Magento sample-data catalog):
# Your Store Name
> Short one-line store summary goes here (configurable in admin).
## Store Overview
- URL: https://yourstore.com/
- Type: E-commerce catalog (Magento 2)
- Store View: Default Store View
- Currency: USD
- Language: en_US
- Generated: 2026-04-23 12:00:00 UTC
## Company
- Email: hello@yourstore.com
- Phone: +1-555-0000
- Address: 100 Main Street
- City: Anytown
- Zip: 00000
- Country: US
## Priority URLs
- [Sale](https://yourstore.com/sale.html)
- [New Arrivals](https://yourstore.com/what-is-new.html)
- [Size Guide](https://yourstore.com/size-guide)
## Collections
- [Eco Friendly](https://yourstore.com/collections/eco-friendly.html)
- [Performance Fabrics](https://yourstore.com/collections/performance-fabrics.html)
## Key Pages
- [About us](https://yourstore.com/about-us): Our story and mission
- [Customer Service](https://yourstore.com/customer-service)
- [Shipping Policy](https://yourstore.com/shipping-policy)
- [Returns & Refunds](https://yourstore.com/returns)
- [FAQ](https://yourstore.com/help-center-faq)
## Category Tree
- [Women's Fashion & Clothing](https://yourstore.com/women.html)
- [Tops](https://yourstore.com/women/tops-women.html)
- [Jackets](https://yourstore.com/women/tops-women/jackets-women.html)
- [Tees](https://yourstore.com/women/tops-women/tees-women.html)
- [Bras & Tanks](https://yourstore.com/women/tops-women/tanks-women.html)
- [Bottoms](https://yourstore.com/women/bottoms-women.html)
- [Pants](https://yourstore.com/women/bottoms-women/pants-women.html)
- [Shorts](https://yourstore.com/women/bottoms-women/shorts-women.html)
- [Men](https://yourstore.com/men.html)
- [Tops](https://yourstore.com/men/tops-men.html)
- [Jackets](https://yourstore.com/men/tops-men/jackets-men.html)
- [Tees](https://yourstore.com/men/tops-men/tees-men.html)
- [Bottoms](https://yourstore.com/men/bottoms-men.html)
- [Gear](https://yourstore.com/gear.html)
- [Bags](https://yourstore.com/gear/bags.html)
- [Fitness Equipment](https://yourstore.com/gear/fitness-equipment.html)
- [Watches](https://yourstore.com/gear/watches.html)
## Featured Products
- [Push It Messenger Bag](https://yourstore.com/push-it-messenger-bag.html) — $45.00 — SKU 24-WB04 — Bags
Slim, durable messenger bag perfect for daily commutes.
- [Summit Watch](https://yourstore.com/summit-watch.html) — $54.00 — SKU 24-MG03 — Watches
Rugged GPS watch built for outdoor adventures.
## Best Sellers
- [Ina Compression Short](https://yourstore.com/ina-compression-short.html) — $49.00 — SKU WSH11 — Shorts
Compression running short with exceptional support and comfort.
- [Erika Running Short](https://yourstore.com/erika-running-short.html) — $45.00 — SKU WSH12 — Shorts
Body-hugging running short for runners who prefer a fitted cut.
## Recent Arrivals
- [Sample Product](https://yourstore.com/sample.html) — $99.99 — SKU sample-001 — Bags
New arrival sample product description.
## Sitemaps
- https://yourstore.com/sitemap.xml
- https://yourstore.com/robots.txt
- https://yourstore.com/llms-full.txt
/llms-full.txt adds full policy bodies inline:
## About Us
[full About-Us page text, HTML stripped]
## Shipping Policy
[full Shipping-Policy page text]
## Return Policy
[full Returns-Policy page text]
## Frequently Asked Questions
[full FAQ page text]
This module is pull-based, not push-based. There is no cron job, no scheduled writer, no file on disk.
The flow:
https://yourstore.com/llms.txtpanth_llms_txt cache type)| Event | Result |
|---|---|
| Admin saves any category | Cache invalidated (via Magento\Catalog\Model\Category::CACHE_TAG) — next crawler hit regenerates |
| Admin saves any product | Cache invalidated (via Product::CACHE_TAG) |
| Admin saves any CMS page | Cache invalidated (via Page::CACHE_TAG) |
| Admin saves any store configuration | Cache invalidated (via config_scopes) |
| Admin clicks "Flush Magento Cache" | Cache flushed |
bin/magento cache:clean panth_llms_txt |
This module's cache only |
| Nothing changes for 60 minutes | TTL expiry triggers a passive regeneration |
Practical refresh time: within seconds of any admin edit — the next request after save regenerates. Worst case on an idle store: stale by at most 1 hour.
Why pull-based instead of a cron:
Composer install, enable, cache flush. /llms.txt starts serving immediately with sensible defaults.
Go to admin config and override per store view if needed:
If you already have an is_featured yes/no attribute on products, the module picks it up. Otherwise:
bin/magento attribute:create \
--code is_featured \
--label "Featured" \
--input boolean \
--source Magento\\Eav\\Model\\Entity\\Attribute\\Source\\Boolean
(Or create it from Stores → Attributes → Product.) Flip the flag on 6–10 hero SKUs, save, done.
That's it. Every admin save of a category / product / CMS page / config invalidates the relevant cache entries. The next crawler hit regenerates. No maintenance.
curl https://yourstore.com/llms.txt | head -40
curl -I https://yourstore.com/llms.txt | grep -iE 'content-type|cache-control|x-robots'
| Concern | Behavior |
|---|---|
| URLs inside the file | Always point at the target store's base URL (store emulation wraps the full render) |
| Title | Prefers general/store_information/name (brand), falls back to store view name |
| Summary | Per-store panth_llms_txt/llms_txt/summary, then design/head/default_description |
| Currency in product prices | Target store's currency (resolved inside emulation) |
| Locale in Store Overview | general/locale/code for the target store |
| Category / product / CMS URLs | Resolved through target store's URL rewrites |
| Cache | Per-store cache entry; invalidates independently when only one store's config changes |
| Priority URLs / Collections / Exclusions | All per-store configurable |
| Event | What gets flushed |
|---|---|
| Admin saves a category | All stores' cached /llms.txt + /llms-full.txt (via Category::CACHE_TAG) |
| Admin saves a product | Same |
| Admin saves a CMS page | Same (via Page::CACHE_TAG) |
| Admin saves store config | Same (via config_scopes) |
| Admin Flush Cache Storage | Full flush |
bin/magento cache:clean panth_llms_txt |
Just this module's entries |
| 1-hour TTL lapse | Passive regen next crawler hit |
You almost never need to flush manually — Magento's tag-clean system does it automatically.
/llms.txt doesn't replace your XML sitemap — it supplements it. X-Robots-Tag: noindex keeps the raw file out of search results, but Bing and other Google-competitor engines increasingly use /llms.txt as a crawl hint:
This is the main event:
/llms.txtCustomers ask "compare this product from store X to store Y" in ChatGPT or Claude. When the AI has /llms.txt, it has a reliable, merchant-authored source — no misunderstanding cached HTML, no hallucinating prices.
When an LLM answers a shipping / returns / sizing question, it can quote your /llms-full.txt policy text verbatim. That's copy you wrote, under your control.
/llms.txt (early llmstxt.org adopter case studies)| Issue | Cause | Resolution |
|---|---|---|
/llms.txt returns 404 |
Module not enabled at store scope | Enable at the specific store view you're testing |
/llms-full.txt returns 404 |
Expanded format flag off | Flip Enable llms-full.txt to Yes |
| Both return Magento 404 page | URL rewrite patch didn't run | bin/magento setup:upgrade |
| Stale content despite admin edits | Unlikely — cache auto-invalidates | Force: bin/magento cache:clean panth_llms_txt |
| Title shows "Default Store View" | general/store_information/name not set |
Fill in at Stores → Config → General → Store Information |
| No Featured section | is_featured attribute doesn't exist on the catalog |
Create it (see Usage §3), or change the attribute code in admin config |
| No Best Sellers section | No orders yet, or bestseller indexer hasn't run | bin/magento indexer:reindex bestsellers_aggregated — or just wait until you have orders |
| URLs point at wrong store | v1.1 cache entries from before emulation fix | One-time bin/magento cache:flush |
| Category tree too deep/shallow | max_category_depth setting |
Adjust 1–5 in admin config |
Crawlers and SEO auditors (Lighthouse, Ahrefs, many LLM bots) probe with HEAD before GET. On a stock Magento install, HEAD /llms.txt returns 404 while GET /llms.txt returns 200. The controllers themselves handle HEAD correctly (the HttpHeadActionInterface marker landed in 1.3.6) — the direct routes /panth_llms/llms/index, /panth_llms/llms/full, /panth_llms/llms/json all answer HEAD with 200. The 404 only occurs when the friendly path goes through Magento's url_rewrite layer, which doesn't forward HEAD to the matched controller.
Why a Magento-side or rewrite-based nginx fix can't solve this: nginx rewrite ... last updates $uri but not $request_uri. Magento's stock vhost passes fastcgi_param REQUEST_URI $request_uri to PHP unconditionally, so PHP still sees REQUEST_URI=/llms.txt and re-enters the same broken url_rewrite path inside Magento. The 1.3.7 sample tried this approach and didn't actually work.
Working fix (shipped in 1.3.8): answer HEAD directly from nginx with the same headers the GET response would set, bypassing PHP entirely. RFC 7231 §4.3.2 says HEAD must return the same status + headers as GET with an empty body, so this is fully compliant and any HEAD-precheck crawler is satisfied. GET requests fall through to PHP unchanged.
Include the bundled etc/nginx.conf.sample in your nginx server { ... } block before the catch-all location / { try_files ... } block:
include /path/to/vendor/mage2kishan/module-llms-txt/etc/nginx.conf.sample;
Reload nginx and verify:
nginx -t && nginx -s reload
for path in /llms.txt /llms-full.txt /llms.json; do
curl -s -o /dev/null -w "HEAD %{url_effective} -> %{http_code}\n" \
-I "https://your-store.example$path"
done
# expect: HTTP 200 on all three
| Requirement | Versions Supported |
|---|---|
| Magento Open Source | 2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8 |
| Adobe Commerce | 2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8 |
| Adobe Commerce Cloud | 2.4.4 — 2.4.8 |
| PHP | 8.1.x, 8.2.x, 8.3.x, 8.4.x |
| MySQL | 8.0+ |
| MariaDB | 10.4+ |
| Hyva Theme | 1.0+ (native support) |
| Luma Theme | Native support |
| Required Dependency | mage2kishan/module-core ^1.0 |
composer require mage2kishan/module-llms-txt
bin/magento module:enable Panth_Core Panth_LlmsTxt
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f
bin/magento cache:flush
app/code/Panth/LlmsTxt/Panth_Core is installed (required dependency)bin/magento module:enablebin/magento module:status Panth_LlmsTxt
# Expected: Module is enabled
curl https://yourstore.com/llms.txt
# Expected: Markdown body starting with "# Your Store Name"
Navigate to Admin → Stores → Configuration → Panth Extensions → LLMs.txt. Settings are grouped into four fieldsets:
| Setting | Default | Description |
|---|---|---|
| Enable llms.txt | Yes | Master toggle. When off, /llms.txt returns 404. |
| Site Summary | (auto) | One-line summary under the H1. Auto-falls-back to design/head/default_description, then boilerplate. |
| Priority URLs | (empty) | One URL per line. Format: Label | /path or just /path. Rendered under ## Priority URLs. |
| Collections (Category IDs) | (empty) | Comma-separated category IDs for curated landing pages. Rendered under ## Collections. |
| Setting | Default | Description |
|---|---|---|
| Max Category Tree Depth | 3 | How many levels of the taxonomy to render (1–5). |
| Max CMS Pages | 10 | Cap on ## Key Pages. |
| Exclude CMS Identifiers | (empty) | Comma-separated list appended to baked-in exclusions (no-route, privacy-policy-cookie-restriction-mode, enable-cookies). |
| Setting | Default | Description |
|---|---|---|
| Featured Attribute Code | is_featured |
Yes/No EAV attribute used to flag featured products. Section silently skipped if attribute doesn't exist. |
| Max Featured Products | 6 | Cap on ## Featured Products. Set to 0 to disable. |
| Show Best Sellers | Yes | Render ## Best Sellers from Magento's bestseller aggregate. |
| Max Best Sellers | 10 | Cap. |
| Show Recent Arrivals | Yes | Render ## Recent Arrivals sorted by created_at DESC. |
| Max Recent Arrivals | 10 | Cap. |
| Include Short Descriptions | Yes | Add a one-line description beneath each curated product (from short_description → meta_description → first sentence → auto-generated fallback). |
| Setting | Default | Description |
|---|---|---|
| Enable llms-full.txt | No | Master toggle for the expanded variant. |
| Shipping / Returns / About Us / FAQ CMS Identifier | (empty) | Page identifiers whose full bodies are embedded in /llms-full.txt. |
Panth LLMs.txt is licensed under a proprietary license — see LICENSE.txt. One license per Magento installation.
The v1.2 rewrite is section-based. Each content block lives in its own small class implementing SectionInterface::render(int $storeId): string[]:
Panth\LlmsTxt\
├── Controller\Llms\
│ ├── Index.php → serves /llms.txt (sets HTTP headers, calls Builder)
│ └── Full.php → serves /llms-full.txt (same, calls FullBuilder)
├── Model\Cache\Type.php → dedicated panth_llms_txt cache type
├── Model\LlmsTxt\
│ ├── Builder.php → composes /llms.txt from Sections
│ ├── FullBuilder.php → composes /llms-full.txt from Sections + policy bodies
│ └── Section\
│ ├── SectionInterface.php
│ ├── Overview.php → header (title, summary, metadata block) + Company
│ ├── PriorityUrls.php → admin-authored priority list
│ ├── Collections.php → admin-picked promotional category IDs
│ ├── KeyPages.php → CMS pages with exclude filter
│ ├── CategoryTree.php → hierarchical Markdown list walker
│ ├── Products.php → Featured / Best Sellers / Recent selectors
│ └── ShortDescription.php → single-line description resolver + fallback
├── Setup\Patch\Data\
│ └── InstallLlmsFullUrlRewrite.php → url_rewrite mapping for /llms.txt + /llms-full.txt
└── etc\
├── acl.xml
├── cache.xml → declares the panth_llms_txt cache type
├── config.xml → defaults
├── module.xml
├── adminhtml\system.xml → four-group config form
└── frontend\routes.xml → panth_llms frontName (unique across all Panth modules)
The Builder and FullBuilder stay small — they just orchestrate Section outputs in a deterministic order. Adding a new block (e.g. "Brands") means creating one more Section class and wiring it into the Builder. No changes to the existing sections required.
| Module Category | SEO & Indexing |
|---|---|
| Best For | Mid-Market |
An emerging community standard proposed at llmstxt.org with a growing list of adopters (Anthropic, Perplexity, Vercel, Stripe, Cloudflare docs all publish one). Not an IETF RFC yet, but stable enough that major AI platforms rely on it.
No — they're complementary. Keep your XML sitemap for Google / Bing search indexes. /llms.txt is for AI crawlers that want a curated summary rather than a full crawlable surface.
No — the controller sends X-Robots-Tag: noindex. Crawlers still read it for signals.
No. It's pull-based: file rendered on-demand at request time and cached. Cache auto-invalidates on admin saves. See How It's Generated.
Yes. The file is served at the backend layer, outside the theme pipeline. Identical behavior on Hyva and Luma.
Yes. mage2kishan/module-core is a required dependency — pulled in automatically by Composer.
No. Output is cached with a 1-hour TTL + tag invalidation. Cold regeneration: ~200 ms on a 2,000-SKU catalog. Warm: ~50 ms. LLM crawlers hit this infrequently (not per-request like FPC).
Create a yes/no EAV attribute called is_featured (or any code you pick — then enter that code in the admin config). Flip it on for the products you want in the Featured section. No database migration required.
Read from Magento's native sales_bestsellers_aggregated_yearly table (populated by the bestseller indexer). No extra queries against sales_order_item at render time.
Yes — the architecture is section-based. Each ## Heading block lives in its own class. Add a custom section by creating a SectionInterface implementation and either extending Builder in a child module or injecting it via di.xml.
No — any valid WhatsApp number works. However, a WhatsApp Business account is strongly recommended for commercial use (auto-replies, labels, catalog).
Yes. When enabled, Panth Footer takes over the footer.container block and renders its own configurable footer. You can disable it any time to restore the default footer.
Native file custom options are tied to the cart quote item and don't persist cleanly as a first-class order record. Panth Order Attachments creates dedicated panth_quote_attachment and panth_order_attachment tables, linked to the sales order item, ensuring files remain accessible for the full order lifetime — including reorders, invoices, and RMAs.
Yes, on the product detail page. When the module is enabled, the default gallery.phtml is replaced with the Panth gallery (one template for Hyva, another for Luma — chosen automatically).
No. It uses Magento's standard layout update mechanism to replace the block under the content container. The controller itself is untouched.
Yes. Both CMS block tabs and attribute tabs support unlimited entries. Add as many as your product requires.
An emerging community standard proposed at llmstxt.org with a growing list of adopters (Anthropic, Perplexity, Vercel, Stripe, Cloudflare docs all publish one). Not an IETF RFC yet, but stable enough that major AI platforms rely on it.
Any reduction in the final displayed price for the store view where the customer subscribed — catalog regular price, special price, catalog price rule discount, tier pricing, or group pricing. The module compares the current final price against the baseline captured at subscription time.
No. Color, font, and radius changes use CSS custom properties and take effect instantly. Only changes to Tailwind-class-driven tokens (custom spacing scales, new breakpoints) require a rebuild via the Rebuild Theme button.
No. The notification feed is cached, assets are lightweight, and the JS runs asynchronously after page load.
Talk to Kishan directly — written quote, scope and timeline within 24 hours. No sales call.
LLMs.txt Generator for Magento 2