# antondorovs/antondorovs-com architecture

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

## Overview

This is a bilingual personal portfolio website with dedicated browser-game routes. Visitors enter through the React app, which selects the home, privacy-policy, or game page from the URL hash; game sessions then provide shared play, pause, fullscreen, and record behavior. The README documents portfolio content, themes, consent, and four games. Several page and integration files are not sampled, so their internal wiring is shown only where the entry-point code or documentation supports it.

Main entry points: [`apps/web/src/app/App.jsx`](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/app/App.jsx) (Route app), [`apps/web/src/games/shared/GameSession.jsx`](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/shared/GameSession.jsx) (Game session), [`apps/web/src/pages/HomePage/HomePage.jsx`](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/pages/HomePage/HomePage.jsx) (Portfolio home), [`apps/web/src/pages/GamePage/GamePage.jsx`](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/pages/GamePage/GamePage.jsx) (Game page)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_portfolio["Portfolio site"]
  node_app["Route app<br/>[App.jsx]"]
  node_routes["Route definitions<br/>[routes.js]"]
  node_home["Portfolio home<br/>[HomePage.jsx]"]
  node_game_page["Game page<br/>[GamePage.jsx]"]
  node_privacy_page["Privacy page"]
  node_site_sections["Portfolio sections"]
  node_header["Site header<br/>[Header.jsx]"]
  node_theme["Theme mode<br/>[useThemeMode.js]"]
end

subgraph group_language_privacy["Language and privacy"]
  node_language["Language provider"]
  node_translations["Localized copy"]
  node_consent["Consent controls"]
  node_privacy_settings["Privacy settings<br/>[ConsentBanner.jsx]"]
end

subgraph group_games["Browser games"]
  node_game_session["Game session<br/>[GameSession.jsx]"]
  node_game_records["Game records<br/>[gameRecords.js]"]
  node_snake["Snake game<br/>[SnakeGame.jsx]"]
  node_snake_engine["Snake rules<br/>[snakeEngine.js]"]
  node_dino["Dino game<br/>[DinoGame.jsx]"]
  node_life["Game of Life<br/>[GameOfLife.jsx]"]
  node_flappy["Flappy Bird<br/>[FlappyBirdGame.jsx]"]
end

subgraph group_state_services["State and services"]
  node_analytics["Analytics loader"]
  node_visit_counter["Visit counter UI<br/>[visitCounter.js]"]
  node_counter_api["Counter API<br/>[site-info.php]"]
  node_counter_store[("Counter file store<br/>[site-info.php]")]
end

node_visitor(("Visitor"))
node_browser["Browser storage and APIs"]
node_analytics_services["Analytics providers"]

node_visitor -->|"opens site"| node_app
node_app -->|"resolves hash"| node_routes
node_app -->|"renders default"| node_home
node_app -->|"renders game route"| node_game_page
node_app -->|"renders privacy route"| node_privacy_page
node_app -->|"loads scripts"| node_analytics
node_app -->|"renders controls"| node_privacy_settings
node_home -->|"presents navigation"| node_header
node_home -->|"presents portfolio"| node_site_sections
node_header -->|"selects theme"| node_theme
node_language -->|"loads copy"| node_translations
node_visitor -->|"chooses language"| node_language
node_visitor -->|"sets preferences"| node_consent
node_consent -->|"persists choice"| node_browser
node_analytics -.->|"loads services"| node_analytics_services
node_visit_counter -->|"requests counts"| node_counter_api
node_counter_api -->|"reads and writes"| node_counter_store
node_game_page -->|"hosts session"| node_game_session
node_game_session -->|"reads and saves"| node_game_records
node_game_records -->|"stores records"| node_browser
node_game_session -->|"hosts play"| node_snake
node_game_session -->|"hosts play"| node_dino
node_game_session -->|"hosts play"| node_life
node_game_session -->|"hosts play"| node_flappy
node_snake -->|"advances rules"| node_snake_engine

