Skip to content

Add/dev/2026.0.mar.1 - #2

Merged
ajithakdev merged 17 commits into
mainfrom
add/dev/2026.0.MAR.1
Mar 20, 2026
Merged

ajithakdev merged 17 commits into
mainfrom
add/dev/2026.0.MAR.1

Conversation

@ajithakdev

Copy link
Copy Markdown
Owner

v2026.0.320-MR1.1 — Edge migration + complete rewrite

major release serverless license

Transforms MeterX from a basic speed test into a production-ready, serverless network health tool. Render cold starts (50s+) replaced with Cloudflare Workers across 300+ PoPs. Full UI, docs, and architecture overhaul.

17 commits · 54 files changed · author: @ajithakdev


Before → after

Metric Render (US) CF Worker (SIN)
Download ~15 Mbps ~45 Mbps
Upload ~25 Mbps ~30 Mbps
Ping ~70 ms ~55 ms
Cold start 50s+ 0ms

What's in this release

Infrastructure

  • Serverless edge — Cloudflare Workers replacing Render; 300+ PoPs, zero cold starts, streaming download (1–25MB), upload drain, ping + health endpoints with edge location

Extension

  • Full UI rewrite — compact glassmorphic dark theme, animated speed bars, quality badge, use-case readiness labels, progress steps
  • PDF health reports — exportable report with quality assessment, trend analysis, anomaly detection
  • Settings page — Cloudflare/Custom server radio, auto-status check, latency display, self-host support
  • History — quality dots, last-result persistence across popup open/close

Backend

  • Accuracy — 10MB download, warm-up requests, streaming measurement, bufferbloat delay, trust proxy fix for rate limiter

Docs + legal

  • Documentation rewrite — README, CONTRIBUTING, CHANGELOG, privacy policy, AUTHORS — all synced to current architecture
  • License — MIT → AGPL-3.0 + TRADEMARK.md for brand protection

Architecture

packages/
  extension/    Manifest V3 · TypeScript · esbuild
  worker/       Cloudflare Worker — primary edge (serverless)
  server/       Express.js — self-host fallback

Test plan

  • npm run build — all 3 packages build
  • npm run test — 8 server tests pass
  • npm run lint — 0 errors
  • Extension loads and runs speed test against CF Worker
  • PDF report exports with correct layout and dark theme
  • Settings page auto-detects connection and shows edge location
  • Custom server URL saves and works
  • History persists across popup open/close
  • Worker live at meterx-speedtest.meterx-ajithakdev.workers.dev

ajithakdev and others added 17 commits March 20, 2026 15:22
The server/ directory contained copies of background.js, popup.js,
popup.css, popup.html, manifest.json, and images/ that belonged
only in the extension. These duplicates caused confusion and
violated DRY. Also update .gitignore for the new project structure.

