Measure real round-trip latency from your browser to 311 regions across 15 cloud providers β no installs, no sign-ups, completely free.
π Live demo: letmefind.github.io/CloudPingTest
CloudPing sends image-beacon pings from your browser to public endpoints of every selected cloud region and measures the actual round-trip time using performance.now(). Results update live as each round completes.
Supported providers (311 regions total):
| Provider | Regions | Provider | Regions |
|---|---|---|---|
| AWS | 35 | Oracle Cloud | 41 |
| Azure | 46 | OVHcloud | 11 |
| GCP | 42 | Scaleway | 3 |
| Vultr | 32 | Hetzner | 6 |
| Linode (Akamai) | 25 | IBM Cloud | 10 |
| Gcore | 20 | CoreWeave | 3 |
| DigitalOcean | 9 | servers.com | 16 |
| Contabo | 12 |
- β‘ Live latency measurements β ping starts immediately, results update every round
- ποΈ Configurable rounds β set 1, 3, 5, 10, 20, 50, or β rounds before starting (default: 5)
- π Full statistics β Median Β· Mean Β· Min Β· Max Β· Jitter per region
- π Live podium β top 3 fastest regions with medals, updated every round
- π Sparkline history β mini chart showing latency trend per region
- π Filter & sort β search regions by name/code, click any column to sort
- π₯ CSV export β download all results as a spreadsheet
- π¨ Claude-inspired design β warm light/dark themes, serif typography, micro-animations
- π 3D cinematic hero β radar sweep, parallax layers, mouse-tracking card tilt
- π 13 languages β including full RTL support for Persian (ΩΨ§Ψ±Ψ³Ϋ) and Arabic (Ψ§ΩΨΉΨ±Ψ¨ΩΨ©)
- βΏ Accessible β ARIA roles, keyboard navigation, focus indicators,
prefers-reduced-motion - π± Mobile-friendly β responsive down to 375px
- π§ Smart Analysis engine β asks questions about your results and gets intelligent answers
- π IP geolocation β detects your city, country and ISP automatically
- π‘ Personalized recommendations β best regions for your connection, provider rankings, jitter analysis
- π€ Optional Claude 3.5 Sonnet upgrade β add your own Anthropic API key for deeper AI analysis
- πΎ localStorage β saves selected providers, theme, sort order, rounds, and language preference
- π API key stays local β Claude API key is stored only in your browser, never sent to any server
Light mode β home
Dark mode β live results with podium
Light mode β test running
ΩΨ§Ψ±Ψ³Ϋ (Persian RTL)
The classic image-beacon technique:
- A tiny resource is loaded from each region's public URL (e.g.
https://s3.amazonaws.com/) performance.now()measures the round-trip time in milliseconds- A warm-up round (discarded) establishes DNS/TLS before measurements begin
- Results are collected and statistics computed after each round
Pure HTML/CSS/JS β any static server works:
# Python
python3 -m http.server 8000
# open http://localhost:8000
# Node.js
npx serve .
# VS Code
# Install "Live Server" extension β click "Go Live"- Fork this repository
- Go to Settings β Pages
- Set source to Deploy from a branch β
master/root - Your site will be live at
https://YOUR-USERNAME.github.io/CloudPingTest/
Upload all files as-is to Netlify, Vercel, Cloudflare Pages, or any CDN. No build step required.
The Smart Analysis feature uses ipgeolocation.io as the primary geolocation source (especially important for users in Iran and regions where other free APIs are blocked).
The API key in assets/app.js is a free-tier key that may hit rate limits under heavy use. To use your own key:
- Sign up free at app.ipgeolocation.io
- Copy your API key
- In
assets/app.js, find thedetectUserGeofunction and replace the key in this line:
"https://api.ipgeolocation.io/ipgeo?apiKey=YOUR_KEY_HERE",Users can optionally enable Claude AI analysis from within the UI:
- Open the Smart Analysis panel
- Click "Upgrade to Claude 3.5 Sonnet (optional)"
- Enter a valid Anthropic API key
- Click Save β the key is stored locally in the browser
β οΈ The Anthropic API is called directly from the user's browser. The user's key is never sent to any server other than Anthropic's own API.
CloudPingTest/
βββ index.html # Single-page app (all UI markup)
βββ assets/
β βββ styles.css # Design system + 3D effects + RTL support
β βββ app.js # All app logic (ping engine, UI, Smart Analysis)
β βββ data.js # All 311 regions + endpoints (extracted from PHP sources)
β βββ i18n.js # 13-language translations
βββ favicon.svg
βββ *.php # Original PHP files (kept for reference / endpoint catalog)
βββ README.md
| Layer | Technology |
|---|---|
| UI framework | Vanilla HTML / CSS / JS (zero dependencies) |
| Fonts | Source Serif 4 Β· Vazirmatn (Persian/Arabic) |
| AI | Anthropic Claude 3.5 Sonnet (optional, user key) |
| Geolocation | ipgeolocation.io Β· ipwho.is Β· freeipapi.com (fallbacks) |
| Hosting | GitHub Pages |
| Build | None β edit files, push, done |
All data lives in one file: assets/data.js
Open assets/data.js, find the provider block, and add one line to its regions array:
{ text1: "Middle East", text2: "Riyadh", code: "me-central-2" }| Field | What to put |
|---|---|
text1 |
Geographic group: "Europe", "Asia Pacific", "Middle East", "US East", etc. |
text2 |
City / location name shown in the results table |
code |
Region identifier exactly as the provider uses it |
Append a new object to the PROVIDERS array:
{
id: "myprovider", // unique, lowercase, no spaces
name: "MyProvider", // short label shown on the provider card
longName: "My Provider Full Name", // shown in tooltips
color: "#FF0000", // brand hex color
url: r => `https://ping.${r.code}.myprovider.com/ping`, // ping URL builder
regions: [
{ text1: "Europe", text2: "Amsterdam", code: "ams1" },
{ text1: "US East", text2: "New York", code: "nyc1" },
]
}The app loads any URL as an image beacon β it just needs to respond (even HTTP 404 counts). Test a URL in your browser console before adding it:
const start = performance.now();
const img = new Image();
img.onload = img.onerror = () =>
console.log("RTT:", Math.round(performance.now() - start), "ms");
img.src = "https://YOUR-ENDPOINT?" + Date.now();β
Got a number in ms β URL works
β Hangs or CORS error β try a different endpoint
Known patterns for popular providers:
// AWS
r => `https://ec2.${r.code}.amazonaws.com/ping`
// Azure Blob Storage
r => `https://s8${r.code}.blob.core.windows.net/public/latency-test.json`
// GCP (varies by region slug)
r => `https://storage.googleapis.com/${r.code}/generate_204`
// DigitalOcean Spaces
r => `https://${r.code}.digitaloceanspaces.com`
// Vultr Object Storage
r => `https://${r.code}.vultrobjects.com`
// Hetzner
r => `https://speed.${r.code}.hetzner.com/.ping`
// Linode Object Storage
r => `https://${r.code}.linodeobjects.com`
// Oracle Cloud
r => `https://objectstorage.${r.code}.oraclecloud.com/`If each region has its own unique URL, store it directly in the region object:
url: r => r.endpoint, // reads from the region entry itself
regions: [
{ text1: "Europe", text2: "Amsterdam", code: "ams1",
endpoint: "https://ams1.myprovider.com/ping" },
]Bump the cache-buster in index.html so browsers pick up the change:
<!-- change v=7 β v=8 (any higher number) -->
<script src="assets/data.js?v=7"></script>Then commit & push β GitHub Pages deploys automatically.
For a longer reference with all URL patterns and a checklist, see CONTRIBUTING.md.
- Original project, region catalog & endpoints: VarunAgw/CloudPingTest β please consider donating to support the original work.
- Modern redesign: rebuilt as a static SPA with Claude-inspired design, 3D effects, Smart Analysis and multi-language support.
This fork inherits the license of the original project. Check the upstream repository for license details.



