tpt-basestation

Rust

Local-first mission control for ESP32 & embedded IoT development — serial console, flash/OTA, BLE Wi-Fi provisioning, LittleFS browser, Matter/Thread mesh visualization, and energy monitoring. Built with Rust + Tauri + React. No cloud, no accounts.

1 stars0 forks1 watchersApache License 2.0
ble-provisioningembedded-systemsesp32firmware-flashingiotmatter-threadota-updatesrustserial-consoletauri

Languages

Rust71.9%TypeScript26.2%C++1.8%HTML0.1%CSS0.0%
README

TPT BaseStation

A local-first desktop "mission control" for wireless IoT and embedded development — starting with the ESP32 ecosystem, built to extend to Nordic/RISC-V and beyond.

TPT BaseStation consolidates the tools an embedded/IoT developer normally juggles separately — a serial monitor, a flasher, a BLE provisioning app, a packet sniffer — into one Tauri desktop app with a modular dashboard of "Cards." Everything runs locally: no cloud accounts, no telemetry, works air-gapped.

See spec.txt for the full design/vision doc and TODO.md for the up-to-date milestone log, including which features are mock-only vs. verified against real hardware.

Features

  • Serial Console — real-time streaming console with sparkline graphing
  • Hardware Discovery (HAL) — capability-based device detection (VID/PID → manifest → firmware handshake → boot-text fingerprint)
  • Wi-Fi Provisioning — send credentials to devices over BLE
  • Flash & OTA Manager — flash firmware over serial, or serve it via a local OTA HTTP server
  • On-Device Filesystem — browse/pull/push a LittleFS partition, plus create/edit/delete/rename files (root and subdirectories, inline and large/CTZ-encoded) — real-hardware-verified; see TODO.md for exact scope (e.g. no mkdir yet)
  • Community Manifest Sync — pull device manifests from a self-hosted registry (plain HTTPS + TOML) and merge them into your local manifest set, opt-in via the registry cargo feature
  • Radio Coexistence Visualizer — Wi-Fi/BLE timeslicing graph (mock-only, pending TPT Probe hardware)
  • Matter/Thread Topology Mapper + Mesh Doctor — mesh visualization, weak-link diagnosis, PDF reports (mock-only, pending real Border Router integration)
  • Matter/Thread Commissioning — one-click local commissioning flow (simulated handshake)
  • Local Energy Visualizer — MQTT/Modbus energy flow dashboard

Design principles: local-first (no cloud), hardware-agnostic core, mock-first development (every hardware-facing subsystem ships a mock alongside the real implementation), and no unverified device-mutating writes.

Project layout

Cargo workspace + pnpm workspace:

  • out-basestation-core/ (out-basestation-core) — transport-agnostic hardware logic: serial/BLE transports, flashing, OTA server, filesystem sync, mesh/probe/energy data models
  • out-basestation-hal/ (out-basestation-hal) — capability-based device discovery and manifests
  • tpt-basestation-littlefs/ (tpt-basestation-littlefs) — standalone, crates.io-publishable pure-Rust LittleFS v2 reader/writer
  • out-basestation-cli/ (package out-basestation-cli, binary tpt) — command-line interface over core/hal
  • gui/ — Tauri v2 + React + TypeScript + Tailwind desktop app (Rust backend in gui/out-basestation-gui/)

See CLAUDE.md for a deeper architectural walkthrough.

Getting started

Prerequisites

  • Rust (stable)
  • Node.js + pnpm
  • Tauri v2's platform dependencies for your OS — see Tauri's prerequisites guide. On Windows this is usually just WebView2, already preinstalled on Windows 10/11.

Developed and hardware-verified against real ESP32 boards on Windows so far (see TODO.md). Nothing in the Rust/TS code is Windows-specific, so Linux/macOS builds should work, but haven't been exercised end-to-end yet.

Build & run

# Rust workspace
cargo build --workspace
cargo test --workspace

# CLI
cargo run --bin tpt -- serial --mock

# GUI
pnpm install
pnpm gui:dev      # launch the Tauri dev app
pnpm gui:build    # production build

First run

No hardware on hand? pnpm gui:dev still opens a usable app — the Radio Coexistence, Mesh Topology/Doctor, Commissioning, Energy, and Docs cards all run against simulated data with nothing plugged in. The CLI mirrors this: every subcommand takes a --mock/--mock-ble flag to swap in a mock transport instead of real hardware.

Got an ESP32 board? Plug it in over USB — it should appear in the sidebar's device list with a confidence indicator (vid/pidhandshake/fingerprint; see CLAUDE.md for how the discovery pipeline works). Selecting it unlocks the capability-gated cards: Serial console, Flasher, Filesystem browser, Wi-Fi Provisioner. Headless equivalent: cargo run --bin tpt -- hal scan --deep.

Board not recognized? Check hal/manifests/*.toml for the bundled device list, or drop a custom manifest into your $config/tpt/manifests/ directory — it hot-reloads without restarting the app.

See TODO.md for exactly which features are real vs. mock-only today.

Status

Pre-1.0, actively developed. Track progress and open items in TODO.md.

License

Dual-licensed under either of MIT or Apache License, Version 2.0, at your option.