TwinSight Platform

Technical Proposal Analysis โ€” Robot Fleet Management
Full-Stack Architecture Deep Dive

What Is TwinSight?

TwinSight is a web-based platform for managing fleets of robots. Imagine you run a warehouse with 50 autonomous robots moving packages around. You need one central "command center" on a screen where operators can see every robot's position, battery level, current task, and quickly respond if something goes wrong. That's what TwinSight does.

๐ŸŽฎ Simple Analogy: Think of it like an air traffic control tower โ€” but instead of airplanes, you're watching and controlling a fleet of robots on the ground. The platform shows you where each robot is, what it's doing, if it's healthy, and lets you give it new instructions โ€” all from a web browser.
๐Ÿ“ก

Real-Time Monitoring

See every robot's position, battery, and status updating live โ€” less than 1 second delay. No page refreshes needed.

Sub-second updates
๐ŸŽฏ

Mission Control

Create, launch, pause, stop, or retry missions. The system tracks every step from "Created" to "Completed" or "Failed."

Full lifecycle
๐Ÿšจ

Alerts & Anomalies

Automatic alerts for critical events. An external AI/ML module can detect anomalies and push warnings straight to operators.

AI-assisted
๐Ÿ•น๏ธ

Teleoperation

When a robot gets stuck, an authorized operator can take over manual control directly from the browser โ€” with safety kill-switches built in.

Remote control
๐Ÿ—บ๏ธ

Live Operational Map

A real-time map showing robot positions, planned routes, restricted zones, and even navigation costmaps for debugging.

Multi-layer map
๐Ÿ“ฆ

Out-of-the-Box Deploy

Everything runs in Docker containers. One docker-compose up command and the entire platform starts โ€” cloud or on-premises.

Containerized

System Architecture

The platform is organized in four clear layers, each with a specific job. This separation ensures that if one layer changes (for example, you switch to a different robot model), the others don't need to be rewritten.

Four-Layer Architecture Diagram

LAYER 4 โ€” WEB INTERFACE (SPA) LAYER 3 โ€” CORE BACKEND (FLEET MANAGEMENT) LAYER 2 โ€” ROS ADAPTER (BRIDGE) LAYER 1 โ€” ROBOTS (ROS 2) Ionic + Angular SPA Frontend Dashboard Fleet overview Live Map Positions + costmap Mission Panel Control + status Alerts & Teleop Real-time events REST + WebSocket FastAPI REST Gateway WS Gateway Real-time push Mission Orch. Workflow engine Fleet Service Robot registry Alert Service Events + severity Identity / IAM JWT + RBAC Apache Kafka Event backbone Redis Hot state / cache TimescaleDB Telemetry history PostgreSQL Business data MinIO Object storage ROS Adapter Translates between ROS 2 (robot language) and web platform โ€” runs as separate container Robot 01 Robot 02 Robot 03 ยทยทยท Robot N ROS 2 topics/services/actions

Let's unpack each layer in plain language:

Layer 1 โ€” Robots

The physical (or simulated) robots running ROS 2. They publish data about themselves (position, battery, sensor health) and listen for commands (go here, stop, start task).

Layer 2 โ€” ROS Adapter

A "translator" that sits between robot language (ROS 2) and web language (REST/Kafka). It converts robot data into web-friendly events, and web commands into robot instructions.

Layer 3 โ€” Core Backend

The "brain." Multiple small services (microservices) handle fleet management, missions, alerts, users, and real-time data streaming. This is the single source of truth.

Layer 4 โ€” Web Interface

What operators see in their browser. A single-page app with dashboards, maps, mission controls, and alert panels โ€” all updating live without page refreshes.

Technology Stack Explained

Here's every major technology in the proposal, what it does, and why it was chosen โ€” explained as if you've never used any of them.

