# grinselln/croven-labs-apps architecture

> Architecture diagram of the GitHub repository grinselln/croven-labs-apps, 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/grinselln/croven-labs-apps
- Repository: https://github.com/grinselln/croven-labs-apps

## Overview

This repository contains three PHP web products: event tracking, festival lineups, and countdowns. The main user workflows are browsing and managing concert events, selecting a festival to view or import lineup data, and viewing or editing countdown items. The graph preserves the sampled page-to-partial and API-to-helper relationships, plus the Spotify export integration. Several domain APIs and storage implementations are listed but not excerpted; their connections are omitted where the evidence does not establish them.

Main entry points: [`apps/lineups/index.php`](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/index.php) (Lineup Manager), [`apps/events/schedule.php`](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/schedule.php) (Event Schedule), [`apps/events/api/auth.php`](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/auth.php) (Session Gate), [`apps/countdowns/api/includes/db.php`](https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/includes/db.php) (Database Bootstrap)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_events["Concert Events"]
  node_event_home["Event Stats<br/>[index.php]"]
  node_event_schedule["Event Schedule<br/>[schedule.php]"]
  node_event_nav["Event Navigation<br/>[nav.php]"]
  node_event_auth["Session Gate<br/>[auth.php]"]
  node_event_api["Event API<br/>[event_api.php]"]
  node_favorites_api["Favorites API<br/>[api_favorites.php]"]
  node_admin_api["Admin API<br/>[admin_api.php]"]
  node_festival_page["Festival Manager<br/>[festivals.php]"]
  node_festival_import_logic["Festival Import Logic<br/>[imports_logic.php]"]
  node_rockville_sets["Rockville Setlists"]
  node_media_browser["Media Browser"]
  node_upload_helper["Upload Helpers<br/>[upload_helper.php]"]
  node_memory_modal["Memories Viewer"]
  node_memory_api["Memories API<br/>[memories_api.php]"]
  node_onedrive_api["OneDrive API<br/>[onedrive_ajax.php]"]
end

subgraph group_lineups["Festival Lineups"]
  node_lineup_home["Lineup Manager<br/>[index.php]"]
  node_lineup_logic["Lineup Import Logic<br/>[imports_logic.php]"]
  node_lineup_import_ui["Import Interface"]
  node_lineup_import_alt["Import Interface V2<br/>[lineup_imports.php]"]
  node_lineup_viewer["Lineup Viewer<br/>[LineupViewer.php]"]
  node_setlist_viewer["Setlist Viewer<br/>[SetListViewer.php]"]
  node_lineups_api["Lineups API<br/>[lineups_api.php]"]
  node_lockscreen["Lock Screen"]
  node_spotify_playlists["Playlist Exporter<br/>[playlists.php]"]
  node_spotify_config["Spotify Client<br/>[config.php]"]
end

subgraph group_countdowns["Countdowns"]
  node_countdown_page["Countdown Board<br/>[index.php]"]
  node_countdown_events["Countdown Events API<br/>[events.php]"]
  node_countdown_calendars["Calendars API<br/>[calendars.php]"]
  node_countdown_icons["Icons API<br/>[icons.php]"]
end

subgraph group_shared["Shared Runtime"]
  node_countdown_db_helper["Database Bootstrap<br/>[db.php]"]
  node_json_helper["JSON Responses<br/>[response.php]"]
  node_bootstrap["Application Bootstrap<br/>[bootstrap.php]"]
end

node_visitor(("User"))
node_spotify{{"Spotify API"}}

node_visitor -->|"browses"| node_event_home
node_visitor -->|"browses"| node_event_schedule
node_event_home -->|"checks session"| node_event_auth
node_event_home -->|"renders"| node_event_nav
node_event_schedule -->|"checks session"| node_event_auth
node_event_schedule -->|"renders"| node_event_nav
node_event_schedule -->|"renders"| node_media_browser
node_event_schedule -->|"renders"| node_memory_modal
node_media_browser -->|"uses"| node_upload_helper
node_event_api -->|"checks session"| node_event_auth
node_favorites_api -->|"checks session"| node_event_auth
node_admin_api -->|"checks session"| node_event_auth
node_festival_page -->|"uses"| node_festival_import_logic
node_festival_page -->|"renders"| node_rockville_sets
node_visitor -->|"opens"| node_lineup_home
node_lineup_home -->|"uses"| node_lineup_logic
node_lineup_home -->|"renders"| node_lineup_import_ui
node_lineup_home -->|"renders"| node_lineup_import_alt
node_lineup_home -->|"renders"| node_lineup_viewer
node_lineup_home -->|"renders"| node_setlist_viewer
node_lineup_home -->|"renders"| node_lockscreen
node_lineup_import_ui -->|"posts imports"| node_lineup_home
node_visitor -->|"exports playlists"| node_spotify_playlists
node_spotify_playlists -->|"uses client"| node_spotify_config
node_spotify_playlists -->|"fetches playlists"| node_spotify
node_visitor -->|"views"| node_countdown_page
node_visitor -->|"manages items"| node_countdown_events
node_countdown_events -->|"loads database"| node_countdown_db_helper
node_countdown_events -->|"formats responses"| node_json_helper
node_countdown_calendars -->|"loads database"| node_countdown_db_helper
node_countdown_calendars -->|"formats responses"| node_json_helper
node_countdown_icons -->|"loads database"| node_countdown_db_helper
node_countdown_icons -->|"formats responses"| node_json_helper
node_countdown_db_helper -->|"loads configuration"| node_bootstrap