Authored-by: ajithakdev (https://github.com/ajithakdev)
Reorganize flat layout into packages/server and packages/extension
workspaces. Root package.json becomes workspace root with shared
devDependencies. Each package gets its own package.json, tsconfig,
and build configuration.

- packages/server: Express.js speed test backend
- packages/extension: Chrome/Edge browser extension (Manifest V3)
- Root: shared ESLint, TypeScript, esbuild, Vitest

Authored-by: ajithakdev (https://github.com/ajithakdev)
- Replace open CORS with explicit origin allowlist + browser extension origins
- Wire up express-rate-limit: /ping 60/min, /upload and /download 10/min
- Reduce upload body limit from 200MB to 10MB
- Add filename whitelist validation to prevent path traversal
- Validate Content-Type on /upload, return 415 for wrong types
- Add /health endpoint for monitoring
- Split server into app.ts (exportable) and server.ts (entry point)
- Support variable download sizes: 1, 5, 10, 25 MB
- Separate ESLint browser/node environments, re-enable no-unused-vars and no-undef

Authored-by: ajithakdev (https://github.com/ajithakdev)
- Convert background.js, popup.js to TypeScript with full type annotations
- Add interfaces: TestProgress, TestResults, PingResult, HistoryEntry
- Fix inconsistent error handling: all test functions now throw on failure
  (download previously returned 0, upload threw, ping injected fake 1000ms)
- Report real packet loss % instead of injecting fake latency values
- Add cancel support via AbortController in background service worker
- Add badge indicator showing last download speed on extension icon
- Proper error typing with instanceof checks throughout
- esbuild bundles TS to JS for both server and extension

Authored-by: ajithakdev (https://github.com/ajithakdev)
- Animated SVG speed gauges for download (cyan) and upload (purple)
- Segmented progress bar: Ping → Download → Upload with active/done states
- Test history persisted to chrome.storage.local (last 20 results)
- Cancel button to abort tests mid-run via AbortController
- Connection quality rating: Excellent / Good / Fair / Poor
- Packet loss percentage display in stats row
- Offline detection: auto-disables start button when disconnected
- Accessibility: aria-live regions, aria-labels, semantic HTML
- Modernized dark glassmorphism design with card-based layout
- Author credit in popup footer with GitHub link
- Content Security Policy added to manifest
- Removed unused alarms permission
- Updated manifest to v2026.3.19.1 for store publishing

Authored-by: ajithakdev (https://github.com/ajithakdev)
Testing:
- Vitest + supertest server test suite (8 tests)
- Covers: all endpoints, error cases, invalid filenames, wrong content types

CI/CD:
- GitHub Actions workflow: lint → type-check → build → test
- Node.js 18/20/22 matrix for compatibility
- Extension artifact upload on main branch pushes

Documentation:
- README.md: full rewrite with architecture, install, development guide
- CONTRIBUTING.md: code style, PR process, commands reference
- CHANGELOG.md: detailed changelog for v2026.0.319-MR1.0
- LICENSE: MIT license file
- AUTHORS: contributor credits
- GitHub issue templates: bug report + feature request

Version: 2026.0.319-MR1.0 ("Major Rewrite One")

Authored-by: ajithakdev (https://github.com/ajithakdev)
- npm start: runs the built server directly
- npm run dev: builds all workspaces then starts server
Complete UI overhaul:
- Central ring gauge with dual rings (download outer/cyan, upload inner/purple)
- Hero speed display with JetBrains Mono for numeric values
- Inter font family for body text
- CSS custom properties for consistent theming
- 5-column metrics grid with color-coded values
- Step-based progress indicator with dot + line connectors
- Inline spinner in start button during testing
- Pulse animation on hero speed while testing
- Quality badge in header row (Excellent/Good/Fair/Poor)
- Hover states on metric cards and history items
- Clean footer with dot separators

Also:
- Remove all emojis from status messages (background + popup)
- Use professional status text: "Downloading test file...", "Upload complete", etc.
- Fix phase detection to match new status message wording

Authored-by: ajithakdev (https://github.com/ajithakdev)
- Replace large ring gauge with compact horizontal speed display
  (big number + mini progress bars for DL/UL)
- Reduce popup width from 380px to 340px
- Remove container border-radius and border (fixes white edge artifact)
- Use flat dark background (no glass border against browser chrome)
- History grows naturally — no scrollbar, items just stack
- Stats row with vertical separators instead of card grid
- Smaller button, smaller fonts, tighter spacing throughout
- Overall popup height reduced significantly
… proxy

- Add packages/worker/ with Cloudflare Worker that replaces Render
- Streaming download endpoint (1/5/10/25MB via ReadableStream)
- Upload endpoint (drains body, returns 200)
- Ping endpoint (HEAD/GET minimal response)
- Health endpoint with edge location from cf-ray header
- CORS support for browser extension origins
- Fix Express trust proxy setting for Render rate-limit error

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace hardcoded Render URL with configurable getServerUrl()
- Default to Cloudflare Worker (meterx-speedtest.meterx-ajithakdev.workers.dev)
- Add getServerUrl/setServerUrl message handlers for options page
- Increase download test to 10MB for better TCP ramp-up
- Add connection warm-up (HEAD /ping) before download and upload
- Stream download with live speed updates during test
- Add 1s buffer drain delay between upload and ping (prevents bufferbloat)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New options.html page with dark theme matching popup
- Auto-checks connection status on load with edge location display
- Radio presets: Cloudflare Edge (default) vs Custom Server
- Test Connection button with latency measurement
- IATA code to city name mapping (BOM=Mumbai, SIN=Singapore, etc.)
- Runtime host permission request for custom server URLs
- Close button, About link in footer
- Update manifest: optional_host_permissions, options_page
- Update build.mjs to bundle options.ts entry point

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…uttons

- Add use-case readiness labels (Calls, Streaming, Gaming, Uploads)
- PDF report export via html2canvas + jsPDF with dark theme
- Report includes: quality assessment, trend analysis, anomaly detection,
  use-case assessment, full test history with pagination
- Add close button (SVG X icon, glass style)
- Add settings gear icon linking to options page
- Fix Mbps/MBPS casing in PDF table headers
- Add spacing between Mbps and DOWNLOAD labels
- Heart icon next to author in footer
- History capped at 7 displayed, 200 stored (30 days)
- Animated number counting on hero speed display
- Progress step animation (DL → UL → Ping) with connecting lines
- Last test result persisted and shown on popup open

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace LICENSE file with full AGPL-3.0 text + copyright header
- Update license field in all package.json files
- Update @license headers in all source files
- Update PDF report footer and options page footer

AGPL-3.0 protects against closed-source forks while allowing
open contributions. Users can use MeterX freely; modifications
must remain open source.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- README: updated features, architecture diagram with 3 packages,
  Cloudflare Worker as primary server, AGPL-3.0 badge
- CONTRIBUTING: added worker dev setup, wrangler commands,
  updated project structure and commands table
- CHANGELOG: added 2026.0.320-MR1.1 release with all edge migration,
  UI, PDF export, and accuracy changes
- Privacy policy: rewritten for Cloudflare Workers (removed Render,
  multer, morgan references), stateless server model
- AUTHORS: updated email

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AGPL-3.0 covers the source code. This trademark policy protects
the MeterX name, MX logo, and branding separately. Forks must
use a different name and remove MeterX branding.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix CI badge to reference current branch
- Add Author section to README with full name, email, GitHub
- Link TRADEMARK.md from License section
- Update AUTHORS with full name (Ajith Kumar K)
- Add email to privacy policy contact

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@ajithakdev

ajithakdev commented Mar 20, 2026 •

Copy link
Copy Markdown
Owner Author

@ajithakdev
ajithakdev merged commit 2423d43 into main Mar 20, 2026
4 checks passed
@ajithakdev-valor ajithakdev-valor mentioned this pull request Mar 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant