Skip to content

Add AI SEO optimization: llms.txt, structured data, and sitemap#418

Merged
AnthonyRonning merged 1 commit intomasterfrom
ai-seo-optimization
Feb 11, 2026
Merged

Add AI SEO optimization: llms.txt, structured data, and sitemap#418
AnthonyRonning merged 1 commit intomasterfrom
ai-seo-optimization

Conversation

@marksftw
Copy link
Contributor

@marksftw marksftw commented Feb 9, 2026

Summary

  • Add llms.txt and llms-full.txt for AI search engine discoverability (follows the llmstxt.org spec), with product details, model lineup, pricing, developer API (including OpenClaw integration), security architecture, and company info
  • Add robots.txt allowing all crawlers with explicit allows for llms files and disallows for internal routes
  • Add sitemap.xml listing all public marketing routes and llms files
  • Enhance index.html meta tags with richer descriptions, Open Graph, and Twitter card tags
  • Add JSON-LD structured data (Organization and SoftwareApplication schemas) for search engine rich results

New Files

  • public/llms.txt — concise AI-readable overview of Maple AI
  • public/llms-full.txt — comprehensive single-file reference for LLMs
  • public/robots.txt — crawler directives
  • public/sitemap.xml — public route listing

Modified Files

  • index.html — enhanced title, meta description, OG/Twitter tags, JSON-LD structured data

Follow-up

  • Submit to llms.txt directories (llmstxt.site, directory.llmstxt.cloud) once deployed
  • Verify blog post URL slugs match live blog

Open with Devin

Summary by CodeRabbit

  • Documentation

    • Added two public product & security documents (concise and full) detailing features, architecture, models, pricing, FAQs, and integration guidance.
    • Added a sitemap listing key site pages.
  • Chores

    • Enhanced site metadata and SEO (descriptions, keywords, social/Open Graph and Twitter cards).
    • Added JSON-LD structured data for organization and software.
    • Streamlined icons/preloads and updated creator attribution.
  • Chores

    • Added robots.txt with crawler directives.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Warning

Rate limit exceeded

@marksftw has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 3 minutes and 57 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📝 Walkthrough

Walkthrough

Adds expanded SEO/meta tags and two JSON-LD blocks to frontend/index.html, and adds new public/static assets: frontend/public/llms.txt, frontend/public/llms-full.txt, frontend/public/robots.txt, and frontend/public/sitemap.xml.

Changes

Cohort / File(s) Summary
HTML metadata & structured data
frontend/index.html
Replaced minimal SEO with expanded meta tags (description, keywords, creator), enhanced Open Graph and Twitter metadata, adjusted favicon/icon tags, single-line preload for maple-logo.svg, and added two JSON-LD blocks (Organization, SoftwareApplication).
Public docs — short & full
frontend/public/llms.txt, frontend/public/llms-full.txt
Added two static documentation/marketing files describing product, privacy/security architecture (E2EE, TEEs, attestation), models, pricing, API notes, integrations (OpenClaw), examples, and company information.
SEO crawl & sitemap
frontend/public/robots.txt, frontend/public/sitemap.xml
Added robots.txt allowing site and docs while disallowing /api/ and /desktop-auth; added sitemap.xml listing primary site URLs including the new docs with lastmod, changefreq, and priority entries.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • AnthonyRonning

Poem

🐇 I tweak the meta, tuck data tight and neat,
I hop through sitemaps with a tiny, joyous beat,
Docs cozy in burrows, indexed by light,
Logos preloaded for a swift, smooth flight,
A nibble of SEO — secure, soft, and sweet.

🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title accurately summarizes the main changes: adding SEO optimization through llms.txt files, structured data (JSON-LD), and sitemap to the frontend.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch ai-seo-optimization

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Review failed

Failed to post review comments

📝 Walkthrough

Walkthrough

These changes expand the frontend's SEO and discoverability infrastructure by enriching metadata in index.html with structured data and Open Graph tags, and introducing public-facing documentation files and crawler configuration to support search engine optimization and product visibility.

Changes

Cohort / File(s) Summary
SEO Metadata & Structured Data
frontend/index.html
Expanded head metadata with SEO-focused title, description, and keywords. Added Open Graph and Twitter card metadata, JSON-LD structured data (Organization and SoftwareApplication), asset preloading for maple-logo.svg, and consolidated icon declarations.
Public Documentation
frontend/public/llms.txt, frontend/public/llms-full.txt
New marketing and product documentation files containing Maple AI branding, features, pricing, models, security architecture, developer tooling, FAQs, setup guidance, and code snippets.
Crawler Configuration
frontend/public/robots.txt, frontend/public/sitemap.xml
Added robots.txt to configure crawler access (allowing public files, blocking API/auth paths) and sitemap.xml defining nine site URLs with changefreq and priority metadata.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 A hop through metadata we go,
With structured data all aglow,
SEO maps and docs take flight,
Robots read our sitemap right—
Search engines hop to Maple's glow! ✨

🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'Add AI SEO optimization: llms.txt, structured data, and sitemap' accurately summarizes the main changes in the changeset, which includes adding llms.txt, llms-full.txt, structured data (JSON-LD) to index.html, robots.txt, and sitemap.xml.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch ai-seo-optimization

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 9, 2026

Greptile Overview

Greptile Summary

This PR adds SEO/AI-discovery assets to the frontend: llms.txt + llms-full.txt (AI-readable product/security docs), robots.txt and sitemap.xml for crawler guidance, and richer index.html metadata including Open Graph/Twitter tags and JSON-LD (Organization + SoftwareApplication) structured data.

The changes live entirely in the static frontend/public/* assets and the app shell frontend/index.html, improving how crawlers discover/understand Maple’s public marketing routes and machine-readable product info.

Confidence Score: 3/5

  • Reasonably safe to merge, but fix structured data and sitemap freshness first.
  • Static asset additions are low risk, but the JSON-LD currently uses an invalid schema.org property (billingDuration) and the sitemap hard-codes a single lastmod date for all URLs, which will quickly become inaccurate for crawlers.
  • frontend/index.html, frontend/public/sitemap.xml

Important Files Changed

Filename Overview
frontend/index.html Expanded SEO meta tags and added two JSON-LD blocks; JSON-LD includes invalid billingDuration on UnitPriceSpecification.
frontend/public/llms-full.txt Added comprehensive llms-full.txt marketing/technical overview; no functional code, but contains many external links that should be kept accurate.
frontend/public/llms.txt Added concise llms.txt per llmstxt spec with product links and model list; no runtime impact.
frontend/public/robots.txt Added robots.txt allowing crawlers and disallowing /api and /desktop-auth; rule behavior is per RFC 9309.
frontend/public/sitemap.xml Added static sitemap.xml listing public routes and llms files; lastmod values are hard-coded to a single date across all URLs.

Sequence Diagram

sequenceDiagram
  participant C as Crawler (Google/Bing)
  participant R as tryMaple.ai (static assets)

  C->>R: GET /robots.txt
  R-->>C: robots.txt (Allow/Disallow + Sitemap)
  C->>R: GET /sitemap.xml
  R-->>C: sitemap.xml (URL list + lastmod)
  loop Discover pages
    C->>R: GET / (and other <loc> URLs)
    R-->>C: index.html + app shell
    C->>R: GET /llms.txt
    R-->>C: llms.txt
    C->>R: GET /llms-full.txt
    R-->>C: llms-full.txt
  end
  Note over C,R: Crawlers parse JSON-LD from index.html and
  Note over C,R: use sitemap lastmod/changefreq as hints.
Loading

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@frontend/index.html`:
- Line 47: The android icon link uses a relative href which breaks on non-root
routes; update the <link rel="icon" ... href="android-chrome-192x192.png"> entry
to use an absolute path (prepend a leading slash) so it becomes
href="/android-chrome-192x192.png", matching the other icon links and preventing
404s on nested routes.

In `@frontend/public/llms-full.txt`:
- Around line 359-361: Fix the grammatical error in the FAQ answer for the
question "What AI models does the Free plan include?" by updating the sentence
"The Free plan includes Meta Llama 3.3 70B enough chats per day to be useful."
to include the missing word and proper phrasing (e.g., "The Free plan includes
Meta Llama 3.3 70B with enough chats per day to be useful." or reword to "The
Free plan includes Meta Llama 3.3 70B and provides enough chats per day to be
useful."); locate and edit the FAQ entry that begins with "What AI models does
the Free plan include?" and replace the faulty sentence accordingly.
- Around line 94-98: The availability line for the "Google Gemma 3 27B" model
uses a non-existent plan name "Starter"; update the model block that contains
the heading "Google Gemma 3 27B" and the line "Availability: Starter and above"
to use a valid plan name—change it to "Availability: Pro and above" so it
matches the defined plans (Free, Pro, Max, Team).
🧹 Nitpick comments (2)
frontend/public/sitemap.xml (1)

1-48: Consider adding <lastmod> elements.

The sitemap is valid without <lastmod>, but search engines prioritize URLs with recent modification dates. Adding <lastmod> (even a static date for now) can improve crawl efficiency.

frontend/index.html (1)

98-155: Move billingIncrement from Offer to UnitPriceSpecification; use correct properties for monthly recurring billing.

billingIncrement is a valid Schema.org property but belongs on UnitPriceSpecification, not Offer. To properly convey monthly recurring pricing, nest a UnitPriceSpecification with billingIncrement: 1 and unitCode: "MON".

Example for one offer
          {
            "@type": "Offer",
            "name": "Pro",
-           "price": "20",
-           "priceCurrency": "USD",
-           "billingIncrement": "P1M",
-           "description": "All models, document upload, voice, live web search, API access"
+           "priceSpecification": {
+             "@type": "UnitPriceSpecification",
+             "price": "20",
+             "priceCurrency": "USD",
+             "billingIncrement": 1,
+             "unitCode": "MON"
+           },
+           "description": "All models, document upload, voice, live web search, API access"
+           }

Note: billingDuration (as in the original suggestion) is specifically for contract duration. For simple monthly recurring without a fixed contract term, use the billingIncrement + unitCode pattern above.

@marksftw marksftw force-pushed the ai-seo-optimization branch from 96960a5 to 2480c5e Compare February 9, 2026 19:03
@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Feb 9, 2026

Deploying maple with  Cloudflare Pages  Cloudflare Pages

Latest commit: 9c93db4
Status: ✅  Deploy successful!
Preview URL: https://9b9dab59.maple-ca8.pages.dev
Branch Preview URL: https://ai-seo-optimization.maple-ca8.pages.dev

View logs

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 9, 2026

Additional Comments (1)

frontend/index.html
Invalid JSON-LD
The JSON-LD block here is not valid JSON because it contains trailing commas, which can cause search engines to ignore the structured data. Remove the trailing commas after the last properties/array items so the <script type="application/ld+json"> contents parse as strict JSON.

Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/index.html
Line: 1:3

Comment:
**Invalid JSON-LD**
The JSON-LD block here is not valid JSON because it contains trailing commas, which can cause search engines to ignore the structured data. Remove the trailing commas after the last properties/array items so the `<script type="application/ld+json">` contents parse as strict JSON.

How can I resolve this? If you propose a fix, please make it concise.

@marksftw marksftw force-pushed the ai-seo-optimization branch from 2480c5e to aaae27d Compare February 9, 2026 20:13
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

Copy link
Contributor

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 5 additional findings.

Open in Devin Review

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@frontend/index.html`:
- Around line 88-120: The schema.org Offer objects in the "offers" array
currently use an unsupported property billingIncrement; update each paid Offer
(the objects with "@type": "Offer" named "Pro", "Max", and "Team") to replace
billingIncrement with a nested priceSpecification using "@type":
"UnitPriceSpecification" and include the appropriate billingDuration and price
details (e.g., move price, priceCurrency into priceSpecification or reference
them there) so search engines recognize recurring pricing; ensure the Free offer
remains a simple Offer without priceSpecification if non-recurring.

In `@frontend/public/llms.txt`:
- Line 79: The link text "[Kimi K2 in Maple
AI](https://blog.trymaple.ai/kimi-k2-in-maple-ai/)" is broken and the repo also
lists "Kimi K2.5" elsewhere; either replace the broken URL with the correct
working blog post URL for Kimi K2.5 or remove the markdown link and keep plain
text, and make the naming consistent by changing the link text to "Kimi K2.5 in
Maple AI" (or match the available models entry "Kimi K2.5") so the entry and the
referenced resource agree.
🧹 Nitpick comments (2)
frontend/public/sitemap.xml (1)

1-48: Consider adding <lastmod> elements to improve crawl efficiency.

While not required by the sitemap spec, <lastmod> dates help search engines prioritize which URLs to re-crawl. Without them, crawlers must fetch every URL to check for changes.

frontend/public/llms-full.txt (1)

186-194: Docker example exposes API key via environment variable in the command line.

While this is a documentation example, showing MAPLE_API_KEY=YOUR_MAPLE_API_KEY as a -e flag encourages passing secrets on the command line (visible in ps output and shell history). Consider noting the use of --env-file or Docker secrets as a best practice.

Proposed addition
 docker run -p 8080:8080 \
   -e MAPLE_BACKEND_URL=https://enclave.trymaple.ai \
   -e MAPLE_API_KEY=YOUR_MAPLE_API_KEY \
   ghcr.io/opensecretcloud/maple-proxy:latest
+
+# For production, use an env file instead of inline secrets:
+# docker run -p 8080:8080 --env-file .env ghcr.io/opensecretcloud/maple-proxy:latest

@marksftw marksftw force-pushed the ai-seo-optimization branch from aaae27d to 2918490 Compare February 9, 2026 20:37
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

@marksftw marksftw force-pushed the ai-seo-optimization branch from 2918490 to a8162c1 Compare February 10, 2026 15:27
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@frontend/public/llms-full.txt`:
- Around line 196-209: The Python streaming example prints
chunk.choices[0].delta.content without checking for None, causing "None" to be
printed for chunks that lack content; update the loop that iterates over
response/chunk to safely access delta content (e.g., check
chunk.choices[0].delta.get("content") or test for None) and only print when the
content is not None, preserving the existing variables (response, chunk,
choices, delta, content) and streaming behavior.

In `@frontend/public/llms.txt`:
- Around line 75-84: The "## Blog" list in frontend/public/llms.txt contains
five broken blog URLs; locate the entries for the slugs one-year-of-private-ai,
maple-2-now-with-live-data, document-and-image-upload-in-maple-ai, maple-proxy,
and get-started-with-a-team-in-maple and either correct each slug to the
canonical URL found on the blog (replace the broken path component after
https://blog.trymaple.ai/ with the verified slug) or remove the list item if the
post does not exist; ensure the remaining entries keep the same markdown list
format and test each updated link to confirm it returns 200 before committing.
🧹 Nitpick comments (4)
frontend/public/llms-full.txt (2)

94-98: "Pro and above" is vague — consider listing explicit plan names for consistency.

Every other model block lists explicit plan names (e.g., "Pro, Max, Team"). Gemma 3 27B uses "Pro and above", which is understandable but breaks the pattern. Consider aligning for clarity.

Proposed fix
-  - Availability: Pro and above
+  - Availability: Pro, Max, Team

333-337: Nit: "Open Source" → "Open-Source" when used as a compound adjective heading.

This is a minor stylistic point — "Open-Source" with a hyphen is more conventional when it modifies a noun or serves as a label. Entirely optional.

frontend/public/sitemap.xml (2)

5-61: Hardcoded lastmod dates will go stale — consider automating or adding a reminder.

All 10 entries share the same 2026-02-10 lastmod value. These will drift from reality as the site evolves. A build-time script or a comment/TODO reminding maintainers to update on content changes would help prevent stale dates from hurting crawl efficiency.


39-50: Consider excluding /login and /signup from the sitemap.

These pages typically have little unique indexable content and are often noindexed. Including them can dilute crawl budget. If they're thin pages (just a form), removing them is a common SEO practice. This is a minor optimization — not harmful as-is.

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

@marksftw marksftw force-pushed the ai-seo-optimization branch from a8162c1 to 7bfed0f Compare February 10, 2026 15:42
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@frontend/public/llms.txt`:
- Around line 50-51: The "Maple Proxy" link target is broken (404); update the
URL for the "Maple Proxy" entry so it points to a valid landing page (for
example replace https://blog.trymaple.ai/maple-proxy/ with the full blog post
URL
https://blog.trymaple.ai/introducing-maple-proxy-the-maple-ai-api-that-brings-encrypted-llms-to-your-openai-apps/),
or confirm the correct canonical Maple landing page with the Maple team and use
that URL for the "Maple Proxy" link text.
🧹 Nitpick comments (2)
frontend/public/sitemap.xml (1)

1-63: Static sitemap looks correct.

XML is well-formed, URLs align with the routes described in other PR files, and priorities are reasonable.

One minor note: all lastmod values are hardcoded to 2026-02-10. These will go stale as pages are updated. Consider automating lastmod generation as part of your build process if the sitemap grows or pages change frequently.

frontend/index.html (1)

51-77: Organization JSON-LD is well-formed.

Minor note: the sameAs array includes a Discord invite link (discord.gg/ch2gjZAMGy). Schema.org sameAs is intended for URLs that unambiguously identify the entity (e.g., social profile pages). Discord invite links are ephemeral and don't serve as a canonical profile. Consider replacing it with a permanent Discord server URL if one exists, or removing it from sameAs.

Add llms.txt and llms-full.txt for AI search engine discoverability,
robots.txt, sitemap.xml, and enhance index.html with richer meta tags,
Open Graph/Twitter cards, and JSON-LD structured data (Organization
and SoftwareApplication schemas).
@marksftw marksftw force-pushed the ai-seo-optimization branch from 7bfed0f to 9c93db4 Compare February 10, 2026 15:51
@marksftw marksftw removed the request for review from AnthonyRonning February 10, 2026 15:51
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

@marksftw
Copy link
Contributor Author

Resolved all comments. I also ran it through Devin again and no bugs found.

@AnthonyRonning AnthonyRonning merged commit a3508a5 into master Feb 11, 2026
26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants