# rakkiad-jo/atj-robot architecture

> Architecture diagram of the GitHub repository rakkiad-jo/atj-robot, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/rakkiad-jo/atj-robot
- Repository: https://github.com/rakkiad-jo/atj-robot

## Overview

ATJ-ROBOT is a web and IoT platform for managing agricultural spraying robots. Users sign in, connect a device, and use the dashboard to monitor robot status and sensor readings, review and analyze spraying history, and manage settings; administrators also manage robots. The backend authenticates users, stores accounts and robot associations in PostgreSQL, and proxies robot data requests to the IoT server, which exposes device APIs backed by MongoDB. The README also documents theme switching and automated offline-status checks. Some page-to-endpoint wiring is not shown in the sampled source, so those links are omitted.

Main entry points: [`frontend/src/components/clientLayout.tsx`](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/clientLayout.tsx) (Dashboard shell), [`iot-server/robot-iot-api.js`](https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/robot-iot-api.js) (Device data API), [`backend/users.js`](https://github.com/rakkiad-jo/atj-robot/blob/main/backend/users.js) (Accounts and auth), [`backend/robot/robot.js`](https://github.com/rakkiad-jo/atj-robot/blob/main/backend/robot/robot.js) (Robot API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Web application"]
  node_web_app["Dashboard shell<br/>[clientLayout.tsx]"]
  node_robot_context["Robot selection"]
  node_theme["Theme settings<br/>[ThemeContext.tsx]"]
  node_dashboard["Robot dashboard<br/>[home.tsx]"]
  node_spraying["Spraying controls<br/>[sparying.tsx]"]
  node_charts["Usage analytics<br/>[graph.tsx]"]
  node_history["Spray history<br/>[history.tsx]"]
  node_robot_status["Robot status<br/>[robotState.tsx]"]
  node_admin_ui["Robot administration<br/>[admin.tsx]"]
  node_settings_ui["Account settings<br/>[settings.tsx]"]
  node_chat_ui["Chat assistant<br/>[chatBot.tsx]"]
end

subgraph group_backend["Backend API"]
  node_auth_api["Accounts and auth<br/>[users.js]"]
  node_robot_api["Robot API<br/>[robot.js]"]
  node_chat_api["Chat API<br/>[chat.js]"]
  node_api_server["API server<br/>[server.js]"]
end

subgraph group_iot["IoT services"]
  node_iot_server["IoT API server<br/>[server.js]"]
  node_iot_api["Device data API<br/>[robot-iot-api.js]"]
  node_device_auth["Device authentication"]
  node_status_jobs["Status and retention jobs<br/>[statusChecker.js]"]
end

subgraph group_state["Persistent state"]
  node_pg[("PostgreSQL<br/>[postgres.js]")]
  node_sensor_store[("Sensor records<br/>[esp32sensor.js]")]
  node_status_store[("Device status<br/>[esp32status.js]")]
  node_history_store[("Device history<br/>[esp32data.js]")]
end

node_user(("User"))
node_robot_device(("Robot device"))
node_email(("Email service"))

node_user -->|"uses"| node_web_app
node_web_app -->|"provides selection"| node_robot_context
node_web_app -->|"provides theme"| node_theme
node_robot_context -->|"fetches robots"| node_robot_api
node_robot_api -->|"requests device data"| node_iot_api
node_iot_server -->|"dispatches"| node_iot_api
node_iot_api -->|"authenticates device"| node_device_auth
node_robot_device -->|"sends telemetry"| node_iot_server
node_iot_api -->|"stores sensor data"| node_sensor_store
node_iot_api -->|"reads device status"| node_status_store
node_iot_api -->|"reads and writes history"| node_history_store
node_status_jobs -->|"updates status"| node_status_store
node_status_jobs -->|"retains data"| node_history_store
node_robot_api -->|"reads robot records"| node_pg
node_auth_api -->|"reads and writes accounts"| node_pg
node_user -->|"registers and signs in"| node_auth_api
node_auth_api -.->|"sends verification"| node_email
node_auth_api -.->|"sends OTP"| node_email
node_dashboard -->|"renders in"| node_web_app
node_spraying -->|"renders in"| node_web_app
node_charts -->|"renders in"| node_web_app
node_history -->|"renders in"| node_web_app
node_robot_status -->|"renders in"| node_web_app
node_admin_ui -->|"renders in"| node_web_app
node_settings_ui -->|"renders in"| node_web_app
node_chat_ui -->|"renders in"| node_web_app
node_api_server -->|"mounts routes"| node_auth_api
node_api_server -->|"mounts routes"| node_robot_api
node_api_server -->|"mounts routes"| node_chat_api

click node_web_app "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/clientLayout.tsx"
click node_robot_context "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/app/contexts/SelectedRobotContext.tsx"
click node_theme "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/app/contexts/ThemeContext.tsx"
click node_dashboard "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/home.tsx"
click node_spraying "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/sparying.tsx"
click node_charts "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/graph.tsx"
click node_history "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/history.tsx"
click node_robot_status "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/robotState.tsx"
click node_admin_ui "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/admin.tsx"
click node_settings_ui "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/settings.tsx"
click node_chat_ui "https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/chatBot.tsx"
click node_auth_api "https://github.com/rakkiad-jo/atj-robot/blob/main/backend/users.js"
click node_robot_api "https://github.com/rakkiad-jo/atj-robot/blob/main/backend/robot/robot.js"
click node_chat_api "https://github.com/rakkiad-jo/atj-robot/blob/main/backend/chat.js"
click node_api_server "https://github.com/rakkiad-jo/atj-robot/blob/main/backend/server.js"
click node_iot_server "https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/server.js"
click node_iot_api "https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/robot-iot-api.js"
click node_device_auth "https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/middleware/authenticateDevice.js"
click node_status_jobs "https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/statusChecker.js"
click node_pg "https://github.com/rakkiad-jo/atj-robot/blob/main/backend/postgres.js"
click node_sensor_store "https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/models/esp32sensor.js"
click node_status_store "https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/models/esp32status.js"
click node_history_store "https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/models/esp32data.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_web_app,node_robot_context,node_theme,node_dashboard,node_spraying,node_charts,node_history,node_robot_status,node_admin_ui,node_settings_ui,node_chat_ui,node_user toneBlue
class node_auth_api,node_robot_api,node_chat_api,node_api_server toneAmber
class node_iot_server,node_iot_api,node_device_auth,node_status_jobs toneMint
class node_pg,node_sensor_store,node_status_store,node_history_store toneRose
class node_robot_device,node_email toneIndigo
```

## Components

### Web application

- [Dashboard shell](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/clientLayout.tsx): `frontend/src/components/clientLayout.tsx`
- [Robot selection](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/app/contexts/SelectedRobotContext.tsx): `frontend/src/app/contexts/SelectedRobotContext.tsx`
- [Theme settings](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/app/contexts/ThemeContext.tsx): `frontend/src/app/contexts/ThemeContext.tsx`
- [Robot dashboard](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/home.tsx): `frontend/src/components/home.tsx`
- [Spraying controls](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/sparying.tsx): `frontend/src/components/sparying.tsx`
- [Usage analytics](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/graph.tsx): `frontend/src/components/graph.tsx`
- [Spray history](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/history.tsx): `frontend/src/components/history.tsx`
- [Robot status](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/robotState.tsx): `frontend/src/components/robotState.tsx`
- [Robot administration](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/admin.tsx): `frontend/src/components/admin.tsx`
- [Account settings](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/settings.tsx): `frontend/src/components/settings.tsx`
- [Chat assistant](https://github.com/rakkiad-jo/atj-robot/blob/main/frontend/src/components/chatBot.tsx): `frontend/src/components/chatBot.tsx`

### Backend API

- [Accounts and auth](https://github.com/rakkiad-jo/atj-robot/blob/main/backend/users.js): `backend/users.js`
- [Robot API](https://github.com/rakkiad-jo/atj-robot/blob/main/backend/robot/robot.js): `backend/robot/robot.js`
- [Chat API](https://github.com/rakkiad-jo/atj-robot/blob/main/backend/chat.js): `backend/chat.js`
- [API server](https://github.com/rakkiad-jo/atj-robot/blob/main/backend/server.js): `backend/server.js`

### IoT services

- [IoT API server](https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/server.js): `iot-server/server.js`
- [Device data API](https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/robot-iot-api.js): `iot-server/robot-iot-api.js`
- [Device authentication](https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/middleware/authenticateDevice.js): `iot-server/middleware/authenticateDevice.js`
- [Status and retention jobs](https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/statusChecker.js): `iot-server/statusChecker.js`

### Persistent state

- [PostgreSQL](https://github.com/rakkiad-jo/atj-robot/blob/main/backend/postgres.js): `backend/postgres.js`
- [Sensor records](https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/models/esp32sensor.js): `iot-server/models/esp32sensor.js`
- [Device status](https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/models/esp32status.js): `iot-server/models/esp32status.js`
- [Device history](https://github.com/rakkiad-jo/atj-robot/blob/main/iot-server/models/esp32data.js): `iot-server/models/esp32data.js`

### Other components

- **User**
- **Robot device**
- **Email service**

## Connections

- User → Dashboard shell: uses
- Dashboard shell → Robot selection: provides selection
- Dashboard shell → Theme settings: provides theme
- Robot selection → Robot API: fetches robots
- Robot API → Device data API: requests device data
- IoT API server → Device data API: dispatches
- Device data API → Device authentication: authenticates device
- Robot device → IoT API server: sends telemetry
- Device data API → Sensor records: stores sensor data
- Device data API → Device status: reads device status
- Device data API → Device history: reads and writes history
- Status and retention jobs → Device status: updates status
- Status and retention jobs → Device history: retains data
- Robot API → PostgreSQL: reads robot records
- Accounts and auth → PostgreSQL: reads and writes accounts
- User → Accounts and auth: registers and signs in
- Accounts and auth → Email service: sends verification
- Accounts and auth → Email service: sends OTP
- Robot dashboard → Dashboard shell: renders in
- Spraying controls → Dashboard shell: renders in
- Usage analytics → Dashboard shell: renders in
- Spray history → Dashboard shell: renders in
- Robot status → Dashboard shell: renders in
- Robot administration → Dashboard shell: renders in
- Account settings → Dashboard shell: renders in
- Chat assistant → Dashboard shell: renders in
- API server → Accounts and auth: mounts routes
- API server → Robot API: mounts routes
- API server → Chat API: mounts routes
