# kingty0/backstage architecture

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

- Interactive diagram: https://gitdiagram.com/kingty0/backstage
- Repository: https://github.com/kingty0/backstage

## Overview

Backstage is a Blazor inventory and logistics application for the Chicago International Theatre Puppet Festival. Festival staff use its web interface to manage a product catalog, stock by location, transfers and delivery tracking, and sales; administrators also manage accounts. The runtime is organized around Razor components, an Entity Framework data model backed by SQLite, and supporting identity and backup services. The README documents major workflows, but most page implementations were not sampled, so those links are documented capabilities rather than inspected call paths.

Main entry points: [`src/Data/ApplicationDbContext.cs`](https://github.com/kingty0/backstage/blob/main/src/Data/ApplicationDbContext.cs) (EF data context), [`src/Components/App.razor`](https://github.com/kingty0/backstage/blob/main/src/Components/App.razor) (Blazor app shell), [`src/Services/SqliteBackupService.cs`](https://github.com/kingty0/backstage/blob/main/src/Services/SqliteBackupService.cs) (SQLite backup service), [`src/Components/Account/Pages/Login.razor`](https://github.com/kingty0/backstage/blob/main/src/Components/Account/Pages/Login.razor) (Account workflows)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web interface"]
  node_app["Blazor app shell<br/>[App.razor]"]
  node_dashboard["Dashboard and alerts<br/>[Dashboard.razor]"]
end

subgraph group_operations["Inventory operations"]
  node_catalog["Product catalog<br/>[Index.razor]"]
  node_locations["Location management<br/>[Locations.razor]"]
  node_stock["Stock management<br/>[Stock.razor]"]
  node_transfers["Stock transfers<br/>[Transfers.razor]"]
  node_sales["Sales workflow<br/>[Create.razor]"]
end

subgraph group_identity["Identity and administration"]
  node_admin_ui["Admin management"]
  node_identity_ui["Account workflows<br/>[Login.razor]"]
  node_redirect["Identity redirects"]
  node_email["Email sender"]
end

subgraph group_data["Data and persistence"]
  node_product_service["Product service<br/>[ProductService.cs]"]
  node_product["Product catalog model<br/>[Product.cs]"]
  node_inventory_model["Inventory model<br/>[Inventory.cs]"]
  node_location_model["Location model<br/>[Location.cs]"]
  node_stock_transfer["Transfer model"]
  node_dbcontext["EF data context"]
  node_sqlite[("SQLite database<br/>[app.db]")]
  node_seed["Seed data<br/>[SeedData.cs]"]
end

subgraph group_backup["Backup services"]
  node_backup_queue["Backup queue"]
  node_backup_service["SQLite backup service"]
end

node_staff(("Festival staff"))
node_admin(("Administrator"))
node_blob[("Azure Blob Storage")]

node_staff -->|"uses"| node_app
node_admin -->|"uses"| node_app
node_app -->|"renders"| node_dashboard
node_staff -->|"manages"| node_catalog
node_staff -->|"manages"| node_locations
node_staff -->|"tracks"| node_stock
node_staff -->|"coordinates"| node_transfers
node_staff -->|"records"| node_sales
node_admin -->|"manages"| node_admin_ui
node_staff -->|"authenticates"| node_identity_ui
node_identity_ui -.->|"redirects"| node_redirect
node_app -->|"configures"| node_dbcontext
node_app -->|"initializes"| node_seed
node_app -->|"registers"| node_email
node_product_service -->|"queries"| node_dbcontext
node_dbcontext -->|"maps"| node_product
node_dbcontext -->|"maps"| node_inventory_model
node_dbcontext -.->|"maps"| node_location_model
node_dbcontext -->|"maps"| node_stock_transfer
node_dbcontext -->|"persists"| node_sqlite
node_backup_queue -->|"resolves"| node_backup_service
node_backup_service -->|"snapshots"| node_sqlite
node_backup_service -->|"uploads backups"| node_blob
node_backup_service -->|"restores from"| node_blob

click node_app "https://github.com/kingty0/backstage/blob/main/src/Components/App.razor"
click node_dashboard "https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Dashboard.razor"
click node_catalog "https://github.com/kingty0/backstage/blob/main/src/Components/Pages/ProductPages/Index.razor"
click node_locations "https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Locations.razor"
click node_stock "https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Inventory/Stock.razor"
click node_transfers "https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Inventory/Transfers.razor"
click node_sales "https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Sales/Create.razor"
click node_admin_ui "https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Admin/UserManagement.razor"
click node_identity_ui "https://github.com/kingty0/backstage/blob/main/src/Components/Account/Pages/Login.razor"
click node_redirect "https://github.com/kingty0/backstage/blob/main/src/Components/Account/IdentityRedirectManager.cs"
click node_email "https://github.com/kingty0/backstage/blob/main/src/Services/BrevoEmailSender.cs"
click node_product_service "https://github.com/kingty0/backstage/blob/main/src/Services/ProductService.cs"
click node_product "https://github.com/kingty0/backstage/blob/main/src/Data/Product.cs"
click node_inventory_model "https://github.com/kingty0/backstage/blob/main/src/Data/Inventory.cs"
click node_location_model "https://github.com/kingty0/backstage/blob/main/src/Data/Location.cs"
click node_stock_transfer "https://github.com/kingty0/backstage/blob/main/src/Data/StockTransferBox.cs"
click node_dbcontext "https://github.com/kingty0/backstage/blob/main/src/Data/ApplicationDbContext.cs"
click node_sqlite "https://github.com/kingty0/backstage/blob/main/src/Data/app.db"
click node_seed "https://github.com/kingty0/backstage/blob/main/src/Data/SeedData.cs"
click node_backup_queue "https://github.com/kingty0/backstage/blob/main/src/Services/BackupQueueService.cs"
click node_backup_service "https://github.com/kingty0/backstage/blob/main/src/Services/SqliteBackupService.cs"

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_app,node_dashboard toneBlue
class node_catalog,node_locations,node_stock,node_transfers,node_sales,node_blob toneAmber
class node_admin_ui,node_identity_ui,node_redirect,node_email toneMint
class node_product_service,node_product,node_inventory_model,node_location_model,node_stock_transfer,node_dbcontext,node_sqlite,node_seed toneRose
class node_backup_queue,node_backup_service,node_staff,node_admin toneIndigo
```

## Components

### Web interface

- [Blazor app shell](https://github.com/kingty0/backstage/blob/main/src/Components/App.razor): `src/Components/App.razor`
- [Dashboard and alerts](https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Dashboard.razor): `src/Components/Pages/Dashboard.razor`

### Inventory operations

- [Product catalog](https://github.com/kingty0/backstage/blob/main/src/Components/Pages/ProductPages/Index.razor): `src/Components/Pages/ProductPages/Index.razor`
- [Location management](https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Locations.razor): `src/Components/Pages/Locations.razor`
- [Stock management](https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Inventory/Stock.razor): `src/Components/Pages/Inventory/Stock.razor`
- [Stock transfers](https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Inventory/Transfers.razor): `src/Components/Pages/Inventory/Transfers.razor`
- [Sales workflow](https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Sales/Create.razor): `src/Components/Pages/Sales/Create.razor`

### Identity and administration

- [Admin management](https://github.com/kingty0/backstage/blob/main/src/Components/Pages/Admin/UserManagement.razor): `src/Components/Pages/Admin/UserManagement.razor`
- [Account workflows](https://github.com/kingty0/backstage/blob/main/src/Components/Account/Pages/Login.razor): `src/Components/Account/Pages/Login.razor`
- [Identity redirects](https://github.com/kingty0/backstage/blob/main/src/Components/Account/IdentityRedirectManager.cs): `src/Components/Account/IdentityRedirectManager.cs`
- [Email sender](https://github.com/kingty0/backstage/blob/main/src/Services/BrevoEmailSender.cs): `src/Services/BrevoEmailSender.cs`

### Data and persistence

- [Product service](https://github.com/kingty0/backstage/blob/main/src/Services/ProductService.cs): `src/Services/ProductService.cs`
- [Product catalog model](https://github.com/kingty0/backstage/blob/main/src/Data/Product.cs): `src/Data/Product.cs`
- [Inventory model](https://github.com/kingty0/backstage/blob/main/src/Data/Inventory.cs): `src/Data/Inventory.cs`
- [Location model](https://github.com/kingty0/backstage/blob/main/src/Data/Location.cs): `src/Data/Location.cs`
- [Transfer model](https://github.com/kingty0/backstage/blob/main/src/Data/StockTransferBox.cs): `src/Data/StockTransferBox.cs`
- [EF data context](https://github.com/kingty0/backstage/blob/main/src/Data/ApplicationDbContext.cs): `src/Data/ApplicationDbContext.cs`
- [SQLite database](https://github.com/kingty0/backstage/blob/main/src/Data/app.db): `src/Data/app.db`
- [Seed data](https://github.com/kingty0/backstage/blob/main/src/Data/SeedData.cs): `src/Data/SeedData.cs`

### Backup services

- [Backup queue](https://github.com/kingty0/backstage/blob/main/src/Services/BackupQueueService.cs): `src/Services/BackupQueueService.cs`
- [SQLite backup service](https://github.com/kingty0/backstage/blob/main/src/Services/SqliteBackupService.cs): `src/Services/SqliteBackupService.cs`

### Other components

- **Festival staff**
- **Administrator**
- **Azure Blob Storage**

## Connections

- Festival staff → Blazor app shell: uses (evidence: `README.md`)
- Administrator → Blazor app shell: uses (evidence: `README.md`)
- Blazor app shell → Dashboard and alerts: renders (evidence: `README.md`)
- Festival staff → Product catalog: manages (evidence: `README.md`)
- Festival staff → Location management: manages (evidence: `README.md`)
- Festival staff → Stock management: tracks (evidence: `README.md`)
- Festival staff → Stock transfers: coordinates (evidence: `README.md`)
- Festival staff → Sales workflow: records (evidence: `README.md`)
- Administrator → Admin management: manages (evidence: `README.md`)
- Festival staff → Account workflows: authenticates (evidence: `README.md`)
- Account workflows → Identity redirects: redirects
- Blazor app shell → EF data context: configures
- Blazor app shell → Seed data: initializes
- Blazor app shell → Email sender: registers
- Product service → EF data context: queries (evidence: `src/Services/ProductService.cs`)
- EF data context → Product catalog model: maps (evidence: `src/Data/ApplicationDbContext.cs`)
- EF data context → Inventory model: maps (evidence: `src/Data/ApplicationDbContext.cs`)
- EF data context → Location model: maps (evidence: `src/Data/ApplicationDbContext.cs`)
- EF data context → Transfer model: maps (evidence: `src/Data/ApplicationDbContext.cs`)
- EF data context → SQLite database: persists
- Backup queue → SQLite backup service: resolves (evidence: `src/Services/BackupQueueService.cs`)
- SQLite backup service → SQLite database: snapshots (evidence: `src/Services/SqliteBackupService.cs`)
- SQLite backup service → Azure Blob Storage: uploads backups (evidence: `src/Services/SqliteBackupService.cs`)
- SQLite backup service → Azure Blob Storage: restores from (evidence: `src/Services/SqliteBackupService.cs`)
