Skip to content

Releases: PEG4TRON/MeshCorium

MeshCorium v0.9.0 — UI/UX improvements & WIKI page + Android client

Choose a tag to compare

@PEG4TRON PEG4TRON released this 30 Jun 17:50

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/ and web/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-loaded WikiView.
  • 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/health readiness endpoint for self-update.
  • Changed launcher update readiness check from authenticated /api/ports to /api/health.
  • Added transitional localhost-only /api/ports compatibility marker so old running launchers can complete this update once.
  • Added UI notification when the update is installed but meshcorium.service must be restarted to pick up the new launcher.

MeshCorium v0.8.3 — Fixes & Mobile App

Choose a tag to compare

@PEG4TRON PEG4TRON released this 29 Jun 02:36

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/search endpoint — full-text search (lower(text) LIKE) with optional @sender filter (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 @name parsing + API call, loadSearchContext(messageId) — REPLACE messages via anchor_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. Added isSearchHighlighted to v-memo array 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-search overrides base .mc-message-highlight-ring opacity 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> with a9 9 0 1 1 for circle arc, solid #12B8F4 color. 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

Choose a tag to compare

@PEG4TRON PEG4TRON released this 18 Jun 17:28

Changelog

v0.8.2 — Auto-Update Fix (2026-06-18)

Service & Deployment

  • CRITICAL FIX: Added missing --supervise flag to systemd service ExecStart line in meshcorium-launcher.sh. Without this flag, the launcher ran in default --run mode — 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.service runs meshcorium-launcher.sh --supervise instead of meshcorium-launcher.sh (default --run). The supervisor now polls GitHub every 30 minutes for new releases, writes .meshcorium_update_available flag file, and manages the full install/rollback lifecycle via updater.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 with systemd-analyze verify, and restarts the service. Alternatively, run meshcorium-launcher.sh --install to 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_provider setting 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/proxy endpoint to avoid direct LAN/browser tile loading problems.

Map settings and data filtering

  • Added a persisted map_max_distance_km client 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_version to the Docker runtime image so containerized /api/update/check reports the same 0.8.1 version 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.py to 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=true query parameter to list_channel_messages and list_contact_messages — direct jump to the newest DB messages instead of iterative pagination.
  • Rewrote scrollToNewestMessage() in MessagesView.vue: single API call replaces old messages instead of merging, marks all messages up to the newest as read via POST /api/messages/read-up-to.
  • Fixed infinite loop in scrollToNewestMessage: added lastNewerLoadHadResults ref guard in canLoadNewerMessages computed.
  • Fixed missing /api prefix and wrong endpoint (/messages/list/api/messages/channel with GET query params) in scroll-to-newest.
  • Fixed read-up-to call: proper POST with method + body: JSON.stringify(...) and conversation_kind/conversation_value params.

Ghost channels (empty channel_identity)

  • Backend: _build_channel_unread_payload_for_port now filters out messages with empty channel_identity from unread summary and logs a warning.
  • Frontend: regularNotificationEntries in ConnectedShellLayout.vue skips channels with empty channel_identity (no more #N + 🔒 entries).
  • Fixed conn.fetchall() on sqlite3.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.vue imports useIsMobile for 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.svg in /icons/.
  • MobileDockButton.vue updated 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), and ContactsView.vue (mobile dock).

Component extraction

  • Extracted MobileNodebar.vue and MobileDockBar.vue from duplicative HTML in MessagesView.vue — eliminates copy-paste between conversation list and chat overlay views.
  • Fixed vertical mobile dock regression: removed duplicate <nav> wrapper from MobileDockBar.vue (shell already provides the container).

Timestamp

  • Added year to message timestamp format: DD.MM, HH:MMDD.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 100vh replaced with 100dvh (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 :active tactile button feedback: scale(0.98) translateY(1px).
  • Added :focus-visible a11y outlines: 2px accent border with 2px offset on all interactive elements.
  • Added 200ms transition on background-color, color, border-color, opacity, transform for all interactive elements.
  • Unified monospace font fallback: "IBM Plex Mono", monospace — removed "Fira Code", "Consolas", "JetBrains Mono" variants.
  • Added skeleton loader CSS: .mc-skeleton with pulse animation, conversation and message bubble skeleton variants.
  • Replaced 42 .is-firefox class selectors with @supports (-moz-appearance: none) feature queries.

Performance

  • Added RAF debounce (requestAnimationFrame guard) for updateConversationListMetrics() in useMessagesConversationList.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 в строку ExecStart systemd-сервиса в 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-сценариях.

Настройки карты и фильтрация...

Read more

MeshCorium v0.8.1 — Mobile UX & Quality

Choose a tag to compare

@PEG4TRON PEG4TRON released this 18 Jun 16:03

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_provider setting 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/proxy endpoint to avoid direct LAN/browser tile loading problems.

Map settings and data filtering

  • Added a persisted map_max_distance_km client 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_version to the Docker runtime image so containerized /api/update/check reports the same 0.8.1 version 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.py to 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=true query parameter to list_channel_messages and list_contact_messages — direct jump to the newest DB messages instead of iterative pagination.
  • Rewrote scrollToNewestMessage() in MessagesView.vue: single API call replaces old messages instead of merging, marks all messages up to the newest as read via POST /api/messages/read-up-to.
  • Fixed infinite loop in scrollToNewestMessage: added lastNewerLoadHadResults ref guard in canLoadNewerMessages computed.
  • Fixed missing /api prefix and wrong endpoint (/messages/list/api/messages/channel with GET query params) in scroll-to-newest.
  • Fixed read-up-to call: proper POST with method + body: JSON.stringify(...) and conversation_kind/conversation_value params.

Ghost channels (empty channel_identity)

  • Backend: _build_channel_unread_payload_for_port now filters out messages with empty channel_identity from unread summary and logs a warning.
  • Frontend: regularNotificationEntries in ConnectedShellLayout.vue skips channels with empty channel_identity (no more #N + 🔒 entries).
  • Fixed conn.fetchall() on sqlite3.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.vue imports useIsMobile for 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.svg in /icons/.
  • MobileDockButton.vue updated 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), and ContactsView.vue (mobile dock).

Component extraction

  • Extracted MobileNodebar.vue and MobileDockBar.vue from duplicative HTML in MessagesView.vue — eliminates copy-paste between conversation list and chat overlay views.
  • Fixed vertical mobile dock regression: removed duplicate <nav> wrapper from MobileDockBar.vue (shell already provides the container).

Timestamp

  • Added year to message timestamp format: DD.MM, HH:MMDD.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 100vh replaced with 100dvh (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 :active tactile button feedback: scale(0.98) translateY(1px).
  • Added :focus-visible a11y outlines: 2px accent border with 2px offset on all interactive elements.
  • Added 200ms transition on background-color, color, border-color, opacity, transform for all interactive elements.
  • Unified monospace font fallback: "IBM Plex Mono", monospace — removed "Fira Code", "Consolas", "JetBrains Mono" variants.
  • Added skeleton loader CSS: .mc-skeleton with pulse animation, conversation and message bubble skeleton variants.
  • Replaced 42 .is-firefox class selectors with @supports (-moz-appearance: none) feature queries.

Performance

  • Added RAF debounce (requestAnimationFrame guard) for updateConversationListMetrics() in useMessagesConversationList.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: добавлен guard lastNewerLoadHadResults ref в computed canLoadNewerMessages.
  • Исправлен отсутствующий префикс /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 слев...
Read more

MeshCorium v0.8.0 — Mobile UI & Maps (stable)

Choose a tag to compare

@PEG4TRON PEG4TRON released this 25 May 21:49

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

Choose a tag to compare

@PEG4TRON PEG4TRON released this 22 May 05:55

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)

Choose a tag to compare

@PEG4TRON PEG4TRON released this 21 May 18:49

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

Choose a tag to compare

@PEG4TRON PEG4TRON released this 21 May 18:07

Self-update system, update notifications in UI, stub supervisor with auto-check and rollback.


Система самообновления, уведомления о новых версиях в интерфейсе, stub supervisor с авто-проверкой GitHub и ролбэком.

MeshCorium v0.7.1 -- BUGFIX

Choose a tag to compare

@PEG4TRON PEG4TRON released this 21 May 11:04

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

Choose a tag to compare

@PEG4TRON PEG4TRON released this 17 May 17:35

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:port connection 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.