# mesh-ranker/app architecture

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

- Interactive diagram: https://gitdiagram.com/mesh-ranker/app
- Repository: https://github.com/mesh-ranker/app

## Overview

MeshRanker is an Android client for the МЭШ school platform. A student or parent signs in, the app resolves the student profile, then presents school data such as marks, homework, schedule, subjects, and rankings. MainActivity owns app navigation; MeshApi coordinates client access and session state, while MeshClient performs platform requests and MeshCore normalizes and computes domain data. The source index supports several delegation relationships, but unsampled modules and omitted code limit certainty about finer request flows.

Main entry points: [`app/src/main/java/ru/meshrating/app/MainActivity.kt`](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MainActivity.kt) (App navigation), [`app/src/main/java/ru/meshrating/app/MeshClient.kt`](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshClient.kt) (Platform client), [`app/src/main/java/ru/meshrating/app/MeshApi.kt`](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshApi.kt) (API facade), [`app/src/main/java/ru/meshrating/app/SessionStore.kt`](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SessionStore.kt) (Session storage)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App shell"]
  node_main["App navigation<br/>[MainActivity.kt]"]
end

subgraph group_auth["Sign-in"]
  node_login["School sign-in"]
  node_meshlogin["Mesh login"]
  node_qr["QR login<br/>[QrLogin.kt]"]
end

subgraph group_data["Platform data"]
  node_facade["API facade<br/>[MeshApi.kt]"]
  node_client["Platform client<br/>[MeshClient.kt]"]
  node_core["Domain processing<br/>[MeshCore.kt]"]
  node_demo["Demo server<br/>[DemoMeshServer.kt]"]
end

subgraph group_school["School views"]
  node_profile["Profile<br/>[ProfileScreen.kt]"]
  node_marks["Marks<br/>[MarksScreen.kt]"]
  node_homeworks["Homework<br/>[HomeworksScreen.kt]"]
  node_schedule["Schedule<br/>[ScheduleScreen.kt]"]
  node_subjects["Subjects<br/>[SubjectsScreen.kt]"]
  node_ranking["Ranking<br/>[RankingScreen.kt]"]
  node_settings["Settings<br/>[SettingsScreen.kt]"]
end

subgraph group_ops["Session and upkeep"]
  node_store[("Session storage<br/>[SessionStore.kt]")]
  node_worker["Token refresh"]
  node_appinit["App startup<br/>[MeshApp.kt]"]
  node_updates["Update checker<br/>[UpdateChecker.kt]"]
end

node_user(("Student or parent"))
node_mesh{{"МЭШ service"}}

node_user -->|"opens"| node_main
node_main -->|"launches"| node_login
node_main -->|"navigates"| node_profile
node_main -->|"navigates"| node_marks
node_main -->|"navigates"| node_homeworks
node_main -->|"navigates"| node_schedule
node_main -->|"navigates"| node_ranking
node_main -->|"navigates"| node_settings
node_login -->|"returns token"| node_main
node_main -->|"uses"| node_facade
node_profile -->|"fetches profile"| node_client
node_marks -->|"loads marks"| node_client
node_homeworks -->|"loads homework"| node_client
node_schedule -->|"loads schedule"| node_client
node_subjects -->|"loads subjects"| node_client
node_ranking -->|"loads ranking"| node_client
node_settings -->|"reads settings"| node_facade
node_facade -->|"builds client"| node_client
node_client -->|"normalizes data"| node_core
node_client -->|"requests data"| node_mesh
node_facade -->|"selects demo"| node_demo
node_demo -->|"uses paths"| node_core
node_facade -->|"reads session"| node_store
node_ranking -->|"caches ranking"| node_store
node_appinit -->|"schedules refresh"| node_worker
node_worker -->|"creates client"| node_facade
node_worker -->|"saves token"| node_store
node_settings -->|"checks updates"| node_updates
node_main -->|"loads session"| node_store

