Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions packages/docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<title>OpenIAP - Unified Specification for In-App Purchases</title>
<meta name="title" content="OpenIAP - Unified Specification for In-App Purchases" />
<meta name="description" content="OpenIAP is a unified specification for in-app purchases across platforms, frameworks, and emerging technologies. Standardizing IAP implementations to reduce fragmentation." />
<meta name="keywords" content="IAP, in-app purchase, mobile development, iOS, Android, StoreKit, Google Play Billing, React Native, Flutter, Kotlin Multiplatform" />
<meta name="keywords" content="IAP, in-app purchase, mobile development, iOS, Android, StoreKit 2, Google Play Billing, React Native, Flutter, Kotlin Multiplatform, Godot, Unity, visionOS, Vision Pro, Meta Quest, Horizon OS, subscription, consumable, non-consumable" />
<meta name="author" content="OpenIAP" />

<!-- Open Graph / Facebook -->
Expand All @@ -35,6 +35,10 @@

<!-- Favicon variations -->
<link rel="apple-touch-icon" sizes="180x180" href="/logo.png" />

<!-- AI/LLM Context (llms.txt standard) -->
<link rel="alternate" type="text/plain" title="LLM Context" href="/llms.txt" />
<link rel="alternate" type="text/plain" title="LLM Full Context" href="/llms-full.txt" />

<!-- Schema.org JSON-LD -->
<script type="application/ld+json">
Expand All @@ -44,15 +48,33 @@
"name": "OpenIAP",
"url": "https://openiap.dev",
"description": "OpenIAP is a unified specification for in-app purchases across platforms, frameworks, and emerging technologies.",
"inLanguage": "en",
"author": {
"@type": "Organization",
"name": "OpenIAP",
"url": "https://openiap.dev"
"url": "https://openiap.dev",
"logo": "https://openiap.dev/logo.png",
"sameAs": [
"https://github.com/hyodotdev/openiap",
"https://github.com/hyochan/react-native-iap",
"https://github.com/hyochan/expo-iap"
]
},
"potentialAction": {
"@type": "SearchAction",
"target": "https://openiap.dev/docs?search={search_term_string}",
"query-input": "required name=search_term_string"
},
"about": {
"@type": "SoftwareApplication",
"name": "OpenIAP",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "iOS, Android, visionOS, Horizon OS",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
}
}
</script>
Expand Down
18 changes: 17 additions & 1 deletion packages/docs/public/robots.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
User-agent: *
Allow: /

Sitemap: https://openiap.dev/sitemap.xml
Sitemap: https://openiap.dev/sitemap.xml

# AI Assistants / LLM Crawlers
# Reference: https://llmstxt.org/
User-agent: GPTBot
User-agent: ChatGPT-User
User-agent: Claude-Web
User-agent: Anthropic-AI
User-agent: PerplexityBot
User-agent: Google-Extended
Allow: /
Allow: /llms.txt
Allow: /llms-full.txt
Comment thread
coderabbitai[bot] marked this conversation as resolved.

# LLM context files for AI assistants
# llms.txt: https://openiap.dev/llms.txt (concise overview)
# llms-full.txt: https://openiap.dev/llms-full.txt (detailed reference)
46 changes: 23 additions & 23 deletions packages/docs/public/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,147 +2,147 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://openiap.dev/</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
Comment thread
hyochan marked this conversation as resolved.
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://openiap.dev/introduction</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://openiap.dev/languages</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/tutorials</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/sponsors</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>

<!-- Documentation -->
<url>
<loc>https://openiap.dev/docs/ecosystem</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://openiap.dev/docs/lifecycle</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://openiap.dev/docs/lifecycle/subscription</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/docs/types</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://openiap.dev/docs/apis</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://openiap.dev/docs/events</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/docs/errors</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>

<!-- Setup Guides -->
<url>
<loc>https://openiap.dev/docs/ios-setup</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/docs/android-setup</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/docs/horizon-setup</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>

<!-- Features -->
<url>
<loc>https://openiap.dev/docs/features/purchase</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/docs/features/subscription</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/docs/features/offer-code-redemption</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://openiap.dev/docs/features/external-purchase</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openiap.dev/docs/features/subscription-upgrade-downgrade</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>