TechnologyWhat It IsWhy It's Used Here
Angular A framework (toolkit) made by Google for building complex web applications. Think of it as a construction kit with pre-built walls, doors, and plumbing โ€” you assemble them into your custom building. Angular is opinionated โ€” it forces a structured approach. For a large industrial app with many screens and features, this structure prevents code from becoming a tangled mess. It also has great support for TypeScript and dependency injection, which matter for big teams.
Ionic Framework A library of ready-made UI components (buttons, lists, cards, modals) that look good on any screen size โ€” phone, tablet, or desktop. Two key reasons: (1) The app needs to work on large command-center screens AND tablets, so responsive design matters; (2) If they later want a native mobile app (iOS/Android), Ionic + Capacitor lets them reuse most of the code instead of building from scratch.
TypeScript A "safer" version of JavaScript. Regular JavaScript lets you accidentally put a number where text is expected. TypeScript adds type checking โ€” it catches these mistakes before your code even runs. In a safety-critical system controlling real robots, bugs can be dangerous. TypeScript significantly reduces a whole category of bugs by catching type errors at development time rather than when the robot is already moving.
WebSocket (WSS) A communication protocol that keeps a "phone line" open between browser and server. Unlike normal web requests (ask, wait, get answer, hang up), WebSocket stays connected so the server can push updates instantly. Robot telemetry needs to update in under 1 second. Constantly "asking" the server (polling) would be too slow and wasteful. WebSocket lets the server push new data the instant it arrives โ€” perfect for live dashboards and maps.
TechnologyWhat It IsWhy It's Used Here
FastAPI (Python) A modern Python web framework for building APIs (the "menus" that the frontend uses to request data or send commands). It's known for being very fast and automatically generating documentation. FastAPI is asynchronous by default โ€” it can handle many requests simultaneously without blocking. This matters when 50 robots and 10 operators are all talking to the backend at once. The auto-generated Swagger docs also help teams work together (frontend devs can see exactly what endpoints exist).
Microservices Instead of one giant application, the backend is split into several small, independent services: one for missions, one for alerts, one for user management, etc. Each runs in its own container. If the mission service crashes, alerts and monitoring still work. You can also scale them independently โ€” if telemetry processing is the bottleneck, you add more copies of just that service, not the entire backend.
JWT (JSON Web Tokens) A standard way to prove "who you are" to a server. After you log in, you get a small encrypted token (like a digital badge). You show this badge with every request, and the server verifies it without needing to look up a database each time. JWTs are stateless โ€” the backend doesn't need to store session data. This makes scaling easier (any server can verify the token). The proposal adds refresh tokens for security: the main token expires quickly, and you get a new one automatically.
RBAC Role-Based Access Control. Instead of giving each person individual permissions, you assign them a role (Admin, Operator, Supervisor), and the role determines what they can do. In an industrial setting, it's critical that a Supervisor can only watch but not control robots, while an Operator can send commands. RBAC is enforced both in the API (you physically can't call a restricted endpoint) and in the UI (buttons are hidden/disabled).
TechnologyWhat It IsWhy It's Used Here
Apache Kafka A distributed event streaming platform. Imagine a super-reliable message board: producers post messages (events), and any number of consumers can read them, at their own pace, without losing any. Messages are stored for a configurable time. Kafka is the "nervous system" of TwinSight. When a robot sends position data, that single event needs to reach the state service, the alert service, the real-time gateway, AND the history database. Kafka lets each consumer read independently, and buffers events if a consumer is temporarily slow. This is what makes the architecture resilient.
Redis An in-memory data store โ€” essentially a super-fast "sticky note board." Data lives in RAM (computer memory), so reads and writes happen in microseconds rather than the milliseconds a regular database needs. Redis stores the "current snapshot": each robot's latest position, battery level, and status. When the dashboard loads, it pulls from Redis for instant results. Redis also uses TTL (Time To Live) โ€” if a robot stops sending updates, its entry expires, and the system knows it's offline. Think of it as a whiteboard that erases itself after X seconds if nobody rewrites on it.
PostgreSQL A traditional relational database โ€” the "filing cabinet" for structured, important data. It guarantees that data is consistent (transactions either fully succeed or fully fail). Used for business data: user accounts, robot metadata, mission definitions, and audit logs. These need rock-solid consistency โ€” you can't have a half-created mission or a user with corrupt permissions. PostgreSQL's transactions guarantee this.
TimescaleDB An extension of PostgreSQL specialized for time-series data (measurements that arrive continuously with timestamps, like temperature readings every second). It compresses and indexes data by time. Robot telemetry is textbook time-series data: position every 100ms, battery every few seconds, events with timestamps. TimescaleDB can efficiently store millions of these records and answer questions like "show me Robot 5's path over the last 2 hours" in milliseconds. A regular database would struggle with this volume.
MinIO An open-source object storage server, compatible with Amazon S3's API. Think of it as a self-hosted Dropbox for your server โ€” it stores files (PDFs, images, reports) rather than structured data. The ML module generates reports (PDFs, CSVs) asynchronously. These files need to be stored somewhere accessible. MinIO provides this without depending on cloud services, which is important for on-premises deployments in industrial settings.
TechnologyWhat It IsWhy It's Used Here
Docker A tool that packages an application with everything it needs (code, libraries, settings) into a "container" โ€” a lightweight, portable box that runs the same way everywhere. TwinSight has many components (frontend, 6+ backend services, Kafka, Redis, databases). Without Docker, installing all of this on a new server would take days. With Docker Compose, one YAML file describes the entire stack, and a single command starts everything.
Docker Compose A tool for defining and running multi-container Docker applications. You write a single file listing all your containers, how they connect, and what settings they need. Perfect for the "out of the box" deployment goal. An industrial customer can run TwinSight on their own servers (on-premises) without cloud expertise. The compose file defines networking, volumes, environment variables โ€” the whole orchestra.
Nginx A high-performance web server. In this context, it serves the compiled frontend files (HTML, CSS, JavaScript) to users' browsers. After Angular compiles the frontend into static files, Nginx serves them extremely efficiently. It can also handle HTTPS termination and act as a reverse proxy, routing requests to the correct backend service.
ROS 2 (Robot Operating System 2) Not actually an "operating system" โ€” it's a framework for building robot software. It provides standardized ways for different parts of a robot (sensors, motors, navigation) to communicate using "topics" (broadcast channels), "services" (request/response), and "actions" (long-running tasks with feedback). ROS 2 is the industry standard for modern robotics. The robots in this fleet already run ROS 2, so the platform must integrate with it. The ROS Adapter component bridges the gap between ROS 2's DDS communication and the web platform's REST/Kafka world.

