# thm-health/pilos architecture

> Architecture diagram of the GitHub repository thm-health/pilos, 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/thm-health/pilos
- Repository: https://github.com/thm-health/pilos

## Overview

PILOS is a Vue frontend and Laravel API for managing online seminar rooms backed by BigBlueButton. The main user journey is to authenticate, browse or manage rooms, join a meeting, and later access recordings and attendance/history. The tree and README document administration, external identity providers, streaming, and metrics as additional capabilities. Sampled controller code confirms room joining delegates to RoomService and recording access uses recording storage; unsampled subsystem wiring is shown only where the README or tree supports it.

Main entry points: [`app/Http/Controllers/api/v1/RoomController.php`](https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/api/v1/RoomController.php) (Room API), [`resources/js/app.js`](https://github.com/thm-health/pilos/blob/develop/resources/js/app.js) (Vue application), [`app/Services/RoomService.php`](https://github.com/thm-health/pilos/blob/develop/app/Services/RoomService.php) (Room services), [`app/Http/Controllers/RecordingController.php`](https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/RecordingController.php) (Recording access)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["User interface"]
  node_vue["Vue application<br/>[app.js]"]
  node_authui["Login interface<br/>[LoginTabLocal.vue]"]
  node_roomui["Room interface"]
end

subgraph group_identity["Identity"]
  node_authapi["Authentication API"]
  node_externalauth["External auth"]
  node_users[("User accounts<br/>[User.php]")]
end

subgraph group_rooms["Rooms and meetings"]
  node_roomapi["Room API<br/>[RoomController.php]"]
  node_roomservice["Room services<br/>[RoomService.php]"]
  node_roomdata[("Room data<br/>[Room.php]")]
  node_meetingdata[("Meeting history<br/>[Meeting.php]")]
  node_recordingapi["Recording access"]
  node_recordings[("Recording files<br/>[Recording.php]")]
end

subgraph group_operations["Administration and operations"]
  node_adminapi["Administration API"]
  node_settings[("Application settings")]
  node_streaming["Streaming services"]
  node_metrics["Metrics"]
  node_locale["Localization<br/>[LocaleService.php]"]
end

node_user(("User"))
node_bbb{{"BigBlueButton"}}
node_storage[("File storage")]

node_user -->|"uses"| node_vue
node_vue -->|"renders"| node_authui
node_authui -->|"submits login"| node_authapi
node_authapi -->|"authenticates"| node_users
node_externalauth -->|"authenticates"| node_users
node_vue -->|"renders"| node_roomui
node_roomui -->|"requests rooms"| node_roomapi
node_roomapi -->|"delegates joining"| node_roomservice
node_roomapi -->|"reads and writes"| node_roomdata
node_roomservice -->|"controls meetings"| node_bbb
node_roomdata -->|"records meetings"| node_meetingdata
node_roomapi -->|"lists meetings"| node_meetingdata
node_roomapi -->|"offers recording access"| node_recordingapi
node_recordingapi -->|"reads metadata"| node_recordings
node_recordingapi -->|"reads files"| node_storage
node_adminapi -->|"manages settings"| node_settings
node_roomservice -.->|"configures streaming"| node_streaming
node_metrics -.->|"collects usage"| node_roomapi
node_vue -->|"selects locale"| node_locale

click node_vue "https://github.com/thm-health/pilos/blob/develop/resources/js/app.js"
click node_authui "https://github.com/thm-health/pilos/blob/develop/resources/js/components/LoginTabLocal.vue"
click node_authapi "https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/api/v1/auth/LoginController.php"
click node_externalauth "https://github.com/thm-health/pilos/tree/develop/app/Auth"
click node_users "https://github.com/thm-health/pilos/blob/develop/app/Models/User.php"
click node_roomui "https://github.com/thm-health/pilos/blob/develop/resources/js/components/RoomCreateComponent.vue"
click node_roomapi "https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/api/v1/RoomController.php"
click node_roomservice "https://github.com/thm-health/pilos/blob/develop/app/Services/RoomService.php"
click node_roomdata "https://github.com/thm-health/pilos/blob/develop/app/Models/Room.php"
click node_meetingdata "https://github.com/thm-health/pilos/blob/develop/app/Models/Meeting.php"
click node_recordingapi "https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/RecordingController.php"
click node_recordings "https://github.com/thm-health/pilos/blob/develop/app/Models/Recording.php"
click node_adminapi "https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/api/v1/SettingsController.php"
click node_settings "https://github.com/thm-health/pilos/tree/develop/app/Settings"
click node_streaming "https://github.com/thm-health/pilos/blob/develop/app/Services/StreamingService.php"
click node_metrics "https://github.com/thm-health/pilos/blob/develop/app/Prometheus/CollectorRegistry.php"
click node_locale "https://github.com/thm-health/pilos/blob/develop/app/Services/LocaleService.php"

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_vue,node_authui,node_roomui,node_user toneBlue
class node_authapi,node_externalauth,node_users,node_storage toneAmber
class node_roomapi,node_roomservice,node_roomdata,node_meetingdata,node_recordingapi,node_recordings toneMint
class node_adminapi,node_settings,node_streaming,node_metrics,node_locale toneRose
class node_bbb toneIndigo
```

## Components

### User interface

- [Vue application](https://github.com/thm-health/pilos/blob/develop/resources/js/app.js): `resources/js/app.js`
- [Login interface](https://github.com/thm-health/pilos/blob/develop/resources/js/components/LoginTabLocal.vue): `resources/js/components/LoginTabLocal.vue`
- [Room interface](https://github.com/thm-health/pilos/blob/develop/resources/js/components/RoomCreateComponent.vue): `resources/js/components/RoomCreateComponent.vue`

### Identity

- [Authentication API](https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/api/v1/auth/LoginController.php): `app/Http/Controllers/api/v1/auth/LoginController.php`
- [External auth](https://github.com/thm-health/pilos/tree/develop/app/Auth): `app/Auth`
- [User accounts](https://github.com/thm-health/pilos/blob/develop/app/Models/User.php): `app/Models/User.php`

### Rooms and meetings

- [Room API](https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/api/v1/RoomController.php): `app/Http/Controllers/api/v1/RoomController.php`
- [Room services](https://github.com/thm-health/pilos/blob/develop/app/Services/RoomService.php): `app/Services/RoomService.php`
- [Room data](https://github.com/thm-health/pilos/blob/develop/app/Models/Room.php): `app/Models/Room.php`
- [Meeting history](https://github.com/thm-health/pilos/blob/develop/app/Models/Meeting.php): `app/Models/Meeting.php`
- [Recording access](https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/RecordingController.php): `app/Http/Controllers/RecordingController.php`
- [Recording files](https://github.com/thm-health/pilos/blob/develop/app/Models/Recording.php): `app/Models/Recording.php`

### Administration and operations

- [Administration API](https://github.com/thm-health/pilos/blob/develop/app/Http/Controllers/api/v1/SettingsController.php): `app/Http/Controllers/api/v1/SettingsController.php`
- [Application settings](https://github.com/thm-health/pilos/tree/develop/app/Settings): `app/Settings`
- [Streaming services](https://github.com/thm-health/pilos/blob/develop/app/Services/StreamingService.php): `app/Services/StreamingService.php`
- [Metrics](https://github.com/thm-health/pilos/blob/develop/app/Prometheus/CollectorRegistry.php): `app/Prometheus/CollectorRegistry.php`
- [Localization](https://github.com/thm-health/pilos/blob/develop/app/Services/LocaleService.php): `app/Services/LocaleService.php`

### Other components

- **User**
- **BigBlueButton**
- **File storage**

## Connections

- User → Vue application: uses
- Vue application → Login interface: renders
- Login interface → Authentication API: submits login
- Authentication API → User accounts: authenticates
- External auth → User accounts: authenticates
- Vue application → Room interface: renders
- Room interface → Room API: requests rooms
- Room API → Room services: delegates joining
- Room API → Room data: reads and writes
- Room services → BigBlueButton: controls meetings
- Room data → Meeting history: records meetings
- Room API → Meeting history: lists meetings
- Room API → Recording access: offers recording access
- Recording access → Recording files: reads metadata
- Recording access → File storage: reads files
- Administration API → Application settings: manages settings
- Room services → Streaming services: configures streaming
- Metrics → Room API: collects usage
- Vue application → Localization: selects locale