click node_app "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/app/App.jsx"
click node_routes "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/app/routes.js"
click node_home "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/pages/HomePage/HomePage.jsx"
click node_game_page "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/pages/GamePage/GamePage.jsx"
click node_privacy_page "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/pages/PrivacyPolicyPage/PrivacyPolicyPage.jsx"
click node_site_sections "https://github.com/antondorovs/antondorovs-com/tree/dev/apps/web/src/modules"
click node_header "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/header/Header.jsx"
click node_language "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/shared/i18n/LanguageProvider.jsx"
click node_translations "https://github.com/antondorovs/antondorovs-com/tree/dev/apps/web/src/shared/i18n"
click node_theme "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/shared/theme/useThemeMode.js"
click node_consent "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/privacy/ConsentProvider.jsx"
click node_privacy_settings "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/privacy/ConsentBanner.jsx"
click node_analytics "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/analytics/AnalyticsScripts.jsx"
click node_visit_counter "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/analytics/visitCounter.js"
click node_counter_api "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/public/api/site-info.php"
click node_counter_store "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/public/api/site-info.php"
click node_game_session "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/shared/GameSession.jsx"
click node_game_records "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/shared/gameRecords.js"
click node_snake "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/snake/SnakeGame.jsx"
click node_snake_engine "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/snake/snakeEngine.js"
click node_dino "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/dino/DinoGame.jsx"
click node_life "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/game-of-life/GameOfLife.jsx"
click node_flappy "https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/flappy-bird/FlappyBirdGame.jsx"

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_routes,node_home,node_game_page,node_privacy_page,node_site_sections,node_header,node_theme toneBlue
class node_language,node_translations,node_consent,node_privacy_settings,node_browser toneAmber
class node_game_session,node_game_records,node_snake,node_snake_engine,node_dino,node_life,node_flappy toneMint
class node_analytics,node_visit_counter,node_counter_api,node_counter_store toneRose
class node_visitor,node_analytics_services toneIndigo
```

## Components

### Portfolio site

- [Route app](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/app/App.jsx): `apps/web/src/app/App.jsx`
- [Route definitions](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/app/routes.js): `apps/web/src/app/routes.js`
- [Portfolio home](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/pages/HomePage/HomePage.jsx): `apps/web/src/pages/HomePage/HomePage.jsx`
- [Game page](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/pages/GamePage/GamePage.jsx): `apps/web/src/pages/GamePage/GamePage.jsx`
- [Privacy page](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/pages/PrivacyPolicyPage/PrivacyPolicyPage.jsx): `apps/web/src/pages/PrivacyPolicyPage/PrivacyPolicyPage.jsx`
- [Portfolio sections](https://github.com/antondorovs/antondorovs-com/tree/dev/apps/web/src/modules): `apps/web/src/modules`
- [Site header](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/header/Header.jsx): `apps/web/src/modules/header/Header.jsx`
- [Theme mode](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/shared/theme/useThemeMode.js): `apps/web/src/shared/theme/useThemeMode.js`

### Language and privacy

- [Language provider](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/shared/i18n/LanguageProvider.jsx): `apps/web/src/shared/i18n/LanguageProvider.jsx`
- [Localized copy](https://github.com/antondorovs/antondorovs-com/tree/dev/apps/web/src/shared/i18n): `apps/web/src/shared/i18n`
- [Consent controls](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/privacy/ConsentProvider.jsx): `apps/web/src/modules/privacy/ConsentProvider.jsx`
- [Privacy settings](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/privacy/ConsentBanner.jsx): `apps/web/src/modules/privacy/ConsentBanner.jsx`

### Browser games

- [Game session](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/shared/GameSession.jsx): `apps/web/src/games/shared/GameSession.jsx`
- [Game records](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/shared/gameRecords.js): `apps/web/src/games/shared/gameRecords.js`
- [Snake game](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/snake/SnakeGame.jsx): `apps/web/src/games/snake/SnakeGame.jsx`
- [Snake rules](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/snake/snakeEngine.js): `apps/web/src/games/snake/snakeEngine.js`
- [Dino game](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/dino/DinoGame.jsx): `apps/web/src/games/dino/DinoGame.jsx`
- [Game of Life](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/game-of-life/GameOfLife.jsx): `apps/web/src/games/game-of-life/GameOfLife.jsx`
- [Flappy Bird](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/games/flappy-bird/FlappyBirdGame.jsx): `apps/web/src/games/flappy-bird/FlappyBirdGame.jsx`

### State and services

- [Analytics loader](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/analytics/AnalyticsScripts.jsx): `apps/web/src/modules/analytics/AnalyticsScripts.jsx`
- [Visit counter UI](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/src/modules/analytics/visitCounter.js): `apps/web/src/modules/analytics/visitCounter.js`
- [Counter API](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/public/api/site-info.php): `apps/web/public/api/site-info.php`
- [Counter file store](https://github.com/antondorovs/antondorovs-com/blob/dev/apps/web/public/api/site-info.php): `apps/web/public/api/site-info.php`

### Other components

- **Visitor**
- **Browser storage and APIs**
- **Analytics providers**

## Connections

- Visitor → Route app: opens site
- Route app → Route definitions: resolves hash
- Route app → Portfolio home: renders default
- Route app → Game page: renders game route
- Route app → Privacy page: renders privacy route
- Route app → Analytics loader: loads scripts
- Route app → Privacy settings: renders controls
- Portfolio home → Site header: presents navigation
- Portfolio home → Portfolio sections: presents portfolio
- Site header → Theme mode: selects theme
- Language provider → Localized copy: loads copy
- Visitor → Language provider: chooses language
- Visitor → Consent controls: sets preferences
- Consent controls → Browser storage and APIs: persists choice
- Analytics loader → Analytics providers: loads services
- Visit counter UI → Counter API: requests counts
- Counter API → Counter file store: reads and writes
- Game page → Game session: hosts session
- Game session → Game records: reads and saves
- Game records → Browser storage and APIs: stores records
- Game session → Snake game: hosts play
- Game session → Dino game: hosts play
- Game session → Game of Life: hosts play
- Game session → Flappy Bird: hosts play
- Snake game → Snake rules: advances rules