<!-- Updates -->
<url>
<loc>https://openiap.dev/docs/updates/announcements</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://openiap.dev/docs/updates/notes</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://openiap.dev/docs/updates/versions</loc>
<lastmod>2025-11-26</lastmod>
<lastmod>2026-02-11</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
Expand Down
52 changes: 48 additions & 4 deletions packages/docs/src/components/SEO.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,51 @@ interface SEOProps {
description?: string;
path?: string;
keywords?: string;
type?: 'website' | 'article';
image?: string;
includeAppSchema?: boolean;
}

const BASE_URL = 'https://openiap.dev';
const DEFAULT_TITLE = 'OpenIAP - Unified Specification for In-App Purchases';
const DEFAULT_DESCRIPTION =
'OpenIAP is a unified specification for in-app purchases across platforms, frameworks, and emerging technologies. Standardizing IAP implementations to reduce fragmentation.';
const DEFAULT_IMAGE = '/og-image.png';

function SEO({ title, description, path = '', keywords }: SEOProps) {
function SEO({
title,
description,
path = '',
keywords,
type = 'website',
image,
includeAppSchema = false,
}: SEOProps) {
const pageTitle = title ? `${title} | OpenIAP` : DEFAULT_TITLE;
const pageDescription = description || DEFAULT_DESCRIPTION;
const canonicalUrl = `${BASE_URL}${path}`;
const imageUrl = `${BASE_URL}${image || DEFAULT_IMAGE}`;

// Schema.org structured data for SoftwareApplication
const schemaOrg = {
'@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,
},
};
Comment thread
coderabbitai[bot] marked this conversation as resolved.

return (
<Helmet>
Expand All @@ -26,14 +60,24 @@ function SEO({ title, description, path = '', keywords }: SEOProps) {
<link rel="canonical" href={canonicalUrl} />

{/* Open Graph */}
<meta property="og:type" content={type} />
<meta property="og:url" content={canonicalUrl} />
<meta property="og:title" content={pageTitle} />
<meta property="og:description" content={pageDescription} />
<meta property="og:image" content={imageUrl} />
<meta property="og:site_name" content="OpenIAP" />

{/* Twitter */}
<meta property="twitter:url" content={canonicalUrl} />
<meta property="twitter:title" content={pageTitle} />
<meta property="twitter:description" content={pageDescription} />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content={canonicalUrl} />
<meta name="twitter:title" content={pageTitle} />
<meta name="twitter:description" content={pageDescription} />
<meta name="twitter:image" content={imageUrl} />

{/* Schema.org JSON-LD */}
{includeAppSchema && (
<script type="application/ld+json">{JSON.stringify(schemaOrg)}</script>
)}
</Helmet>
);
}
Expand Down
26 changes: 17 additions & 9 deletions packages/docs/src/pages/404.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Link } from 'react-router-dom';
import { Home, ArrowLeft } from 'lucide-react';
import { useEffect, useState } from 'react';
import SEO from '../components/SEO';

export default function NotFound() {
const [isDark, setIsDark] = useState(false);
Expand All @@ -22,15 +23,21 @@ export default function NotFound() {
}, []);

return (
<div
style={{
minHeight: '70vh',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
padding: '2rem',
}}
>
<>
<SEO
title="Page Not Found"
description="The page you're looking for doesn't exist. Return to OpenIAP documentation for in-app purchase guides and API references."
path="/404"
/>
<div
style={{
minHeight: '70vh',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
padding: '2rem',
}}
>
<div
style={{
textAlign: 'center',
Expand Down Expand Up @@ -143,5 +150,6 @@ export default function NotFound() {
</div>
</div>
</div>
</>
);
}
4 changes: 2 additions & 2 deletions packages/docs/src/pages/docs/android-setup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ function AndroidSetup() {
<div className="doc-page">
<SEO
title="Android Setup"
description="Complete guide to setting up in-app purchases for Android - Google Play Console, Billing Library, and testing."
description="Complete Android in-app purchase setup guide. Configure Google Play Console, integrate Play Billing Library v8, create products, and test purchases with license testers."
path="/docs/android-setup"
keywords="Android IAP setup, Google Play Billing, Play Console"
keywords="Android IAP setup, Google Play Billing, Play Console setup, Play Billing Library 8, Android subscription setup, license tester, IAP testing"
/>
<h1>Android Setup Guide</h1>
<p>
Expand Down
Loading
Loading