diff --git a/config.json b/config.json
index f077dc3..449b949 100644
--- a/config.json
+++ b/config.json
@@ -1,6 +1,10 @@
{
"staticPath": "/firmware",
"role": {
+ "meshos": {
+ "icon": "dashboard",
+ "title": "MeshOS"
+ },
"gui": {
"icon": "gradient",
"title": "Ripple GUI",
@@ -34,6 +38,10 @@
"tooltip": "Special role for local room server. Configured via Config/Console on flasher main page"
}
},
+ "notice": {
+ "otafixRecommended": "",
+ "icon": "/img/lora.svg",
+ "type": "esp32",
+ "firmware": [
+ {
+ "role": "gui",
+ "version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-HeltecV4-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-HeltecV4-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* faster map rendering\n* Bandwidth 500 support\n\nFull changelog"
+ },
+ "v8.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-HeltecV4-ExpKit-v8.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-HeltecV4-ExpKit-v8.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ }
+ }
+ }
+ ]
+ },
{
"maker": "lilygo",
"class": "ripple",
@@ -69,6 +122,36 @@
{
"role": "gui",
"version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeck-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeck-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* faster map rendering\n* Bandwidth 500 support\n* trackball crash fix\n\nFull changelog"
+ },
+ "v8.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeck-v8.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeck-v8.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -372,6 +455,36 @@
{
"role": "guiSD",
"version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeck-SD-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeck-SD-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* faster map rendering\n* Bandwidth 500 support\n* trackball crash fix\n\nFull changelog"
+ },
+ "v8.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeck-SD-v8.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeck-SD-v8.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -685,6 +798,36 @@
{
"role": "gui",
"version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeckPro-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeckPro-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nv9.0 changes:\n*support for v1.0 and v1.1 hardware models (separate .bin files in zip)\n* Discover list now overwrites oldest entry if full\n* new UI: customisable home icon grid, and new icon grid menus\n\nFull changelog"
+ },
+ "v8.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeckPro-v8.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeckPro-v8.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -795,6 +938,21 @@
{
"role": "guiSD",
"version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeckPro-SD-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeckPro-SD-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nv9.0 changes:\n*support for v1.0 and v1.1 hardware models (separate .bin files in zip)\n* Discover list now overwrites oldest entry if full\n* new UI: customisable home icon grid, and new icon grid menus\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -901,13 +1059,55 @@
"notes": "* Initial release"
}
}
+ },
+ {
+ "role": "gui",
+ "title": "Ripple GUI (T-Deck Pro v1.1)",
+ "version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeckProV11-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeckProV11-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nv9.0 changes:\n*support for v1.0 and v1.1 hardware models (separate .bin files in zip)\n* Discover list now overwrites oldest entry if full\n* new UI: customisable home icon grid, and new icon grid menus\n\nFull changelog"
+ }
+ }
+ },
+ {
+ "role": "guiSD",
+ "title": "Ripple GUI: data on SD card (T-Deck Pro v1.1)",
+ "version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TDeckProV11-SD-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TDeckProV11-SD-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nv9.0 changes:\n*support for v1.0 and v1.1 hardware models (separate .bin files in zip)\n* Discover list now overwrites oldest entry if full\n* new UI: customisable home icon grid, and new icon grid menus\n\nFull changelog"
+ }
+ }
}
]
},
{
"maker": "lilygo",
"class": "ripple",
- "name": "LilyGo T5 E-Paper S3 Pro (non-gps, only rev. H752)",
+ "name": "LilyGo T5 E-Paper S3 Pro (H752-XX)",
"tooltip": "
",
"icon": "/img/lora.svg",
"type": "esp32",
@@ -915,139 +1115,35 @@
{
"role": "gui",
"version": {
- "v7.1": {
+ "v9.2": {
"files": [
{
"type": "flash-wipe",
- "name": "Ultra-T5-epaper-UKStore-v7.1-merged.bin",
+ "name": "Ultra-T5Pro-v9.2-merged.bin",
"title": "Combined app+partition+bootloader firmware bin"
},
{
"type": "flash-update",
- "name": "Ultra-T5-epaper-UKStore-v7.1.bin",
+ "name": "Ultra-T5Pro-v9.2.bin",
"title": "App firmware bin (use with m5 booloader)"
}
],
- "notes": "* Channel details hex or base64 input\n* MeshCore lib updates/fixes"
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog"
},
- "v7.0": {
+ "v8.2": {
"files": [
{
"type": "flash-wipe",
- "name": "Ultra-T5-epaper-UKStore-v7.0-merged.bin",
+ "name": "Ultra-T5Pro-v8.2-merged.bin",
"title": "Combined app+partition+bootloader firmware bin"
},
{
"type": "flash-update",
- "name": "Ultra-T5-epaper-UKStore-v7.0.bin",
+ "name": "Ultra-T5Pro-v8.2.bin",
"title": "App firmware bin (use with m5 booloader)"
}
],
- "notes": "* Saved paths, manual set path,\n* Trackball press is now select, long press for screen off,\n* Room keep-alive packets now not sent,\n* Discover screen, max now 140,\n* New customisable sounds: new-advert.mp3, existing-advert.mp3"
- },
- "v6.9": {
- "files": [
- {
- "type": "flash-wipe",
- "name": "Ultra-T5-epaper-UKStore-v6.9-merged.bin",
- "title": "Combined app+partition+bootloader firmware bin"
- },
- {
- "type": "flash-update",
- "name": "Ultra-T5-epaper-UKStore-v6.9.bin",
- "title": "App firmware bin (use with m5 booloader)"
- }
- ],
- "notes": "* Sound and other prefs now persisted\n* New “Show on Map” conversation menu\n* MeshCore lib fixes"
- },
- "v6.8": {
- "files": [
- {
- "type": "flash-wipe",
- "name": "Ultra-T5-epaper-UKStore-v6.8-merged.bin",
- "title": "Combined app+partition+bootloader firmware bin"
- },
- {
- "type": "flash-update",
- "name": "Ultra-T5-epaper-UKStore-v6.8.bin",
- "title": "App firmware bin (use with m5 booloader)"
- }
- ],
- "notes": "* Repeater & Room UI redesign\n* Room, admin CLI now from menu"
- },
- "v6.7": {
- "files": [
- {
- "type": "flash-wipe",
- "name": "RippleUltra-T5-epaper-v6.7-merged.bin",
- "title": "Combined app+partition+bootloader firmware bin"
- },
- {
- "type": "flash-update",
- "name": "RippleUltra-T5-epaper-v6.7.bin",
- "title": "App firmware bin (use with m5 booloader)"
- }
- ],
- "notes": "* Public channel auto-configured (new profiles)\n* Telemetry support (location, ‘online’ indicator)\n* Rooms, unsynced counter (green)\n* Room stats dialog\n* Discover, ‘Send ID Broadcast’ menu"
- },
- "v6.6": {
- "files": [
- {
- "type": "flash-wipe",
- "name": "RippleUltra-T5-epaper-v6.6-merged.bin",
- "title": "Combined app+partition+bootloader firmware bin"
- },
- {
- "type": "flash-update",
- "name": "RippleUltra-T5-epaper-v6.6.bin",
- "title": "App firmware bin (use with m5 booloader)"
- }
- ],
- "notes": "* now saves repeater and room server passwords.\n* New 'auto advert ON/OFF' option"
- },
- "v6.5": {
- "files": [
- {
- "type": "flash-wipe",
- "name": "RippleUltra-T5-epaper-v6.5-merged.bin",
- "title": "Combined app+partition+bootloader firmware bin"
- },
- {
- "type": "flash-update",
- "name": "RippleUltra-T5-epaper-v6.5.bin",
- "title": "App firmware bin (use with m5 booloader)"
- }
- ],
- "notes": "* Existing profiles have SF editable"
- },
- "v6.3": {
- "files": [
- {
- "type": "flash-wipe",
- "name": "RippleUltra-T5-epaper-v6.3-merged.bin",
- "title": "Combined app+partition+bootloader firmware bin"
- },
- {
- "type": "flash-update",
- "name": "RippleUltra-T5-epaper-v6.3.bin",
- "title": "App firmware bin (use with m5 booloader)"
- }
- ],
- "notes": "* BUG Fix: advert verify caused memory corruption"
- },
- "v6.0-beta22": {
- "files": [
- {
- "type": "flash-wipe",
- "name": "RippleUltra-T5-epaper-v6.0-beta21-merged.bin",
- "title": "Combined app+partition+bootloader firmware bin"
- },
- {
- "type": "flash-update",
- "name": "RippleUltra-T5-epaper-v6.0-beta21.bin",
- "title": "App firmware bin (use with m5 booloader)"
- }
- ]
+ "notes": "v8.2 changes:\n* updated UI colour scheme\n* new Regions screen, with 'Scan Local' menu\n* new 'Owner Info' menu, from Discover > Scan Local\nFull changelog"
}
}
}
@@ -1065,6 +1161,36 @@
"role": "gui",
"title": "[SX1262] Ripple GUI",
"version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TPager-SX1262-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TPager-SX1262-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog"
+ },
+ "v8.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TPager-sx1262-v8.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TPager-sx1262-v8.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -1251,6 +1377,36 @@
"role": "guiSD",
"title": "[SX1262] Ripple GUI: data on SD card",
"version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TPager-SX1262-SD-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TPager-SX1262-SD-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog"
+ },
+ "v8.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TPager-SD-sx1262-v8.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TPager-SD-sx1262-v8.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -1422,6 +1578,36 @@
"role": "gui",
"title": "[LR1121] Ripple GUI",
"version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TPager-LR1121-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TPager-LR1121-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog"
+ },
+ "v8.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TPager-LR1121-v8.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TPager-LR1121-v8.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -1443,6 +1629,36 @@
"role": "guiSD",
"title": "[LR1121] Ripple GUI: data on SD card",
"version": {
+ "v9.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TPager-LR1121-SD-v9.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TPager-LR1121-SD-v9.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "v9.2 changes:\n* multibyte path hash support\n\nv9.1 changes:\n* Off-grid (client repeat) mode\n* Bandwidth 500 support\n\nfull changelog"
+ },
+ "v8.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TPager-SD-LR1121-v8.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TPager-SD-LR1121-v8.2.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -1507,6 +1723,36 @@
}
]
},
+ {
+ "maker": "lilygo",
+ "class": "ripple",
+ "name": "LilyGo T-Watch S3 Plus",
+ "tooltip": "
",
+ "icon": "/img/lora.svg",
+ "type": "esp32",
+ "firmware": [
+ {
+ "role": "gui",
+ "version": {
+ "v9.3": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "Ultra-TWatchS3Plus-v9.3.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-TWatchS3Plus-v9.3.bin",
+ "title": "App firmware bin (use with m5 booloader)"
+ }
+ ],
+ "notes": "* Power saving added (battery life from ~12 hr to ~20 hr)\n* Stopwatch and countdown Timer home screen widgets\n* Help tutorial screens"
+ }
+ }
+ }
+ ]
+ },
{
"maker": "seeed",
"class": "ripple",
@@ -1515,10 +1761,26 @@
"tooltip": "
",
"type": "nrf52",
"erase": "WioTrackerL1_QSPIFlash_Format-v1.2.zip",
+ "bootloader": "wio_tracker_l1_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "gui",
"version": {
+ "v8.2": {
+ "files": [
+ {
+ "type": "download",
+ "name": "Ultra-WioTrackerL1-v8.2.uf2",
+ "title": "UF2 file for manual USB DFU mass storage update"
+ },
+ {
+ "type": "flash-update",
+ "name": "Ultra-WioTrackerL1-v8.2.zip",
+ "title": "App firmware"
+ }
+ ],
+ "notes": "* Updated UI colour scheme\n* New Regions screen, with 'Scan Local' menu\n* New 'Owner Info' menu, from Discover > Scan Local\n\nFull changelog"
+ },
"v7.14": {
"files": [
{
@@ -1568,6 +1830,353 @@
}
]
},
+ {
+ "maker": "lilygo",
+ "class": "meshos",
+ "name": "LilyGo T-Deck",
+ "tooltip": "
",
+ "icon": "/img/lora.svg",
+ "type": "esp32",
+ "firmware": [
+ {
+ "role": "meshos",
+ "version": {
+ "v1.1.8": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.1.8-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.1.8.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TDeck-1.1.8.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Better compatibility with MeshCore app\n* Channels increased to 20 when used with the app\n* Low memory messages fix\n* other bug fixes"
+ },
+ "v1.1.7": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.1.7-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.1.7.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TDeck-1.1.7.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Bluetooth companion (Beta)\n* Improved heard list\n* bug fixes\n* SD card discovery/heard storage"
+ },
+ "v1.1.6": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.1.6-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.1.6.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TDeck-1.1.6.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Bluetooth companion (Beta)\n* Improved heard list\n* bug fixes\n* SD card discovery/heard storage"
+ },
+ "v1.1.3": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.1.3-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.1.3.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TDeck-1.1.3.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* UI Optimsiations\n* PSK Channel entry (channel 5)\n* Bugfixes"
+ },
+ "v1.1.2": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.1.2-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.1.2.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TDeck-1.1.2.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Timezone fixes\n* Home & Lock Screen Wallpaper settings\n* Terminal buffer increased\n* Bugfixes"
+ },
+ "v1.1.1": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.1.1-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.1.1.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TDeck-1.1.1.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Map Fixes\n* Notification optimisations\n* Other fixes"
+ },
+ "v1.1.0": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.1.0-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.1.0.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TDeck-1.1.0.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* DM UI updated for easier DM chat, badge message notifications.\n* DM notifications on homescreen.\n* Emoji fixes.\n* 179 extra glyphs added to the main font to support text display for 9 countries/regions.\n* International keyboard support for 9 countries/regions.\n* GPS Time Sync update.\n* Tile support for maps in zoom view.\n* Lots of bug fixes, tweaks etc."
+ },
+ "v1.0.10": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.0.10-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.0.10.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TDeck-1.0.10.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Path set for contacts fixed.\n* Added delete contacts, repeaters, rooms from the contact details panel.\n* Bulk delete repeaters, rooms, chat with /clearcontacts repeaters|rooms|chat\n* Radio Profiles updated to match most recent MeshCore App profiles.\n* Map bug that showed wierd UK outline when no GPS was set.\n* Keyboard backlight fix when AOD off and device wakes. (T-Deck + with new KB only)\n* Low entropy key fix."
+ },
+ "v1.0.8": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDeck-1.0.8-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDeck-1.0.8.bin",
+ "title": "App firmware bin"
+ }
+ ],
+ "notes": "* Initial release"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "maker": "lilygo",
+ "class": "meshos",
+ "name": "LilyGo T-Lora Pager",
+ "tooltip": "
",
+ "icon": "/img/lora.svg",
+ "type": "esp32",
+ "firmware": [
+ {
+ "role": "meshos",
+ "version": {
+ "v1.1.8": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TPager-1.1.8-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TPager-1.1.8.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TPager-1.1.8.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Better compatibility with MeshCore app\n* Channels increased to 20 when used with the app\n* Low memory messages fix\n* other bug fixes"
+ },
+ "v1.1.7": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TPager-1.1.7-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TPager-1.1.7.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TPager-1.1.7.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Bug fixes\n* Update compatibility with MeshOS android app\n* Contacts fixed for official MeshCore app"
+ },
+ "v1.1.6": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TPager-1.1.6-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TPager-1.1.6.bin",
+ "title": "App firmware bin"
+ },
+ {
+ "type": "download",
+ "name": "MeshOS-TPager-1.1.6.zip",
+ "title": "SD Update zip"
+ }
+ ],
+ "notes": "* Initial release"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "maker": "lilygo",
+ "class": "meshos",
+ "name": "LilyGo T-Display P4",
+ "tooltip": "
",
+ "icon": "/img/lora.svg",
+ "type": "esp32",
+ "firmware": [
+ {
+ "role": "meshos",
+ "title": "MeshOS (AMOLED Version)",
+ "version": {
+ "v1.0.1": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDisplay-P4-1.0.1-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDisplay-P4-1.0.1.bin",
+ "title": "App firmware bin"
+ }
+ ],
+ "notes": "* Channel Delete\n* Multibyte Path setting\n* GPS Manual Position\n* PTT app"
+ },
+ "v1.0.0": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-V1.0.0-Tdisplay-p4-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-V1.0.0-Tdisplay-p4.bin",
+ "title": "App firmware bin"
+ }
+ ],
+ "notes": "* Initial release"
+ }
+ }
+ },
+ {
+ "role": "meshos",
+ "title": "MeshOS (LCD Version)",
+ "version": {
+ "v1.0.1": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-TDisplay-P4-LCD-1.0.1-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-TDisplay-P4-LCD-1.0.1.bin",
+ "title": "App firmware bin"
+ }
+ ],
+ "notes": "* Channel Delete\n* Multibyte Path setting\n* GPS Manual Position\n* PTT app"
+ },
+ "v1.0.0": {
+ "files": [
+ {
+ "type": "flash-wipe",
+ "name": "MeshOS-V1.0.0-Tdisplay-p4-LCD-merged.bin",
+ "title": "Combined app+partition+bootloader firmware bin"
+ },
+ {
+ "type": "flash-update",
+ "name": "MeshOS-V1.0.0-Tdisplay-p4-LCD.bin",
+ "title": "App firmware bin"
+ }
+ ],
+ "notes": "* Initial release"
+ }
+ }
+ }
+ ]
+ },
{
"maker": "lilygo",
"class": "community",
@@ -2025,6 +2634,210 @@
}
]
},
+ {
+ "maker": "gat-iot",
+ "class": "community",
+ "name": "GAT-IoT GAT562 Tracker",
+ "icon": "/img/lora.svg",
+ "tooltip": "
",
+ "type": "nrf52",
+ "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip",
+ "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2",
+ "firmware": [
+ {
+ "role": "companionBle",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash": "GAT562_Mesh_Tracker_Pro_companion_radio_ble.*?\\.zip",
+ "download": "GAT562_Mesh_Tracker_Pro_companion_radio_ble.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "companionUsb",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash": "GAT562_Mesh_Tracker_Pro_companion_radio_usb.*?\\.zip",
+ "download": "GAT562_Mesh_Tracker_Pro_companion_radio_usb.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "repeater",
+ "github": {
+ "type": "repeater",
+ "files": {
+ "flash": "GAT562_Mesh_Tracker_Pro_[rR]epeater.*?\\.zip",
+ "download": "GAT562_Mesh_Tracker_Pro_[rR]epeater.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "roomServer",
+ "github": {
+ "type": "room-server",
+ "files": {
+ "flash": "GAT562_Mesh_Tracker_Pro_room_server.*?\\.zip",
+ "download": "GAT562_Mesh_Tracker_Pro_room_server.*?\\.uf2"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "maker": "gat-iot",
+ "class": "community",
+ "name": "GAT-IoT GAT562 30s",
+ "icon": "/img/lora.svg",
+ "tooltip": "
",
+ "type": "nrf52",
+ "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip",
+ "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2",
+ "firmware": [
+ {
+ "role": "companionBle",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash": "GAT562_30S_Mesh_Kit_companion_radio_ble.*?\\.zip",
+ "download": "GAT562_30S_Mesh_Kit_companion_radio_ble.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "companionUsb",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash": "GAT562_30S_Mesh_Kit_companion_radio_usb.*?\\.zip",
+ "download": "GAT562_30S_Mesh_Kit_companion_radio_usb.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "repeater",
+ "github": {
+ "type": "repeater",
+ "files": {
+ "flash": "GAT562_30S_Mesh_Kit_[rR]epeater.*?\\.zip",
+ "download": "GAT562_30S_Mesh_Kit_[rR]epeater.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "roomServer",
+ "github": {
+ "type": "room-server",
+ "files": {
+ "flash": "GAT562_Mesh_Tracker_Pro_room_server.*?\\.zip",
+ "download": "GAT562_Mesh_Tracker_Pro_room_server.*?\\.uf2"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "maker": "heltec",
+ "class": "community",
+ "name": "Heltec Vision Master E213",
+ "icon": "/img/lora.svg",
+ "type": "esp32",
+ "tooltip": "
",
+ "firmware": [
+ {
+ "role": "companionBle",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash-wipe": "Heltec_E213_companion_radio_ble.*?-merged\\.bin",
+ "flash-update": "Heltec_E213_companion_radio_ble.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "companionUsb",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash-wipe": "Heltec_E213_companion_radio_usb.*?-merged\\.bin",
+ "flash-update": "Heltec_E213_companion_radio_usb.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "repeater",
+ "github": {
+ "type": "repeater",
+ "files": {
+ "flash-wipe": "Heltec_E213_[rR]epeater.*?-merged\\.bin",
+ "flash-update": "Heltec_E213_[rR]epeater.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "roomServer",
+ "github": {
+ "type": "room-server",
+ "files": {
+ "flash-wipe": "Heltec_E213_room_server.*?-merged\\.bin",
+ "flash-update": "Heltec_E213_room_server.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "maker": "heltec",
+ "class": "community",
+ "name": "Heltec Vision Master E290",
+ "icon": "/img/lora.svg",
+ "type": "esp32",
+ "tooltip": "
",
+ "firmware": [
+ {
+ "role": "companionBle",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash-wipe": "Heltec_E290_companion_radio_ble.*?-merged\\.bin",
+ "flash-update": "Heltec_E290_companion_radio_ble.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "companionUsb",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash-wipe": "Heltec_E290_companion_radio_usb.*?-merged\\.bin",
+ "flash-update": "Heltec_E290_companion_radio_usb.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "repeater",
+ "github": {
+ "type": "repeater",
+ "files": {
+ "flash-wipe": "Heltec_E290_[rR]epeater.*?-merged\\.bin",
+ "flash-update": "Heltec_E290_[rR]epeater.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "roomServer",
+ "github": {
+ "type": "room-server",
+ "files": {
+ "flash-wipe": "Heltec_E290_room_server.*?-merged\\.bin",
+ "flash-update": "Heltec_E290_room_server.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ }
+ ]
+ },
{
"maker": "heltec",
"class": "community",
@@ -2182,6 +2995,7 @@
"icon": "/img/lora.svg",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v6.zip",
+ "bootloader":"heltec_t114_board_bootloader-0.9.2-OTAFIX2.1.uf2",
"tooltip": "
",
"firmware": [
{
@@ -2204,6 +3018,28 @@
}
}
},
+ {
+ "role": "repeater",
+ "notice":"otafixRecommended",
+ "github": {
+ "type": "repeater",
+ "files": {
+ "flash": "Heltec_t114_[rR]epeater.*?\\.zip",
+ "download": "Heltec_t114_[rR]epeater.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "roomServer",
+ "notice":"otafixRecommended",
+ "github": {
+ "type": "room-server",
+ "files": {
+ "flash": "Heltec_t114_room_server.*?\\.zip",
+ "download": "Heltec_t114_room_server.*?\\.uf2"
+ }
+ }
+ },
{
"role": "companionBle",
"title": "Companion",
@@ -2216,13 +3052,79 @@
}
}
},
+ {
+ "role": "companionUsb",
+ "title": "Companion",
+ "subTitle": "USB [no display]",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash": "Heltec_t114_without_display_companion_radio_ble.*?\\.zip",
+ "download": "Heltec_t114_without_display_companion_radio_ble.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "repeater",
+ "notice":"otafixRecommended",
+ "subTitle": "[no display]",
+ "github": {
+ "type": "repeater",
+ "files": {
+ "flash": "Heltec_t114_without_display_[rR]epeater.*?\\.zip",
+ "download": "Heltec_t114_without_display_[rR]epeater.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "roomServer",
+ "notice":"otafixRecommended",
+ "subTitle": "[no display]",
+ "github": {
+ "type": "room-server",
+ "files": {
+ "flash": "Heltec_t114_without_display_room_server.*?\\.zip",
+ "download": "Heltec_t114_without_display_room_server.*?\\.uf2"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "maker": "heltec",
+ "class": "community",
+ "name": "Heltec Wireless Tracker v2",
+ "icon": "/img/lora.svg",
+ "type": "esp32",
+ "tooltip": "
",
+ "firmware": [
+ {
+ "role": "companionBle",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash-wipe": "heltec_tracker_v2_companion_radio_ble.*?-merged\\.bin",
+ "flash-update": "heltec_tracker_v2_companion_radio_ble.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "companionUsb",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash-wipe": "heltec_tracker_v2_companion_radio_usb.*?-merged\\.bin",
+ "flash-update": "heltec_tracker_v2_companion_radio_usb.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
{
"role": "repeater",
"github": {
"type": "repeater",
"files": {
- "flash": "Heltec_t114_[rR]epeater.*?\\.zip",
- "download": "Heltec_t114_[rR]epeater.*?\\.uf2"
+ "flash-wipe": "heltec_tracker_v2_[rR]epeater.*?-merged\\.bin",
+ "flash-update": "heltec_tracker_v2_[rR]epeater.*?-[a-f0-9]{7}\\.bin"
}
}
},
@@ -2231,8 +3133,8 @@
"github": {
"type": "room-server",
"files": {
- "flash": "Heltec_t114_room_server.*?\\.zip",
- "download": "Heltec_t114_room_server.*?\\.uf2"
+ "flash-wipe": "heltec_tracker_v2_room_server.*?-merged\\.bin",
+ "flash-update": "heltec_tracker_v2_room_server.*?-[a-f0-9]{7}\\.bin"
}
}
}
@@ -2498,6 +3400,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v7.zip",
+ "bootloader":"xiao_nrf52840_ble_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -2523,6 +3426,7 @@
},
{
"role": "repeater",
+ "notice":"otafixNeeded",
"title": "Repeater - 22dBm",
"github": {
"type": "repeater",
@@ -2534,6 +3438,7 @@
},
{
"role": "roomServer",
+ "notice":"otafixNeeded",
"title": "Room Server - 22dBm",
"github": {
"type": "room-server",
@@ -2567,6 +3472,7 @@
},
{
"role": "repeater",
+ "notice":"otafixNeeded",
"title": "Repeater - 30dBm",
"github": {
"type": "repeater",
@@ -2578,6 +3484,7 @@
},
{
"role": "roomServer",
+ "notice":"otafixNeeded",
"title": "Room Server - 30dBm",
"github": {
"type": "room-server",
@@ -2611,6 +3518,7 @@
},
{
"role": "repeater",
+ "notice":"otafixNeeded",
"title": "Repeater - 33dBm",
"github": {
"type": "repeater",
@@ -2622,6 +3530,7 @@
},
{
"role": "roomServer",
+ "notice":"otafixNeeded",
"title": "Room Server - 33dBm",
"github": {
"type": "room-server",
@@ -2641,6 +3550,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v7.zip",
+ "bootloader":"xiao_nrf52840_ble_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -2666,6 +3576,7 @@
},
{
"role": "repeater",
+ "notice":"otafixNeeded",
"title": "Repeater - 22dBm",
"github": {
"type": "repeater",
@@ -2677,6 +3588,7 @@
},
{
"role": "roomServer",
+ "notice":"otafixNeeded",
"title": "Room Server - 22dBm",
"github": {
"type": "room-server",
@@ -2710,6 +3622,7 @@
},
{
"role": "repeater",
+ "notice":"otafixNeeded",
"title": "Repeater - 30dBm",
"github": {
"type": "repeater",
@@ -2721,6 +3634,7 @@
},
{
"role": "roomServer",
+ "notice":"otafixNeeded",
"title": "Room Server - 30dBm",
"github": {
"type": "room-server",
@@ -2754,6 +3668,7 @@
},
{
"role": "repeater",
+ "notice":"otafixNeeded",
"title": "Repeater - 33dBm",
"github": {
"type": "repeater",
@@ -2765,6 +3680,7 @@
},
{
"role": "roomServer",
+ "notice":"otafixNeeded",
"title": "Room Server - 33dBm",
"github": {
"type": "room-server",
@@ -2784,6 +3700,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v6.zip",
+ "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -2830,11 +3747,62 @@
{
"maker": "rak",
"class": "community",
- "name": "RAK Wireless WisBlock / WisMesh (RAK 4631)",
+ "name": "RAK WisBlock 3112",
+ "icon": "/img/lora.svg",
+ "tooltip": "
",
+ "type": "esp32",
+ "firmware": [
+ {
+ "role": "companionBle",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash-wipe": "RAK3112_companion_radio_ble.*?-merged\\.bin",
+ "flash-update": "RAK3112_companion_radio_ble.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "companionUsb",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash-wipe": "RAK3112_companion_radio_usb.*?-merged\\.bin",
+ "flash-update": "RAK3112_companion_radio_usb.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "repeater",
+ "github": {
+ "type": "repeater",
+ "files": {
+ "flash-wipe": "RAK3112_[rR]epeater.*?-merged\\.bin",
+ "flash-update": "RAK3112_[rR]epeater.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ },
+ {
+ "role": "roomServer",
+ "github": {
+ "type": "room-server",
+ "files": {
+ "flash-wipe": "RAK3112_room_server.*?-merged\\.bin",
+ "flash-update": "RAK3112_room_server.*?-[a-f0-9]{7}\\.bin"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "maker": "rak",
+ "class": "community",
+ "name": "RAK WisBlock / WisMesh (RAK 4631)",
"icon": "/img/lora.svg",
"tooltip": "
",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v6.zip",
+ "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -2858,6 +3826,7 @@
},
{
"role": "repeater",
+ "notice": "otafixRecommended",
"github": {
"type": "repeater",
"files": {
@@ -2868,6 +3837,7 @@
},
{
"role": "roomServer",
+ "notice": "otafixRecommended",
"github": {
"type": "room-server",
"files": {
@@ -2878,6 +3848,60 @@
}
]
},
+ {
+ "maker": "rak",
+ "class": "community",
+ "name": "RAK WisMesh 1W Booster (3401 + 13302)",
+ "icon": "/img/lora.svg",
+ "tooltip": "
",
+ "type": "nrf52",
+ "erase": "FLASH_ERASE_nrf52_softdevice_v6.zip",
+ "bootloader":"wiscore_rak4631_board_bootloader-0.9.2-OTAFIX2.1.uf2",
+ "firmware": [
+ {
+ "role": "companionBle",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash": "RAK_3401_companion_radio_ble.*?\\.zip",
+ "download": "RAK_3401_companion_radio_ble.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "companionUsb",
+ "github": {
+ "type": "companion",
+ "files": {
+ "flash": "RAK_3401_companion_radio_usb.*?\\.zip",
+ "download": "RAK_3401_companion_radio_usb.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "repeater",
+ "notice": "otafixRecommended",
+ "github": {
+ "type": "repeater",
+ "files": {
+ "flash": "RAK_3401_[rR]epeater.*?\\.zip",
+ "download": "RAK_3401_[rR]epeater.*?\\.uf2"
+ }
+ }
+ },
+ {
+ "role": "roomServer",
+ "notice": "otafixRecommended",
+ "github": {
+ "type": "room-server",
+ "files": {
+ "flash": "RAK_3401_room_server.*?\\.zip",
+ "download": "RAK_3401_room_server.*?\\.uf2"
+ }
+ }
+ }
+ ]
+ },
{
"maker": "rak",
"class": "community",
@@ -2886,6 +3910,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v6.zip",
+ "bootloader":"wismesh_tag_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -2909,6 +3934,7 @@
},
{
"role": "repeater",
+ "notice": "otafixRecommended",
"github": {
"type": "repeater",
"files": {
@@ -2919,6 +3945,7 @@
},
{
"role": "roomServer",
+ "notice": "otafixRecommended",
"github": {
"type": "room-server",
"files": {
@@ -2937,6 +3964,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v7.zip",
+ "bootloader":"sensecap_solar_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -2960,6 +3988,7 @@
},
{
"role": "repeater",
+ "notice": "otafixNeeded",
"github": {
"type": "repeater",
"files": {
@@ -2970,6 +3999,7 @@
},
{
"role": "roomServer",
+ "notice": "otafixNeeded",
"github": {
"type": "room-server",
"files": {
@@ -2988,6 +4018,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v7.zip",
+ "bootloader":"t1000_e_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -3039,6 +4070,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "WioTrackerL1_QSPIFlash_Format-v1.2.zip",
+ "bootloader": "wio_tracker_l1_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -3062,6 +4094,7 @@
},
{
"role": "repeater",
+ "notice": "otafixNeeded",
"github": {
"type": "repeater",
"files": {
@@ -3072,6 +4105,7 @@
},
{
"role": "roomServer",
+ "notice": "otafixNeeded",
"github": {
"type": "room-server",
"files": {
@@ -3088,6 +4122,7 @@
"name": "Seeed Studio Wio Tracker L1 EINK",
"icon": "/img/lora.svg",
"tooltip": "
",
+ "bootloader": "wio_tracker_l1_bootloader-0.9.2-OTAFIX2.1.uf2",
"type": "nrf52",
"erase": "WioTrackerL1_QSPIFlash_Format-v1.2.zip",
"firmware": [
@@ -3113,6 +4148,7 @@
},
{
"role": "repeater",
+ "notice": "otafixNeeded",
"github": {
"type": "repeater",
"files": {
@@ -3123,6 +4159,7 @@
},
{
"role": "roomServer",
+ "notice": "otafixNeeded",
"github": {
"type": "room-server",
"files": {
@@ -3243,6 +4280,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "Xiao_nrf52_QSPIFlash_Format-v1.2.zip",
+ "bootloader": "xiao_nrf52840_ble_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -3266,6 +4304,7 @@
},
{
"role": "repeater",
+ "notice": "otafixNeeded",
"github": {
"type": "repeater",
"files": {
@@ -3276,6 +4315,7 @@
},
{
"role": "roomServer",
+ "notice": "otafixNeeded",
"github": {
"type": "room-server",
"files": {
@@ -3618,6 +4658,7 @@
"tooltip": "
",
"type": "nrf52",
"erase": "FLASH_ERASE_nrf52_softdevice_v6.zip",
+ "bootloader":"promicro_nrf52840_bootloader-0.9.2-OTAFIX2.1.uf2",
"firmware": [
{
"role": "companionBle",
@@ -3641,6 +4682,7 @@
},
{
"role": "repeater",
+ "notice":"otafixRecommended",
"github": {
"type": "repeater",
"files": {
@@ -3651,6 +4693,7 @@
},
{
"role": "roomServer",
+ "notice":"otafixRecommended",
"github": {
"type": "room-server",
"files": {
@@ -3664,7 +4707,7 @@
{
"maker": "raspberry",
"class": "community",
- "name": "Raspberry Pi Pico RP2040 + WaveShare SX1262",
+ "name": "RPI Pico 2040 + WaveShare SX1262",
"icon": "/img/lora.svg",
"type": "noflash",
"tooltip":"
",
diff --git a/css/flasher.css b/css/flasher.css
index 48c0d90..d7252e0 100644
--- a/css/flasher.css
+++ b/css/flasher.css
@@ -102,6 +102,10 @@ body:has([v-cloak]):after {
white-space-collapse: preserve;
min-width: 300px;
}
+#app a {
+ text-decoration: underline;
+}
+
#app .version {
flex-wrap: wrap;
}
diff --git a/flasher.js b/flasher.js
index e293edd..2145149 100644
--- a/flasher.js
+++ b/flasher.js
@@ -1,10 +1,12 @@
-import "./lib/beer.min.js";
-import { createApp, reactive, ref, nextTick, watch, computed } from "./lib/vue.min.js";
-import { Dfu } from "./lib/dfu.js";
-import { ESPLoader, Transport, HardReset } from "./lib/esp32.js";
-import { SerialConsole } from './lib/console.js';
+import "/lib/beer.min.js";
+import { createApp, reactive, ref, nextTick, watch, computed } from "/lib/vue.min.js";
+import { Dfu } from "/lib/dfu.js";
+import { ESPLoader, Transport, HardReset } from "/lib/esp32.js";
+import { SerialConsole } from '/lib/console.js';
-const configRes = await fetch('./config.json');
+const searchParams = new URLSearchParams(location.search);
+const configName = searchParams.get('config')?.replaceAll(/[^a-z_-]/g, '') ?? 'config';
+const configRes = await fetch(`/${configName}.json`);
const config = await configRes.json();
const githubRes = await fetch('/releases');
@@ -45,6 +47,12 @@ async function delay(milis) {
return await new Promise((resolve) => setTimeout(resolve, milis));
}
+function toSlug(text) {
+ return String(text).toLowerCase()
+ .replace(/[^a-z0-9.]+/g, '-')
+ .replace(/^-|-$/g, '');
+}
+
function getGithubReleases(roleType, files) {
const versions = {};
for(const [fileType, matchRE] of Object.entries(files)) {
@@ -129,6 +137,7 @@ function setup() {
firmware: null,
version: null,
wipe: false,
+ espFlashAddress: 0x10000,
nrfEraserFlashingPercent: 0,
nrfEraserFlashing: false,
port: null,
@@ -146,6 +155,26 @@ function setup() {
return fwVersion ? fwVersion[key] || '' : '';
}
+ const getNotice = (selected) => {
+ let notice = config.notice[selected.firmware.notice] || selected.firmware.notice || '';
+
+ if(notice) {
+ notice = notice.replaceAll(/\$\{(\w+)\}/g, (_, varName) => selected.device[varName] || '');
+ }
+
+ return notice;
+ }
+
+ const formatChangeLog = (changelog) => {
+ return changelog
+ .replace(/change log:\r?\n/i, '')
+ .replace(/^[-*] /mg, '')
+ .replace(/#(\d+)$/gm, `#$1`)
+// .split(/\r?\n/)
+// .map(l => `* ${l}`)
+// .join('\n')
+ }
+
const flashing = reactive({
supported: 'Serial' in window || 'serial' in window.navigator,
instance: null,
@@ -198,6 +227,87 @@ function setup() {
return firmware.version[firstVersion].files.length > 0;
}
+ // --- URL Routing ---
+ // NOTE: the server must serve index.html for all paths (catch-all / try_files).
+
+ const deviceToSlug = (device) => toSlug([device.class, device.name].join('-'));
+
+ const firmwareToSlug = (firmware) => {
+ const title = getRoleFwValue(firmware, 'title');
+ const subTitle = getRoleFwValue(firmware, 'subTitle');
+ return toSlug(subTitle ? `${title}-${subTitle}` : title);
+ };
+
+ let initializingFromUrl = false;
+
+ const buildUrl = () => {
+ if (serialCon.opened) return '/console';
+ if (!selected.device) return '/';
+ let path = '/' + deviceToSlug(selected.device) + '/';
+ if (!selected.firmware) return path;
+ path += firmwareToSlug(selected.firmware) + '/';
+ if (selected.version) path += toSlug(selected.version);
+ return path;
+ };
+
+ const updateUrl = (replace = false) => {
+ if (initializingFromUrl) return;
+ const path = buildUrl();
+ if (window.location.pathname !== path) {
+ replace ? history.replaceState(null, '', path) : history.pushState(null, '', path);
+ }
+ };
+
+ const applyUrlPath = (path) => {
+ initializingFromUrl = true;
+ const segments = path.replace(/^\/|\/$/g, '').split('/').filter(Boolean);
+
+ if (segments.length === 0 || segments[0] === 'console') {
+ nextTick(() => { initializingFromUrl = false; });
+ return;
+ }
+
+ const [deviceSlug, roleSlug, versionSlug] = segments;
+ const matchingDevices = config.device.filter(d => deviceToSlug(d) === deviceSlug);
+ if (matchingDevices.length === 0) {
+ nextTick(() => { initializingFromUrl = false; });
+ return;
+ }
+
+ // When multiple devices share the same slug, use the firmware slug to pick the right one
+ let device, firmware;
+ if (roleSlug && matchingDevices.length > 1) {
+ for (const d of matchingDevices) {
+ const f = d.firmware.find(f => firmwareToSlug(f) === roleSlug && firmwareHasData(f));
+ if (f) { device = d; firmware = f; break; }
+ }
+ }
+ if (!device) device = matchingDevices[0];
+ selected.device = device;
+
+ if (!roleSlug) {
+ nextTick(() => { initializingFromUrl = false; });
+ return;
+ }
+
+ if (!firmware) firmware = device.firmware.find(f => firmwareToSlug(f) === roleSlug && firmwareHasData(f));
+ if (!firmware) {
+ nextTick(() => { initializingFromUrl = false; });
+ return;
+ }
+ selected.firmware = firmware;
+
+ // Use nextTick so the firmware watcher sets the default version first,
+ // then we override it with the version from the URL.
+ nextTick(() => {
+ if (versionSlug) {
+ const versionName = Object.keys(firmware.version).find(v => toSlug(v) === versionSlug);
+ if (versionName) selected.version = versionName;
+ }
+ initializingFromUrl = false;
+ });
+ };
+
const stepBack = () => {
if(selected.device && selected.firmware) {
if(selected.firmware.version[selected.version].customFile) {
@@ -215,11 +325,6 @@ function setup() {
}
}
- watch(() => selected.firmware, (firmware) => {
- if(firmware == null) return;
- selected.version = Object.keys(firmware.version)[0];
- });
-
const flasherCleanup = async () => {
flashing.active = false;
flashing.log = '';
@@ -302,6 +407,7 @@ function setup() {
);
selected.wipe = true;
+ selected.espFlashAddress = 0;
}
selected.firmware = {
@@ -378,8 +484,6 @@ function setup() {
return;
}
- console.log({flashFiles});
-
let flashData;
if(flashFiles[0].file) {
flashData = flashFiles[0].file;
@@ -387,6 +491,7 @@ function setup() {
let flashFile;
if(device.type === 'esp32') {
flashFile = flashFiles.find(f => f.type === (selected.wipe ? 'flash-wipe' : 'flash-update'));
+ if(selected.wipe) selected.espFlashAddress = 0x00000;
}
else {
flashFile = flashFiles[0];
@@ -422,7 +527,7 @@ function setup() {
enableTracing: false,
fileArray: [{
data: await blobToBinaryString(flashData),
- address: selected.wipe ? 0x00000 : 0x10000
+ address: selected.espFlashAddress
}],
reportProgress: async (_, written, total) => {
flashing.percent = (written / total) * 100;
@@ -481,12 +586,13 @@ function setup() {
};
const devices = computed(() => {
- const classSortPrefix = (d) => d.class === 'ripple' ? '1' : '2';
+ const classes = ['ripple', 'meshos', 'community'];
const deviceGroups = {};
- for(const cls of ['ripple', 'community']) {
+ let index = 0;
+ for(const cls of classes) {
const devices = config.device.toSorted(
- (a, b) => (classSortPrefix(a) + a.maker + a.name).localeCompare(classSortPrefix(b) + b.maker + b.name)
+ (a, b) => (index + a.maker + a.name).localeCompare(index + b.maker + b.name)
).filter(
d => d.class === cls && (deviceFilterText.value == '' || d.name.toLowerCase().includes(deviceFilterText.value?.toLowerCase()))
)
@@ -516,6 +622,29 @@ function setup() {
consoleEditBox.value.focus();
}
+ watch(() => selected.firmware, (firmware) => {
+ if(firmware == null) return;
+ selected.version = Object.keys(firmware.version)[0];
+ });
+
+ watch(() => selected.device, updateUrl);
+ watch(() => selected.firmware, updateUrl);
+ watch(() => selected.version, () => updateUrl(true)); // replace: version is a refinement, not a new nav step
+ watch(() => serialCon.opened, updateUrl);
+
+ window.addEventListener('popstate', () => {
+ if (serialCon.opened) closeSerialCon();
+ flashing.active = false;
+ flashing.log = '';
+ flashing.error = '';
+ selected.firmware = null;
+ selected.version = null;
+ selected.device = null;
+ applyUrlPath(window.location.pathname);
+ });
+
+ applyUrlPath(window.location.pathname);
+
return {
snackbar,
consoleEditBox, consoleWindow, consoleMouseUp,
@@ -525,7 +654,8 @@ function setup() {
sendCommand, openSerialGUI,
retry, close, commandReference,
stepBack,
- customFirmwareLoad, getFirmwarePath, getSelFwValue, getRoleFwValue,
+ customFirmwareLoad, getFirmwarePath,
+ getSelFwValue, getRoleFwValue, getNotice, formatChangeLog,
firmwareHasData,
canFlash, nrfErase
}
diff --git a/img/gatiot_gat562.svg b/img/gatiot_gat562.svg
new file mode 100644
index 0000000..359d93e
--- /dev/null
+++ b/img/gatiot_gat562.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/gatiot_gat562_30s.svg b/img/gatiot_gat562_30s.svg
new file mode 100644
index 0000000..78058cb
--- /dev/null
+++ b/img/gatiot_gat562_30s.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/heltec_e213.svg b/img/heltec_e213.svg
new file mode 100644
index 0000000..c5160e0
--- /dev/null
+++ b/img/heltec_e213.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/heltec_e290.svg b/img/heltec_e290.svg
new file mode 100644
index 0000000..766545b
--- /dev/null
+++ b/img/heltec_e290.svg
@@ -0,0 +1,28 @@
+
+
+
diff --git a/img/heltec_v4_exp.svg b/img/heltec_v4_exp.svg
new file mode 100644
index 0000000..3dc5eb4
--- /dev/null
+++ b/img/heltec_v4_exp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/heltec_wt2.svg b/img/heltec_wt2.svg
new file mode 100644
index 0000000..19f4077
--- /dev/null
+++ b/img/heltec_wt2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/lilygo_meshos.svg b/img/lilygo_meshos.svg
new file mode 100644
index 0000000..e00e408
--- /dev/null
+++ b/img/lilygo_meshos.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/lilygo_tdisplay_p4.svg b/img/lilygo_tdisplay_p4.svg
new file mode 100644
index 0000000..a533f6f
--- /dev/null
+++ b/img/lilygo_tdisplay_p4.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/lilygo_twatch_plus.svg b/img/lilygo_twatch_plus.svg
new file mode 100644
index 0000000..4799f64
--- /dev/null
+++ b/img/lilygo_twatch_plus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/lilygo_twatch_ultra.svg b/img/lilygo_twatch_ultra.svg
new file mode 100644
index 0000000..90ef040
--- /dev/null
+++ b/img/lilygo_twatch_ultra.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/rak_13302.svg b/img/rak_13302.svg
new file mode 100644
index 0000000..709c9d9
--- /dev/null
+++ b/img/rak_13302.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/rak_3112.svg b/img/rak_3112.svg
new file mode 100644
index 0000000..9a4772a
--- /dev/null
+++ b/img/rak_3112.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/wio_tracker_l1.svg b/img/wio_tracker_l1.svg
index 72179df..68761b4 100644
--- a/img/wio_tracker_l1.svg
+++ b/img/wio_tracker_l1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/img/xiao_nrf52.svg b/img/xiao_nrf52.svg
index 5f8feb9..bc40b55 100644
--- a/img/xiao_nrf52.svg
+++ b/img/xiao_nrf52.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/index.html b/index.html
index 147447e..d25d8e2 100644
--- a/index.html
+++ b/index.html
@@ -5,9 +5,9 @@