Skip to content
Closed
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
40 changes: 40 additions & 0 deletions web/public/llms.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# PingDiff

> Test your ping, packet loss, and jitter to game servers before you queue. Know your connection. Win more games.

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.

## Key Facts

- **Supported Games (9):** Valorant, CS2, Overwatch 2, Call of Duty, Apex Legends, Fortnite, League of Legends, Battlefield 6, Marvel Rivals
- **Server Coverage:** 141 servers across EU, NA, Asia, South America, and Middle East
- **Platforms:** Web app (pingdiff.com) + Windows desktop app
- **Tech Stack:** Next.js (web), Python/Tkinter (desktop), TypeScript, Tailwind CSS
- **License:** MIT β€” 100% free and open source
- **Privacy:** No tracking by default. Optional anonymous data sharing for community insights.

## Links

- Website: https://pingdiff.com
- Download Desktop App: https://pingdiff.com/download
- Dashboard: https://pingdiff.com/dashboard
- GitHub: https://github.com/bokiko/pingdiff

## How It Works

1. Select a game from the supported list
2. PingDiff tests your connection to real game server IPs
3. Get results showing ping (latency), packet loss, and jitter
4. See which server region gives you the best connection
5. Optionally share anonymous results to help the community

## FAQ

### How do I test my ping before playing?
PingDiff tests real game server IPs using ICMP ping. Select your game, pick a region, and get instant results β€” no game launch required.

### Is PingDiff free?
Yes, 100% free and open source under the MIT license. No ads, no premium tiers.

### What data does PingDiff collect?
None by default. You can optionally share anonymous ping data to help build community connection insights.
62 changes: 55 additions & 7 deletions web/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export const metadata: Metadata = {
type: "website",
images: [
{
url: "/og-image.svg",
url: "/opengraph-image",
width: 1200,
height: 630,
alt: "PingDiff - Know Your Connection Before You Queue",
Expand All @@ -39,7 +39,9 @@ export const metadata: Metadata = {
card: "summary_large_image",
title: "PingDiff - Know Your Connection Before You Queue",
description: "Test your ping to game servers without launching the game.",
images: ["/og-image.svg"],
images: ["/opengraph-image"],
site: "@pingdiff",
creator: "@pingdiff",
},
robots: {
index: true,
Expand Down Expand Up @@ -71,11 +73,53 @@ const jsonLd = {
price: "0",
priceCurrency: "USD",
},
aggregateRating: {
"@type": "AggregateRating",
ratingValue: "5",
ratingCount: "100",
},
};

const faqJsonLd = {
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: [
{
"@type": "Question",
name: "How do I test my ping before playing?",
acceptedAnswer: {
"@type": "Answer",
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.",
},
},
{
"@type": "Question",
name: "What games does PingDiff support?",
acceptedAnswer: {
"@type": "Answer",
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.",
},
},
{
"@type": "Question",
name: "Is PingDiff free?",
acceptedAnswer: {
"@type": "Answer",
text: "Yes, PingDiff is 100% free and open source under the MIT license. There are no ads, no premium tiers, and no hidden costs.",
},
},
{
"@type": "Question",
name: "Does PingDiff track my data?",
acceptedAnswer: {
"@type": "Answer",
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.",
},
},
{
"@type": "Question",
name: "What regions can I test?",
acceptedAnswer: {
"@type": "Answer",
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.",
},
},
],
};

export default function RootLayout({
Expand All @@ -90,6 +134,10 @@ export default function RootLayout({
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqJsonLd) }}
/>
</head>
<body className={`${inter.className} antialiased bg-zinc-950 text-white min-h-screen`}>
{children}
Expand Down
143 changes: 143 additions & 0 deletions web/src/app/opengraph-image.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import { ImageResponse } from "next/og";

export const runtime = "edge";

export const alt = "PingDiff - Know Your Connection Before You Queue";
export const size = {
width: 1200,
height: 630,
};
export const contentType = "image/png";

export default function Image() {
return new ImageResponse(
(
<div
style={{
background: "linear-gradient(135deg, #09090b 0%, #18181b 50%, #09090b 100%)",
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
fontFamily: "Inter, sans-serif",
padding: "60px",
}}
>
{/* Logo / Title */}
<div
style={{
display: "flex",
alignItems: "center",
gap: "16px",
marginBottom: "24px",
}}
>
<div
style={{
width: "56px",
height: "56px",
borderRadius: "12px",
background: "linear-gradient(135deg, #22c55e, #16a34a)",
display: "flex",
alignItems: "center",
justifyContent: "center",
fontSize: "28px",
}}
>
⚑
</div>
<span
style={{
fontSize: "56px",
fontWeight: 700,
color: "#ffffff",
letterSpacing: "-1px",
}}
>
PingDiff
</span>
</div>

{/* Tagline */}
<div
style={{
fontSize: "28px",
color: "#a1a1aa",
marginBottom: "48px",
textAlign: "center",
}}
>
Know Your Connection Before You Queue
</div>

{/* Stats row */}
<div
style={{
display: "flex",
gap: "48px",
}}
>
<div
style={{
display: "flex",
flexDirection: "column",
alignItems: "center",
padding: "24px 40px",
background: "rgba(255,255,255,0.05)",
borderRadius: "16px",
border: "1px solid rgba(255,255,255,0.1)",
}}
>
<span style={{ fontSize: "40px", fontWeight: 700, color: "#22c55e" }}>9</span>
<span style={{ fontSize: "18px", color: "#a1a1aa", marginTop: "4px" }}>Games</span>
</div>
<div
style={{
display: "flex",
flexDirection: "column",
alignItems: "center",
padding: "24px 40px",
background: "rgba(255,255,255,0.05)",
borderRadius: "16px",
border: "1px solid rgba(255,255,255,0.1)",
}}
>
<span style={{ fontSize: "40px", fontWeight: 700, color: "#22c55e" }}>141</span>
<span style={{ fontSize: "18px", color: "#a1a1aa", marginTop: "4px" }}>Servers</span>
</div>
<div
style={{
display: "flex",
flexDirection: "column",
alignItems: "center",
padding: "24px 40px",
background: "rgba(255,255,255,0.05)",
borderRadius: "16px",
border: "1px solid rgba(255,255,255,0.1)",
}}
>
<span style={{ fontSize: "40px", fontWeight: 700, color: "#22c55e" }}>Free</span>
<span style={{ fontSize: "18px", color: "#a1a1aa", marginTop: "4px" }}>Forever</span>
</div>
</div>

{/* URL */}
<div
style={{
position: "absolute",
bottom: "32px",
fontSize: "20px",
color: "#52525b",
}}
>
pingdiff.com
</div>
</div>
),
{
...size,
},
);
}
27 changes: 22 additions & 5 deletions web/src/app/robots.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,28 @@ import { MetadataRoute } from 'next';

export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: '*',
allow: '/',
disallow: ['/api/'],
},
rules: [
{
userAgent: '*',
allow: '/',
disallow: ['/api/'],
},
{
userAgent: [
'GPTBot',
'ClaudeBot',
'PerplexityBot',
'Google-Extended',
'Amazonbot',
'Applebot-Extended',
'Bytespider',
'CCBot',
'FacebookExternalHit',
],
allow: '/',
disallow: ['/api/'],
},
],
sitemap: 'https://pingdiff.com/sitemap.xml',
};
}
Loading