Skip to content

docs: comprehensive SEO and AEO improvements#79

Merged
hyochan merged 6 commits intomainfrom
docs/seo-aeo-improvements
Feb 11, 2026
Merged

docs: comprehensive SEO and AEO improvements#79
hyochan merged 6 commits intomainfrom
docs/seo-aeo-improvements

Conversation

@hyochan
Copy link
Member

@hyochan hyochan commented Feb 11, 2026

Summary

  • Enhance SEO across all documentation pages with improved meta tags, keywords, and descriptions
  • Implement AEO (Answer Engine Optimization) with Schema.org JSON-LD structured data
  • Add llms.txt standard support for AI crawlers (GPTBot, Claude-Web, PerplexityBot)
  • Redesign introduction page with marketing-focused hero, stats, and benefits sections
  • Update stats to accurate values (4K+ Combined Stars, 5+ Framework Libraries)

Changes

  • SEO.tsx: Added Schema.org JSON-LD structured data for SoftwareApplication
  • index.html: Enhanced meta tags, added llms.txt links, expanded Schema.org
  • robots.txt: Added AI crawler guidance for llms.txt files
  • sitemap.xml: Updated lastmod dates to current date
  • introduction.tsx: Complete rewrite with hero, stats, benefits, problem/solution sections
  • home.tsx: Updated subtitle and added matching stats badges
  • 404.tsx, tutorials.tsx, sponsors.tsx, languages.tsx: Added/improved SEO components

Test plan

  • Verify all pages render correctly
  • Check meta tags with browser dev tools
  • Validate Schema.org with Google's Rich Results Test
  • Test sitemap accessibility at /sitemap.xml
  • Verify llms.txt files are accessible

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Quick Stats and Key Benefits cards on Home
    • Full redesign of the Introduction page with new sections, diagrams, examples, and navigation
    • SEO metadata added to the 404 page
  • Documentation

    • Expanded SEO metadata and keywords across many docs pages
    • Added JSON-LD app schema and default metadata image; added LLM context links
    • AI-focused crawling rules and llms.txt/llms-full.txt allows; sitemap lastmod dates updated
  • Style

    • Updated code block typography and extensive new styles for the Introduction and Home layouts

SEO/AEO Improvements:
- Add Schema.org JSON-LD structured data to SEO component
- Add og:type, og:image, og:site_name, twitter:card meta tags
- Add AI crawler guidance to robots.txt (GPTBot, Claude-Web, etc.)
- Add llms.txt link references to index.html
- Update sitemap.xml lastmod dates to 2026-02-11
- Expand keywords in index.html

Introduction Page Enhancements:
- Add compelling hero section with headline "Stop Rewriting IAP Code"
- Add stats badges (4K+ Combined Stars, 5+ Framework Libraries)
- Add CTA buttons (Get Started, View on GitHub)
- Add key benefits cards (1x Learn Once, 0 Runtime Errors, 100% Platform Features)
- Add visual problem section with color-coded pain point cards
- Add solution section with feature grid and ecosystem diagram
- Add supported platforms grid (iOS/macOS/Vision Pro, Android, Meta Quest)
- Add implementations list with all 5 framework libraries
- Remove duplicate "Why Teams Choose" section

Home Page:
- Update hero subtitle with clearer value proposition
- Add matching stats badges

Other Pages:
- Add SEO component to 404 page
- Improve keywords for tutorials, sponsors, languages pages
- Add godot-iap to languages description

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@hyochan hyochan added the 📖 documentation Improvements or additions to documentation label Feb 11, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 11, 2026

📝 Walkthrough

Walkthrough

Updated docs site SEO metadata and JSON‑LD, added LLM context links and AI-crawler rules, extended the SEO React component with image and SoftwareApplication schema support, refreshed SEO across many pages, and substantially redesigned the Home and Introduction pages with new content and styles.

Changes

