# angusrausch/bike_calculator architecture

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

- Interactive diagram: https://gitdiagram.com/angusrausch/bike_calculator
- Repository: https://github.com/angusrausch/bike_calculator

## Overview

Bike Calculator is a cycling web app for gear-ratio, rollout, and speed calculations, plus location maps and Strava-connected bike/activity views. The main workflow is a visitor choosing a calculator, supplying saved or manual drivetrain and tyre inputs, and receiving calculated results; maps and Strava provide separate product branches. The tree contains Java, Python, and Rust backend implementations, treated here as alternatives rather than a single chained service. Calculator API wiring is shown where supported by the sampled controllers; unsampled UI and map details are represented at their existing source paths.

Main entry points: [`front_end/src/App.js`](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/App.js) (App routes), [`front_end/src/Strava/StravaRoutes.js`](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/StravaRoutes.js) (Strava routes), [`back_end_python/bikecalc/key_controllers.py`](https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/key_controllers.py) (Integration endpoints), [`back_end_python/bikecalc/calculator_controllers.py`](https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/calculator_controllers.py) (Python calculator API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web interface"]
  node_app["App routes<br/>[App.js]"]
  node_ratio["Ratio view<br/>[Ratio.js]"]
  node_rollout["Rollout view<br/>[Rollout.js]"]
  node_speed["Speed view<br/>[Speed.js]"]
  node_mapview["Maps view<br/>[Map.js]"]
  node_stravaroutes["Strava routes<br/>[StravaRoutes.js]"]
  node_stravadash["Strava dashboard<br/>[Dashboard.js]"]
  node_stravabike["Strava bike<br/>[Bike.js]"]
  node_stravaactivity["Strava activity<br/>[Activity.js]"]
end

subgraph group_calc["Bike calculations"]
  node_pyapi["Python calculator API"]
  node_pycalc["Python calculations<br/>[calculator.py]"]
  node_javacalcapi["Java calculator API"]
  node_javacalc["Java calculations<br/>[Calculation.java]"]
  node_rustcalcapi["Rust calculator API"]
  node_rustcalc["Rust calculations<br/>[calculator.rs]"]
end

subgraph group_data["Bike data"]
  node_pystore["Python data access<br/>[database.py]"]
  node_jstore["Java repositories<br/>[CassetteRepo.java]"]
  node_rstore["Rust entities"]
  node_pg[("PostgreSQL")]
end

subgraph group_connect["External features"]
  node_keyapi["Integration endpoints<br/>[key_controllers.py]"]
end

node_visitor(("Visitor"))
node_mapservice(("Maps provider"))
node_strava(("Strava"))

node_visitor -->|"opens"| node_app
node_app -->|"routes"| node_ratio
node_app -->|"routes"| node_rollout
node_app -->|"routes"| node_speed
node_app -->|"routes"| node_mapview
node_app -->|"routes"| node_stravaroutes
node_pyapi -->|"calculates"| node_pycalc
node_pyapi -->|"loads saved gears"| node_pystore
node_pystore -->|"queries"| node_pg
node_javacalcapi -->|"calculates"| node_javacalc
node_javacalcapi -->|"loads saved gears"| node_jstore
node_jstore -->|"accesses"| node_pg
node_rustcalcapi -->|"calculates"| node_rustcalc
node_rustcalcapi -->|"loads saved gears"| node_rstore
node_stravaroutes -->|"routes"| node_stravadash
node_stravaroutes -->|"routes"| node_stravabike
node_stravaroutes -->|"routes"| node_stravaactivity
node_stravaroutes -->|"refreshes session"| node_keyapi
node_keyapi -->|"exchanges tokens"| node_strava
node_mapview -->|"gets map key"| node_keyapi
node_keyapi -.->|"provides key"| node_mapservice
node_stravadash -.->|"requests data"| node_strava
node_stravabike -.->|"requests data"| node_strava
node_stravaactivity -.->|"requests data"| node_strava

click node_app "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/App.js"
click node_ratio "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Ratio.js"
click node_rollout "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Rollout.js"
click node_speed "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Speed.js"
click node_mapview "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Map.js"
click node_stravaroutes "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/StravaRoutes.js"
click node_stravadash "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/Dashboard.js"
click node_stravabike "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/Bike.js"
click node_stravaactivity "https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/Activity.js"
click node_pyapi "https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/calculator_controllers.py"
click node_pycalc "https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/calculator.py"
click node_javacalcapi "https://github.com/angusrausch/bike_calculator/blob/main/back_end_java/src/main/java/com/bike_calculator/bike_calculator/CalculatorController.java"
click node_javacalc "https://github.com/angusrausch/bike_calculator/blob/main/back_end_java/src/main/java/com/bike_calculator/bike_calculator/Calculation.java"
click node_rustcalcapi "https://github.com/angusrausch/bike_calculator/blob/main/back_end_rust/src/controllers/calculator_controllers.rs"
click node_rustcalc "https://github.com/angusrausch/bike_calculator/blob/main/back_end_rust/src/calculator.rs"
click node_pystore "https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/database.py"
click node_jstore "https://github.com/angusrausch/bike_calculator/blob/main/back_end_java/src/main/java/com/bike_calculator/bike_calculator/CassetteRepo.java"
click node_rstore "https://github.com/angusrausch/bike_calculator/tree/main/back_end_rust/src/entities"
click node_keyapi "https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/key_controllers.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_app,node_ratio,node_rollout,node_speed,node_mapview,node_stravaroutes,node_stravadash,node_stravabike,node_stravaactivity toneBlue
class node_pyapi,node_pycalc,node_javacalcapi,node_javacalc,node_rustcalcapi,node_rustcalc toneAmber
class node_pystore,node_jstore,node_rstore,node_pg toneMint
class node_keyapi toneRose
class node_visitor,node_mapservice,node_strava toneIndigo
```

## Components

### Web interface

- [App routes](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/App.js): `front_end/src/App.js`
- [Ratio view](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Ratio.js): `front_end/src/Ratio.js`
- [Rollout view](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Rollout.js): `front_end/src/Rollout.js`
- [Speed view](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Speed.js): `front_end/src/Speed.js`
- [Maps view](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Map.js): `front_end/src/Map.js`
- [Strava routes](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/StravaRoutes.js): `front_end/src/Strava/StravaRoutes.js`
- [Strava dashboard](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/Dashboard.js): `front_end/src/Strava/Dashboard.js`
- [Strava bike](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/Bike.js): `front_end/src/Strava/Bike.js`
- [Strava activity](https://github.com/angusrausch/bike_calculator/blob/main/front_end/src/Strava/Activity.js): `front_end/src/Strava/Activity.js`

### Bike calculations

- [Python calculator API](https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/calculator_controllers.py): `back_end_python/bikecalc/calculator_controllers.py`
- [Python calculations](https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/calculator.py): `back_end_python/bikecalc/calculator.py`
- [Java calculator API](https://github.com/angusrausch/bike_calculator/blob/main/back_end_java/src/main/java/com/bike_calculator/bike_calculator/CalculatorController.java): `back_end_java/src/main/java/com/bike_calculator/bike_calculator/CalculatorController.java`
- [Java calculations](https://github.com/angusrausch/bike_calculator/blob/main/back_end_java/src/main/java/com/bike_calculator/bike_calculator/Calculation.java): `back_end_java/src/main/java/com/bike_calculator/bike_calculator/Calculation.java`
- [Rust calculator API](https://github.com/angusrausch/bike_calculator/blob/main/back_end_rust/src/controllers/calculator_controllers.rs): `back_end_rust/src/controllers/calculator_controllers.rs`
- [Rust calculations](https://github.com/angusrausch/bike_calculator/blob/main/back_end_rust/src/calculator.rs): `back_end_rust/src/calculator.rs`

### Bike data

- [Python data access](https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/database.py): `back_end_python/bikecalc/database.py`
- [Java repositories](https://github.com/angusrausch/bike_calculator/blob/main/back_end_java/src/main/java/com/bike_calculator/bike_calculator/CassetteRepo.java): `back_end_java/src/main/java/com/bike_calculator/bike_calculator/CassetteRepo.java`
- [Rust entities](https://github.com/angusrausch/bike_calculator/tree/main/back_end_rust/src/entities): `back_end_rust/src/entities`
- **PostgreSQL**

### External features

- [Integration endpoints](https://github.com/angusrausch/bike_calculator/blob/main/back_end_python/bikecalc/key_controllers.py): `back_end_python/bikecalc/key_controllers.py`

### Other components

- **Visitor**
- **Maps provider**
- **Strava**

## Connections

- Visitor → App routes: opens
- App routes → Ratio view: routes
- App routes → Rollout view: routes
- App routes → Speed view: routes
- App routes → Maps view: routes
- App routes → Strava routes: routes
- Python calculator API → Python calculations: calculates
- Python calculator API → Python data access: loads saved gears
- Python data access → PostgreSQL: queries
- Java calculator API → Java calculations: calculates
- Java calculator API → Java repositories: loads saved gears
- Java repositories → PostgreSQL: accesses
- Rust calculator API → Rust calculations: calculates
- Rust calculator API → Rust entities: loads saved gears
- Strava routes → Strava dashboard: routes
- Strava routes → Strava bike: routes
- Strava routes → Strava activity: routes
- Strava routes → Integration endpoints: refreshes session
- Integration endpoints → Strava: exchanges tokens
- Maps view → Integration endpoints: gets map key
- Integration endpoints → Maps provider: provides key
- Strava dashboard → Strava: requests data
- Strava bike → Strava: requests data
- Strava activity → Strava: requests data
