# rumeni/sciconnect architecture

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

- Interactive diagram: https://gitdiagram.com/rumeni/sciconnect
- Repository: https://github.com/rumeni/sciconnect

## Overview

SciConnect is a bilingual catalogue for discovering institution capabilities—analyses, instruments, researchers and target microorganisms—and for maintaining those records as an admin. The main flow is browser search/filter or entity lookup, API routing into catalog query/detail logic, and PostgreSQL-backed results; users can then open connected record details or, as admins, create, connect, disconnect and delete records. The UI also offers nearby/map views, public landing/partner/contact pages, and session-based admin access. Backend connections are supported by excerpts or the README; unsampled UI capabilities are represented without speculative internal links.

Main entry points: [`frontend/src/api.ts`](https://github.com/rumeni/sciconnect/blob/main/frontend/src/api.ts) (API client), [`frontend/src/Workspace.tsx`](https://github.com/rumeni/sciconnect/blob/main/frontend/src/Workspace.tsx) (Workspace), [`backend/app/modules/catalog/router.py`](https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/router.py) (Catalog routes), [`frontend/src/App.tsx`](https://github.com/rumeni/sciconnect/blob/main/frontend/src/App.tsx) (Screen routing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_app["Screen routing<br/>[App.tsx]"]
  node_workspace["Workspace<br/>[Workspace.tsx]"]
  node_search["Capability search<br/>[SearchView.tsx]"]
  node_entitysearch["Entity lookup<br/>[EntitySearch.tsx]"]
  node_nearby["Nearby map<br/>[NearbyView.tsx]"]
  node_detailsui["Record details<br/>[DetailPanel.tsx]"]
  node_manage["Catalog management<br/>[ManageView.tsx]"]
  node_removal["Record removal<br/>[Removal.tsx]"]
  node_signin["Admin sign-in<br/>[SignIn.tsx]"]
  node_session["Browser session<br/>[session.ts]"]
  node_publicpages["Public pages<br/>[Landing.tsx]"]
  node_api_client["API client<br/>[api.ts]"]
end

subgraph group_api["API and access"]
  node_api_service["FastAPI application<br/>[main.py]"]
  node_catalog_routes["Catalog routes<br/>[router.py]"]
  node_auth["Access controls<br/>[security.py]"]
  node_rate["Rate limiting<br/>[ratelimit.py]"]
end

subgraph group_catalog["Catalog domain"]
  node_searchlogic["Capability queries<br/>[lookup.py]"]
  node_detail_logic["Entity details<br/>[details.py]"]
  node_catalog_service["Catalog operations<br/>[service.py]"]
  node_schemas["API data contracts<br/>[schemas.py]"]
  node_models["Catalog entities<br/>[models.py]"]
end

subgraph group_persistence["Persistence and location"]
  node_database[("PostgreSQL<br/>[database.py]")]
  node_geocoding["Address geocoding<br/>[geocoding.py]"]
end

node_visitor(("Visitor"))
node_geocoder(("Geocoding service"))

node_visitor -->|"opens"| node_app
node_app -->|"routes to"| node_workspace
node_app -->|"routes to"| node_signin
node_app -->|"routes to"| node_publicpages
node_workspace -->|"renders"| node_search
node_workspace -->|"renders"| node_entitysearch
node_workspace -->|"renders"| node_nearby
node_workspace -->|"renders"| node_detailsui
node_workspace -->|"renders"| node_manage
node_manage -->|"renders"| node_removal
node_signin -->|"updates"| node_session
node_app -->|"reads"| node_session
node_search -.->|"requests"| node_api_client
node_entitysearch -->|"requests"| node_api_client
node_detailsui -->|"loads details"| node_api_client
node_manage -->|"writes records"| node_api_client
node_removal -->|"deletes records"| node_api_client
node_api_client -->|"reads admin key"| node_session
node_api_client -->|"HTTP requests"| node_api_service
node_api_service -->|"mounts routes"| node_catalog_routes
node_api_service -->|"installs middleware"| node_auth
node_api_service -->|"installs middleware"| node_rate
node_catalog_routes -->|"calls search"| node_searchlogic
node_catalog_routes -->|"calls details"| node_detail_logic
node_catalog_routes -->|"calls mutations"| node_catalog_service
node_catalog_routes -->|"opens sessions"| node_database
node_searchlogic -->|"queries"| node_models
node_detail_logic -->|"reads records"| node_models
node_catalog_service -->|"mutates records"| node_models
node_catalog_service -->|"geocodes addresses"| node_geocoding
node_geocoding -.->|"looks up addresses"| node_geocoder
node_models -->|"declares mappings"| node_database
node_catalog_routes -->|"uses contracts"| node_schemas
node_catalog_service -->|"accepts payloads"| node_schemas
node_detail_logic -->|"builds views"| node_schemas

click node_app "https://github.com/rumeni/sciconnect/blob/main/frontend/src/App.tsx"
click node_workspace "https://github.com/rumeni/sciconnect/blob/main/frontend/src/Workspace.tsx"
click node_search "https://github.com/rumeni/sciconnect/blob/main/frontend/src/SearchView.tsx"
click node_entitysearch "https://github.com/rumeni/sciconnect/blob/main/frontend/src/EntitySearch.tsx"
click node_nearby "https://github.com/rumeni/sciconnect/blob/main/frontend/src/NearbyView.tsx"
click node_detailsui "https://github.com/rumeni/sciconnect/blob/main/frontend/src/DetailPanel.tsx"
click node_manage "https://github.com/rumeni/sciconnect/blob/main/frontend/src/ManageView.tsx"
click node_removal "https://github.com/rumeni/sciconnect/blob/main/frontend/src/Removal.tsx"
click node_signin "https://github.com/rumeni/sciconnect/blob/main/frontend/src/SignIn.tsx"
click node_session "https://github.com/rumeni/sciconnect/blob/main/frontend/src/session.ts"
click node_publicpages "https://github.com/rumeni/sciconnect/blob/main/frontend/src/Landing.tsx"
click node_api_client "https://github.com/rumeni/sciconnect/blob/main/frontend/src/api.ts"
click node_api_service "https://github.com/rumeni/sciconnect/blob/main/backend/app/main.py"
click node_catalog_routes "https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/router.py"
click node_auth "https://github.com/rumeni/sciconnect/blob/main/backend/app/core/security.py"
click node_rate "https://github.com/rumeni/sciconnect/blob/main/backend/app/core/ratelimit.py"
click node_searchlogic "https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/lookup.py"
click node_detail_logic "https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/details.py"
click node_catalog_service "https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/service.py"
click node_schemas "https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/schemas.py"
click node_models "https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/models.py"
click node_database "https://github.com/rumeni/sciconnect/blob/main/backend/app/core/database.py"
click node_geocoding "https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/geocoding.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_workspace,node_search,node_entitysearch,node_nearby,node_detailsui,node_manage,node_removal,node_signin,node_session,node_publicpages,node_api_client toneBlue
class node_api_service,node_catalog_routes,node_auth,node_rate toneAmber
class node_searchlogic,node_detail_logic,node_catalog_service,node_schemas,node_models toneMint
class node_database,node_geocoding toneRose
class node_visitor,node_geocoder toneIndigo
```

## Components

### Web application

- [Screen routing](https://github.com/rumeni/sciconnect/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Workspace](https://github.com/rumeni/sciconnect/blob/main/frontend/src/Workspace.tsx): `frontend/src/Workspace.tsx`
- [Capability search](https://github.com/rumeni/sciconnect/blob/main/frontend/src/SearchView.tsx): `frontend/src/SearchView.tsx`
- [Entity lookup](https://github.com/rumeni/sciconnect/blob/main/frontend/src/EntitySearch.tsx): `frontend/src/EntitySearch.tsx`
- [Nearby map](https://github.com/rumeni/sciconnect/blob/main/frontend/src/NearbyView.tsx): `frontend/src/NearbyView.tsx`
- [Record details](https://github.com/rumeni/sciconnect/blob/main/frontend/src/DetailPanel.tsx): `frontend/src/DetailPanel.tsx`
- [Catalog management](https://github.com/rumeni/sciconnect/blob/main/frontend/src/ManageView.tsx): `frontend/src/ManageView.tsx`
- [Record removal](https://github.com/rumeni/sciconnect/blob/main/frontend/src/Removal.tsx): `frontend/src/Removal.tsx`
- [Admin sign-in](https://github.com/rumeni/sciconnect/blob/main/frontend/src/SignIn.tsx): `frontend/src/SignIn.tsx`
- [Browser session](https://github.com/rumeni/sciconnect/blob/main/frontend/src/session.ts): `frontend/src/session.ts`
- [Public pages](https://github.com/rumeni/sciconnect/blob/main/frontend/src/Landing.tsx): `frontend/src/Landing.tsx`
- [API client](https://github.com/rumeni/sciconnect/blob/main/frontend/src/api.ts): `frontend/src/api.ts`

### API and access

- [FastAPI application](https://github.com/rumeni/sciconnect/blob/main/backend/app/main.py): `backend/app/main.py`
- [Catalog routes](https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/router.py): `backend/app/modules/catalog/router.py`
- [Access controls](https://github.com/rumeni/sciconnect/blob/main/backend/app/core/security.py): `backend/app/core/security.py`
- [Rate limiting](https://github.com/rumeni/sciconnect/blob/main/backend/app/core/ratelimit.py): `backend/app/core/ratelimit.py`

### Catalog domain

- [Capability queries](https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/lookup.py): `backend/app/modules/catalog/lookup.py`
- [Entity details](https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/details.py): `backend/app/modules/catalog/details.py`
- [Catalog operations](https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/service.py): `backend/app/modules/catalog/service.py`
- [API data contracts](https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/schemas.py): `backend/app/modules/catalog/schemas.py`
- [Catalog entities](https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/models.py): `backend/app/modules/catalog/models.py`

### Persistence and location

- [PostgreSQL](https://github.com/rumeni/sciconnect/blob/main/backend/app/core/database.py): `backend/app/core/database.py`
- [Address geocoding](https://github.com/rumeni/sciconnect/blob/main/backend/app/modules/catalog/geocoding.py): `backend/app/modules/catalog/geocoding.py`

### Other components

- **Visitor**
- **Geocoding service**

## Connections

- Visitor → Screen routing: opens (evidence: `frontend/src/App.tsx`)
- Screen routing → Workspace: routes to (evidence: `frontend/src/App.tsx`)
- Screen routing → Admin sign-in: routes to (evidence: `frontend/src/App.tsx`)
- Screen routing → Public pages: routes to (evidence: `frontend/src/App.tsx`)
- Workspace → Capability search: renders (evidence: `frontend/src/Workspace.tsx`)
- Workspace → Entity lookup: renders (evidence: `frontend/src/Workspace.tsx`)
- Workspace → Nearby map: renders (evidence: `frontend/src/Workspace.tsx`)
- Workspace → Record details: renders (evidence: `frontend/src/Workspace.tsx`)
- Workspace → Catalog management: renders (evidence: `frontend/src/Workspace.tsx`)
- Catalog management → Record removal: renders (evidence: `frontend/src/ManageView.tsx`)
- Admin sign-in → Browser session: updates (evidence: `frontend/src/App.tsx`)
- Screen routing → Browser session: reads (evidence: `frontend/src/App.tsx`)
- Capability search → API client: requests
- Entity lookup → API client: requests (evidence: `frontend/src/EntitySearch.tsx`)
- Record details → API client: loads details (evidence: `frontend/src/DetailPanel.tsx`)
- Catalog management → API client: writes records (evidence: `frontend/src/ManageView.tsx`)
- Record removal → API client: deletes records (evidence: `frontend/src/Removal.tsx`)
- API client → Browser session: reads admin key (evidence: `frontend/src/api.ts`)
- API client → FastAPI application: HTTP requests (evidence: `frontend/src/api.ts`)
- FastAPI application → Catalog routes: mounts routes (evidence: `backend/app/main.py`)
- FastAPI application → Access controls: installs middleware (evidence: `backend/app/main.py`)
- FastAPI application → Rate limiting: installs middleware (evidence: `backend/app/main.py`)
- Catalog routes → Capability queries: calls search (evidence: `backend/app/modules/catalog/router.py`)
- Catalog routes → Entity details: calls details (evidence: `backend/app/modules/catalog/router.py`)
- Catalog routes → Catalog operations: calls mutations (evidence: `backend/app/modules/catalog/router.py`)
- Catalog routes → PostgreSQL: opens sessions (evidence: `backend/app/modules/catalog/router.py`)
- Capability queries → Catalog entities: queries (evidence: `backend/app/modules/catalog/lookup.py`)
- Entity details → Catalog entities: reads records (evidence: `backend/app/modules/catalog/details.py`)
- Catalog operations → Catalog entities: mutates records (evidence: `backend/app/modules/catalog/service.py`)
- Catalog operations → Address geocoding: geocodes addresses (evidence: `backend/app/modules/catalog/service.py`)
- Address geocoding → Geocoding service: looks up addresses
- Catalog entities → PostgreSQL: declares mappings (evidence: `backend/app/modules/catalog/models.py`)
- Catalog routes → API data contracts: uses contracts (evidence: `backend/app/modules/catalog/router.py`)
- Catalog operations → API data contracts: accepts payloads (evidence: `backend/app/modules/catalog/service.py`)
- Entity details → API data contracts: builds views (evidence: `backend/app/modules/catalog/details.py`)
