Releases: PEG4TRON/MeshCorium
Release list
MeshCorium v0.9.0 — UI/UX improvements & WIKI page + Android client
v0.9.0 — UI/UX improvements & WIKI page + Android client (2026-06-30)
Web: Settings Layout Overhaul
- Maps page summary cards: centered text in mc-map-summary-card
- Settings rows grid: minmax(220px, auto) for adaptive control column width
- Native select and inline input: natural width (not forced 100%)
- mc-settings-inline-controls: no max-width cap, sizes from content
- mc-settings-row-control--stack: gap 8px between stacked controls
- Background blur toggle and wallpaper dropdown swapped order
Web: MeshCore Params Radio Section
- Removed "Section status" and "Companion firmware limitation" info blocks
- Split SF and CR into two separate rows with individual descriptions and sfHint/crHint i18n
- Split TX power and Client repeat into separate rows with txPowerHint/clientRepeatHint
- Client repeat unavailable hint: yellow (mc-settings-inline-hint--warning), moved to label column
- Client repeat condition: shown only when constraints require allowed-range check AND current frequency is outside allowed ranges
Web: MeshCore Params Routing Section
- Multi-Acks: checkbox moved left of numeric input, duplicate label removed
- Telemetry broadcast: extracted into separate card with 3 sub-rows (Base/Location/Environment) + card-body descriptions for each mode value
- TX timing and airtime: extracted into separate card with RX delay base hint (0-20ms) and airtime factor hint (duty_cycle formula)
- Path hash mode: separate card with hop constraints per mode (1-byte=64, 2-byte=32, 3-byte=21 hops) + autoaddMaxHopsHint
- Auto-add contacts: extracted into separate card with 5 individual rows, each with title and description
Web: MeshCore Params Identity Section
- Latitude/Longitude row: title → "Node coordinates" / "Координаты ноды", description → "Latitude, Longitude" / "Широта, Долгота"
- Removed read-only rows: Device model, Device time (UTC), Firmware
- Removed Direct and Flood advert buttons
Web: Wiki Page (NEW)
- New /wiki route with lazy-loaded WikiView
- ShellPageFrame layout matching settings structure: scroller + workspace
- Phonebar in workspace-top (desktop) + mobile phonebar support
- Scroller-footer with MessagesConversationSidebar (status as in Messages)
- Empty scroller-body placeholder for future navigation
- Workspace-header with dynamic title/subtitle from route params
- i18n: wiki section in en.js and ru.js with 5 sections (getting-started, hardware, companion, repeater, faq)
- Rail button with book icon (rotated open book SVG, gradient style matching existing icons)
- Mobile dock Wiki button with router navigation
- Wiki icon: /icons/wiki-icon.svg
Web: Settings Control Width Adaptivity
- All mc-settings-native-select and mc-settings-inline-input: width auto (fit content)
- All mc-settings-inline-controls: no min/max width constraint
- Controls align to flex-end within the column
Wiki Content and Diagrams
- Added file-driven wiki content and SVG attachments for English and Russian locales.
- Docker image now includes
wiki/andweb/attachments/runtime content. - Fixed SVG text layout in wiki diagrams so Russian labels do not overflow their frames.
Android Client
- Android WebView client APK is provided as a separate downloadable GitHub Release asset.
v0.9.0 — UI/UX improvements & WIKI page + Android client (2026-06-30) [RU]
Web: переработка layout настроек
- Карточки summary на странице карт: текст центрирован в
mc-map-summary-card. - Сетка строк настроек получила адаптивную колонку управления
minmax(220px, auto). - Native select и inline input используют естественную ширину, без принудительного
100%. mc-settings-inline-controlsбольше не ограничивает ширину, размеры идут от содержимого.- Для stacked controls добавлен аккуратный gap 8px.
- Переключатель background blur и dropdown wallpaper поменяны местами.
Web: MeshCore Params
- Радио-раздел очищен от лишних информационных блоков, SF/CR и TX power/Client repeat вынесены в отдельные строки с подсказками.
- Routing-раздел переработан: Multi-Acks, telemetry broadcast, TX timing/airtime, path hash mode и auto-add contacts разложены по отдельным понятным карточкам.
- Identity-раздел упрощён: координаты ноды переименованы, read-only строки Device model / Device time / Firmware и advert-кнопки удалены.
Web: Wiki page (НОВОЕ)
- Добавлен маршрут
/wikiс lazy-loadedWikiView. - Wiki использует layout ShellPageFrame: scroller + workspace, как в настройках.
- Добавлена wiki-кнопка в rail и mobile dock с новой SVG-иконкой книги.
- Добавлены locale-aware
pages_en.json/pages_ru.json, markdown-контент и SVG-схемы. - Реализованы публичные endpoints для wiki pages, markdown, attachments и поиска.
Wiki content и SVG-схемы
- Docker image теперь включает runtime-контент
wiki/иweb/attachments/. - Исправлена раскладка текста в SVG-схемах wiki, чтобы русские подписи не выходили за рамки блоков.
Android-клиент
- APK Android WebView-клиента приложен к GitHub Release как отдельный файл для скачивания.
Same-version release refresh
- Added local-only
/api/healthreadiness endpoint for self-update. - Changed launcher update readiness check from authenticated
/api/portsto/api/health. - Added transitional localhost-only
/api/portscompatibility marker so old running launchers can complete this update once. - Added UI notification when the update is installed but
meshcorium.servicemust be restarted to pick up the new launcher.
MeshCorium v0.8.3 — Fixes & Mobile App
v0.8.3 — Fixes & Mobile App (2026-06-29)
Android WebView Client (NEW)
- Native bottom dock with 5 tabs: notifications, chats, contacts, map, settings
- WebView ↔ native navigation via JavaScript bridge (no page reloads)
- Native dock colors and styles matched to web mobile dock
- Long-press Settings → native client settings → editable server connection URL
- Server URL editing reuses UrlEntryActivity in two modes (initial/edit)
- Connection change without app restart (cookie/cache cleanup + WebView reload)
- FCM push notification registration integrated
- WebView same-origin enforcement for security
- Versioned APK in git: meshcorium-android-client.0.8.3.<hash>.apk
Web: Native Shell Support
- detectNativeShell() with MeshcoriumAndroid bridge + User-Agent fallback
- Web mobile dock hidden in native-shell mode (v-if + CSS fallback)
- installNativeActionBridge() — Android dispatches actions to Vue Router
- Vue → native dock state sync: active tab, notification badge, connection status
- Fixed spacer gaps on contacts, maps and settings pages in native-shell mode
- Settings mobile nodebar repositioned to safe-area bottom (no overlapping)
Fixes
- Fixed long-press Settings gesture race (deferred launch via view.post)
- Fixed icon/label overlap in native dock (height 84dp, itemPaddingBottom 12dp)
- Fixed potential badge "0" visibility (zero-string guard)
- Removed singleTask launchMode from UrlEntryActivity (Activity Result API conflict)
Web: CSS & Layout
- mc-native-shell overrides: dock suppression, spacer removal for all pages
- Removed dead mc-page--global-mobile-dock CSS rule
- Settings workspace and section-stack padding adjusted for native-shell
v0.8.3 — Fixes & Mobile App (2026-06-29) [RU]
Android WebView-клиент (НОВОЕ)
- Нативный нижний dock с 5 вкладками: уведомления, чаты, контакты, карта, настройки
- Навигация WebView ↔ native через JavaScript bridge (без перезагрузок страниц)
- Цвета и стили нативного дока приведены к web-доку
- Долгое нажатие Настройки → нативные настройки клиента → редактируемый URL сервера
- Редактирование URL переиспользует UrlEntryActivity в двух режимах (первый запуск/редактирование)
- Смена подключения без перезапуска приложения (очистка cookies/cache + перезагрузка WebView)
- Интегрирована FCM push-регистрация
- Ограничение WebView доверенным origin (same-origin проверка)
- Версионированный APK в git: meshcorium-android-client.0.8.3.<hash>.apk
Web: Поддержка Native Shell
- detectNativeShell() через MeshcoriumAndroid bridge + User-Agent fallback
- Web-док скрывается в native-shell режиме (v-if + CSS fallback)
- installNativeActionBridge() — Android передаёт действия в Vue Router
- Синхронизация Vue → native dock: активная вкладка, badge, статус подключения
- Исправлены зазоры на страницах контактов, карт и настроек в native-shell режиме
- Мобильный nodebar настроек прижат к safe-area снизу (без наложения)
Исправления
- Исправлена гонка жеста долгого нажатия Настроек (отложенный запуск через view.post)
- Исправлено наложение иконок на подписи в нативном доке (высота 84dp, itemPaddingBottom 12dp)
- Исправлен потенциальный бадж "0" (защита от нулевой строки)
- Убран launchMode="singleTask" у UrlEntryActivity (конфликт с Activity Result API)
Web: CSS & Layout
- mc-native-shell overrides: скрытие дока, устранение зазоров для всех страниц
- Убрано мёртвое CSS-правило mc-page--global-mobile-dock
- Отступы Settings workspace и section-stack скорректированы для native-shell
Dev / Unreleased (2026-06-19)
Message Search in Dialogs (desktop) — GitHub issues #112-118
- Backend (#112): New
GET /api/messages/searchendpoint — full-text search (lower(text) LIKE) with optional@senderfilter (text LIKE 'partialname%:%'). Sorting by proximity to viewport center:ORDER BY ABS(id - viewport_center_id) ASC. Supports both channel and contact conversations. Files:meshcorium_web.py(+88 lines). - Frontend — search panel (#113): New
MessagesSearchPanel.vue— draggable float panel with Pointer Events grip (left edge), text input, ↑↓ navigation, ✕ close. Files:MessagesSearchPanel.vue(new, 105 lines). - Frontend — menu entry (#114): «Search» item in ⋮ menu (MessagesWorkspaceHeader.vue) + i18n in all 4 locale files. Files:
MessagesWorkspaceHeader.vue,en.js,ru.js. - Frontend — search logic (#115):
performSearch()with@nameparsing + API call,loadSearchContext(messageId)— REPLACE messages viaanchor_message_id(25 before + 25 after), ↑↓ navigation,closeSearchPanel()without auto-restore. Files:MessagesView.vue(+150 lines). - Frontend — search highlight (#116): Green ring via ring-span pattern (
.mc-message-highlight-ring.is-search) + yellow text highlight via<mark class="mc-search-match-highlight">.searchHighlightedMessageId(Number|null) propagated through 3-component chain: MessagesView → MessagesChatHistoryPane → MessagesMessageBubble. AddedisSearchHighlightedtov-memoarray for render invalidation. Files:MessagesMessageBubble.vue,MessagesChatHistoryPane.vue. - CSS (#117):
.mc-search-panel,.mc-search-grip,.mc-search-input,.mc-search-nav-btn,.has-search-highlight,.mc-search-match-highlight— search panel and highlight styles..is-searchoverrides base.mc-message-highlight-ringopacity and animation for persistent display. Files:styles.css(+109 lines).
Power Icon for Node Disconnect
- Replaced
disconnect-icon.svg(plug icon) with Feather Icons power.svg —<line>for vertical bar +<path>witha9 9 0 1 1for circle arc, solid#12B8F4color. 15+ iterations confirmed: hand-crafted SVG arcs are unreliable; pre-built library paths are recommended. Files:icons/disconnect-icon.svg,ConnectedShellLayout.vue(cache-buster?v=19).
Files changed this session (11): meshcorium_web.py, MessagesSearchPanel.vue (new), MessagesWorkspaceHeader.vue, MessagesView.vue, MessagesMessageBubble.vue, MessagesChatHistoryPane.vue, styles.css, en.js, ru.js, disconnect-icon.svg, ConnectedShellLayout.vue.
Поиск сообщений в диалоге (desktop) — GitHub issues #112-118
- Бэкенд (#112): Новый endpoint
GET /api/messages/search— полнотекстовый поиск (lower(text) LIKE) с опциональным фильтром@отправитель(text LIKE 'частичное_имя%:%'). Сортировка по близости к центру viewport:ORDER BY ABS(id - viewport_center_id) ASC. Поддержка каналов и контактов. Файлы:meshcorium_web.py(+88 строк). - Фронтенд — панель поиска (#113): Новый
MessagesSearchPanel.vue— перетаскиваемая float-панель с Pointer Events grip (левый край), поле ввода, навигация ↑↓, закрытие ✕. Файлы:MessagesSearchPanel.vue(новый, 105 строк). - Фронтенд — пункт меню (#114): Пункт «Поиск» в меню ⋮ (MessagesWorkspaceHeader.vue) + i18n во всех 4 файлах локализации. Файлы:
MessagesWorkspaceHeader.vue,en.js,ru.js. - Фронтенд — логика поиска (#115):
performSearch()с парсингом@имя+ API-запрос,loadSearchContext(messageId)— REPLACE сообщений черезanchor_message_id(25 до + 25 после), навигация ↑↓,closeSearchPanel()без автовосстановления истории. Файлы:MessagesView.vue(+150 строк). - Фронтенд — подсветка (#116): Зелёное кольцо через ring-span паттерн (
.mc-message-highlight-ring.is-search) + жёлтая подсветка текста через<mark class="mc-search-match-highlight">.searchHighlightedMessageId(Number|null) проброшен через цепочку из 3 компонентов: MessagesView → MessagesChatHistoryPane → MessagesMessageBubble. ПолеisSearchHighlightedдобавлено в массивv-memoдля инвалидации рендера. Файлы:MessagesMessageBubble.vue,MessagesChatHistoryPane.vue. - CSS (#117):
.mc-search-panel,.mc-search-grip,.mc-search-input,.mc-search-nav-btn,.has-search-highlight,.mc-search-match-highlight— стили панели и подсветки..is-searchпереопределяет opacity и animation базового.mc-message-highlight-ringдля постоянного отображения. Файлы:styles.css(+109 строк).
Иконка power ⏻ для отключения от ноды
- Замена
disconnect-icon.svg(иконка штекера) на Feather Icons power.svg —<line>для вертикальной черты +<path>сa9 9 0 1 1для дуги окружности, цвет solid#12B8F4. 15+ итераций подтвердили: самописные SVG-дуги ненадёжны; рекомендуется использовать готовые библиотечные path. Файлы:icons/disconnect-icon.svg,ConnectedShellLayout.vue(cache-buster?v=19).
Файлы, изменённые в сессии (11): meshcorium_web.py, MessagesSearchPanel.vue (новый), MessagesWorkspaceHeader.vue, MessagesView.vue, MessagesMessageBubble.vue, MessagesChatHistoryPane.vue, styles.css, en.js, ru.js, disconnect-icon.svg, ConnectedShellLayout.vue.
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-сценариях.
Настройки карты и фильтрация...
MeshCorium v0.8.1 — Mobile UX & Quality
Changelog
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.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 слев...
MeshCorium v0.8.0 — Mobile UI & Maps (stable)
Mobile UI & Maps (stable)
- Mobile Responsive UI: All major views (Maps, Contacts, Messages, Settings, Repeater Management) adapted for 1024px breakpoint with dedicated mobile shells, bottom-sheet overlays, and bottom docks.
- Maps: Map provider selector (OSM Raster / OFM Liberty), reliable tile loading through local proxy, fixed OSM raster fallback template.
- SSE fixes: Cascading disconnection prevention when resuming background sessions.
- Read tracking: Fixed read marker on mobile back navigation, channel unread key mismatch, loadNewerMessages auto-mark.
- Systemd service: Unit with automatic ttyACM0/ttyUSB* permission fix, multi-device support (nRF52, ESP32-S3, ESP32+CP2102/CH340).
- Architecture:
useIsMobile,useUpdateCheck,shellPanels.js,contactRoutes.js,statusText.js. - Desktop unchanged: All existing transports (USB, BLE, Wi-Fi/LAN, Docker) remain fully functional.
Мобильный UI и карты (стабильный)
- Мобильный адаптивный UI: Все основные виды (Карты, Контакты, Сообщения, Настройки, Управление репитерами) адаптированы для 1024px с выделенными мобильными оболочками, оверлеями и нижними доками.
- Карты: Выбор источника карт (OSM Raster / OFM Liberty), надёжная загрузка тайлов через локальный прокси, исправлен шаблон OSM raster.
- Исправления SSE: Предотвращение каскадных разрывов при возобновлении фоновых сессий.
- Трекинг прочитанного: Исправлен маркер прочтения при возврате на мобильном, несовпадение ключей unread каналов, авто-отметка loadNewerMessages.
- Systemd-сервис: Юнит с автоматическим исправлением прав ttyACM0/ttyUSB*, поддержка нескольких устройств.
- Архитектура:
useIsMobile,useUpdateCheck,shellPanels.js,contactRoutes.js,statusText.js. - Десктоп без изменений: Все транспорты (USB, BLE, Wi-Fi/LAN, Docker) полностью работоспособны.
(BUG)MeshCorium v0.7.4 — BugFix: missing web/index.html
Release was missing web/index.html (Vite entry point), causing launcher crash loop. Fixed.
Includes meshcorium.service with ExecStartPre for automatic /dev/ttyACM0 permission fix (chgrp dialout + chmod g+rw on every start/restart).
В релизе не хватало web/index.html (входная точка Vite), из-за чего лаунчер падал в цикл. Исправлено.
Добавлен meshcorium.service с ExecStartPre для авто-фикса прав /dev/ttyACM0 при каждом запуске/рестарте.
(BUG)MeshCorium v0.7.3 — Update mechanics + notifications (BugFix)
Auto-reload after successful update — page navigates to self for full reload. Fixed state-file race condition (idle written before Python starts). Polling survives network errors during server restart.
Авто-перезагрузка страницы после успешного обновления (полная навигация). Исправлена гонка состояний (idle пишется до запуска Python). Опрос состояния переживает сетевые ошибки при рестарте сервера.
(BUG)MeshCorium v0.7.2 — Update mechanics + notifications
Self-update system, update notifications in UI, stub supervisor with auto-check and rollback.
Система самообновления, уведомления о новых версиях в интерфейсе, stub supervisor с авто-проверкой GitHub и ролбэком.
MeshCorium v0.7.1 -- BUGFIX
Fixed a bug where chats with a large number of unread messages did not load all the way to the most recent messages.
What was the problem: when opening a chat where many new messages had accumulated, the app loaded messages starting from the first unread one and showed only a limited window around it. Scrolling down stopped at the edge of that window and did not load the newer messages that had arrived since. The only way to see them was to close and reopen the chat, or refresh the page.
What was fixed:
- scrolling down now automatically loads the next batch of newer messages, the same way scrolling up loads older ones;
- the «scroll to newest» button now loads all the way to the really newest message in the database without stopping at the edge of the local window.
Исправлен баг, при котором чаты с большим количеством непрочитанных сообщений не догружали переписку до самых свежих сообщений.
В чём была проблема: при входе в чат, где накопилось много новых сообщений, приложение начинало показывать переписку от первого непрочитанного и отображало только ограниченное окно вокруг него. Скролл вниз упирался в край этого окна и не подгружал новые сообщения, пришедшие позже. Увидеть их можно было только переоткрыв чат или обновив страницу.
Что исправлено:
- скролл вниз теперь автоматически подгружает следующую порцию более новых сообщений — так же, как скролл вверх подгружает более старые;
- кнопка «пролистать к самому новому» теперь догружает всё до действительно последнего сообщения в базе, не останавливаясь на краю локального окна.
MeshCorium v0.7.0 -- Docker + USB + BLE + WIFI/LAN
MeshCorium v0.7.0 promotes Wi-Fi/LAN TCP transport into the published release profile alongside Docker, USB serial, and BLE. This release aligns the runtime so post-connect behavior is transport-aware across USB, BLE, and Wi-Fi/LAN, improves message bootstrap and dialog preview consistency, and keeps the Docker bundle building the current frontend and backend directly from the release tree.
Key changes:
- official Wi-Fi/LAN TCP transport release support through a manual
host:portconnection flow; - transport-aware active session routing for post-connect runtime behavior across views;
- bootstrap queue drain immediately after session readiness, so queued messages load without waiting for an extra push event;
- transient Wi-Fi frame timeouts are treated as idle gaps instead of fatal disconnects;
- improved dialog preview and unread state synchronization;
- Docker metadata and compose labels updated for
v0.7.0.
MeshCorium v0.7.0 переводит Wi-Fi/LAN TCP transport из экспериментального состояния в официальный релизный профиль наряду с Docker, USB serial и BLE. В этом релизе runtime выровнен так, чтобы post-connect поведение было transport-aware для USB, BLE и Wi-Fi/LAN, улучшена начальная синхронизация сообщений и согласованность preview диалогов, а Docker-бандл по-прежнему собирает актуальный frontend и backend прямо из release-tree.
Основные изменения:
- официальный релизный профиль Wi-Fi/LAN TCP transport с ручным
host:portсценарием подключения; - transport-aware active session routing для post-connect runtime поведения во view-слое;
- bootstrap queue drain сразу после готовности сессии, чтобы накопленные сообщения загружались без ожидания лишнего push-события;
- transient Wi-Fi frame timeout больше не считается фатальным disconnect и трактуется как idle gap;
- улучшена синхронизация preview диалогов и unread-состояния;
- обновлены Docker metadata и compose labels для
v0.7.0.