diff --git a/meshview/templates/nodelist.html b/meshview/templates/nodelist.html
index 9522f77..ea39bd6 100644
--- a/meshview/templates/nodelist.html
+++ b/meshview/templates/nodelist.html
@@ -434,22 +434,25 @@ document.addEventListener("DOMContentLoaded", async function() {
// =====================================================
// SORT NODES
// =====================================================
- function sortNodes(nodes, key, asc) {
- return [...nodes].sort((a, b) => {
- let A = a[key];
- let B = b[key];
+function sortNodes(nodes, key, asc) {
+ return [...nodes].sort((a, b) => {
+ let A = a[key];
+ let B = b[key];
- // special handling for timestamp
- if (key === "last_seen_us") {
- A = A || 0;
- B = B || 0;
- }
+ // Normalize null/undefined/empty to a sortable string
+ A = (A ?? "").toString().toLowerCase();
+ B = (B ?? "").toString().toLowerCase();
+
+ // Force "n/a" to sort last
+ if (A === "" || A === "n/a") A = "~";
+ if (B === "" || B === "n/a") B = "~";
+
+ if (A < B) return asc ? -1 : 1;
+ if (A > B) return asc ? 1 : -1;
+ return 0;
+ });
+}
- if (A < B) return asc ? -1 : 1;
- if (A > B) return asc ? 1 : -1;
- return 0;
- });
- }
// =====================================================
// SORT ICONS