From 0c52ecfcdbb3c52aac18eeb6d5fd08c4eaab81a1 Mon Sep 17 00:00:00 2001 From: you Date: Fri, 20 Mar 2026 00:04:30 +0000 Subject: [PATCH] =?UTF-8?q?release:=20v2.0.0=20=E2=80=94=20analytics,=20mo?= =?UTF-8?q?bile=20redesign,=20accessibility,=20100+=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..9b3644ac --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,76 @@ +# Changelog + +## v2.0.0 (2026-03-20) + +Major release — 83 commits covering accessibility, mobile responsive redesign, live page overhaul, node analytics, and 100+ bug fixes. + +### ✨ New Features + +- **Per-Node Analytics page** — 6 charts (activity timeline, packet types, SNR distribution, hop count, peer network, hourly heatmap), stat cards, peer table, time range selector +- **Global Analytics — Nodes tab** — network status overview, role breakdown pie chart, claimed nodes table, leaderboards (activity, signal, observers, recent) +- **Richer Node Detail** — status badge, avg SNR/hops, packets today/total, "Heard By" observer table, QR code in sidebar + full-screen view +- **Claimed (My Mesh) nodes** — always sort to top of nodes list, visual distinction (blue tint, accent border, ★ badge), auto-sync claimed→favorites +- **Packets "My Nodes" toggle** — ★ button filters to only claimed/favorited node packets +- **Live map theme toggle** — dark/light CartoDB tiles swap instantly via MutationObserver (no refresh needed) +- **Bulk health API** — `GET /api/nodes/bulk-health?limit=N` replaces 50 individual health requests +- **Network status API** — `GET /api/nodes/network-status` computes status server-side across ALL nodes +- **VCR replay pagination** — fetches next 10k packets when buffer exhausted instead of jumping to live +- **Multi-slot save system** — unlimited named slots, export/import with SHA-256 checksum + +### 🗺️ Map & Visualization + +- **Accessible map markers** — distinct SVG shapes per role (diamond/circle/square/triangle) + high-contrast colors +- **Geographic prefix disambiguation** restored for route overlay +- **Hash matrix improvements** — bigger font, progressive color scheme, free cells show hex prefix, collision risk sorted closest-first +- **Scatter plot** color-blind accessible + +### 📱 Mobile Responsive + +- **Live page mobile redesign** — feed + legend hidden on mobile, LCD clock preserved +- **Mobile VCR bar** — proper two-row layout (controls+scope+LCD / full-width timeline), no horizontal scrolling +- **Rotation fix** — JS-driven height via `window.innerHeight` + `visualViewport` resize listener with staggered invalidation +- **`100dvh` fallback** on `#app` and `.live-page` for proper viewport height +- **Packets page** — horizontal scroll on tables, filter bar wrapping, touch-friendly targets +- **Analytics** — single-column grid on mobile, reduced padding +- **Nodes** — count pills wrap, compact layout +- **Feed detail card** — bottom sheet on mobile with slide-up animation + +### ♿ Accessibility (WCAG) + +- ARIA tab pattern, form labels, focus management +- SVG alt text, color-blind safe palettes +- Keyboard-accessible table rows, feed items, sender list +- Node panel focus trap, combobox ARIA on filters +- `aria-live` regions on data tables and feeds +- Screen-reader-only text for icon-only buttons +- VCR timeline + LCD ARIA labels + +### 🐛 Bug Fixes + +- Fixed 100+ issues across all pages (see closed GitHub issues #1–#101) +- Excel-like column resize — drag steals proportionally from ALL right columns, min 50px +- Panel drag live reflow — left panel explicitly sized during drag +- VCR scrub fetches ASC from scrub point (prevents jumping forward) +- Removed dead code: `svgLine()`, `.vcr-clock`, duplicate `escapeHtml`/`debounce` +- XSS fix: escape decoded text/name in innerHTML +- WebSocket debounce helper, cleaned up window globals +- Race conditions in analytics async loading +- Express route ordering: named routes before `:pubkey` wildcards +- Stray CSS fragment removed that was corrupting live.css +- Dark mode: section-row background uses CSS variable +- SRI integrity hashes on Leaflet CDN scripts +- Empty/error states on all data tables + +### 🏗️ Infrastructure + +- Cache busters on all JS/CSS files +- Feed resize handle (drag to resize feed panel width) +- Nav auto-hide on live page with pin button +- Legend toggle button for mobile +- `totalPackets` added to health API + +--- + +## v1.0.0 (2026-03-19) + +Initial release. diff --git a/package.json b/package.json index 8f94a5d3..2a6ae443 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "meshcore-analyzer", - "version": "1.0.0", + "version": "2.0.0", "description": "Community-run alternative to the closed-source `analyzer.letsmesh.net`. MQTT packet collection + open-source web analyzer for the Bay Area MeshCore mesh.", "main": "index.js", "scripts": {