Add AI SEO optimization: llms.txt, structured data, and sitemap#418
Add AI SEO optimization: llms.txt, structured data, and sitemap#418AnthonyRonning merged 1 commit intomasterfrom
Conversation
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the 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. 📝 WalkthroughWalkthroughAdds expanded SEO/meta tags and two JSON-LD blocks to Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches🧪 Generate unit tests (beta)
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. Comment |
|
Caution Review failedFailed to post review comments 📝 WalkthroughWalkthroughThese 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
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches🧪 Generate unit tests (beta)
Warning Review ran into problems🔥 ProblemsGit: Failed to clone repository. Please run the 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. Comment |
Greptile OverviewGreptile SummaryThis PR adds SEO/AI-discovery assets to the frontend: The changes live entirely in the static Confidence Score: 3/5
Important Files Changed
Sequence DiagramsequenceDiagram
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.
|
There was a problem hiding this comment.
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: MovebillingIncrementfromOffertoUnitPriceSpecification; use correct properties for monthly recurring billing.
billingIncrementis a valid Schema.org property but belongs onUnitPriceSpecification, notOffer. To properly convey monthly recurring pricing, nest aUnitPriceSpecificationwithbillingIncrement: 1andunitCode: "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 thebillingIncrement + unitCodepattern above.
96960a5 to
2480c5e
Compare
Deploying maple with
|
| 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 |
Additional Comments (1)
Prompt To Fix With AIThis 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. |
2480c5e to
aaae27d
Compare
There was a problem hiding this comment.
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_KEYas a-eflag encourages passing secrets on the command line (visible inpsoutput and shell history). Consider noting the use of--env-fileor 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
aaae27d to
2918490
Compare
2918490 to
a8162c1
Compare
There was a problem hiding this comment.
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: Hardcodedlastmoddates will go stale — consider automating or adding a reminder.All 10 entries share the same
2026-02-10lastmod 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/loginand/signupfrom 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.
a8162c1 to
7bfed0f
Compare
There was a problem hiding this comment.
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
lastmodvalues are hardcoded to2026-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
sameAsarray includes a Discord invite link (discord.gg/ch2gjZAMGy). Schema.orgsameAsis 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 fromsameAs.
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).
7bfed0f to
9c93db4
Compare
|
Resolved all comments. I also ran it through Devin again and no bugs found. |
Summary
llms.txtandllms-full.txtfor AI search engine discoverability (follows the llmstxt.org spec), with product details, model lineup, pricing, developer API (including OpenClaw integration), security architecture, and company inforobots.txtallowing all crawlers with explicit allows for llms files and disallows for internal routessitemap.xmllisting all public marketing routes and llms filesindex.htmlmeta tags with richer descriptions, Open Graph, and Twitter card tagsNew Files
public/llms.txt— concise AI-readable overview of Maple AIpublic/llms-full.txt— comprehensive single-file reference for LLMspublic/robots.txt— crawler directivespublic/sitemap.xml— public route listingModified Files
index.html— enhanced title, meta description, OG/Twitter tags, JSON-LD structured dataFollow-up
Summary by CodeRabbit
Documentation
Chores
Chores