MeshCorium v0.8.2 — Auto-Update Fix
Changelog
v0.8.2 — Auto-Update Fix (2026-06-18)
Service & Deployment
-
CRITICAL FIX: Added missing
--superviseflag to systemd serviceExecStartline inmeshcorium-launcher.sh. Without this flag, the launcher ran in default--runmode — starting the Python process directly without the supervisor loop that handles GitHub release checks and the self-update lifecycle. This prevented automatic update discovery from working in all previous releases that used systemd. -
Impact: After this fix,
meshcorium.servicerunsmeshcorium-launcher.sh --superviseinstead ofmeshcorium-launcher.sh(default--run). The supervisor now polls GitHub every 30 minutes for new releases, writes.meshcorium_update_availableflag file, and manages the full install/rollback lifecycle viaupdater.sh. -
Upgrade note: Existing installations can fix the systemd unit without reinstalling by running the provided fix script:
cd /opt/MeshCorium && curl -sSL https://raw.githubusercontent.com/PEG4TRON/MeshCorium/main/fix-autoupdate.sh | bash
The script detects the installation, creates a backup, patches
ExecStart, validates withsystemd-analyze verify, and restarts the service. Alternatively, runmeshcorium-launcher.sh --installto recreate the unit from the corrected template.
v0.8.1 — Mobile UX & Quality (2026-06-18)
Map provider fallback
- Unified MapLibre provider selection and fallback behavior across all secondary maps: message route maps, repeater geo picker, and contact route editor now honor the saved
map_providersetting just like the main Maps page. - Extracted shared map provider constants, style builders, tile proxy rewriting, provider normalization, and raster fallback helpers into
web/src/lib/mapLibre.js. - Added a 6-second map style boot timeout and error-triggered fallback from OpenFreeMap / OFM Liberty to OSM Raster for secondary map sheets, matching the main Maps page behavior.
- Continued routing both OpenFreeMap and OSM raster tile requests through the local
/api/tiles/proxyendpoint to avoid direct LAN/browser tile loading problems.
Map settings and data filtering
- Added a persisted
map_max_distance_kmclient setting with a default of 400 km and a supported range of 1–20000 km. - Added desktop and mobile Maps UI controls for changing the maximum contact-rendering distance. Contacts outside the configured home-node radius are filtered from map display.
Settings and update UX
- Added a manual update-check button next to the displayed version in Settings → About.
- Corrected the Settings/About fallback display version for this release.
Docker and release packaging
- Added
.meshcorium_versionto the Docker runtime image so containerized/api/update/checkreports the same0.8.1version as the normal launcher build. - Updated Docker Compose image/release metadata to
0.8.1/0.8.1--map-fixes. - Added the previously omitted helper script
download_meshcore_node_svgs.pyto the Docker runtime copy list, keeping root Python files explicit in the Dockerfile. - Kept the cleaned release tree rules from v0.8.0: runtime data, logs, caches, virtual environments, and node modules are excluded from release artifacts.
Messages
Scroll-to-newest
- Fixed broken scroll-to-bottom button in conversations: clicking "scroll to newest" now jumps directly to the last message in the database, loading a fresh batch of 50 latest messages and marking all previous messages as read.
- Added
latest=truequery parameter tolist_channel_messagesandlist_contact_messages— direct jump to the newest DB messages instead of iterative pagination. - Rewrote
scrollToNewestMessage()inMessagesView.vue: single API call replaces old messages instead of merging, marks all messages up to the newest as read viaPOST /api/messages/read-up-to. - Fixed infinite loop in
scrollToNewestMessage: addedlastNewerLoadHadResultsref guard incanLoadNewerMessagescomputed. - Fixed missing
/apiprefix and wrong endpoint (/messages/list→/api/messages/channelwith GET query params) in scroll-to-newest. - Fixed
read-up-tocall: properPOSTwithmethod+body: JSON.stringify(...)andconversation_kind/conversation_valueparams.
Ghost channels (empty channel_identity)
- Backend:
_build_channel_unread_payload_for_portnow filters out messages with emptychannel_identityfrom unread summary and logs a warning. - Frontend:
regularNotificationEntriesinConnectedShellLayout.vueskips channels with emptychannel_identity(no more #N + 🔒 entries). - Fixed
conn.fetchall()onsqlite3.Connection(must be called on cursor, not connection).
Mobile UI
Composer
- Send button moved to the right side of the input row, symmetric to the GIF button on the left — 46×46px icon-only button with paper-plane icon, no text label.
MessagesComposerBar.vueimportsuseIsMobilefor conditional rendering (icon on mobile, text label on desktop).
Icons
- All emoji icons (🔔💬👥🗺⚙) replaced with stroke-based SVG icons in the project's cyan-to-blue gradient style (#12B8F4→#5A74C9), viewBox 0 0 512 512.
- Five new icons created:
contacts-icon.svg,map-icon.svg,settings-icon.svg,disconnect-icon.svg,console-icon.svgin/icons/. MobileDockButton.vueupdated to support SVG URLs via<img>when icon starts with/.- Emoji icons replaced in
ConnectedShellLayout.vue(desktop rail + mobile dock),MessagesView.vue(mobile dock ×2), andContactsView.vue(mobile dock).
Component extraction
- Extracted
MobileNodebar.vueandMobileDockBar.vuefrom duplicative HTML inMessagesView.vue— eliminates copy-paste between conversation list and chat overlay views. - Fixed vertical mobile dock regression: removed duplicate
<nav>wrapper fromMobileDockBar.vue(shell already provides the container).
Timestamp
- Added year to message timestamp format:
DD.MM, HH:MM→DD.MM.YYYY, HH:MM. - On mobile, message timestamp moved from message header to footer — separate line, right-aligned, 10px muted text.
Frontend Engineering
CSS system
- All
100vhreplaced with100dvh(12 occurrences) for iOS Safari viewport stability. - Unified border-radius into 4 CSS custom properties:
--mc-radius-sm: 8px,--mc-radius: 12px,--mc-radius-lg: 16px,--mc-radius-pill: 999px— replaces 9 ad-hoc values (167 replacements). - Added
:activetactile button feedback:scale(0.98) translateY(1px). - Added
:focus-visiblea11y outlines: 2px accent border with 2px offset on all interactive elements. - Added 200ms
transitiononbackground-color,color,border-color,opacity,transformfor all interactive elements. - Unified monospace font fallback:
"IBM Plex Mono", monospace— removed"Fira Code","Consolas","JetBrains Mono"variants. - Added skeleton loader CSS:
.mc-skeletonwith pulse animation, conversation and message bubble skeleton variants. - Replaced 42
.is-firefoxclass selectors with@supports (-moz-appearance: none)feature queries.
Performance
- Added RAF debounce (
requestAnimationFrameguard) forupdateConversationListMetrics()inuseMessagesConversationList.js— prevents double recalculation per frame from scroll + ResizeObserver events.
Difference from v0.8.0
- v0.8.0 introduced the stable mobile UI and the initial Maps provider selector/fallback path on the main Maps page.
- v0.8.1 is a focused map-fixes release: it extends the same provider/fallback logic to every secondary MapLibre surface, adds a configurable contact distance limit, and fixes Docker/runtime version metadata for the new release.
v0.8.2 — Auto-Update Fix (2026-06-18) [RU]
Сервис и деплой
-
КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Добавлен отсутствующий флаг
--superviseв строкуExecStartsystemd-сервиса вmeshcorium-launcher.sh. Без этого флага лаунчер работал в режиме--runпо умолчанию — запуская Python-процесс напрямую, без цикла supervisor, который отвечает за проверку GitHub-релизов и жизненный цикл самообновления. Это делало автоматическое обнаружение обновлений нерабочим во всех предыдущих версиях, использующих systemd. -
Эффект: После этого исправления
meshcorium.serviceзапускаетmeshcorium-launcher.sh --superviseвместоmeshcorium-launcher.sh(по умолчанию--run). Supervisor теперь опрашивает GitHub каждые 30 минут на наличие новых релизов, создаёт флаг-файл.meshcorium_update_availableи управляет полным циклом установки/отката черезupdater.sh. -
Примечание по обновлению: Существующие установки могут исправить systemd unit без переустановки, запустив скрипт:
cd /opt/MeshCorium && curl -sSL https://raw.githubusercontent.com/PEG4TRON/MeshCorium/main/fix-autoupdate.sh | bash
Скрипт определяет установку, создаёт резервную копию, исправляет
ExecStart, проверяет черезsystemd-analyze verifyи перезапускает сервис. Альтернативно можно выполнитьmeshcorium-launcher.sh --installдля создания unit из исправленного шаблона.
v0.8.1 — Mobile UX & Quality (2026-06-18) [RU]
Fallback провайдера карт
- Унифицирован выбор MapLibre-провайдера и fallback-поведение во всех вторичных картах: карты маршрутов в сообщениях, выбор геопозиции repeater и редактор маршрута контакта теперь учитывают сохранённую настройку
map_provider, как и основная страница Maps. - Общие константы провайдеров, сборщики стилей, переписывание URL тайлов через proxy, нормализация провайдера и helpers растрового fallback вынесены в
web/src/lib/mapLibre.js. - Добавлен 6-секундный таймаут загрузки map style и fallback по ошибкам OpenFreeMap / OFM Liberty → OSM Raster для вторичных карт, в том же стиле, что и на главной странице Maps.
- Запросы тайлов OpenFreeMap и OSM raster продолжают идти через локальный
/api/tiles/proxy, чтобы избежать проблем прямой загрузки тайлов из браузера в LAN-сценариях.
Настройки карты и фильтрация данных
- Добавлена сохраняемая настройка клиента
map_max_distance_km: по умолчанию 400 км, допустимый диапазон 1–20000 км. - На desktop и mobile Maps добавлены элементы управления максимальной дистанцией отображения контактов. Контакты за пределами настроенного радиуса от home-ноды отфильтровываются с карты.
Settings и проверка обновлений
- Добавлена кнопка ручной проверки обновлений рядом с версией в Settings → About.
- Исправлена fallback-версия, показываемая в Settings/About для этого релиза.
Docker и релизная упаковка
.meshcorium_versionдобавлен в runtime-образ Docker, поэтому контейнерный/api/update/checkсообщает ту же версию0.8.1, что и обычный launcher-сценарий.- Docker Compose metadata обновлены до
0.8.1/0.8.1--map-fixes. - В Dockerfile добавлен ранее пропущенный helper
download_meshcore_node_svgs.py, чтобы root Python-файлы оставались явно перечислены. - Сохранены правила чистого релизного дерева v0.8.0: пользовательские данные, логи, кэши, virtualenv и node_modules не входят в релизные артефакты.
Сообщения
Прокрутка к новым
- Исправлена сломанная кнопка прокрутки до конца в диалогах: нажатие «к последнему» теперь переходит напрямую к последнему сообщению в базе данных, загружая свежую пачку из 50 последних сообщений и отмечая все предыдущие как прочитанные.
- Добавлен параметр
latest=trueвlist_channel_messagesиlist_contact_messages— прямой переход к новейшим сообщениям в БД вместо итеративной пагинации. - Переписан
scrollToNewestMessage()вMessagesView.vue: один API-вызов заменяет старые сообщения вместо слияния, помечает все сообщения до новейшего как прочитанные черезPOST /api/messages/read-up-to. - Исправлен бесконечный цикл в
scrollToNewestMessage: добавлен guardlastNewerLoadHadResultsref в computedcanLoadNewerMessages. - Исправлен отсутствующий префикс
/apiи неверный endpoint (/messages/list→/api/messages/channelс GET query params) в scroll-to-newest. - Исправлен вызов
read-up-to: корректныйPOSTсmethod+body: JSON.stringify(...)и параметрамиconversation_kind/conversation_value.
Призрачные каналы (пустой channel_identity)
- Бэкенд:
_build_channel_unread_payload_for_portтеперь фильтрует сообщения с пустымchannel_identityиз unread-сводки и логирует предупреждение. - Фронтенд:
regularNotificationEntriesвConnectedShellLayout.vueпропускает каналы с пустымchannel_identity(больше нет #N + 🔒 записей). - Исправлен
conn.fetchall()наsqlite3.Connection(должен вызываться на курсоре, а не на connection).
Мобильный UI
Композер
- Кнопка отправки перемещена в правую часть строки ввода, симметрично кнопке GIF слева — иконка 46×46px с paper-plane, без текстовой метки.
MessagesComposerBar.vueимпортируетuseIsMobileдля условного рендеринга (иконка на mobile, текстовая метка на desktop).
Иконки
- Все emoji-иконки (🔔💬👥🗺⚙) заменены на stroke-based SVG иконки в градиентном стиле cyan-to-blue (#12B8F4→#5A74C9), viewBox 0 0 512 512.
- Создано пять новых иконок:
contacts-icon.svg,map-icon.svg,settings-icon.svg,disconnect-icon.svg,console-icon.svgв/icons/. MobileDockButton.vueобновлён для поддержки SVG URL через<img>, когда иконка начинается с/.- Emoji-иконки заменены в
ConnectedShellLayout.vue(desktop rail + mobile dock),MessagesView.vue(mobile dock ×2) иContactsView.vue(mobile dock).
Выделение компонентов
- Выделены
MobileNodebar.vueиMobileDockBar.vueиз дублирующего HTML вMessagesView.vue— устранён copy-paste между списком диалогов и оверлеем чата. - Исправлена регрессия вертикального mobile dock: удалена дублирующая обёртка
<nav>изMobileDockBar.vue(shell уже предоставляет контейнер).
Временные метки
- Добавлен год в формат временных меток сообщений:
DD.MM, HH:MM→DD.MM.YYYY, HH:MM. - На mobile временная метка перемещена из заголовка сообщения в футер — отдельная строка, выравнивание вправо, muted-текст 10px.
Фронтенд-инженерия
CSS-система
- Все
100vhзаменены на100dvh(12 вхождений) для стабильности viewport в iOS Safari. - Унифицирован border-radius в 4 CSS custom properties:
--mc-radius-sm: 8px,--mc-radius: 12px,--mc-radius-lg: 16px,--mc-radius-pill: 999px— заменяет 9 ad-hoc значений (167 замен). - Добавлена тактильная обратная связь
:activeдля кнопок:scale(0.98) translateY(1px). - Добавлены a11y-обводки
:focus-visible: акцентная рамка 2px с отступом 2px на всех интерактивных элементах. - Добавлен 200ms
transitionдляbackground-color,color,border-color,opacity,transformна всех интерактивных элементах. - Унифицирован fallback моноширинного шрифта:
"IBM Plex Mono", monospace— удалены варианты"Fira Code","Consolas","JetBrains Mono". - Добавлен CSS для skeleton loader:
.mc-skeletonс pulse-анимацией, варианты скелета для диалогов и пузырей сообщений. - 42 селектора
.is-firefoxзаменены на feature-запросы@supports (-moz-appearance: none).
Производительность
- Добавлен RAF debounce (
requestAnimationFrameguard) дляupdateConversationListMetrics()вuseMessagesConversationList.js— предотвращает двойной пересчёт за кадр от событий scroll + ResizeObserver.
Отличия от v0.8.0
- v0.8.0 принёс стабильный mobile UI и начальный selector/fallback провайдера карт на основной странице Maps.
- v0.8.1 — точечный релиз исправлений карт: тот же provider/fallback распространён на все вторичные MapLibre-поверхности, добавлен настраиваемый лимит дистанции контактов, а Docker/runtime metadata версии исправлены для нового релиза.
v0.8.0 — Mobile UI & Maps (stable) (2026-05-26)
Mobile Responsive UI (1024px breakpoint)
- Maps page: Full-screen map with floating controls (☰ sidebar, 📍 center, ☀/🌙 theme), sidebar as bottom-sheet overlay (stats, legend, actions, route tracing), nodebar with ch/cont counters. Desktop unchanged.
- Contacts page: Full mobile shell with compact phonebar, topbar, collapsible search/filter tools, scrollable contacts body, mobile nodebar, bottom dock. Desktop unchanged.
- Messages page: Mobile shell with compact phonebar, topbar, messages list, composer, nodebar, bottom dock.
- Settings navigation:
/settingsshows only category list, section URLs show standalone page with mobile back action. Desktop unchanged. - Notifications overlay: Notifications open as in-place shell overlay via
query.panel=notificationsinstead of navigating to/messages. Preserves route query state. - Repeater management: Adapted for mobile — full-screen category list + category content (9 categories), 2-level navigation like Settings. Added mobile repeater login form.
- Mobile docks: Contacts/Messages docks updated for shared shell-panel toggle. Added fallback global mobile dock for connected routes.
- Mobile components:
MobileContactsShell.vue,MobileDockButton.vue,MobileMessagesShell.vue.
Maps
- Added a persisted map provider selector on the desktop and mobile Maps sidebars, with the default OSM Raster provider and
OFM Libertysaved through the MeshCorium client settings config file. - Restored reliable map tile loading on the LAN stand by preventing double-proxy tile URLs, accepting valid empty vector
.pbftile responses in the backend proxy, and switching the main maps view to a fast OSM raster basemap through the local tile proxy when OpenFreeMap sprite/raster downloads stall. - Fixed the OSM raster fallback tile template so MapLibre substitutes numeric
{z}/{x}/{y}coordinates before the local proxy wraps the request.
Fixes
- Read marker on mobile back:
goBackFromChat()now callsmarkVisibleMessagesRead()before clearing conversation selection. - Channel unread summary key: Fixed key mismatch in
setReadMarkerresponse handler — useselectedChannelIdentitywhen available. - Read tracking in loadNewerMessages: Newly loaded messages at bottom of chat are immediately marked as read after merge.
- Mobile Contacts notification badge: Uses audible unread total instead of raw channel/contact unread maps.
- Mobile Contacts nodebar: Added
ch:channel counter next tocont:contact counter. - SSE cascading disconnections: Prevented cascading SSE disconnections when resuming background session from
_paused_background_session. Added_suppress_initial_connected_broadcastflag.
Service & Deployment
- Added systemd service unit (
meshcorium.service) with automatic ttyACM0 permission fix. - Service now handles all ttyACM* and ttyUSB* devices (nRF52, ESP32-S3, ESP32+CP2102/CH340).
Architecture
- Refactored update check into
useUpdateCheck.jscomposable. - Unified mobile navigation patterns.
- Added
useIsMobilecomposable (1024px breakpoint). - Added
shellPanels.jslibrary for shared shell-panel state management. - Added
contactRoutes.jsandstatusText.jslibraries.
Frontend Changes
web/src/views/MapsView.vueweb/src/views/MessagesView.vueweb/src/views/ContactsView.vueweb/src/views/SettingsView.vueweb/src/components/layout/ConnectedShellLayout.vueweb/src/components/layout/ShellPageFrame.vueweb/src/components/layout/MobileContactsShell.vue(new)web/src/components/layout/MobileDockButton.vue(new)web/src/components/layout/MobileMessagesShell.vue(new)web/src/components/messages/MessagesMessageBubble.vueweb/src/components/messages/MessagesMessageContextMenu.vueweb/src/components/messages/MessagesNotificationsSheet.vueweb/src/components/messages/MessagesRouteMapSheet.vueweb/src/components/contacts/ContactsRepeaterGeoSheet.vueweb/src/components/contacts/ContactsRouteEditorSheet.vueweb/src/composables/useMessagesReadTracking.jsweb/src/composables/useUpdateCheck.js(new)web/src/composables/useIsMobile.js(new)web/src/lib/shellPanels.js(new)web/src/lib/contactRoutes.js(new)web/src/lib/statusText.js(new)web/src/i18n/messages/en.jsweb/src/i18n/messages/ru.jsweb/src/styles.cssmeshcorium_web.py
Test Server
- Deployed and running on test stand (192.168.2.22:8080)
v0.7.0
Release MeshCorium v0.7.0 -- Docker + USB + BLE + WIFI/LAN promotes the previously experimental Wi-Fi/LAN TCP transport into the published release profile and aligns the runtime so post-connect behavior is transport-aware across USB, BLE, and Wi-Fi/LAN.
Wi-Fi / LAN transport
- Wi-Fi/LAN TCP companion transport is now part of the release bundle through
meshcorium_wifi_transport.pyandWIFI_TRANSPORT_TYPErouter integration. - The connection UI now exposes a real manual
host:portWi-Fi/LAN connect flow instead of a placeholder-only transport tab. - Saved/startup connection handling, phonebar transport state, and settings-side connection selection now understand Wi-Fi/LAN endpoints as first-class transport profiles.
Runtime parity and message flow
- Active session routing for SSE, API requests, and post-connect screens was extended so Contacts, Messages, Maps, Settings, and shell runtime logic follow the actual active transport instead of assuming USB-only
selectedPortsemantics. - Bootstrap now performs an initial queued-message drain after
readyso message history does not wait for a laterMSG_WAITINGevent before appearing. - Wi-Fi frame read timeouts are now treated as transient idle gaps rather than fatal reader failures, reducing disconnects during long idle periods or heavy channel history reads.
- Conversation previews now stay aligned between the open chat and the dialog card list by applying fresh
/api/messages/conversationspreview data to live on-node dialog rows.
Docker and packaging
- Docker release metadata now uses
v0.7.0labels. - The release Docker bundle continues to build the frontend inside Docker build and includes the current backend/frontend code used by the ordinary launcher runtime, including Wi-Fi/LAN transport support.
- Launcher-side frontend builds now reserve a larger default Node heap, reducing Vite out-of-memory failures on weaker hosts during release startup/build paths.
v0.6.1
Release MeshCorium v0.6.1 -- Docker + USB + BLE is based on v0.6.0 and keeps the same runtime variants while adding browser-side unread notifications and unread badge propagation into the tab title.
Notifications and browser UX
- Browser notifications are now emitted for unread growth across all unread types after the current owner-scope and mute filters are applied.
- The browser tab title now receives a combined unread badge so MeshCorium remains visible even when the tab is in the background.
- Notification permission is requested from a real user gesture inside the shell so browser delivery works without breaking initial page load.
Docker and runtime
- Docker release metadata now uses
v0.6.1labels. - The release Docker bundle continues to build the frontend inside Docker build and includes the current backend/frontend code used by the ordinary launcher runtime.
v0.6.0
Release MeshCorium v0.6.0 -- Docker + USB + BLE promotes the post-v0.5.3 development work into a release. The key difference from v0.5.3 -- Docker + USB is that BLE is now shipped as an available node connection path alongside the permanent USB serial transport, while Docker remains part of the ordinary release bundle.
Connection and transports
- BLE connection to a MeshCore companion node is now available alongside the permanent USB serial transport.
- USB serial remains a first-class supported path and is not being removed.
- BLE support now includes discovery, node selection, PIN entry, connect flow, unpair action, pairing status, and separate BLE history in the connection UI.
- Backend transport handling was moved further toward the adapter model: USB serial and BLE are handled by transport-specific adapters while higher-level backend code uses universal connection/session calls.
- Known-node persistence was added for successful connections, transport type, BLE address, public key, node name, and saved BLE PIN state.
- BLE PIN handling was changed from repeated dynamic rotation to one-time managed initialization after the first successful user-provided PIN connection, with the saved PIN kept in the known-node DB.
MeshCore node settings
/settings/node/meshcore-paramswas expanded into dedicated MeshCore parameter pages.- Radio settings now include regional presets, including a Russia preset, and safer backend application through the companion client instead of direct serial-only paths.
- BLE snapshot/apply operations now include pacing and short cooldowns to reduce the chance of overloading BLE-connected nodes during repeated heavy settings reads or writes.
- A separate battery settings page was added under
/settings/node/battery. - Battery profile settings allow per-node voltage range calibration for displayed battery percentage.
Meshcorium data and owner-scope features
- Meshcorium settings now include separate controls for global contacts, messages, and channels across owner IDs.
- Global channel access can place channels from the local DB into free node IDX slots and remove the channels that were added by that mode when it is disabled.
- Channel metadata now tracks where channels exist on nodes and which IDX slots they occupy.
- Dialog/channel editing was extended with delete flows that remove channel IDX data from the node where applicable.
- Category-based DB import/export was added to
/settings/meshcorium; imports merge with existing data, ignore exact duplicates, and surface conflicts where user choice is needed.
Messages, notifications, and channels
- Message and unread handling was adjusted so owner-scope filtering affects counters, notification badges, and conversation visibility consistently.
- Mute / mentions-only behavior was corrected so ordinary unread badges and notification entries do not appear when a conversation is muted except for mentions.
- Channel list and conversation flows were updated around global-channel visibility and node IDX availability.
UI and UX
- The connection float was redesigned around transport modes, with BLE-specific states and history separated from USB serial state.
- The phonebar is transport-aware: USB and BLE use different connection icons, while battery percentage is shown only for BLE/Wi-Fi style connections.
- Battery icons were added next to the phonebar battery percentage.
- Sync icons and active sync/scan animations were unified around
icons/sync.svg. - Dropdowns were improved with scroll handling and optional filtering when the menu does not fit on screen.
- Duplicate hover hints were removed where button text already explains the action.
- Route-level loading components were added for heavier Vue screens.
- Static visual assets such as background images are now cache-friendly for the browser.
Battery history
- Battery readings are persisted per node owner ID.
- The battery page now includes a DB-backed graph with presets for 6 hours, 12 hours, 1 day, 1 week, 1 month, and custom ranges.
- The graph supports density control by averaging samples at lower density.
- Optional sunlight context can be shown under the graph when node geo is valid; all-zero coordinates are treated as missing geo.
- Battery history retention can be configured for 7 days, 1 month, 3 months, 6 months, or 1 year.
Launcher and runtime
- Launcher venv handling was hardened so partial or missing virtual environments are recreated more reliably.
- Launcher can add the current user to serial-access groups detected from USB serial devices, such as
dialout. - Frontend build behavior remains compatible with a prebuilt
web/distfallback, while still rebuilding locally when Node/NPM are present. - Docker was updated for the current runtime: the image now includes the new backend modules required by
meshcorium_web.py, mounts host/devand read-only/run/udevfor launcher-like device visibility, and mounts host/run/dbusso BLE can use host BlueZ from inside the container. - The Docker image tag and release label now use
v0.6.0metadata instead of the oldv0.5.3-dockerlabel.
v0.5.3
Release v0.5.3 -- Docker + USB is based on post-v0.5.2 development work and adds the first official Docker packaging variant alongside the ordinary USB release workflow.
Docker and runtime layout
- The release bundle now includes both:
- the ordinary local launcher / systemd runtime
- a Docker Compose runtime variant
- Added:
Dockerfiledocker-compose.ymldocker/docker-entrypoint.sh.dockerignoredefaults/client_settings.json
- Docker runtime layout is now:
/etc/meshcoriumfor config/var/lib/meshcoriumfor runtime data and SQLite DBs/var/log/meshcoriumfor logs
meshcorium_web.pynow supports environment-driven runtime paths so the same backend can run in both local and containerized layouts without losing the ordinarydata/+logs/defaults.