# alexscheer90/app2point0 architecture

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

## Overview

This is a mobile-first MACtion sports companion: fans browse scores and schedules, then explore school profiles, stats, standings, news, rivalries, sounds, local food and podcasts. The client routes these experiences and fetches app data through hooks and API helpers; server routes expose schedule, score, preference, import and live-stat operations backed by provider-specific services. The README documents the broad product branches, though source excerpts do not establish every page’s wiring. The graph preserves those branches and limits arrows to relationships visible in excerpts or the SOURCE INDEX.

Main entry points: [`client/src/App.tsx`](https://github.com/alexscheer90/app2point0/blob/main/client/src/App.tsx) (App routing), [`server/routes.ts`](https://github.com/alexscheer90/app2point0/blob/main/server/routes.ts) (API routes), [`client/src/hooks/useScores.ts`](https://github.com/alexscheer90/app2point0/blob/main/client/src/hooks/useScores.ts) (Score hooks), [`client/src/hooks/useSchool.ts`](https://github.com/alexscheer90/app2point0/blob/main/client/src/hooks/useSchool.ts) (School data)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Fan experience"]
  node_app["App routing<br/>[App.tsx]"]
  node_scores["Scores<br/>[ScoresPage.tsx]"]
  node_schedule["Schedule<br/>[SchedulePage.tsx]"]
  node_gamedetails["Game details<br/>[GameDetails.tsx]"]
  node_gamestats["Game stats<br/>[GameStatsPage.tsx]"]
  node_schoolprofile["School profile<br/>[SchoolProfile.tsx]"]
  node_standings["Standings<br/>[StandingsPage.tsx]"]
  node_news["News<br/>[NewsPage.tsx]"]
  node_podcasts["Podcasts<br/>[PodcastPage.tsx]"]
  node_sounds["School sounds<br/>[SoundsPage.tsx]"]
  node_eats["Local eats<br/>[LocalEatsPage.tsx]"]
  node_rivalries["Rivalries<br/>[RivalriesPage.tsx]"]
  node_schools["Schools<br/>[SchoolsPage.tsx]"]
end

subgraph group_clientdata["Client data"]
  node_query["Query cache<br/>[queryClient.ts]"]
  node_scorehooks["Score hooks<br/>[useScores.ts]"]
  node_calendarhook["MAC calendar<br/>[useMacCalendar.ts]"]
  node_schoolhook["School data<br/>[useSchool.ts]"]
  node_preferences["Favorite school"]
  node_clientapi["API client<br/>[api.ts]"]
end

subgraph group_serverapi["Server API"]
  node_serverroutes["API routes<br/>[routes.ts]"]
  node_importroutes["Import routes<br/>[importer.ts]"]
  node_live_routes["Live-stat routes<br/>[livestats.ts]"]
  node_storage[("Preference storage<br/>[storage.ts]")]
  node_schema["Shared data schema<br/>[schema.ts]"]
end

subgraph group_providers["Sports data providers"]
  node_importer["Data importer<br/>[dataImporter.ts]"]
  node_unified["Unified live data"]
  node_sidearm["SIDEARM stats<br/>[sidearmService.ts]"]
  node_feeds["School feed config<br/>[schoolFeeds.ts]"]
  node_ncaa["NCAA scoreboard<br/>[ncaaService.ts]"]
  node_espnscore["ESPN scoreboard"]
  node_ncaa_client["NCAA client services<br/>[ncaaApiService.ts]"]
  node_sheets["Standings scraper"]
end

node_fan(("MAC fan"))
node_external(("Sports data feeds"))

node_fan -->|"opens"| node_app
node_app -->|"routes to"| node_scores
node_app -->|"routes to"| node_schedule
node_app -->|"routes to"| node_schoolprofile
node_app -->|"routes to"| node_news
node_app -->|"routes to"| node_standings
node_app -->|"routes to"| node_rivalries
node_app -->|"routes to"| node_sounds
node_app -->|"routes to"| node_eats
node_app -->|"routes to"| node_podcasts
node_app -->|"routes to"| node_gamestats
node_app -->|"routes to"| node_gamedetails
node_schedule -->|"uses"| node_scorehooks
node_scorehooks -->|"calls"| node_calendarhook
node_scores -.->|"uses"| node_scorehooks
node_scorehooks -.->|"queries through"| node_query
node_calendarhook -.->|"requests calendar"| node_serverroutes
node_serverroutes -->|"fetches scoreboard"| node_ncaa
node_ncaa -.->|"fetches games"| node_external
node_scores -.->|"score source"| node_espnscore
node_espnscore -->|"imports"| node_ncaa_client
node_gamedetails -->|"uses"| node_schoolhook
node_gamestats -->|"requests data"| node_clientapi
node_gamestats -->|"uses"| node_ncaa_client
node_news -->|"uses"| node_schoolhook
node_eats -->|"uses"| node_schoolhook
node_preferences -->|"uses"| node_schoolhook
node_preferences -->|"requests preferences"| node_clientapi
node_serverroutes -->|"updates preferences"| node_storage
node_serverroutes -->|"mounts routes"| node_importroutes
node_serverroutes -->|"mounts routes"| node_live_routes
node_importroutes -->|"calls"| node_importer
node_live_routes -->|"calls"| node_unified
node_unified -->|"fetches and parses"| node_sidearm
node_sidearm -->|"uses feed config"| node_feeds
node_sidearm -.->|"fetches stats"| node_external
node_sheets -->|"scrapes standings"| node_external
node_schema -.->|"defines records"| node_storage
node_schoolprofile -.->|"school data access"| node_clientapi

click node_app "https://github.com/alexscheer90/app2point0/blob/main/client/src/App.tsx"
click node_scores "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/ScoresPage.tsx"
click node_schedule "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/SchedulePage.tsx"
click node_gamedetails "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/GameDetails.tsx"
click node_gamestats "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/GameStatsPage.tsx"
click node_schoolprofile "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/SchoolProfile.tsx"
click node_standings "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/StandingsPage.tsx"
click node_news "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/NewsPage.tsx"
click node_podcasts "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/PodcastPage.tsx"
click node_sounds "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/SoundsPage.tsx"
click node_eats "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/LocalEatsPage.tsx"
click node_rivalries "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/RivalriesPage.tsx"
click node_schools "https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/SchoolsPage.tsx"
click node_query "https://github.com/alexscheer90/app2point0/blob/main/client/src/lib/queryClient.ts"
click node_scorehooks "https://github.com/alexscheer90/app2point0/blob/main/client/src/hooks/useScores.ts"
click node_calendarhook "https://github.com/alexscheer90/app2point0/blob/main/client/src/hooks/useMacCalendar.ts"
click node_schoolhook "https://github.com/alexscheer90/app2point0/blob/main/client/src/hooks/useSchool.ts"
click node_preferences "https://github.com/alexscheer90/app2point0/blob/main/client/src/components/FavoriteSchoolModal.tsx"
click node_clientapi "https://github.com/alexscheer90/app2point0/blob/main/client/src/lib/api.ts"
click node_serverroutes "https://github.com/alexscheer90/app2point0/blob/main/server/routes.ts"
click node_importroutes "https://github.com/alexscheer90/app2point0/blob/main/server/routes/importer.ts"
click node_live_routes "https://github.com/alexscheer90/app2point0/blob/main/server/routes/livestats.ts"
click node_storage "https://github.com/alexscheer90/app2point0/blob/main/server/storage.ts"
click node_schema "https://github.com/alexscheer90/app2point0/blob/main/shared/schema.ts"
click node_importer "https://github.com/alexscheer90/app2point0/blob/main/server/services/dataImporter.ts"
click node_unified "https://github.com/alexscheer90/app2point0/blob/main/server/services/unifiedDataService.ts"
click node_sidearm "https://github.com/alexscheer90/app2point0/blob/main/server/services/sidearmService.ts"
click node_feeds "https://github.com/alexscheer90/app2point0/blob/main/server/config/schoolFeeds.ts"
click node_ncaa "https://github.com/alexscheer90/app2point0/blob/main/server/services/ncaaService.ts"
click node_espnscore "https://github.com/alexscheer90/app2point0/blob/main/client/src/services/espnScoreboardService.ts"
click node_ncaa_client "https://github.com/alexscheer90/app2point0/blob/main/client/src/services/ncaaApiService.ts"
click node_sheets "https://github.com/alexscheer90/app2point0/blob/main/server/services/googleSheetsService.ts"

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_scores,node_schedule,node_gamedetails,node_gamestats,node_schoolprofile,node_standings,node_news,node_podcasts,node_sounds,node_eats,node_rivalries,node_schools toneBlue
class node_query,node_scorehooks,node_calendarhook,node_schoolhook,node_preferences,node_clientapi toneAmber
class node_serverroutes,node_importroutes,node_live_routes,node_storage,node_schema toneMint
class node_importer,node_unified,node_sidearm,node_feeds,node_ncaa,node_espnscore,node_ncaa_client,node_sheets toneRose
class node_fan,node_external toneIndigo
```

## Components

### Fan experience

- [App routing](https://github.com/alexscheer90/app2point0/blob/main/client/src/App.tsx): `client/src/App.tsx`
- [Scores](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/ScoresPage.tsx): `client/src/pages/ScoresPage.tsx`
- [Schedule](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/SchedulePage.tsx): `client/src/pages/SchedulePage.tsx`
- [Game details](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/GameDetails.tsx): `client/src/pages/GameDetails.tsx`
- [Game stats](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/GameStatsPage.tsx): `client/src/pages/GameStatsPage.tsx`
- [School profile](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/SchoolProfile.tsx): `client/src/pages/SchoolProfile.tsx`
- [Standings](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/StandingsPage.tsx): `client/src/pages/StandingsPage.tsx`
- [News](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/NewsPage.tsx): `client/src/pages/NewsPage.tsx`
- [Podcasts](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/PodcastPage.tsx): `client/src/pages/PodcastPage.tsx`
- [School sounds](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/SoundsPage.tsx): `client/src/pages/SoundsPage.tsx`
- [Local eats](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/LocalEatsPage.tsx): `client/src/pages/LocalEatsPage.tsx`
- [Rivalries](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/RivalriesPage.tsx): `client/src/pages/RivalriesPage.tsx`
- [Schools](https://github.com/alexscheer90/app2point0/blob/main/client/src/pages/SchoolsPage.tsx): `client/src/pages/SchoolsPage.tsx`

### Client data

- [Query cache](https://github.com/alexscheer90/app2point0/blob/main/client/src/lib/queryClient.ts): `client/src/lib/queryClient.ts`
- [Score hooks](https://github.com/alexscheer90/app2point0/blob/main/client/src/hooks/useScores.ts): `client/src/hooks/useScores.ts`
- [MAC calendar](https://github.com/alexscheer90/app2point0/blob/main/client/src/hooks/useMacCalendar.ts): `client/src/hooks/useMacCalendar.ts`
- [School data](https://github.com/alexscheer90/app2point0/blob/main/client/src/hooks/useSchool.ts): `client/src/hooks/useSchool.ts`
- [Favorite school](https://github.com/alexscheer90/app2point0/blob/main/client/src/components/FavoriteSchoolModal.tsx): `client/src/components/FavoriteSchoolModal.tsx`
- [API client](https://github.com/alexscheer90/app2point0/blob/main/client/src/lib/api.ts): `client/src/lib/api.ts`

### Server API

- [API routes](https://github.com/alexscheer90/app2point0/blob/main/server/routes.ts): `server/routes.ts`
- [Import routes](https://github.com/alexscheer90/app2point0/blob/main/server/routes/importer.ts): `server/routes/importer.ts`
- [Live-stat routes](https://github.com/alexscheer90/app2point0/blob/main/server/routes/livestats.ts): `server/routes/livestats.ts`
- [Preference storage](https://github.com/alexscheer90/app2point0/blob/main/server/storage.ts): `server/storage.ts`
- [Shared data schema](https://github.com/alexscheer90/app2point0/blob/main/shared/schema.ts): `shared/schema.ts`

### Sports data providers

- [Data importer](https://github.com/alexscheer90/app2point0/blob/main/server/services/dataImporter.ts): `server/services/dataImporter.ts`
- [Unified live data](https://github.com/alexscheer90/app2point0/blob/main/server/services/unifiedDataService.ts): `server/services/unifiedDataService.ts`
- [SIDEARM stats](https://github.com/alexscheer90/app2point0/blob/main/server/services/sidearmService.ts): `server/services/sidearmService.ts`
- [School feed config](https://github.com/alexscheer90/app2point0/blob/main/server/config/schoolFeeds.ts): `server/config/schoolFeeds.ts`
- [NCAA scoreboard](https://github.com/alexscheer90/app2point0/blob/main/server/services/ncaaService.ts): `server/services/ncaaService.ts`
- [ESPN scoreboard](https://github.com/alexscheer90/app2point0/blob/main/client/src/services/espnScoreboardService.ts): `client/src/services/espnScoreboardService.ts`
- [NCAA client services](https://github.com/alexscheer90/app2point0/blob/main/client/src/services/ncaaApiService.ts): `client/src/services/ncaaApiService.ts`
- [Standings scraper](https://github.com/alexscheer90/app2point0/blob/main/server/services/googleSheetsService.ts): `server/services/googleSheetsService.ts`

### Other components

- **MAC fan**
- **Sports data feeds**

## Connections

- MAC fan → App routing: opens (evidence: `client/src/App.tsx`)
- App routing → Scores: routes to (evidence: `client/src/App.tsx`)
- App routing → Schedule: routes to (evidence: `client/src/App.tsx`)
- App routing → School profile: routes to (evidence: `client/src/App.tsx`)
- App routing → News: routes to (evidence: `client/src/App.tsx`)
- App routing → Standings: routes to (evidence: `client/src/App.tsx`)
- App routing → Rivalries: routes to (evidence: `client/src/App.tsx`)
- App routing → School sounds: routes to (evidence: `client/src/App.tsx`)
- App routing → Local eats: routes to (evidence: `client/src/App.tsx`)
- App routing → Podcasts: routes to (evidence: `client/src/App.tsx`)
- App routing → Game stats: routes to (evidence: `client/src/App.tsx`)
- App routing → Game details: routes to (evidence: `client/src/App.tsx`)
- Schedule → Score hooks: uses (evidence: `client/src/pages/SchedulePage.tsx`)
- Score hooks → MAC calendar: calls (evidence: `client/src/hooks/useScores.ts`)
- Scores → Score hooks: uses
- Score hooks → Query cache: queries through
- MAC calendar → API routes: requests calendar
- API routes → NCAA scoreboard: fetches scoreboard (evidence: `server/routes.ts`)
- NCAA scoreboard → Sports data feeds: fetches games
- Scores → ESPN scoreboard: score source
- ESPN scoreboard → NCAA client services: imports
- Game details → School data: uses (evidence: `client/src/pages/GameDetails.tsx`)
- Game stats → API client: requests data (evidence: `client/src/pages/GameStatsPage.tsx`)
- Game stats → NCAA client services: uses (evidence: `client/src/pages/GameStatsPage.tsx`)
- News → School data: uses (evidence: `client/src/pages/NewsPage.tsx`)
- Local eats → School data: uses (evidence: `client/src/pages/LocalEatsPage.tsx`)
- Favorite school → School data: uses (evidence: `client/src/components/FavoriteSchoolModal.tsx`)
- Favorite school → API client: requests preferences (evidence: `client/src/components/FavoriteSchoolModal.tsx`)
- API routes → Preference storage: updates preferences (evidence: `server/routes.ts`)
- API routes → Import routes: mounts routes (evidence: `server/routes.ts`)
- API routes → Live-stat routes: mounts routes (evidence: `server/routes.ts`)
- Import routes → Data importer: calls (evidence: `server/routes/importer.ts`)
- Live-stat routes → Unified live data: calls (evidence: `server/routes/livestats.ts`)
- Unified live data → SIDEARM stats: fetches and parses (evidence: `server/services/unifiedDataService.ts`)
- SIDEARM stats → School feed config: uses feed config (evidence: `server/services/sidearmService.ts`)
- SIDEARM stats → Sports data feeds: fetches stats
- Standings scraper → Sports data feeds: scrapes standings (evidence: `server/services/googleSheetsService.ts`)
- Shared data schema → Preference storage: defines records
- School profile → API client: school data access