click node_event_home "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/index.php"
click node_event_schedule "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/schedule.php"
click node_event_nav "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/nav.php"
click node_event_auth "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/auth.php"
click node_event_api "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/event_api.php"
click node_favorites_api "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/api_favorites.php"
click node_admin_api "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/admin_api.php"
click node_festival_page "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/delete/festivals.php"
click node_festival_import_logic "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/delete/imports_logic.php"
click node_rockville_sets "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/delete/RockvilleSetList.php"
click node_media_browser "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/b2_browser_modal.php"
click node_upload_helper "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/upload_helper.php"
click node_memory_modal "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/memories_db_modal.php"
click node_memory_api "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/memories_api.php"
click node_onedrive_api "https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/onedrive_ajax.php"
click node_lineup_home "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/index.php"
click node_lineup_logic "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/imports_logic.php"
click node_lineup_import_ui "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/imports_partial.php"
click node_lineup_import_alt "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/lineup_imports.php"
click node_lineup_viewer "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/LineupViewer.php"
click node_setlist_viewer "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/SetListViewer.php"
click node_lineups_api "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/api/lineups_api.php"
click node_lockscreen "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/lockscreen_partial.php"
click node_spotify_playlists "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/spotify-exporter/playlists.php"
click node_spotify_config "https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/spotify-exporter/config.php"
click node_countdown_page "https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/index.php"
click node_countdown_events "https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/events.php"
click node_countdown_calendars "https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/calendars.php"
click node_countdown_icons "https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/icons.php"
click node_countdown_db_helper "https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/includes/db.php"
click node_json_helper "https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/includes/response.php"
click node_bootstrap "https://github.com/grinselln/croven-labs-apps/blob/main/config/bootstrap.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_event_home,node_event_schedule,node_event_nav,node_event_auth,node_event_api,node_favorites_api,node_admin_api,node_festival_page,node_festival_import_logic,node_rockville_sets,node_media_browser,node_upload_helper,node_memory_modal,node_memory_api,node_onedrive_api,node_visitor toneBlue
class node_lineup_home,node_lineup_logic,node_lineup_import_ui,node_lineup_import_alt,node_lineup_viewer,node_setlist_viewer,node_lineups_api,node_lockscreen,node_spotify_playlists,node_spotify_config toneAmber
class node_countdown_page,node_countdown_events,node_countdown_calendars,node_countdown_icons,node_spotify toneMint
class node_countdown_db_helper,node_json_helper,node_bootstrap toneRose
```

## Components

### Concert Events

- [Event Stats](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/index.php): `apps/events/index.php`
- [Event Schedule](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/schedule.php): `apps/events/schedule.php`
- [Event Navigation](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/nav.php): `apps/events/nav.php`
- [Session Gate](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/auth.php): `apps/events/api/auth.php`
- [Event API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/event_api.php): `apps/events/api/event_api.php`
- [Favorites API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/api_favorites.php): `apps/events/api/api_favorites.php`
- [Admin API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/admin_api.php): `apps/events/api/admin_api.php`
- [Festival Manager](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/delete/festivals.php): `apps/events/delete/festivals.php`
- [Festival Import Logic](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/delete/imports_logic.php): `apps/events/delete/imports_logic.php`
- [Rockville Setlists](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/delete/RockvilleSetList.php): `apps/events/delete/RockvilleSetList.php`
- [Media Browser](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/b2_browser_modal.php): `apps/events/b2_browser_modal.php`
- [Upload Helpers](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/upload_helper.php): `apps/events/upload_helper.php`
- [Memories Viewer](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/memories_db_modal.php): `apps/events/memories_db_modal.php`
- [Memories API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/memories_api.php): `apps/events/api/memories_api.php`
- [OneDrive API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/events/api/onedrive_ajax.php): `apps/events/api/onedrive_ajax.php`

### Festival Lineups

- [Lineup Manager](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/index.php): `apps/lineups/index.php`
- [Lineup Import Logic](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/imports_logic.php): `apps/lineups/imports_logic.php`
- [Import Interface](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/imports_partial.php): `apps/lineups/imports_partial.php`
- [Import Interface V2](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/lineup_imports.php): `apps/lineups/lineup_imports.php`
- [Lineup Viewer](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/LineupViewer.php): `apps/lineups/LineupViewer.php`
- [Setlist Viewer](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/SetListViewer.php): `apps/lineups/SetListViewer.php`
- [Lineups API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/api/lineups_api.php): `apps/lineups/api/lineups_api.php`
- [Lock Screen](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/lockscreen_partial.php): `apps/lineups/lockscreen_partial.php`
- [Playlist Exporter](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/spotify-exporter/playlists.php): `apps/lineups/spotify-exporter/playlists.php`
- [Spotify Client](https://github.com/grinselln/croven-labs-apps/blob/main/apps/lineups/spotify-exporter/config.php): `apps/lineups/spotify-exporter/config.php`

### Countdowns

- [Countdown Board](https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/index.php): `apps/countdowns/index.php`
- [Countdown Events API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/events.php): `apps/countdowns/api/events.php`
- [Calendars API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/calendars.php): `apps/countdowns/api/calendars.php`
- [Icons API](https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/icons.php): `apps/countdowns/api/icons.php`

### Shared Runtime

- [Database Bootstrap](https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/includes/db.php): `apps/countdowns/api/includes/db.php`
- [JSON Responses](https://github.com/grinselln/croven-labs-apps/blob/main/apps/countdowns/api/includes/response.php): `apps/countdowns/api/includes/response.php`
- [Application Bootstrap](https://github.com/grinselln/croven-labs-apps/blob/main/config/bootstrap.php): `config/bootstrap.php`

### Other components

- **User**
- **Spotify API**

## Connections

- User → Event Stats: browses
- User → Event Schedule: browses
- Event Stats → Session Gate: checks session (evidence: `apps/events/index.php`)
- Event Stats → Event Navigation: renders (evidence: `apps/events/index.php`)
- Event Schedule → Session Gate: checks session (evidence: `apps/events/schedule.php`)
- Event Schedule → Event Navigation: renders (evidence: `apps/events/schedule.php`)
- Event Schedule → Media Browser: renders (evidence: `apps/events/schedule.php`)
- Event Schedule → Memories Viewer: renders (evidence: `apps/events/schedule.php`)
- Media Browser → Upload Helpers: uses (evidence: `apps/events/b2_browser_modal.php`)
- Event API → Session Gate: checks session (evidence: `apps/events/api/event_api.php`)
- Favorites API → Session Gate: checks session (evidence: `apps/events/api/api_favorites.php`)
- Admin API → Session Gate: checks session (evidence: `apps/events/api/admin_api.php`)
- Festival Manager → Festival Import Logic: uses (evidence: `apps/events/delete/festivals.php`)
- Festival Manager → Rockville Setlists: renders (evidence: `apps/events/delete/festivals.php`)
- User → Lineup Manager: opens
- Lineup Manager → Lineup Import Logic: uses (evidence: `apps/lineups/index.php`)
- Lineup Manager → Import Interface: renders (evidence: `apps/lineups/index.php`)
- Lineup Manager → Import Interface V2: renders (evidence: `apps/lineups/index.php`)
- Lineup Manager → Lineup Viewer: renders (evidence: `apps/lineups/index.php`)
- Lineup Manager → Setlist Viewer: renders (evidence: `apps/lineups/index.php`)
- Lineup Manager → Lock Screen: renders (evidence: `apps/lineups/index.php`)
- Import Interface → Lineup Manager: posts imports (evidence: `apps/lineups/imports_partial.php`)
- User → Playlist Exporter: exports playlists
- Playlist Exporter → Spotify Client: uses client (evidence: `apps/lineups/spotify-exporter/playlists.php`)
- Playlist Exporter → Spotify API: fetches playlists (evidence: `apps/lineups/spotify-exporter/playlists.php`)
- User → Countdown Board: views
- User → Countdown Events API: manages items (evidence: `apps/countdowns/api/events.php`)
- Countdown Events API → Database Bootstrap: loads database (evidence: `apps/countdowns/api/events.php`)
- Countdown Events API → JSON Responses: formats responses (evidence: `apps/countdowns/api/events.php`)
- Calendars API → Database Bootstrap: loads database (evidence: `apps/countdowns/api/calendars.php`)
- Calendars API → JSON Responses: formats responses (evidence: `apps/countdowns/api/calendars.php`)
- Icons API → Database Bootstrap: loads database (evidence: `apps/countdowns/api/icons.php`)
- Icons API → JSON Responses: formats responses (evidence: `apps/countdowns/api/icons.php`)
- Database Bootstrap → Application Bootstrap: loads configuration (evidence: `apps/countdowns/api/includes/db.php`)
