Skip to content

feat: Tauri desktop frontend — RuView hardware management & visualization (ADR-052) #177

@ruvnet

Description

@ruvnet

Introduction

RuView is a WiFi-based human pose estimation system built on ESP32 CSI (Channel State Information). Today, managing a RuView deployment requires juggling 6+ disconnected CLI tools: esptool.py for flashing, provision.py for NVS configuration, curl for OTA and WASM management, cargo run for the sensing server, a browser for visualization, and manual IP tracking for node discovery. There is no single tool that provides a unified view of the entire deployment — from ESP32 hardware through the sensing pipeline to pose visualization.

This issue tracks the implementation of RuView Desktop — a Tauri v2 cross-platform desktop application that replaces all of these tools with a single, cohesive interface. The application is designed as the control plane for the RuView platform, managing the full lifecycle: discover, flash, provision, OTA, load WASM, observe sensing.

Why Tauri (Not Electron/Flutter/Web)

Requirement Why Desktop is Required
Serial port access Browser/PWA cannot touch COM/tty ports for firmware flashing
Raw UDP sockets Node discovery via broadcast probes requires raw socket access
Filesystem access Firmware binaries, WASM modules, model files live on local disk
Process management Sensing server runs as a managed child process (sidecar)
Small binary Tauri ~20 MB vs Electron ~150 MB
Rust integration Shares crates with existing workspace

UI Design Language

The frontend uses a Foundation Book design scheme with Unity Editor-inspired UI panels. Think: clean typographic hierarchy, structured panels with dockable regions, monospaced data displays, and a professional dark theme with accent colors for status indicators. Powered by rUv.


ADR-052 Deep Overview

The full architecture is documented in ADR-052 with a companion DDD bounded contexts appendix.

Workspace Integration

The desktop app is a new Rust crate (wifi-densepose-desktop) in the existing workspace, sharing types with the sensing server and hardware crate. The frontend uses React + Vite + TypeScript with a Foundation Book / Unity-inspired design system.

6 Rust Command Groups

Group Commands Bounded Context
Discovery discover_nodes, get_node_status, watch_nodes Device Discovery
Flash list_serial_ports, flash_firmware, read_chip_info Firmware Management
OTA ota_update, ota_status, ota_batch_update Firmware Management
WASM wasm_list, wasm_upload, wasm_control Edge Module
Server start_server, stop_server, server_status Sensing Pipeline
Provision provision_node, read_nvs Configuration

7 Frontend Pages

Page Purpose
Dashboard Node count (online/offline), server status, quick actions, activity feed
Node Detail Single node deep-dive: firmware, health, TDM config, WASM modules
Flash Firmware 3-step wizard: select port, select firmware, flash with progress bar
WASM Modules Drag-and-drop upload, module list with start/stop/unload
Sensing View Live CSI heatmap, pose skeleton overlay, vital signs
Mesh Topology Force-directed graph: TDM slots, sync drift, node health
Settings Server ports, bind address, OTA PSK, UI theme

DDD Bounded Contexts

6 bounded contexts with 9 aggregates, 25+ domain events, and 3 anti-corruption layers. See the DDD appendix for full details.

Context Aggregate Root(s) Key Events
Device Discovery NodeRegistry NodeDiscovered, NodeWentOffline, ScanCompleted
Firmware Management FlashSession, OtaSession, BatchOtaSession FlashProgress, OtaCompleted, BatchOtaCompleted
Configuration ProvisioningSession NodeProvisioned, ConfigReadBack
Sensing Pipeline SensingServer, WebSocketSession ServerStarted, FrameReceived
Edge Module (WASM) ModuleRegistry ModuleUploaded, ModuleStarted
Visualization Query model (no aggregate) Consumes all upstream events

Persistent Node Registry

Stored in ~/.ruview/nodes.db (SQLite). On startup, previously known nodes load as Offline and reconcile against fresh discovery. The app remembers the mesh across restarts.

OTA Safety Gate

The TdmSafe rolling update strategy updates even-slot nodes first, then odd-slot nodes, ensuring adjacent nodes are never offline simultaneously during mesh-wide firmware updates.

Platform-Specific Considerations

Platform Concern Solution
macOS USB serial drivers need signing on Sequoia+ Document driver requirements
Windows COM port naming, UAC Auto-detect via registry
Linux Serial port permissions Bundle udev rules installer

Implementation Phases

Phase Scope Priority
1. Skeleton Tauri scaffolding, workspace integration, React window P0
2. Discovery Serial ports, node discovery, dashboard cards P0
3. Flash espflash integration, flashing wizard P0
4. Server Sidecar sensing server, log viewer P1
5. OTA HTTP OTA with PSK auth, batch TdmSafe P1
6. Provisioning NVS GUI form, read-back, mesh presets P1
7. WASM Module upload/list/control P2
8. Sensing WebSocket, live charts, pose overlay P2
9. Mesh View Topology graph, TDM visualization P2
10. Polish App signing, auto-update, onboarding wizard P3

Total estimated effort: ~11 weeks for a single developer.

Acceptance Criteria

  • Tauri app builds on Windows, macOS, Linux
  • Can discover ESP32 nodes on local network
  • Node registry persists across restarts
  • Can flash firmware via serial port (no Python dependency)
  • Can push OTA updates with PSK authentication
  • Rolling OTA with TdmSafe strategy for mesh deployments
  • Can upload/manage WASM modules on nodes
  • Can start/stop sensing server and view live logs
  • Can view real-time sensing data via WebSocket
  • Can provision NVS config via GUI form
  • Mesh topology visualization shows TDM slots and health
  • Binary size less than 30 MB
  • Foundation Book / Unity-inspired UI design system
  • Each new Rust module has unit tests

Dependencies

  • ADR-012: ESP32 CSI Sensor Mesh
  • ADR-039: ESP32 Edge Intelligence
  • ADR-040: WASM Programmable Sensing
  • ADR-044: Provisioning Tool Enhancements
  • ADR-050: Quality Engineering Security Hardening
  • ADR-051: Sensing Server Decomposition
  • ADR-053: UI Design System (Foundation Book + Unity-inspired)

Branch

feat/tauri-desktop-frontend

References

Powered by rUv

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions