# triple-david-iot/accesiblebus-android architecture

> Architecture diagram of the GitHub repository triple-david-iot/accesiblebus-android, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/triple-david-iot/accesiblebus-android
- Repository: https://github.com/triple-david-iot/accesiblebus-android

## Overview

AccessibleBus combines an Android passenger/driver app with a FastAPI demo backend. The passenger flow selects a stop, submits and tracks assistance requests, and reconciles state through the API and event feed; the app also exposes driver HMI and accessibility preferences. The backend handles commands, demo trips and synchronization, backed by PostgreSQL and background event/receipt services. README documents Node-RED and Mosquitto as integration services. Some app and backend modules were not excerpted, so their connections are included only where the index or README supports them.

Main entry points: [`api/app/main.py`](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/main.py) (API entry), [`api/app/demo.py`](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/demo.py) (Demo trip), [`app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/StopsScreen.kt`](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/StopsScreen.kt) (Passenger UI), [`api/app/db.py`](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/db.py) (Database access)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_android["Android app"]
  node_passenger["Passenger UI<br/>[StopsScreen.kt]"]
  node_passenger_vm["Passenger state"]
  node_confirm["Request confirmation<br/>[ConfirmScreen.kt]"]
  node_tracking["Request tracking<br/>[TrackingScreen.kt]"]
  node_stops["Stops data<br/>[StopsRepository.kt]"]
  node_assistance["Assistance state"]
  node_api_source["API source<br/>[ApiSource.kt]"]
  node_api_client["HTTP client<br/>[ApiClient.kt]"]
  node_event_feed["MQTT event feed<br/>[EventFeed.kt]"]
  node_mqtt_client["MQTT client<br/>[BusMqttClient.kt]"]
  node_preferences["Preferences UI"]
  node_config_repo["App configuration"]
  node_driver_hmi["Driver HMI<br/>[HmiScreen.kt]"]
  node_navigation["App navigation<br/>[AppNav.kt]"]
  node_container["Dependency wiring<br/>[AppContainer.kt]"]
end

subgraph group_backend["API backend"]
  node_api_entry["API entry<br/>[main.py]"]
  node_commands["Request commands<br/>[commands.py]"]
  node_demo["Demo trip<br/>[demo.py]"]
  node_sync["State sync<br/>[sync.py]"]
  node_auth["Demo identity<br/>[auth.py]"]
  node_db_layer["Database access<br/>[db.py]"]
  node_outbox["Event outbox<br/>[outbox.py]"]
  node_receipts["Event receipts<br/>[receipts.py]"]
end

subgraph group_persistence["State and messaging"]
  node_database[("PostgreSQL")]
end

subgraph group_integration["Integration services"]
  node_mqtt_broker["Mosquitto broker"]
  node_nodered["Node-RED<br/>[package.json]"]
end

node_passenger_actor(("Passenger"))
node_driver_actor(("Driver"))
node_operator_actor(("Operator"))

node_passenger_actor -->|"uses"| node_passenger
node_passenger -->|"uses state"| node_passenger_vm
node_passenger_vm -.->|"requests assistance"| node_assistance
node_passenger -.->|"loads stops"| node_stops
node_passenger -->|"confirms request"| node_confirm
node_passenger -->|"tracks request"| node_tracking
node_tracking -->|"observes state"| node_passenger_vm
node_assistance -->|"calls API"| node_api_source
node_api_client -->|"implements"| node_api_source
node_assistance -->|"subscribes events"| node_event_feed
node_event_feed -->|"uses client"| node_mqtt_client
node_preferences -->|"reads and saves"| node_config_repo
node_preferences -->|"routed by"| node_navigation
node_driver_actor -->|"uses"| node_driver_hmi
node_driver_hmi -->|"routed by"| node_navigation
node_container -->|"constructs"| node_assistance
node_container -->|"selects client"| node_api_client
node_container -->|"constructs"| node_stops
node_container -->|"constructs"| node_config_repo
node_api_entry -->|"mounts routes"| node_commands
node_api_entry -->|"mounts routes"| node_demo
node_api_entry -->|"mounts routes"| node_sync
node_api_entry -->|"opens and closes"| node_db_layer
node_api_entry -->|"initializes scenario"| node_demo
node_api_entry -->|"starts worker"| node_outbox
node_api_entry -->|"starts worker"| node_receipts
node_commands -->|"runs transactions"| node_db_layer
node_commands -->|"checks actor"| node_auth
node_demo -->|"reads and writes"| node_db_layer
node_demo -->|"uses command logic"| node_commands
node_demo -->|"checks actor"| node_auth
node_sync -->|"reads state"| node_db_layer
node_sync -->|"checks actor"| node_auth
node_db_layer -.->|"queries"| node_database
node_outbox -.->|"publishes events"| node_mqtt_broker
node_receipts -.->|"receives receipts"| node_mqtt_broker
node_mqtt_client -->|"connects"| node_mqtt_broker
node_nodered -->|"integrates via MQTT"| node_mqtt_broker
node_operator_actor -->|"resets trip"| node_demo

