A self-hosted internet speed tracker for monitoring ISP performance.
Zepeed is a powerful speedtest aggregator and monitor built with Laravel 13, Inertia.js, and Vue 3. It allows you to schedule and run speedtests using multiple providers like Speedtest Ookla, LibreSpeed, and Fast.com, providing a unified dashboard for monitoring your network performance.
- Multiple Providers: Support for Speedtest Ookla, LibreSpeed, Cloudflare, and Fast.com.
- Scheduled Runs: Automated speedtests with customizable schedules.
- Customizable Templates: Create and manage your own speedtest templates email notifications.
- Maintenance Windows: Define periods where tests should be paused or restricted.
- Manual Triggers: Run speedtests on demand from the dashboard.
- Real-time Notifications: Get notified of run successes or failures via Inertia notifications.
- Modern Stack: Built with Laravel 12, Vue 3, shadcn/vue, and Tailwind CSS v4.
- Webhooks: Integrate with your favorite services for real-time notifications.
- Prometheus Integration: Expose a
/metricsscrape endpoint for monitoring with Prometheus and Grafana. - Email Services: Send speedtest results via SMTP, Mailgun, Postmark, AWS SES, and more.
- Ping Test: Check the latency of your internet connection.
- MCP Server: AI-ready Model Context Protocol server for querying monitoring data programmatically.
- Backend: Laravel 13, Fortify, Inertia.js (Laravel adapter)
- Frontend: Vue 3, shadcn/vue (reka-ui), Tailwind CSS v4
- Tooling: Vite, TypeScript, ESLint, Prettier, Pint, PHPStan, Rector
- Extras: Mailpit, Soketi/Reverb-ready scripts
- PHP 8.4+
- Composer
- Bun
- Docker Desktop or Orbstack
We welcome contributions! Please follow these steps:
- Fork and Clone: Fork the repository and clone it to your local machine.
- Setup Environment: Follow the Quick start instructions.
- Create a Branch: Create a feature branch for your changes (
git checkout -b feature/amazing-feature). - Code Standards: Ensure your code follows the project's standards by running:
composer run format # Fixes Pint, Prettier, and ESLint issues composer run analyse # Runs PHPStan static analysis composer run rector # Applies Rector refactorings
- Test: Make sure all tests pass before submitting:
composer run test - Submit PR: Push your branch and create a Pull Request with a clear description of your changes.
composer run format # Pint + Prettier + ESLint
composer run analyse # PHPStan
composer run test # PHPUnit
composer run test:mcp # MCP tests
composer run rector # Rector fixesZepeed exposes an MCP (Model Context Protocol) server at /mcp/zepeed that AI tools like Claude, Cursor, and GitHub Copilot can connect to. All tools require a Sanctum API token for authentication.
Log in to the Zepeed web UI and navigate to Settings → API Tokens (or the token management page). Create a new token with a descriptive name like "mcp" and copy the generated token — you'll need it to configure your AI client below.
Choose your AI tool and add the Zepeed MCP server configuration:
Open Claude → Settings → Developer → Edit Config, and add:
{
"mcpServers": {
"zepeed": {
"type": "url",
"url": "http://localhost:8000/mcp/zepeed",
"headers": {
"Authorization": "Bearer YOUR_TOKEN_HERE"
}
}
}
}Restart Claude. You can now ask things like "What version of Zepeed is running?" — Claude will call the GetAppVersion tool automatically.
Create or edit .cursor/mcp.json in your project root:
{
"mcpServers": {
"zepeed": {
"type": "url",
"url": "http://localhost:8000/mcp/zepeed",
"headers": {
"Authorization": "Bearer YOUR_TOKEN_HERE"
}
}
}
}Cursor will pick up the config on next launch. Open the Cursor AI panel and try: "Use the Zepeed MCP to check the app version."
Create .vscode/mcp.json in your workspace:
{
"servers": {
"zepeed": {
"type": "url",
"url": "http://localhost:8000/mcp/zepeed",
"headers": {
"Authorization": "Bearer YOUR_TOKEN_HERE"
}
}
}
}Restart VS Code and ask Copilot: "What tools does the Zepeed MCP server expose?"
Add to your ~/.continue/config.json:
{
"experimental": {
"mcpServers": {
"zepeed": {
"type": "url",
"url": "http://localhost:8000/mcp/zepeed",
"headers": {
"Authorization": "Bearer YOUR_TOKEN_HERE"
}
}
}
}
}Once connected, your AI can query Zepeed data using natural language:
| Prompt | Tool Called |
|---|---|
| "What version of Zepeed is running?" | GetAppVersion |
| "Show me the last 10 ping results" | ListPingResults |
| "List all speedtest results from the last 24 hours" | ListSpeedtestResults |
| "Which internet providers are configured?" | ListProviders |
| "Show me the maintenance windows" | ListMaintenanceWindows |
| "What tools are available?" | lists all 6 tools |
Note: Replace
http://localhost:8000with your production URL when deploying. All examples above useGetAppVersion— the simplest read-only tool — to verify connectivity.
MIT

