Skip to content

Commit 3f322b6

Browse files
“bokiko”claude
andcommitted
Add SEO/GEO optimizations for AI search visibility
- Add llms.txt for AI crawler discoverability - Replace SVG og:image with Next.js ImageResponse (PNG) - Remove fabricated aggregateRating from structured data - Add FAQPage JSON-LD schema for rich snippets - Add twitter:site and twitter:creator meta tags Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent bd55e6c commit 3f322b6

3 files changed

Lines changed: 238 additions & 7 deletions

File tree

web/public/llms.txt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# PingDiff
2+
3+
> Test your ping, packet loss, and jitter to game servers before you queue. Know your connection. Win more games.
4+
5+
PingDiff is a free, open-source game server connection testing tool. It lets gamers test their network quality (ping, packet loss, jitter) to real game server IPs using ICMP ping — without launching the game.
6+
7+
## Key Facts
8+
9+
- **Supported Games (9):** Valorant, CS2, Overwatch 2, Call of Duty, Apex Legends, Fortnite, League of Legends, Battlefield 6, Marvel Rivals
10+
- **Server Coverage:** 141 servers across EU, NA, Asia, South America, and Middle East
11+
- **Platforms:** Web app (pingdiff.com) + Windows desktop app
12+
- **Tech Stack:** Next.js (web), Python/Tkinter (desktop), TypeScript, Tailwind CSS
13+
- **License:** MIT — 100% free and open source
14+
- **Privacy:** No tracking by default. Optional anonymous data sharing for community insights.
15+
16+
## Links
17+
18+
- Website: https://pingdiff.com
19+
- Download Desktop App: https://pingdiff.com/download
20+
- Dashboard: https://pingdiff.com/dashboard
21+
- GitHub: https://github.com/bokiko/pingdiff
22+
23+
## How It Works
24+
25+
1. Select a game from the supported list
26+
2. PingDiff tests your connection to real game server IPs
27+
3. Get results showing ping (latency), packet loss, and jitter
28+
4. See which server region gives you the best connection
29+
5. Optionally share anonymous results to help the community
30+
31+
## FAQ
32+
33+
### How do I test my ping before playing?
34+
PingDiff tests real game server IPs using ICMP ping. Select your game, pick a region, and get instant results — no game launch required.
35+
36+
### Is PingDiff free?
37+
Yes, 100% free and open source under the MIT license. No ads, no premium tiers.
38+
39+
### What data does PingDiff collect?
40+
None by default. You can optionally share anonymous ping data to help build community connection insights.

