# marvins095/curlschool architecture

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

## Overview

CurlSchool is a hands-on curl/API challenge platform: learners send HTTP requests to complete challenges and earn points, while a live leaderboard displays progress. The sampled backend excerpt shows token lookup, challenge responses, note operations, and an SSE broadcast hub; the frontend subscribes to the leaderboard stream. Most backend behavior resides in one file, and omitted route registration limits certainty about handler wiring.

Main entry points: [`main.go`](https://github.com/marvins095/curlschool/blob/main/main.go) (HTTP API), [`frontend/src/App.js`](https://github.com/marvins095/curlschool/blob/main/frontend/src/App.js) (Leaderboard app)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_learning["Challenge platform"]
  node_api["HTTP API<br/>[main.go]"]
  node_auth["Token lookup<br/>[main.go]"]
  node_notes["Notes challenges<br/>[main.go]"]
  node_httpchallenges["HTTP challenges<br/>[main.go]"]
  node_challengecatalog["Challenge catalog<br/>[main.go]"]
end

subgraph group_progress["Progress and live board"]
  node_scoring["Challenge scoring<br/>[main.go]"]
  node_accounts[("User progress<br/>[main.go]")]
  node_leaderboard["Leaderboard<br/>[main.go]"]
  node_hub["SSE hub<br/>[main.go]"]
  node_stream["Event stream<br/>[main.go]"]
end

subgraph group_web["Leaderboard interface"]
  node_app["Leaderboard app<br/>[App.js]"]
end

node_learner(("Learner"))
node_curl["curl client"]
node_browser(("Browser"))

node_learner -->|"sends requests"| node_curl
node_curl -->|"HTTP requests"| node_api
node_api -->|"checks tokens"| node_auth
node_api -->|"serves note routes"| node_notes
node_api -->|"serves challenges"| node_httpchallenges
node_httpchallenges -->|"checks challenge"| node_challengecatalog
node_httpchallenges -->|"awards flags"| node_scoring
node_notes -->|"awards flags"| node_scoring
node_auth -->|"queries users"| node_accounts
node_scoring -->|"updates progress"| node_accounts
node_leaderboard -->|"reads scores"| node_accounts
node_hub -->|"broadcasts events"| node_stream
node_browser -->|"opens interface"| node_app
node_app -->|"subscribes via SSE"| node_stream
node_api -->|"broadcasts updates"| node_hub

click node_api "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_auth "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_notes "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_httpchallenges "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_challengecatalog "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_scoring "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_accounts "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_leaderboard "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_hub "https://github.com/marvins095/curlschool/blob/main/main.go"
click node_app "https://github.com/marvins095/curlschool/blob/main/frontend/src/App.js"
click node_stream "https://github.com/marvins095/curlschool/blob/main/main.go"

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_api,node_auth,node_notes,node_httpchallenges,node_challengecatalog,node_curl,node_browser toneBlue
class node_scoring,node_accounts,node_leaderboard,node_hub,node_stream toneAmber
class node_app toneMint
class node_learner toneIndigo
```

## Components

### Challenge platform

- [HTTP API](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`
- [Token lookup](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`
- [Notes challenges](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`
- [HTTP challenges](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`
- [Challenge catalog](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`

### Progress and live board

- [Challenge scoring](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`
- [User progress](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`
- [Leaderboard](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`
- [SSE hub](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`
- [Event stream](https://github.com/marvins095/curlschool/blob/main/main.go): `main.go`

### Leaderboard interface

- [Leaderboard app](https://github.com/marvins095/curlschool/blob/main/frontend/src/App.js): `frontend/src/App.js`

### Other components

- **Learner**
- **curl client**
- **Browser**

## Connections

- Learner → curl client: sends requests
- curl client → HTTP API: HTTP requests
- HTTP API → Token lookup: checks tokens
- HTTP API → Notes challenges: serves note routes
- HTTP API → HTTP challenges: serves challenges
- HTTP challenges → Challenge catalog: checks challenge
- HTTP challenges → Challenge scoring: awards flags
- Notes challenges → Challenge scoring: awards flags
- Token lookup → User progress: queries users
- Challenge scoring → User progress: updates progress
- Leaderboard → User progress: reads scores
- SSE hub → Event stream: broadcasts events
- Browser → Leaderboard app: opens interface
- Leaderboard app → Event stream: subscribes via SSE
- HTTP API → SSE hub: broadcasts updates
