<p>That world is splitting in two.</p><p>When someone asks ChatGPT "what's the best project management tool for small teams," the answer doesn't come from a search results page. It comes from the model's training data, augmented by whatever it can retrieve and parse in real time. Your carefully crafted title tag and meta description? The model might use them. Or it might skip straight to your page content and try to extract a direct answer.</p><p>Google itself is changing. AI Overviews synthesize answers from multiple sources, and the user never clicks through. Perplexity cites pages inline. Bing Copilot summarizes. The traffic patterns that SEO was designed to capture are fragmenting, and the new gatekeepers read differently than the old ones.</p><p>This doesn't mean traditional SEO is dead. Google still sends the majority of web traffic, and the fundamentals — clear titles, descriptive meta tags, logical heading structure, fast load times — still matter. But there's a growing second channel where your content needs to be readable and citable by machines that think in paragraphs, not keywords.</p><h2>What LLMs actually need from your site</h2><p>Search engines follow links and parse HTML structure. LLMs do something different: they try to understand what your page <em>means</em> and extract statements they can cite or paraphrase. The things that help them are surprisingly simple:</p><p><strong>Clear entity definitions.</strong> If your about page says "Acme Corp is a developer tools company founded in 2019," that's a citable fact. If it says "We're passionate about empowering developers," that's marketing copy the model will skip.</p><p><strong>Self-contained paragraphs.</strong> A paragraph that makes sense without the surrounding context is easy to quote. A paragraph that starts with "As mentioned above" is not.</p><p><strong>Structured answers.</strong> FAQ sections, comparison tables, numbered steps — these map directly to how LLMs organize information. <a target="_blank" rel="noopener noreferrer nofollow" href="http://Schema.org">Schema.org</a> markup (<code>FAQPage</code>, <code>HowTo</code>) makes the structure explicit.</p><p><strong>llms.txt.</strong> A relatively new convention (documented at <a target="_blank" rel="noopener noreferrer nofollow" href="http://llmstxt.org">llmstxt.org</a>) that works like <code>robots.txt</code> but for language models. It tells LLMs which pages exist, what they contain, and how they're organized. It's a sitemap for AI.</p><h2>Why a coding agent is the right tool for this</h2><p>SEO auditing tools exist. Lighthouse runs in your browser. Screaming Frog crawls your site. But they all work on the <em>rendered output</em> — the HTML your server produces after all the framework magic runs.</p><p>A coding agent works on <em>source code</em>. It sees your Next.js layout components, your Vue single-file components, your Blade templates. It can tell you that <code>src/app/products/[id]/page.tsx</code> is missing structured data, and then <em>fix it right there</em> — adding the JSON-LD script tag in the exact right place for your framework.</p><p>That's the gap <code>@elyracode/seo</code> fills. It's not a crawler. It's a code-level SEO and LLM readability analyzer that pairs with an agent that can act on its findings.</p><h2>Getting started</h2><pre><code class="language-bash">elyra install @elyracode/seo
</code></pre><p>The extension activates automatically when your project contains template files — HTML, JSX, TSX, Vue, Svelte, Astro, Blade, or any of the common templating formats.</p><p>It adds four tools and a skill:</p><p>Tool Purpose <code>seo_audit</code> Full SEO + LLM readability analysis <code>seo_generate_llms_txt</code> Generate <code>llms.txt</code> from project structure <code>seo_generate_schema</code> Generate JSON-LD structured data for pages <code>seo_generate_meta</code> Audit and report missing meta tags</p><p>The <code>elyra-seo</code> skill gives the agent deep knowledge of SEO best practices, the llms.txt spec, <a target="_blank" rel="noopener noreferrer nofollow" href="http://schema.org">schema.org</a> types, and framework-specific patterns — so you can ask for help in plain language and get technically correct results.</p><h2>Example: auditing a project</h2><pre><code>&gt; Audit this site for SEO and LLM readability
</code></pre><p>The agent runs <code>seo_audit</code> and returns a prioritized report:</p><pre><code>Scanned 12 template files.

## Summary

23 issues found: 2 critical, 5 high, 9 medium, 7 low

### src/app/layout.tsx

- [CRITICAL] Missing &lt;title&gt; tag

### src/app/products/[id]/page.tsx

- [HIGH] Missing meta description
- [MEDIUM] No JSON-LD structured data found
- [MEDIUM] 3 image(s) without alt text
- [LOW] Missing OpenGraph tags: og:title, og:description, og:image

### src/app/about/page.tsx

- [HIGH] Missing H1 tag
- [MEDIUM] No JSON-LD structured data found
- [LOW] Missing Twitter Card meta tags

### (project root)

- [LOW] No llms.txt found. Generate one with seo_generate_llms_txt
  for better LLM discoverability.
