# jp-raub/sem architecture

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

- Interactive diagram: https://gitdiagram.com/jp-raub/sem
- Repository: https://github.com/jp-raub/sem

## Overview

This repository implements SEM, an event-management web application with a demo mode and an authenticated product mode. The principal workflow is a user entering through the web UI, authenticating in product mode, and reading event lists or event details assembled from persisted event data. The tree also shows substantial account, appearance, invitation, messaging, notification, profile, and event-management UI capabilities. Those branches are represented, but their runtime wiring is not established by the sampled excerpts; edges therefore focus on relationships visible in the index or source.

Main entry points: [`src/Sem.Web/Program.cs`](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Program.cs) (Web host), [`src/Sem.Web/Runtime/EventDetailReader.cs`](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/EventDetailReader.cs) (Event detail reader), [`src/Sem.Authentication/AuthenticationPipeline.cs`](https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/AuthenticationPipeline.cs) (Authentication pipeline), [`src/Sem.Authentication/AuthenticationSession.cs`](https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/AuthenticationSession.cs) (Session validation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web runtime"]
  node_host["Web host<br/>[Program.cs]"]
  node_settings["Product settings<br/>[ProductSettings.cs]"]
end

subgraph group_auth["Authentication"]
  node_auth_pipeline["Authentication pipeline"]
  node_login["Login endpoints"]
  node_auth_session["Session validation"]
  node_login_attempts["Login attempts"]
  node_auth_settings["Authentication settings"]
end

subgraph group_events["Event experience"]
  node_event_list["Event list reader<br/>[EventListReader.cs]"]
  node_event_detail["Event detail reader"]
  node_event_endpoints["Event detail endpoints"]
  node_event_math["Timetable calculator"]
  node_location["Location links"]
  node_public_answers["Public answer projection"]
end

subgraph group_storage["Storage and domain"]
  node_storage_open["Storage opening<br/>[ProductStorage.cs]"]
  node_lease["Storage lease<br/>[StorageLease.cs]"]
  node_initializer["SQLite initialization"]
  node_db[("Application database")]
  node_user_model["User model<br/>[ApplicationUser.cs]"]
end

subgraph group_productui["Product UI"]
  node_event_ui["Event interface<br/>[event-view.js]"]
  node_auth_ui["Authentication interface<br/>[authentication.js]"]
  node_profile_ui["Profile interface<br/>[profile-view.js]"]
  node_account_ui["Account interface<br/>[account-view.js]"]
  node_appearance_ui["Appearance interface<br/>[appearance-view.js]"]
  node_invitation_ui["Invitation interface<br/>[invitation-view.js]"]
  node_inv_admin_ui["Invitation administration"]
  node_message_ui["Messaging interface<br/>[message-view.js]"]
  node_notification_ui["Notification interface"]
end

node_user(("User"))

node_user -->|"requests pages"| node_host
node_host -->|"loads configuration"| node_settings
node_host -->|"opens product storage"| node_storage_open
node_storage_open -->|"acquires lease"| node_lease
node_storage_open -->|"creates context"| node_db
node_storage_open -->|"initializes schema"| node_initializer
node_host -->|"registers and uses"| node_auth_pipeline
node_host -->|"maps list routes"| node_event_list
node_host -->|"maps detail routes"| node_event_endpoints
node_auth_pipeline -->|"configures authentication"| node_auth_settings
node_auth_pipeline -->|"registers store"| node_login_attempts
node_auth_pipeline -->|"validates principals"| node_auth_session
node_login -->|"uses session checks"| node_auth_session
node_login -->|"uses attempt store"| node_login_attempts
node_login -->|"queries and updates"| node_db
node_auth_session -->|"checks user and revocation"| node_db
node_auth_pipeline -->|"configures identity"| node_user_model
node_event_list -->|"reads event data"| node_db
node_event_list -->|"validates session"| node_auth_session
node_event_detail -->|"reads event data"| node_db
node_event_detail -->|"validates session"| node_auth_session
node_event_detail -->|"calculates timetable"| node_event_math
node_event_detail -->|"uses location links"| node_location
node_event_detail -->|"reads projection"| node_public_answers
node_host -->|"serves asset"| node_auth_ui
node_host -->|"serves asset"| node_event_ui
node_user -.->|"uses profile features"| node_profile_ui
node_user -.->|"uses account features"| node_account_ui
node_user -.->|"uses appearance features"| node_appearance_ui
node_user -.->|"uses invitations"| node_invitation_ui
node_user -.->|"administers invitations"| node_inv_admin_ui
node_user -.->|"uses messaging"| node_message_ui
node_user -.->|"uses notifications"| node_notification_ui

click node_host "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Program.cs"
click node_settings "https://github.com/jp-raub/sem/blob/main/src/Sem.Hosting/ProductSettings.cs"
click node_storage_open "https://github.com/jp-raub/sem/blob/main/src/Sem.Hosting/ProductStorage.cs"
click node_lease "https://github.com/jp-raub/sem/blob/main/src/Sem.Hosting/StorageLease.cs"
click node_initializer "https://github.com/jp-raub/sem/blob/main/src/Sem.Storage/Data/SqliteStorageInitializer.cs"
click node_db "https://github.com/jp-raub/sem/blob/main/src/Sem.Storage/Data/ApplicationDbContext.cs"
click node_user_model "https://github.com/jp-raub/sem/blob/main/src/Sem.Storage/Models/Data/ApplicationUser.cs"
click node_auth_pipeline "https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/AuthenticationPipeline.cs"
click node_login "https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/ApplicationLoginEndpoints.cs"
click node_auth_session "https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/AuthenticationSession.cs"
click node_login_attempts "https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/LoginAttemptStore.cs"
click node_auth_settings "https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/AuthenticationSettings.cs"
click node_event_list "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/EventListReader.cs"
click node_event_detail "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/EventDetailReader.cs"
click node_event_endpoints "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/EventDetailEndpoints.cs"
click node_event_math "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Core/TimetableCalculator.cs"
click node_location "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Core/EventLocationLink.cs"
click node_public_answers "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/PublicAnswerProjection.cs"
click node_event_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/event-view.js"
click node_auth_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/authentication.js"
click node_profile_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/profile-view.js"
click node_account_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/account-view.js"
click node_appearance_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/appearance-view.js"
click node_invitation_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/invitation-view.js"
click node_inv_admin_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/invitation-administration-view.js"
click node_message_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/message-view.js"
click node_notification_ui "https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/notification-view.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_host,node_settings,node_user toneBlue
class node_auth_pipeline,node_login,node_auth_session,node_login_attempts,node_auth_settings toneAmber
class node_event_list,node_event_detail,node_event_endpoints,node_event_math,node_location,node_public_answers toneMint
class node_storage_open,node_lease,node_initializer,node_db,node_user_model toneRose
class node_event_ui,node_auth_ui,node_profile_ui,node_account_ui,node_appearance_ui,node_invitation_ui,node_inv_admin_ui,node_message_ui,node_notification_ui toneIndigo
```

## Components

### Web runtime

- [Web host](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Program.cs): `src/Sem.Web/Program.cs`
- [Product settings](https://github.com/jp-raub/sem/blob/main/src/Sem.Hosting/ProductSettings.cs): `src/Sem.Hosting/ProductSettings.cs`

### Authentication

- [Authentication pipeline](https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/AuthenticationPipeline.cs): `src/Sem.Authentication/AuthenticationPipeline.cs`
- [Login endpoints](https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/ApplicationLoginEndpoints.cs): `src/Sem.Authentication/ApplicationLoginEndpoints.cs`
- [Session validation](https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/AuthenticationSession.cs): `src/Sem.Authentication/AuthenticationSession.cs`
- [Login attempts](https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/LoginAttemptStore.cs): `src/Sem.Authentication/LoginAttemptStore.cs`
- [Authentication settings](https://github.com/jp-raub/sem/blob/main/src/Sem.Authentication/AuthenticationSettings.cs): `src/Sem.Authentication/AuthenticationSettings.cs`

### Event experience

- [Event list reader](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/EventListReader.cs): `src/Sem.Web/Runtime/EventListReader.cs`
- [Event detail reader](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/EventDetailReader.cs): `src/Sem.Web/Runtime/EventDetailReader.cs`
- [Event detail endpoints](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/EventDetailEndpoints.cs): `src/Sem.Web/Runtime/EventDetailEndpoints.cs`
- [Timetable calculator](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Core/TimetableCalculator.cs): `src/Sem.Web/Core/TimetableCalculator.cs`
- [Location links](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Core/EventLocationLink.cs): `src/Sem.Web/Core/EventLocationLink.cs`
- [Public answer projection](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/Runtime/PublicAnswerProjection.cs): `src/Sem.Web/Runtime/PublicAnswerProjection.cs`

### Storage and domain

- [Storage opening](https://github.com/jp-raub/sem/blob/main/src/Sem.Hosting/ProductStorage.cs): `src/Sem.Hosting/ProductStorage.cs`
- [Storage lease](https://github.com/jp-raub/sem/blob/main/src/Sem.Hosting/StorageLease.cs): `src/Sem.Hosting/StorageLease.cs`
- [SQLite initialization](https://github.com/jp-raub/sem/blob/main/src/Sem.Storage/Data/SqliteStorageInitializer.cs): `src/Sem.Storage/Data/SqliteStorageInitializer.cs`
- [Application database](https://github.com/jp-raub/sem/blob/main/src/Sem.Storage/Data/ApplicationDbContext.cs): `src/Sem.Storage/Data/ApplicationDbContext.cs`
- [User model](https://github.com/jp-raub/sem/blob/main/src/Sem.Storage/Models/Data/ApplicationUser.cs): `src/Sem.Storage/Models/Data/ApplicationUser.cs`

### Product UI

- [Event interface](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/event-view.js): `src/Sem.Web/ProductUI/event-view.js`
- [Authentication interface](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/authentication.js): `src/Sem.Web/ProductUI/authentication.js`
- [Profile interface](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/profile-view.js): `src/Sem.Web/ProductUI/profile-view.js`
- [Account interface](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/account-view.js): `src/Sem.Web/ProductUI/account-view.js`
- [Appearance interface](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/appearance-view.js): `src/Sem.Web/ProductUI/appearance-view.js`
- [Invitation interface](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/invitation-view.js): `src/Sem.Web/ProductUI/invitation-view.js`
- [Invitation administration](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/invitation-administration-view.js): `src/Sem.Web/ProductUI/invitation-administration-view.js`
- [Messaging interface](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/message-view.js): `src/Sem.Web/ProductUI/message-view.js`
- [Notification interface](https://github.com/jp-raub/sem/blob/main/src/Sem.Web/ProductUI/notification-view.js): `src/Sem.Web/ProductUI/notification-view.js`

### Other components

- **User**

## Connections

- User → Web host: requests pages (evidence: `src/Sem.Web/Program.cs`)
- Web host → Product settings: loads configuration (evidence: `src/Sem.Web/Program.cs`)
- Web host → Storage opening: opens product storage (evidence: `src/Sem.Web/Program.cs`)
- Storage opening → Storage lease: acquires lease (evidence: `src/Sem.Hosting/ProductStorage.cs`)
- Storage opening → Application database: creates context (evidence: `src/Sem.Hosting/ProductStorage.cs`)
- Storage opening → SQLite initialization: initializes schema (evidence: `src/Sem.Hosting/ProductStorage.cs`)
- Web host → Authentication pipeline: registers and uses (evidence: `src/Sem.Web/Program.cs`)
- Web host → Event list reader: maps list routes (evidence: `src/Sem.Web/Program.cs`)
- Web host → Event detail endpoints: maps detail routes (evidence: `src/Sem.Web/Program.cs`)
- Authentication pipeline → Authentication settings: configures authentication (evidence: `src/Sem.Authentication/AuthenticationPipeline.cs`)
- Authentication pipeline → Login attempts: registers store (evidence: `src/Sem.Authentication/AuthenticationPipeline.cs`)
- Authentication pipeline → Session validation: validates principals (evidence: `src/Sem.Authentication/AuthenticationPipeline.cs`)
- Login endpoints → Session validation: uses session checks (evidence: `src/Sem.Authentication/ApplicationLoginEndpoints.cs`)
- Login endpoints → Login attempts: uses attempt store (evidence: `src/Sem.Authentication/ApplicationLoginEndpoints.cs`)
- Login endpoints → Application database: queries and updates (evidence: `src/Sem.Authentication/ApplicationLoginEndpoints.cs`)
- Session validation → Application database: checks user and revocation (evidence: `src/Sem.Authentication/AuthenticationSession.cs`)
- Authentication pipeline → User model: configures identity (evidence: `src/Sem.Authentication/AuthenticationPipeline.cs`)
- Event list reader → Application database: reads event data (evidence: `src/Sem.Web/Runtime/EventListReader.cs`)
- Event list reader → Session validation: validates session (evidence: `src/Sem.Web/Runtime/EventListReader.cs`)
- Event detail reader → Application database: reads event data (evidence: `src/Sem.Web/Runtime/EventDetailReader.cs`)
- Event detail reader → Session validation: validates session (evidence: `src/Sem.Web/Runtime/EventDetailReader.cs`)
- Event detail reader → Timetable calculator: calculates timetable (evidence: `src/Sem.Web/Runtime/EventDetailReader.cs`)
- Event detail reader → Location links: uses location links (evidence: `src/Sem.Web/Runtime/EventDetailReader.cs`)
- Event detail reader → Public answer projection: reads projection (evidence: `src/Sem.Web/Runtime/EventDetailReader.cs`)
- Web host → Authentication interface: serves asset (evidence: `src/Sem.Web/Program.cs`)
- Web host → Event interface: serves asset (evidence: `src/Sem.Web/Program.cs`)
- User → Profile interface: uses profile features
- User → Account interface: uses account features
- User → Appearance interface: uses appearance features
- User → Invitation interface: uses invitations
- User → Invitation administration: administers invitations
- User → Messaging interface: uses messaging
- User → Notification interface: uses notifications
