Test your real-world international internet speed
π Try it live β’ π Learn More
Most internet speed tests use nearby servers to show you optimal speeds - but that's not how you actually use the internet. SpeedCheck measures your real-world international connectivity by testing your connection to a server in Amsterdam, Netherlands.
Feature | SpeedCheck | Traditional Speed Tests |
---|---|---|
Server Location | Amsterdam, Netherlands (Fixed) | Automatically selects nearest server |
What It Measures | Real international performance | Idealized local network speed |
Use Case | Streaming European content, international browsing, video calls abroad | Local network capacity testing |
Distance Impact | Reflects actual routing and latency | Minimizes distance to show best case |
Real-World Accuracy | Shows speeds you'll actually experience for global content | Shows theoretical maximum speeds |
β Use SpeedCheck when:
- You want to know your actual speed to European servers
- You're troubleshooting international streaming (Netflix, BBC iPlayer, sports streams)
- You need to understand your latency for international video conferencing
- You're curious about undersea cable and intercontinental routing performance
β Use traditional speed tests when:
- You want to test your ISP's maximum local bandwidth
- You're troubleshooting issues with your local network equipment
- You need to verify you're getting the speeds promised by your ISP contract
Our server is hosted in Amsterdam, Netherlands - a major internet hub with excellent global connectivity. Testing to a fixed European location provides:
- Consistent baseline for comparing results over time
- Real-world international routing through undersea cables and continental networks
- Meaningful metrics for accessing global content hosted in Europe or routed through European CDNs
- Distance-based performance that reflects actual usage patterns for international content
Physical Reality: Internet signals don't travel instantly. Light moves at 300,000 km/s, but internet data travels slower through fiber optic cables. Distance creates unavoidable latency - SpeedCheck shows you this reality.
How fast you can receive data from European servers. Important for streaming video, downloading files, and loading web pages hosted internationally.
How fast you can send data to European servers. Critical for video conferencing, uploading files to cloud storage, and online gaming.
The round-trip time for a signal to reach Amsterdam and return. Lower is better. Physics limits this based on distance - expect 150-300ms from Africa, 100-200ms from Middle East, 10-50ms from Europe.
How consistent your connection is. Lower is better. High jitter causes stuttering in video calls and unstable streaming. Good connections have jitter under 20ms.
Real-time Updates - Live gauge and metrics during test
- π― Progress Indicators - Animated border progress on each measurement phase
- π± Mobile Responsive - Seamless experience on all devices
- π Dark/Light Theme - System preference detection with manual toggle
- π¨ Pure CSS Gauge - 270Β° arc progress indicator (no chart libraries)
- π Comprehensive Metrics - Download, Upload, Latency, Jitter
- βοΈ Configurable Tests - Adjust parallel connections and test duration
- π Secure & Private - No data logging, no tracking, no analytics
- π² PWA Support - Add to Home Screen capability with proper icons
- π Comprehensive Guide - /learn page explaining concepts
- π Real-world Examples - Kenya, Brazil cases showing local vs international speeds
- π Glossary - All networking terms explained
- π‘ Why Amsterdam - Understanding server location impact
- π’ Mbps vs MB/s - Unit conversion guide
- π Zero Dependencies - Pure vanilla JavaScript, no frameworks
- π¦ Minimal Bundle - Fast loading, efficient code
- βΏ Accessible - WCAG compliant, keyboard navigation
- π SEO Optimized - Open Graph, JSON-LD, sitemap.xml
- π Custom 404 - Helpful error page with navigation
- π¨ Multi-format Icons - SVG + PNG fallbacks for maximum compatibility
Optimized Routing - Express static middleware for clean URLs
internet_speed_test/
βββ frontend/ # Frontend web application
β βββ index.html # Main speed test interface
β βββ learn.html # Educational content page
β βββ 404.html # Custom error page
β βββ main.js # Speed test logic & UI management
β βββ main.css # Complete styling with theme support
β βββ server.js # Express static server with 404 handling
β βββ package.json # Frontend dependencies
β βββ site.webmanifest # PWA manifest for Add to Home Screen
β βββ favicon.svg # Scalable site icon (Lucide zap)
β βββ favicon-192x192.png # PWA icon (Android/Chrome)
β βββ favicon-512x512.png # PWA icon (high-res devices)
β βββ sitemap.xml # SEO sitemap
β βββ robots.txt # Search engine directives
βββ backend/ # API server
βββ server.js # Express server with API endpoints
βββ package.json # Backend dependencies & scripts
- Pure HTML/CSS/JavaScript - Zero frameworks, fast loading, minimal bundle
- CSS Conic Gradient Gauge - 270Β° arc progress indicator with real-time updates
- Progress Border Animation - Real-time requestAnimationFrame-driven border progress
- Multi-threaded Testing - Parallel connections for accurate speed measurement
- Responsive Design - Mobile-first approach with breakpoints
- Lucide Icons - Clean, modern SVG iconography
- Theme Support - Dark/light mode with system preference detection
- PWA Manifest - Add to Home Screen with multiple icon formats (SVG + PNG)
- SEO Optimized - Open Graph, JSON-LD structured data, sitemap
- Node.js + Express 5.1.0 - Lightweight REST API
- Railway Hosting - Deployed in Amsterdam, Netherlands (fixed location)
- Security Middleware - Helmet.js, CORS, compression
- Efficient Binary Transfer - Uncompressed data streams for accurate testing
- Rate Limiting - Protection against abuse
- Health Monitoring -
/health
endpoint for uptime checks
-
GET /api/ping
- Single ping round-trip time measurement- Returns:
{ latency: number }
in milliseconds
- Returns:
-
POST /api/ping-batch
- Multiple pings for jitter calculation- Body:
{ count: number }
(default: 10) - Returns:
{ latencies: number[], jitter: number }
- Body:
-
GET /api/download
- Download speed test- Query:
?size=<MB>
(default: 10MB, max: 50MB) - Returns: Binary data stream (uncompressed for accuracy)
- CORS: Enabled for browser testing
- Query:
-
POST /api/upload
- Upload speed test- Body: Binary data stream
- Returns:
{ receivedBytes: number, duration: number }
- Note: Uses streaming for memory efficiency
-
GET /api/info
- Server information- Returns:
{ location, provider, region, timestamp }
- Returns:
-
GET /health
- Health check endpoint- Returns:
{ status: 'healthy', uptime: number }
- Returns:
This application uses a split deployment on Railway with two separate services:
- URL: https://speed-test.up.railway.app/
- Type: Express.js static file server with 404 handling
- Port: 8080
- Files: HTML, CSS, JS, assets
- Purpose: User interface and client-side logic
- Features: Custom 404 error page, clean URL routing
- URL: https://speed-test-backend.up.railway.app/
- Type: Node.js Express server
- Port: 3000
- Location: Amsterdam, Netherlands (fixed)
- Purpose: Speed test API endpoints
Both services are deployed from the same repository with automatic deployments on push to main
branch.
Create two services in your Railway project:
Frontend Service:
# Build Command:
cd frontend && npm install
# Start Command:
cd frontend && npm start
# Root Directory: /
# Watch Paths: frontend/**
Backend Service:
# Build Command:
cd backend && npm install
# Start Command:
cd backend && npm start
# Root Directory: /
# Watch Paths: backend/**
Variable | Description | Default |
---|---|---|
PORT |
Server port | 3000 |
NODE_ENV |
Environment mode | development |
SERVER_LOCATION |
Server region label | Amsterdam, Netherlands |
CORS_ORIGIN |
Allowed CORS origins | * |
MAX_DOWNLOAD_SIZE_MB |
Maximum download test size | 50 |
MAX_UPLOAD_SIZE_MB |
Maximum upload test size | 50 |
ENABLE_RATE_LIMIT |
Enable rate limiting | true |
- Node.js 18+ and npm
- Git
# Clone the repository
git clone https://github.com/ny-collins/internet_speed_test.git
cd internet_speed_test
# Install backend dependencies
cd backend
npm install
# Install frontend dependencies
cd ../frontend
npm install
Backend (Terminal 1):
cd backend
npm run dev # Starts on http://localhost:3000
Frontend (Terminal 2):
cd frontend
npm start # Starts on http://localhost:8080
# Access at http://localhost:8080
Local speed tests will show unrealistic results! If you test against localhost
, you'll see speeds of 1000+ Mbps because:
- β No network distance - Data doesn't leave your computer
- β No routing overhead - Bypasses all internet infrastructure
- β No ISP involvement - No real internet connection
- β Perfect conditions - Not representative of actual performance
For accurate measurements, always test against the live deployment. The value of this tool is measuring real international connectivity.
- Make changes to frontend or backend code
- Test locally for UI/UX and functionality
- Test speed measurements against live deployment
- Commit and push to trigger automatic Railway deployment
This project demonstrates real-world internet concepts:
- Internet Geography - Distance matters; signals can't travel faster than physics allows
- Network Routing - Connection quality depends on multiple hops, undersea cables, and ISP routing
- CDN Reality - Content hosted far away will always be slower than local content
- Real-world Performance - Benchmarks with nearby servers don't reflect actual usage
- Latency vs Bandwidth - High bandwidth doesn't help if latency is high (critical for gaming/calls)
- Network Congestion - Time of day and routing affects international speeds
- Jitter & Stability - Consistent connections matter more than peak speeds for real-time apps
- β Test if your connection can handle 4K streaming from European services
- β Troubleshoot international video conference quality
- β Understand why European websites feel slower than local ones
- β Compare your actual international speeds with ISP promises
- π» Learn multi-threaded speed testing implementation
- π» Study responsive web design patterns
- π» Understand internet routing and latency concepts
- π» See pure CSS gauge implementation without dependencies
- π§ Baseline international routing performance
- π§ Debug ISP peering and routing issues
- π§ Measure undersea cable capacity impact
- π§ Analyze time-of-day congestion patterns
Contributions are welcome! Areas for improvement:
- π¨ UI/UX improvements - Better visualizations, animations
- π Educational content - More examples, diagrams, explanations
Performance optimizations - Faster loading, better caching
- βΏ Accessibility - Screen reader support, keyboard navigation
- π Internationalization - Multi-language support
- π Documentation - Better guides, API docs, tutorials
- π§ͺ Testing - Unit tests, integration tests
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Test your changes locally
- Verify speed measurements against live deployment (not localhost)
- Commit with clear messages (
git commit -m 'Add amazing feature'
) - Push to your branch (
git push origin feature/amazing-feature
) - Open a Pull Request
- Use consistent formatting (2 spaces, semicolons)
- Keep comments minimal (section markers only)
- Self-documenting code preferred
- Test on multiple browsers/devices
- π¨ Added PWA support with multi-format icons (SVG + PNG fallbacks)
Optimized Express routing (removed redundant explicit routes)
- π Fixed sitemap.xml (removed 404.html for better SEO)
- π§Ή Applied DRY principle to theme icon updates
- πΈ Added learn page screenshot to documentation
- ποΈ Removed redundant files for better organization
- β¨ Added comprehensive
/learn
educational page - π― Real-time progress border animations during measurements
- π¨ Refined favicon matching header icon
- π§Ή Complete code cleanup (removed verbose comments)
- π Custom 404 error page
- π Enhanced README with technical documentation
- π Improved SEO with updated sitemap
- π Dark/light theme toggle
- π Enhanced gauge visualization
- βοΈ Configurable test settings
- π± Mobile responsive improvements
Initial release
- π― Core speed testing functionality
- π¨ Pure CSS gauge
- π Basic metrics display
This project is licensed under the MIT License - see the LICENSE file for details.
- Understanding Internet Routing
- How Undersea Cables Work
- Content Delivery Networks Explained
- Latency vs Bandwidth
Made with to show real internet performance, not just marketing numbers.