# whitlocktech/serverlinkr architecture

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

## Overview

ServerLinkr is an unfinished self-hosted-links dashboard. Users browse and search saved links, while the dashboard’s add-link form submits link details through shared client API state to the versioned server API and Mongo-backed models. The server also exposes registration, login, and logout endpoints, with session and JWT authentication used to protect link mutations. The graph preserves the documented dashboard and the sampled API, auth, and persistence layers; unsampled implementation details are omitted.

Main entry points: [`client/src/contexts/api.context.js`](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/contexts/api.context.js) (API state), [`client/src/App.js`](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/App.js) (Client app), [`server/src/router/v1/links/links.routes.js`](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/links/links.routes.js) (Link routes), [`client/src/routes/linksContainer/linksContainer.component.jsx`](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/routes/linksContainer/linksContainer.component.jsx) (Links view)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Dashboard client"]
  node_app["Client app<br/>[App.js]"]
  node_home["Home view<br/>[home.component.jsx]"]
  node_navigation["Navigation"]
  node_addform["Add-link form"]
  node_editform["Edit-link form"]
  node_api_context["API state<br/>[api.context.js]"]
  node_links_view["Links view"]
  node_link_card["Link card"]
end

subgraph group_linkapi["Link API"]
  node_api_app["API application<br/>[app.js]"]
  node_api_router["API router<br/>[api.router.js]"]
  node_v1_router["Version router<br/>[v1.router.js]"]
  node_links_routes["Link routes<br/>[links.routes.js]"]
  node_links_controller["Link controller"]
  node_server["Server startup<br/>[server.js]"]
end

subgraph group_auth["Authentication"]
  node_auth_routes["Auth routes<br/>[auth.routes.js]"]
  node_auth_controller["Auth controller<br/>[auth.controller.js]"]
  node_auth_utils["Auth utilities<br/>[auth.js]"]
end

subgraph group_storage["Persistence"]
  node_link_model["Link model<br/>[links.model.js]"]
  node_link_mongo["Link persistence<br/>[links.mongo.js]"]
  node_user_model["User model<br/>[users.model.js]"]
  node_user_mongo["User persistence<br/>[users.mongo.js]"]
  node_mongo[("MongoDB")]
end

node_user(("Dashboard user"))

node_user -->|"uses"| node_app
node_app -->|"renders"| node_home
node_home -->|"renders"| node_navigation
node_navigation -->|"opens"| node_addform
node_addform -->|"submits"| node_api_context
node_app -->|"provides"| node_api_context
node_app -->|"routes to"| node_links_view
node_links_view -->|"reads"| node_api_context
node_links_view -->|"renders"| node_link_card
node_editform -->|"updates via"| node_api_context
node_api_context -->|"requests links"| node_links_routes
node_server -->|"starts"| node_api_app
node_api_app -->|"mounts"| node_api_router
node_api_router -->|"dispatches"| node_v1_router
node_v1_router -->|"mounts"| node_links_routes
node_v1_router -->|"mounts"| node_auth_routes
node_links_routes -->|"routes to"| node_links_controller
node_links_controller -->|"calls"| node_link_model
node_links_routes -->|"checks access"| node_auth_utils
node_auth_routes -->|"routes to"| node_auth_controller
node_auth_controller -->|"authenticates"| node_auth_utils
node_auth_controller -->|"creates users"| node_user_model
node_auth_utils -->|"looks up users"| node_user_model
node_link_model -->|"delegates"| node_link_mongo
node_user_model -->|"delegates"| node_user_mongo
node_link_mongo -.->|"persists links"| node_mongo
node_user_mongo -.->|"persists users"| node_mongo
node_server -->|"connects"| node_mongo