Data Flows โ€” How Information Travels

Understanding how data moves through the system is key to understanding the architecture. Here are the four main flows, visualized step by step.

Flow 1: Live Telemetry (Robot โ†’ Your Screen)

This is the most common flow โ€” it happens continuously, many times per second, for every robot.

1

Robot publishes data via ROS 2

The robot's sensors continuously broadcast position, battery level, and diagnostic info on ROS 2 "topics" (like radio channels).

โ†“
2

ROS Adapter listens and translates

Subscribes to the robot's ROS topics, converts the data from ROS format into standardized JSON events.

โ†“
3

Events published to Kafka

Events like robot.telemetry.pose and robot.telemetry.battery are published to Kafka topics. Multiple services can now consume them independently.

โ†“
4

State Service processes the events

Updates Redis with the latest state (so the dashboard is fast) and selectively writes to TimescaleDB for historical records.

โ†“
5

Real-time Gateway pushes to UI

The WebSocket gateway reads from Kafka/Redis and fans out updates to all connected browsers on the appropriate channels (e.g., fleet, robot/03).

โ†“
6

Dashboard updates instantly

The Angular app receives the WebSocket message and updates the map, status indicators, and battery levels โ€” no page refresh needed.

Flow 2: Sending a Command (Your Click โ†’ Robot Action)

When an operator launches a mission from the web interface.

1

Operator clicks "Start Mission" in the browser

The frontend sends a REST API call: POST /missions/{id}/start

โ†“
2

Mission Orchestrator validates

Checks: Does the operator have permission (RBAC)? Is the robot online and idle? Is the mission compatible with this robot?

โ†“
3

Command sent to ROS Adapter

Backend calls the ROS Adapter's internal API with the mission parameters.

โ†“
4

ROS Adapter sends ROS 2 action to robot

Translates the web command into a ROS 2 "action" โ€” the robot receives it and starts executing the mission.

โ†“
5

Feedback flows back through the chain

The robot sends progress feedback via ROS 2 โ†’ ROS Adapter โ†’ Kafka โ†’ Real-time Gateway โ†’ your browser. You see the mission progress bar update live.

The "Hot Path" vs "Cold Path" Storage Strategy

A clever dual-storage approach that balances speed with historical depth.

๐Ÿ”ฅ HOT PATH (Speed) Redis โ€ข Latest robot state โ€ข Fleet summary cache โ€ข Offline detection (TTL) โ€ข Response time: microseconds Used for: Live dashboard, real-time UI โ„๏ธ COLD PATH (History) TimescaleDB PostgreSQL โ€ข Full telemetry history โ€ข Mission records & audit logs โ€ข User accounts & permissions โ€ข Response time: milliseconds Used for: Reports, analysis, replay
๐Ÿ“‹ Analogy: The hot path is like a car's dashboard showing your current speed (instant). The cold path is like the trip computer showing your average speed over the last 500 km (historical). You need both, but they serve very different purposes.

Frontend Deep Dive

The frontend is built as a Single Page Application (SPA) โ€” meaning the browser loads the app once, and then all navigation happens without full page reloads. This is critical for an operational dashboard that must never "blink" or lose context.

๐Ÿ–ฅ๏ธ Fleet Dashboard

Optimized for continuous display on large command-center screens. Shows active/inactive robots, operational states, battery levels, and critical alerts โ€” all auto-refreshing.

๐Ÿ—บ๏ธ Operational Map

Real-time robot positions, planned routes, restricted zones, POIs, and even ROS 2 navigation costmaps. Layers are toggle-able. The map engine works offline (no Google Maps dependency).

๐Ÿค– Robot Management

Detailed robot cards: ID, type, capabilities, sensor health, diagnostic history, and live state. Quickly identify robots with issues.

๐ŸŽฏ Mission Management

Full mission lifecycle: create, assign to robot(s), launch, pause, stop, retry. Clear state indicators (Created โ†’ Running โ†’ Completed/Failed) with immediate visual feedback.

๐Ÿšจ Alerts & Teleoperation

Real-time critical alerts with severity classification, acknowledgment workflow, and a persistent "Start Teleoperation" button for authorized operators when a robot needs manual intervention.

๐Ÿ“Š Reports Module

Configure and trigger async report generation (fleet performance, anomalies, KPIs). Reports are generated by the ML module in the background; status updates arrive via WebSocket.

State Management

The app uses NgRx (or Angular Signals Store) โ€” a centralized state management pattern. Instead of each component fetching its own data and potentially showing inconsistent information, there's a single "store" that holds all operational data. When a WebSocket event arrives, it updates this central store, and every component that cares about that data automatically re-renders.

๐Ÿ“บ Analogy: Instead of each TV in a building having its own antenna, there's one central satellite dish. All TVs get the same signal from one source โ€” no inconsistencies.

Backend Deep Dive

The backend follows a microservices + event-driven architecture. Here's why each service exists and how they cooperate:

Backend Service Interaction Map

KAFKA EVENT BACKBONE โ€” all services publish/consume events here API Gateway (FastAPI + REST) WS Gateway (WebSocket fan-out) Mission Orch. (Workflow engine) Telemetry Svc (State processing) Alert Service (Classify + route) Redis Live state cache TimescaleDB Time-series history PostgreSQL Business + audit MinIO Report files ML Module (External)

Event-Driven Communication: Why Kafka?

In a traditional system, services call each other directly. If the Alert Service is down, the Telemetry Service that tries to notify it also gets stuck. With Kafka in between, the Telemetry Service simply publishes events. If Alert Service is temporarily down, the events wait in Kafka and are processed when it comes back. Nothing is lost, nothing blocks.

The proposal specifies at-least-once delivery with idempotent consumers โ€” meaning every event will be delivered at least once (never lost), and services are designed so that processing the same event twice doesn't cause duplicated data (using unique event IDs).

ROS 2 Integration

The ROS Adapter is the critical bridge between the robot world and the web world. Here's what makes it special:

๐Ÿ”„ Translation Layer

Converts ROS 2 messages (binary, high-frequency DDS protocol) into JSON events that the web backend understands. Also converts web commands back into ROS 2 actions/services.

๐Ÿท๏ธ Multi-Robot via Namespaces

Each robot has a ROS 2 namespace (e.g., /robot_01). The adapter maps each namespace to a logical robot_id in the backend, keeping data streams isolated per robot.

๐Ÿ” Dynamic Topic Discovery

Periodically scans what ROS 2 topics each robot exposes. Uses SHA-256 hashing to efficiently detect changes โ€” only sends updates to backend when something actually changes.

๐Ÿ’“ Health Check

Continuously pings the backend with the robot's connectivity status. Correlates with Redis TTL and telemetry rates to distinguish between "robot offline", "network hiccup", and "backend down".

๐Ÿ›ก๏ธ Error Resilience

Automatic reconnection, configurable timeouts, retry with backoff for critical commands, and validation of all incoming data before forwarding.