web/src/app/layout.tsx

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const metadata: Metadata = {
2828
type: "website",
2929
images: [
3030
{
31-
url: "/og-image.svg",
31+
url: "/opengraph-image",
3232
width: 1200,
3333
height: 630,
3434
alt: "PingDiff - Know Your Connection Before You Queue",
@@ -39,7 +39,9 @@ export const metadata: Metadata = {
3939
card: "summary_large_image",
4040
title: "PingDiff - Know Your Connection Before You Queue",
4141
description: "Test your ping to game servers without launching the game.",
42-
images: ["/og-image.svg"],
42+
images: ["/opengraph-image"],
43+
site: "@pingdiff",
44+
creator: "@pingdiff",
4345
},
4446
robots: {
4547
index: true,
@@ -71,11 +73,53 @@ const jsonLd = {
7173
price: "0",
7274
priceCurrency: "USD",
7375
},
74-
aggregateRating: {
75-
"@type": "AggregateRating",
76-
ratingValue: "5",
77-
ratingCount: "100",
78-
},
76+
};
77+
78+
const faqJsonLd = {
79+
"@context": "https://schema.org",
80+
"@type": "FAQPage",
81+
mainEntity: [
82+
{
83+
"@type": "Question",
84+
name: "How do I test my ping before playing?",
85+
acceptedAnswer: {
86+
"@type": "Answer",
87+
text: "PingDiff tests real game server IPs using ICMP ping. Select your game, pick a region, and get instant results showing your ping, packet loss, and jitter — no game launch required.",
88+
},
89+
},
90+
{
91+
"@type": "Question",
92+
name: "What games does PingDiff support?",
93+
acceptedAnswer: {
94+
"@type": "Answer",
95+
text: "PingDiff supports 9 games: Valorant, CS2 (Counter-Strike 2), Overwatch 2, Call of Duty, Apex Legends, Fortnite, League of Legends, Battlefield 6, and Marvel Rivals.",
96+
},
97+
},
98+
{
99+
"@type": "Question",
100+
name: "Is PingDiff free?",
101+
acceptedAnswer: {
102+
"@type": "Answer",
103+
text: "Yes, PingDiff is 100% free and open source under the MIT license. There are no ads, no premium tiers, and no hidden costs.",
104+
},
105+
},
106+
{
107+
"@type": "Question",
108+
name: "Does PingDiff track my data?",
109+
acceptedAnswer: {
110+
"@type": "Answer",
111+
text: "No, PingDiff is privacy-first. There is no tracking by default. You can optionally enable anonymous data sharing to contribute community connection insights, but this is entirely opt-in.",
112+
},
113+
},
114+
{
115+
"@type": "Question",
116+
name: "What regions can I test?",
117+
acceptedAnswer: {
118+
"@type": "Answer",
119+
text: "PingDiff covers EU, NA, Asia, South America, and Middle East regions with 141 servers worldwide. You can test your connection to any supported server to find the best region for your game.",
120+
},
121+
},
122+
],
79123
};
80124

81125
export default function RootLayout({
@@ -90,6 +134,10 @@ export default function RootLayout({
90134
type="application/ld+json"
91135
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
92136
/>
137+
<script
138+
type="application/ld+json"
139+
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqJsonLd) }}
140+
/>
93141
</head>
94142
<body className={`${inter.className} antialiased bg-zinc-950 text-white min-h-screen`}>
95143
{children}

web/src/app/opengraph-image.tsx

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import { ImageResponse } from "next/og";
2+
3+
export const runtime = "edge";
4+
5+
export const alt = "PingDiff - Know Your Connection Before You Queue";
6+
export const size = {
7+
width: 1200,
8+
height: 630,
9+
};
10+
export const contentType = "image/png";
11+
12+
export default function Image() {
13+
return new ImageResponse(
14+
(
15+
<div
16+
style={{
17+
background: "linear-gradient(135deg, #09090b 0%, #18181b 50%, #09090b 100%)",
18+
width: "100%",
19+
height: "100%",
20+
display: "flex",
21+
flexDirection: "column",
22+
alignItems: "center",
23+
justifyContent: "center",
24+
fontFamily: "Inter, sans-serif",
25+
padding: "60px",
26+
}}
27+
>
28+
{/* Logo / Title */}
29+
<div
30+
style={{
31+
display: "flex",
32+
alignItems: "center",
33+
gap: "16px",
34+
marginBottom: "24px",
35+
}}
36+
>
37+
<div
38+
style={{
39+
width: "56px",
40+
height: "56px",
41+
borderRadius: "12px",
42+
background: "linear-gradient(135deg, #22c55e, #16a34a)",
43+
display: "flex",
44+
alignItems: "center",
45+
justifyContent: "center",
46+
fontSize: "28px",
47+
}}
48+
>
49+
50+
</div>
51+
<span
52+
style={{
53+
fontSize: "56px",
54+
fontWeight: 700,
55+
color: "#ffffff",
56+
letterSpacing: "-1px",
57+
}}
58+
>
59+
PingDiff
60+
</span>
61+
</div>
62+
63+
{/* Tagline */}
64+
<div
65+
style={{
66+
fontSize: "28px",
67+
color: "#a1a1aa",
68+
marginBottom: "48px",
69+
textAlign: "center",
70+
}}
71+
>
72+
Know Your Connection Before You Queue
73+
</div>
74+
75+
{/* Stats row */}
76+
<div
77+
style={{
78+
display: "flex",
79+
gap: "48px",
80+
}}
81+
>
82+
<div
83+
style={{
84+
display: "flex",
85+
flexDirection: "column",
86+
alignItems: "center",
87+
padding: "24px 40px",
88+
background: "rgba(255,255,255,0.05)",
89+
borderRadius: "16px",
90+
border: "1px solid rgba(255,255,255,0.1)",
91+
}}
92+
>
93+
<span style={{ fontSize: "40px", fontWeight: 700, color: "#22c55e" }}>9</span>
94+
<span style={{ fontSize: "18px", color: "#a1a1aa", marginTop: "4px" }}>Games</span>
95+
</div>
96+
<div
97+
style={{
98+
display: "flex",
99+
flexDirection: "column",
100+
alignItems: "center",
101+
padding: "24px 40px",
102+
background: "rgba(255,255,255,0.05)",
103+
borderRadius: "16px",
104+
border: "1px solid rgba(255,255,255,0.1)",
105+
}}
106+
>
107+
<span style={{ fontSize: "40px", fontWeight: 700, color: "#22c55e" }}>141</span>
108+
<span style={{ fontSize: "18px", color: "#a1a1aa", marginTop: "4px" }}>Servers</span>
109+
</div>
110+
<div
111+
style={{
112+
display: "flex",
113+
flexDirection: "column",
114+
alignItems: "center",
115+
padding: "24px 40px",
116+
background: "rgba(255,255,255,0.05)",
117+
borderRadius: "16px",
118+
border: "1px solid rgba(255,255,255,0.1)",
119+
}}
120+
>
121+
<span style={{ fontSize: "40px", fontWeight: 700, color: "#22c55e" }}>Free</span>
122+
<span style={{ fontSize: "18px", color: "#a1a1aa", marginTop: "4px" }}>Forever</span>
123+
</div>
124+
</div>
125+
126+
{/* URL */}
127+
<div
128+
style={{
129+
position: "absolute",
130+
bottom: "32px",
131+
fontSize: "20px",
132+
color: "#52525b",
133+
}}
134+
>
135+
pingdiff.com
136+
</div>
137+
</div>
138+
),
139+
{
140+
...size,
141+
},
142+
);
143+
}

0 commit comments

Comments
 (0)