mirror of
https://git.quad4.io/RNS-Things/MeshChatX.git
synced 2026-04-03 16:26:12 +00:00
44 KiB
44 KiB
Changelog
All notable changes to this project will be documented in this file.
[4.4.0] - 2026-04-TBD
On Hold
- MicronParser truecolor support - until NomadNet supports etc.
Changed
- Frontend HTTP: Removed the axios dependency; API traffic uses native
fetchthrough the shared client inmeshchatx/src/frontend/js/apiClient.js(same call sites, no axios runtime). - Frontend build: Upgraded to Vite 8 with
@vitejs/plugin-vue6; production bundles use Rolldown (build.rolldownOptionsandoutput.codeSplittingfor vendor chunks). Dev and build scripts are unchanged (vite dev,vite build). - Announce storage and fetch limits: Per-aspect stored announces are capped (default 1000); after each upsert, excess rows are trimmed oldest first (
trim_announces_for_aspect). Default client fetch size (500), search fetch cap (announce_search_max_fetch), and discovered-interface list cap (discovered_interfaces_max_return) are configurable. Legacyannounce_limit_*migrates toannounce_max_stored_*; new keys includeannounce_fetch_limit_*per aspect. Clearing a numeric setting restores the default (IntConfig.set(None)removes the key). Settings UI and locales (en, de, it, ru) expose the new options; telephony-related aspects share LXMF announce keys where applicable.
New Features
- Custom TLS certificate paths: Optional
--ssl-certand--ssl-key(andMESHCHAT_SSL_CERT/MESHCHAT_SSL_KEY) load PEM files for the web server; both must be set together. When unset, behaviour is unchanged (auto-generated or existing.../identities/<id>/ssl/cert.pemandkey.pem). - Auth access control (login and setup): Failed attempts and outcomes are stored in
access_attempts(IP, User-Agent, path, method, time, outcome). Untrusted clients are rate limited per IP and path and locked out after repeated wrong passwords from the same IP (fingerprints that have successfully logged in for the current identity are trusted and use higher per-window limits and are excluded from lockout counting for their own UA).trusted_login_clientsstores IP plus User-Agent hash per identity after a successful login or setup, with pruning of the oldest entries when the cap is exceeded.GET /api/v1/debug/access-attemptslists attempts for the debug tools (search, outcome filter, pagination). Database schema version 42 adds these tables. - Debug Logs UI: The debug logs page has tabs for Logs and Access attempts, with refresh, copy, search, outcome filter, and pagination for access attempts.
- LXMF Lift Banishment from context menus: Right-click on a message in the conversation viewer or on a row in the messages sidebar shows Lift Banishment when that peer is blocked, calling the blocked-destinations API and refreshing UI state (aligned with NomadNet banish/lift patterns).
Fixes
- Multi-context shutdown: Application shutdown tears down every
IdentityContext(not only the active one):ForwardingManager.teardownfor alias LXMF routers and links,BotHandler.stop_allincluding orphan entries inbots_state, per-context databases and resources, then clears context maps and stops the health monitor before websockets and RNS teardown. Mesh Server / page node shutdown order preserved. - NomadNet favourites 3-dots: Fixed 3-dots button on favourite cards not responding; added
flex-shrink-0so the button is not squished in the flex layout. Wrapped announce tab dropdown inflex-shrink-0for consistency. - LXMF inbound stamps: Settings could not disable proof-of-work stamps for direct inbound messages (UI enforced minimum 1; API coerced sub-1 values to
Noneand brokeIntConfig). Added a Require inbound stamps toggle, allowed stored cost0, and clamp validation to0–254so LXMF correctly clears the delivery stamp requirement. - Identity recall hex parsing: UUID-style strings (hyphens in
bytes.fromhex) no longer spamError recalling identity;recall_identityand telephone identity resolution normalize separators. LXMF/telephony announce lookups compare normalized identity hashes so hyphenated inputs match stored hex.
Improvements
- Container image (Docker/Podman): Final stage runs as non-root
meshchat(USER meshchat).HEALTHCHECKprobeshttps://127.0.0.1:8000/api/v1/statuswith TLS verification disabled for the self-signed default cert.podman builddefaults to OCI layout, which omitsHEALTHCHECK; usepodman build --format dockerwhen you rely on the embedded health check. Bind mounts for/configunder rootless Podman may need:U,podman unshare chown, or host permissions so uid 1000 can write (same class of issue as Dockerchown 1000:1000on a volume). - Conversation image paste: Pasting image data into the message field (e.g. screenshot or copied image) now attaches it like the image picker, without using the separate text-only paste button.
- Page Archives export: Archives tool can download the current snapshot or all selected snapshots as
.mufiles (raw page body; multi-export uses path plus a short hash in the filename to avoid collisions). - Network visualizer data loading: Fetches only
lxmf.deliveryandnomadnetwork.nodeannounces instead of all; path table filtered by those destination hashes via newPOST /api/v1/path-tableendpoint. Dramatically reduces load time on large networks. - NomadNet context menus: Right-click context menu on announces and favourites (like conversation viewer): Rename, Banish, Lift Banishment, Remove, Add to Favourites, Move to Section. Menus use Teleport to body and
justOpeneddelay to avoid immediate close on click. - Dynamic locale discovery: Locales are now discovered automatically from
meshchatx/src/frontend/locales/*.jsonviaimport.meta.glob. Adding a new language only requires a single JSON file with a_languageNamekey; no code changes tomain.js,LanguageSelector.vue, or tests needed. - CI supply chain hardening: Replaced all third-party Gitea Actions with POSIX-compliant shell scripts in
scripts/ci/. Checkout is inlined as plain git commands; Node.js, go-task, and Java binaries are SHA256-verified against upstream checksums; Python is built from official python.org source with GPG signature verification. Onlygitea-release-actionandupload-artifactremain as external actions. - SLSA v1 release provenance: Release workflow (
build.yml) can attach cosign SLSA v1 blob attestations (*.cosign.bundle) beside each release artifact whenCOSIGN_PRIVATE_KEYis configured;scripts/ci/slsa-predicate.py,attest-release-assets.sh, andverify-release-attestation.shsupport signing and verification with Rekor transparency-log upload. Documented inSECURITY.mdwithcosign.pubat the repo root for downstream verification.
Removed
- axios: Dropped as a frontend dependency in favour of native
fetch(see Changed). - Legacy PR vulnerability scanner: Removed the old PR-oriented workflow and its helper script in favour of Trivy.
- Nix flakes: Removed due to no longer used and maintained.
Testing
- End-to-end (Playwright): Added
tests/e2e/withpnpm run test:e2eandscripts/e2e/start-e2e-stack.sh(isolated backend storage, headless MeshChat HTTP server, Vite dev server). CI installs Chromium and runs the suite against the proxied app.tests/e2e/smoke.spec.jschecks/api/v1/statusvia the Vite proxy, directapp/info, document shell, and key routes.tests/e2e/navigation.spec.jscovers the standalone tutorial route, command palette (Ctrl+K, jump to Settings, Escape, Getting Started modal), sidebar navigation across main sections (withprepareE2eSessioncallingPOST /api/v1/app/tutorial/seenand changelog seen so tutorial/changelog overlays do not block pointer clicks), Alt+1 / Alt+S shortcuts, and the tools hub including a paper-message deep link.tests/e2e/shell.spec.jscovers desktop sidebar collapse and expand, header theme toggle (config-backed dark class on the root shell), notifications bell dropdown open and close, the Call page Phone tab, Messages Announces tab peer search input, and NomadNet favourites plus announces search inputs. Shell tests scope the top bar via the sticky chrome strip (the app does not use a<header>landmark). Related UI fixes for reliable palette tests:KeyboardShortcutsskips handling when the action iscommand_paletteso Ctrl+K reaches the palette;CommandPalettelistens for keydown in the capture phase and stops propagation on the palette shortcut. - Announce limits: DAO trim, manager upsert/limits, fuzzing, flood-load, smoke expectations, meshchat coverage mocks, and benchmark scripts updated for capped storage and fetch behaviour.
- ForwardingManager: Teardown coverage for alias deregistration and cleanup.
- NomadNetworkSidebar: Tests for 3-dots on favourite cards, context menu options, rename/remove/banish from context, announce right-click menu, add favourite and block from announce context.
- ConversationViewer: Clipboard image paste on the compose field; context menu / banishment-related coverage as applicable.
- ArchivesPage: Tests for
.muexport filename helpers and download helper. - i18n: Dynamic locale file discovery in tests; added
_languageNamepresence check for all locales. - ConfigManager: Inbound stamp cost may be set to
0. - meshchat_utils: Tests for
normalize_hex_identifier/hex_identifier_to_bytes. - Custom TLS CLI:
tests/backend/test_ssl_custom_args.pyasserts--ssl-certwithout--ssl-key(and the reverse) exits with code 2. - Auth access attempts:
tests/backend/test_access_attempts_dao.py(DAO behaviour, trusted pruning, cleanup, lockout counting, Hypothesis invariants foruser_agent_hashand insert/list).tests/backend/test_access_attempts_enforcement.py(_request_client_ip,_enforce_login_accessfor untrusted rate limit and lockout, trusted bypass and trusted rate limit, Hypothesis monotone check, HTTP smoke for login logging, lockout and rate-limit 429 responses, debug access-attempts JSON shape). Vitest:DebugLogsPageaccess tab loads/api/v1/debug/access-attempts. Playwright:smoke.spec.jsasserts Logs and Access attempts on#/debug/logs.
Updates
- README: Configuration table documents
--ssl-cert/--ssl-keyandMESHCHAT_SSL_CERT/MESHCHAT_SSL_KEY. - pnpm-lock.yaml: Updated Vue, Vue-i18n, Vite 8, and
@vitejs/plugin-vue. - Locales: Added
nomadnet.lift_banishmentto en, de, ru, it. Added_languageNameto all locale files. Addedarchives.export_muandarchives.export_selected_mufor the archives export buttons. Strings for announce and discovered-interface limits were added for this release. - Python dependencies:
websockets>= 16.0,aiohttp>= 3.13.3,psutil>= 7.2.2,jaraco.context>= 6.1.1,hypothesis>= 6.151.9.
[4.3.1] - 2026-03-10
Fixes
- Message retry: Added per-message retry button to the context menu and inline on failed/cancelled outbound messages, allowing individual message resend without bulk retry.
- Sender display name: Fixed outgoing messages showing "Unknown Peer" by resolving display names from conversations and announces when composing to a new peer.
- Conversation refresh on send: Added
lxmf_message_createdandlxmf_message_state_updatedwebsocket handlers toMessagesPageso the sidebar updates after sending without requiring an incoming message to trigger a refresh. - No-flash sidebar updates: Outbound message state transitions (outbound, sending, sent, delivered) now update the sidebar in-place without API calls. New messages trigger a background merge that patches existing conversation objects rather than replacing the array, preventing full sidebar re-renders.
- Received message outbound flag: Incoming messages now explicitly set
is_outbound: falseinstead of relying on an undefined default.
Testing
- Frontend: New tests for message retry context menu visibility, retry click behavior,
is_outboundon received messages, in-place conversation updates on send, display name merge from API, failed message count tracking, and zero API calls during state transitions. - Backend: New tests for
MessageHandlercoveringfailed_countin conversations,filter_failedquery,search_messages, andafter_id/before_idpagination.
[4.3.0] - 2026-03-09
New Features
- Mesh Server: Serve Micron pages and files directly over Reticulum. Each server gets its own RNS identity and destination address with the
nomadnetwork.nodeaspect, making it compatible with the standard NomadNet page browsing protocol. Supports dynamic per-page and per-file request handler registration, announce broadcasting, and full lifecycle management (create, start, stop, delete, rename). - Mesh Server management UI: New tool page for creating and managing Mesh Servers with start/stop controls, announce button, page CRUD (add, edit, delete), file upload/delete, and a "View" button that opens the server's content in the built-in NomadNet browser.
- Micron Editor publish integration: "Publish to Mesh Server" button in the Micron Editor allows publishing the current tab or all tabs directly to a selected Mesh Server.
- Local page serving: Pages and files hosted on local Mesh Servers are served directly from disk when browsed locally, bypassing RNS link establishment. This provides instant page loads for your own content.
- Local announce injection: Mesh Server announces are injected directly into the MeshChat announce database on startup, node start, and manual announce, ensuring they appear in the NomadNet announces list without depending on RNS loopback processing.
- Stranger protection: Settings to block attachments and messages from non-contacts. Message handling strips attachments from strangers when configured; database schema extended to track stripped attachments. Localization and UI for stranger protection options.
Improvements
- NomadNet downloader: Added identity recall validation before link establishment to provide clearer error messages when a destination identity cannot be resolved.
- NomadNet partials: Fixed partial page loading when partials include field data; PARTIAL_LINE_REGEX captures optional fields, WebSocket allows partial responses when callback registered, partial DOM updates via innerHTML. Auto-refresh behavior improved.
- PageNodesPage: Refactored error handling.
- MessagesSidebar: Time-ago functionality for message timestamps.
- InterfacesPage: Removed bounce and disconnected animation logic and related properties.
- Status indication: Removed redundant status indication from UI.
Testing
- Mesh Server tests: 66 new tests covering PageNode (setup, teardown, announce, page/file CRUD, responder closures, config persistence, status, link callbacks, path traversal protection, edge cases) and PageNodeManager (create, delete, start/stop, announce, rename, get/list, disk persistence, teardown).
- Notification and LXMF: Extensive tests for notification reliability and LXMF field hardening.
- Frontend: Comprehensive tests for MicronParser and NotificationBell.
- Performance: Updated performance tests and expectations for rendering times.
Developer / Docs
- CONTRIBUTING and CONTRIBUTORS added for contribution guidelines and credits.
- Makefile added for common build/run targets.
- README updates.
[4.2.1] - 2026-03-06
New Features
- DOMPurify for NomadNet: Added
dompurifydependency and globalDOMPurifyin frontend entry so MicronParser sanitizes content when browsing Nomad Network nodes; removes "DOMPurify is not installed" warning in AppImage and packaged builds. - Identities page: Import and Export all identities in header (next to New Identity). Per-identity key actions: export key file and copy Base32 shown on hover for the current identity card only. Import modal with upload key file and paste Base32. Backend
GET /api/v1/identities/export-allreturns a ZIP of all identity key files. - Contacts page: Contacts management UI with routing, localization (en, de, it, ru), and LXMA contact handling. Public key retrieval and tests for LXMA URI handling.
Security
- SQL injection hardening: All raw SQL queries audited and confirmed parameterized. Added
_validate_identifier()for dynamic table/column names in schema migrations. Legacy migratorATTACH DATABASEpath properly escaped; column names from untrusted legacy DBs filtered with regex whitelist.
Diagnostics
- Adaptive Diagnostics Engine: Crash recovery upgraded from static heuristics to a lightweight adaptive system that learns from crash history.
- Crash history persistence: New
crash_historytable (migration 40) stores crash events with error type, diagnosed cause, symptoms (JSON), probability, entropy, and divergence. Capped at 200 entries. - Bayesian weight learning: Root-cause probabilities refined over time using a conjugate Beta-Binomial model. After 3+ crashes, learned priors replace hardcoded defaults and are persisted in config. Weights clamped to [0.01, 0.99] to prevent degenerate priors.
- Log entropy: Shannon entropy computed over log-level distribution in a 60-second sliding window from in-memory deques (zero DB queries). Error rate tracking exposed as
current_error_rateproperty. - Predictive health monitor: New
HealthMonitordaemon thread checks every 5 minutes for entropy climbing (3 consecutive rising readings above threshold), elevated error rate, and low available memory. Warnings broadcast via WebSocket. No DB queries in the monitor loop.
- Crash history persistence: New
- Integrity & crash recovery hardening: Fixed
platform.release()regex safety in legacy kernel detection. FixedIntegrityManagerpath handling when database is outside storage directory. Added latitude clamping in map tile calculations to prevent division by zero at geographic poles.
Performance
- Database indexes: Added 8 new indexes in schema migration 39 covering contacts JOIN columns (
lxmf_address,lxst_address), notification filters (is_viewed), map drawings (identity_hash), voicemails (is_read), archived pages (created_at), and a composite index onlxmf_messages(state, peer_hash)for the failed-count subquery. - SQLite PRAGMAs at startup:
journal_mode=WAL,synchronous=NORMAL,cache_size=8MB,mmap_size=64MB,temp_store=MEMORY,busy_timeout=5sapplied on every database initialization. - Bounded queries:
search_messages(),get_conversations(), andget_filtered_announces()now enforce default LIMIT (500) to prevent unbounded result sets.get_all_lxmf_messages()paginated (5000 per page); export endpoint iterates pages. - Slim conversation list queries: Conversation list queries (
MessageDAO.get_conversations,MessageHandler.get_conversations) now select only the columns needed for the list view, skipping largecontentandfieldsblobs. - Bulk database operations: Batch methods (
mark_conversations_as_read,mark_all_notifications_as_viewed,move_conversations_to_folder) converted from per-rowexecuteloops to singleexecutemanycalls inside transactions.delete_all_lxmf_messageswrapped in a transaction for atomicity. AddedDatabaseProvider.executemany().
Improvements
- Micron editor: Button label changed from "Download" to "Save" on the micron editor page (en: Save; de: Speichern; it: Salva; ru: Сохранить).
- MicronParser: Overlay style stripping and improved event handling in NomadNetworkPage.
- Release workflow: Include
meshchatx-frontend.zipin release assets (was generated and checksummed but not uploaded). Add Linux arm64 build step (AppImage + deb) viadist:linux-arm64. Releasefileslist now includes*.zip. - Community interfaces: Replaced RNS Testnet Amsterdam and BetweenTheBorders with Quad4 hub (62.151.179.77:45657 TCP). Removed outbound health checks: suggested community interfaces are now a static list with no TCP probes to the internet.
- Identities: Removed top key-control card; key actions moved to per-card hover. Message count and LXMF/LXST addresses on identity list; backend message_count for current identity.
- About page: Security & Integrity section: signed (shield-check) icon and "No integrity violations" badge use green styling in dark mode; status pill has dark-mode emerald variants.
- Version management: Single source of truth is
package.json; runpnpm run version:syncto updatemeshchatx/src/version.py. Build runs sync automatically.
Testing
- SQL injection tests: Unit tests for
_validate_identifier, integration tests for_ensure_columnwith malicious identifiers, property-based tests forATTACH DATABASEpath escaping and identifier regex. - DAO fuzzing: Hypothesis property-based fuzzing across ContactsDAO, ConfigDAO, MiscDAO, TelephoneDAO, VoicemailDAO, DebugLogsDAO, RingtoneDAO, MapDrawingsDAO, MessageDAO folders, MessageHandler search,
_safe_href, and utility functions. - Performance regression benchmarks: Latency (p50/p95/p99) and throughput (ops/sec) benchmarks for announce loading/search, message loading/search/upsert, favourites, and conversation operations. EXPLAIN QUERY PLAN assertions verify index usage. Concurrent read/write contention tests. LIKE search scaling tests across data sizes. Index existence and PRAGMA verification tests.
- Diagnostics tests: CrashHistoryDAO CRUD and cleanup tests. Bayesian weight learning correctness (prior defaults, learned priors, clamping, minimum crash threshold, config persistence). HealthMonitor detection logic (entropy climb, error rate, memory pressure, edge cases). Log entropy math (zero/uniform/single-level distributions, sliding window expiry). Hypothesis property tests for Beta-Binomial posterior bounds.
- Integrity & recovery tests: Corrupt/empty/missing-key manifest handling. Direct hash-file and DB integrity checks. Entropy threshold boundary tests. Database-outside-storage-dir handling. CrashRecovery system entropy edge cases, legacy kernel regex safety, Reticulum diagnosis isolation, and keyboard interrupt passthrough.
[4.2.0] - 2026-03-05
New Features
- Micron partials: Support for partial content in Nomad Network pages; partial handling in NomadNetworkPage with processing/clearing, dynamic page updates, and MicronParser integration. Tests for partial handling, regex matching, content injection, and state management.
- LXMF quoted replies: Full support for
reply_quoted_contentin message parsing, sending, and rendering; reply flow in ReticulumMeshChat with quoted content in LXMF message construction. - Reply in messages: Reply functionality for messages in ReticulumMeshChat.
- Discovery filters and quick actions: Added discovery whitelist/blacklist configuration and per-announce quick actions in Recently Heard Announces (three-dots menu) to allowlist or blacklist announces directly from each card.
- Security tooling: Added
eslint-plugin-security;pip-auditandpnpm auditsteps in CI; ESLint disable comments for regex patterns in MarkdownRenderer, DocsPage, and ConversationViewer where required. - Vitest UI: Vitest UI support and configuration updates for frontend testing.
- Lint task: Central
linttask in Taskfile to run all linters. - Translations: Added translations for
ingest_paper_messagein German, English, Italian, and Russian. - Build and CI: cx_Freeze build dependencies in build-test workflow; Wine environment setup for Windows builds; multi-architecture build support (e.g. arm64 on Linux/Windows).
Improvements
- MicronParser: DOMPurify integration and general improvements; DOMPurify initialization in frontend test setup.
- NetworkVisualiser: Level of Detail (LOD) management and icon cache optimization.
- AudioWaveformPlayer: Adjusted height, improved waveform rendering for dark mode, MutationObserver for responsive updates.
- Interface discovery UX: Discovery settings now include whitelist and blacklist fields in interface pages, and discovered announce overlays now show Blacklisted when matching blacklist patterns.
- ConversationViewer:
unknownstate for message delivery checks; animation direction control for syncing indicator. - Interface and MessagesSidebar: Component improvements.
- Propagation sync and markdown: Improved propagation sync and markdown rendering.
- Integrity management: Advanced checks and metadata support; identity manager metadata loading and legacy migrator column handling.
- Database backup and health: Backup data-loss guards: baseline file (message count and total bytes) after each successful backup; detection of suspicious state (e.g. DB was non-empty and now empty, or size collapsed); when suspicious, backups written as
backup-SUSPICIOUS-*.zipwithout overwriting good backups, rotation and baseline update skipped; rotation only applies to normalbackup-*.zip. Database health checks at app start and close (integrity plus baseline comparison) with logging; issues exposed asdatabase_health_issueson app and in/api/v1/app/info; toast notification when issues are present; websocket message typedatabase_health_warningfor real-time alert. Integrity result handling fixed for provider returning dict rows. - Vite: API and WebSocket proxy configuration; sourcemaps disabled in build.
- Node and tooling: Node.js engine requirement set to >=24; Node 24 in Raspberry Pi install guide; pnpm 10.32.1; Node and pnpm version updates in Dockerfile and workflows; pip 26.0 in Dockerfile; pip install with
--no-cache-dir. - Dependencies: rns 1.1.3, Vuetify 3.12.1, Electron 39.7.0, autoprefixer 10.4.27, axios 1.13.6, Vue 3.5.29, serialize-javascript; ajv removed in favour of fast-json-stable-stringify and json-schema-traverse; various package and lockfile updates.
- CI: pnpm installation step in CI and test workflows; pnpm cache removed from CI/test workflows; ESLint security rule tuning.
- Docs and legal: README and TODO updates; LICENSE copyright holder updated from Sudo-Ivan to Quad4; Docker arch builder removed.
Testing
- Frontend: Unit tests for multiple frontend components; AppPropagationSync and ConfirmDialog tests; accessibility tests for keyboard navigation and ARIA labels; MicronParser and NomadNetworkPage tests for partial handling.
- Backend: Backend test refactor. Database backup and health: unit tests for backup baseline, suspicious detection, rotation skip, and health checks (open/close, no baseline, baseline suspicious, integrity fail); property-based test for
_is_backup_suspicious; mock test thatdatabase_health_issuesis set on identity context setup when health check returns issues; tests to ensure health checks do not mistrigger (empty baseline, legitimate empty DB, small DB). Added discovery tests for whitelist/blacklist persistence, filtering behavior, and sanitization. - Security and fuzzing: Extended fuzzing and security tests for messages and NomadNet browser: WebSocket handlers (nomadnet.download.cancel, nomadnet.page.archives.get, nomadnet.page.archive.load/add, nomadnet.file.download, nomadnet.page.download, lxmf.forwarding.rule add/delete/toggle, keyboard_shortcuts.set), NomadNet path variable parsing (convert_nomadnet_string_data_to_map), archived page lookup, and message get/delete by hash (single and bulk). Ensures robustness against malformed or adversarial input from the mesh.
- Discovery fuzzing/security: Added property-based and security fuzzing tests to validate discovery pattern sanitization and robustness of interface filtering under malformed or adversarial inputs.
- HTTPS/WSS side-sniffing: New tests in
test_https_wss_side_sniffing.pyto verify that when HTTPS is enabled, the server speaks TLS only on the API/WS port; plain HTTP connections receive no plaintext HTTP response so other local apps cannot sniff MeshChatX traffic; WSS over the same port is verified. - Scan workflow: Trivy integration moved to unified scan.yml; Docker workflow Trivy exit code adjusted for successful builds; ZIP artifact build step removed from Gitea release flow.
[4.1.0] - 2026-01-16
New Features
- Advanced Diagnostic Engine:
- Mathematically grounded crash recovery system using Probabilistic Active Inference, Shannon Entropy, and KL-Divergence.
- Deterministic Manifold Constraints: Actively monitors structural system laws (V1: Version Integrity, V4: Resource Capacity).
- Failure Manifold Mapping: Identifies "Failure Manifolds" across the vertical stack, including RNS identity failures, LXMF storage issues, and interface offline states.
- Intelligent Integrity Monitoring:
- Implemented Shannon Entropy Analysis for critical files and databases to detect non-linear content shifts (e.g., unauthorized encryption or random data injection).
- Integrated SQLite Structural Verification via
PRAGMA integrity_checkto distinguish between binary hash changes (dirty shutdowns) and actual database corruption. - Refined ignore logic for volatile LXMF/RNS files to eliminate false positives in tampering detection.
- Added advanced security alerts for content anomalies, signature mismatches, and critical component compromises.
- RNS Auto-Configuration:
- Automatic creation and repair of the Reticulum configuration file (
~/.reticulum/config) if it is missing, invalid, or corrupt.
- Automatic creation and repair of the Reticulum configuration file (
- Expanded Security Pipeline:
- Integrated Trivy for both filesystem (codebase) and container image scanning.
- Consolidated security scans into a unified
scan.ymlworkflow for better visibility. - Updated container workflows to include fail-fast filesystem checks.
- Network Visualiser Optimization:
- Implemented AbortController support to cancel pending API requests on component unmount.
- Added high-performance batch fetching for path tables and announces (up to 1000 items per request).
- Announce Pagination:
- Added backend and database-level pagination for announces to improve UI responsiveness in large networks.
- Improved Installation:
- Added support and documentation for installing via Pre-built Wheels (.whl) from releases, which bundle the built frontend for a simpler setup experience.
Improvements
- Reliability & Memory Management:
- Fixed a major concurrency issue where in-memory SQLite databases (
:memory:) were not shared across background threads, causing "no such table" errors. - Resolved
asyncioevent loop race conditions inWebAudioBridgeusing a lazy-loading loop property with fallback. - Refactored
IdentityContextteardown to ensure all managers are properly nullified and callbacks cleared, preventing memory leaks and reference cycles. - Added client list cleanup in
WebAudioBridgewhen calls end.
- Fixed a major concurrency issue where in-memory SQLite databases (
- UI/UX:
- Enhanced LXMF link handling with better rendering logic for
lxmf://andrns://URIs. - Fixed a critical hang in the Startup Wizard where "Finish" or "Skip" buttons could become unresponsive.
- Improved UI navigation safety by automatically closing the tutorial modal when navigating away.
- Refined
MarkdownRendererregex patterns to prevent empty bold/italic tags and improved matching for single delimiters.
- Enhanced LXMF link handling with better rendering logic for
- Infrastructure & CI:
- Added dedicated build scripts for Arch Linux packaging to handle permissions and
makepkgexecution. - Updated Docker dev-image workflows to trigger on master branch pushes.
- Refactored telemetry data packing for more efficient location transmission.
- Updated dependencies including Electron Forge (7.11.1), Prettier (3.8.0), and ESLint plugins for better stability and formatting.
- Added dedicated build scripts for Arch Linux packaging to handle permissions and
- Testing:
- Frontend UI Test Suite Expansion: Added comprehensive Vitest suites for all diagnostic and utility tools (Ping, Trace, Probe, RNode Flasher, Micron Editor, etc.).
- Property-Based Testing: Significant expansion with
hypothesisto ensure robustness of the diagnostic engine, identity restoration, and markdown renderer. - Integrity Validation Suite: Added extensive property-based tests for entropy mathematical bounds and simulated corruption scenarios (SQLite b-tree breakage, content type shifts).
- Added automated verification for Python version and legacy kernel compatibility diagnostics.
- Configured temporary log directory management for tests to improve portability.
[4.0.0] - 2026-01-03
Season 1 Episode 1 - A MASSIVE REFACTOR
New Features
- Banishment System (formerly Blocked):
- Renamed all instances of "Blocked" to "Banished", you can now banish really annoying people to the shadow realm.
- Blackhole Integration: Automatically blackholes identities at the RNS transport layer when they are banished in MeshChatX. This prevents their traffic from being relayed through your node and publishes the update to your interfaces (trusted interfaces will pull and enforce the banishment).
- Integrated RNS 1.1.0 Blackhole to display publishing status, sources, and current blackhole counts in the RNStatus page.
- RNPath Management Tool: New UI tool to manage the Reticulum path table, monitor announce rates (with rate-limit detection), and perform manual path requests or purges directly from the app.
- Maps: You can now draw and doodle directly on the map to mark locations or plan routes.
- Calls & Audio:
- Added support for custom ringtones and a brand-new ringtone editor.
- New Audio Waveform Visualization for voice messages, providing interactive playback with a visual waveform representation.
- Paper Messages: Introduced a tool for generating and scanning paper-based messages with built-in QR code generation for easy sharing.
- LXMF Telemetry & Live Tracking:
- Full implementation of Sideband-compatible (Still need to test Columba) telemetry (FIELD_TELEMETRY & FIELD_TELEMETRY_STREAM).
- Live tracking with real-time map updates, distinct blue pulsing animations, and historical path tracing (breadcrumb trails).
- Mini-chat integrated into map markers for quick communication with telemetry peers.
- Privacy controls with global telemetry toggle and per-peer "Trust for Telemetry" settings.
- Detailed telemetry history timeline with interactive battery voltage/percentage sparkline charts.
- Documentation: You can now read all the project guides and help docs directly inside the app.
- Reliability:
- If the app ever crashes, it's now much better at picking up right where it left off without losing your data.
- Added Identity Switch Recovery: mechanism to restore previous identities or create emergency failsafes if a switch fails.
- Multi-Identity "Keep-Alive": Identities can now be kept active in the background when switching, ensuring you still receive messages and calls across all your personas.
- Added Database Snapshotting & Auto-Backups: You can now create named snapshots of your database and the app will perform automatic backups every 12 hours.
- Added Emergency Comms Mode: A lightweight mode that bypasses database storage and non-essential managers, useful for recovering from corrupted data or running in restricted environments. Can be engaged via UI, CLI flag (
--emergency), or environment variable (MESHCHAT_EMERGENCY=1). - Added Snapshot Restoration: Ability to restore from a specific snapshot on startup via
--restore-from-snapshotorMESHCHAT_RESTORE_SNAPSHOTenvironment variable.
- Diagnostics:
- New Debug Logs Screen: View and export internal system logs directly from the UI for easier troubleshooting.
- Community: Better support for community-run network interfaces and checking TCP ping status of suggested interfaces.
- UI Tweaks: Added a new confirmation box for important actions and a better sidebar for browsing your archived messages.
- Micron Editor: Added multi-tab support with IndexedDB persistence, tab renaming, and a full editor reset button.
- Desktop Enhancements (Electron):
- Multi-Window Calls: Optional support for popping active calls into a focused 2nd window.
- System Tray Integration: The app now minimizes to the system tray, keeping you connected to the mesh in the background.
- Native Notifications: Switched to system-native notifications with deep-linking (click to focus conversation).
- Protocol Handling: Register as default handler for
lxmf://andrns://links for seamless cross-app navigation. - Hardware Acceleration Toggle: Power-user setting to disable GPU acceleration if flickering or glitches occur.
- Power Management: Automatically prevents system sleep during active audio calls to maintain RNS path stability.
- Added Web Audio Bridge which allows web/electron to hook into LXST backend for passing microphone and audio streams to active telephone calls.
- Added LXMFy for running bots.
- Added RNS Discoverable Interfaces https://markqvist.github.io/Reticulum/manual/interfaces.html#discoverable-interfaces and ability to map them (ones with a location).
Improvements
- Blazingly Fast Performance:
- Network Rendering: The Network Visualizer now uses intelligent batching to handle hundreds of nodes without freezing your screen.
- Memory Optimization: Added a smart icon cache that automatically clears itself to keep the app's memory footprint low.
- Parallel Loading: The app now fetches network data in parallel, cutting down startup and refresh times significantly.
- Lazy Loading: Documentation and other heavy components now load only when you need them, making the initial app launch much faster.
- Smoother Settings: Changing settings now uses "smart saving" (debouncing) to prevent unnecessary disk work and keep the interface responsive.
- Backend Efficiency: A massive core refactor and new database optimizations make message handling and search nearly instantaneous. Added pagination to announce and discovery lists to improve performance in large networks.
- Calling: The call screen and overlays have been completely redesigned to look better and work more smoothly.
- Messaging:
- Polished the message lists and archive views to make them easier to navigate.
- Added "Retry All" functionality for failed or cancelled messages in conversation views.
- Improved handling of
lxm.ingest_uri.resultwith detailed notifications for success/error/warning states.
- Maintenance Tools: Added new maintenance utilities to clear LXMF user icon caches and manage backup configurations.
- Network View: The visualizer that shows your network connections is now much clearer and easier to understand.
- Languages: Updated translations for English, German, and Russian. Added Italian (it-IT) localization. Added a toggle to easily enable or disable translation services.
- Search: The command palette (quick search) and notification bell are now more useful.
- CartoDB Tiles - some more styles if OSM is not enough for you, MBtiles will export tiles from the selected one.
- Basic Markdown in Messages - Support for basic markdown in messages
Bug Fixes
- Fixed issues where switching between different identities could sometimes cause glitches.
- Fixed several small bugs that could cause messages to get stuck or out of order.
- Lots of small UI fixes to make buttons and menus look right on different screens.
- Fixed glitchy message page
Technical
- **Backend Architecture:**
- Decoupled logic into new specialized managers: `community_interfaces.py`, `docs_manager.py`, `identity_manager.py`, `voicemail_manager.py`, and `nomadnet_utils.py`.
- Added specialized utility modules: `meshchat_utils.py`, `lxmf_utils.py`, `async_utils.py`, and `identity_context.py`.
- Implemented a robust state-based crash recovery system in `src/backend/recovery/`.
- **Self-Healing Database Schema**: Enhanced `DatabaseSchema` with automatic column synchronization to prevent crashes when upgrading from older versions with missing columns.
- Enhanced database layer with `map_drawings.py` and improved `telephone.py` schema for call logging.
- Standardized markdown processing with a new `markdown_renderer.py`.
- Added pagination support for announce queries in `AnnounceManager`.
- **Performance Engineering & Memory Profiling:**
- Integrated a comprehensive backend benchmarking suite (`tests/backend/run_comprehensive_benchmarks.py`) with high-precision timing and memory delta tracking.
- Added an **EXTREME Stress Mode** to simulate ultra-high load scenarios (100,000+ messages and 50,000+ announces).
- Implemented automated memory leak detection and profiling tests using `psutil` and custom `MemoryTracker` utilities.
- **Full-Stack Integrity & Anti-Tampering:**
- Implemented **Backend Binary Verification**: The app now generates a SHA-256 manifest of the unpacked Python backend during build and verifies it on every startup in Electron.
- Added **Data-at-Rest Integrity Monitoring**: The backend now snapshots the state of identities and database files on clean shutdown and warns if they were modified while the app was closed.
- New **Security Integrity Modal**: Notifies the user via a persistent modal if any tampering is detected, with a version-specific "do not show again" option.
- Frontend Refactor:
- Migrated complex call logic into
CallOverlay.vueandCallPage.vuewith improved state management. - Implemented modular UI components:
ArchiveSidebar.vue,RingtoneEditor.vue,ConfirmDialog.vue, andAudioWaveformPlayer.vue. - Integrated a new documentation browsing system in
src/frontend/components/docs/. - Added custom Leaflet integration for map drawing persistence in
MapPage.vue.
- Migrated complex call logic into
- Infrastructure:
- Added
Dockerfile.buildfor multi-stage container builds. - Introduced
gen_checksums.shfor release artifact integrity. - Comprehensive Testing Suite:
- Added 80+ new unit, integration, and fuzz tests across
tests/backend/andtests/frontend/. - Implemented property-based fuzzing for LXMF message parsing and telemetry packing using
hypothesis. - Updated CI coverage for telemetry and network interface logic.
- Added 80+ new unit, integration, and fuzz tests across
- Updated core dependencies:
rns,lxmf,aiohttp, andwebsockets. - Developer Tools & CI:
- New
taskcommands:bench-backend(Standard suite),bench-extreme(Breaking Time and Space),profile-memory(Leak testing), andbench(Full run). - Added Gitea Actions workflow (
bench.yml) for automated performance regression tracking on every push.
- New
- Added
- Utilize Electron 39 features:
- Enabled ASAR Integrity Validation (Stable in E39) to protect the application against tampering.
- Hardened security by disabling
runAsNodeandnodeOptionsenvironment variables via Electron Fuses. - Implemented 3-Layer CSP Hardening: Multi-layered Content Security Policy protection across the entire application stack:
- Backend Server CSP (
meshchatx/meshchat.py): Applied viasecurity_middlewareto all HTTP responses, allowing localhost connections, websockets, and required external resources (OpenStreetMap tiles, etc.). - Electron Session CSP (
electron/main.js): Shell-level fallback CSP applied viawebRequest.onHeadersReceivedhandler to ensure coverage before the backend starts and for all Electron-rendered content. - Loading Screen CSP (
electron/loading.html): Bootloader CSP defined in HTML meta tag to protect the initial loading screen while waiting for the backend API to come online.
- Backend Server CSP (
- Added hardware acceleration monitoring to ensure the Network Visualiser and UI are performing optimally.