Cohort / File(s) Summary
Site-level SEO & Crawling
packages/docs/index.html, packages/docs/public/robots.txt, packages/docs/public/sitemap.xml
Expanded meta keywords, added alternate links for llms.txt/llms-full.txt, enriched JSON‑LD (inLanguage, author.url/logo/sameAs, about/offers), added AI assistant user-agent rules and allows for LLM context files, and updated sitemap lastmod timestamps.
SEO Component
packages/docs/src/components/SEO.tsx
Extended SEOProps with `type?: 'website'
Page-level SEO metadata
packages/docs/src/pages/docs/android-setup.tsx, .../apis/index.tsx, .../ecosystem.tsx, .../errors.tsx, .../events.tsx, .../horizon-setup.tsx, .../types/index.tsx, .../tutorials.tsx, .../languages.tsx, .../sponsors.tsx
Updated SEO props (descriptions and expanded keyword sets) across many docs pages to include new platform and framework terms (StoreKit 2, Play Billing, Vision Pro, Horizon OS, Godot, etc.); no rendering/control-flow changes.
Content & UI — Home / Introduction / 404
packages/docs/src/pages/home.tsx, packages/docs/src/pages/introduction.tsx, packages/docs/src/pages/404.tsx
Home: replaced minimal SEO with richer metadata, added Quick Stats and Key Benefits sections, adjusted hero/subtitle. Introduction: major rewrite with multi-section layout (Problem, Solution, Architecture, API Design, examples, supported platforms, getting started). 404: added SEO metadata.
Styles for new content
packages/docs/src/styles/home.css, packages/docs/src/styles/pages.css, packages/docs/src/styles/code.css
Added extensive CSS for Introduction and Home UI (cards, grids, tables, code blocks, responsive rules); adjusted code block font-size and line-height.
Minor site files
packages/docs/public/sitemap.xml
Updated lastmod dates to 2026-02-11 across sitemap entries; no structural changes.

Sequence Diagram(s)

sequenceDiagram
    participant Browser as Browser
    participant Docs as Docs Site
    participant Crawler as AI/Search Crawler
    participant LLMS as LLMS Service

    Browser->>Docs: GET /
    Docs-->>Browser: HTML with meta, Open Graph, JSON‑LD, alternate links (/llms.txt, /llms-full.txt)
    Crawler->>Docs: GET /robots.txt
    Docs-->>Crawler: robots.txt (disallow/allow rules + allow /llms*.txt)
    Crawler->>Docs: GET /llms-full.txt
    Docs-->>Crawler: llms-full.txt (LLM context file)
    Crawler->>Docs: GET / (fetch page for indexing)
    Docs-->>Crawler: page + JSON‑LD + OG + linked LLM context for agent indexing
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

🕶️ meta

Poem

🐇 I hopped through tags and added a clue,

Open Graph sparkles and JSON‑LD too.
Robots greet helpers, llms hum along,
Home and Intro sing a longer song.
A rabbit cheers — docs tidy and new. 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ 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 'docs: comprehensive SEO and AEO improvements' directly and clearly summarizes the main changes: enhancing SEO metadata, implementing AEO with Schema.org, and adding AI crawler support across documentation pages.

✏️ 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 docs/seo-aeo-improvements

No actionable comments were generated in the recent review. 🎉


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.

@gemini-code-assist
Copy link

Summary of Changes

Hello @hyochan, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly upgrades the OpenIAP documentation website's discoverability and user engagement. It focuses on improving how search engines and AI crawlers understand and present the content, while also revamping the introductory experience for human visitors. The changes aim to provide a more structured, informative, and accessible overview of the OpenIAP project and its benefits.

Highlights

  • Comprehensive SEO and AEO Enhancements: Enhanced Search Engine Optimization (SEO) and Answer Engine Optimization (AEO) across all documentation pages by improving meta tags, keywords, and implementing Schema.org JSON-LD structured data for richer search results.
  • AI Crawler Support: Introduced support for the llms.txt standard, providing specific guidance for AI crawlers such as GPTBot, Claude-Web, and PerplexityBot to improve content understanding by large language models.
  • Introduction Page Redesign: Completely redesigned the introduction page to feature a marketing-focused hero section, updated statistics, key benefits, and a clear problem/solution narrative to better engage visitors.
  • Updated Documentation Metadata: Refined SEO descriptions and keywords for numerous documentation pages, including setup guides, API references, and type definitions, to improve their visibility and relevance in search engine results.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • packages/docs/index.html
    • Expanded meta keywords to cover new platforms and in-app purchase types.
    • Added llms.txt and llms-full.txt links for AI/LLM context.
    • Enriched Schema.org JSON-LD with language, author details, and SoftwareApplication properties.
  • packages/docs/public/robots.txt
    • Added specific User-agent directives for various AI/LLM crawlers (GPTBot, Claude-Web, PerplexityBot, Google-Extended).
    • Allowed access to /llms.txt and /llms-full.txt for AI context.
    • Included comments explaining the purpose of the LLM context files.
  • packages/docs/public/sitemap.xml
    • Updated lastmod dates for all URLs to 2026-02-11.
  • packages/docs/src/components/SEO.tsx
    • Added type and image props to the SEOProps interface.
    • Defined DEFAULT_IMAGE for Open Graph and Twitter cards.
    • Implemented dynamic Schema.org JSON-LD for SoftwareApplication.
    • Expanded Open Graph meta tags to include og:type, og:image, and og:site_name.
    • Enhanced Twitter meta tags with twitter:card (summary_large_image) and twitter:image.
  • packages/docs/src/pages/404.tsx
    • Imported the SEO component.
    • Wrapped the page content with the SEO component, providing a specific title, description, and path for the 404 page.
  • packages/docs/src/pages/docs/android-setup.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/docs/apis/index.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/docs/ecosystem.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/docs/errors.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/docs/events.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/docs/horizon-setup.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/docs/types/index.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/home.tsx
    • Updated the SEO component with a more specific title, description, and keywords.
    • Modified the hero-subtitle text for a more direct message.
    • Added a "Quick Stats" section with "Combined Stars" and "Framework Libraries" badges, including a link to the react-native-iap GitHub.
  • packages/docs/src/pages/introduction.tsx
    • Imported Link from react-router-dom.
    • Completely rewrote the page content, replacing previous sections with a new marketing-focused hero section, key benefits cards, native modules section, a detailed "IAP Fragmentation Problem" section with visual cards, an "OpenIAP Solution" section with an ecosystem diagram and feature grid, "Supported Platforms" section, "Implementations" section with links to various libraries, and a "Get Started" section with CTA links.
    • Updated the SEO component with a new title, description, and keywords reflecting the redesigned content.
  • packages/docs/src/pages/languages.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/sponsors.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
  • packages/docs/src/pages/tutorials.tsx
    • Updated the description and keywords props for the SEO component to be more detailed and comprehensive.
Activity
  • No specific activity (comments, reviews, or progress updates) has been provided for this pull request.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@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: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/docs/index.html (1)

44-79: ⚠️ Potential issue | 🟠 Major

Duplicate SoftwareApplication JSON-LD: this block and SEO.tsx both emit it.

index.html embeds a SoftwareApplication schema inside the WebSite JSON-LD (line 68-77), and SEO.tsx injects a separate top-level SoftwareApplication JSON-LD on every page via react-helmet-async (SEO.tsx lines 32-50, 76). This results in two competing SoftwareApplication structured data blocks on every page.

Consider removing the SoftwareApplication from one location — either here (keep the WebSite-only schema in index.html) or from SEO.tsx — to avoid duplicate/conflicting structured data that could confuse Google's rich results parser.

🤖 Fix all issues with AI agents
In `@packages/docs/public/robots.txt`:
- Around line 8-15: The User-agent blocks for GPTBot, ChatGPT-User, Claude-Web,
Anthropic-AI, PerplexityBot and Google-Extended only include "Allow: /llms.txt"
which causes those crawlers to treat all other paths as disallowed; update each
of those User-agent sections (the lines containing "User-agent: GPTBot",
"User-agent: ChatGPT-User", "User-agent: Claude-Web", "User-agent:
Anthropic-AI", "User-agent: PerplexityBot", "User-agent: Google-Extended") to
include "Allow: /" so they can crawl the full site for SEO, or if the true
intent is to restrict them, add "Disallow: /" explicitly and remove the
misleading comment block that implies they should have access.

In `@packages/docs/src/components/SEO.tsx`:
- Around line 32-50: The SoftwareApplication JSON-LD (schemaOrg) is being
injected by the SEO component on every page; change SEO to accept a new boolean
prop (e.g., includeAppSchema, default false) and render the schemaOrg <script>
only when includeAppSchema is true (leave all other meta/head behavior intact);
update the place(s) that should expose the app schema (e.g., the
homepage/introduction page) to pass includeAppSchema={true} when rendering the
SEO component so only those pages emit the SoftwareApplication JSON-LD.

In `@packages/docs/src/pages/introduction.tsx`:
- Around line 111-150: The inline style uses transition ('all 0.2s ease') on the
Link component and the anchor ("Get Started" and "View on GitHub") but inline
styles cannot define :hover, so move the transition and hover styles into a CSS
class (or your CSS-in-JS styles) and apply that class to the Link and <a>
elements (also update the implementation cards and native module cards
referenced) so the transition actually triggers on :hover; alternatively remove
the transition entries from the inline style objects if you prefer not to add
hover behavior.
- Around line 390-446: The three callout blocks using hardcoded hex colors (the
divs containing the headings "Wasted Time", "Production Bugs", and "Duplicated
Effort") should be updated to use CSS custom properties instead of raw hex
values; replace occurrences of '#e74c3c', '#e67e22', and '#9b59b6' in both
borderLeft and strong color with variables like var(--color-danger),
var(--color-warning), and var(--color-accent), and add those token definitions
to the theme tokens alongside existing variables so they respond to dark/light
theme switching.
- Around line 60-83: Change the misleading single-repo link and hardcoded label:
update the anchor (the <a> with href
"https://github.com/dooboolab-community/react-native-iap") to point to a more
representative destination (e.g., the org page or a collective topic URL) or
else change the label text "Combined Stars" to explicitly reference the repo
(e.g., "★ on react-native-iap"); also add an inline code comment next to the
"4K+" display div reminding maintainers that the hardcoded count requires
periodic updates or replace it later with a dynamic value.
🧹 Nitpick comments (6)
packages/docs/public/sitemap.xml (1)

5-5: Hardcoded lastmod dates will become stale.

All lastmod values are manually set to 2026-02-11. These will drift out of date as content changes. Consider generating the sitemap at build time (e.g., via a script or plugin) so that lastmod reflects actual file modification timestamps.

packages/docs/src/components/SEO.tsx (1)

18-25: Missing JSDoc comment for exported SEO function.

As per coding guidelines, "Add JSDoc comments for public functions and exported APIs".

Proposed fix
+/** Renders page-level SEO metadata including Open Graph, Twitter cards, and optional Schema.org JSON-LD. */
 function SEO({
   title,
   description,
   path = '',
   keywords,
   type = 'website',
   image,
 }: SEOProps) {
packages/docs/src/pages/home.tsx (1)

60-83: Hardcoded stats will become stale; "Combined Stars" link targets a single repo.

Two concerns:

  1. "4K+" and "5+" are hardcoded and will silently become inaccurate over time.
  2. The "Combined Stars" label implies an aggregate across repos, but the link points only to react-native-iap. A user clicking through may see a different star count and feel misled.

Consider either linking to the GitHub org/topic page that shows all repos, or adding a comment noting when these values should be updated.

packages/docs/src/pages/introduction.tsx (3)

4-4: Missing JSDoc on exported component.

The coding guidelines require JSDoc comments for public functions and exported APIs. A brief description of this page component would help.

📝 Suggested JSDoc
+/** Marketing-focused introduction page showcasing OpenIAP's value proposition, supported platforms, and implementations. */
 function Introduction() {

As per coding guidelines, "Add JSDoc comments for public functions and exported APIs".

Also applies to: 936-936


163-237: Extensive inline-style duplication — extract shared styles into CSS classes or constants.

The card pattern (padding, background, borderRadius, border) is copy-pasted ~15 times across benefit cards, feature cards, risk cards, implementation cards, and platform cards. The same grid container style appears 5+ times as well.

This makes future visual tweaks error-prone (change one card, miss the rest) and inflates the file to 930+ lines.

Consider either:

  1. CSS classes in the existing stylesheet (preferred for a docs site).
  2. At minimum, local style constants at the top of the component.
♻️ Example: extract style constants
 function Introduction() {
+  const cardStyle: React.CSSProperties = {
+    padding: '1.5rem',
+    background: 'var(--bg-secondary)',
+    borderRadius: '12px',
+    border: '1px solid var(--border-color)',
+  };
+
+  const gridStyle: React.CSSProperties = {
+    display: 'grid',
+    gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))',
+    gap: '1.25rem',
+  };
+
+  const cardTextStyle: React.CSSProperties = {
+    margin: 0,
+    fontSize: '0.9rem',
+    color: 'var(--text-secondary)',
+    lineHeight: '1.6',
+  };
+
   return (

Then replace each repeated object with the shared constant:

-            <div
-              style={{
-                padding: '1.5rem',
-                background: 'var(--bg-secondary)',
-                borderRadius: '12px',
-                border: '1px solid var(--border-color)',
-              }}
-            >
+            <div style={cardStyle}>

Also applies to: 511-629, 734-862


658-658: Add accessible labels to emoji icons.

Emoji like 🍎, 🤖, and 🎮 are read literally by screen readers (e.g., "red apple" instead of "Apple"). Wrap them with role="img" and aria-label for clarity.

♿ Example fix
-              <span style={{ fontSize: '1.5rem' }}>🍎</span>
+              <span style={{ fontSize: '1.5rem' }} role="img" aria-label="Apple">🍎</span>

Also applies to: 684-684, 708-708

- Rewrite introduction.tsx as "Why OpenIAP" with technical documentation style
  - Architecture diagram and code generation explanation
  - API design with naming conventions table
  - Type safety examples with code blocks
  - Purchase flow code example
  - Platform support and framework implementation tables
- Add marketing benefits section to home.tsx
  - 1x Learn Once, 0 Runtime Errors, 100% Platform Features cards

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a comprehensive set of SEO and AEO improvements across the documentation site. The changes include enhancing meta tags, adding structured data (Schema.org JSON-LD), and supporting AI crawlers via llms.txt. The introduction page has been completely redesigned for better user engagement.

Overall, these are excellent improvements for search visibility and content presentation. I have a few suggestions to improve maintainability and correctness:

  • The sitemap.xml is using future dates for lastmod, which should be corrected.
  • The new components in home.tsx and introduction.tsx make heavy use of inline styles. These should be extracted to CSS files to improve code maintainability.

Copy link
Contributor

@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 `@packages/docs/src/pages/home.tsx`:
- Around line 60-83: The "4K+ Combined Stars" anchor currently points to the
react-native-iap repo; update its href to a URL that actually represents the
combined OpenIAP ecosystem (e.g., the GitHub org or the OpenIAP aggregate repo)
and ensure the anchor text/label remains accurate; locate the <a
href="https://github.com/dooboolab-community/react-native-iap" ...> element in
home.tsx and replace the href with the org or aggregate repo URL (or change the
label to reflect a single-repo link) so the link destination matches the
"Combined Stars" claim.

In `@packages/docs/src/pages/introduction.tsx`:
- Around line 163-171: The <img> element rendering the ecosystem image (src
"/ecosystem.png") lacks explicit dimensions causing layout shift; update the
<img> tag in introduction.tsx to include either width and height attributes
matching the natural image size or apply a CSS aspect-ratio (and corresponding
maxWidth/border styles) so the browser can reserve space (e.g., add width and
height attributes on the img or add style: { aspectRatio: 'WIDTH/HEIGHT', width:
'100%', ... }) to eliminate CLS.
- Around line 231-298: Replace the outer anchor wrappers for the native module
cards with non-anchor containers so you don't nest anchors: change the outer <a>
elements that wrap the "openiap-apple" and "openiap-google" card blocks into
<div> elements (keep their inline style objects, classNames and any ARIA/role
attributes you need) and remove href/target/rel from those outer wrappers; leave
the inner <a> links to StoreKit and Play Billing intact so only the inner
anchors are real links and click behavior is predictable.
🧹 Nitpick comments (5)
packages/docs/src/pages/home.tsx (3)

215-316: Extract repeated inline styles into shared constants or CSS classes.

The three benefit cards repeat the same inline style objects verbatim (card wrapper, stat number, and description paragraph). This adds ~60 lines of duplication. Consider extracting them:

♻️ Example refactor
+const benefitCardStyle: React.CSSProperties = {
+  padding: '2rem',
+  background: 'var(--bg-secondary)',
+  borderRadius: '12px',
+  border: '1px solid var(--border-color)',
+  textAlign: 'center' as const,
+};
+
+const benefitStatStyle: React.CSSProperties = {
+  fontSize: '2.5rem',
+  fontWeight: '700',
+  color: 'var(--primary-color)',
+  marginBottom: '0.5rem',
+};
+
+const benefitDescStyle: React.CSSProperties = {
+  margin: 0,
+  fontSize: '0.9rem',
+  color: 'var(--text-secondary)',
+  lineHeight: '1.6',
+};

Then each card becomes:

<div style={benefitCardStyle}>
  <div style={benefitStatStyle}>1x</div>
  <h3 style={{ margin: '0 0 0.5rem', fontSize: '1.1rem' }}>Learn Once</h3>
  <p style={benefitDescStyle}>
    Master one API instead of learning different patterns for iOS,
    Android, and every framework
  </p>
</div>

Or better yet, extract a small BenefitCard component and map over a data array, similar to the LIBRARIES.map pattern already used on line 497.


579-588: Prefer CSS :hover over imperative style manipulation.

The onMouseEnter/onMouseLeave handlers imperatively set transform and boxShadow. A CSS class with a :hover pseudo-class would be simpler, more maintainable, and handle edge cases (e.g., rapid hover toggling) more reliably. This is consistent with how other interactive elements in this file already use CSS classes (e.g., btn btn-primary).


50-103: Consider making the Quick Stats data-driven too.

The two stat items share identical styling for the number and label. A small array + .map() would reduce duplication and make it easy to add/update stats later — consistent with the LIBRARIES.map pattern used on line 497.

packages/docs/src/pages/introduction.tsx (2)

4-4: Missing JSDoc on exported component.

As per coding guidelines: "Add JSDoc comments for public functions and exported APIs."

A brief JSDoc would satisfy the guideline:

/** Why OpenIAP — marketing-focused introduction page. */
function Introduction() {

310-365: Heavily duplicated inline style objects throughout the file.

The same style literals are repeated dozens of times — table cell padding (padding: '0.75rem 1rem') appears ~30 times, the code-block container style appears 3 times, and the card style appears 6+ times. Each render creates new object references too.

Extract shared styles into constants at the top of the file, or better yet, use CSS classes from your existing stylesheet:

const styles = {
  cell: { padding: '0.75rem 1rem' } as const,
  codeBlock: {
    background: 'var(--bg-secondary)',
    borderRadius: '8px',
    padding: '1rem',
    fontFamily: 'var(--font-mono)',
    fontSize: '0.875rem',
    overflowX: 'auto' as const,
    marginBottom: '1.5rem',
    border: '1px solid var(--border-color)',
  },
  card: {
    display: 'block' as const,
    padding: '1rem',
    background: 'var(--bg-secondary)',
    borderRadius: '8px',
    border: '1px solid var(--border-color)',
    textDecoration: 'none',
    color: 'var(--text-primary)',
  },
} as const;

hyochan and others added 3 commits February 11, 2026 17:15
- Increase font sizes in introduction page for better readability
- Remove WIP tag from XR-Compatible (Horizon OS, Vision Pro supported)
- Update code block font size to 0.9375rem

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- robots.txt: add Allow: / for AI crawlers to access full site
- SEO.tsx: make JSON-LD schema conditional (only home/introduction)
- home.tsx: update Combined Stars link to /languages page
- introduction.tsx: add width/height to ecosystem image for CLS
- introduction.tsx: fix nested anchor elements (invalid HTML)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move Quick Stats and Key Benefits styles from home.tsx to home.css
- Move all inline styles from introduction.tsx to pages.css
- Add new CSS classes: intro-lead, intro-text, intro-list, intro-table,
  native-module-grid, getting-started-grid, etc.
- Reduce inline styles for better maintainability

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Contributor

@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 `@packages/docs/src/styles/pages.css`:
- Around line 513-516: The box-shadow in the .getting-started-card:hover rule
uses legacy rgba() notation; update it to the modern color function form. Locate
the .getting-started-card:hover selector and replace rgba(0, 0, 0, 0.08) with
the modern syntax rgb(0 0 0 / 0.08) (so the box-shadow uses 0 4px 12px rgb(0 0 0
/ 0.08)).
🧹 Nitpick comments (5)
packages/docs/src/styles/code.css (1)

12-13: Hardcoded font-size replaces CSS variable.

The previous value var(--font-size-sm) allowed global theming control; 0.9375rem is now a magic number. If this was intentional for precise code-block sizing, consider defining a --font-size-code variable for maintainability.

packages/docs/src/components/SEO.tsx (2)

19-27: Missing JSDoc on exported SEO component.

The exported SEO function lacks a JSDoc comment documenting its purpose and props. This is a public API used across multiple pages.

Suggested JSDoc
+/** Renders SEO meta tags, Open Graph / Twitter cards, and optional JSON-LD structured data. */
 function SEO({
   title,
   description,

As per coding guidelines: "Add JSDoc comments for public functions and exported APIs".


33-52: schemaOrg object is always constructed, even when unused.

When includeAppSchema is false (the default), the schemaOrg object is still built on every render. Consider moving it inside the conditional or wrapping it with a lazy check to avoid unnecessary object allocation.

Suggested approach
-  // Schema.org structured data for SoftwareApplication
-  const schemaOrg = {
-    '@context': 'https://schema.org',
-    '@type': 'SoftwareApplication',
-    ...
-  };
   ...
       {/* Schema.org JSON-LD */}
-      {includeAppSchema && (
-        <script type="application/ld+json">{JSON.stringify(schemaOrg)}</script>
-      )}
+      {includeAppSchema && (
+        <script type="application/ld+json">
+          {JSON.stringify({
+            '@context': 'https://schema.org',
+            '@type': 'SoftwareApplication',
+            name: 'OpenIAP',
+            description: pageDescription,
+            url: canonicalUrl,
+            applicationCategory: 'DeveloperApplication',
+            operatingSystem: 'iOS, Android, visionOS, Horizon OS',
+            offers: {
+              '@type': 'Offer',
+              price: '0',
+              priceCurrency: 'USD',
+            },
+            author: {
+              '@type': 'Organization',
+              name: 'OpenIAP',
+              url: BASE_URL,
+            },
+          })}
+        </script>
+      )}
packages/docs/src/pages/home.tsx (2)

427-454: Inline hover handlers should be replaced with a CSS class.

The onMouseEnter/onMouseLeave handlers replicate a simple :hover effect that CSS handles natively. This is especially notable given the PR objective of extracting inline styles into CSS classes.

Suggested approach

Define a CSS class (e.g., .btn-sponsor) in home.css:

.btn-sponsor {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.75rem 2rem;
  background: linear-gradient(135deg, var(--primary-color), var(--accent-color));
  color: white;
  border-radius: 2rem;
  text-decoration: none;
  font-weight: 600;
  font-size: 0.95rem;
  box-shadow: 0 4px 14px rgba(164, 116, 101, 0.3);
  transition: all 0.3s ease;
  border: 2px solid transparent;
}

.btn-sponsor:hover {
  transform: translateY(-2px);
  box-shadow: 0 6px 20px rgba(164, 116, 101, 0.4);
}

Then replace the inline styles and handlers:

             <Link
               to="/sponsors"
-              style={{
-                display: 'inline-flex',
-                ...
-              }}
-              onMouseEnter={(e) => { ... }}
-              onMouseLeave={(e) => { ... }}
+              className="btn-sponsor"
             >

28-46: Version badge still uses inline styles.

The PR objective includes extracting inline styles to CSS classes, but this Link (and a few others on this page) still carries a full inline style object. Consider extracting to a .version-badge class for consistency with the refactoring effort.

- Update rgba(0, 0, 0, 0.08) to rgb(0 0 0 / 8%) for stylelint compliance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@hyochan hyochan merged commit 5d9fc3b into main Feb 11, 2026
7 checks passed
@hyochan hyochan deleted the docs/seo-aeo-improvements branch February 11, 2026 12:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📖 documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant