MeshMonitor v4.9.2
A focused follow-up to v4.9.1 that adds drag-and-drop reordering of the Sources list on the Unified View and brings the Notifications experience to MeshCore sources, plus three fixes. Admins can now reorder source cards in the Dashboard sidebar, with the order persisted server-side and shared across all viewers. MeshCore sources gain a dedicated, source-type-aware Notifications tab and now fire inactive-node and new-node alerts. The release also corrects the migrate-db table ordering, repairs the Channels tab layout on installed iOS PWAs, and prevents channel reordering from bleeding channels between MeshCore and Meshtastic sources.
Features
- Reorderable Sources list on the Unified View (#3342) — Admins can drag-and-drop the source cards in the Dashboard / Unified View sidebar to control their order, mirroring the existing channel-reorder UX. The order is stored server-side (new
sources.displayOrdercolumn, migration 081) so it is shared across all viewers; a grab handle only appears for users withsources:write. The Unified aggregate card stays pinned at the top and is not draggable, and new sources append to the end of the list. Resolves #3338. - MeshCore Notifications space + inactive-node & new-node alerts (#3339) — MeshCore sources now have a dedicated, source-type-aware Notifications tab showing only the controls that apply (voltage mV low-battery threshold, inactive-node, new-node, server events, monitored-node picker, Web Push / Apprise). Inactive-node alerts now fire for MeshCore (reading
meshcore_nodes.lastHeardin ms), and "new node discovered" alerts trigger on the first real-time contact advert (de-duplicated per public key, with device-type labels). The Meshtastic notifications page no longer shows the irrelevant mV field. Relates to #3331.
Bug Fixes
- migrate-db TABLE_ORDER out of sync with the schema (#3341) — The SQLite → PostgreSQL/MySQL migration CLI's explicit table ordering had drifted: nine 4.x tables were missing and a stale
key_repair_stateentry referenced a table that never existed. They now have explicit FK-safe positions, the new source-scoped tables participate in thesourceIdbackfill, and a regression test enumerates the Drizzle schema to fail CI if a future table is added without being registered. Resolves #3337. - Channels tab layout broken on installed iOS PWAs (#3336) — On the Channels tab in an installed iOS PWA the message list grew without bound and a large dead-space gap remained below the input. Fixed with iOS-WebKit-specific corrections:
min-height: 0on.app-main, a deterministic measured pixel height for the message list (ResizeObserver), and removal of theposition: stickysend bar that resolved against the safe-area-inset viewport. Regression from the #3307 PWA dead-space fix. - Channel reorder could replace a Meshtastic channel with a MeshCore one (#3335) — The
POST /api/channels/reorderhandler read channels with an unscopedgetAllChannels()and keyed them into a slot-indexed map; since MeshCore and Meshtastic channels share thechannelstable and both use slot ids 0-7, a MeshCore channel could win the lookup and be written to the Meshtastic device. The reorder read and writes are now scoped to the source being edited.
Other
- Translations update from Hosted Weblate (#3244)
Issues Resolved
- #3338 — Reorderable Sources list on the Unified View page
- #3337 —
migrate-db.tsTABLE_ORDER out of sync with the current schema
Full changelog: v4.9.1...v4.9.2
🚀 MeshMonitor v4.9.2
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.9.2🧪 Testing
✅ All tests passed (Node 20/22/24/25, SQLite/PostgreSQL/MySQL)
✅ TypeScript checks passed
✅ Hardware system tests passed
✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7
🚀 MeshMonitor v4.9.2
📦 Installation
Docker (recommended):
docker run -d \
--name meshmonitor \
-p 8080:3001 \
-v meshmonitor-data:/data \
ghcr.io/Yeraze/meshmonitor:4.9.2🧪 Testing
✅ All tests passed
✅ TypeScript checks passed
✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7
📋 Changes
See commit history for detailed changes.