# adam-blakey/readererer architecture

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

- Interactive diagram: https://gitdiagram.com/adam-blakey/readererer
- Repository: https://github.com/adam-blakey/readererer

## Overview

Readererer is a Laravel web app for community ensembles, combining attendance administration with a digital music library. Members respond to term-date polls; ensemble administrators review replies and record actual attendance, while the app also manages rosters, seating, schedules and music. The graph preserves these documented product areas and the sampled attendance, user-management, authentication and email-dispatch layers. Several controllers and feature implementations are unsampled, so their links are shown only where the README or source index supports them.

Main entry points: [`app/Http/Controllers/AttendanceController.php`](https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/AttendanceController.php) (Attendance polls), [`app/Models/TermDate.php`](https://github.com/adam-blakey/readererer/blob/main/app/Models/TermDate.php) (Rehearsal and concert dates), [`app/Http/Controllers/UserController.php`](https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/UserController.php) (User management), [`app/Models/Ensemble.php`](https://github.com/adam-blakey/readererer/blob/main/app/Models/Ensemble.php) (Ensembles and membership)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_attendance["Attendance and calendar"]
  node_polls["Attendance polls"]
  node_attendance_records[("Attendance history<br/>[Attendance.php]")]
  node_register["Day-of register"]
  node_terms[("Terms and dates<br/>[Term.php]")]
  node_term_dates[("Rehearsal and concert dates<br/>[TermDate.php]")]
  node_rosters[("Setup and driver rosters<br/>[SetupGroup.php]")]
end

subgraph group_people["People and ensembles"]
  node_seating["Seating plans"]
  node_users["User management<br/>[UserController.php]"]
  node_user_records[("Members and roles<br/>[User.php]")]
  node_ensembles[("Ensembles and membership<br/>[Ensemble.php]")]
  node_instrument_families[("Instrument families")]
end

subgraph group_library["Music library"]
  node_library_catalog["Composers and pieces"]
  node_setlists[("Setlists and parts<br/>[Setlist.php]")]
end

subgraph group_access["Access and administration"]
  node_auth["Sign-in and identity"]
  node_settings[("Site settings")]
  node_importer["Pollerer import"]
end

subgraph group_messaging["Notifications and email"]
  node_email_dispatch["Email dispatch"]
  node_email_sender["Email sender<br/>[EmailSender.php]"]
end

node_members(("Members"))
node_admins(("Conductors and admins"))
node_google{{"Google sign-in"}}

node_members -->|"submit replies"| node_polls
node_admins -->|"review replies"| node_polls
node_polls -->|"records replies"| node_attendance_records
node_polls -->|"dispatches notices"| node_email_dispatch
node_polls -->|"uses term"| node_terms
node_polls -->|"uses dates"| node_term_dates
node_members -->|"recorded at event"| node_register
node_admins -->|"record attendance"| node_register
node_terms -->|"contains dates"| node_term_dates
node_term_dates -->|"assigns setup group"| node_rosters
node_admins -->|"manage seating"| node_seating
node_users -->|"creates and updates"| node_user_records
node_users -->|"loads ensemble data"| node_ensembles
node_users -->|"loads instrument data"| node_instrument_families
node_user_records -->|"belongs to"| node_ensembles
node_ensembles -->|"members have"| node_instrument_families
node_admins -->|"manage library"| node_library_catalog
node_library_catalog -->|"organizes pieces"| node_setlists
node_setlists -->|"attached to dates"| node_term_dates
node_google -->|"authenticates via"| node_auth
node_admins -->|"configure site"| node_settings
node_importer -->|"reads settings"| node_settings
node_email_dispatch -.->|"uses sender"| node_email_sender

click node_polls "https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/AttendanceController.php"
click node_attendance_records "https://github.com/adam-blakey/readererer/blob/main/app/Models/Attendance.php"
click node_register "https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/AttendanceRegisterController.php"
click node_terms "https://github.com/adam-blakey/readererer/blob/main/app/Models/Term.php"
click node_term_dates "https://github.com/adam-blakey/readererer/blob/main/app/Models/TermDate.php"
click node_rosters "https://github.com/adam-blakey/readererer/blob/main/app/Models/SetupGroup.php"
click node_seating "https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/SeatingPlanController.php"
click node_users "https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/UserController.php"
click node_user_records "https://github.com/adam-blakey/readererer/blob/main/app/Models/User.php"
click node_ensembles "https://github.com/adam-blakey/readererer/blob/main/app/Models/Ensemble.php"
click node_instrument_families "https://github.com/adam-blakey/readererer/blob/main/app/Models/InstrumentFamily.php"
click node_library_catalog "https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/PieceController.php"
click node_setlists "https://github.com/adam-blakey/readererer/blob/main/app/Models/Setlist.php"
click node_auth "https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/Auth/GoogleLoginController.php"
click node_settings "https://github.com/adam-blakey/readererer/blob/main/app/Settings/GeneralSettings.php"
click node_importer "https://github.com/adam-blakey/readererer/blob/main/app/Services/PollererImporter.php"
click node_email_dispatch "https://github.com/adam-blakey/readererer/blob/main/app/Services/EmailDispatcher.php"
click node_email_sender "https://github.com/adam-blakey/readererer/blob/main/app/Contracts/EmailSender.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_polls,node_attendance_records,node_register,node_terms,node_term_dates,node_rosters toneBlue
class node_seating,node_users,node_user_records,node_ensembles,node_instrument_families toneAmber
class node_library_catalog,node_setlists toneMint
class node_auth,node_settings,node_importer toneRose
class node_email_dispatch,node_email_sender,node_members,node_admins,node_google toneIndigo
```

## Components

### Attendance and calendar

- [Attendance polls](https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/AttendanceController.php): `app/Http/Controllers/AttendanceController.php`
- [Attendance history](https://github.com/adam-blakey/readererer/blob/main/app/Models/Attendance.php): `app/Models/Attendance.php`
- [Day-of register](https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/AttendanceRegisterController.php): `app/Http/Controllers/AttendanceRegisterController.php`
- [Terms and dates](https://github.com/adam-blakey/readererer/blob/main/app/Models/Term.php): `app/Models/Term.php`
- [Rehearsal and concert dates](https://github.com/adam-blakey/readererer/blob/main/app/Models/TermDate.php): `app/Models/TermDate.php`
- [Setup and driver rosters](https://github.com/adam-blakey/readererer/blob/main/app/Models/SetupGroup.php): `app/Models/SetupGroup.php`

### People and ensembles

- [Seating plans](https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/SeatingPlanController.php): `app/Http/Controllers/SeatingPlanController.php`
- [User management](https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/UserController.php): `app/Http/Controllers/UserController.php`
- [Members and roles](https://github.com/adam-blakey/readererer/blob/main/app/Models/User.php): `app/Models/User.php`
- [Ensembles and membership](https://github.com/adam-blakey/readererer/blob/main/app/Models/Ensemble.php): `app/Models/Ensemble.php`
- [Instrument families](https://github.com/adam-blakey/readererer/blob/main/app/Models/InstrumentFamily.php): `app/Models/InstrumentFamily.php`

### Music library

- [Composers and pieces](https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/PieceController.php): `app/Http/Controllers/PieceController.php`
- [Setlists and parts](https://github.com/adam-blakey/readererer/blob/main/app/Models/Setlist.php): `app/Models/Setlist.php`

### Access and administration

- [Sign-in and identity](https://github.com/adam-blakey/readererer/blob/main/app/Http/Controllers/Auth/GoogleLoginController.php): `app/Http/Controllers/Auth/GoogleLoginController.php`
- [Site settings](https://github.com/adam-blakey/readererer/blob/main/app/Settings/GeneralSettings.php): `app/Settings/GeneralSettings.php`
- [Pollerer import](https://github.com/adam-blakey/readererer/blob/main/app/Services/PollererImporter.php): `app/Services/PollererImporter.php`

### Notifications and email

- [Email dispatch](https://github.com/adam-blakey/readererer/blob/main/app/Services/EmailDispatcher.php): `app/Services/EmailDispatcher.php`
- [Email sender](https://github.com/adam-blakey/readererer/blob/main/app/Contracts/EmailSender.php): `app/Contracts/EmailSender.php`

### Other components

- **Members**
- **Conductors and admins**
- **Google sign-in**

## Connections

- Members → Attendance polls: submit replies (evidence: `README.md`)
- Conductors and admins → Attendance polls: review replies (evidence: `README.md`)
- Attendance polls → Attendance history: records replies (evidence: `app/Http/Controllers/AttendanceController.php`)
- Attendance polls → Email dispatch: dispatches notices (evidence: `app/Http/Controllers/AttendanceController.php`)
- Attendance polls → Terms and dates: uses term (evidence: `app/Http/Controllers/AttendanceController.php`)
- Attendance polls → Rehearsal and concert dates: uses dates (evidence: `app/Http/Controllers/AttendanceController.php`)
- Members → Day-of register: recorded at event (evidence: `README.md`)
- Conductors and admins → Day-of register: record attendance (evidence: `README.md`)
- Terms and dates → Rehearsal and concert dates: contains dates (evidence: `README.md`)
- Rehearsal and concert dates → Setup and driver rosters: assigns setup group (evidence: `app/Models/TermDate.php`)
- Conductors and admins → Seating plans: manage seating (evidence: `README.md`)
- User management → Members and roles: creates and updates (evidence: `app/Http/Controllers/UserController.php`)
- User management → Ensembles and membership: loads ensemble data (evidence: `app/Http/Controllers/UserController.php`)
- User management → Instrument families: loads instrument data (evidence: `app/Http/Controllers/UserController.php`)
- Members and roles → Ensembles and membership: belongs to (evidence: `app/Models/User.php`)
- Ensembles and membership → Instrument families: members have (evidence: `app/Models/Ensemble.php`)
- Conductors and admins → Composers and pieces: manage library (evidence: `README.md`)
- Composers and pieces → Setlists and parts: organizes pieces (evidence: `README.md`)
- Setlists and parts → Rehearsal and concert dates: attached to dates (evidence: `README.md`)
- Google sign-in → Sign-in and identity: authenticates via (evidence: `app/Http/Controllers/Auth/GoogleLoginController.php`)
- Conductors and admins → Site settings: configure site (evidence: `README.md`)
- Pollerer import → Site settings: reads settings (evidence: `app/Services/PollererImporter.php`)
- Email dispatch → Email sender: uses sender
