# jleonoras/uplinq architecture

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

- Interactive diagram: https://gitdiagram.com/jleonoras/uplinq
- Repository: https://github.com/jleonoras/uplinq

## Overview

UplinQ turns a Google Drive share URL into a direct-download URL and a remote-upload link. The user enters the URL in the client form; the client calls the conversion API, whose controller converts the URL, scrapes Google Drive’s download page for file fields, and builds the result returned to the form for copying. The client also provides sharing guidance, feature highlights, notifications, and fallback routing; the server exposes a health check and limits conversion requests. Some helper implementations were not sampled, so their internal behavior is not expanded.

Main entry points: [`client/src/pages/Home.jsx`](https://github.com/jleonoras/uplinq/blob/main/client/src/pages/Home.jsx) (Home page), [`client/src/App.jsx`](https://github.com/jleonoras/uplinq/blob/main/client/src/App.jsx) (App routing), [`client/src/hooks/useLinkGenerator.jsx`](https://github.com/jleonoras/uplinq/blob/main/client/src/hooks/useLinkGenerator.jsx) (Link generator), [`server/routes/convertRoutes.js`](https://github.com/jleonoras/uplinq/blob/main/server/routes/convertRoutes.js) (Convert route)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client experience"]
  node_home["Home page<br/>[Home.jsx]"]
  node_link_form["Link form<br/>[LinkForm.jsx]"]
  node_generator["Link generator"]
  node_api_config["API config<br/>[api.js]"]
  node_notifications["Notifications"]
  node_notification_display["Notification display"]
  node_howto["Sharing guide<br/>[HowToModal.jsx]"]
  node_feature_cards["Feature cards<br/>[FeatureCard.jsx]"]
  node_animations["Animations<br/>[animations.js]"]
  node_app["App routing<br/>[App.jsx]"]
  node_not_found["Not found page<br/>[NotFound.jsx]"]
  node_footer["Footer<br/>[Footer.jsx]"]
end

subgraph group_conversion_api["Conversion API"]
  node_convert_route["Convert route<br/>[convertRoutes.js]"]
  node_rate_limiter["Rate limiting<br/>[limiter.js]"]
  node_convert_controller["Conversion controller"]
end

subgraph group_processing["Conversion processing"]
  node_link_converter["Download URL converter<br/>[linkConverter.js]"]
  node_scraper["Drive page scraper<br/>[scrape.js]"]
  node_remote_link["Remote link builder"]
end

subgraph group_operations["Health and runtime"]
  node_server["Server runtime<br/>[server.js]"]
  node_health_route["Health route<br/>[healthRoutes.js]"]
  node_health_controller["Health check"]
end

node_user(("User"))
node_drive{{"Google Drive"}}

node_user -->|"opens"| node_home
node_home -->|"renders"| node_link_form
node_home -->|"renders"| node_feature_cards
node_home -->|"renders"| node_howto
node_home -->|"uses"| node_animations
node_feature_cards -->|"uses"| node_animations
node_link_form -->|"uses"| node_generator
node_link_form -->|"reads"| node_notifications
node_link_form -->|"renders"| node_howto
node_generator -->|"uses"| node_api_config
node_generator -->|"notifies"| node_notifications
node_generator -->|"POSTs conversion"| node_convert_route
node_convert_route -->|"applies limits"| node_rate_limiter
node_convert_route -->|"dispatches to"| node_convert_controller
node_convert_controller -->|"converts URL"| node_link_converter
node_convert_controller -->|"scrapes page"| node_scraper
node_convert_controller -->|"builds result"| node_remote_link
node_scraper -->|"navigates to"| node_drive
node_convert_route -->|"returns result"| node_generator
node_app -->|"routes to"| node_home
node_app -->|"routes to"| node_not_found
node_app -->|"renders"| node_footer
node_app -->|"renders"| node_notification_display
node_app -->|"provides context"| node_notifications
node_notification_display -->|"reads"| node_notifications
node_server -->|"mounts route"| node_convert_route
node_server -->|"mounts route"| node_health_route
node_health_route -->|"dispatches to"| node_health_controller

click node_home "https://github.com/jleonoras/uplinq/blob/main/client/src/pages/Home.jsx"
click node_link_form "https://github.com/jleonoras/uplinq/blob/main/client/src/components/LinkForm.jsx"
click node_generator "https://github.com/jleonoras/uplinq/blob/main/client/src/hooks/useLinkGenerator.jsx"
click node_api_config "https://github.com/jleonoras/uplinq/blob/main/client/src/utils/api.js"
click node_notifications "https://github.com/jleonoras/uplinq/blob/main/client/src/context/NotificationContext.jsx"
click node_notification_display "https://github.com/jleonoras/uplinq/blob/main/client/src/components/NotificationDisplay.jsx"
click node_howto "https://github.com/jleonoras/uplinq/blob/main/client/src/components/HowToModal.jsx"
click node_feature_cards "https://github.com/jleonoras/uplinq/blob/main/client/src/components/FeatureCard.jsx"
click node_animations "https://github.com/jleonoras/uplinq/blob/main/client/src/utils/animations.js"
click node_app "https://github.com/jleonoras/uplinq/blob/main/client/src/App.jsx"
click node_not_found "https://github.com/jleonoras/uplinq/blob/main/client/src/pages/NotFound.jsx"
click node_footer "https://github.com/jleonoras/uplinq/blob/main/client/src/components/Footer.jsx"
click node_convert_route "https://github.com/jleonoras/uplinq/blob/main/server/routes/convertRoutes.js"
click node_rate_limiter "https://github.com/jleonoras/uplinq/blob/main/server/middleware/limiter.js"
click node_convert_controller "https://github.com/jleonoras/uplinq/blob/main/server/controllers/convertController.js"
click node_link_converter "https://github.com/jleonoras/uplinq/blob/main/server/utils/linkConverter.js"
click node_scraper "https://github.com/jleonoras/uplinq/blob/main/server/utils/scrape.js"
click node_remote_link "https://github.com/jleonoras/uplinq/blob/main/server/utils/createRemoteUploadLink.js"
click node_server "https://github.com/jleonoras/uplinq/blob/main/server/server.js"
click node_health_route "https://github.com/jleonoras/uplinq/blob/main/server/routes/healthRoutes.js"
click node_health_controller "https://github.com/jleonoras/uplinq/blob/main/server/controllers/healthController.js"

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_home,node_link_form,node_generator,node_api_config,node_notifications,node_notification_display,node_howto,node_feature_cards,node_animations,node_app,node_not_found,node_footer,node_user toneBlue
class node_convert_route,node_rate_limiter,node_convert_controller toneAmber
class node_link_converter,node_scraper,node_remote_link toneMint
class node_server,node_health_route,node_health_controller toneRose
class node_drive toneIndigo
```

## Components

### Client experience

- [Home page](https://github.com/jleonoras/uplinq/blob/main/client/src/pages/Home.jsx): `client/src/pages/Home.jsx`
- [Link form](https://github.com/jleonoras/uplinq/blob/main/client/src/components/LinkForm.jsx): `client/src/components/LinkForm.jsx`
- [Link generator](https://github.com/jleonoras/uplinq/blob/main/client/src/hooks/useLinkGenerator.jsx): `client/src/hooks/useLinkGenerator.jsx`
- [API config](https://github.com/jleonoras/uplinq/blob/main/client/src/utils/api.js): `client/src/utils/api.js`
- [Notifications](https://github.com/jleonoras/uplinq/blob/main/client/src/context/NotificationContext.jsx): `client/src/context/NotificationContext.jsx`
- [Notification display](https://github.com/jleonoras/uplinq/blob/main/client/src/components/NotificationDisplay.jsx): `client/src/components/NotificationDisplay.jsx`
- [Sharing guide](https://github.com/jleonoras/uplinq/blob/main/client/src/components/HowToModal.jsx): `client/src/components/HowToModal.jsx`
- [Feature cards](https://github.com/jleonoras/uplinq/blob/main/client/src/components/FeatureCard.jsx): `client/src/components/FeatureCard.jsx`
- [Animations](https://github.com/jleonoras/uplinq/blob/main/client/src/utils/animations.js): `client/src/utils/animations.js`
- [App routing](https://github.com/jleonoras/uplinq/blob/main/client/src/App.jsx): `client/src/App.jsx`
- [Not found page](https://github.com/jleonoras/uplinq/blob/main/client/src/pages/NotFound.jsx): `client/src/pages/NotFound.jsx`
- [Footer](https://github.com/jleonoras/uplinq/blob/main/client/src/components/Footer.jsx): `client/src/components/Footer.jsx`

### Conversion API

- [Convert route](https://github.com/jleonoras/uplinq/blob/main/server/routes/convertRoutes.js): `server/routes/convertRoutes.js`
- [Rate limiting](https://github.com/jleonoras/uplinq/blob/main/server/middleware/limiter.js): `server/middleware/limiter.js`
- [Conversion controller](https://github.com/jleonoras/uplinq/blob/main/server/controllers/convertController.js): `server/controllers/convertController.js`

### Conversion processing

- [Download URL converter](https://github.com/jleonoras/uplinq/blob/main/server/utils/linkConverter.js): `server/utils/linkConverter.js`
- [Drive page scraper](https://github.com/jleonoras/uplinq/blob/main/server/utils/scrape.js): `server/utils/scrape.js`
- [Remote link builder](https://github.com/jleonoras/uplinq/blob/main/server/utils/createRemoteUploadLink.js): `server/utils/createRemoteUploadLink.js`

### Health and runtime

- [Server runtime](https://github.com/jleonoras/uplinq/blob/main/server/server.js): `server/server.js`
- [Health route](https://github.com/jleonoras/uplinq/blob/main/server/routes/healthRoutes.js): `server/routes/healthRoutes.js`
- [Health check](https://github.com/jleonoras/uplinq/blob/main/server/controllers/healthController.js): `server/controllers/healthController.js`

### Other components

- **User**
- **Google Drive**

## Connections

- User → Home page: opens
- Home page → Link form: renders (evidence: `client/src/pages/Home.jsx`)
- Home page → Feature cards: renders (evidence: `client/src/pages/Home.jsx`)
- Home page → Sharing guide: renders (evidence: `client/src/pages/Home.jsx`)
- Home page → Animations: uses (evidence: `client/src/pages/Home.jsx`)
- Feature cards → Animations: uses (evidence: `client/src/components/FeatureCard.jsx`)
- Link form → Link generator: uses (evidence: `client/src/components/LinkForm.jsx`)
- Link form → Notifications: reads (evidence: `client/src/components/LinkForm.jsx`)
- Link form → Sharing guide: renders (evidence: `client/src/components/LinkForm.jsx`)
- Link generator → API config: uses (evidence: `client/src/hooks/useLinkGenerator.jsx`)
- Link generator → Notifications: notifies (evidence: `client/src/hooks/useLinkGenerator.jsx`)
- Link generator → Convert route: POSTs conversion (evidence: `client/src/hooks/useLinkGenerator.jsx`)
- Convert route → Rate limiting: applies limits (evidence: `server/routes/convertRoutes.js`)
- Convert route → Conversion controller: dispatches to (evidence: `server/routes/convertRoutes.js`)
- Conversion controller → Download URL converter: converts URL (evidence: `server/controllers/convertController.js`)
- Conversion controller → Drive page scraper: scrapes page (evidence: `server/controllers/convertController.js`)
- Conversion controller → Remote link builder: builds result (evidence: `server/controllers/convertController.js`)
- Drive page scraper → Google Drive: navigates to (evidence: `server/utils/scrape.js`)
- Convert route → Link generator: returns result (evidence: `client/src/hooks/useLinkGenerator.jsx`)
- App routing → Home page: routes to (evidence: `client/src/App.jsx`)
- App routing → Not found page: routes to (evidence: `client/src/App.jsx`)
- App routing → Footer: renders (evidence: `client/src/App.jsx`)
- App routing → Notification display: renders (evidence: `client/src/App.jsx`)
- App routing → Notifications: provides context (evidence: `client/src/App.jsx`)
- Notification display → Notifications: reads (evidence: `client/src/components/NotificationDisplay.jsx`)
- Server runtime → Convert route: mounts route (evidence: `server/server.js`)
- Server runtime → Health route: mounts route (evidence: `server/server.js`)
- Health route → Health check: dispatches to (evidence: `server/routes/healthRoutes.js`)
