diff --git a/docs/device-models.md b/docs/device-models.md
index 37497ed5..1fd47cdc 100644
--- a/docs/device-models.md
+++ b/docs/device-models.md
@@ -10,8 +10,7 @@ computer illustrations in `archipelago-website-deck`.
`neode-ui/src/graphics/deviceModels.ts` contains 25 radio illustrations,
including the generic fallback and three optional enclosure variants, plus
the Beryl AX (GL-MT3000). All existing `meshDeviceImages.ts` detection results
-resolve to a model by their SVG filename. The existing SVGs and attribution
-remain available as static fallbacks. USB chip identification remains a
+resolve to a procedural model key. USB chip identification remains a
best-effort visual match; it does not select firmware or claim exact hardware.
The radios include modeled rear faces, enclosure panels or populated boards,
@@ -23,7 +22,6 @@ verified against a rear photograph. The Beryl AX is the example router from
Reference material:
-- Existing Meshtastic illustrations in `neode-ui/public/assets/img/mesh-devices/`.
- Beryl AX official front/rear/side hardware drawing:
https://static.gl-inet.com/docs/router/en/4/user_guide/gl-mt3000/hardware_info/mt3000_interface.jpg
- Beryl AX guide:
diff --git a/neode-ui/mock-backend.js b/neode-ui/mock-backend.js
index 642cea6b..a7baaa57 100755
--- a/neode-ui/mock-backend.js
+++ b/neode-ui/mock-backend.js
@@ -4470,6 +4470,12 @@ app.post('/rpc/v1', (req, res) => {
// ── OpenWRT / TollGate gateway (demo: a thoroughly-used gateway) ──
case 'openwrt.get-status': {
+ // Keep the local preview in the unconnected state so the router model
+ // is immediately visible. Set MOCK_OPENWRT_CONNECTED=1 to preview the
+ // connected dashboard instead.
+ if (!process.env.MOCK_OPENWRT_CONNECTED) {
+ return res.json({ error: { code: -32004, message: 'No router configured' } })
+ }
return res.json({
result: {
host: '192.168.8.1',
diff --git a/neode-ui/public/assets/img/mesh-devices/ATTRIBUTION.md b/neode-ui/public/assets/img/mesh-devices/ATTRIBUTION.md
deleted file mode 100644
index 456b7ffd..00000000
--- a/neode-ui/public/assets/img/mesh-devices/ATTRIBUTION.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Device Artwork Attribution
-
-The device illustrations in this directory are from the
-**Meshtastic® project** — https://meshtastic.org
-(https://github.com/meshtastic), © Meshtastic contributors,
-licensed under GPL-3.0.
-
-Meshtastic® is a registered trademark of Meshtastic LLC, used here solely to
-identify compatible hardware. No endorsement by the Meshtastic project is
-implied.
-
-Any modifications to these images made for Archipelago are likewise available
-under GPL-3.0 as part of this public repository.
diff --git a/neode-ui/public/assets/img/mesh-devices/diy.svg b/neode-ui/public/assets/img/mesh-devices/diy.svg
deleted file mode 100644
index 81d0da13..00000000
--- a/neode-ui/public/assets/img/mesh-devices/diy.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/heltec-mesh-node-t114-case.svg b/neode-ui/public/assets/img/mesh-devices/heltec-mesh-node-t114-case.svg
deleted file mode 100644
index dc84fd1b..00000000
--- a/neode-ui/public/assets/img/mesh-devices/heltec-mesh-node-t114-case.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/heltec-mesh-node-t114.svg b/neode-ui/public/assets/img/mesh-devices/heltec-mesh-node-t114.svg
deleted file mode 100644
index fc44238c..00000000
--- a/neode-ui/public/assets/img/mesh-devices/heltec-mesh-node-t114.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/heltec-v3-case.svg b/neode-ui/public/assets/img/mesh-devices/heltec-v3-case.svg
deleted file mode 100644
index 86879653..00000000
--- a/neode-ui/public/assets/img/mesh-devices/heltec-v3-case.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/heltec-v3.svg b/neode-ui/public/assets/img/mesh-devices/heltec-v3.svg
deleted file mode 100644
index 759dbe90..00000000
--- a/neode-ui/public/assets/img/mesh-devices/heltec-v3.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/heltec-wsl-v3.svg b/neode-ui/public/assets/img/mesh-devices/heltec-wsl-v3.svg
deleted file mode 100644
index c61b676a..00000000
--- a/neode-ui/public/assets/img/mesh-devices/heltec-wsl-v3.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/heltec_v4.svg b/neode-ui/public/assets/img/mesh-devices/heltec_v4.svg
deleted file mode 100644
index e7cb8943..00000000
--- a/neode-ui/public/assets/img/mesh-devices/heltec_v4.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/nano-g2-ultra.svg b/neode-ui/public/assets/img/mesh-devices/nano-g2-ultra.svg
deleted file mode 100644
index 5ad5c5bf..00000000
--- a/neode-ui/public/assets/img/mesh-devices/nano-g2-ultra.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/rak-wismeshtap.svg b/neode-ui/public/assets/img/mesh-devices/rak-wismeshtap.svg
deleted file mode 100644
index 1085736a..00000000
--- a/neode-ui/public/assets/img/mesh-devices/rak-wismeshtap.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/rak4631.svg b/neode-ui/public/assets/img/mesh-devices/rak4631.svg
deleted file mode 100644
index 0eaea9b6..00000000
--- a/neode-ui/public/assets/img/mesh-devices/rak4631.svg
+++ /dev/null
@@ -1,3514 +0,0 @@
-
-
diff --git a/neode-ui/public/assets/img/mesh-devices/rak4631_case.svg b/neode-ui/public/assets/img/mesh-devices/rak4631_case.svg
deleted file mode 100644
index 4ffa23c9..00000000
--- a/neode-ui/public/assets/img/mesh-devices/rak4631_case.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/rpipicow.svg b/neode-ui/public/assets/img/mesh-devices/rpipicow.svg
deleted file mode 100644
index 519648ba..00000000
--- a/neode-ui/public/assets/img/mesh-devices/rpipicow.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/seeed-xiao-s3.svg b/neode-ui/public/assets/img/mesh-devices/seeed-xiao-s3.svg
deleted file mode 100644
index 768093b2..00000000
--- a/neode-ui/public/assets/img/mesh-devices/seeed-xiao-s3.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/station-g2.svg b/neode-ui/public/assets/img/mesh-devices/station-g2.svg
deleted file mode 100644
index 158d456a..00000000
--- a/neode-ui/public/assets/img/mesh-devices/station-g2.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/t-deck.svg b/neode-ui/public/assets/img/mesh-devices/t-deck.svg
deleted file mode 100644
index c13a445c..00000000
--- a/neode-ui/public/assets/img/mesh-devices/t-deck.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/t-echo.svg b/neode-ui/public/assets/img/mesh-devices/t-echo.svg
deleted file mode 100644
index 006f77f5..00000000
--- a/neode-ui/public/assets/img/mesh-devices/t-echo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/t-echo_plus.svg b/neode-ui/public/assets/img/mesh-devices/t-echo_plus.svg
deleted file mode 100644
index ebc76c89..00000000
--- a/neode-ui/public/assets/img/mesh-devices/t-echo_plus.svg
+++ /dev/null
@@ -1,502 +0,0 @@
-
-
diff --git a/neode-ui/public/assets/img/mesh-devices/tbeam-s3-core.svg b/neode-ui/public/assets/img/mesh-devices/tbeam-s3-core.svg
deleted file mode 100644
index ed304d99..00000000
--- a/neode-ui/public/assets/img/mesh-devices/tbeam-s3-core.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/tbeam.svg b/neode-ui/public/assets/img/mesh-devices/tbeam.svg
deleted file mode 100644
index 6119e7da..00000000
--- a/neode-ui/public/assets/img/mesh-devices/tbeam.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/thinknode_m1.svg b/neode-ui/public/assets/img/mesh-devices/thinknode_m1.svg
deleted file mode 100644
index d4f95045..00000000
--- a/neode-ui/public/assets/img/mesh-devices/thinknode_m1.svg
+++ /dev/null
@@ -1,109 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/tlora-t3s3-v1.svg b/neode-ui/public/assets/img/mesh-devices/tlora-t3s3-v1.svg
deleted file mode 100644
index fb8297d3..00000000
--- a/neode-ui/public/assets/img/mesh-devices/tlora-t3s3-v1.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/tlora-v2-1-1_6.svg b/neode-ui/public/assets/img/mesh-devices/tlora-v2-1-1_6.svg
deleted file mode 100644
index 53064569..00000000
--- a/neode-ui/public/assets/img/mesh-devices/tlora-v2-1-1_6.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/tracker-t1000-e.svg b/neode-ui/public/assets/img/mesh-devices/tracker-t1000-e.svg
deleted file mode 100644
index 1d54ac53..00000000
--- a/neode-ui/public/assets/img/mesh-devices/tracker-t1000-e.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/public/assets/img/mesh-devices/unknown-new.svg b/neode-ui/public/assets/img/mesh-devices/unknown-new.svg
deleted file mode 100644
index daece9e5..00000000
--- a/neode-ui/public/assets/img/mesh-devices/unknown-new.svg
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
diff --git a/neode-ui/public/assets/img/mesh-devices/wio-tracker-wm1110.svg b/neode-ui/public/assets/img/mesh-devices/wio-tracker-wm1110.svg
deleted file mode 100644
index 14b8f528..00000000
--- a/neode-ui/public/assets/img/mesh-devices/wio-tracker-wm1110.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/neode-ui/src/components/DeviceModel.vue b/neode-ui/src/components/DeviceModel.vue
index 647d40f5..c8c18da8 100644
--- a/neode-ui/src/components/DeviceModel.vue
+++ b/neode-ui/src/components/DeviceModel.vue
@@ -1,19 +1,25 @@