Dashboard
The RosFit dashboard is a React-based web application that gives fleet operators a single pane of glass for monitoring, controlling, and debugging every device in the fleet. It connects to the API via REST and WebSocket for real-time updates.
Layout
The dashboard is organized into four main areas:
| Area | Position | Purpose |
|---|---|---|
| Sidebar | Left | Navigation between views (Fleet, Devices, Commands, Alerts, Settings) |
| Fleet Map | Top center | Geospatial or grid-based view of all device locations |
| Device List | Bottom center | Filterable, sortable table of registered devices |
| Telemetry Panel | Right | Live telemetry charts and widgets for the selected device |
The layout is fully responsive. On smaller screens the sidebar collapses into a hamburger menu and the panels stack vertically. All panels can be resized, reordered, or hidden via Settings > Layout.
The dashboard ships as a Docker container (rosfit/dashboard:latest) and is served on port 3000 by default. It communicates with the FastAPI backend on port 8000.
Fleet view
The fleet view provides three modes for visualizing your device fleet:
Map view
Displays every device as a pin on an interactive map (Leaflet-based). Pins are color-coded by status:
| Color | Status |
|---|---|
| Green | online — healthy and reporting telemetry |
| Yellow | online — warning threshold triggered |
| Red | error — critical fault reported |
| Gray | offline — no heartbeat |
| Blue | maintenance — manually paused |
Click a pin to open a tooltip with quick stats (battery, uptime, last command). Double-click to navigate to the device detail view.
List view
A data table showing all devices with sortable columns: name, type, status, group, battery, CPU temperature, uptime, and last seen. Supports full-text search and column-level filtering.
Group view
Organizes devices by their group field in a tree structure. Expand a group to see member devices and aggregate health metrics (% online, average battery, total errors).
Health summary
A top-bar widget showing fleet-wide KPIs:
- Total devices — registered count
- Online — percentage currently connected
- Alerts — active alert count
- Commands — commands sent in the last hour
- Avg battery — fleet average battery percentage
Device detail
Clicking on any device opens a full-page detail view with the following panels:
Info header
Displays the device name, ID, type, group, tags, firmware version, connection status, and uptime. Includes quick-action buttons for reboot, maintenance mode, and decommission.
Live telemetry
Configurable widget grid showing real-time telemetry streams. Default widgets include:
- Odometry — 2D position trace on a mini-map
- Battery — gauge with charge rate trend
- Velocity — linear and angular velocity line charts
- IMU — orientation euler angles
- Diagnostics — CPU, memory, disk, temperature gauges
Widgets auto-update via WebSocket at the configured refresh rate.
Command panel
Inline command interface for sending commands directly to the selected device. Supports free-form JSON or pre-built command templates (navigate, stop, set parameter, restart node).
History
Timeline of all events for the device: state transitions, commands sent/acked, shadow updates, OTA deployments, and alert triggers. Filterable by event type and time range.
Configuration
View and edit the device's shadow desired state. Changes are pushed to the device via MQTT when it is online, or queued for delivery when it reconnects.
Logs
Scrollable, searchable log viewer for device-side logs streamed through the bridge. Supports log level filtering and full-text search.
Command console
The command console is accessible from the sidebar or within a device detail view. It provides a unified interface for sending commands to individual devices, groups, or the entire fleet.
Send commands
Select a target (device ID, group, or broadcast), choose a command type, fill in the payload, and send. The console shows real-time status updates as the command flows through the pipeline: pending → delivered → acked → completed.
Templates
Pre-built command templates for common operations:
| Template | Command | Description |
|---|---|---|
| Navigate To | navigate_to | Send a Nav2 goal pose |
| Emergency Stop | emergency_stop | Immediate halt of all motion |
| Set Parameter | set_param | Update a ROS 2 parameter at runtime |
| Restart Node | restart_node | Restart a specific ROS 2 node |
| Start Mapping | start_mapping | Begin SLAM mapping session |
| Return Home | return_home | Navigate to the charging station |
Scheduled commands
Create scheduled commands that execute at a specific time or on a recurring cron schedule. Useful for automated patrol routes, scheduled recharging, or periodic data collection.
Alerts
The alert system monitors device telemetry and state, triggering notifications when configured conditions are met.
Threshold-based alerts
Fire when a metric crosses a boundary:
battery_percent < 20 → warning
battery_percent < 10 → critical
cpu_temp > 80 → warning
cpu_temp > 90 → critical
Configure thresholds per device, group, or globally via Settings > Alerts.
State-based alerts
Fire on device state transitions:
- Device goes
offline(heartbeat timeout) - Device enters
errorstate - Command fails or times out
- OTA deployment fails
- Shadow conflict detected
Notification channels
Alerts are routed to one or more channels:
| Channel | Configuration |
|---|---|
| Dashboard | Always enabled — banner and bell icon |
| SMTP server settings, recipient list | |
| Slack | Webhook URL, channel name |
| Discord | Webhook URL |
| Webhook | Custom HTTP endpoint for integration with PagerDuty, Opsgenie, etc. |
| SMS | Twilio integration (requires API key) |
Each alert rule can target different channels based on severity. For example, warnings go to Slack, while critical alerts go to both email and PagerDuty.