Release History

Changelog

What's new, what's fixed, and what's coming next in ELM LAN Messenger.

v1.3.0 2026-03-27 Latest
New Features
Context Menu Icons
All three context menus (contact list right-click, chat reaction menu, system tray) now display Segoe MDL2 Assets glyphs beside each item for faster visual scanning. Icons are rendered from the system font at runtime and automatically adapt to dark/light themes.
Persistent Window Layout
ContactListWindow remembers its position and size across restarts. ChatWindow remembers its size. Six new fields added to AppSettings: ContactListLeft, ContactListTop, ContactListWidth, ContactListHeight, ChatWindowWidth, ChatWindowHeight.
Drag-and-Drop Files into Chat
Files can be dragged directly onto the chat input area, triggering the same send path as the paperclip button. A DragOver visual accepts file drops and rejects anything else.
Taskbar Unread Badge
Red circle overlay with cumulative unread count on the taskbar button. Cleared when any chat opens. Rendered via DrawingVisual → RenderTargetBitmap — zero polling cost.
Typing Indicator
Debounced "X is typing…" notice on the peer's side for direct chats. Sent at most once per 2 seconds; auto-hides 3 seconds after the last packet. Not shown in group chats.
Message Reactions
Right-click a bubble → React → choose from 👍 ❤️ 😂 😮 😢 👎. Reactions are sent to the peer/group, persisted in a new MessageReactions table, and shown as pill badges below the bubble.
Full-Text Search (FTS5)
SearchMessagesAsync uses an SQLite FTS5 virtual table with INSERT/DELETE triggers for automatic indexing. Falls back to LIKE on older databases. Far faster than a plain LIKE scan on large histories.
Bug Fixes
Typing Indicator Creating Blank Messages on Peer
TcpMessagingService packet-to-enum switch was missing the "typing" entry; it fell through to MessageType.Text, creating a blank bubble. Fixed.
Reactions Showing as Raw JSON
Same switch missing "reaction" caused the JSON payload to render as a text bubble. Fixed.
Single-Instance: Re-open Shows Error
Second launch now signals the running instance via a named pipe to bring its window to front, then exits silently. Mutex stored in a static field to prevent GC collection in async context; AbandonedMutexException is caught so a crash-then-restart works cleanly.
Admin Late-Join: Can't Secret-View Users Who Started Earlier
When a new peer is seen for the first time (UDP discovery), the receiving app now immediately unicasts its own presence packet back to the new peer. An admin starting after all users are running gets all peer IPs within milliseconds instead of waiting up to 10 seconds for the next broadcast cycle.
Group Chat Avatar Shows Only First Character
NameToInitialsConverter now returns the first two letters for single-word names ("Alice" → "AL"), matching User.AvatarInitials in the contact list.
Improvements
Group Chat Sender Name
Received messages in group chats show the sender's name above the bubble (hidden in direct chats via MultiDataTrigger).
Group Chat Avatar Size
Mini-avatar initials font size increased from 11 → 13 px to match the contact list.
Resource Meter Removed from Main Window Footer
The CPU/RAM/network display has been removed from the contact list footer. ResourceMonitorService no longer runs continuously; it is still available in Settings.
Remote Control / Secret View: Focus Existing Window
While a session is active, subsequent requests to the same peer focus the existing window rather than sending a new request.
v1.0.0 2025-11-01 Initial Release
Initial Release
Core Messaging
AES-256 encrypted peer-to-peer messaging over TCP with message receipts (sent/delivered/seen), offline message queueing, and broadcast to all peers.
File Transfers
Send any file type with inline image previews. Files organized into categories in the download folder.
Screen Sharing & Remote Control
Full screen share with mouse and keyboard remote control. Multiple simultaneous sessions. H.264 MP4 recording via FFmpeg.
Group Chat
Named groups with member management, real-time join notifications, and group-wide file and screen sharing.
Silent View (IT Admin)
Silent screen monitoring locked behind SHA-256 passphrase. View-only mode, no notification on monitored device.
Dark & Light Themes
Full WPF theme system with live switching. Custom bubble colours, persistent per-user settings.
Encrypted Portable Backup
AES-256 encrypted .elmbackup export/import for full message and settings portability.
v2.0 Roadmap Planned Coming Soon
Stage 1 — Foundation & Stability
SQLite WAL Mode
Enable PRAGMA journal_mode=WAL for better concurrent read performance and crash safety.
Admin Passphrase Upgrade (PBKDF2)
Re-hash admin passphrase with PBKDF2 (100,000 iterations, SHA-256). Transparent upgrade on next unlock.
Crash Logger
Global AppDomain.UnhandledException and DispatcherUnhandledException hooks write structured crash logs. App offers to restart rather than silently terminating.
FFmpeg Recording Tuning
CRF 22 + -tune screen + -pix_fmt yuv420p for sharper screen content at equivalent file size.
Stage 2 — Networking Performance
Persistent TCP Connection Pool
TcpConnectionPool keeps one live TcpClient per peer, eliminating per-message SYN/FIN overhead under high volume (100-user target).
Screen Share Delta Compression
16×12 block grid diff; send 4-byte "no-change" sentinel when fewer than 5% of blocks changed. Expected bandwidth reduction: 50–80% for static desktops.
Message Sequence-Number Deduplication
Per-sender monotonic sequence numbers; receiver discards duplicates using a sliding window to prevent message replay.
Stage 3 — Screen Capture Engine
DXGI Desktop Duplication
Replace GDI/BitBlt with GPU-based capture via DxgiFrameCapture. Reduces screen share CPU usage from ~30% to ~5% on modern hardware.
Hardware H.264 Encoding
Auto-detect NVENC / QuickSync / AMF; fall back to libx264. Recording quality improved. UI shows "Recording (NVENC)" etc.
Stage 4 — Security Hardening
ECDH P-256 Per-Session Key Exchange
Every TCP connection derives a unique ephemeral AES-256 key via Elliptic-Curve Diffie-Hellman. Retiring the current static shared key.
HMAC-SHA256 Per-Packet Integrity
Each packet carries a 32-byte HMAC tag. Tampered packets rejected before decryption using constant-time comparison.
SQLCipher At-Rest Database Encryption
Database encrypted with AES-256-CBC key derived from device ID + PBKDF2. Transparent to the application layer.
Stage 5 — Infrastructure
Embedded FFmpeg
Replace ffmpeg.exe child-process with FFmpeg.AutoGen + Sdcb.FFmpeg.runtime.windows-x64 DLLs. Installer shrinks ~90 MB; removes SmartScreen warnings.
Screen Share Relay Node
LanMessenger.Relay console app bridges peers on separate subnets when direct TCP fails. Peers fall back to relay automatically.