# jerenzelevi/tournament-manager architecture

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

- Interactive diagram: https://gitdiagram.com/jerenzelevi/tournament-manager
- Repository: https://github.com/jerenzelevi/tournament-manager

## Overview

Tournament Manager is a web application for creating and running tournaments across single- and double-elimination, round-robin, and Swiss formats. Its main workflow moves from tournament creation and participant seeding through schedule generation, match-result entry and advancement, then standings and bracket/results views. The sampled source confirms the database access layer, participant/result actions, and several format engines; some UI-to-action and result-view wiring is inferred only where the component roles are clear, so uncertain edges are omitted.

Main entry points: [`src/app/actions/tournaments.ts`](https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/actions/tournaments.ts) (Tournament actions), [`src/app/t/[id]/page.tsx`](https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/t/%5Bid%5D/page.tsx) (Tournament detail), [`src/db/index.ts`](https://github.com/jerenzelevi/tournament-manager/blob/main/src/db/index.ts) (Database access), [`src/app/page.tsx`](https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/page.tsx) (Tournament list)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Tournament UI"]
  node_catalog["Tournament list<br/>[page.tsx]"]
  node_detail["Tournament detail<br/>[page.tsx]"]
  node_create["Create dialog"]
  node_participants["Participant manager"]
  node_start["Start control"]
  node_match["Match card<br/>[match-card.tsx]"]
  node_bracket["Bracket views<br/>[bracket-view.tsx]"]
  node_rounds["Rounds board<br/>[rounds-board.tsx]"]
  node_standings["Standings table"]
  node_results["Tournament results"]
end

subgraph group_actions["Tournament operations"]
  node_tournament_actions["Tournament actions<br/>[tournaments.ts]"]
  node_admin_actions["Admin actions<br/>[admin.ts]"]
end

subgraph group_engine["Format engines"]
  node_single["Single elimination<br/>[single-elim.ts]"]
  node_double["Double elimination<br/>[double-elim.ts]"]
  node_roundrobin["Round robin<br/>[round-robin.ts]"]
  node_swiss["Swiss rounds<br/>[swiss.ts]"]
  node_engine_types["Engine types<br/>[types.ts]"]
end

subgraph group_storage["Persistence"]
  node_db_access["Database access<br/>[index.ts]"]
  node_schema["Tournament schema<br/>[schema.ts]"]
end

node_host(("Host"))
node_neon[("Neon database")]

node_host -->|"browses"| node_catalog
node_catalog -->|"loads tournaments"| node_db_access
node_catalog -->|"opens creation"| node_create
node_host -->|"manages tournament"| node_detail
node_detail -->|"loads tournament data"| node_db_access
node_create -->|"creates tournament"| node_tournament_actions
node_participants -->|"manages participants"| node_tournament_actions
node_start -->|"starts tournament"| node_tournament_actions
node_match -->|"reports result"| node_tournament_actions
node_detail -->|"renders setup"| node_participants
node_detail -->|"renders setup control"| node_start
node_detail -->|"renders rounds"| node_rounds
node_detail -->|"renders bracket"| node_bracket
node_detail -->|"renders standings"| node_standings
node_detail -->|"renders results"| node_results
node_rounds -->|"renders matches"| node_match
node_tournament_actions -->|"reads and writes"| node_db_access
node_tournament_actions -->|"generates rounds"| node_single
node_tournament_actions -->|"generates brackets"| node_double
node_tournament_actions -->|"generates rounds"| node_roundrobin
node_tournament_actions -->|"generates next round"| node_swiss
node_db_access -->|"uses schema"| node_schema
node_db_access -->|"connects"| node_neon

click node_catalog "https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/page.tsx"
click node_detail "https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/t/%5Bid%5D/page.tsx"
click node_create "https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/create-tournament-dialog.tsx"
click node_participants "https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/participant-manager.tsx"
click node_start "https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/start-tournament-button.tsx"
click node_match "https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/match-card.tsx"
click node_bracket "https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/bracket-view.tsx"
click node_rounds "https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/rounds-board.tsx"
click node_standings "https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/standings-table.tsx"
click node_results "https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/tournament-results.tsx"
click node_tournament_actions "https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/actions/tournaments.ts"
click node_admin_actions "https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/actions/admin.ts"
click node_single "https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/single-elim.ts"
click node_double "https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/double-elim.ts"
click node_roundrobin "https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/round-robin.ts"
click node_swiss "https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/swiss.ts"
click node_engine_types "https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/types.ts"
click node_db_access "https://github.com/jerenzelevi/tournament-manager/blob/main/src/db/index.ts"
click node_schema "https://github.com/jerenzelevi/tournament-manager/blob/main/src/db/schema.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_catalog,node_detail,node_create,node_participants,node_start,node_match,node_bracket,node_rounds,node_standings,node_results toneBlue
class node_tournament_actions,node_admin_actions,node_neon toneAmber
class node_single,node_double,node_roundrobin,node_swiss,node_engine_types toneMint
class node_db_access,node_schema toneRose
class node_host toneIndigo
```

## Components

### Tournament UI

- [Tournament list](https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/page.tsx): `src/app/page.tsx`
- [Tournament detail](https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/t/%5Bid%5D/page.tsx): `src/app/t/[id]/page.tsx`
- [Create dialog](https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/create-tournament-dialog.tsx): `src/components/create-tournament-dialog.tsx`
- [Participant manager](https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/participant-manager.tsx): `src/components/participant-manager.tsx`
- [Start control](https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/start-tournament-button.tsx): `src/components/start-tournament-button.tsx`
- [Match card](https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/match-card.tsx): `src/components/match-card.tsx`
- [Bracket views](https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/bracket-view.tsx): `src/components/bracket-view.tsx`
- [Rounds board](https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/rounds-board.tsx): `src/components/rounds-board.tsx`
- [Standings table](https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/standings-table.tsx): `src/components/standings-table.tsx`
- [Tournament results](https://github.com/jerenzelevi/tournament-manager/blob/main/src/components/tournament-results.tsx): `src/components/tournament-results.tsx`

### Tournament operations

- [Tournament actions](https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/actions/tournaments.ts): `src/app/actions/tournaments.ts`
- [Admin actions](https://github.com/jerenzelevi/tournament-manager/blob/main/src/app/actions/admin.ts): `src/app/actions/admin.ts`

### Format engines

- [Single elimination](https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/single-elim.ts): `src/lib/tournament-engine/single-elim.ts`
- [Double elimination](https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/double-elim.ts): `src/lib/tournament-engine/double-elim.ts`
- [Round robin](https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/round-robin.ts): `src/lib/tournament-engine/round-robin.ts`
- [Swiss rounds](https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/swiss.ts): `src/lib/tournament-engine/swiss.ts`
- [Engine types](https://github.com/jerenzelevi/tournament-manager/blob/main/src/lib/tournament-engine/types.ts): `src/lib/tournament-engine/types.ts`

### Persistence

- [Database access](https://github.com/jerenzelevi/tournament-manager/blob/main/src/db/index.ts): `src/db/index.ts`
- [Tournament schema](https://github.com/jerenzelevi/tournament-manager/blob/main/src/db/schema.ts): `src/db/schema.ts`

### Other components

- **Host**
- **Neon database**

## Connections

- Host → Tournament list: browses
- Tournament list → Database access: loads tournaments
- Tournament list → Create dialog: opens creation
- Host → Tournament detail: manages tournament
- Tournament detail → Database access: loads tournament data
- Create dialog → Tournament actions: creates tournament
- Participant manager → Tournament actions: manages participants
- Start control → Tournament actions: starts tournament
- Match card → Tournament actions: reports result
- Tournament detail → Participant manager: renders setup
- Tournament detail → Start control: renders setup control
- Tournament detail → Rounds board: renders rounds
- Tournament detail → Bracket views: renders bracket
- Tournament detail → Standings table: renders standings
- Tournament detail → Tournament results: renders results
- Rounds board → Match card: renders matches
- Tournament actions → Database access: reads and writes
- Tournament actions → Single elimination: generates rounds
- Tournament actions → Double elimination: generates brackets
- Tournament actions → Round robin: generates rounds
- Tournament actions → Swiss rounds: generates next round
- Database access → Tournament schema: uses schema
- Database access → Neon database: connects
