Skip to content

Commit fb28e29

Browse files
committed
Comprehensive SEO optimization across entire site
Structured Data (Schema.org/JSON-LD): - Add Organization schema to layout (company info, social links) - Add WebSite schema with search action - Add BreadcrumbList schema to all pages - Add FAQPage schema to submit page with 4 common questions - Add SoftwareSourceCode schema to project pages (existing) Meta Tags & Descriptions: - Improve meta descriptions with keyword-rich content - Homepage: mention 100+ projects, cities, tech stack search - Radar: highlight interactive map, cities, real-time stats - About: emphasize Git-based, community-driven platform - Submit: focus on step-by-step guide, TOML examples, PR workflow - Add location-based keywords (Bangalore, Mumbai, Delhi, etc) Technical SEO: - Update robots.txt to allow /submit page (was blocked) - Add /submit to sitemap.xml with priority 0.8 - Create reusable BreadcrumbSchema component - Maintain existing sitemap revalidation (1 hour) - Keep Googlebot specific rules for better indexing Search Engine Features: - Breadcrumb navigation for better SERP display - FAQ rich snippets for submit page - Organization knowledge panel potential - Search box sitelinks potential - Enhanced project page snippets All pages now have: - Proper breadcrumb navigation - Optimized meta descriptions - Structured data markup - Better keyword targeting - Improved crawlability
1 parent 9da3f90 commit fb28e29

File tree

9 files changed

+179
-8
lines changed

9 files changed

+179
-8
lines changed

app/about/page.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { ThemeToggle } from "@/components/ThemeToggle";
2+
import { BreadcrumbSchema } from "@/components/BreadcrumbSchema";
23
import { Github, FileCode, Map, Radar, Heart, Globe, Users, Code, Target, Zap, Plus } from "lucide-react";
34
import Link from "next/link";
45
import type { Metadata } from "next";
56

