diff --git a/next-sitemap.config.js b/next-sitemap.config.js
index 0973f48..bd9bdb9 100644
--- a/next-sitemap.config.js
+++ b/next-sitemap.config.js
@@ -1,5 +1,40 @@
// next-sitemap.config.js
+/** @type {import('next-sitemap').IConfig} */
module.exports = {
- siteUrl: "https://readmegen-ai.vercel.app", // your site URL
- generateRobotsTxt: true, // optional: creates robots.txt
+ siteUrl: "https://readmegen-ai.vercel.app",
+ generateRobotsTxt: true,
+ changefreq: "weekly",
+ priority: 0.7,
+ additionalPaths: async (config) => [
+ {
+ loc: "/",
+ changefreq: "weekly",
+ priority: 1.0,
+ lastmod: new Date().toISOString(),
+ },
+ {
+ loc: "/features",
+ changefreq: "monthly",
+ priority: 0.8,
+ lastmod: new Date().toISOString(),
+ },
+ {
+ loc: "/examples",
+ changefreq: "monthly",
+ priority: 0.8,
+ lastmod: new Date().toISOString(),
+ },
+ {
+ loc: "/docs",
+ changefreq: "monthly",
+ priority: 0.8,
+ lastmod: new Date().toISOString(),
+ },
+ {
+ loc: "/generate",
+ changefreq: "weekly",
+ priority: 0.9,
+ lastmod: new Date().toISOString(),
+ },
+ ],
};
diff --git a/src/app/docs/page.tsx b/src/app/docs/page.tsx
index 56cd4d9..5953682 100644
--- a/src/app/docs/page.tsx
+++ b/src/app/docs/page.tsx
@@ -1,3 +1,4 @@
+import type { Metadata } from "next";
import { Navbar } from "@/components/layout/Navbar";
import { Footer } from "@/components/layout/Footer";
import { QuickStart } from "@/components/docs/QuickStart";
@@ -5,9 +6,71 @@ import { DocSections } from "@/components/docs/DocSections";
import { FAQ } from "@/components/docs/FAQ";
import { navLinks } from "@/constants/navLinks";
+export const metadata: Metadata = {
+ title: "Documentation | ReadmeGenAI",
+ description:
+ "Learn how to use ReadmeGenAI, the AI README generator for GitHub. Quick-start guides, API docs, FAQs, and tips for perfect GitHub README files.",
+ openGraph: {
+ title: "Documentation | ReadmeGenAI",
+ description:
+ "Learn how to use ReadmeGenAI, the AI README generator for GitHub. Quick-start guides, API docs, FAQs, and tips for perfect GitHub README files.",
+ url: "/docs",
+ },
+};
+
+const faqJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "FAQPage",
+ mainEntity: [
+ {
+ "@type": "Question",
+ name: "How does the AI analyze my code?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: "We use AST parsing and heuristic analysis to identify entry points and dependencies without storing your actual source code.",
+ },
+ },
+ {
+ "@type": "Question",
+ name: "Can I use this for private repos?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: "Yes, by connecting your GitHub account, we can securely analyze private repositories with your permission.",
+ },
+ },
+ ],
+};
+
+const breadcrumbJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: "https://readmegen-ai.vercel.app/",
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Documentation",
+ item: "https://readmegen-ai.vercel.app/docs",
+ },
+ ],
+};
+
export default function DocsPage() {
return (
+
+
diff --git a/src/app/examples/ExamplesClient.tsx b/src/app/examples/ExamplesClient.tsx
new file mode 100644
index 0000000..a2f8986
--- /dev/null
+++ b/src/app/examples/ExamplesClient.tsx
@@ -0,0 +1,235 @@
+"use client";
+import React, { useState, useRef, useEffect } from "react";
+import { Navbar } from "@/components/layout/Navbar";
+import { Footer } from "@/components/layout/Footer";
+import { Button } from "@/components/ui/Button";
+import {
+ ExternalLink,
+ Box,
+ Cpu,
+ Globe,
+ Eye,
+ X,
+ Copy,
+ Check,
+} from "lucide-react";
+import Link from "next/link";
+import { navLinks } from "@/constants/navLinks";
+
+const examples = [
+ {
+ title: "Modern Web App",
+ repo: "nextjs-saas-template",
+ icon:
,
+ tags: ["Next.js 16", "Tailwind", "Prisma"],
+ stars: "1.2k",
+ description:
+ "A comprehensive README featuring deployment guides, environment variable tables, and architecture diagrams.",
+ markdown: `# 🚀 Next.js SaaS Foundation\n\nA professional starter kit for high-performance web applications.\n\n## 🛠 Features\n- **Authentication:** NextAuth.js with multi-provider support.\n- **Database:** Prisma ORM with automated migrations.\n- **UI:** Server-side rendered components via Radix UI.\n\n## 📦 Getting Started\n1. Clone the repo\n2. Run \`npm install\`\n3. Setup \`.env\` file\n4. \`npm run dev\``,
+ },
+ {
+ title: "Utility Library",
+ repo: "ts-utils-core",
+ icon:
,
+ tags: ["TypeScript", "Rollup", "Vitest"],
+ stars: "850",
+ description:
+ "Technical documentation with API references, installation via multiple package managers, and usage snippets.",
+ markdown: `# 📦 TS-Utils Core\n\nHigh-performance TypeScript utilities for modern engines.\n\n## 📥 Installation\n\`\`\`bash\nnpm install ts-utils-core\n\`\`\`\n\n## 📖 Quick Usage\n\`\`\`typescript\nimport { formatDate } from 'ts-utils-core';\n\nconst date = formatDate(new Date());\n\`\`\``,
+ },
+ {
+ title: "Backend Engine",
+ repo: "go-stream-processor",
+ icon:
,
+ tags: ["Go", "Docker", "Redis"],
+ stars: "2.4k",
+ description:
+ "Performance oriented README focusing on benchmark results, configuration flags, and scaling.",
+ markdown: `# ⚡ Go Stream Processor\n\nUltra-low latency data streaming engine.\n\n## 📊 Performance Benchmarks\n| Case | Latency | Throughput |\n|------|---------|------------|\n| Sync | 1.2ms | 50k ops/s |\n| Async| 0.4ms | 250k ops/s |\n\n## 🐳 Deployment\n\`\`\`bash\ndocker-compose up -d\n\`\`\``,
+ },
+];
+
+export default function ExamplesClient() {
+ const [previewContent, setPreviewContent] = useState
(null);
+ const [copied, setCopied] = useState(false);
+
+ // Refs for timeout and accessibility management
+ const timeoutRef = useRef(null);
+ const closeButtonRef = useRef(null);
+
+ // Handle Modal Side Effects: Body Scroll, Escape Key, and Initial Focus
+ useEffect(() => {
+ if (previewContent) {
+ // 1. Lock body scroll
+ document.body.style.overflow = "hidden";
+
+ // 2. Focus the close button for keyboard accessibility
+ closeButtonRef.current?.focus();
+
+ // 3. Close on Escape key press
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if (e.key === "Escape") setPreviewContent(null);
+ };
+
+ window.addEventListener("keydown", handleKeyDown);
+
+ return () => {
+ document.body.style.overflow = "unset";
+ window.removeEventListener("keydown", handleKeyDown);
+ };
+ }
+ }, [previewContent]);
+
+ const handleCopy = async (text: string) => {
+ try {
+ await navigator.clipboard.writeText(text);
+
+ // Clear previous timeout if user clicks rapidly
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
+
+ setCopied(true);
+
+ // Success path: reset icon after 2 seconds
+ timeoutRef.current = setTimeout(() => {
+ setCopied(false);
+ }, 2000);
+ } catch (err) {
+ // Error path: log rejection and prevent UI from showing "Checked"
+ console.error("Failed to copy text: ", err);
+ }
+ };
+
+ return (
+
+
+
+
+ {/* Header Section */}
+
+
+ Trusted by developers
+
+ to tell their story.
+
+
+
+ Explore how ReadmeGenAI adapts to different tech stacks and project
+ scales.
+
+
+
+ {/* Examples Grid */}
+
+ {examples.map((example, idx) => (
+
+
+
+ {example.icon}
+
+
+
+
+
+ {example.title}
+
+
+ {example.repo}
+
+
+ {example.description}
+
+
+
+ {example.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+
+ ))}
+
+
+ {/* --- README PREVIEW MODAL --- */}
+ {previewContent && (
+ setPreviewContent(null)} // Close on backdrop click
+ >
+
e.stopPropagation()} // Prevent closing when clicking inside
+ role="dialog"
+ aria-modal="true"
+ >
+
+
+ README_PREVIEW.md
+
+
+
+
+
+
+
+
+
+ )}
+
+ {/* Bottom CTA */}
+
+
+ Ready to document your project?
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/examples/page.tsx b/src/app/examples/page.tsx
index 27694da..8eea933 100644
--- a/src/app/examples/page.tsx
+++ b/src/app/examples/page.tsx
@@ -1,235 +1,45 @@
-"use client";
-import React, { useState, useRef, useEffect } from "react";
-import { Navbar } from "@/components/layout/Navbar";
-import { Footer } from "@/components/layout/Footer";
-import { Button } from "@/components/ui/Button";
-import {
- ExternalLink,
- Box,
- Cpu,
- Globe,
- Eye,
- X,
- Copy,
- Check,
-} from "lucide-react";
-import Link from "next/link";
-import { navLinks } from "@/constants/navLinks";
-
-const examples = [
- {
- title: "Modern Web App",
- repo: "nextjs-saas-template",
- icon: ,
- tags: ["Next.js 16", "Tailwind", "Prisma"],
- stars: "1.2k",
- description:
- "A comprehensive README featuring deployment guides, environment variable tables, and architecture diagrams.",
- markdown: `# 🚀 Next.js SaaS Foundation\n\nA professional starter kit for high-performance web applications.\n\n## 🛠 Features\n- **Authentication:** NextAuth.js with multi-provider support.\n- **Database:** Prisma ORM with automated migrations.\n- **UI:** Server-side rendered components via Radix UI.\n\n## 📦 Getting Started\n1. Clone the repo\n2. Run \`npm install\`\n3. Setup \`.env\` file\n4. \`npm run dev\``,
- },
- {
- title: "Utility Library",
- repo: "ts-utils-core",
- icon: ,
- tags: ["TypeScript", "Rollup", "Vitest"],
- stars: "850",
+import type { Metadata } from "next";
+import ExamplesClient from "./ExamplesClient";
+
+export const metadata: Metadata = {
+ title: "Examples | ReadmeGenAI",
+ description:
+ "Browse real GitHub README examples generated by ReadmeGenAI. See AI README output for Next.js apps, TypeScript libraries, Go backends, and more.",
+ openGraph: {
+ title: "Examples | ReadmeGenAI",
description:
- "Technical documentation with API references, installation via multiple package managers, and usage snippets.",
- markdown: `# 📦 TS-Utils Core\n\nHigh-performance TypeScript utilities for modern engines.\n\n## 📥 Installation\n\`\`\`bash\nnpm install ts-utils-core\n\`\`\`\n\n## 📖 Quick Usage\n\`\`\`typescript\nimport { formatDate } from 'ts-utils-core';\n\nconst date = formatDate(new Date());\n\`\`\``,
+ "Browse real GitHub README examples generated by ReadmeGenAI. See AI README output for Next.js apps, TypeScript libraries, Go backends, and more.",
+ url: "/examples",
},
- {
- title: "Backend Engine",
- repo: "go-stream-processor",
- icon: ,
- tags: ["Go", "Docker", "Redis"],
- stars: "2.4k",
- description:
- "Performance oriented README focusing on benchmark results, configuration flags, and scaling.",
- markdown: `# ⚡ Go Stream Processor\n\nUltra-low latency data streaming engine.\n\n## 📊 Performance Benchmarks\n| Case | Latency | Throughput |\n|------|---------|------------|\n| Sync | 1.2ms | 50k ops/s |\n| Async| 0.4ms | 250k ops/s |\n\n## 🐳 Deployment\n\`\`\`bash\ndocker-compose up -d\n\`\`\``,
- },
-];
+};
+
+const breadcrumbJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: "https://readmegen-ai.vercel.app/",
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Examples",
+ item: "https://readmegen-ai.vercel.app/examples",
+ },
+ ],
+};
export default function ExamplesPage() {
- const [previewContent, setPreviewContent] = useState(null);
- const [copied, setCopied] = useState(false);
-
- // Refs for timeout and accessibility management
- const timeoutRef = useRef(null);
- const closeButtonRef = useRef(null);
-
- // Handle Modal Side Effects: Body Scroll, Escape Key, and Initial Focus
- useEffect(() => {
- if (previewContent) {
- // 1. Lock body scroll
- document.body.style.overflow = "hidden";
-
- // 2. Focus the close button for keyboard accessibility
- closeButtonRef.current?.focus();
-
- // 3. Close on Escape key press
- const handleKeyDown = (e: KeyboardEvent) => {
- if (e.key === "Escape") setPreviewContent(null);
- };
-
- window.addEventListener("keydown", handleKeyDown);
-
- return () => {
- document.body.style.overflow = "unset";
- window.removeEventListener("keydown", handleKeyDown);
- };
- }
- }, [previewContent]);
-
- const handleCopy = async (text: string) => {
- try {
- await navigator.clipboard.writeText(text);
-
- // Clear previous timeout if user clicks rapidly
- if (timeoutRef.current) clearTimeout(timeoutRef.current);
-
- setCopied(true);
-
- // Success path: reset icon after 2 seconds
- timeoutRef.current = setTimeout(() => {
- setCopied(false);
- }, 2000);
- } catch (err) {
- // Error path: log rejection and prevent UI from showing "Checked"
- console.error("Failed to copy text: ", err);
- }
- };
-
return (
-
-
-
-
- {/* Header Section */}
-
-
- Trusted by developers
-
- to tell their story.
-
-
-
- Explore how ReadmeGenAI adapts to different tech stacks and project
- scales.
-
-
-
- {/* Examples Grid */}
-
- {examples.map((example, idx) => (
-
-
-
- {example.icon}
-
-
-
-
-
- {example.title}
-
-
- {example.repo}
-
-
- {example.description}
-
-
-
- {example.tags.map((tag) => (
-
- {tag}
-
- ))}
-
-
-
-
- ))}
-
-
- {/* --- README PREVIEW MODAL --- */}
- {previewContent && (
- setPreviewContent(null)} // Close on backdrop click
- >
-
e.stopPropagation()} // Prevent closing when clicking inside
- role="dialog"
- aria-modal="true"
- >
-
-
- README_PREVIEW.md
-
-
-
-
-
-
-
-
-
- )}
-
- {/* Bottom CTA */}
-
-
- Ready to document your project?
-
-
-
-
-
-
-
+ <>
+
+
+ >
);
}
diff --git a/src/app/features/page.tsx b/src/app/features/page.tsx
index 0edae55..b6f5210 100644
--- a/src/app/features/page.tsx
+++ b/src/app/features/page.tsx
@@ -1,8 +1,21 @@
-"use client";
+import type { Metadata } from "next";
import React from "react";
import { Navbar } from "@/components/layout/Navbar";
import { Footer } from "@/components/layout/Footer";
import { Cpu, Globe, ShieldCheck, Sparkles, Zap, Code2 } from "lucide-react";
+import { navLinks } from "@/constants/navLinks";
+
+export const metadata: Metadata = {
+ title: "Features | ReadmeGenAI",
+ description:
+ "Discover ReadmeGenAI features: AI README generator powered by Gemini, GitHub Octokit integration, instant generation, and framework-aware documentation.",
+ openGraph: {
+ title: "Features | ReadmeGenAI",
+ description:
+ "Discover ReadmeGenAI features: AI README generator powered by Gemini, GitHub Octokit integration, instant generation, and framework-aware documentation.",
+ url: "/features",
+ },
+};
const features = [
{
@@ -37,25 +50,45 @@ const features = [
},
];
-export default function FeaturesPage() {
- const navLinks = [
- { name: "Home", href: "/" },
- { name: "Features", href: "/features" },
- { name: "Examples", href: "/examples" },
- { name: "Docs", href: "/docs" },
- ];
+const breadcrumbJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: "https://readmegen-ai.vercel.app/",
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Features",
+ item: "https://readmegen-ai.vercel.app/features",
+ },
+ ],
+};
+export default function FeaturesPage() {
return (
+
- Documentation
+ AI README Generator
reimagined.
+
+ Everything ReadmeGenAI offers to make your GitHub README stand out—
+ powered by AI, built for developers.
+
diff --git a/src/app/generate/page.tsx b/src/app/generate/page.tsx
index 88e25e8..999c7b8 100644
--- a/src/app/generate/page.tsx
+++ b/src/app/generate/page.tsx
@@ -1,5 +1,45 @@
+import type { Metadata } from "next";
import GeneratePageClient from "./GeneratePageClient";
+export const metadata: Metadata = {
+ title: "Generate README | ReadmeGenAI",
+ description:
+ "Paste any GitHub repository URL and instantly generate a polished, professional README with ReadmeGenAI — the free AI README generator for developers.",
+ openGraph: {
+ title: "Generate README | ReadmeGenAI",
+ description:
+ "Paste any GitHub repository URL and instantly generate a polished, professional README with ReadmeGenAI — the free AI README generator for developers.",
+ url: "/generate",
+ },
+};
+
+const breadcrumbJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: "https://readmegen-ai.vercel.app/",
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Generate README",
+ item: "https://readmegen-ai.vercel.app/generate",
+ },
+ ],
+};
+
export default function GeneratePage() {
- return
;
+ return (
+ <>
+
+
+ >
+ );
}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 8622d95..50cd490 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -66,6 +66,29 @@ export default function RootLayout({
const siteUrl =
process.env.NEXT_PUBLIC_SITE_URL || "https://readmegen-ai.vercel.app";
+ const softwareAppJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "SoftwareApplication",
+ name: "ReadmeGenAI",
+ applicationCategory: "DeveloperTool",
+ operatingSystem: "Web",
+ description:
+ "AI-powered GitHub README generator that creates professional markdown documentation automatically from any public GitHub repository.",
+ url: siteUrl,
+ image: `${siteUrl}/ReadmeGenAI.png`,
+ offers: {
+ "@type": "Offer",
+ price: "0",
+ priceCurrency: "USD",
+ },
+ featureList: [
+ "AI-generated GitHub README files",
+ "Framework and dependency detection",
+ "Instant markdown output",
+ "GitHub Octokit integration",
+ ],
+ };
+
return (
@@ -73,16 +96,7 @@ export default function RootLayout({
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 6e44597..29bf071 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -16,6 +16,22 @@ export const metadata: Metadata = {
title: "AI README Generator for GitHub Projects | ReadmeGenAI",
description:
"Instantly create professional GitHub README files with ReadmeGenAI. Our AI README generator analyzes your repo and produces polished markdown docs in seconds.",
+ url: "/",
+ },
+};
+
+const webSiteJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "WebSite",
+ name: "ReadmeGenAI",
+ url: "https://readmegen-ai.vercel.app",
+ description:
+ "AI README generator for GitHub projects. Instantly create professional markdown documentation from any public repository.",
+ potentialAction: {
+ "@type": "SearchAction",
+ target:
+ "https://readmegen-ai.vercel.app/generate?repo={search_term_string}",
+ "query-input": "required name=search_term_string",
},
};
@@ -40,6 +56,10 @@ export default function Home() {
return (
+