A lightweight desktop serial port monitoring application built with Tauri 2 and Leptos (Rust → WASM), featuring real-time data streaming, configurable filters, and auto-detection of USB, Bluetooth, and PCI serial devices.

Scans and lists all available serial ports — USB, Bluetooth, and PCI — with a single click, displaying device type and product name for easy identification.
Streams serial data to a color-coded console with timestamps, auto-scroll, and clear separation between info, data, warning, and error messages — powered by a dedicated native thread and Tauri's event bridge.
Apply offset, length, and character exclusion filters to incoming data in real-time — toggled on or off without interrupting the active serial connection.
Fine-tune every serial parameter — baud rate (50 to 921,600), data bits, stop bits, parity mode, and flow control — matching any hardware device's requirements.
Checks for new versions on launch and prompts with a one-click update dialog — powered by Tauri's updater plugin with signed releases distributed through GitHub.
Serial port reading is a blocking operation that must run on a dedicated OS thread, but the Leptos frontend lives in the browser's event loop via WebAssembly. Bridging these two worlds required using Tauri's event system — the backend thread emits events with timestamped data, and the frontend listens reactively. Graceful shutdown uses an atomic flag shared between the main thread and the reader thread.
Serial devices don't always send clean, newline-terminated messages. Data can arrive fragmented across multiple reads or include garbage characters. I implemented a timeout-based buffer flush that accumulates partial data and emits it after a quiet period, ensuring no data is lost while still providing line-by-line output to the console.
The app uses a fixed 800×600 window, but high-DPI displays (125%+ scaling) reduce the effective CSS pixel width below Tailwind's responsive breakpoints — causing the layout to unexpectedly stack vertically. The fix was removing all responsive breakpoints entirely, since the window size is known and constant, and designing purely for the fixed viewport.