click node_main "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MainActivity.kt"
click node_login "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SchoolLoginActivity.kt"
click node_meshlogin "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshLoginActivity.kt"
click node_qr "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/QrLogin.kt"
click node_facade "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshApi.kt"
click node_client "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshClient.kt"
click node_core "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshCore.kt"
click node_demo "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/DemoMeshServer.kt"
click node_profile "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/ProfileScreen.kt"
click node_marks "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MarksScreen.kt"
click node_homeworks "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/HomeworksScreen.kt"
click node_schedule "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/ScheduleScreen.kt"
click node_subjects "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SubjectsScreen.kt"
click node_ranking "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/RankingScreen.kt"
click node_settings "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SettingsScreen.kt"
click node_store "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SessionStore.kt"
click node_worker "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/TokenRefreshWorker.kt"
click node_appinit "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshApp.kt"
click node_updates "https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/UpdateChecker.kt"

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_main toneBlue
class node_login,node_meshlogin,node_qr toneAmber
class node_facade,node_client,node_core,node_demo toneMint
class node_profile,node_marks,node_homeworks,node_schedule,node_subjects,node_ranking,node_settings toneRose
class node_store,node_worker,node_appinit,node_updates,node_user,node_mesh toneIndigo
```

## Components

### App shell

- [App navigation](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MainActivity.kt): `app/src/main/java/ru/meshrating/app/MainActivity.kt`

### Sign-in

- [School sign-in](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SchoolLoginActivity.kt): `app/src/main/java/ru/meshrating/app/SchoolLoginActivity.kt`
- [Mesh login](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshLoginActivity.kt): `app/src/main/java/ru/meshrating/app/MeshLoginActivity.kt`
- [QR login](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/QrLogin.kt): `app/src/main/java/ru/meshrating/app/QrLogin.kt`

### Platform data

- [API facade](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshApi.kt): `app/src/main/java/ru/meshrating/app/MeshApi.kt`
- [Platform client](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshClient.kt): `app/src/main/java/ru/meshrating/app/MeshClient.kt`
- [Domain processing](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshCore.kt): `app/src/main/java/ru/meshrating/app/MeshCore.kt`
- [Demo server](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/DemoMeshServer.kt): `app/src/main/java/ru/meshrating/app/DemoMeshServer.kt`

### School views

- [Profile](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/ProfileScreen.kt): `app/src/main/java/ru/meshrating/app/ProfileScreen.kt`
- [Marks](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MarksScreen.kt): `app/src/main/java/ru/meshrating/app/MarksScreen.kt`
- [Homework](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/HomeworksScreen.kt): `app/src/main/java/ru/meshrating/app/HomeworksScreen.kt`
- [Schedule](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/ScheduleScreen.kt): `app/src/main/java/ru/meshrating/app/ScheduleScreen.kt`
- [Subjects](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SubjectsScreen.kt): `app/src/main/java/ru/meshrating/app/SubjectsScreen.kt`
- [Ranking](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/RankingScreen.kt): `app/src/main/java/ru/meshrating/app/RankingScreen.kt`
- [Settings](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SettingsScreen.kt): `app/src/main/java/ru/meshrating/app/SettingsScreen.kt`

### Session and upkeep

- [Session storage](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/SessionStore.kt): `app/src/main/java/ru/meshrating/app/SessionStore.kt`
- [Token refresh](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/TokenRefreshWorker.kt): `app/src/main/java/ru/meshrating/app/TokenRefreshWorker.kt`
- [App startup](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/MeshApp.kt): `app/src/main/java/ru/meshrating/app/MeshApp.kt`
- [Update checker](https://github.com/mesh-ranker/app/blob/main/app/src/main/java/ru/meshrating/app/UpdateChecker.kt): `app/src/main/java/ru/meshrating/app/UpdateChecker.kt`

### Other components

- **Student or parent**
- **МЭШ service**

## Connections

- Student or parent → App navigation: opens (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- App navigation → School sign-in: launches (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- App navigation → Profile: navigates (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- App navigation → Marks: navigates (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- App navigation → Homework: navigates (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- App navigation → Schedule: navigates (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- App navigation → Ranking: navigates (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- App navigation → Settings: navigates (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- School sign-in → App navigation: returns token (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- App navigation → API facade: uses (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
- Profile → Platform client: fetches profile (evidence: `app/src/main/java/ru/meshrating/app/ProfileScreen.kt`)
- Marks → Platform client: loads marks (evidence: `app/src/main/java/ru/meshrating/app/MarksScreen.kt`)
- Homework → Platform client: loads homework (evidence: `app/src/main/java/ru/meshrating/app/HomeworksScreen.kt`)
- Schedule → Platform client: loads schedule (evidence: `app/src/main/java/ru/meshrating/app/ScheduleScreen.kt`)
- Subjects → Platform client: loads subjects (evidence: `app/src/main/java/ru/meshrating/app/SubjectsScreen.kt`)
- Ranking → Platform client: loads ranking (evidence: `app/src/main/java/ru/meshrating/app/RankingScreen.kt`)
- Settings → API facade: reads settings (evidence: `app/src/main/java/ru/meshrating/app/SettingsScreen.kt`)
- API facade → Platform client: builds client (evidence: `app/src/main/java/ru/meshrating/app/MeshApi.kt`)
- Platform client → Domain processing: normalizes data (evidence: `app/src/main/java/ru/meshrating/app/MeshClient.kt`)
- Platform client → МЭШ service: requests data (evidence: `app/src/main/java/ru/meshrating/app/MeshClient.kt`)
- API facade → Demo server: selects demo (evidence: `app/src/main/java/ru/meshrating/app/MeshApi.kt`)
- Demo server → Domain processing: uses paths (evidence: `app/src/main/java/ru/meshrating/app/DemoMeshServer.kt`)
- API facade → Session storage: reads session (evidence: `app/src/main/java/ru/meshrating/app/MeshApi.kt`)
- Ranking → Session storage: caches ranking (evidence: `app/src/main/java/ru/meshrating/app/RankingScreen.kt`)
- App startup → Token refresh: schedules refresh (evidence: `app/src/main/java/ru/meshrating/app/MeshApp.kt`)
- Token refresh → API facade: creates client (evidence: `app/src/main/java/ru/meshrating/app/TokenRefreshWorker.kt`)
- Token refresh → Session storage: saves token (evidence: `app/src/main/java/ru/meshrating/app/TokenRefreshWorker.kt`)
- Settings → Update checker: checks updates (evidence: `app/src/main/java/ru/meshrating/app/SettingsScreen.kt`)
- App navigation → Session storage: loads session (evidence: `app/src/main/java/ru/meshrating/app/MainActivity.kt`)
