# lenonante/altarun-app architecture

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

## Overview

Altarun is a web app for user accounts, clubs and teams, with Strava connectivity and an administrative dashboard. The principal flow is a user interacting with the Flask frontend, which calls the API for account or club operations; the API applies domain logic and persists records through SQLAlchemy. The frontend also handles Strava OAuth and presents account, club and admin pages. The source excerpts show the API’s BigQuery query path and a frontend service for recent ETL executions. Some routes and integrations are only partially sampled, so the graph omits unverified details.

Main entry points: [`frontend/app.py`](https://github.com/lenonante/altarun-app/blob/main/frontend/app.py) (Web routes), [`api/main.py`](https://github.com/lenonante/altarun-app/blob/main/api/main.py) (Authentication API), [`api/database/extensions.py`](https://github.com/lenonante/altarun-app/blob/main/api/database/extensions.py) (SQLAlchemy extension), [`frontend/services/config.py`](https://github.com/lenonante/altarun-app/blob/main/frontend/services/config.py) (Account API client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_frontend["Web routes<br/>[app.py]"]
  node_templates["Page templates"]
end

subgraph group_accounts["Accounts and security"]
  node_account_ui["Account flows<br/>[app.py]"]
  node_account_service["Account API client<br/>[config.py]"]
  node_auth_api["Authentication API<br/>[main.py]"]
end

subgraph group_community["Clubs and teams"]
  node_club_ui["Club flows<br/>[app.py]"]
  node_club_service["Club API client<br/>[config.py]"]
  node_club_api["Club and team API<br/>[main.py]"]
end

subgraph group_insights["Integrations and admin"]
  node_admin_ui["Admin dashboard<br/>[app.py]"]
  node_admin_service["Admin API client<br/>[config.py]"]
  node_strava_flow["Strava OAuth<br/>[app.py]"]
  node_etl_service["ETL execution client"]
  node_bigquery_api["BigQuery endpoint<br/>[main.py]"]
end

subgraph group_persistence["Persistence"]
  node_models["Domain models<br/>[models.py]"]
  node_orm["SQLAlchemy extension<br/>[extensions.py]"]
  node_database[("SQLite database<br/>[main.py]")]
end

node_visitor(("User"))
node_strava{{"Strava"}}
node_bigquery{{"BigQuery"}}

node_visitor -->|"uses"| node_frontend
node_frontend -->|"renders"| node_templates
node_frontend -->|"routes"| node_account_ui
node_frontend -->|"routes"| node_club_ui
node_frontend -->|"routes"| node_admin_ui
node_frontend -->|"routes"| node_strava_flow
node_account_ui -->|"calls"| node_account_service
node_account_service -->|"requests"| node_auth_api
node_club_ui -->|"calls"| node_club_service
node_club_service -->|"requests"| node_club_api
node_admin_ui -->|"calls"| node_admin_service
node_admin_service -->|"requests"| node_auth_api
node_strava_flow -->|"exchanges token"| node_strava
node_strava_flow -->|"stores connection"| node_account_service
node_frontend -->|"imports"| node_etl_service
node_etl_service -->|"requests runs"| node_bigquery_api
node_bigquery_api -->|"queries"| node_bigquery
node_auth_api -->|"queries and updates"| node_models
node_club_api -->|"queries and updates"| node_models
node_models -->|"defines with"| node_orm
node_auth_api -->|"uses"| node_orm
node_club_api -->|"uses"| node_orm
node_orm -.->|"persists records"| node_database

click node_frontend "https://github.com/lenonante/altarun-app/blob/main/frontend/app.py"
click node_templates "https://github.com/lenonante/altarun-app/tree/main/frontend/templates"
click node_account_ui "https://github.com/lenonante/altarun-app/blob/main/frontend/app.py"
click node_account_service "https://github.com/lenonante/altarun-app/blob/main/frontend/services/config.py"
click node_auth_api "https://github.com/lenonante/altarun-app/blob/main/api/main.py"
click node_club_ui "https://github.com/lenonante/altarun-app/blob/main/frontend/app.py"
click node_club_service "https://github.com/lenonante/altarun-app/blob/main/frontend/services/config.py"
click node_club_api "https://github.com/lenonante/altarun-app/blob/main/api/main.py"
click node_admin_ui "https://github.com/lenonante/altarun-app/blob/main/frontend/app.py"
click node_admin_service "https://github.com/lenonante/altarun-app/blob/main/frontend/services/config.py"
click node_strava_flow "https://github.com/lenonante/altarun-app/blob/main/frontend/app.py"
click node_etl_service "https://github.com/lenonante/altarun-app/blob/main/frontend/services/big_query_requests.py"
click node_bigquery_api "https://github.com/lenonante/altarun-app/blob/main/api/main.py"
click node_models "https://github.com/lenonante/altarun-app/blob/main/api/database/models.py"
click node_orm "https://github.com/lenonante/altarun-app/blob/main/api/database/extensions.py"
click node_database "https://github.com/lenonante/altarun-app/blob/main/api/main.py"

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_frontend,node_templates,node_visitor toneBlue
class node_account_ui,node_account_service,node_auth_api toneAmber
class node_club_ui,node_club_service,node_club_api toneMint
class node_admin_ui,node_admin_service,node_strava_flow,node_etl_service,node_bigquery_api toneRose
class node_models,node_orm,node_database,node_strava,node_bigquery toneIndigo
```

## Components

### Web experience

- [Web routes](https://github.com/lenonante/altarun-app/blob/main/frontend/app.py): `frontend/app.py`
- [Page templates](https://github.com/lenonante/altarun-app/tree/main/frontend/templates): `frontend/templates`

### Accounts and security

- [Account flows](https://github.com/lenonante/altarun-app/blob/main/frontend/app.py): `frontend/app.py`
- [Account API client](https://github.com/lenonante/altarun-app/blob/main/frontend/services/config.py): `frontend/services/config.py`
- [Authentication API](https://github.com/lenonante/altarun-app/blob/main/api/main.py): `api/main.py`

### Clubs and teams

- [Club flows](https://github.com/lenonante/altarun-app/blob/main/frontend/app.py): `frontend/app.py`
- [Club API client](https://github.com/lenonante/altarun-app/blob/main/frontend/services/config.py): `frontend/services/config.py`
- [Club and team API](https://github.com/lenonante/altarun-app/blob/main/api/main.py): `api/main.py`

### Integrations and admin

- [Admin dashboard](https://github.com/lenonante/altarun-app/blob/main/frontend/app.py): `frontend/app.py`
- [Admin API client](https://github.com/lenonante/altarun-app/blob/main/frontend/services/config.py): `frontend/services/config.py`
- [Strava OAuth](https://github.com/lenonante/altarun-app/blob/main/frontend/app.py): `frontend/app.py`
- [ETL execution client](https://github.com/lenonante/altarun-app/blob/main/frontend/services/big_query_requests.py): `frontend/services/big_query_requests.py`
- [BigQuery endpoint](https://github.com/lenonante/altarun-app/blob/main/api/main.py): `api/main.py`

### Persistence

- [Domain models](https://github.com/lenonante/altarun-app/blob/main/api/database/models.py): `api/database/models.py`
- [SQLAlchemy extension](https://github.com/lenonante/altarun-app/blob/main/api/database/extensions.py): `api/database/extensions.py`
- [SQLite database](https://github.com/lenonante/altarun-app/blob/main/api/main.py): `api/main.py`

### Other components

- **User**
- **Strava**
- **BigQuery**

## Connections

- User → Web routes: uses
- Web routes → Page templates: renders (evidence: `frontend/app.py`)
- Web routes → Account flows: routes (evidence: `frontend/app.py`)
- Web routes → Club flows: routes (evidence: `frontend/app.py`)
- Web routes → Admin dashboard: routes (evidence: `frontend/app.py`)
- Web routes → Strava OAuth: routes (evidence: `frontend/app.py`)
- Account flows → Account API client: calls (evidence: `frontend/app.py`)
- Account API client → Authentication API: requests (evidence: `frontend/services/config.py`)
- Club flows → Club API client: calls (evidence: `frontend/app.py`)
- Club API client → Club and team API: requests (evidence: `frontend/services/config.py`)
- Admin dashboard → Admin API client: calls (evidence: `frontend/app.py`)
- Admin API client → Authentication API: requests (evidence: `frontend/services/config.py`)
- Strava OAuth → Strava: exchanges token (evidence: `frontend/app.py`)
- Strava OAuth → Account API client: stores connection (evidence: `frontend/app.py`)
- Web routes → ETL execution client: imports (evidence: `frontend/app.py`)
- ETL execution client → BigQuery endpoint: requests runs (evidence: `frontend/services/big_query_requests.py`)
- BigQuery endpoint → BigQuery: queries (evidence: `api/main.py`)
- Authentication API → Domain models: queries and updates (evidence: `api/main.py`)
- Club and team API → Domain models: queries and updates (evidence: `api/main.py`)
- Domain models → SQLAlchemy extension: defines with (evidence: `api/database/models.py`)
- Authentication API → SQLAlchemy extension: uses (evidence: `api/main.py`)
- Club and team API → SQLAlchemy extension: uses (evidence: `api/main.py`)
- SQLAlchemy extension → SQLite database: persists records (evidence: `api/main.py`)
