Speedtest Tracker: Monitor Your Internet Speed Over Time
Speedtest Tracker runs automated internet speed tests on a schedule and graphs the results over time. Instead of occasionally running a speed test when things feel slow, you get a continuous record of your connection's actual performance — useful for catching ISP issues, verifying you're getting what you pay for, and correlating slowdowns with specific times of day.
Why Track Speed?
A single speed test tells you very little. Your internet speed varies by:
- Time of day — Peak hours (7-11 PM) typically show congestion
- Day of week — Weekends may differ from weekdays
- ISP throttling — Some ISPs throttle during heavy usage periods
- Network issues — Routing problems, peering disputes, local outages
- Your own network — Other devices consuming bandwidth
Historical data turns complaints to your ISP from "my internet feels slow" into "my download speed has dropped 40% during evening hours for the past two weeks, here's the graph."
Installation
# docker-compose.yml
services:
speedtest:
image: lscr.io/linuxserver/speedtest-tracker:latest
container_name: speedtest
ports:
- "8765:80"
volumes:
- speedtest_data:/config
environment:
- PUID=1000
- PGID=1000
- TZ=America/Los_Angeles
- DB_CONNECTION=sqlite
- SPEEDTEST_SCHEDULE="0 */4 * * *"
- DISPLAY_TIMEZONE=America/Los_Angeles
restart: unless-stopped
volumes:
speedtest_data:
docker compose up -d
Access the dashboard at http://your-server:8765. Default login is [email protected] / password — change this immediately.
Configuration
Test Schedule
The SPEEDTEST_SCHEDULE environment variable accepts cron expressions:
0 */4 * * *— Every 4 hours (recommended starting point)0 */1 * * *— Every hour (more data, more bandwidth used)0 6,12,18,0 * * *— Four specific times daily*/30 * * * *— Every 30 minutes (aggressive; uses ~2 GB/month)
Each test consumes roughly 100-500 MB of bandwidth depending on your speed. On metered connections, keep the frequency low.
Speedtest Server Selection
By default, Speedtest Tracker auto-selects the nearest Ookla server. You can pin a specific server for consistent results:
- Find your preferred server ID at speedtest.net/speedtest-servers
- Set
SPEEDTEST_SERVERSenvironment variable to the server ID
Pinning a server eliminates variability from server selection, making your historical comparisons more meaningful.
Thresholds and Alerts
Configure alert thresholds in the web UI under Settings → Notifications:
- Download threshold — Alert when download speed drops below X Mbps
- Upload threshold — Alert when upload speed drops below X Mbps
- Latency threshold — Alert when ping exceeds X ms
Alerts can be sent via:
- Telegram
- Discord webhook
- Slack webhook
- Custom webhook
Database Options
SQLite works fine for personal use. For multi-year data retention or heavy querying:
environment:
- DB_CONNECTION=mysql
- DB_HOST=mariadb
- DB_PORT=3306
- DB_DATABASE=speedtest
- DB_USERNAME=speedtest
- DB_PASSWORD=your-password
Reading Your Data
The Dashboard
The main dashboard shows:
- Latest result — Current download, upload, and ping
- Trend graphs — Speed over time (24h, 7d, 30d views)
- Averages — Mean speeds over different time periods
- Jitter — Connection stability metric
What to Look For
Consistent speed drops at specific times — ISP congestion. Common during 7-11 PM in residential areas. If your 500 Mbps plan drops to 100 Mbps every evening, you have evidence for your ISP.
Gradual degradation over weeks — Could indicate network equipment issues, ISP routing changes, or infrastructure problems. Check if it correlates with your modem/router uptime.
Sudden permanent drop — ISP plan change, hardware failure, or configuration issue. Check your modem's signal levels (SNR, power levels) for cable connections.
High jitter with normal speeds — Often indicates WiFi interference, network congestion, or bufferbloat. Try testing with a wired connection to isolate.
Upload much worse than download — Normal for most consumer connections (asymmetric). But if upload drops disproportionately, it may indicate upstream channel issues.
Exporting Data
Speedtest Tracker supports CSV export from the web UI. Useful for:
- Providing evidence to your ISP
- Analyzing trends in a spreadsheet
- Backing up your data
Network Placement
Where you run Speedtest Tracker matters:
Wired Connection (Best)
Run it on a server with a direct ethernet connection to your router. This measures your actual internet speed without WiFi variables.
WiFi Connection
Tests include WiFi performance, which may be useful if most of your devices use WiFi, but makes it harder to isolate ISP issues vs. local network issues.
Behind a VPN
If your server routes through a VPN, speed tests measure VPN performance, not raw internet speed. Run tests on a non-VPN interface or use split tunneling.
Complementary Tools
Smokeping
While Speedtest Tracker measures throughput, Smokeping monitors latency continuously:
- Speedtest Tracker — "Am I getting the bandwidth I pay for?"
- Smokeping — "Is my connection stable and responsive?"
Together, they give a complete picture of your internet health.
Grafana Integration
For advanced visualization, export Speedtest Tracker data to Grafana via its API or database:
SELECT created_at, download, upload, ping
FROM speedtest_results
ORDER BY created_at DESC;
Bandwidth Considerations
Rough monthly bandwidth usage by test frequency:
| Frequency | Tests/Month | ~Bandwidth Used |
|---|---|---|
| Every 4h | 180 | 18-90 GB |
| Every 2h | 360 | 36-180 GB |
| Every 1h | 720 | 72-360 GB |
| Every 30m | 1440 | 144-720 GB |
The range depends on your connection speed — faster connections transfer more data per test. On a capped plan, stick with every 4-6 hours.
Verdict
Speedtest Tracker is a low-effort, high-value addition to any self-hosted setup. A single Docker container, a few MB of RAM, and you have a permanent record of your internet performance. The data pays for itself the first time you need to call your ISP about speed issues — "my connection drops to 30% of its advertised speed every evening between 8 and 10 PM" is a much more effective complaint than "it's slow sometimes."
Start with tests every 4 hours and adjust based on how much detail you need and how much bandwidth you can spare.