๐Ÿงช Sim2Real

Works identically with real robots and ROS 2 simulators (like Gazebo). The platform can't tell the difference โ€” perfect for testing without hardware.

Security & Compliance

๐Ÿ” Authentication

JWT tokens with short expiry + refresh tokens. All communication over HTTPS (REST) and WSS (WebSocket). Rate limiting on login endpoints.

๐Ÿ‘ฅ RBAC (3 Roles)

Administrator: full access. Operator: can control robots/missions. Supervisor: view-only monitoring. Enforced at API + UI level.

๐Ÿ“‹ Audit Trail

Every critical action is logged: who did what, when, to which robot/mission. Supports GDPR with least-privilege access and controlled data exposure.

๐Ÿ”— Internal Security

ROS Adapter is network-isolated, only accessible from the backend. Internal services use token authentication. CORS policies restrict browser access.

Expert Analysis & Recommendations

Here's my assessment of the proposal's architecture, technology choices, and areas for improvement.

Overall Assessment

Architecture Design9/10
Technology Choices7.5/10
Security Posture7/10
Scalability Plan8.5/10
ROS 2 Integration9/10
Operational Readiness8/10

What the Proposal Does Well

Strength โ€” Architecture

The four-layer separation (Robot โ†’ Adapter โ†’ Backend โ†’ UI) is textbook good design. The ROS Adapter as a dedicated translation layer is particularly smart โ€” it means the core backend never needs to know anything about DDS or ROS message formats, and the robot software doesn't need to know anything about REST APIs. If you swap your robot framework from ROS 2 to something else in the future, you only rewrite the Adapter.

Strength โ€” Event-Driven with Kafka

Using Kafka as the central event backbone is an excellent choice for this use case. Telemetry data is naturally event-driven and high-frequency. Kafka's partitioning by robot_id enables parallel processing, and its durability means events survive temporary service outages. The at-least-once + idempotency pattern shows mature thinking about distributed systems.

Strength โ€” Hot/Cold Storage Pattern

The Redis (hot) + TimescaleDB (cold) dual-storage approach is well-suited. Live dashboards need sub-millisecond reads from Redis, while historical queries need the columnar compression and time-partitioning of TimescaleDB. This separation avoids the common trap of querying a time-series database for live state (too slow) or keeping months of telemetry in Redis (too expensive on memory).

Strength โ€” ROS 2 Integration Depth

The proposal shows genuine robotics expertise, not just web development. Topic discovery with SHA-256 change detection, namespace-based multi-robot isolation, health-check correlation with Redis TTL, and the sim2real support all reflect real-world operational experience. The teleoperation design with deadman switch and kill switch is safety-aware.

What I Would Change

Recommendation โ€” Reconsider Ionic + Angular

The concern: Ionic is designed primarily for mobile-first apps, and its component library is optimized for touch interactions on small screens. For an industrial command-center dashboard displayed on large screens (video walls), this is not the ideal fit. Angular itself is fine, but the Ionic layer adds overhead and mobile-centric design patterns that may fight against you when building a dense, information-rich operational UI.

My alternative: Use Angular + Angular Material or Angular + PrimeNG for the desktop/tablet experience. If mobile is needed later, use Capacitor directly (it doesn't require Ionic's UI components). Alternatively, consider React + a data-dense UI library like Ant Design or AG Grid โ€” these are battle-tested in operational dashboards handling thousands of data points. React's ecosystem for real-time visualization (deck.gl, Mapbox GL, react-map-gl) is also significantly richer than Angular's.

Recommendation โ€” Add an API Gateway / Service Mesh

The concern: The proposal uses FastAPI as both the REST API framework and the API Gateway. In a microservices architecture, these should be separate concerns. A proper gateway handles cross-cutting concerns (rate limiting, authentication, request routing, circuit breaking) independently from business logic.

My alternative: Add Traefik or Kong as a dedicated API gateway in front of FastAPI services. This decouples routing/security from business logic, makes it easier to add new services, and provides built-in circuit-breaker patterns. For inter-service communication, consider gRPC instead of internal REST โ€” it's faster, strongly typed, and generates client code automatically.

Critical โ€” Security Gaps

The concern: The security section is thin for a system controlling physical robots. Several important aspects are missing:

1. No mention of secret management. JWT signing keys, database passwords, API tokens โ€” where are these stored? Hardcoded environment variables are a security incident waiting to happen. Use HashiCorp Vault or Docker secrets at minimum.

2. No API request signing for robot commands. If someone compromises a JWT token, they can send arbitrary commands to physical robots. Critical commands (start/stop/teleop) should require mutual TLS (mTLS) or signed requests with short-lived nonces.

3. No mention of DDS Security for ROS 2. ROS 2 uses DDS for communication, and by default DDS traffic is unencrypted. In a production environment, ROS 2 SROS2 (Secure ROS 2) should be enabled, providing authentication, encryption, and access control at the DDS layer.

4. WebSocket authentication is underspecified. The proposal says WebSocket channels have RBAC, but doesn't detail how. WebSocket connections should authenticate on handshake with a JWT, and re-authenticate periodically (tokens can expire mid-session).

Recommendation โ€” Observability Stack

The concern: The proposal mentions "logging, metrics, health checks" but doesn't specify tooling. For a production industrial platform, you need a concrete observability stack.

My alternative: Deploy the Prometheus + Grafana stack for metrics and dashboards, Loki (or ELK) for centralized log aggregation, and Jaeger or OpenTelemetry for distributed tracing. The correlation-id concept in the proposal is good โ€” OpenTelemetry would formalize it with trace/span IDs that propagate across Kafka, REST, and WebSocket. This is essential for debugging "why did robot 7's position stop updating?" across 6+ microservices.

Recommendation โ€” Kubernetes Readiness

The concern: Docker Compose is great for development and small deployments, but the proposal targets multi-robot, multi-user industrial environments. Docker Compose has no built-in auto-scaling, self-healing, rolling updates, or load balancing.

My alternative: Design for Kubernetes (K8s) from day one, even if initial deployment uses Docker Compose. This means: stateless services, externalized configuration, proper health/readiness probes, and Helm charts alongside Compose files. When the fleet grows from 10 to 100+ robots, the migration path to K8s will be seamless instead of a painful rewrite.

Recommendation โ€” Consider Replacing Kafka with NATS for Smaller Deployments

The concern: Kafka is powerful but operationally heavy. It requires Zookeeper (or KRaft), significant memory, and expertise to operate. For fleets under ~50 robots, it may be over-engineered.

My alternative: Consider NATS JetStream as a lighter alternative. It provides the same pub/sub + persistence guarantees but runs as a single binary with minimal configuration. For larger deployments, Kafka remains the better choice. Ideally, abstract the event bus behind an interface so you can swap implementations based on deployment scale.

Design Suggestion โ€” Add a Simulation/Test Mode

The proposal mentions sim2real but doesn't describe a "platform test mode." I'd add a built-in simulation mode where the platform generates synthetic robot data (configurable fleet size, random failures, mission scenarios) without needing ROS 2 or Gazebo. This allows frontend developers to work independently, enables load testing, and makes demos much easier. A simple Python script generating Kafka events would suffice.

Summary: Proposed vs. Recommended Stack

ComponentProposedRecommended ChangePriority
Frontend FrameworkIonic + AngularAngular + PrimeNG, or React + Ant DesignMedium
API GatewayFastAPI (dual role)Traefik/Kong + FastAPI behind itMedium
Inter-Service CommInternal RESTgRPC for internal, REST for externalLow
Secret ManagementNot specifiedHashiCorp Vault or Docker SecretsHigh
ROS 2 SecurityNetwork isolation onlyAdd SROS2 (DDS security)High
ObservabilityMentioned but unspecifiedPrometheus + Grafana + Loki + OpenTelemetryMedium
OrchestrationDocker Compose onlyK8s-ready design + Helm chartsMedium
Event Bus (small scale)KafkaNATS JetStream option for <50 robotsLow
Command SecurityJWT + RBACAdd mTLS + signed nonces for critical opsHigh
Final Verdict

This is a well-designed proposal that demonstrates genuine understanding of both web platform engineering and robotics operations. The architecture is sound, the separation of concerns is clean, and the choice of core infrastructure (Kafka, Redis, TimescaleDB, FastAPI) is appropriate for the workload. The main areas for improvement are around security hardening (secret management, DDS security, command signing), operational tooling (concrete observability stack), and the frontend framework choice (Ionic is suboptimal for industrial dashboards). With these adjustments, this would be a production-grade platform ready for serious multi-robot fleet operations.