MeshCorium
Client BetaSelf-hosted MeshCore client with a hybrid contact system and a local web interface for working with a MeshCore node through companion firmware. Includes systemd service integration, auto-update via GitHub releases, and Russian and English documentation.
- Maintainer
- PEG4TRON ↗
- Kind
- Clients
- Maturity
- Beta
- Language
- Python
- Licensing
- Open source
- Latest version
- 0.9.0 · 2026-06-30
- License
- MIT
- Platforms
- Linux
Screenshots
Capabilities
Interfaces
- ✓ Web
Connections
- ✓ Serial
- ✓ TCP
- ✓ BLE
Capabilities
- ✓ Messaging
- ✓ Contacts
- ✓ Channels
- ✓ Node configuration
Node role
- ✓ Companion
Install
- Source Open ↗
Releases
from GitHub · updated 2026-07-05v0.9.0 # Latest 20 days ago · 2026-06-30 17:50 UTC
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 вынесены в отдельные строки с под …
v0.8.3 # 22 days ago · 2026-06-29 02:36 UTC
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 …
v0.8.2 # 1 month ago · 2026-06-18 17:28 UTC
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 | bashThe 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 in `canLoadNewerM …
Project signals
- GitHub stars
- 11
- Forks
- 1
- Watchers
- 0
- Open issues
- 47
- Contributors
- 2
- Release downloads
- 3
- Latest downloads
- 3
- Source available
- Yes
- Releases available
- Yes
- Signed releases
- No
- CI builds
- No
- Documentation
- Yes
- Self-hosted web client with hybrid contact system.
- Includes systemd service and auto-update via GitHub releases.
- Available in Russian and English.