Server
Your ISP plan
OptionalEnter your advertised speeds to see how much of what you pay for you actually get.
+Scheduled tests
Run a quick check on a timer and get notified if quality drops.
+
+
+
+ Your internet, honestly measured.
+ A free, open-source speed test that lives in your browser toolbar.
+
+ Website · + Install · + Links and how-tos · + Contribute +
-Open-source speed test browser extension. Measures download, upload, ping, jitter, and packet loss from your toolbar — powered by Cloudflare's edge network. +--- -## Features +Speed tests give you a number. MeterX tells you what it means. -- **Full speed test** — download, upload, ping, jitter, packet loss -- **Use-case readiness** — labels for Calls, Streaming, Gaming, Uploads -- **Connection quality badge** — live rating on the extension icon -- **PDF health report** — export a full network report as PDF -- **Test history** — last 7 displayed, 200 stored locally -- **Cloudflare edge** — serverless backend at 300+ PoPs worldwide -- **Self-hostable server** — Express.js fallback for LAN or self-hosting -- **Settings page** — configure custom server URL -- **Animated UI** — progress steps, speed bars, smooth transitions -- **No tracking, no accounts** — everything stays in your browser +Click the icon, wait about twenty seconds, and you get download, upload, ping, jitter, packet loss and the one most tests skip: **latency under load**. That is why your video call stutters while someone else downloads a game, and MeterX grades it from A to F. -## Install from Source +No account. No tracking. Your results never leave your browser unless you share them. -```bash -git clone https://github.com/ajithakdev/meterx-server.git -cd meterx-server -npm install -npm run build -``` +## Install -**Load the extension:** -1. Go to `chrome://extensions` (or `edge://extensions`) -2. Enable "Developer mode" -3. Click "Load unpacked" and select `packages/extension/dist/` +| Browser | Where | +| --- | --- | +| Firefox | [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/meterx-by-ajithakdev/) | +| Microsoft Edge | [Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/glkpolbkpachomgmmhdkmjnghejbhlfc) | +| Opera | Listing link coming soon | +| Chrome, Brave, Vivaldi | Planned | -**Run the server locally (optional):** -```bash -npm start -``` +Not sure which? [meterx.ajithakdev.com/get](https://meterx.ajithakdev.com/get/) picks the right store for you. -## Architecture +## What you get -```text -meterx-server/ - packages/ - extension/ # Browser extension (TypeScript, Manifest V3, esbuild) - src/ - background.ts # Service worker — test orchestration - popup.ts # Popup UI, history, PDF export - static/ # HTML, CSS, manifest, icons - build.mjs # esbuild bundler - - worker/ # Cloudflare Worker — primary backend (serverless) - src/index.ts # Edge handler — download, upload, ping, health - wrangler.toml # Wrangler config - - server/ # Express.js server — self-host fallback - src/ - app.ts # Express app (routes, middleware) - server.ts # Entry point - app.test.ts # Vitest + supertest (8 tests) -``` +- **A real test, fast.** Four download and three upload streams for a fixed time, with the slow start trimmed off. +- **Bufferbloat, graded.** Ping measured while the line is busy, A to F. +- **A plain answer.** Calls, 4K streaming, gaming, big uploads: MeterX says in words what your connection can handle. +- **Memory.** Up to 200 results in the side panel, a trend chart, and how much of your ISP plan actually arrives. +- **Tests on a timer.** Every 30 minutes, 2 hours or daily, with a notice when quality drops. +- **Proof you can hand over.** A PDF report with a report ID that changes if the results are edited, or CSV and JSON with units in every column. +- **Share links with no server.** The whole result rides inside the link. +- **Your own server, if you like.** Tests run against Cloudflare's edge by default, or against one you host. + +## Under the hood ```text -Browser Extension --> Cloudflare Worker (default, 300+ PoPs) - --> Express Server (self-host / LAN fallback) +apps/extension the extension: popup, side panel, settings, service worker +apps/site meterx.ajithakdev.com, running the real extension pages on sample data +services/worker Cloudflare Worker test server (streams bytes, stores nothing) +services/server Express server with the same API, for self-hosting +packages/shared the contract: types, API, version, quality rules, share links +packages/reports PDF, CSV and JSON builders +brand/ logo and the script that makes every icon and store image +scripts/ store packaging, local dev runner, code map ``` -## Server Endpoints +The deep dive is in [CLAUDE.md](CLAUDE.md) and [docs/CODEMAP.md](docs/CODEMAP.md). -Both the worker and self-host server expose the same API: - -| Endpoint | Method | Purpose | -|----------|--------|---------| -| `/ping` | GET/HEAD | Latency measurement | -| `/test-file/:size` | GET | Download test (1, 5, 10, 25 MB) | -| `/upload` | POST | Upload drain | -| `/health` | GET | Health check (includes edge location on worker) | - -All endpoints are rate-limited. CORS restricted to browser extensions and configured origins. - -## Development +## Hack on it ```bash -npm install # Install all workspace deps -npm run build # Build all packages -npm start # Run self-host server -npm test # Run all tests -cd packages/worker && npx wrangler dev # Run worker locally -npm run lint # ESLint +git clone https://github.com/ajithakdev/meterx.git +cd meterx +npm install +npm run dev:ext # build the extension, run a local test server on :8787 +npm run dev:site # build and serve the site on :8788 +npm test && npm run lint +npm run package # store uploads in release/ ``` -See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide. +To load it, open `chrome://extensions`, turn on Developer mode, choose Load unpacked and pick `apps/extension/dist/`. In MeterX settings, set Custom server to `http://localhost:8787` to test against your local worker. After a change, run `npm run build -w @meterx/extension` and reload. -## Tech Stack - -- **Extension:** TypeScript, Manifest V3, esbuild -- **Worker:** Cloudflare Workers, TypeScript, Wrangler -- **Server:** TypeScript, Express.js 5, esbuild -- **Testing:** Vitest, supertest -- **CI:** GitHub Actions +To self-host the test server, run `npm start` (port 3000) or deploy `services/worker` to your own Cloudflare account. ## Privacy -MeterX collects zero personal data. All results are stored locally in your browser. Network requests go only to the configured test server. See [privacy-policy.md](privacy-policy.md). +MeterX collects no personal data. Results stay in your browser and the default test server keeps no logs. Full policy: [meterx.ajithakdev.com/privacy](https://meterx.ajithakdev.com/privacy/). ## License -[AGPL-3.0](LICENSE) — see [TRADEMARK.md](TRADEMARK.md) for brand usage policy. - -## Author - -**Ajith Kumar K** ([@ajithakdev](https://github.com/ajithakdev)) +[AGPL-3.0](LICENSE). The name and logo have their own rules in [TRADEMARK.md](TRADEMARK.md). -- GitHub: [github.com/ajithakdev](https://github.com/ajithakdev) -- Email: ajithkumarks2579@gmail.com +Made by Ajith Kumar K ([@ajithakdev](https://github.com/ajithakdev)). diff --git a/RESOURCES-AND-GUIDE.md b/RESOURCES-AND-GUIDE.md index 72b5568..089a700 100644 --- a/RESOURCES-AND-GUIDE.md +++ b/RESOURCES-AND-GUIDE.md @@ -1,14 +1,14 @@ # MeterX: resources and guide -Every link for the speed test extension and server, what it is for, and how to run and release it. Passwords and keys are never written here. +Every link for MeterX, what it is for, and how to run, package and release it. Passwords and keys are never written here. ## TL;DR -- The repo contains the browser extension, Cloudflare Worker backend, and Express fallback server. -- Cloudflare Worker at https://meterx-speedtest.meterx-ajithakdev.workers.dev serves as the default edge backend. -- Run `npm run build` to compile all packages, and `npm test` to run tests. -- Pushes to `main` build the extension and package `meterx-extension.zip` in GitHub Actions CI. -- The extension options page allows switching to a local Express server at http://localhost:3000. +- Website: https://meterx.ajithakdev.com (one link for any browser: https://meterx.ajithakdev.com/get/) +- Code: https://github.com/ajithakdev/meterx (was `meterx-server`; GitHub redirects the old URL) +- `npm run build`, `npm test`, `npm run lint` from the root; `npm run package` writes the store uploads to `release/`. +- Releases are weekly on Sunday: tag, GitHub release, `wrangler deploy` for the worker, store uploads, site deploy. +- Default test server: https://meterx-speedtest.meterx-ajithakdev.workers.dev ## Links and what each one is for @@ -16,63 +16,80 @@ Every link for the speed test extension and server, what it is for, and how to r | Link | Use it for | | --- | --- | -| https://meterx-speedtest.meterx-ajithakdev.workers.dev | Default Cloudflare Worker speed test edge backend | -| https://meterx.dev/share | Shared speed test results viewer | -| https://github.com/ajithakdev | Author GitHub profile | +| https://meterx.ajithakdev.com | Product site: home, how it works, features, questions, about | +| https://meterx.ajithakdev.com/get/ | Sends each visitor to their own browser's store. Use this link in posts and bios | +| https://meterx.ajithakdev.com/contribute/ | Contribute: live issues for newcomers and contributors from GitHub | +| https://meterx.ajithakdev.com/privacy/ | Privacy policy (the stores link here) | +| https://meterx.ajithakdev.com/r/ | Share viewer: opens links made by the Share button | +| https://addons.mozilla.org/firefox/addon/meterx-by-ajithakdev/ | Firefox listing (add-on id `meterx@ajithakdev`) | +| https://microsoftedge.microsoft.com/addons/detail/glkpolbkpachomgmmhdkmjnghejbhlfc | Microsoft Edge listing | +| Opera Add-ons | Listing link not found yet; add it to `apps/site/src/stores.ts` when known | +| https://meterx-speedtest.meterx-ajithakdev.workers.dev | Default test server (Cloudflare Worker) | ### Behind the scenes | Link | Use it for | | --- | --- | -| https://github.com/ajithakdev/meterx-server | Source code, issues, and pull requests | -| https://github.com/ajithakdev/meterx-server/actions | GitHub Actions CI workflow runs | -| https://github.com/ajithakdev/meterx-server/issues | Bug reports and issue tracker | +| https://github.com/ajithakdev/meterx | Source code, issues, pull requests, releases | +| https://github.com/ajithakdev/meterx/actions | CI runs | +| https://addons.mozilla.org/developers/ | Firefox uploads and review | +| https://partner.microsoft.com/dashboard/microsoftedge/ | Edge uploads | +| https://addons.opera.com/developer/ | Opera uploads | +| https://dash.cloudflare.com | Worker, Pages project `meterx-site`, DNS for `ajithakdev.com` | ## Accounts | Service | Account | Role | | --- | --- | --- | | GitHub | `ajithakdev` | Owner | -| Cloudflare | `meterx-ajithakdev` | Worker backend host | +| Cloudflare | personal account (`meterx-ajithakdev` workers subdomain) | Worker, Pages, DNS; free plan only | +| Firefox, Edge, Opera developer accounts | Ajith Kumar K | Store listings | ## User guide -Click the MeterX icon in the browser toolbar to open the popup. Select Start Test to measure download speed, upload speed, ping, jitter, and packet loss. Results are saved locally in browser storage. +1. Install MeterX from your browser's store (https://meterx.ajithakdev.com/get/). +2. Click the MeterX icon in the toolbar and press Run test. It takes about twenty seconds. +3. Open the side panel (the panel icon in the popup) to see your history, trend and plan comparison. +4. In settings (the sliders icon), enter your ISP plan, choose a test schedule, or point MeterX at your own server. +5. Export or Share from the popup or side panel to save a PDF, CSV or JSON, or send someone a link. -To point the extension at a self-hosted server, click the settings gear icon in the popup. Select Custom Server under Server. Enter the server URL, such as http://localhost:3000, and click Test to verify the connection. Click Save. Plain http is permitted for localhost, 127.0.0.1, and .local domains. - -## Run and release +## Admin guide | Job | How | | --- | --- | -| Install dependencies | `npm install` | -| Build all packages | `npm run build` | -| Run Express server | `npm start` | -| Run Worker locally | `cd packages/worker && npx wrangler dev` | -| Run tests | `npm test` | -| Lint codebase | `npm run lint` | -| Load unpacked extension | Open `chrome://extensions`, enable Developer mode, and load `packages/extension/dist/` | -| Package extension zip | `cd packages/extension/dist && zip -r ../../../meterx-extension.zip .` | -| Deploy Worker | `cd packages/worker && npx wrangler deploy` | +| Install | `npm install` | +| Build everything | `npm run build` (the site build needs the extension build, which runs first) | +| Test, lint, type check | `npm test`, `npm run lint`, `npx tsc --noEmit` in a package | +| Load the extension | `chrome://extensions`, Developer mode, Load unpacked: `apps/extension/dist/` | +| Preview the site | `npm run dev:site` (builds, serves on http://localhost:8788) | +| Test the extension | `npm run dev:ext` (builds, runs the worker on http://localhost:8787; load `apps/extension/dist` with Load unpacked) | +| Package for the stores | `npm run package`: `release/meterx-Enter your advertised speeds to see how much of what you pay for you actually get.
+Run a quick check on a timer and get notified if quality drops.
+Run a test to see what this connection can handle.
+No tests yet. Run one to start the history.
+Run two tests in this range to draw the trend.
+Compare results with the speeds you pay for.
+| When | Down | Up | Ping | Quality |
|---|
No results in this range.
+One person built MeterX to answer a plain question honestly: is the connection I pay for the connection I get?
A twenty second test in four phases, with latency measured under load. The details are on How it works.
+The extension, the worker and the self-hosted server are open source under AGPL-3.0 at github.com/ajithakdev/meterx. Bug reports and ideas go in the issues there.
+Ajith Kumar K, a backend engineer. More of his work is at ajithakdev.com.
+MeterX is open source and made in the open. Fixes, ideas, translations, docs and design are all welcome, and small first steps are marked for you.
+Issues marked good first issue are small and well described. Help wanted means the owner would love a hand.
+Fork ajithakdev/meterx, then git clone your fork and run npm install.
npm run build, then load apps/extension/dist/ as an unpacked extension in Chrome, Edge or Firefox.
Make the change on a branch. npm test and npm run lint must pass.
Say what changed and why, and link the issue. Small pull requests get reviewed fastest.
The full guide, with the repo layout and every command, is in CONTRIBUTING.md.
+Everyone with a merged change, straight from GitHub.
Short answers about MeterX. Anything missing? Ask in the issue tracker.
+Yes, with no paid tier, no account and no ads. The code is open source under AGPL-3.0.
Firefox, Microsoft Edge and Opera today, and Chrome soon. It also runs in other browsers built on Chromium. Get it for your browser.
Only the test traffic: bytes downloaded from and uploaded to the test server, and the pings. Results are stored in your browser and nowhere else. The privacy page has the details.
Each test uses its own servers, number of streams and length. MeterX tests against the nearest Cloudflare location with several streams for a fixed time and trims the slow start. How it measures.
When a line is busy, routers can queue too much data, so every request waits in line. Speed looks fine but calls and games lag. MeterX measures ping while the line is full and grades the rise from A to F.
Yes. The repository includes a small server you can run on your own machine or network, and the settings page lets you point MeterX at it.
Press Share in the popup. The link carries the result inside it, after the # sign, so it never reaches a server, and this site shows it to whoever opens it.
In the issue tracker on GitHub.
These are the real extension pages running on this site with sample data. Click around: nothing here touches your own results.
+The side panel keeps up to 200 results, charts them, and compares the averages with the speeds you pay for.
+A PDF with averages, ranges, a trend chart and every result. Each page carries a report ID that changes if any figure is edited.
+
Choose the test server, enter your plan, and run tests on a timer with a notice when quality drops to Poor.
+The settings page, with sample settings. Saving here changes nothing on your device.
+Where MeterX goes after this release. Every listing stays free.
A full test takes about twenty seconds and runs in four phases. Each one answers a different question about your line.
+Each bar shows the phase's share of the whole test.
MeterX opens a connection to the nearest Cloudflare location, or to your own server.
A run of small requests measures the delay and how much it wobbles from one request to the next. Requests that never return count as loss.
Four parallel streams fill your line for a fixed time. The slow start and the last moments are trimmed, so the figure is the steady speed.
Three streams do the same upward while pings keep running, to catch the delay that builds under load.
A line can look fast and still stutter on a call while something downloads. That is bufferbloat: routers queue too much data, so every request waits in line.
MeterX keeps pinging during the download and upload and grades the worst rise above the ping at rest.
+| Grade | Rise in ping under load | What you notice |
|---|---|---|
| A | 5 ms or less | Nothing, even on calls during big downloads |
| B | 30 ms or less | Almost nothing |
| C | 60 ms or less | Small hiccups in games and calls when the line is busy |
| D | 200 ms or less | Calls stutter while someone downloads |
| F | More than 200 ms | Everything lags when the line is busy |
MeterX is a free, open-source browser extension that tests download, upload, ping, jitter and bufferbloat from your toolbar. No account, nothing tracked.
+The side panel keeps up to 200 results with a trend chart, so a slow evening stands out from a slow line.
+Counts use the extension's own rules: 25 Mbps for each 4K stream and 5 Mbps for HD.
+A five second check from this page fills in your own speed. It uses up to 25 MB.
+MeterX collects no personal data. Your results stay in your browser.
Last updated 24 October 2026. Applies to MeterX 2027.0.0 and later.
Nothing is sent to MeterX or anyone else. Uninstalling the extension, or clearing its storage, deletes all of it.
+A test exchanges data with the test server: it downloads test bytes, uploads test bytes that the server throws away, and sends small ping requests. As with any web request, the server sees your IP address. The default server is a Cloudflare Worker that:
+Cloudflare runs the network the worker is on. Its handling of traffic is covered by Cloudflare's privacy policy. If you set a custom server, your tests go to that server instead, and its owner's policy applies.
+A share link carries the result inside the link itself, after the # sign, which browsers never send to a server. This site reads it in your browser to show the result. PDF, CSV and JSON reports are made on your device and saved where you choose.
+This site uses no cookies, no analytics and no trackers. The quick test on the home page runs only when you press its button and talks to the same test server. The Contribute page asks GitHub's public API for the repository's issues and contributors from your browser, so GitHub sees that request as it would any visit to github.com.
+MeterX is not aimed at children and collects no personal data from anyone.
+Changes to this policy are listed in the repository's history and the date above is updated. Questions go to the issue tracker or ajithkumarks2579@gmail.com.
+MeterX is a free, open-source browser extension that tests your connection from the toolbar and keeps your results private.
+ +This page shows results shared from MeterX. The link you opened has no result in it, or it was cut short.