</code></pre><p>The agent doesn't just report — it knows how to fix. Ask it to address the issues, and it edits the files directly: adding meta tags in the right format for your framework, inserting JSON-LD scripts, fixing alt attributes.</p><h2>Example: generating llms.txt</h2><pre><code>&gt; Generate an llms.txt for this site. The URL is https://acme.dev
</code></pre><p>The agent scans your route structure and produces:</p><pre><code># Acme Dev Tools

&gt; Developer tools for cloud infrastructure.

## Pages
- [Pricing](https://acme.dev/pricing)
- [Products](https://acme.dev/products)
- [About](https://acme.dev/about)
- [Blog](https://acme.dev/blog)
- [Docs](https://acme.dev/docs)
- [Contact](https://acme.dev/contact)

## Optional
- [Sitemap](https://acme.dev/sitemap.xml)
</code></pre><p>It suggests the output path based on your framework (<code>public/llms.txt</code> for Next.js, <code>static/llms.txt</code> for Nuxt) and asks you to review before writing. You add descriptions to each link, tweak the sections, and tell the agent to save it.</p><h2>Example: adding structured data</h2><pre><code>&gt; Add JSON-LD structured data to the product pages
</code></pre><p>The agent reads a product page, detects the content type, and generates appropriate <a target="_blank" rel="noopener noreferrer nofollow" href="http://schema.org">schema.org</a> markup:</p><pre><code>Suggested schema.org type for src/app/products/[id]/page.tsx: Product

JSON-LD template to add inside &lt;head&gt;:

&lt;script type="application/ld+json"&gt;
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "PRODUCT NAME",
  "description": "PRODUCT DESCRIPTION",
  "image": "IMAGE URL",
  "offers": {
    "@type": "Offer",
    "price": "PRICE",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  }
}
&lt;/script&gt;
</code></pre><p>It then fills in the placeholders from the actual page content and adds the script tag using <code>edit</code>. If it finds existing JSON-LD, it reports what's already there so you don't end up with duplicates.</p><p>The type detection is automatic — article pages get <code>Article</code>, FAQ sections get <code>FAQPage</code>, about pages get <code>Organization</code>, how-to guides get <code>HowTo</code> — but you can override it:</p><pre><code>&gt; Add FAQPage structured data to the support page
</code></pre><h2>Why an extension and not core</h2><p>SEO is domain-specific. If you're building a CLI tool, a backend API, or a mobile app, you don't need SEO tools taking up space in your tool registry or SEO knowledge inflating your system prompt.</p><p>As an extension:</p><ul><li><p><strong>Install only when you need it.</strong> Web projects get it. API projects don't.</p></li><li><p><strong>The skill loads contextually.</strong> The <code>elyra-seo</code> skill activates when the agent detects it's relevant — it doesn't consume tokens on every request.</p></li><li><p><strong>Updates ship independently.</strong> SEO best practices evolve. <a target="_blank" rel="noopener noreferrer nofollow" href="http://Schema.org">Schema.org</a> adds new types. The llms.txt spec gets refined. The extension can update without waiting for an Elyra core release.</p></li><li><p><strong>Community can extend it.</strong> Someone building a Shopify theme might want product-specific audits. Someone running a news site might want Article-specific checks. Extensions can build on extensions.</p></li></ul><h2>The skill makes the difference</h2><p>The four tools do the mechanical work — scanning, generating, auditing. But the <code>elyra-seo</code> skill is what makes the agent <em>understand</em> SEO. It contains:</p><ul><li><p>The complete llms.txt specification with examples</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow" href="http://Schema.org">Schema.org</a> type reference with required properties for each</p></li><li><p>Meta tag checklist (essential, OpenGraph, Twitter Cards)</p></li><li><p>LLM readability patterns (entity definitions, citable paragraphs, structured answers)</p></li><li><p>Framework-specific guidance (where to put meta tags in Next.js vs. Nuxt vs. Laravel)</p></li></ul><p>This means you can ask open-ended questions and get useful answers:</p><pre><code>&gt; What schema.org types should I use for a recipe blog?

&gt; How do I make this landing page more likely to appear in AI Overviews?

&gt; What's missing from our SEO setup compared to best practices?
</code></pre><p>The agent combines the skill knowledge with the audit tools to give specific, actionable answers grounded in your actual codebase.</p><h2>Get it</h2><pre><code class="language-bash">elyra update
elyra install @elyracode/seo
</code></pre><p>Then ask: <em>"audit this site for SEO."</em></p><hr><p><em>Elyra v0.7.8 — see the </em><a target="_blank" rel="noopener noreferrer nofollow" href="https://elyracode.com/changelog"><em>changelog</em></a><em> for the full release notes.</em></p>