67
export const metadata: Metadata = {
7-
title: "About - FOSSRadar.in",
8-
description: "Learn about FOSSRadar.in, India's comprehensive directory celebrating FOSS projects through their founders, creators, contributors, and community impact. Built by wbfoss for the Indian open source community.",
8+
title: "About FOSSRadar.in - India's Premier Open Source Directory",
9+
description: "FOSSRadar.in is a Git-based, community-driven platform showcasing India's FOSS ecosystem. Built by wbfoss, we celebrate Indian developers, organizations & open source contributions worldwide.",
910
keywords: [
1011
"about fossradar",
1112
"foss india",
@@ -31,6 +32,12 @@ export const metadata: Metadata = {
3132
export default function AboutPage() {
3233
return (
3334
<div className="min-h-screen bg-gray-50 dark:bg-black">
35+
<BreadcrumbSchema
36+
items={[
37+
{ name: "Home", url: "https://fossradar.in" },
38+
{ name: "About", url: "https://fossradar.in/about" },
39+
]}
40+
/>
3441
{/* Header */}
3542
<header className="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900">
3643
<div className="container mx-auto px-4 py-4 sm:py-6">

app/layout.tsx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,62 @@ export default function RootLayout({
108108
}: Readonly<{
109109
children: React.ReactNode;
110110
}>) {
111+
const organizationSchema = {
112+
"@context": "https://schema.org",
113+
"@type": "Organization",
114+
"name": "FOSSRadar.in",
115+
"url": "https://fossradar.in",
116+
"logo": "https://fossradar.in/logos/fossradar/logo.png",
117+
"description": "India's comprehensive directory for discovering and exploring open source projects from Indian founders, creators, and contributors.",
118+
"foundingDate": "2025",
119+
"foundingLocation": {
120+
"@type": "Country",
121+
"name": "India"
122+
},
123+
"sameAs": [
124+
"https://github.com/wbfoss/fossradar",
125+
"https://twitter.com/wbfoss"
126+
],
127+
"contactPoint": {
128+
"@type": "ContactPoint",
129+
"contactType": "Support",
130+
"url": "https://github.com/wbfoss/fossradar/issues"
131+
}
132+
};
133+
134+
const websiteSchema = {
135+
"@context": "https://schema.org",
136+
"@type": "WebSite",
137+
"name": "FOSSRadar.in",
138+
"url": "https://fossradar.in",
139+
"description": "Discover and explore open source projects from India",
140+
"potentialAction": {
141+
"@type": "SearchAction",
142+
"target": {
143+
"@type": "EntryPoint",
144+
"urlTemplate": "https://fossradar.in/?q={search_term_string}"
145+
},
146+
"query-input": "required name=search_term_string"
147+
},
148+
"publisher": {
149+
"@type": "Organization",
150+
"name": "wbfoss",
151+
"url": "https://wbfoss.org"
152+
}
153+
};
154+
111155
return (
112156
<html lang="en" suppressHydrationWarning>
157+
<head>
158+
<script
159+
type="application/ld+json"
160+
dangerouslySetInnerHTML={{ __html: JSON.stringify(organizationSchema) }}
161+
/>
162+
<script
163+
type="application/ld+json"
164+
dangerouslySetInnerHTML={{ __html: JSON.stringify(websiteSchema) }}
165+
/>
166+
</head>
113167
<body className={`${inter.variable} ${vt323.variable} ${shareTech.variable} antialiased font-sans`}>
114168
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
115169
{children}

app/page.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { loadAllProjects } from "@/lib/projects";
22
import { ProjectGrid } from "@/components/ProjectGrid";
33
import { ThemeToggle } from "@/components/ThemeToggle";
4+
import { BreadcrumbSchema } from "@/components/BreadcrumbSchema";
45
import { Github, FileCode, Map, Radar, Plus } from "lucide-react";
56
import Link from "next/link";
67
import type { Metadata } from "next";
@@ -9,7 +10,7 @@ export const revalidate = 3600; // Revalidate every hour
910

1011
export const metadata: Metadata = {
1112
title: "FOSSRadar.in - Discover Open Source Projects from India",
12-
description: "Explore India's vibrant open source ecosystem. Search, filter, and discover FOSS projects by Indian founders, organizations, and contributors. Find projects by location, technology, and domain.",
13+
description: "India's leading directory of open source projects. Discover 100+ FOSS projects from Indian developers across Bangalore, Mumbai, Delhi, Kolkata & more. Search by tech stack, location & tags.",
1314
keywords: [
1415
"open source india",
1516
"foss projects",
@@ -51,6 +52,11 @@ export default function Home() {
5152

5253
return (
5354
<div className="min-h-screen bg-gray-50 dark:bg-black">
55+
<BreadcrumbSchema
56+
items={[
57+
{ name: "Home", url: "https://fossradar.in" },
58+
]}
59+
/>
5460
{/* Header */}
5561
<header className="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900">
5662
<div className="container mx-auto px-4 py-4 sm:py-6">

app/projects/[slug]/page.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { loadAllProjects, getProjectBySlug } from "@/lib/projects";
33
import { findSimilarProjects } from "@/lib/similar";
44
import { ProjectDetail } from "@/components/ProjectDetail";
55
import { ThemeToggle } from "@/components/ThemeToggle";
6+
import { BreadcrumbSchema } from "@/components/BreadcrumbSchema";
67
import { Github, FileCode, Map, Radar, Plus } from "lucide-react";
78
import Link from "next/link";
89
import type { Metadata } from "next";
@@ -110,6 +111,13 @@ export default async function ProjectPage({ params }: ProjectPageProps) {
110111

111112
return (
112113
<div className="min-h-screen bg-gray-50 dark:bg-black">
114+
<BreadcrumbSchema
115+
items={[
116+
{ name: "Home", url: "https://fossradar.in" },
117+
{ name: "Projects", url: "https://fossradar.in" },
118+
{ name: project.name, url: `https://fossradar.in/projects/${slug}` },
119+
]}
120+
/>
113121
{/* Header */}
114122
<header className="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900">
115123
<div className="container mx-auto px-4 py-4 sm:py-6">

app/radar/page.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { loadAllProjects } from "@/lib/projects";
22
import { ThemeToggle } from "@/components/ThemeToggle";
3+
import { BreadcrumbSchema } from "@/components/BreadcrumbSchema";
34
import { Github, MapPin, Package, TrendingUp, Building2, Star, ArrowUpRight, FileCode, Map, Radar, Plus } from "lucide-react";
45
import Link from "next/link";
56
import type { Metadata } from "next";
67

78
export const revalidate = 3600; // Revalidate every hour
89

910
export const metadata: Metadata = {
10-
title: "Geographic Radar - Explore Projects by Location",
11-
description: "Explore open source projects across India by state and city. Interactive analytics dashboard showing project distribution, top states, verified projects, and geographic insights.",
11+
title: "Geographic Radar - Explore Indian Open Source Projects by Location",
12+
description: "Interactive map of India's open source ecosystem. View projects by state, city & region. Discover tech hubs in Bangalore, Mumbai, Delhi, Hyderabad, Pune & Kolkata with real-time statistics.",
1213
keywords: [
1314
"open source india map",
1415
"projects by state",
@@ -73,6 +74,12 @@ export default function RadarPage() {
7374

7475
return (
7576
<div className="min-h-screen bg-gray-50 dark:bg-black">
77+
<BreadcrumbSchema
78+
items={[
79+
{ name: "Home", url: "https://fossradar.in" },
80+
{ name: "Geographic Radar", url: "https://fossradar.in/radar" },
81+
]}
82+
/>
7683
{/* Header */}
7784
<header className="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900">
7885
<div className="container mx-auto px-4 py-4 sm:py-6">

app/robots.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ export default function robots(): MetadataRoute.Robots {
66
{
77
userAgent: "*",
88
allow: "/",
9-
disallow: ["/api/*", "/submit"],
9+
disallow: ["/api/*"],
10+
},
11+
{
12+
userAgent: "Googlebot",
13+
allow: "/",
14+
disallow: ["/api/*"],
1015
},
1116
],
1217
sitemap: "https://fossradar.in/sitemap.xml",

app/sitemap.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ export default function sitemap(): MetadataRoute.Sitemap {
2222
changeFrequency: "daily",
2323
priority: 0.9,
2424
},
25+
{
26+
url: `${baseUrl}/submit`,
27+
lastModified: new Date(),
28+
changeFrequency: "monthly",
29+
priority: 0.8,
30+
},
2531
{
2632
url: `${baseUrl}/about`,
2733
lastModified: new Date(),

app/submit/page.tsx

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { ThemeToggle } from "@/components/ThemeToggle";
2+
import { BreadcrumbSchema } from "@/components/BreadcrumbSchema";
23
import { Github, FileCode, Map, Radar, Plus, CheckCircle2, GitPullRequest, FileText, ExternalLink } from "lucide-react";
34
import Link from "next/link";
45
import type { Metadata } from "next";
56

67
export const metadata: Metadata = {
7-
title: "Submit Your Project - FOSSRadar.in",
8-
description: "Learn how to submit your open source project to FOSSRadar.in. Step-by-step guide for getting your project listed in India's premier FOSS directory.",
8+
title: "Submit Your Open Source Project - FOSSRadar.in",
9+
description: "Add your project to India's leading FOSS directory. Step-by-step guide with TOML examples, validation scripts & PR workflow. Get discovered by 1000s of developers across India.",
910
keywords: [
1011
"submit project",
1112
"add project fossradar",
@@ -27,8 +28,57 @@ export const metadata: Metadata = {
2728
};
2829

2930
export default function SubmitPage() {
31+
const faqSchema = {
32+
"@context": "https://schema.org",
33+
"@type": "FAQPage",
34+
"mainEntity": [
35+
{
36+
"@type": "Question",
37+
"name": "How do I submit my project to FOSSRadar.in?",
38+
"acceptedAnswer": {
39+
"@type": "Answer",
40+
"text": "Fork the FOSSRadar GitHub repository, create a TOML file in data/projects/ with your project details, validate it using 'npm run validate', and submit a pull request. Our team will review and merge it within 2-3 business days."
41+
}
42+
},
43+
{
44+
"@type": "Question",
45+
"name": "Is my project eligible for FOSSRadar.in?",
46+
"acceptedAnswer": {
47+
"@type": "Answer",
48+
"text": "Your project is eligible if it meets any one of these criteria: Founded in India, has core contributors from India, maintained by Indian organizations, or serves the Indian community."
49+
}
50+
},
51+
{
52+
"@type": "Question",
53+
"name": "How do I get the verified badge?",
54+
"acceptedAnswer": {
55+
"@type": "Answer",
56+
"text": "Add 'fossradar' as a GitHub topic to your repository and include the FOSSRadar badge in your README. Once we verify this, your project will receive the verified status."
57+
}
58+
},
59+
{
60+
"@type": "Question",
61+
"name": "How long does the review process take?",
62+
"acceptedAnswer": {
63+
"@type": "Answer",
64+
"text": "Our maintainers typically review submissions within 2-3 business days. If changes are needed, we'll comment on your pull request with specific feedback."
65+
}
66+
}
67+
]
68+
};
69+
70+
const breadcrumbItems = [
71+
{ name: "Home", url: "https://fossradar.in" },
72+
{ name: "Submit Project", url: "https://fossradar.in/submit" },
73+
];
74+
3075
return (
3176
<div className="min-h-screen bg-gray-50 dark:bg-black">
77+
<BreadcrumbSchema items={breadcrumbItems} />
78+
<script
79+
type="application/ld+json"
80+
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqSchema) }}
81+
/>
3282
{/* Header */}
3383
<header className="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900">
3484
<div className="container mx-auto px-4 py-4 sm:py-6">

components/BreadcrumbSchema.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
interface BreadcrumbItem {
2+
name: string;
3+
url: string;
4+
}
5+
6+
interface BreadcrumbSchemaProps {
7+
items: BreadcrumbItem[];
8+
}
9+
10+
export function BreadcrumbSchema({ items }: BreadcrumbSchemaProps) {
11+
const schema = {
12+
"@context": "https://schema.org",
13+
"@type": "BreadcrumbList",
14+
"itemListElement": items.map((item, index) => ({
15+
"@type": "ListItem",
16+
"position": index + 1,
17+
"name": item.name,
18+
"item": item.url,
19+
})),
20+
};
21+
22+
return (
23+
<script
24+
type="application/ld+json"
25+
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
26+
/>
27+
);
28+
}

0 commit comments

Comments
 (0)