click node_app "https://github.com/whitlocktech/serverlinkr/blob/master/client/src/App.js"
click node_home "https://github.com/whitlocktech/serverlinkr/blob/master/client/src/routes/home/home.component.jsx"
click node_navigation "https://github.com/whitlocktech/serverlinkr/blob/master/client/src/components/navigation/navigation.component.jsx"
click node_addform "https://github.com/whitlocktech/serverlinkr/blob/master/client/src/components/addLinkForm/addLinkForm.component.jsx"
click node_editform "https://github.com/whitlocktech/serverlinkr/blob/master/client/src/components/editLinkForm/editLinkForm.component.jsx"
click node_api_context "https://github.com/whitlocktech/serverlinkr/blob/master/client/src/contexts/api.context.js"
click node_links_view "https://github.com/whitlocktech/serverlinkr/blob/master/client/src/routes/linksContainer/linksContainer.component.jsx"
click node_link_card "https://github.com/whitlocktech/serverlinkr/blob/master/client/src/components/links/linksCard.component.jsx"
click node_api_app "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/app.js"
click node_api_router "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/api.router.js"
click node_v1_router "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/v1.router.js"
click node_links_routes "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/links/links.routes.js"
click node_links_controller "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/links/links.controller.js"
click node_auth_routes "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/auth/auth.routes.js"
click node_auth_controller "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/auth/auth.controller.js"
click node_auth_utils "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/utils/auth.js"
click node_link_model "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/model/links/links.model.js"
click node_link_mongo "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/model/links/links.mongo.js"
click node_user_model "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/model/users/users.model.js"
click node_user_mongo "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/model/users/users.mongo.js"
click node_server "https://github.com/whitlocktech/serverlinkr/blob/master/server/src/server.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_app,node_home,node_navigation,node_addform,node_editform,node_api_context,node_links_view,node_link_card,node_user toneBlue
class node_api_app,node_api_router,node_v1_router,node_links_routes,node_links_controller,node_server toneAmber
class node_auth_routes,node_auth_controller,node_auth_utils toneMint
class node_link_model,node_link_mongo,node_user_model,node_user_mongo,node_mongo toneRose
```

## Components

### Dashboard client

- [Client app](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/App.js): `client/src/App.js`
- [Home view](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/routes/home/home.component.jsx): `client/src/routes/home/home.component.jsx`
- [Navigation](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/components/navigation/navigation.component.jsx): `client/src/components/navigation/navigation.component.jsx`
- [Add-link form](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/components/addLinkForm/addLinkForm.component.jsx): `client/src/components/addLinkForm/addLinkForm.component.jsx`
- [Edit-link form](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/components/editLinkForm/editLinkForm.component.jsx): `client/src/components/editLinkForm/editLinkForm.component.jsx`
- [API state](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/contexts/api.context.js): `client/src/contexts/api.context.js`
- [Links view](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/routes/linksContainer/linksContainer.component.jsx): `client/src/routes/linksContainer/linksContainer.component.jsx`
- [Link card](https://github.com/whitlocktech/serverlinkr/blob/master/client/src/components/links/linksCard.component.jsx): `client/src/components/links/linksCard.component.jsx`

### Link API

- [API application](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/app.js): `server/src/app.js`
- [API router](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/api.router.js): `server/src/router/api.router.js`
- [Version router](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/v1.router.js): `server/src/router/v1/v1.router.js`
- [Link routes](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/links/links.routes.js): `server/src/router/v1/links/links.routes.js`
- [Link controller](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/links/links.controller.js): `server/src/router/v1/links/links.controller.js`
- [Server startup](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/server.js): `server/src/server.js`

### Authentication

- [Auth routes](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/auth/auth.routes.js): `server/src/router/v1/auth/auth.routes.js`
- [Auth controller](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/router/v1/auth/auth.controller.js): `server/src/router/v1/auth/auth.controller.js`
- [Auth utilities](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/utils/auth.js): `server/src/utils/auth.js`

### Persistence

- [Link model](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/model/links/links.model.js): `server/src/model/links/links.model.js`
- [Link persistence](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/model/links/links.mongo.js): `server/src/model/links/links.mongo.js`
- [User model](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/model/users/users.model.js): `server/src/model/users/users.model.js`
- [User persistence](https://github.com/whitlocktech/serverlinkr/blob/master/server/src/model/users/users.mongo.js): `server/src/model/users/users.mongo.js`
- **MongoDB**

### Other components

- **Dashboard user**

## Connections

- Dashboard user → Client app: uses (evidence: `README.md`)
- Client app → Home view: renders (evidence: `client/src/App.js`)
- Home view → Navigation: renders (evidence: `client/src/routes/home/home.component.jsx`)
- Navigation → Add-link form: opens (evidence: `client/src/components/navigation/navigation.component.jsx`)
- Add-link form → API state: submits (evidence: `client/src/components/addLinkForm/addLinkForm.component.jsx`)
- Client app → API state: provides (evidence: `client/src/App.js`)
- Client app → Links view: routes to (evidence: `client/src/App.js`)
- Links view → API state: reads (evidence: `client/src/routes/linksContainer/linksContainer.component.jsx`)
- Links view → Link card: renders (evidence: `client/src/routes/linksContainer/linksContainer.component.jsx`)
- Edit-link form → API state: updates via (evidence: `client/src/components/editLinkForm/editLinkForm.component.jsx`)
- API state → Link routes: requests links (evidence: `client/src/contexts/api.context.js`)
- Server startup → API application: starts (evidence: `server/src/server.js`)
- API application → API router: mounts (evidence: `server/src/app.js`)
- API router → Version router: dispatches (evidence: `server/src/router/api.router.js`)
- Version router → Link routes: mounts (evidence: `server/src/router/v1/v1.router.js`)
- Version router → Auth routes: mounts (evidence: `server/src/router/v1/v1.router.js`)
- Link routes → Link controller: routes to (evidence: `server/src/router/v1/links/links.routes.js`)
- Link controller → Link model: calls (evidence: `server/src/router/v1/links/links.controller.js`)
- Link routes → Auth utilities: checks access (evidence: `server/src/router/v1/links/links.routes.js`)
- Auth routes → Auth controller: routes to (evidence: `server/src/router/v1/auth/auth.routes.js`)
- Auth controller → Auth utilities: authenticates (evidence: `server/src/router/v1/auth/auth.controller.js`)
- Auth controller → User model: creates users (evidence: `server/src/router/v1/auth/auth.controller.js`)
- Auth utilities → User model: looks up users (evidence: `server/src/utils/auth.js`)
- Link model → Link persistence: delegates (evidence: `server/src/model/links/links.model.js`)
- User model → User persistence: delegates (evidence: `server/src/model/users/users.model.js`)
- Link persistence → MongoDB: persists links
- User persistence → MongoDB: persists users
- Server startup → MongoDB: connects (evidence: `server/src/server.js`)
