# 2001105254-netizen/racepulseph architecture

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

## Overview

RacePulsePH is a race registration, operations, and timing application, with role-based experiences for runners, organizers, and administrators. Users authenticate and are routed to their role’s dashboard; organizers configure races, runners register, and race staff record checkpoint times. Timing and roster data support published live updates and results, including finisher certificates. The repository also includes an engraving-order operator dashboard and an RFID bridge. Source excerpts show the main application flows; connections for unsampled subsystems are omitted where their runtime wiring is not evidenced.

Main entry points: [`src/components/TimingConsole.tsx`](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/TimingConsole.tsx) (Timing console), [`src/firebase.ts`](https://github.com/2001105254-netizen/racepulseph/blob/main/src/firebase.ts) (Firebase client), [`src/App.tsx`](https://github.com/2001105254-netizen/racepulseph/blob/main/src/App.tsx) (Role router), [`src/components/OrganizerDashboard.tsx`](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/OrganizerDashboard.tsx) (Organizer dashboard)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application and access"]
  node_app["Role router<br/>[App.tsx]"]
  node_auth["Authentication<br/>[AuthGate.tsx]"]
  node_admin["Admin dashboard<br/>[AdminDashboard.tsx]"]
  node_organizer["Organizer dashboard"]
  node_runner["Runner dashboard"]
end

subgraph group_race["Race setup and registration"]
  node_race_setup["Race setup<br/>[RaceSetupPanel.tsx]"]
  node_image["Image processing<br/>[image.ts]"]
  node_registration["Runner registration<br/>[CustomerForm.tsx]"]
  node_race_events["Runner race events"]
end

subgraph group_operations["Race operations"]
  node_timing_console["Timing console<br/>[TimingConsole.tsx]"]
  node_timing["Result calculation<br/>[timing.ts]"]
  node_offline_queue["Offline scan queue"]
  node_dual_sync["Dual synchronization<br/>[dualSync.ts]"]
  node_scanner["QR scanner<br/>[QrScannerModal.tsx]"]
  node_operator["Engraving orders"]
end

subgraph group_results["Live results"]
  node_public_landing["Public race landing"]
  node_live_hub["Public live hub"]
  node_broadcast["Live broadcast"]
  node_public_results["Public results"]
  node_certificate["Finisher certificates"]
  node_reports["Runner reports<br/>[runnerReport.ts]"]
end

subgraph group_platform["Data and integrations"]
  node_firebase_client["Firebase client<br/>[firebase.ts]"]
  node_firestore[("Firebase Firestore")]
  node_rfid_bridge["RFID bridge<br/>[Program.cs]"]
end

node_visitor(("Runner or staff"))

node_visitor -->|"uses"| node_app
node_app -->|"shows"| node_auth
node_app -->|"routes admins"| node_admin
node_app -->|"routes organizers"| node_organizer
node_app -->|"routes runners"| node_runner
node_auth -->|"signs in"| node_firebase_client
node_organizer -->|"opens setup"| node_race_setup
node_organizer -->|"opens timing"| node_timing_console
node_organizer -->|"shows events"| node_race_events
node_race_setup -->|"resizes images"| node_image
node_race_setup -->|"saves race"| node_firebase_client
node_runner -->|"registers runners"| node_registration
node_runner -->|"reads and writes"| node_firebase_client
node_timing_console -->|"calculates results"| node_timing
node_timing_console -->|"queues scans"| node_offline_queue
node_timing_console -->|"uses sync"| node_dual_sync
node_timing_console -->|"opens scanner"| node_scanner
node_timing_console -->|"uses reports"| node_reports
node_timing_console -->|"writes race data"| node_firebase_client
node_admin -->|"opens timing"| node_timing_console
node_admin -->|"opens setup"| node_race_setup
node_public_landing -->|"shows live race"| node_live_hub
node_public_landing -->|"shows results"| node_public_results
node_organizer -->|"manages broadcast"| node_broadcast
node_broadcast -->|"uses timing"| node_timing
node_broadcast -->|"publishes updates"| node_firebase_client
node_live_hub -->|"reads live data"| node_firebase_client
node_public_results -->|"creates certificate"| node_certificate
node_public_results -->|"reads results"| node_firebase_client
node_firebase_client -->|"connects"| node_firestore
node_rfid_bridge -.-> node_timing_console

click node_app "https://github.com/2001105254-netizen/racepulseph/blob/main/src/App.tsx"
click node_auth "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/AuthGate.tsx"
click node_admin "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/AdminDashboard.tsx"
click node_organizer "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/OrganizerDashboard.tsx"
click node_runner "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/RunnerDashboard.tsx"
click node_race_setup "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/RaceSetupPanel.tsx"
click node_image "https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/image.ts"
click node_registration "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/CustomerForm.tsx"
click node_race_events "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/MyRaceEventsPanel.tsx"
click node_timing_console "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/TimingConsole.tsx"
click node_timing "https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/timing.ts"
click node_offline_queue "https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/offlineScanQueue.ts"
click node_dual_sync "https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/dualSync.ts"
click node_scanner "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/QrScannerModal.tsx"
click node_operator "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/OperatorDashboard.tsx"
click node_public_landing "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/PublicRaceLanding.tsx"
click node_live_hub "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/PublicLiveRaceHub.tsx"
click node_broadcast "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/LiveBroadcastPanel.tsx"
click node_public_results "https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/PublicRaceResults.tsx"
click node_certificate "https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/finisherCertificate.ts"
click node_reports "https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/runnerReport.ts"
click node_firebase_client "https://github.com/2001105254-netizen/racepulseph/blob/main/src/firebase.ts"
click node_rfid_bridge "https://github.com/2001105254-netizen/racepulseph/blob/main/rfid-bridge/Program.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_auth,node_admin,node_organizer,node_runner toneBlue
class node_race_setup,node_image,node_registration,node_race_events toneAmber
class node_timing_console,node_timing,node_offline_queue,node_dual_sync,node_scanner,node_operator toneMint
class node_public_landing,node_live_hub,node_broadcast,node_public_results,node_certificate,node_reports toneRose
class node_firebase_client,node_firestore,node_rfid_bridge,node_visitor toneIndigo
```

## Components

### Application and access

- [Role router](https://github.com/2001105254-netizen/racepulseph/blob/main/src/App.tsx): `src/App.tsx`
- [Authentication](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/AuthGate.tsx): `src/components/AuthGate.tsx`
- [Admin dashboard](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/AdminDashboard.tsx): `src/components/AdminDashboard.tsx`
- [Organizer dashboard](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/OrganizerDashboard.tsx): `src/components/OrganizerDashboard.tsx`
- [Runner dashboard](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/RunnerDashboard.tsx): `src/components/RunnerDashboard.tsx`

### Race setup and registration

- [Race setup](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/RaceSetupPanel.tsx): `src/components/RaceSetupPanel.tsx`
- [Image processing](https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/image.ts): `src/lib/image.ts`
- [Runner registration](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/CustomerForm.tsx): `src/components/CustomerForm.tsx`
- [Runner race events](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/MyRaceEventsPanel.tsx): `src/components/MyRaceEventsPanel.tsx`

### Race operations

- [Timing console](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/TimingConsole.tsx): `src/components/TimingConsole.tsx`
- [Result calculation](https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/timing.ts): `src/lib/timing.ts`
- [Offline scan queue](https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/offlineScanQueue.ts): `src/lib/offlineScanQueue.ts`
- [Dual synchronization](https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/dualSync.ts): `src/lib/dualSync.ts`
- [QR scanner](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/QrScannerModal.tsx): `src/components/QrScannerModal.tsx`
- [Engraving orders](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/OperatorDashboard.tsx): `src/components/OperatorDashboard.tsx`

### Live results

- [Public race landing](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/PublicRaceLanding.tsx): `src/components/PublicRaceLanding.tsx`
- [Public live hub](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/PublicLiveRaceHub.tsx): `src/components/PublicLiveRaceHub.tsx`
- [Live broadcast](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/LiveBroadcastPanel.tsx): `src/components/LiveBroadcastPanel.tsx`
- [Public results](https://github.com/2001105254-netizen/racepulseph/blob/main/src/components/PublicRaceResults.tsx): `src/components/PublicRaceResults.tsx`
- [Finisher certificates](https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/finisherCertificate.ts): `src/lib/finisherCertificate.ts`
- [Runner reports](https://github.com/2001105254-netizen/racepulseph/blob/main/src/lib/runnerReport.ts): `src/lib/runnerReport.ts`

### Data and integrations

- [Firebase client](https://github.com/2001105254-netizen/racepulseph/blob/main/src/firebase.ts): `src/firebase.ts`
- **Firebase Firestore**
- [RFID bridge](https://github.com/2001105254-netizen/racepulseph/blob/main/rfid-bridge/Program.cs): `rfid-bridge/Program.cs`

### Other components

- **Runner or staff**

## Connections

- Runner or staff → Role router: uses (evidence: `src/App.tsx`)
- Role router → Authentication: shows (evidence: `src/App.tsx`)
- Role router → Admin dashboard: routes admins (evidence: `src/App.tsx`)
- Role router → Organizer dashboard: routes organizers (evidence: `src/App.tsx`)
- Role router → Runner dashboard: routes runners (evidence: `src/App.tsx`)
- Authentication → Firebase client: signs in (evidence: `src/components/AuthGate.tsx`)
- Organizer dashboard → Race setup: opens setup (evidence: `src/components/OrganizerDashboard.tsx`)
- Organizer dashboard → Timing console: opens timing (evidence: `src/components/OrganizerDashboard.tsx`)
- Organizer dashboard → Runner race events: shows events (evidence: `src/components/OrganizerDashboard.tsx`)
- Race setup → Image processing: resizes images (evidence: `src/components/RaceSetupPanel.tsx`)
- Race setup → Firebase client: saves race (evidence: `src/components/RaceSetupPanel.tsx`)
- Runner dashboard → Runner registration: registers runners (evidence: `src/components/RunnerDashboard.tsx`)
- Runner dashboard → Firebase client: reads and writes (evidence: `src/components/RunnerDashboard.tsx`)
- Timing console → Result calculation: calculates results (evidence: `src/components/TimingConsole.tsx`)
- Timing console → Offline scan queue: queues scans (evidence: `src/components/TimingConsole.tsx`)
- Timing console → Dual synchronization: uses sync (evidence: `src/components/TimingConsole.tsx`)
- Timing console → QR scanner: opens scanner (evidence: `src/components/TimingConsole.tsx`)
- Timing console → Runner reports: uses reports (evidence: `src/components/TimingConsole.tsx`)
- Timing console → Firebase client: writes race data (evidence: `src/components/TimingConsole.tsx`)
- Admin dashboard → Timing console: opens timing (evidence: `src/components/AdminDashboard.tsx`)
- Admin dashboard → Race setup: opens setup (evidence: `src/components/AdminDashboard.tsx`)
- Public race landing → Public live hub: shows live race (evidence: `src/components/PublicRaceLanding.tsx`)
- Public race landing → Public results: shows results (evidence: `src/components/PublicRaceLanding.tsx`)
- Organizer dashboard → Live broadcast: manages broadcast (evidence: `src/components/OrganizerDashboard.tsx`)
- Live broadcast → Result calculation: uses timing (evidence: `src/components/LiveBroadcastPanel.tsx`)
- Live broadcast → Firebase client: publishes updates (evidence: `src/components/LiveBroadcastPanel.tsx`)
- Public live hub → Firebase client: reads live data (evidence: `src/components/PublicLiveRaceHub.tsx`)
- Public results → Finisher certificates: creates certificate (evidence: `src/components/PublicRaceResults.tsx`)
- Public results → Firebase client: reads results (evidence: `src/components/PublicRaceResults.tsx`)
- Firebase client → Firebase Firestore: connects (evidence: `src/firebase.ts`)
- RFID bridge → Timing console