click node_passenger "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/StopsScreen.kt"
click node_passenger_vm "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/PassengerViewModel.kt"
click node_confirm "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/ConfirmScreen.kt"
click node_tracking "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/TrackingScreen.kt"
click node_stops "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/data/StopsRepository.kt"
click node_assistance "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/data/AssistanceRepository.kt"
click node_api_source "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/net/ApiSource.kt"
click node_api_client "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/net/ApiClient.kt"
click node_event_feed "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/data/EventFeed.kt"
click node_mqtt_client "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/mqtt/BusMqttClient.kt"
click node_preferences "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/screens/PreferencesScreen.kt"
click node_config_repo "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/data/AppConfigRepository.kt"
click node_driver_hmi "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/screens/hmi/HmiScreen.kt"
click node_navigation "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/navigation/AppNav.kt"
click node_container "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/AppContainer.kt"
click node_api_entry "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/main.py"
click node_commands "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/commands.py"
click node_demo "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/demo.py"
click node_sync "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/sync.py"
click node_auth "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/auth.py"
click node_db_layer "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/db.py"
click node_outbox "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/outbox.py"
click node_receipts "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/receipts.py"
click node_nodered "https://github.com/triple-david-iot/accesiblebus-android/blob/develop/nodered/package.json"

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_passenger,node_passenger_vm,node_confirm,node_tracking,node_stops,node_assistance,node_api_source,node_api_client,node_event_feed,node_mqtt_client,node_preferences,node_config_repo,node_driver_hmi,node_navigation,node_container toneBlue
class node_api_entry,node_commands,node_demo,node_sync,node_auth,node_db_layer,node_outbox,node_receipts toneAmber
class node_database toneMint
class node_mqtt_broker,node_nodered toneRose
class node_passenger_actor,node_driver_actor,node_operator_actor toneIndigo
```

## Components

### Android app

- [Passenger UI](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/StopsScreen.kt): `app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/StopsScreen.kt`
- [Passenger state](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/PassengerViewModel.kt): `app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/PassengerViewModel.kt`
- [Request confirmation](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/ConfirmScreen.kt): `app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/ConfirmScreen.kt`
- [Request tracking](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/TrackingScreen.kt): `app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/TrackingScreen.kt`
- [Stops data](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/data/StopsRepository.kt): `app/src/main/java/dte/masteriot/accessiblebus/core/data/StopsRepository.kt`
- [Assistance state](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/data/AssistanceRepository.kt): `app/src/main/java/dte/masteriot/accessiblebus/core/data/AssistanceRepository.kt`
- [API source](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/net/ApiSource.kt): `app/src/main/java/dte/masteriot/accessiblebus/core/net/ApiSource.kt`
- [HTTP client](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/net/ApiClient.kt): `app/src/main/java/dte/masteriot/accessiblebus/core/net/ApiClient.kt`
- [MQTT event feed](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/data/EventFeed.kt): `app/src/main/java/dte/masteriot/accessiblebus/core/data/EventFeed.kt`
- [MQTT client](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/core/mqtt/BusMqttClient.kt): `app/src/main/java/dte/masteriot/accessiblebus/core/mqtt/BusMqttClient.kt`
- [Preferences UI](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/screens/PreferencesScreen.kt): `app/src/main/java/dte/masteriot/accessiblebus/ui/screens/PreferencesScreen.kt`
- [App configuration](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/data/AppConfigRepository.kt): `app/src/main/java/dte/masteriot/accessiblebus/data/AppConfigRepository.kt`
- [Driver HMI](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/ui/screens/hmi/HmiScreen.kt): `app/src/main/java/dte/masteriot/accessiblebus/ui/screens/hmi/HmiScreen.kt`
- [App navigation](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/navigation/AppNav.kt): `app/src/main/java/dte/masteriot/accessiblebus/navigation/AppNav.kt`
- [Dependency wiring](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/app/src/main/java/dte/masteriot/accessiblebus/AppContainer.kt): `app/src/main/java/dte/masteriot/accessiblebus/AppContainer.kt`

### API backend

- [API entry](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/main.py): `api/app/main.py`
- [Request commands](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/commands.py): `api/app/commands.py`
- [Demo trip](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/demo.py): `api/app/demo.py`
- [State sync](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/sync.py): `api/app/sync.py`
- [Demo identity](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/auth.py): `api/app/auth.py`
- [Database access](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/db.py): `api/app/db.py`
- [Event outbox](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/outbox.py): `api/app/outbox.py`
- [Event receipts](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/api/app/receipts.py): `api/app/receipts.py`

### State and messaging

- **PostgreSQL**

### Integration services

- **Mosquitto broker**
- [Node-RED](https://github.com/triple-david-iot/accesiblebus-android/blob/develop/nodered/package.json): `nodered/package.json`

### Other components

- **Passenger**
- **Driver**
- **Operator**

## Connections

- Passenger → Passenger UI: uses
- Passenger UI → Passenger state: uses state (evidence: `app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/StopsScreen.kt`)
- Passenger state → Assistance state: requests assistance
- Passenger UI → Stops data: loads stops
- Passenger UI → Request confirmation: confirms request (evidence: `app/src/main/java/dte/masteriot/accessiblebus/navigation/AppNav.kt`)
- Passenger UI → Request tracking: tracks request (evidence: `app/src/main/java/dte/masteriot/accessiblebus/navigation/AppNav.kt`)
- Request tracking → Passenger state: observes state (evidence: `app/src/main/java/dte/masteriot/accessiblebus/ui/passenger/TrackingScreen.kt`)
- Assistance state → API source: calls API (evidence: `app/src/main/java/dte/masteriot/accessiblebus/core/data/AssistanceRepository.kt`)
- HTTP client → API source: implements (evidence: `app/src/main/java/dte/masteriot/accessiblebus/core/net/ApiClient.kt`)
- Assistance state → MQTT event feed: subscribes events (evidence: `app/src/main/java/dte/masteriot/accessiblebus/core/data/AssistanceRepository.kt`)
- MQTT event feed → MQTT client: uses client (evidence: `app/src/main/java/dte/masteriot/accessiblebus/core/data/EventFeed.kt`)
- Preferences UI → App configuration: reads and saves (evidence: `app/src/main/java/dte/masteriot/accessiblebus/ui/screens/PreferencesScreen.kt`)
- Preferences UI → App navigation: routed by (evidence: `app/src/main/java/dte/masteriot/accessiblebus/navigation/AppNav.kt`)
- Driver → Driver HMI: uses
- Driver HMI → App navigation: routed by (evidence: `app/src/main/java/dte/masteriot/accessiblebus/navigation/AppNav.kt`)
- Dependency wiring → Assistance state: constructs (evidence: `app/src/main/java/dte/masteriot/accessiblebus/AppContainer.kt`)
- Dependency wiring → HTTP client: selects client (evidence: `app/src/main/java/dte/masteriot/accessiblebus/AppContainer.kt`)
- Dependency wiring → Stops data: constructs (evidence: `app/src/main/java/dte/masteriot/accessiblebus/AppContainer.kt`)
- Dependency wiring → App configuration: constructs (evidence: `app/src/main/java/dte/masteriot/accessiblebus/AppContainer.kt`)
- API entry → Request commands: mounts routes (evidence: `api/app/main.py`)
- API entry → Demo trip: mounts routes (evidence: `api/app/main.py`)
- API entry → State sync: mounts routes (evidence: `api/app/main.py`)
- API entry → Database access: opens and closes (evidence: `api/app/main.py`)
- API entry → Demo trip: initializes scenario (evidence: `api/app/main.py`)
- API entry → Event outbox: starts worker (evidence: `api/app/main.py`)
- API entry → Event receipts: starts worker (evidence: `api/app/main.py`)
- Request commands → Database access: runs transactions (evidence: `api/app/commands.py`)
- Request commands → Demo identity: checks actor (evidence: `api/app/commands.py`)
- Demo trip → Database access: reads and writes (evidence: `api/app/demo.py`)
- Demo trip → Request commands: uses command logic (evidence: `api/app/demo.py`)
- Demo trip → Demo identity: checks actor (evidence: `api/app/demo.py`)
- State sync → Database access: reads state (evidence: `api/app/sync.py`)
- State sync → Demo identity: checks actor (evidence: `api/app/sync.py`)
- Database access → PostgreSQL: queries
- Event outbox → Mosquitto broker: publishes events
- Event receipts → Mosquitto broker: receives receipts
- MQTT client → Mosquitto broker: connects (evidence: `README.md`)
- Node-RED → Mosquitto broker: integrates via MQTT (evidence: `README.md`)
- Operator → Demo trip: resets trip (evidence: `api/app/demo.py`)
